These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / mgag200 / mgag200_fb.c
index c36b830..b35b5b2 100644 (file)
@@ -101,7 +101,7 @@ static void mga_fillrect(struct fb_info *info,
                         const struct fb_fillrect *rect)
 {
        struct mga_fbdev *mfbdev = info->par;
-       sys_fillrect(info, rect);
+       drm_fb_helper_sys_fillrect(info, rect);
        mga_dirty_update(mfbdev, rect->dx, rect->dy, rect->width,
                         rect->height);
 }
@@ -110,7 +110,7 @@ static void mga_copyarea(struct fb_info *info,
                         const struct fb_copyarea *area)
 {
        struct mga_fbdev *mfbdev = info->par;
-       sys_copyarea(info, area);
+       drm_fb_helper_sys_copyarea(info, area);
        mga_dirty_update(mfbdev, area->dx, area->dy, area->width,
                         area->height);
 }
@@ -119,7 +119,7 @@ static void mga_imageblit(struct fb_info *info,
                          const struct fb_image *image)
 {
        struct mga_fbdev *mfbdev = info->par;
-       sys_imageblit(info, image);
+       drm_fb_helper_sys_imageblit(info, image);
        mga_dirty_update(mfbdev, image->dx, image->dy, image->width,
                         image->height);
 }
@@ -166,8 +166,6 @@ static int mgag200fb_create(struct drm_fb_helper *helper,
        struct fb_info *info;
        struct drm_framebuffer *fb;
        struct drm_gem_object *gobj = NULL;
-       struct device *device = &dev->pdev->dev;
-       struct mgag200_bo *bo;
        int ret;
        void *sysram;
        int size;
@@ -185,21 +183,22 @@ static int mgag200fb_create(struct drm_fb_helper *helper,
                DRM_ERROR("failed to create fbcon backing object %d\n", ret);
                return ret;
        }
-       bo = gem_to_mga_bo(gobj);
 
        sysram = vmalloc(size);
        if (!sysram)
-               return -ENOMEM;
+               goto err_sysram;
 
-       info = framebuffer_alloc(0, device);
-       if (info == NULL)
-               return -ENOMEM;
+       info = drm_fb_helper_alloc_fbi(helper);
+       if (IS_ERR(info)) {
+               ret = PTR_ERR(info);
+               goto err_alloc_fbi;
+       }
 
        info->par = mfbdev;
 
        ret = mgag200_framebuffer_init(dev, &mfbdev->mfb, &mode_cmd, gobj);
        if (ret)
-               return ret;
+               goto err_framebuffer_init;
 
        mfbdev->sysram = sysram;
        mfbdev->size = size;
@@ -208,14 +207,6 @@ static int mgag200fb_create(struct drm_fb_helper *helper,
 
        /* setup helper */
        mfbdev->helper.fb = fb;
-       mfbdev->helper.fbdev = info;
-
-       ret = fb_alloc_cmap(&info->cmap, 256, 0);
-       if (ret) {
-               DRM_ERROR("%s: can't allocate color map\n", info->fix.id);
-               ret = -ENOMEM;
-               goto out;
-       }
 
        strcpy(info->fix.id, "mgadrmfb");
 
@@ -223,11 +214,6 @@ static int mgag200fb_create(struct drm_fb_helper *helper,
        info->fbops = &mgag200fb_ops;
 
        /* setup aperture base/size for vesafb takeover */
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto out;
-       }
        info->apertures->ranges[0].base = mdev->dev->mode_config.fb_base;
        info->apertures->ranges[0].size = mdev->mc.vram_size;
 
@@ -241,25 +227,26 @@ static int mgag200fb_create(struct drm_fb_helper *helper,
 
        DRM_DEBUG_KMS("allocated %dx%d\n",
                      fb->width, fb->height);
+
        return 0;
-out:
+
+err_framebuffer_init:
+       drm_fb_helper_release_fbi(helper);
+err_alloc_fbi:
+       vfree(sysram);
+err_sysram:
+       drm_gem_object_unreference_unlocked(gobj);
+
        return ret;
 }
 
 static int mga_fbdev_destroy(struct drm_device *dev,
                                struct mga_fbdev *mfbdev)
 {
-       struct fb_info *info;
        struct mga_framebuffer *mfb = &mfbdev->mfb;
 
-       if (mfbdev->helper.fbdev) {
-               info = mfbdev->helper.fbdev;
-
-               unregister_framebuffer(info);
-               if (info->cmap.len)
-                       fb_dealloc_cmap(&info->cmap);
-               framebuffer_release(info);
-       }
+       drm_fb_helper_unregister_fbi(&mfbdev->helper);
+       drm_fb_helper_release_fbi(&mfbdev->helper);
 
        if (mfb->obj) {
                drm_gem_object_unreference_unlocked(mfb->obj);
@@ -301,23 +288,26 @@ int mgag200_fbdev_init(struct mga_device *mdev)
        ret = drm_fb_helper_init(mdev->dev, &mfbdev->helper,
                                 mdev->num_crtc, MGAG200FB_CONN_LIMIT);
        if (ret)
-               return ret;
+               goto err_fb_helper;
 
        ret = drm_fb_helper_single_add_all_connectors(&mfbdev->helper);
        if (ret)
-               goto fini;
+               goto err_fb_setup;
 
        /* disable all the possible outputs/crtcs before entering KMS mode */
        drm_helper_disable_unused_functions(mdev->dev);
 
        ret = drm_fb_helper_initial_config(&mfbdev->helper, bpp_sel);
        if (ret)
-               goto fini;
+               goto err_fb_setup;
 
        return 0;
 
-fini:
+err_fb_setup:
        drm_fb_helper_fini(&mfbdev->helper);
+err_fb_helper:
+       mdev->mfbdev = NULL;
+
        return ret;
 }