diff options
Diffstat (limited to 'drivers/gpu/drm/tinydrm/repaper.c')
-rw-r--r-- | drivers/gpu/drm/tinydrm/repaper.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/drivers/gpu/drm/tinydrm/repaper.c b/drivers/gpu/drm/tinydrm/repaper.c index 33b4a71916e4..bb6f80a81899 100644 --- a/drivers/gpu/drm/tinydrm/repaper.c +++ b/drivers/gpu/drm/tinydrm/repaper.c | |||
@@ -540,14 +540,8 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, | |||
540 | clip.y1 = 0; | 540 | clip.y1 = 0; |
541 | clip.y2 = fb->height; | 541 | clip.y2 = fb->height; |
542 | 542 | ||
543 | mutex_lock(&tdev->dirty_lock); | ||
544 | |||
545 | if (!epd->enabled) | 543 | if (!epd->enabled) |
546 | goto out_unlock; | 544 | return 0; |
547 | |||
548 | /* fbdev can flush even when we're not interested */ | ||
549 | if (tdev->pipe.plane.fb != fb) | ||
550 | goto out_unlock; | ||
551 | 545 | ||
552 | repaper_get_temperature(epd); | 546 | repaper_get_temperature(epd); |
553 | 547 | ||
@@ -555,16 +549,14 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, | |||
555 | epd->factored_stage_time); | 549 | epd->factored_stage_time); |
556 | 550 | ||
557 | buf = kmalloc(fb->width * fb->height, GFP_KERNEL); | 551 | buf = kmalloc(fb->width * fb->height, GFP_KERNEL); |
558 | if (!buf) { | 552 | if (!buf) |
559 | ret = -ENOMEM; | 553 | return -ENOMEM; |
560 | goto out_unlock; | ||
561 | } | ||
562 | 554 | ||
563 | if (import_attach) { | 555 | if (import_attach) { |
564 | ret = dma_buf_begin_cpu_access(import_attach->dmabuf, | 556 | ret = dma_buf_begin_cpu_access(import_attach->dmabuf, |
565 | DMA_FROM_DEVICE); | 557 | DMA_FROM_DEVICE); |
566 | if (ret) | 558 | if (ret) |
567 | goto out_unlock; | 559 | goto out_free; |
568 | } | 560 | } |
569 | 561 | ||
570 | tinydrm_xrgb8888_to_gray8(buf, cma_obj->vaddr, fb, &clip); | 562 | tinydrm_xrgb8888_to_gray8(buf, cma_obj->vaddr, fb, &clip); |
@@ -573,7 +565,7 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, | |||
573 | ret = dma_buf_end_cpu_access(import_attach->dmabuf, | 565 | ret = dma_buf_end_cpu_access(import_attach->dmabuf, |
574 | DMA_FROM_DEVICE); | 566 | DMA_FROM_DEVICE); |
575 | if (ret) | 567 | if (ret) |
576 | goto out_unlock; | 568 | goto out_free; |
577 | } | 569 | } |
578 | 570 | ||
579 | repaper_gray8_to_mono_reversed(buf, fb->width, fb->height); | 571 | repaper_gray8_to_mono_reversed(buf, fb->width, fb->height); |
@@ -625,11 +617,7 @@ static int repaper_fb_dirty(struct drm_framebuffer *fb, | |||
625 | } | 617 | } |
626 | } | 618 | } |
627 | 619 | ||
628 | out_unlock: | 620 | out_free: |
629 | mutex_unlock(&tdev->dirty_lock); | ||
630 | |||
631 | if (ret) | ||
632 | DRM_DEV_ERROR(fb->dev->dev, "Failed to update display (%d)\n", ret); | ||
633 | kfree(buf); | 621 | kfree(buf); |
634 | 622 | ||
635 | return ret; | 623 | return ret; |
@@ -638,7 +626,7 @@ out_unlock: | |||
638 | static const struct drm_framebuffer_funcs repaper_fb_funcs = { | 626 | static const struct drm_framebuffer_funcs repaper_fb_funcs = { |
639 | .destroy = drm_gem_fb_destroy, | 627 | .destroy = drm_gem_fb_destroy, |
640 | .create_handle = drm_gem_fb_create_handle, | 628 | .create_handle = drm_gem_fb_create_handle, |
641 | .dirty = repaper_fb_dirty, | 629 | .dirty = tinydrm_fb_dirty, |
642 | }; | 630 | }; |
643 | 631 | ||
644 | static void power_off(struct repaper_epd *epd) | 632 | static void power_off(struct repaper_epd *epd) |
@@ -1070,6 +1058,8 @@ static int repaper_probe(struct spi_device *spi) | |||
1070 | if (ret) | 1058 | if (ret) |
1071 | return ret; | 1059 | return ret; |
1072 | 1060 | ||
1061 | tdev->fb_dirty = repaper_fb_dirty; | ||
1062 | |||
1073 | ret = tinydrm_display_pipe_init(tdev, &repaper_pipe_funcs, | 1063 | ret = tinydrm_display_pipe_init(tdev, &repaper_pipe_funcs, |
1074 | DRM_MODE_CONNECTOR_VIRTUAL, | 1064 | DRM_MODE_CONNECTOR_VIRTUAL, |
1075 | repaper_formats, | 1065 | repaper_formats, |