aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/tinydrm/repaper.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/tinydrm/repaper.c')
-rw-r--r--drivers/gpu/drm/tinydrm/repaper.c28
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
628out_unlock: 620out_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:
638static const struct drm_framebuffer_funcs repaper_fb_funcs = { 626static 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
644static void power_off(struct repaper_epd *epd) 632static 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,