1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * DRM driver for Pervasive Displays RePaper branded e-ink panels
5 * Copyright 2013-2017 Pervasive Displays, Inc.
6 * Copyright 2017 Noralf Trønnes
9 * Material Film: Aurora Mb (V231)
12 * The controller code was taken from the userspace driver:
13 * https://github.com/repaper/gratis
16 #include <linux/delay.h>
17 #include <linux/dma-buf.h>
18 #include <linux/gpio/consumer.h>
19 #include <linux/module.h>
20 #include <linux/property.h>
21 #include <linux/sched/clock.h>
22 #include <linux/spi/spi.h>
23 #include <linux/thermal.h>
25 #include <drm/drm_atomic_helper.h>
26 #include <drm/drm_connector.h>
27 #include <drm/drm_damage_helper.h>
28 #include <drm/drm_drv.h>
29 #include <drm/drm_fb_cma_helper.h>
30 #include <drm/drm_fb_helper.h>
31 #include <drm/drm_format_helper.h>
32 #include <drm/drm_gem_cma_helper.h>
33 #include <drm/drm_gem_framebuffer_helper.h>
34 #include <drm/drm_managed.h>
35 #include <drm/drm_modes.h>
36 #include <drm/drm_rect.h>
37 #include <drm/drm_probe_helper.h>
38 #include <drm/drm_simple_kms_helper.h>
40 #define REPAPER_RID_G2_COG_ID 0x12
43 /* 0 is reserved to avoid clashing with NULL */
50 enum repaper_stage
{ /* Image pixel -> Display pixel */
51 REPAPER_COMPENSATE
, /* B -> W, W -> B (Current Image) */
52 REPAPER_WHITE
, /* B -> N, W -> W (Current Image) */
53 REPAPER_INVERSE
, /* B -> N, W -> B (New Image) */
54 REPAPER_NORMAL
/* B -> B, W -> W (New Image) */
57 enum repaper_epd_border_byte
{
58 REPAPER_BORDER_BYTE_NONE
,
59 REPAPER_BORDER_BYTE_ZERO
,
60 REPAPER_BORDER_BYTE_SET
,
64 struct drm_device drm
;
65 struct drm_simple_display_pipe pipe
;
66 const struct drm_display_mode
*mode
;
67 struct drm_connector connector
;
68 struct spi_device
*spi
;
70 struct gpio_desc
*panel_on
;
71 struct gpio_desc
*border
;
72 struct gpio_desc
*discharge
;
73 struct gpio_desc
*reset
;
74 struct gpio_desc
*busy
;
76 struct thermal_zone_device
*thermal
;
80 unsigned int bytes_per_scan
;
81 const u8
*channel_select
;
82 unsigned int stage_time
;
83 unsigned int factored_stage_time
;
86 enum repaper_epd_border_byte border_byte
;
95 static inline struct repaper_epd
*drm_to_epd(struct drm_device
*drm
)
97 return container_of(drm
, struct repaper_epd
, drm
);
100 static int repaper_spi_transfer(struct spi_device
*spi
, u8 header
,
101 const void *tx
, void *rx
, size_t len
)
103 void *txbuf
= NULL
, *rxbuf
= NULL
;
104 struct spi_transfer tr
[2] = {};
108 headerbuf
= kmalloc(1, GFP_KERNEL
);
112 headerbuf
[0] = header
;
113 tr
[0].tx_buf
= headerbuf
;
116 /* Stack allocated tx? */
117 if (tx
&& len
<= 32) {
118 txbuf
= kmemdup(tx
, len
, GFP_KERNEL
);
126 rxbuf
= kmalloc(len
, GFP_KERNEL
);
133 tr
[1].tx_buf
= txbuf
? txbuf
: tx
;
134 tr
[1].rx_buf
= rxbuf
;
138 ret
= spi_sync_transfer(spi
, tr
, 2);
140 memcpy(rx
, rxbuf
, len
);
150 static int repaper_write_buf(struct spi_device
*spi
, u8 reg
,
151 const u8
*buf
, size_t len
)
155 ret
= repaper_spi_transfer(spi
, 0x70, ®
, NULL
, 1);
159 return repaper_spi_transfer(spi
, 0x72, buf
, NULL
, len
);
162 static int repaper_write_val(struct spi_device
*spi
, u8 reg
, u8 val
)
164 return repaper_write_buf(spi
, reg
, &val
, 1);
167 static int repaper_read_val(struct spi_device
*spi
, u8 reg
)
172 ret
= repaper_spi_transfer(spi
, 0x70, ®
, NULL
, 1);
176 ret
= repaper_spi_transfer(spi
, 0x73, NULL
, &val
, 1);
178 return ret
? ret
: val
;
181 static int repaper_read_id(struct spi_device
*spi
)
186 ret
= repaper_spi_transfer(spi
, 0x71, NULL
, &id
, 1);
188 return ret
? ret
: id
;
191 static void repaper_spi_mosi_low(struct spi_device
*spi
)
193 const u8 buf
[1] = { 0 };
195 spi_write(spi
, buf
, 1);
198 /* pixels on display are numbered from 1 so even is actually bits 1,3,5,... */
199 static void repaper_even_pixels(struct repaper_epd
*epd
, u8
**pp
,
200 const u8
*data
, u8 fixed_value
, const u8
*mask
,
201 enum repaper_stage stage
)
205 for (b
= 0; b
< (epd
->width
/ 8); b
++) {
207 u8 pixels
= data
[b
] & 0xaa;
208 u8 pixel_mask
= 0xff;
212 pixel_mask
= (mask
[b
] ^ pixels
) & 0xaa;
213 pixel_mask
|= pixel_mask
>> 1;
217 case REPAPER_COMPENSATE
: /* B -> W, W -> B (Current) */
218 pixels
= 0xaa | ((pixels
^ 0xaa) >> 1);
220 case REPAPER_WHITE
: /* B -> N, W -> W (Current) */
221 pixels
= 0x55 + ((pixels
^ 0xaa) >> 1);
223 case REPAPER_INVERSE
: /* B -> N, W -> B (New) */
224 pixels
= 0x55 | (pixels
^ 0xaa);
226 case REPAPER_NORMAL
: /* B -> B, W -> W (New) */
227 pixels
= 0xaa | (pixels
>> 1);
231 pixels
= (pixels
& pixel_mask
) | (~pixel_mask
& 0x55);
232 p1
= (pixels
>> 6) & 0x03;
233 p2
= (pixels
>> 4) & 0x03;
234 p3
= (pixels
>> 2) & 0x03;
235 p4
= (pixels
>> 0) & 0x03;
236 pixels
= (p1
<< 0) | (p2
<< 2) | (p3
<< 4) | (p4
<< 6);
239 *(*pp
)++ = fixed_value
;
244 /* pixels on display are numbered from 1 so odd is actually bits 0,2,4,... */
245 static void repaper_odd_pixels(struct repaper_epd
*epd
, u8
**pp
,
246 const u8
*data
, u8 fixed_value
, const u8
*mask
,
247 enum repaper_stage stage
)
251 for (b
= epd
->width
/ 8; b
> 0; b
--) {
253 u8 pixels
= data
[b
- 1] & 0x55;
254 u8 pixel_mask
= 0xff;
257 pixel_mask
= (mask
[b
- 1] ^ pixels
) & 0x55;
258 pixel_mask
|= pixel_mask
<< 1;
262 case REPAPER_COMPENSATE
: /* B -> W, W -> B (Current) */
263 pixels
= 0xaa | (pixels
^ 0x55);
265 case REPAPER_WHITE
: /* B -> N, W -> W (Current) */
266 pixels
= 0x55 + (pixels
^ 0x55);
268 case REPAPER_INVERSE
: /* B -> N, W -> B (New) */
269 pixels
= 0x55 | ((pixels
^ 0x55) << 1);
271 case REPAPER_NORMAL
: /* B -> B, W -> W (New) */
272 pixels
= 0xaa | pixels
;
276 pixels
= (pixels
& pixel_mask
) | (~pixel_mask
& 0x55);
279 *(*pp
)++ = fixed_value
;
284 /* interleave bits: (byte)76543210 -> (16 bit).7.6.5.4.3.2.1 */
285 static inline u16
repaper_interleave_bits(u16 value
)
287 value
= (value
| (value
<< 4)) & 0x0f0f;
288 value
= (value
| (value
<< 2)) & 0x3333;
289 value
= (value
| (value
<< 1)) & 0x5555;
294 /* pixels on display are numbered from 1 */
295 static void repaper_all_pixels(struct repaper_epd
*epd
, u8
**pp
,
296 const u8
*data
, u8 fixed_value
, const u8
*mask
,
297 enum repaper_stage stage
)
301 for (b
= epd
->width
/ 8; b
> 0; b
--) {
303 u16 pixels
= repaper_interleave_bits(data
[b
- 1]);
304 u16 pixel_mask
= 0xffff;
307 pixel_mask
= repaper_interleave_bits(mask
[b
- 1]);
309 pixel_mask
= (pixel_mask
^ pixels
) & 0x5555;
310 pixel_mask
|= pixel_mask
<< 1;
314 case REPAPER_COMPENSATE
: /* B -> W, W -> B (Current) */
315 pixels
= 0xaaaa | (pixels
^ 0x5555);
317 case REPAPER_WHITE
: /* B -> N, W -> W (Current) */
318 pixels
= 0x5555 + (pixels
^ 0x5555);
320 case REPAPER_INVERSE
: /* B -> N, W -> B (New) */
321 pixels
= 0x5555 | ((pixels
^ 0x5555) << 1);
323 case REPAPER_NORMAL
: /* B -> B, W -> W (New) */
324 pixels
= 0xaaaa | pixels
;
328 pixels
= (pixels
& pixel_mask
) | (~pixel_mask
& 0x5555);
329 *(*pp
)++ = pixels
>> 8;
332 *(*pp
)++ = fixed_value
;
333 *(*pp
)++ = fixed_value
;
338 /* output one line of scan and data bytes to the display */
339 static void repaper_one_line(struct repaper_epd
*epd
, unsigned int line
,
340 const u8
*data
, u8 fixed_value
, const u8
*mask
,
341 enum repaper_stage stage
)
343 u8
*p
= epd
->line_buffer
;
346 repaper_spi_mosi_low(epd
->spi
);
348 if (epd
->pre_border_byte
)
351 if (epd
->middle_scan
) {
353 repaper_odd_pixels(epd
, &p
, data
, fixed_value
, mask
, stage
);
356 for (b
= epd
->bytes_per_scan
; b
> 0; b
--) {
357 if (line
/ 4 == b
- 1)
358 *p
++ = 0x03 << (2 * (line
& 0x03));
364 repaper_even_pixels(epd
, &p
, data
, fixed_value
, mask
, stage
);
367 * even scan line, but as lines on display are numbered from 1,
370 for (b
= 0; b
< epd
->bytes_per_scan
; b
++) {
371 if (0 != (line
& 0x01) && line
/ 8 == b
)
372 *p
++ = 0xc0 >> (line
& 0x06);
378 repaper_all_pixels(epd
, &p
, data
, fixed_value
, mask
, stage
);
381 * odd scan line, but as lines on display are numbered from 1,
384 for (b
= epd
->bytes_per_scan
; b
> 0; b
--) {
385 if (0 == (line
& 0x01) && line
/ 8 == b
- 1)
386 *p
++ = 0x03 << (line
& 0x06);
392 switch (epd
->border_byte
) {
393 case REPAPER_BORDER_BYTE_NONE
:
396 case REPAPER_BORDER_BYTE_ZERO
:
400 case REPAPER_BORDER_BYTE_SET
:
402 case REPAPER_COMPENSATE
:
404 case REPAPER_INVERSE
:
414 repaper_write_buf(epd
->spi
, 0x0a, epd
->line_buffer
,
415 p
- epd
->line_buffer
);
417 /* Output data to panel */
418 repaper_write_val(epd
->spi
, 0x02, 0x07);
420 repaper_spi_mosi_low(epd
->spi
);
423 static void repaper_frame_fixed(struct repaper_epd
*epd
, u8 fixed_value
,
424 enum repaper_stage stage
)
428 for (line
= 0; line
< epd
->height
; line
++)
429 repaper_one_line(epd
, line
, NULL
, fixed_value
, NULL
, stage
);
432 static void repaper_frame_data(struct repaper_epd
*epd
, const u8
*image
,
433 const u8
*mask
, enum repaper_stage stage
)
438 for (line
= 0; line
< epd
->height
; line
++) {
439 repaper_one_line(epd
, line
,
440 &image
[line
* (epd
->width
/ 8)],
444 for (line
= 0; line
< epd
->height
; line
++) {
445 size_t n
= line
* epd
->width
/ 8;
447 repaper_one_line(epd
, line
, &image
[n
], 0, &mask
[n
],
453 static void repaper_frame_fixed_repeat(struct repaper_epd
*epd
, u8 fixed_value
,
454 enum repaper_stage stage
)
456 u64 start
= local_clock();
457 u64 end
= start
+ (epd
->factored_stage_time
* 1000 * 1000);
460 repaper_frame_fixed(epd
, fixed_value
, stage
);
461 } while (local_clock() < end
);
464 static void repaper_frame_data_repeat(struct repaper_epd
*epd
, const u8
*image
,
465 const u8
*mask
, enum repaper_stage stage
)
467 u64 start
= local_clock();
468 u64 end
= start
+ (epd
->factored_stage_time
* 1000 * 1000);
471 repaper_frame_data(epd
, image
, mask
, stage
);
472 } while (local_clock() < end
);
475 static void repaper_get_temperature(struct repaper_epd
*epd
)
477 int ret
, temperature
= 0;
478 unsigned int factor10x
;
483 ret
= thermal_zone_get_temp(epd
->thermal
, &temperature
);
485 DRM_DEV_ERROR(&epd
->spi
->dev
, "Failed to get temperature (%d)\n", ret
);
491 if (temperature
<= -10)
493 else if (temperature
<= -5)
495 else if (temperature
<= 5)
497 else if (temperature
<= 10)
499 else if (temperature
<= 15)
501 else if (temperature
<= 20)
503 else if (temperature
<= 40)
508 epd
->factored_stage_time
= epd
->stage_time
* factor10x
/ 10;
511 static void repaper_gray8_to_mono_reversed(u8
*buf
, u32 width
, u32 height
)
513 u8
*gray8
= buf
, *mono
= buf
;
516 for (y
= 0; y
< height
; y
++)
517 for (xb
= 0; xb
< width
/ 8; xb
++) {
520 for (i
= 0; i
< 8; i
++) {
524 if (gray8
[y
* width
+ x
] >> 7)
531 static int repaper_fb_dirty(struct drm_framebuffer
*fb
)
533 struct drm_gem_cma_object
*cma_obj
= drm_fb_cma_get_gem_obj(fb
, 0);
534 struct dma_buf_attachment
*import_attach
= cma_obj
->base
.import_attach
;
535 struct repaper_epd
*epd
= drm_to_epd(fb
->dev
);
536 struct drm_rect clip
;
540 if (!drm_dev_enter(fb
->dev
, &idx
))
543 /* repaper can't do partial updates */
547 clip
.y2
= fb
->height
;
549 repaper_get_temperature(epd
);
551 DRM_DEBUG("Flushing [FB:%d] st=%ums\n", fb
->base
.id
,
552 epd
->factored_stage_time
);
554 buf
= kmalloc_array(fb
->width
, fb
->height
, GFP_KERNEL
);
561 ret
= dma_buf_begin_cpu_access(import_attach
->dmabuf
,
567 drm_fb_xrgb8888_to_gray8(buf
, cma_obj
->vaddr
, fb
, &clip
);
570 ret
= dma_buf_end_cpu_access(import_attach
->dmabuf
,
576 repaper_gray8_to_mono_reversed(buf
, fb
->width
, fb
->height
);
579 repaper_frame_data_repeat(epd
, buf
, epd
->current_frame
,
581 } else if (epd
->cleared
) {
582 repaper_frame_data_repeat(epd
, epd
->current_frame
, NULL
,
584 repaper_frame_data_repeat(epd
, epd
->current_frame
, NULL
,
586 repaper_frame_data_repeat(epd
, buf
, NULL
, REPAPER_INVERSE
);
587 repaper_frame_data_repeat(epd
, buf
, NULL
, REPAPER_NORMAL
);
591 /* Clear display (anything -> white) */
592 repaper_frame_fixed_repeat(epd
, 0xff, REPAPER_COMPENSATE
);
593 repaper_frame_fixed_repeat(epd
, 0xff, REPAPER_WHITE
);
594 repaper_frame_fixed_repeat(epd
, 0xaa, REPAPER_INVERSE
);
595 repaper_frame_fixed_repeat(epd
, 0xaa, REPAPER_NORMAL
);
597 /* Assuming a clear (white) screen output an image */
598 repaper_frame_fixed_repeat(epd
, 0xaa, REPAPER_COMPENSATE
);
599 repaper_frame_fixed_repeat(epd
, 0xaa, REPAPER_WHITE
);
600 repaper_frame_data_repeat(epd
, buf
, NULL
, REPAPER_INVERSE
);
601 repaper_frame_data_repeat(epd
, buf
, NULL
, REPAPER_NORMAL
);
607 memcpy(epd
->current_frame
, buf
, fb
->width
* fb
->height
/ 8);
610 * An extra frame write is needed if pixels are set in the bottom line,
611 * or else grey lines rises up from the pixels
613 if (epd
->pre_border_byte
) {
616 for (x
= 0; x
< (fb
->width
/ 8); x
++)
617 if (buf
[x
+ (fb
->width
* (fb
->height
- 1) / 8)]) {
618 repaper_frame_data_repeat(epd
, buf
,
633 static void power_off(struct repaper_epd
*epd
)
635 /* Turn off power and all signals */
636 gpiod_set_value_cansleep(epd
->reset
, 0);
637 gpiod_set_value_cansleep(epd
->panel_on
, 0);
639 gpiod_set_value_cansleep(epd
->border
, 0);
641 /* Ensure SPI MOSI and CLOCK are Low before CS Low */
642 repaper_spi_mosi_low(epd
->spi
);
644 /* Discharge pulse */
645 gpiod_set_value_cansleep(epd
->discharge
, 1);
647 gpiod_set_value_cansleep(epd
->discharge
, 0);
650 static void repaper_pipe_enable(struct drm_simple_display_pipe
*pipe
,
651 struct drm_crtc_state
*crtc_state
,
652 struct drm_plane_state
*plane_state
)
654 struct repaper_epd
*epd
= drm_to_epd(pipe
->crtc
.dev
);
655 struct spi_device
*spi
= epd
->spi
;
656 struct device
*dev
= &spi
->dev
;
660 if (!drm_dev_enter(pipe
->crtc
.dev
, &idx
))
663 DRM_DEBUG_DRIVER("\n");
665 /* Power up sequence */
666 gpiod_set_value_cansleep(epd
->reset
, 0);
667 gpiod_set_value_cansleep(epd
->panel_on
, 0);
668 gpiod_set_value_cansleep(epd
->discharge
, 0);
670 gpiod_set_value_cansleep(epd
->border
, 0);
671 repaper_spi_mosi_low(spi
);
672 usleep_range(5000, 10000);
674 gpiod_set_value_cansleep(epd
->panel_on
, 1);
676 * This delay comes from the repaper.org userspace driver, it's not
677 * mentioned in the datasheet.
679 usleep_range(10000, 15000);
680 gpiod_set_value_cansleep(epd
->reset
, 1);
682 gpiod_set_value_cansleep(epd
->border
, 1);
683 usleep_range(5000, 10000);
684 gpiod_set_value_cansleep(epd
->reset
, 0);
685 usleep_range(5000, 10000);
686 gpiod_set_value_cansleep(epd
->reset
, 1);
687 usleep_range(5000, 10000);
689 /* Wait for COG to become ready */
690 for (i
= 100; i
> 0; i
--) {
691 if (!gpiod_get_value_cansleep(epd
->busy
))
694 usleep_range(10, 100);
698 DRM_DEV_ERROR(dev
, "timeout waiting for panel to become ready.\n");
703 repaper_read_id(spi
);
704 ret
= repaper_read_id(spi
);
705 if (ret
!= REPAPER_RID_G2_COG_ID
) {
707 dev_err(dev
, "failed to read chip (%d)\n", ret
);
709 dev_err(dev
, "wrong COG ID 0x%02x\n", ret
);
715 repaper_write_val(spi
, 0x02, 0x40);
717 ret
= repaper_read_val(spi
, 0x0f);
718 if (ret
< 0 || !(ret
& 0x80)) {
720 DRM_DEV_ERROR(dev
, "failed to read chip (%d)\n", ret
);
722 DRM_DEV_ERROR(dev
, "panel is reported broken\n");
727 /* Power saving mode */
728 repaper_write_val(spi
, 0x0b, 0x02);
730 repaper_write_buf(spi
, 0x01, epd
->channel_select
, 8);
731 /* High power mode osc */
732 repaper_write_val(spi
, 0x07, 0xd1);
734 repaper_write_val(spi
, 0x08, 0x02);
736 repaper_write_val(spi
, 0x09, 0xc2);
738 repaper_write_val(spi
, 0x04, 0x03);
739 /* Driver latch on */
740 repaper_write_val(spi
, 0x03, 0x01);
741 /* Driver latch off */
742 repaper_write_val(spi
, 0x03, 0x00);
743 usleep_range(5000, 10000);
745 /* Start chargepump */
746 for (i
= 0; i
< 4; ++i
) {
747 /* Charge pump positive voltage on - VGH/VDL on */
748 repaper_write_val(spi
, 0x05, 0x01);
751 /* Charge pump negative voltage on - VGL/VDL on */
752 repaper_write_val(spi
, 0x05, 0x03);
755 /* Charge pump Vcom on - Vcom driver on */
756 repaper_write_val(spi
, 0x05, 0x0f);
760 ret
= repaper_read_val(spi
, 0x0f);
762 DRM_DEV_ERROR(dev
, "failed to read chip (%d)\n", ret
);
774 DRM_DEV_ERROR(dev
, "dc/dc failed\n");
780 * Output enable to disable
781 * The userspace driver sets this to 0x04, but the datasheet says 0x06
783 repaper_write_val(spi
, 0x02, 0x04);
785 epd
->partial
= false;
790 static void repaper_pipe_disable(struct drm_simple_display_pipe
*pipe
)
792 struct repaper_epd
*epd
= drm_to_epd(pipe
->crtc
.dev
);
793 struct spi_device
*spi
= epd
->spi
;
797 * This callback is not protected by drm_dev_enter/exit since we want to
798 * turn off the display on regular driver unload. It's highly unlikely
799 * that the underlying SPI controller is gone should this be called after
803 DRM_DEBUG_DRIVER("\n");
806 for (line
= 0; line
< epd
->height
; line
++)
807 repaper_one_line(epd
, 0x7fffu
, NULL
, 0x00, NULL
,
813 repaper_one_line(epd
, 0x7fffu
, NULL
, 0x00, NULL
,
816 gpiod_set_value_cansleep(epd
->border
, 0);
818 gpiod_set_value_cansleep(epd
->border
, 1);
820 /* Border dummy line */
821 repaper_one_line(epd
, 0x7fffu
, NULL
, 0x00, NULL
,
826 /* not described in datasheet */
827 repaper_write_val(spi
, 0x0b, 0x00);
828 /* Latch reset turn on */
829 repaper_write_val(spi
, 0x03, 0x01);
830 /* Power off charge pump Vcom */
831 repaper_write_val(spi
, 0x05, 0x03);
832 /* Power off charge pump neg voltage */
833 repaper_write_val(spi
, 0x05, 0x01);
835 /* Discharge internal */
836 repaper_write_val(spi
, 0x04, 0x80);
837 /* turn off all charge pumps */
838 repaper_write_val(spi
, 0x05, 0x00);
840 repaper_write_val(spi
, 0x07, 0x01);
846 static void repaper_pipe_update(struct drm_simple_display_pipe
*pipe
,
847 struct drm_plane_state
*old_state
)
849 struct drm_plane_state
*state
= pipe
->plane
.state
;
850 struct drm_rect rect
;
852 if (!pipe
->crtc
.state
->active
)
855 if (drm_atomic_helper_damage_merged(old_state
, state
, &rect
))
856 repaper_fb_dirty(state
->fb
);
859 static const struct drm_simple_display_pipe_funcs repaper_pipe_funcs
= {
860 .enable
= repaper_pipe_enable
,
861 .disable
= repaper_pipe_disable
,
862 .update
= repaper_pipe_update
,
863 .prepare_fb
= drm_gem_fb_simple_display_pipe_prepare_fb
,
866 static int repaper_connector_get_modes(struct drm_connector
*connector
)
868 struct repaper_epd
*epd
= drm_to_epd(connector
->dev
);
869 struct drm_display_mode
*mode
;
871 mode
= drm_mode_duplicate(connector
->dev
, epd
->mode
);
873 DRM_ERROR("Failed to duplicate mode\n");
877 drm_mode_set_name(mode
);
878 mode
->type
|= DRM_MODE_TYPE_PREFERRED
;
879 drm_mode_probed_add(connector
, mode
);
881 connector
->display_info
.width_mm
= mode
->width_mm
;
882 connector
->display_info
.height_mm
= mode
->height_mm
;
887 static const struct drm_connector_helper_funcs repaper_connector_hfuncs
= {
888 .get_modes
= repaper_connector_get_modes
,
891 static const struct drm_connector_funcs repaper_connector_funcs
= {
892 .reset
= drm_atomic_helper_connector_reset
,
893 .fill_modes
= drm_helper_probe_single_connector_modes
,
894 .destroy
= drm_connector_cleanup
,
895 .atomic_duplicate_state
= drm_atomic_helper_connector_duplicate_state
,
896 .atomic_destroy_state
= drm_atomic_helper_connector_destroy_state
,
899 static const struct drm_mode_config_funcs repaper_mode_config_funcs
= {
900 .fb_create
= drm_gem_fb_create_with_dirty
,
901 .atomic_check
= drm_atomic_helper_check
,
902 .atomic_commit
= drm_atomic_helper_commit
,
905 static const uint32_t repaper_formats
[] = {
909 static const struct drm_display_mode repaper_e1144cs021_mode
= {
910 DRM_SIMPLE_MODE(128, 96, 29, 22),
913 static const u8 repaper_e1144cs021_cs
[] = { 0x00, 0x00, 0x00, 0x00,
914 0x00, 0x0f, 0xff, 0x00 };
916 static const struct drm_display_mode repaper_e1190cs021_mode
= {
917 DRM_SIMPLE_MODE(144, 128, 36, 32),
920 static const u8 repaper_e1190cs021_cs
[] = { 0x00, 0x00, 0x00, 0x03,
921 0xfc, 0x00, 0x00, 0xff };
923 static const struct drm_display_mode repaper_e2200cs021_mode
= {
924 DRM_SIMPLE_MODE(200, 96, 46, 22),
927 static const u8 repaper_e2200cs021_cs
[] = { 0x00, 0x00, 0x00, 0x00,
928 0x01, 0xff, 0xe0, 0x00 };
930 static const struct drm_display_mode repaper_e2271cs021_mode
= {
931 DRM_SIMPLE_MODE(264, 176, 57, 38),
934 static const u8 repaper_e2271cs021_cs
[] = { 0x00, 0x00, 0x00, 0x7f,
935 0xff, 0xfe, 0x00, 0x00 };
937 DEFINE_DRM_GEM_CMA_FOPS(repaper_fops
);
939 static const struct drm_driver repaper_driver
= {
940 .driver_features
= DRIVER_GEM
| DRIVER_MODESET
| DRIVER_ATOMIC
,
941 .fops
= &repaper_fops
,
942 DRM_GEM_CMA_DRIVER_OPS_VMAP
,
944 .desc
= "Pervasive Displays RePaper e-ink panels",
950 static const struct of_device_id repaper_of_match
[] = {
951 { .compatible
= "pervasive,e1144cs021", .data
= (void *)E1144CS021
},
952 { .compatible
= "pervasive,e1190cs021", .data
= (void *)E1190CS021
},
953 { .compatible
= "pervasive,e2200cs021", .data
= (void *)E2200CS021
},
954 { .compatible
= "pervasive,e2271cs021", .data
= (void *)E2271CS021
},
957 MODULE_DEVICE_TABLE(of
, repaper_of_match
);
959 static const struct spi_device_id repaper_id
[] = {
960 { "e1144cs021", E1144CS021
},
961 { "e1190cs021", E1190CS021
},
962 { "e2200cs021", E2200CS021
},
963 { "e2271cs021", E2271CS021
},
966 MODULE_DEVICE_TABLE(spi
, repaper_id
);
968 static int repaper_probe(struct spi_device
*spi
)
970 const struct drm_display_mode
*mode
;
971 const struct spi_device_id
*spi_id
;
972 struct device
*dev
= &spi
->dev
;
973 enum repaper_model model
;
974 const char *thermal_zone
;
975 struct repaper_epd
*epd
;
976 size_t line_buffer_size
;
977 struct drm_device
*drm
;
981 match
= device_get_match_data(dev
);
983 model
= (enum repaper_model
)match
;
985 spi_id
= spi_get_device_id(spi
);
986 model
= (enum repaper_model
)spi_id
->driver_data
;
989 /* The SPI device is used to allocate dma memory */
990 if (!dev
->coherent_dma_mask
) {
991 ret
= dma_coerce_mask_and_coherent(dev
, DMA_BIT_MASK(32));
993 dev_warn(dev
, "Failed to set dma mask %d\n", ret
);
998 epd
= devm_drm_dev_alloc(dev
, &repaper_driver
,
999 struct repaper_epd
, drm
);
1001 return PTR_ERR(epd
);
1005 ret
= drmm_mode_config_init(drm
);
1008 drm
->mode_config
.funcs
= &repaper_mode_config_funcs
;
1012 epd
->panel_on
= devm_gpiod_get(dev
, "panel-on", GPIOD_OUT_LOW
);
1013 if (IS_ERR(epd
->panel_on
)) {
1014 ret
= PTR_ERR(epd
->panel_on
);
1015 if (ret
!= -EPROBE_DEFER
)
1016 DRM_DEV_ERROR(dev
, "Failed to get gpio 'panel-on'\n");
1020 epd
->discharge
= devm_gpiod_get(dev
, "discharge", GPIOD_OUT_LOW
);
1021 if (IS_ERR(epd
->discharge
)) {
1022 ret
= PTR_ERR(epd
->discharge
);
1023 if (ret
!= -EPROBE_DEFER
)
1024 DRM_DEV_ERROR(dev
, "Failed to get gpio 'discharge'\n");
1028 epd
->reset
= devm_gpiod_get(dev
, "reset", GPIOD_OUT_LOW
);
1029 if (IS_ERR(epd
->reset
)) {
1030 ret
= PTR_ERR(epd
->reset
);
1031 if (ret
!= -EPROBE_DEFER
)
1032 DRM_DEV_ERROR(dev
, "Failed to get gpio 'reset'\n");
1036 epd
->busy
= devm_gpiod_get(dev
, "busy", GPIOD_IN
);
1037 if (IS_ERR(epd
->busy
)) {
1038 ret
= PTR_ERR(epd
->busy
);
1039 if (ret
!= -EPROBE_DEFER
)
1040 DRM_DEV_ERROR(dev
, "Failed to get gpio 'busy'\n");
1044 if (!device_property_read_string(dev
, "pervasive,thermal-zone",
1046 epd
->thermal
= thermal_zone_get_zone_by_name(thermal_zone
);
1047 if (IS_ERR(epd
->thermal
)) {
1048 DRM_DEV_ERROR(dev
, "Failed to get thermal zone: %s\n", thermal_zone
);
1049 return PTR_ERR(epd
->thermal
);
1055 mode
= &repaper_e1144cs021_mode
;
1056 epd
->channel_select
= repaper_e1144cs021_cs
;
1057 epd
->stage_time
= 480;
1058 epd
->bytes_per_scan
= 96 / 4;
1059 epd
->middle_scan
= true; /* data-scan-data */
1060 epd
->pre_border_byte
= false;
1061 epd
->border_byte
= REPAPER_BORDER_BYTE_ZERO
;
1065 mode
= &repaper_e1190cs021_mode
;
1066 epd
->channel_select
= repaper_e1190cs021_cs
;
1067 epd
->stage_time
= 480;
1068 epd
->bytes_per_scan
= 128 / 4 / 2;
1069 epd
->middle_scan
= false; /* scan-data-scan */
1070 epd
->pre_border_byte
= false;
1071 epd
->border_byte
= REPAPER_BORDER_BYTE_SET
;
1075 mode
= &repaper_e2200cs021_mode
;
1076 epd
->channel_select
= repaper_e2200cs021_cs
;
1077 epd
->stage_time
= 480;
1078 epd
->bytes_per_scan
= 96 / 4;
1079 epd
->middle_scan
= true; /* data-scan-data */
1080 epd
->pre_border_byte
= true;
1081 epd
->border_byte
= REPAPER_BORDER_BYTE_NONE
;
1085 epd
->border
= devm_gpiod_get(dev
, "border", GPIOD_OUT_LOW
);
1086 if (IS_ERR(epd
->border
)) {
1087 ret
= PTR_ERR(epd
->border
);
1088 if (ret
!= -EPROBE_DEFER
)
1089 DRM_DEV_ERROR(dev
, "Failed to get gpio 'border'\n");
1093 mode
= &repaper_e2271cs021_mode
;
1094 epd
->channel_select
= repaper_e2271cs021_cs
;
1095 epd
->stage_time
= 630;
1096 epd
->bytes_per_scan
= 176 / 4;
1097 epd
->middle_scan
= true; /* data-scan-data */
1098 epd
->pre_border_byte
= true;
1099 epd
->border_byte
= REPAPER_BORDER_BYTE_NONE
;
1107 epd
->width
= mode
->hdisplay
;
1108 epd
->height
= mode
->vdisplay
;
1109 epd
->factored_stage_time
= epd
->stage_time
;
1111 line_buffer_size
= 2 * epd
->width
/ 8 + epd
->bytes_per_scan
+ 2;
1112 epd
->line_buffer
= devm_kzalloc(dev
, line_buffer_size
, GFP_KERNEL
);
1113 if (!epd
->line_buffer
)
1116 epd
->current_frame
= devm_kzalloc(dev
, epd
->width
* epd
->height
/ 8,
1118 if (!epd
->current_frame
)
1121 drm
->mode_config
.min_width
= mode
->hdisplay
;
1122 drm
->mode_config
.max_width
= mode
->hdisplay
;
1123 drm
->mode_config
.min_height
= mode
->vdisplay
;
1124 drm
->mode_config
.max_height
= mode
->vdisplay
;
1126 drm_connector_helper_add(&epd
->connector
, &repaper_connector_hfuncs
);
1127 ret
= drm_connector_init(drm
, &epd
->connector
, &repaper_connector_funcs
,
1128 DRM_MODE_CONNECTOR_SPI
);
1132 ret
= drm_simple_display_pipe_init(drm
, &epd
->pipe
, &repaper_pipe_funcs
,
1133 repaper_formats
, ARRAY_SIZE(repaper_formats
),
1134 NULL
, &epd
->connector
);
1138 drm_mode_config_reset(drm
);
1140 ret
= drm_dev_register(drm
, 0);
1144 spi_set_drvdata(spi
, drm
);
1146 DRM_DEBUG_DRIVER("SPI speed: %uMHz\n", spi
->max_speed_hz
/ 1000000);
1148 drm_fbdev_generic_setup(drm
, 0);
1153 static int repaper_remove(struct spi_device
*spi
)
1155 struct drm_device
*drm
= spi_get_drvdata(spi
);
1157 drm_dev_unplug(drm
);
1158 drm_atomic_helper_shutdown(drm
);
1163 static void repaper_shutdown(struct spi_device
*spi
)
1165 drm_atomic_helper_shutdown(spi_get_drvdata(spi
));
1168 static struct spi_driver repaper_spi_driver
= {
1171 .of_match_table
= repaper_of_match
,
1173 .id_table
= repaper_id
,
1174 .probe
= repaper_probe
,
1175 .remove
= repaper_remove
,
1176 .shutdown
= repaper_shutdown
,
1178 module_spi_driver(repaper_spi_driver
);
1180 MODULE_DESCRIPTION("Pervasive Displays RePaper DRM driver");
1181 MODULE_AUTHOR("Noralf Trønnes");
1182 MODULE_LICENSE("GPL");