]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/udl/udl_fb.c
drm/udl: move to embedding drm device inside udl device.
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / udl / udl_fb.c
index c3f5867dac914bebe7c00151fe99a0acf6c96735..f41fd0684ce4a6913259ac81374fb12f6358d782 100644 (file)
@@ -82,7 +82,7 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
                      int width, int height)
 {
        struct drm_device *dev = fb->base.dev;
-       struct udl_device *udl = dev->dev_private;
+       struct udl_device *udl = to_udl(dev);
        int i, ret;
        char *cmd;
        cycles_t start_cycles, end_cycles;
@@ -90,7 +90,10 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
        int bytes_identical = 0;
        struct urb *urb;
        int aligned_x;
-       int bpp = fb->base.format->cpp[0];
+       int log_bpp;
+
+       BUG_ON(!is_power_of_2(fb->base.format->cpp[0]));
+       log_bpp = __ffs(fb->base.format->cpp[0]);
 
        if (!fb->active_16)
                return 0;
@@ -125,12 +128,12 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 
        for (i = y; i < y + height ; i++) {
                const int line_offset = fb->base.pitches[0] * i;
-               const int byte_offset = line_offset + (x bpp);
-               const int dev_byte_offset = (fb->base.width * bpp * i) + (x * bpp);
-               if (udl_render_hline(dev, bpp, &urb,
+               const int byte_offset = line_offset + (x << log_bpp);
+               const int dev_byte_offset = (fb->base.width * i + x) << log_bpp;
+               if (udl_render_hline(dev, log_bpp, &urb,
                                     (char *) fb->obj->vmapping,
                                     &cmd, byte_offset, dev_byte_offset,
-                                    width bpp,
+                                    width << log_bpp,
                                     &bytes_identical, &bytes_sent))
                        goto error;
        }
@@ -149,7 +152,7 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 error:
        atomic_add(bytes_sent, &udl->bytes_sent);
        atomic_add(bytes_identical, &udl->bytes_identical);
-       atomic_add(width*height*bpp, &udl->bytes_rendered);
+       atomic_add((width * height) << log_bpp, &udl->bytes_rendered);
        end_cycles = get_cycles();
        atomic_add(((unsigned int) ((end_cycles - start_cycles)
                    >> 10)), /* Kcycles */
@@ -207,10 +210,10 @@ static int udl_fb_open(struct fb_info *info, int user)
 {
        struct udl_fbdev *ufbdev = info->par;
        struct drm_device *dev = ufbdev->ufb.base.dev;
-       struct udl_device *udl = dev->dev_private;
+       struct udl_device *udl = to_udl(dev);
 
        /* If the USB device is gone, we don't accept new opens */
-       if (drm_dev_is_unplugged(udl->ddev))
+       if (drm_dev_is_unplugged(&udl->drm))
                return -ENODEV;
 
        ufbdev->fb_count++;
@@ -429,14 +432,16 @@ static void udl_fbdev_destroy(struct drm_device *dev,
 {
        drm_fb_helper_unregister_fbi(&ufbdev->helper);
        drm_fb_helper_fini(&ufbdev->helper);
-       drm_framebuffer_unregister_private(&ufbdev->ufb.base);
-       drm_framebuffer_cleanup(&ufbdev->ufb.base);
-       drm_gem_object_put_unlocked(&ufbdev->ufb.obj->base);
+       if (ufbdev->ufb.obj) {
+               drm_framebuffer_unregister_private(&ufbdev->ufb.base);
+               drm_framebuffer_cleanup(&ufbdev->ufb.base);
+               drm_gem_object_put_unlocked(&ufbdev->ufb.obj->base);
+       }
 }
 
 int udl_fbdev_init(struct drm_device *dev)
 {
-       struct udl_device *udl = dev->dev_private;
+       struct udl_device *udl = to_udl(dev);
        int bpp_sel = fb_bpp;
        struct udl_fbdev *ufbdev;
        int ret;
@@ -475,7 +480,7 @@ free:
 
 void udl_fbdev_cleanup(struct drm_device *dev)
 {
-       struct udl_device *udl = dev->dev_private;
+       struct udl_device *udl = to_udl(dev);
        if (!udl->fbdev)
                return;
 
@@ -486,7 +491,7 @@ void udl_fbdev_cleanup(struct drm_device *dev)
 
 void udl_fbdev_unplug(struct drm_device *dev)
 {
-       struct udl_device *udl = dev->dev_private;
+       struct udl_device *udl = to_udl(dev);
        struct udl_fbdev *ufbdev;
        if (!udl->fbdev)
                return;