repaper.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  1. /*
  2. * DRM driver for Pervasive Displays RePaper branded e-ink panels
  3. *
  4. * Copyright 2013-2017 Pervasive Displays, Inc.
  5. * Copyright 2017 Noralf Trønnes
  6. *
  7. * The driver supports:
  8. * Material Film: Aurora Mb (V231)
  9. * Driver IC: G2 (eTC)
  10. *
  11. * The controller code was taken from the userspace driver:
  12. * https://github.com/repaper/gratis
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License as published by
  16. * the Free Software Foundation; either version 2 of the License, or
  17. * (at your option) any later version.
  18. */
  19. #include <linux/delay.h>
  20. #include <linux/gpio/consumer.h>
  21. #include <linux/module.h>
  22. #include <linux/of_device.h>
  23. #include <linux/sched/clock.h>
  24. #include <linux/spi/spi.h>
  25. #include <linux/thermal.h>
  26. #include <drm/tinydrm/tinydrm.h>
  27. #include <drm/tinydrm/tinydrm-helpers.h>
  28. #define REPAPER_RID_G2_COG_ID 0x12
  29. enum repaper_model {
  30. E1144CS021 = 1,
  31. E1190CS021,
  32. E2200CS021,
  33. E2271CS021,
  34. };
  35. enum repaper_stage { /* Image pixel -> Display pixel */
  36. REPAPER_COMPENSATE, /* B -> W, W -> B (Current Image) */
  37. REPAPER_WHITE, /* B -> N, W -> W (Current Image) */
  38. REPAPER_INVERSE, /* B -> N, W -> B (New Image) */
  39. REPAPER_NORMAL /* B -> B, W -> W (New Image) */
  40. };
  41. enum repaper_epd_border_byte {
  42. REPAPER_BORDER_BYTE_NONE,
  43. REPAPER_BORDER_BYTE_ZERO,
  44. REPAPER_BORDER_BYTE_SET,
  45. };
  46. struct repaper_epd {
  47. struct tinydrm_device tinydrm;
  48. struct spi_device *spi;
  49. struct gpio_desc *panel_on;
  50. struct gpio_desc *border;
  51. struct gpio_desc *discharge;
  52. struct gpio_desc *reset;
  53. struct gpio_desc *busy;
  54. struct thermal_zone_device *thermal;
  55. unsigned int height;
  56. unsigned int width;
  57. unsigned int bytes_per_scan;
  58. const u8 *channel_select;
  59. unsigned int stage_time;
  60. unsigned int factored_stage_time;
  61. bool middle_scan;
  62. bool pre_border_byte;
  63. enum repaper_epd_border_byte border_byte;
  64. u8 *line_buffer;
  65. void *current_frame;
  66. bool enabled;
  67. bool cleared;
  68. bool partial;
  69. };
  70. static inline struct repaper_epd *
  71. epd_from_tinydrm(struct tinydrm_device *tdev)
  72. {
  73. return container_of(tdev, struct repaper_epd, tinydrm);
  74. }
  75. static int repaper_spi_transfer(struct spi_device *spi, u8 header,
  76. const void *tx, void *rx, size_t len)
  77. {
  78. void *txbuf = NULL, *rxbuf = NULL;
  79. struct spi_transfer tr[2] = {};
  80. u8 *headerbuf;
  81. int ret;
  82. headerbuf = kmalloc(1, GFP_KERNEL);
  83. if (!headerbuf)
  84. return -ENOMEM;
  85. headerbuf[0] = header;
  86. tr[0].tx_buf = headerbuf;
  87. tr[0].len = 1;
  88. /* Stack allocated tx? */
  89. if (tx && len <= 32) {
  90. txbuf = kmalloc(len, GFP_KERNEL);
  91. if (!txbuf) {
  92. ret = -ENOMEM;
  93. goto out_free;
  94. }
  95. memcpy(txbuf, tx, len);
  96. }
  97. if (rx) {
  98. rxbuf = kmalloc(len, GFP_KERNEL);
  99. if (!rxbuf) {
  100. ret = -ENOMEM;
  101. goto out_free;
  102. }
  103. }
  104. tr[1].tx_buf = txbuf ? txbuf : tx;
  105. tr[1].rx_buf = rxbuf;
  106. tr[1].len = len;
  107. ndelay(80);
  108. ret = spi_sync_transfer(spi, tr, 2);
  109. if (rx && !ret)
  110. memcpy(rx, rxbuf, len);
  111. out_free:
  112. kfree(headerbuf);
  113. kfree(txbuf);
  114. kfree(rxbuf);
  115. return ret;
  116. }
  117. static int repaper_write_buf(struct spi_device *spi, u8 reg,
  118. const u8 *buf, size_t len)
  119. {
  120. int ret;
  121. ret = repaper_spi_transfer(spi, 0x70, &reg, NULL, 1);
  122. if (ret)
  123. return ret;
  124. return repaper_spi_transfer(spi, 0x72, buf, NULL, len);
  125. }
  126. static int repaper_write_val(struct spi_device *spi, u8 reg, u8 val)
  127. {
  128. return repaper_write_buf(spi, reg, &val, 1);
  129. }
  130. static int repaper_read_val(struct spi_device *spi, u8 reg)
  131. {
  132. int ret;
  133. u8 val;
  134. ret = repaper_spi_transfer(spi, 0x70, &reg, NULL, 1);
  135. if (ret)
  136. return ret;
  137. ret = repaper_spi_transfer(spi, 0x73, NULL, &val, 1);
  138. return ret ? ret : val;
  139. }
  140. static int repaper_read_id(struct spi_device *spi)
  141. {
  142. int ret;
  143. u8 id;
  144. ret = repaper_spi_transfer(spi, 0x71, NULL, &id, 1);
  145. return ret ? ret : id;
  146. }
  147. static void repaper_spi_mosi_low(struct spi_device *spi)
  148. {
  149. const u8 buf[1] = { 0 };
  150. spi_write(spi, buf, 1);
  151. }
  152. /* pixels on display are numbered from 1 so even is actually bits 1,3,5,... */
  153. static void repaper_even_pixels(struct repaper_epd *epd, u8 **pp,
  154. const u8 *data, u8 fixed_value, const u8 *mask,
  155. enum repaper_stage stage)
  156. {
  157. unsigned int b;
  158. for (b = 0; b < (epd->width / 8); b++) {
  159. if (data) {
  160. u8 pixels = data[b] & 0xaa;
  161. u8 pixel_mask = 0xff;
  162. u8 p1, p2, p3, p4;
  163. if (mask) {
  164. pixel_mask = (mask[b] ^ pixels) & 0xaa;
  165. pixel_mask |= pixel_mask >> 1;
  166. }
  167. switch (stage) {
  168. case REPAPER_COMPENSATE: /* B -> W, W -> B (Current) */
  169. pixels = 0xaa | ((pixels ^ 0xaa) >> 1);
  170. break;
  171. case REPAPER_WHITE: /* B -> N, W -> W (Current) */
  172. pixels = 0x55 + ((pixels ^ 0xaa) >> 1);
  173. break;
  174. case REPAPER_INVERSE: /* B -> N, W -> B (New) */
  175. pixels = 0x55 | (pixels ^ 0xaa);
  176. break;
  177. case REPAPER_NORMAL: /* B -> B, W -> W (New) */
  178. pixels = 0xaa | (pixels >> 1);
  179. break;
  180. }
  181. pixels = (pixels & pixel_mask) | (~pixel_mask & 0x55);
  182. p1 = (pixels >> 6) & 0x03;
  183. p2 = (pixels >> 4) & 0x03;
  184. p3 = (pixels >> 2) & 0x03;
  185. p4 = (pixels >> 0) & 0x03;
  186. pixels = (p1 << 0) | (p2 << 2) | (p3 << 4) | (p4 << 6);
  187. *(*pp)++ = pixels;
  188. } else {
  189. *(*pp)++ = fixed_value;
  190. }
  191. }
  192. }
  193. /* pixels on display are numbered from 1 so odd is actually bits 0,2,4,... */
  194. static void repaper_odd_pixels(struct repaper_epd *epd, u8 **pp,
  195. const u8 *data, u8 fixed_value, const u8 *mask,
  196. enum repaper_stage stage)
  197. {
  198. unsigned int b;
  199. for (b = epd->width / 8; b > 0; b--) {
  200. if (data) {
  201. u8 pixels = data[b - 1] & 0x55;
  202. u8 pixel_mask = 0xff;
  203. if (mask) {
  204. pixel_mask = (mask[b - 1] ^ pixels) & 0x55;
  205. pixel_mask |= pixel_mask << 1;
  206. }
  207. switch (stage) {
  208. case REPAPER_COMPENSATE: /* B -> W, W -> B (Current) */
  209. pixels = 0xaa | (pixels ^ 0x55);
  210. break;
  211. case REPAPER_WHITE: /* B -> N, W -> W (Current) */
  212. pixels = 0x55 + (pixels ^ 0x55);
  213. break;
  214. case REPAPER_INVERSE: /* B -> N, W -> B (New) */
  215. pixels = 0x55 | ((pixels ^ 0x55) << 1);
  216. break;
  217. case REPAPER_NORMAL: /* B -> B, W -> W (New) */
  218. pixels = 0xaa | pixels;
  219. break;
  220. }
  221. pixels = (pixels & pixel_mask) | (~pixel_mask & 0x55);
  222. *(*pp)++ = pixels;
  223. } else {
  224. *(*pp)++ = fixed_value;
  225. }
  226. }
  227. }
  228. /* interleave bits: (byte)76543210 -> (16 bit).7.6.5.4.3.2.1 */
  229. static inline u16 repaper_interleave_bits(u16 value)
  230. {
  231. value = (value | (value << 4)) & 0x0f0f;
  232. value = (value | (value << 2)) & 0x3333;
  233. value = (value | (value << 1)) & 0x5555;
  234. return value;
  235. }
  236. /* pixels on display are numbered from 1 */
  237. static void repaper_all_pixels(struct repaper_epd *epd, u8 **pp,
  238. const u8 *data, u8 fixed_value, const u8 *mask,
  239. enum repaper_stage stage)
  240. {
  241. unsigned int b;
  242. for (b = epd->width / 8; b > 0; b--) {
  243. if (data) {
  244. u16 pixels = repaper_interleave_bits(data[b - 1]);
  245. u16 pixel_mask = 0xffff;
  246. if (mask) {
  247. pixel_mask = repaper_interleave_bits(mask[b - 1]);
  248. pixel_mask = (pixel_mask ^ pixels) & 0x5555;
  249. pixel_mask |= pixel_mask << 1;
  250. }
  251. switch (stage) {
  252. case REPAPER_COMPENSATE: /* B -> W, W -> B (Current) */
  253. pixels = 0xaaaa | (pixels ^ 0x5555);
  254. break;
  255. case REPAPER_WHITE: /* B -> N, W -> W (Current) */
  256. pixels = 0x5555 + (pixels ^ 0x5555);
  257. break;
  258. case REPAPER_INVERSE: /* B -> N, W -> B (New) */
  259. pixels = 0x5555 | ((pixels ^ 0x5555) << 1);
  260. break;
  261. case REPAPER_NORMAL: /* B -> B, W -> W (New) */
  262. pixels = 0xaaaa | pixels;
  263. break;
  264. }
  265. pixels = (pixels & pixel_mask) | (~pixel_mask & 0x5555);
  266. *(*pp)++ = pixels >> 8;
  267. *(*pp)++ = pixels;
  268. } else {
  269. *(*pp)++ = fixed_value;
  270. *(*pp)++ = fixed_value;
  271. }
  272. }
  273. }
  274. /* output one line of scan and data bytes to the display */
  275. static void repaper_one_line(struct repaper_epd *epd, unsigned int line,
  276. const u8 *data, u8 fixed_value, const u8 *mask,
  277. enum repaper_stage stage)
  278. {
  279. u8 *p = epd->line_buffer;
  280. unsigned int b;
  281. repaper_spi_mosi_low(epd->spi);
  282. if (epd->pre_border_byte)
  283. *p++ = 0x00;
  284. if (epd->middle_scan) {
  285. /* data bytes */
  286. repaper_odd_pixels(epd, &p, data, fixed_value, mask, stage);
  287. /* scan line */
  288. for (b = epd->bytes_per_scan; b > 0; b--) {
  289. if (line / 4 == b - 1)
  290. *p++ = 0x03 << (2 * (line & 0x03));
  291. else
  292. *p++ = 0x00;
  293. }
  294. /* data bytes */
  295. repaper_even_pixels(epd, &p, data, fixed_value, mask, stage);
  296. } else {
  297. /*
  298. * even scan line, but as lines on display are numbered from 1,
  299. * line: 1,3,5,...
  300. */
  301. for (b = 0; b < epd->bytes_per_scan; b++) {
  302. if (0 != (line & 0x01) && line / 8 == b)
  303. *p++ = 0xc0 >> (line & 0x06);
  304. else
  305. *p++ = 0x00;
  306. }
  307. /* data bytes */
  308. repaper_all_pixels(epd, &p, data, fixed_value, mask, stage);
  309. /*
  310. * odd scan line, but as lines on display are numbered from 1,
  311. * line: 0,2,4,6,...
  312. */
  313. for (b = epd->bytes_per_scan; b > 0; b--) {
  314. if (0 == (line & 0x01) && line / 8 == b - 1)
  315. *p++ = 0x03 << (line & 0x06);
  316. else
  317. *p++ = 0x00;
  318. }
  319. }
  320. switch (epd->border_byte) {
  321. case REPAPER_BORDER_BYTE_NONE:
  322. break;
  323. case REPAPER_BORDER_BYTE_ZERO:
  324. *p++ = 0x00;
  325. break;
  326. case REPAPER_BORDER_BYTE_SET:
  327. switch (stage) {
  328. case REPAPER_COMPENSATE:
  329. case REPAPER_WHITE:
  330. case REPAPER_INVERSE:
  331. *p++ = 0x00;
  332. break;
  333. case REPAPER_NORMAL:
  334. *p++ = 0xaa;
  335. break;
  336. }
  337. break;
  338. }
  339. repaper_write_buf(epd->spi, 0x0a, epd->line_buffer,
  340. p - epd->line_buffer);
  341. /* Output data to panel */
  342. repaper_write_val(epd->spi, 0x02, 0x07);
  343. repaper_spi_mosi_low(epd->spi);
  344. }
  345. static void repaper_frame_fixed(struct repaper_epd *epd, u8 fixed_value,
  346. enum repaper_stage stage)
  347. {
  348. unsigned int line;
  349. for (line = 0; line < epd->height; line++)
  350. repaper_one_line(epd, line, NULL, fixed_value, NULL, stage);
  351. }
  352. static void repaper_frame_data(struct repaper_epd *epd, const u8 *image,
  353. const u8 *mask, enum repaper_stage stage)
  354. {
  355. unsigned int line;
  356. if (!mask) {
  357. for (line = 0; line < epd->height; line++) {
  358. repaper_one_line(epd, line,
  359. &image[line * (epd->width / 8)],
  360. 0, NULL, stage);
  361. }
  362. } else {
  363. for (line = 0; line < epd->height; line++) {
  364. size_t n = line * epd->width / 8;
  365. repaper_one_line(epd, line, &image[n], 0, &mask[n],
  366. stage);
  367. }
  368. }
  369. }
  370. static void repaper_frame_fixed_repeat(struct repaper_epd *epd, u8 fixed_value,
  371. enum repaper_stage stage)
  372. {
  373. u64 start = local_clock();
  374. u64 end = start + (epd->factored_stage_time * 1000 * 1000);
  375. do {
  376. repaper_frame_fixed(epd, fixed_value, stage);
  377. } while (local_clock() < end);
  378. }
  379. static void repaper_frame_data_repeat(struct repaper_epd *epd, const u8 *image,
  380. const u8 *mask, enum repaper_stage stage)
  381. {
  382. u64 start = local_clock();
  383. u64 end = start + (epd->factored_stage_time * 1000 * 1000);
  384. do {
  385. repaper_frame_data(epd, image, mask, stage);
  386. } while (local_clock() < end);
  387. }
  388. static void repaper_get_temperature(struct repaper_epd *epd)
  389. {
  390. int ret, temperature = 0;
  391. unsigned int factor10x;
  392. if (!epd->thermal)
  393. return;
  394. ret = thermal_zone_get_temp(epd->thermal, &temperature);
  395. if (ret) {
  396. dev_err(&epd->spi->dev, "Failed to get temperature (%d)\n",
  397. ret);
  398. return;
  399. }
  400. temperature /= 1000;
  401. if (temperature <= -10)
  402. factor10x = 170;
  403. else if (temperature <= -5)
  404. factor10x = 120;
  405. else if (temperature <= 5)
  406. factor10x = 80;
  407. else if (temperature <= 10)
  408. factor10x = 40;
  409. else if (temperature <= 15)
  410. factor10x = 30;
  411. else if (temperature <= 20)
  412. factor10x = 20;
  413. else if (temperature <= 40)
  414. factor10x = 10;
  415. else
  416. factor10x = 7;
  417. epd->factored_stage_time = epd->stage_time * factor10x / 10;
  418. }
  419. static void repaper_gray8_to_mono_reversed(u8 *buf, u32 width, u32 height)
  420. {
  421. u8 *gray8 = buf, *mono = buf;
  422. int y, xb, i;
  423. for (y = 0; y < height; y++)
  424. for (xb = 0; xb < width / 8; xb++) {
  425. u8 byte = 0x00;
  426. for (i = 0; i < 8; i++) {
  427. int x = xb * 8 + i;
  428. byte >>= 1;
  429. if (gray8[y * width + x] >> 7)
  430. byte |= BIT(7);
  431. }
  432. *mono++ = byte;
  433. }
  434. }
  435. static int repaper_fb_dirty(struct drm_framebuffer *fb,
  436. struct drm_file *file_priv,
  437. unsigned int flags, unsigned int color,
  438. struct drm_clip_rect *clips,
  439. unsigned int num_clips)
  440. {
  441. struct tinydrm_device *tdev = fb->dev->dev_private;
  442. struct repaper_epd *epd = epd_from_tinydrm(tdev);
  443. u8 *buf = NULL;
  444. int ret = 0;
  445. mutex_lock(&tdev->dirty_lock);
  446. if (!epd->enabled)
  447. goto out_unlock;
  448. /* fbdev can flush even when we're not interested */
  449. if (tdev->pipe.plane.fb != fb)
  450. goto out_unlock;
  451. repaper_get_temperature(epd);
  452. DRM_DEBUG("Flushing [FB:%d] st=%ums\n", fb->base.id,
  453. epd->factored_stage_time);
  454. buf = kmalloc(fb->width * fb->height, GFP_KERNEL);
  455. if (!buf) {
  456. ret = -ENOMEM;
  457. goto out_unlock;
  458. }
  459. ret = tinydrm_xrgb8888_to_gray8(buf, fb);
  460. if (ret)
  461. goto out_unlock;
  462. repaper_gray8_to_mono_reversed(buf, fb->width, fb->height);
  463. if (epd->partial) {
  464. repaper_frame_data_repeat(epd, buf, epd->current_frame,
  465. REPAPER_NORMAL);
  466. } else if (epd->cleared) {
  467. repaper_frame_data_repeat(epd, epd->current_frame, NULL,
  468. REPAPER_COMPENSATE);
  469. repaper_frame_data_repeat(epd, epd->current_frame, NULL,
  470. REPAPER_WHITE);
  471. repaper_frame_data_repeat(epd, buf, NULL, REPAPER_INVERSE);
  472. repaper_frame_data_repeat(epd, buf, NULL, REPAPER_NORMAL);
  473. epd->partial = true;
  474. } else {
  475. /* Clear display (anything -> white) */
  476. repaper_frame_fixed_repeat(epd, 0xff, REPAPER_COMPENSATE);
  477. repaper_frame_fixed_repeat(epd, 0xff, REPAPER_WHITE);
  478. repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_INVERSE);
  479. repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_NORMAL);
  480. /* Assuming a clear (white) screen output an image */
  481. repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_COMPENSATE);
  482. repaper_frame_fixed_repeat(epd, 0xaa, REPAPER_WHITE);
  483. repaper_frame_data_repeat(epd, buf, NULL, REPAPER_INVERSE);
  484. repaper_frame_data_repeat(epd, buf, NULL, REPAPER_NORMAL);
  485. epd->cleared = true;
  486. epd->partial = true;
  487. }
  488. memcpy(epd->current_frame, buf, fb->width * fb->height / 8);
  489. /*
  490. * An extra frame write is needed if pixels are set in the bottom line,
  491. * or else grey lines rises up from the pixels
  492. */
  493. if (epd->pre_border_byte) {
  494. unsigned int x;
  495. for (x = 0; x < (fb->width / 8); x++)
  496. if (buf[x + (fb->width * (fb->height - 1) / 8)]) {
  497. repaper_frame_data_repeat(epd, buf,
  498. epd->current_frame,
  499. REPAPER_NORMAL);
  500. break;
  501. }
  502. }
  503. out_unlock:
  504. mutex_unlock(&tdev->dirty_lock);
  505. if (ret)
  506. dev_err(fb->dev->dev, "Failed to update display (%d)\n", ret);
  507. kfree(buf);
  508. return ret;
  509. }
  510. static const struct drm_framebuffer_funcs repaper_fb_funcs = {
  511. .destroy = drm_fb_cma_destroy,
  512. .create_handle = drm_fb_cma_create_handle,
  513. .dirty = repaper_fb_dirty,
  514. };
  515. static void power_off(struct repaper_epd *epd)
  516. {
  517. /* Turn off power and all signals */
  518. gpiod_set_value_cansleep(epd->reset, 0);
  519. gpiod_set_value_cansleep(epd->panel_on, 0);
  520. if (epd->border)
  521. gpiod_set_value_cansleep(epd->border, 0);
  522. /* Ensure SPI MOSI and CLOCK are Low before CS Low */
  523. repaper_spi_mosi_low(epd->spi);
  524. /* Discharge pulse */
  525. gpiod_set_value_cansleep(epd->discharge, 1);
  526. msleep(150);
  527. gpiod_set_value_cansleep(epd->discharge, 0);
  528. }
  529. static void repaper_pipe_enable(struct drm_simple_display_pipe *pipe,
  530. struct drm_crtc_state *crtc_state)
  531. {
  532. struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
  533. struct repaper_epd *epd = epd_from_tinydrm(tdev);
  534. struct spi_device *spi = epd->spi;
  535. struct device *dev = &spi->dev;
  536. bool dc_ok = false;
  537. int i, ret;
  538. DRM_DEBUG_DRIVER("\n");
  539. /* Power up sequence */
  540. gpiod_set_value_cansleep(epd->reset, 0);
  541. gpiod_set_value_cansleep(epd->panel_on, 0);
  542. gpiod_set_value_cansleep(epd->discharge, 0);
  543. if (epd->border)
  544. gpiod_set_value_cansleep(epd->border, 0);
  545. repaper_spi_mosi_low(spi);
  546. usleep_range(5000, 10000);
  547. gpiod_set_value_cansleep(epd->panel_on, 1);
  548. /*
  549. * This delay comes from the repaper.org userspace driver, it's not
  550. * mentioned in the datasheet.
  551. */
  552. usleep_range(10000, 15000);
  553. gpiod_set_value_cansleep(epd->reset, 1);
  554. if (epd->border)
  555. gpiod_set_value_cansleep(epd->border, 1);
  556. usleep_range(5000, 10000);
  557. gpiod_set_value_cansleep(epd->reset, 0);
  558. usleep_range(5000, 10000);
  559. gpiod_set_value_cansleep(epd->reset, 1);
  560. usleep_range(5000, 10000);
  561. /* Wait for COG to become ready */
  562. for (i = 100; i > 0; i--) {
  563. if (!gpiod_get_value_cansleep(epd->busy))
  564. break;
  565. usleep_range(10, 100);
  566. }
  567. if (!i) {
  568. dev_err(dev, "timeout waiting for panel to become ready.\n");
  569. power_off(epd);
  570. return;
  571. }
  572. repaper_read_id(spi);
  573. ret = repaper_read_id(spi);
  574. if (ret != REPAPER_RID_G2_COG_ID) {
  575. if (ret < 0)
  576. dev_err(dev, "failed to read chip (%d)\n", ret);
  577. else
  578. dev_err(dev, "wrong COG ID 0x%02x\n", ret);
  579. power_off(epd);
  580. return;
  581. }
  582. /* Disable OE */
  583. repaper_write_val(spi, 0x02, 0x40);
  584. ret = repaper_read_val(spi, 0x0f);
  585. if (ret < 0 || !(ret & 0x80)) {
  586. if (ret < 0)
  587. dev_err(dev, "failed to read chip (%d)\n", ret);
  588. else
  589. dev_err(dev, "panel is reported broken\n");
  590. power_off(epd);
  591. return;
  592. }
  593. /* Power saving mode */
  594. repaper_write_val(spi, 0x0b, 0x02);
  595. /* Channel select */
  596. repaper_write_buf(spi, 0x01, epd->channel_select, 8);
  597. /* High power mode osc */
  598. repaper_write_val(spi, 0x07, 0xd1);
  599. /* Power setting */
  600. repaper_write_val(spi, 0x08, 0x02);
  601. /* Vcom level */
  602. repaper_write_val(spi, 0x09, 0xc2);
  603. /* Power setting */
  604. repaper_write_val(spi, 0x04, 0x03);
  605. /* Driver latch on */
  606. repaper_write_val(spi, 0x03, 0x01);
  607. /* Driver latch off */
  608. repaper_write_val(spi, 0x03, 0x00);
  609. usleep_range(5000, 10000);
  610. /* Start chargepump */
  611. for (i = 0; i < 4; ++i) {
  612. /* Charge pump positive voltage on - VGH/VDL on */
  613. repaper_write_val(spi, 0x05, 0x01);
  614. msleep(240);
  615. /* Charge pump negative voltage on - VGL/VDL on */
  616. repaper_write_val(spi, 0x05, 0x03);
  617. msleep(40);
  618. /* Charge pump Vcom on - Vcom driver on */
  619. repaper_write_val(spi, 0x05, 0x0f);
  620. msleep(40);
  621. /* check DC/DC */
  622. ret = repaper_read_val(spi, 0x0f);
  623. if (ret < 0) {
  624. dev_err(dev, "failed to read chip (%d)\n", ret);
  625. power_off(epd);
  626. return;
  627. }
  628. if (ret & 0x40) {
  629. dc_ok = true;
  630. break;
  631. }
  632. }
  633. if (!dc_ok) {
  634. dev_err(dev, "dc/dc failed\n");
  635. power_off(epd);
  636. return;
  637. }
  638. /*
  639. * Output enable to disable
  640. * The userspace driver sets this to 0x04, but the datasheet says 0x06
  641. */
  642. repaper_write_val(spi, 0x02, 0x04);
  643. epd->enabled = true;
  644. epd->partial = false;
  645. }
  646. static void repaper_pipe_disable(struct drm_simple_display_pipe *pipe)
  647. {
  648. struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
  649. struct repaper_epd *epd = epd_from_tinydrm(tdev);
  650. struct spi_device *spi = epd->spi;
  651. unsigned int line;
  652. DRM_DEBUG_DRIVER("\n");
  653. mutex_lock(&tdev->dirty_lock);
  654. epd->enabled = false;
  655. mutex_unlock(&tdev->dirty_lock);
  656. /* Nothing frame */
  657. for (line = 0; line < epd->height; line++)
  658. repaper_one_line(epd, 0x7fffu, NULL, 0x00, NULL,
  659. REPAPER_COMPENSATE);
  660. /* 2.7" */
  661. if (epd->border) {
  662. /* Dummy line */
  663. repaper_one_line(epd, 0x7fffu, NULL, 0x00, NULL,
  664. REPAPER_COMPENSATE);
  665. msleep(25);
  666. gpiod_set_value_cansleep(epd->border, 0);
  667. msleep(200);
  668. gpiod_set_value_cansleep(epd->border, 1);
  669. } else {
  670. /* Border dummy line */
  671. repaper_one_line(epd, 0x7fffu, NULL, 0x00, NULL,
  672. REPAPER_NORMAL);
  673. msleep(200);
  674. }
  675. /* not described in datasheet */
  676. repaper_write_val(spi, 0x0b, 0x00);
  677. /* Latch reset turn on */
  678. repaper_write_val(spi, 0x03, 0x01);
  679. /* Power off charge pump Vcom */
  680. repaper_write_val(spi, 0x05, 0x03);
  681. /* Power off charge pump neg voltage */
  682. repaper_write_val(spi, 0x05, 0x01);
  683. msleep(120);
  684. /* Discharge internal */
  685. repaper_write_val(spi, 0x04, 0x80);
  686. /* turn off all charge pumps */
  687. repaper_write_val(spi, 0x05, 0x00);
  688. /* Turn off osc */
  689. repaper_write_val(spi, 0x07, 0x01);
  690. msleep(50);
  691. power_off(epd);
  692. }
  693. static const struct drm_simple_display_pipe_funcs repaper_pipe_funcs = {
  694. .enable = repaper_pipe_enable,
  695. .disable = repaper_pipe_disable,
  696. .update = tinydrm_display_pipe_update,
  697. .prepare_fb = tinydrm_display_pipe_prepare_fb,
  698. };
  699. static const uint32_t repaper_formats[] = {
  700. DRM_FORMAT_XRGB8888,
  701. };
  702. static const struct drm_display_mode repaper_e1144cs021_mode = {
  703. TINYDRM_MODE(128, 96, 29, 22),
  704. };
  705. static const u8 repaper_e1144cs021_cs[] = { 0x00, 0x00, 0x00, 0x00,
  706. 0x00, 0x0f, 0xff, 0x00 };
  707. static const struct drm_display_mode repaper_e1190cs021_mode = {
  708. TINYDRM_MODE(144, 128, 36, 32),
  709. };
  710. static const u8 repaper_e1190cs021_cs[] = { 0x00, 0x00, 0x00, 0x03,
  711. 0xfc, 0x00, 0x00, 0xff };
  712. static const struct drm_display_mode repaper_e2200cs021_mode = {
  713. TINYDRM_MODE(200, 96, 46, 22),
  714. };
  715. static const u8 repaper_e2200cs021_cs[] = { 0x00, 0x00, 0x00, 0x00,
  716. 0x01, 0xff, 0xe0, 0x00 };
  717. static const struct drm_display_mode repaper_e2271cs021_mode = {
  718. TINYDRM_MODE(264, 176, 57, 38),
  719. };
  720. static const u8 repaper_e2271cs021_cs[] = { 0x00, 0x00, 0x00, 0x7f,
  721. 0xff, 0xfe, 0x00, 0x00 };
  722. DEFINE_DRM_GEM_CMA_FOPS(repaper_fops);
  723. static struct drm_driver repaper_driver = {
  724. .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
  725. DRIVER_ATOMIC,
  726. .fops = &repaper_fops,
  727. TINYDRM_GEM_DRIVER_OPS,
  728. .name = "repaper",
  729. .desc = "Pervasive Displays RePaper e-ink panels",
  730. .date = "20170405",
  731. .major = 1,
  732. .minor = 0,
  733. };
  734. static const struct of_device_id repaper_of_match[] = {
  735. { .compatible = "pervasive,e1144cs021", .data = (void *)E1144CS021 },
  736. { .compatible = "pervasive,e1190cs021", .data = (void *)E1190CS021 },
  737. { .compatible = "pervasive,e2200cs021", .data = (void *)E2200CS021 },
  738. { .compatible = "pervasive,e2271cs021", .data = (void *)E2271CS021 },
  739. {},
  740. };
  741. MODULE_DEVICE_TABLE(of, repaper_of_match);
  742. static const struct spi_device_id repaper_id[] = {
  743. { "e1144cs021", E1144CS021 },
  744. { "e1190cs021", E1190CS021 },
  745. { "e2200cs021", E2200CS021 },
  746. { "e2271cs021", E2271CS021 },
  747. { },
  748. };
  749. MODULE_DEVICE_TABLE(spi, repaper_id);
  750. static int repaper_probe(struct spi_device *spi)
  751. {
  752. const struct drm_display_mode *mode;
  753. const struct spi_device_id *spi_id;
  754. const struct of_device_id *match;
  755. struct device *dev = &spi->dev;
  756. struct tinydrm_device *tdev;
  757. enum repaper_model model;
  758. const char *thermal_zone;
  759. struct repaper_epd *epd;
  760. size_t line_buffer_size;
  761. int ret;
  762. match = of_match_device(repaper_of_match, dev);
  763. if (match) {
  764. model = (enum repaper_model)match->data;
  765. } else {
  766. spi_id = spi_get_device_id(spi);
  767. model = spi_id->driver_data;
  768. }
  769. /* The SPI device is used to allocate dma memory */
  770. if (!dev->coherent_dma_mask) {
  771. ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32));
  772. if (ret) {
  773. dev_warn(dev, "Failed to set dma mask %d\n", ret);
  774. return ret;
  775. }
  776. }
  777. epd = devm_kzalloc(dev, sizeof(*epd), GFP_KERNEL);
  778. if (!epd)
  779. return -ENOMEM;
  780. epd->spi = spi;
  781. epd->panel_on = devm_gpiod_get(dev, "panel-on", GPIOD_OUT_LOW);
  782. if (IS_ERR(epd->panel_on)) {
  783. ret = PTR_ERR(epd->panel_on);
  784. if (ret != -EPROBE_DEFER)
  785. dev_err(dev, "Failed to get gpio 'panel-on'\n");
  786. return ret;
  787. }
  788. epd->discharge = devm_gpiod_get(dev, "discharge", GPIOD_OUT_LOW);
  789. if (IS_ERR(epd->discharge)) {
  790. ret = PTR_ERR(epd->discharge);
  791. if (ret != -EPROBE_DEFER)
  792. dev_err(dev, "Failed to get gpio 'discharge'\n");
  793. return ret;
  794. }
  795. epd->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
  796. if (IS_ERR(epd->reset)) {
  797. ret = PTR_ERR(epd->reset);
  798. if (ret != -EPROBE_DEFER)
  799. dev_err(dev, "Failed to get gpio 'reset'\n");
  800. return ret;
  801. }
  802. epd->busy = devm_gpiod_get(dev, "busy", GPIOD_IN);
  803. if (IS_ERR(epd->busy)) {
  804. ret = PTR_ERR(epd->busy);
  805. if (ret != -EPROBE_DEFER)
  806. dev_err(dev, "Failed to get gpio 'busy'\n");
  807. return ret;
  808. }
  809. if (!device_property_read_string(dev, "pervasive,thermal-zone",
  810. &thermal_zone)) {
  811. epd->thermal = thermal_zone_get_zone_by_name(thermal_zone);
  812. if (IS_ERR(epd->thermal)) {
  813. dev_err(dev, "Failed to get thermal zone: %s\n",
  814. thermal_zone);
  815. return PTR_ERR(epd->thermal);
  816. }
  817. }
  818. switch (model) {
  819. case E1144CS021:
  820. mode = &repaper_e1144cs021_mode;
  821. epd->channel_select = repaper_e1144cs021_cs;
  822. epd->stage_time = 480;
  823. epd->bytes_per_scan = 96 / 4;
  824. epd->middle_scan = true; /* data-scan-data */
  825. epd->pre_border_byte = false;
  826. epd->border_byte = REPAPER_BORDER_BYTE_ZERO;
  827. break;
  828. case E1190CS021:
  829. mode = &repaper_e1190cs021_mode;
  830. epd->channel_select = repaper_e1190cs021_cs;
  831. epd->stage_time = 480;
  832. epd->bytes_per_scan = 128 / 4 / 2;
  833. epd->middle_scan = false; /* scan-data-scan */
  834. epd->pre_border_byte = false;
  835. epd->border_byte = REPAPER_BORDER_BYTE_SET;
  836. break;
  837. case E2200CS021:
  838. mode = &repaper_e2200cs021_mode;
  839. epd->channel_select = repaper_e2200cs021_cs;
  840. epd->stage_time = 480;
  841. epd->bytes_per_scan = 96 / 4;
  842. epd->middle_scan = true; /* data-scan-data */
  843. epd->pre_border_byte = true;
  844. epd->border_byte = REPAPER_BORDER_BYTE_NONE;
  845. break;
  846. case E2271CS021:
  847. epd->border = devm_gpiod_get(dev, "border", GPIOD_OUT_LOW);
  848. if (IS_ERR(epd->border)) {
  849. ret = PTR_ERR(epd->border);
  850. if (ret != -EPROBE_DEFER)
  851. dev_err(dev, "Failed to get gpio 'border'\n");
  852. return ret;
  853. }
  854. mode = &repaper_e2271cs021_mode;
  855. epd->channel_select = repaper_e2271cs021_cs;
  856. epd->stage_time = 630;
  857. epd->bytes_per_scan = 176 / 4;
  858. epd->middle_scan = true; /* data-scan-data */
  859. epd->pre_border_byte = true;
  860. epd->border_byte = REPAPER_BORDER_BYTE_NONE;
  861. break;
  862. default:
  863. return -ENODEV;
  864. }
  865. epd->width = mode->hdisplay;
  866. epd->height = mode->vdisplay;
  867. epd->factored_stage_time = epd->stage_time;
  868. line_buffer_size = 2 * epd->width / 8 + epd->bytes_per_scan + 2;
  869. epd->line_buffer = devm_kzalloc(dev, line_buffer_size, GFP_KERNEL);
  870. if (!epd->line_buffer)
  871. return -ENOMEM;
  872. epd->current_frame = devm_kzalloc(dev, epd->width * epd->height / 8,
  873. GFP_KERNEL);
  874. if (!epd->current_frame)
  875. return -ENOMEM;
  876. tdev = &epd->tinydrm;
  877. ret = devm_tinydrm_init(dev, tdev, &repaper_fb_funcs, &repaper_driver);
  878. if (ret)
  879. return ret;
  880. ret = tinydrm_display_pipe_init(tdev, &repaper_pipe_funcs,
  881. DRM_MODE_CONNECTOR_VIRTUAL,
  882. repaper_formats,
  883. ARRAY_SIZE(repaper_formats), mode, 0);
  884. if (ret)
  885. return ret;
  886. drm_mode_config_reset(tdev->drm);
  887. ret = devm_tinydrm_register(tdev);
  888. if (ret)
  889. return ret;
  890. spi_set_drvdata(spi, tdev);
  891. DRM_DEBUG_DRIVER("Initialized %s:%s @%uMHz on minor %d\n",
  892. tdev->drm->driver->name, dev_name(dev),
  893. spi->max_speed_hz / 1000000,
  894. tdev->drm->primary->index);
  895. return 0;
  896. }
  897. static void repaper_shutdown(struct spi_device *spi)
  898. {
  899. struct tinydrm_device *tdev = spi_get_drvdata(spi);
  900. tinydrm_shutdown(tdev);
  901. }
  902. static struct spi_driver repaper_spi_driver = {
  903. .driver = {
  904. .name = "repaper",
  905. .owner = THIS_MODULE,
  906. .of_match_table = repaper_of_match,
  907. },
  908. .id_table = repaper_id,
  909. .probe = repaper_probe,
  910. .shutdown = repaper_shutdown,
  911. };
  912. module_spi_driver(repaper_spi_driver);
  913. MODULE_DESCRIPTION("Pervasive Displays RePaper DRM driver");
  914. MODULE_AUTHOR("Noralf Trønnes");
  915. MODULE_LICENSE("GPL");