]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/omapdrm/omap_fbdev.c
Merge tag 'staging-4.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[linux.git] / drivers / gpu / drm / omapdrm / omap_fbdev.c
index fb309d19ca1b923f5e3619ee174ef2099c5bd102..0f66c74a54b0e4c742e0a61a722e1e53152bf7e9 100644 (file)
@@ -80,15 +80,21 @@ fallback:
 
 static struct fb_ops omap_fb_ops = {
        .owner = THIS_MODULE,
-       DRM_FB_HELPER_DEFAULT_OPS,
+
+       .fb_check_var   = drm_fb_helper_check_var,
+       .fb_set_par     = drm_fb_helper_set_par,
+       .fb_setcmap     = drm_fb_helper_setcmap,
+       .fb_blank       = drm_fb_helper_blank,
+       .fb_pan_display = omap_fbdev_pan_display,
+       .fb_debug_enter = drm_fb_helper_debug_enter,
+       .fb_debug_leave = drm_fb_helper_debug_leave,
+       .fb_ioctl       = drm_fb_helper_ioctl,
 
        .fb_read = drm_fb_helper_sys_read,
        .fb_write = drm_fb_helper_sys_write,
        .fb_fillrect = drm_fb_helper_sys_fillrect,
        .fb_copyarea = drm_fb_helper_sys_copyarea,
        .fb_imageblit = drm_fb_helper_sys_imageblit,
-
-       .fb_pan_display = omap_fbdev_pan_display,
 };
 
 static int omap_fbdev_create(struct drm_fb_helper *helper,
@@ -188,7 +194,7 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
 
        dev->mode_config.fb_base = dma_addr;
 
-       fbi->screen_base = omap_gem_vaddr(fbdev->bo);
+       fbi->screen_buffer = omap_gem_vaddr(fbdev->bo);
        fbi->screen_size = fbdev->bo->size;
        fbi->fix.smem_start = dma_addr;
        fbi->fix.smem_len = fbdev->bo->size;
@@ -236,13 +242,16 @@ static struct drm_fb_helper *get_fb(struct fb_info *fbi)
 }
 
 /* initialize fbdev helper */
-struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev)
+void omap_fbdev_init(struct drm_device *dev)
 {
        struct omap_drm_private *priv = dev->dev_private;
        struct omap_fbdev *fbdev = NULL;
        struct drm_fb_helper *helper;
        int ret = 0;
 
+       if (!priv->num_crtcs || !priv->num_connectors)
+               return;
+
        fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
        if (!fbdev)
                goto fail;
@@ -254,10 +263,8 @@ struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev)
        drm_fb_helper_prepare(dev, helper, &omap_fb_helper_funcs);
 
        ret = drm_fb_helper_init(dev, helper, priv->num_connectors);
-       if (ret) {
-               dev_err(dev->dev, "could not init fbdev: ret=%d\n", ret);
+       if (ret)
                goto fail;
-       }
 
        ret = drm_fb_helper_single_add_all_connectors(helper);
        if (ret)
@@ -269,7 +276,7 @@ struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev)
 
        priv->fbdev = helper;
 
-       return helper;
+       return;
 
 fini:
        drm_fb_helper_fini(helper);
@@ -277,12 +284,9 @@ fail:
        kfree(fbdev);
 
        dev_warn(dev->dev, "omap_fbdev_init failed\n");
-       /* well, limp along without an fbdev.. maybe X11 will work? */
-
-       return NULL;
 }
 
-void omap_fbdev_free(struct drm_device *dev)
+void omap_fbdev_fini(struct drm_device *dev)
 {
        struct omap_drm_private *priv = dev->dev_private;
        struct drm_fb_helper *helper = priv->fbdev;
@@ -290,14 +294,18 @@ void omap_fbdev_free(struct drm_device *dev)
 
        DBG();
 
+       if (!helper)
+               return;
+
        drm_fb_helper_unregister_fbi(helper);
 
        drm_fb_helper_fini(helper);
 
-       fbdev = to_omap_fbdev(priv->fbdev);
+       fbdev = to_omap_fbdev(helper);
 
        /* unpin the GEM object pinned in omap_fbdev_create() */
-       omap_gem_unpin(fbdev->bo);
+       if (fbdev->bo)
+               omap_gem_unpin(fbdev->bo);
 
        /* this will free the backing object */
        if (fbdev->fb)
This page took 0.027701 seconds and 4 git commands to generate.