lcd_mipid.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * LCD driver for MIPI DBI-C / DCS compatible LCDs
  4. *
  5. * Copyright (C) 2006 Nokia Corporation
  6. * Author: Imre Deak <imre.deak@nokia.com>
  7. */
  8. #include <linux/device.h>
  9. #include <linux/delay.h>
  10. #include <linux/gpio/consumer.h>
  11. #include <linux/slab.h>
  12. #include <linux/workqueue.h>
  13. #include <linux/spi/spi.h>
  14. #include <linux/module.h>
  15. #include <linux/platform_data/lcd-mipid.h>
  16. #include "omapfb.h"
  17. #define MIPID_MODULE_NAME "lcd_mipid"
  18. #define MIPID_CMD_READ_DISP_ID 0x04
  19. #define MIPID_CMD_READ_RED 0x06
  20. #define MIPID_CMD_READ_GREEN 0x07
  21. #define MIPID_CMD_READ_BLUE 0x08
  22. #define MIPID_CMD_READ_DISP_STATUS 0x09
  23. #define MIPID_CMD_RDDSDR 0x0F
  24. #define MIPID_CMD_SLEEP_IN 0x10
  25. #define MIPID_CMD_SLEEP_OUT 0x11
  26. #define MIPID_CMD_DISP_OFF 0x28
  27. #define MIPID_CMD_DISP_ON 0x29
  28. #define MIPID_ESD_CHECK_PERIOD msecs_to_jiffies(5000)
  29. #define to_mipid_device(p) container_of(p, struct mipid_device, \
  30. panel)
  31. struct mipid_device {
  32. int enabled;
  33. int revision;
  34. unsigned int saved_bklight_level;
  35. unsigned long hw_guard_end; /* next value of jiffies
  36. when we can issue the
  37. next sleep in/out command */
  38. unsigned long hw_guard_wait; /* max guard time in jiffies */
  39. struct gpio_desc *reset;
  40. struct omapfb_device *fbdev;
  41. struct spi_device *spi;
  42. struct mutex mutex;
  43. struct lcd_panel panel;
  44. struct delayed_work esd_work;
  45. void (*esd_check)(struct mipid_device *m);
  46. };
  47. static void mipid_transfer(struct mipid_device *md, int cmd, const u8 *wbuf,
  48. int wlen, u8 *rbuf, int rlen)
  49. {
  50. struct spi_message m;
  51. struct spi_transfer *x, xfer[4];
  52. u16 w;
  53. int r;
  54. BUG_ON(md->spi == NULL);
  55. spi_message_init(&m);
  56. memset(xfer, 0, sizeof(xfer));
  57. x = &xfer[0];
  58. cmd &= 0xff;
  59. x->tx_buf = &cmd;
  60. x->bits_per_word = 9;
  61. x->len = 2;
  62. spi_message_add_tail(x, &m);
  63. if (wlen) {
  64. x++;
  65. x->tx_buf = wbuf;
  66. x->len = wlen;
  67. x->bits_per_word = 9;
  68. spi_message_add_tail(x, &m);
  69. }
  70. if (rlen) {
  71. x++;
  72. x->rx_buf = &w;
  73. x->len = 1;
  74. spi_message_add_tail(x, &m);
  75. if (rlen > 1) {
  76. /* Arrange for the extra clock before the first
  77. * data bit.
  78. */
  79. x->bits_per_word = 9;
  80. x->len = 2;
  81. x++;
  82. x->rx_buf = &rbuf[1];
  83. x->len = rlen - 1;
  84. spi_message_add_tail(x, &m);
  85. }
  86. }
  87. r = spi_sync(md->spi, &m);
  88. if (r < 0)
  89. dev_dbg(&md->spi->dev, "spi_sync %d\n", r);
  90. if (rlen)
  91. rbuf[0] = w & 0xff;
  92. }
  93. static inline void mipid_cmd(struct mipid_device *md, int cmd)
  94. {
  95. mipid_transfer(md, cmd, NULL, 0, NULL, 0);
  96. }
  97. static inline void mipid_write(struct mipid_device *md,
  98. int reg, const u8 *buf, int len)
  99. {
  100. mipid_transfer(md, reg, buf, len, NULL, 0);
  101. }
  102. static inline void mipid_read(struct mipid_device *md,
  103. int reg, u8 *buf, int len)
  104. {
  105. mipid_transfer(md, reg, NULL, 0, buf, len);
  106. }
  107. static void set_data_lines(struct mipid_device *md, int data_lines)
  108. {
  109. u16 par;
  110. switch (data_lines) {
  111. case 16:
  112. par = 0x150;
  113. break;
  114. case 18:
  115. par = 0x160;
  116. break;
  117. case 24:
  118. par = 0x170;
  119. break;
  120. }
  121. mipid_write(md, 0x3a, (u8 *)&par, 2);
  122. }
  123. static void send_init_string(struct mipid_device *md)
  124. {
  125. u16 initpar[] = { 0x0102, 0x0100, 0x0100 };
  126. mipid_write(md, 0xc2, (u8 *)initpar, sizeof(initpar));
  127. set_data_lines(md, md->panel.data_lines);
  128. }
  129. static void hw_guard_start(struct mipid_device *md, int guard_msec)
  130. {
  131. md->hw_guard_wait = msecs_to_jiffies(guard_msec);
  132. md->hw_guard_end = jiffies + md->hw_guard_wait;
  133. }
  134. static void hw_guard_wait(struct mipid_device *md)
  135. {
  136. unsigned long wait = md->hw_guard_end - jiffies;
  137. if ((long)wait > 0 && time_before_eq(wait, md->hw_guard_wait)) {
  138. set_current_state(TASK_UNINTERRUPTIBLE);
  139. schedule_timeout(wait);
  140. }
  141. }
  142. static void set_sleep_mode(struct mipid_device *md, int on)
  143. {
  144. int cmd, sleep_time = 50;
  145. if (on)
  146. cmd = MIPID_CMD_SLEEP_IN;
  147. else
  148. cmd = MIPID_CMD_SLEEP_OUT;
  149. hw_guard_wait(md);
  150. mipid_cmd(md, cmd);
  151. hw_guard_start(md, 120);
  152. /*
  153. * When we enable the panel, it seems we _have_ to sleep
  154. * 120 ms before sending the init string. When disabling the
  155. * panel we'll sleep for the duration of 2 frames, so that the
  156. * controller can still provide the PCLK,HS,VS signals.
  157. */
  158. if (!on)
  159. sleep_time = 120;
  160. msleep(sleep_time);
  161. }
  162. static void set_display_state(struct mipid_device *md, int enabled)
  163. {
  164. int cmd = enabled ? MIPID_CMD_DISP_ON : MIPID_CMD_DISP_OFF;
  165. mipid_cmd(md, cmd);
  166. }
  167. static int mipid_set_bklight_level(struct lcd_panel *panel, unsigned int level)
  168. {
  169. struct mipid_device *md = to_mipid_device(panel);
  170. struct mipid_platform_data *pd = md->spi->dev.platform_data;
  171. if (pd->get_bklight_max == NULL || pd->set_bklight_level == NULL)
  172. return -ENODEV;
  173. if (level > pd->get_bklight_max(pd))
  174. return -EINVAL;
  175. if (!md->enabled) {
  176. md->saved_bklight_level = level;
  177. return 0;
  178. }
  179. pd->set_bklight_level(pd, level);
  180. return 0;
  181. }
  182. static unsigned int mipid_get_bklight_level(struct lcd_panel *panel)
  183. {
  184. struct mipid_device *md = to_mipid_device(panel);
  185. struct mipid_platform_data *pd = md->spi->dev.platform_data;
  186. if (pd->get_bklight_level == NULL)
  187. return -ENODEV;
  188. return pd->get_bklight_level(pd);
  189. }
  190. static unsigned int mipid_get_bklight_max(struct lcd_panel *panel)
  191. {
  192. struct mipid_device *md = to_mipid_device(panel);
  193. struct mipid_platform_data *pd = md->spi->dev.platform_data;
  194. if (pd->get_bklight_max == NULL)
  195. return -ENODEV;
  196. return pd->get_bklight_max(pd);
  197. }
  198. static unsigned long mipid_get_caps(struct lcd_panel *panel)
  199. {
  200. return OMAPFB_CAPS_SET_BACKLIGHT;
  201. }
  202. static u16 read_first_pixel(struct mipid_device *md)
  203. {
  204. u16 pixel;
  205. u8 red, green, blue;
  206. mutex_lock(&md->mutex);
  207. mipid_read(md, MIPID_CMD_READ_RED, &red, 1);
  208. mipid_read(md, MIPID_CMD_READ_GREEN, &green, 1);
  209. mipid_read(md, MIPID_CMD_READ_BLUE, &blue, 1);
  210. mutex_unlock(&md->mutex);
  211. switch (md->panel.data_lines) {
  212. case 16:
  213. pixel = ((red >> 1) << 11) | (green << 5) | (blue >> 1);
  214. break;
  215. case 24:
  216. /* 24 bit -> 16 bit */
  217. pixel = ((red >> 3) << 11) | ((green >> 2) << 5) |
  218. (blue >> 3);
  219. break;
  220. default:
  221. pixel = 0;
  222. BUG();
  223. }
  224. return pixel;
  225. }
  226. static int mipid_run_test(struct lcd_panel *panel, int test_num)
  227. {
  228. struct mipid_device *md = to_mipid_device(panel);
  229. static const u16 test_values[4] = {
  230. 0x0000, 0xffff, 0xaaaa, 0x5555,
  231. };
  232. int i;
  233. if (test_num != MIPID_TEST_RGB_LINES)
  234. return MIPID_TEST_INVALID;
  235. for (i = 0; i < ARRAY_SIZE(test_values); i++) {
  236. int delay;
  237. unsigned long tmo;
  238. omapfb_write_first_pixel(md->fbdev, test_values[i]);
  239. tmo = jiffies + msecs_to_jiffies(100);
  240. delay = 25;
  241. while (1) {
  242. u16 pixel;
  243. msleep(delay);
  244. pixel = read_first_pixel(md);
  245. if (pixel == test_values[i])
  246. break;
  247. if (time_after(jiffies, tmo)) {
  248. dev_err(&md->spi->dev,
  249. "MIPI LCD RGB I/F test failed: "
  250. "expecting %04x, got %04x\n",
  251. test_values[i], pixel);
  252. return MIPID_TEST_FAILED;
  253. }
  254. delay = 10;
  255. }
  256. }
  257. return 0;
  258. }
  259. static void ls041y3_esd_recover(struct mipid_device *md)
  260. {
  261. dev_err(&md->spi->dev, "performing LCD ESD recovery\n");
  262. set_sleep_mode(md, 1);
  263. set_sleep_mode(md, 0);
  264. }
  265. static void ls041y3_esd_check_mode1(struct mipid_device *md)
  266. {
  267. u8 state1, state2;
  268. mipid_read(md, MIPID_CMD_RDDSDR, &state1, 1);
  269. set_sleep_mode(md, 0);
  270. mipid_read(md, MIPID_CMD_RDDSDR, &state2, 1);
  271. dev_dbg(&md->spi->dev, "ESD mode 1 state1 %02x state2 %02x\n",
  272. state1, state2);
  273. /* Each sleep out command will trigger a self diagnostic and flip
  274. * Bit6 if the test passes.
  275. */
  276. if (!((state1 ^ state2) & (1 << 6)))
  277. ls041y3_esd_recover(md);
  278. }
  279. static void ls041y3_esd_check_mode2(struct mipid_device *md)
  280. {
  281. int i;
  282. u8 rbuf[2];
  283. static const struct {
  284. int cmd;
  285. int wlen;
  286. u16 wbuf[3];
  287. } *rd, rd_ctrl[7] = {
  288. { 0xb0, 4, { 0x0101, 0x01fe, } },
  289. { 0xb1, 4, { 0x01de, 0x0121, } },
  290. { 0xc2, 4, { 0x0100, 0x0100, } },
  291. { 0xbd, 2, { 0x0100, } },
  292. { 0xc2, 4, { 0x01fc, 0x0103, } },
  293. { 0xb4, 0, },
  294. { 0x00, 0, },
  295. };
  296. rd = rd_ctrl;
  297. for (i = 0; i < 3; i++, rd++)
  298. mipid_write(md, rd->cmd, (u8 *)rd->wbuf, rd->wlen);
  299. udelay(10);
  300. mipid_read(md, rd->cmd, rbuf, 2);
  301. rd++;
  302. for (i = 0; i < 3; i++, rd++) {
  303. udelay(10);
  304. mipid_write(md, rd->cmd, (u8 *)rd->wbuf, rd->wlen);
  305. }
  306. dev_dbg(&md->spi->dev, "ESD mode 2 state %02x\n", rbuf[1]);
  307. if (rbuf[1] == 0x00)
  308. ls041y3_esd_recover(md);
  309. }
  310. static void ls041y3_esd_check(struct mipid_device *md)
  311. {
  312. ls041y3_esd_check_mode1(md);
  313. if (md->revision >= 0x88)
  314. ls041y3_esd_check_mode2(md);
  315. }
  316. static void mipid_esd_start_check(struct mipid_device *md)
  317. {
  318. if (md->esd_check != NULL)
  319. schedule_delayed_work(&md->esd_work,
  320. MIPID_ESD_CHECK_PERIOD);
  321. }
  322. static void mipid_esd_stop_check(struct mipid_device *md)
  323. {
  324. if (md->esd_check != NULL)
  325. cancel_delayed_work_sync(&md->esd_work);
  326. }
  327. static void mipid_esd_work(struct work_struct *work)
  328. {
  329. struct mipid_device *md = container_of(work, struct mipid_device,
  330. esd_work.work);
  331. mutex_lock(&md->mutex);
  332. md->esd_check(md);
  333. mutex_unlock(&md->mutex);
  334. mipid_esd_start_check(md);
  335. }
  336. static int mipid_enable(struct lcd_panel *panel)
  337. {
  338. struct mipid_device *md = to_mipid_device(panel);
  339. mutex_lock(&md->mutex);
  340. if (md->enabled) {
  341. mutex_unlock(&md->mutex);
  342. return 0;
  343. }
  344. set_sleep_mode(md, 0);
  345. md->enabled = 1;
  346. send_init_string(md);
  347. set_display_state(md, 1);
  348. mipid_set_bklight_level(panel, md->saved_bklight_level);
  349. mipid_esd_start_check(md);
  350. mutex_unlock(&md->mutex);
  351. return 0;
  352. }
  353. static void mipid_disable(struct lcd_panel *panel)
  354. {
  355. struct mipid_device *md = to_mipid_device(panel);
  356. /*
  357. * A final ESD work might be called before returning,
  358. * so do this without holding the lock.
  359. */
  360. mipid_esd_stop_check(md);
  361. mutex_lock(&md->mutex);
  362. if (!md->enabled) {
  363. mutex_unlock(&md->mutex);
  364. return;
  365. }
  366. md->saved_bklight_level = mipid_get_bklight_level(panel);
  367. mipid_set_bklight_level(panel, 0);
  368. set_display_state(md, 0);
  369. set_sleep_mode(md, 1);
  370. md->enabled = 0;
  371. mutex_unlock(&md->mutex);
  372. }
  373. static int panel_enabled(struct mipid_device *md)
  374. {
  375. u32 disp_status;
  376. int enabled;
  377. mipid_read(md, MIPID_CMD_READ_DISP_STATUS, (u8 *)&disp_status, 4);
  378. disp_status = __be32_to_cpu(disp_status);
  379. enabled = (disp_status & (1 << 17)) && (disp_status & (1 << 10));
  380. dev_dbg(&md->spi->dev,
  381. "LCD panel %senabled by bootloader (status 0x%04x)\n",
  382. enabled ? "" : "not ", disp_status);
  383. return enabled;
  384. }
  385. static int mipid_init(struct lcd_panel *panel,
  386. struct omapfb_device *fbdev)
  387. {
  388. struct mipid_device *md = to_mipid_device(panel);
  389. md->fbdev = fbdev;
  390. INIT_DELAYED_WORK(&md->esd_work, mipid_esd_work);
  391. mutex_init(&md->mutex);
  392. md->enabled = panel_enabled(md);
  393. if (md->enabled)
  394. mipid_esd_start_check(md);
  395. else
  396. md->saved_bklight_level = mipid_get_bklight_level(panel);
  397. return 0;
  398. }
  399. static void mipid_cleanup(struct lcd_panel *panel)
  400. {
  401. struct mipid_device *md = to_mipid_device(panel);
  402. if (md->enabled)
  403. mipid_esd_stop_check(md);
  404. }
  405. static const struct lcd_panel mipid_panel = {
  406. .config = OMAP_LCDC_PANEL_TFT,
  407. .bpp = 16,
  408. .x_res = 800,
  409. .y_res = 480,
  410. .pixel_clock = 21940,
  411. .hsw = 50,
  412. .hfp = 20,
  413. .hbp = 15,
  414. .vsw = 2,
  415. .vfp = 1,
  416. .vbp = 3,
  417. .init = mipid_init,
  418. .cleanup = mipid_cleanup,
  419. .enable = mipid_enable,
  420. .disable = mipid_disable,
  421. .get_caps = mipid_get_caps,
  422. .set_bklight_level = mipid_set_bklight_level,
  423. .get_bklight_level = mipid_get_bklight_level,
  424. .get_bklight_max = mipid_get_bklight_max,
  425. .run_test = mipid_run_test,
  426. };
  427. static int mipid_detect(struct mipid_device *md)
  428. {
  429. struct mipid_platform_data *pdata;
  430. u8 display_id[3];
  431. pdata = md->spi->dev.platform_data;
  432. if (pdata == NULL) {
  433. dev_err(&md->spi->dev, "missing platform data\n");
  434. return -ENOENT;
  435. }
  436. mipid_read(md, MIPID_CMD_READ_DISP_ID, display_id, 3);
  437. dev_dbg(&md->spi->dev, "MIPI display ID: %02x%02x%02x\n",
  438. display_id[0], display_id[1], display_id[2]);
  439. switch (display_id[0]) {
  440. case 0x45:
  441. md->panel.name = "lph8923";
  442. break;
  443. case 0x83:
  444. md->panel.name = "ls041y3";
  445. md->esd_check = ls041y3_esd_check;
  446. break;
  447. default:
  448. md->panel.name = "unknown";
  449. dev_err(&md->spi->dev, "invalid display ID\n");
  450. return -ENODEV;
  451. }
  452. md->revision = display_id[1];
  453. md->panel.data_lines = pdata->data_lines;
  454. pr_info("omapfb: %s rev %02x LCD detected, %d data lines\n",
  455. md->panel.name, md->revision, md->panel.data_lines);
  456. return 0;
  457. }
  458. static int mipid_spi_probe(struct spi_device *spi)
  459. {
  460. struct mipid_device *md;
  461. int r;
  462. md = kzalloc_obj(*md);
  463. if (md == NULL) {
  464. dev_err(&spi->dev, "out of memory\n");
  465. return -ENOMEM;
  466. }
  467. /* This will de-assert RESET if active */
  468. md->reset = gpiod_get(&spi->dev, "reset", GPIOD_OUT_LOW);
  469. if (IS_ERR(md->reset))
  470. return dev_err_probe(&spi->dev, PTR_ERR(md->reset),
  471. "no reset GPIO line\n");
  472. spi->mode = SPI_MODE_0;
  473. md->spi = spi;
  474. dev_set_drvdata(&spi->dev, md);
  475. md->panel = mipid_panel;
  476. r = mipid_detect(md);
  477. if (r < 0)
  478. goto free_md;
  479. omapfb_register_panel(&md->panel);
  480. return 0;
  481. free_md:
  482. kfree(md);
  483. return r;
  484. }
  485. static void mipid_spi_remove(struct spi_device *spi)
  486. {
  487. struct mipid_device *md = dev_get_drvdata(&spi->dev);
  488. /* Asserts RESET */
  489. gpiod_set_value(md->reset, 1);
  490. mipid_disable(&md->panel);
  491. kfree(md);
  492. }
  493. static struct spi_driver mipid_spi_driver = {
  494. .driver = {
  495. .name = MIPID_MODULE_NAME,
  496. },
  497. .probe = mipid_spi_probe,
  498. .remove = mipid_spi_remove,
  499. };
  500. module_spi_driver(mipid_spi_driver);
  501. MODULE_DESCRIPTION("MIPI display driver");
  502. MODULE_LICENSE("GPL");