diff options
Diffstat (limited to 'drivers/gpu/drm/mediatek/mtk_drm_fb.c')
| -rw-r--r-- | drivers/gpu/drm/mediatek/mtk_drm_fb.c | 76 | 
1 files changed, 18 insertions, 58 deletions
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_fb.c b/drivers/gpu/drm/mediatek/mtk_drm_fb.c index 0d8d506695f9..be5f6f1daf55 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_fb.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_fb.c @@ -15,6 +15,7 @@  #include <drm/drm_crtc_helper.h>  #include <drm/drm_fb_helper.h>  #include <drm/drm_gem.h> +#include <drm/drm_gem_framebuffer_helper.h>  #include <linux/dma-buf.h>  #include <linux/reservation.h> @@ -22,78 +23,37 @@  #include "mtk_drm_fb.h"  #include "mtk_drm_gem.h" -/* - * mtk specific framebuffer structure. - * - * @fb: drm framebuffer object. - * @gem_obj: array of gem objects. - */ -struct mtk_drm_fb { -	struct drm_framebuffer	base; -	/* For now we only support a single plane */ -	struct drm_gem_object	*gem_obj; -}; - -#define to_mtk_fb(x) container_of(x, struct mtk_drm_fb, base) - -struct drm_gem_object *mtk_fb_get_gem_obj(struct drm_framebuffer *fb) -{ -	struct mtk_drm_fb *mtk_fb = to_mtk_fb(fb); - -	return mtk_fb->gem_obj; -} - -static int mtk_drm_fb_create_handle(struct drm_framebuffer *fb, -				    struct drm_file *file_priv, -				    unsigned int *handle) -{ -	struct mtk_drm_fb *mtk_fb = to_mtk_fb(fb); - -	return drm_gem_handle_create(file_priv, mtk_fb->gem_obj, handle); -} - -static void mtk_drm_fb_destroy(struct drm_framebuffer *fb) -{ -	struct mtk_drm_fb *mtk_fb = to_mtk_fb(fb); - -	drm_framebuffer_cleanup(fb); - -	drm_gem_object_put_unlocked(mtk_fb->gem_obj); - -	kfree(mtk_fb); -} -  static const struct drm_framebuffer_funcs mtk_drm_fb_funcs = { -	.create_handle = mtk_drm_fb_create_handle, -	.destroy = mtk_drm_fb_destroy, +	.create_handle = drm_gem_fb_create_handle, +	.destroy = drm_gem_fb_destroy,  }; -static struct mtk_drm_fb *mtk_drm_framebuffer_init(struct drm_device *dev, +static struct drm_framebuffer *mtk_drm_framebuffer_init(struct drm_device *dev,  					const struct drm_mode_fb_cmd2 *mode,  					struct drm_gem_object *obj)  { -	struct mtk_drm_fb *mtk_fb; +	struct drm_framebuffer *fb;  	int ret;  	if (drm_format_num_planes(mode->pixel_format) != 1)  		return ERR_PTR(-EINVAL); -	mtk_fb = kzalloc(sizeof(*mtk_fb), GFP_KERNEL); -	if (!mtk_fb) +	fb = kzalloc(sizeof(*fb), GFP_KERNEL); +	if (!fb)  		return ERR_PTR(-ENOMEM); -	drm_helper_mode_fill_fb_struct(dev, &mtk_fb->base, mode); +	drm_helper_mode_fill_fb_struct(dev, fb, mode); -	mtk_fb->gem_obj = obj; +	fb->obj[0] = obj; -	ret = drm_framebuffer_init(dev, &mtk_fb->base, &mtk_drm_fb_funcs); +	ret = drm_framebuffer_init(dev, fb, &mtk_drm_fb_funcs);  	if (ret) {  		DRM_ERROR("failed to initialize framebuffer\n"); -		kfree(mtk_fb); +		kfree(fb);  		return ERR_PTR(ret);  	} -	return mtk_fb; +	return fb;  }  /* @@ -110,7 +70,7 @@ int mtk_fb_wait(struct drm_framebuffer *fb)  	if (!fb)  		return 0; -	gem = mtk_fb_get_gem_obj(fb); +	gem = fb->obj[0];  	if (!gem || !gem->dma_buf || !gem->dma_buf->resv)  		return 0; @@ -128,7 +88,7 @@ struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,  					       struct drm_file *file,  					       const struct drm_mode_fb_cmd2 *cmd)  { -	struct mtk_drm_fb *mtk_fb; +	struct drm_framebuffer *fb;  	struct drm_gem_object *gem;  	unsigned int width = cmd->width;  	unsigned int height = cmd->height; @@ -151,13 +111,13 @@ struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,  		goto unreference;  	} -	mtk_fb = mtk_drm_framebuffer_init(dev, cmd, gem); -	if (IS_ERR(mtk_fb)) { -		ret = PTR_ERR(mtk_fb); +	fb = mtk_drm_framebuffer_init(dev, cmd, gem); +	if (IS_ERR(fb)) { +		ret = PTR_ERR(fb);  		goto unreference;  	} -	return &mtk_fb->base; +	return fb;  unreference:  	drm_gem_object_put_unlocked(gem); |