lontium-lt9211.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Lontium LT9211 bridge driver
  4. *
  5. * LT9211 is capable of converting:
  6. * 2xDSI/2xLVDS/1xDPI -> 2xDSI/2xLVDS/1xDPI
  7. * Currently supported is:
  8. * 1xDSI -> 1xLVDS
  9. *
  10. * Copyright (C) 2022 Marek Vasut <[email protected]>
  11. */
  12. #include <linux/bits.h>
  13. #include <linux/clk.h>
  14. #include <linux/gpio/consumer.h>
  15. #include <linux/i2c.h>
  16. #include <linux/media-bus-format.h>
  17. #include <linux/module.h>
  18. #include <linux/of_device.h>
  19. #include <linux/of_graph.h>
  20. #include <linux/regmap.h>
  21. #include <linux/regulator/consumer.h>
  22. #include <drm/drm_atomic_helper.h>
  23. #include <drm/drm_bridge.h>
  24. #include <drm/drm_mipi_dsi.h>
  25. #include <drm/drm_of.h>
  26. #include <drm/drm_panel.h>
  27. #include <drm/drm_print.h>
  28. #include <drm/drm_probe_helper.h>
  29. #define REG_PAGE_CONTROL 0xff
  30. #define REG_CHIPID0 0x8100
  31. #define REG_CHIPID0_VALUE 0x18
  32. #define REG_CHIPID1 0x8101
  33. #define REG_CHIPID1_VALUE 0x01
  34. #define REG_CHIPID2 0x8102
  35. #define REG_CHIPID2_VALUE 0xe3
  36. #define REG_DSI_LANE 0xd000
  37. /* DSI lane count - 0 means 4 lanes ; 1, 2, 3 means 1, 2, 3 lanes. */
  38. #define REG_DSI_LANE_COUNT(n) ((n) & 3)
  39. struct lt9211 {
  40. struct drm_bridge bridge;
  41. struct device *dev;
  42. struct regmap *regmap;
  43. struct mipi_dsi_device *dsi;
  44. struct drm_bridge *panel_bridge;
  45. struct gpio_desc *reset_gpio;
  46. struct regulator *vccio;
  47. bool lvds_dual_link;
  48. bool lvds_dual_link_even_odd_swap;
  49. };
  50. static const struct regmap_range lt9211_rw_ranges[] = {
  51. regmap_reg_range(0xff, 0xff),
  52. regmap_reg_range(0x8100, 0x816b),
  53. regmap_reg_range(0x8200, 0x82aa),
  54. regmap_reg_range(0x8500, 0x85ff),
  55. regmap_reg_range(0x8600, 0x86a0),
  56. regmap_reg_range(0x8700, 0x8746),
  57. regmap_reg_range(0xd000, 0xd0a7),
  58. regmap_reg_range(0xd400, 0xd42c),
  59. regmap_reg_range(0xd800, 0xd838),
  60. regmap_reg_range(0xd9c0, 0xd9d5),
  61. };
  62. static const struct regmap_access_table lt9211_rw_table = {
  63. .yes_ranges = lt9211_rw_ranges,
  64. .n_yes_ranges = ARRAY_SIZE(lt9211_rw_ranges),
  65. };
  66. static const struct regmap_range_cfg lt9211_range = {
  67. .name = "lt9211",
  68. .range_min = 0x0000,
  69. .range_max = 0xda00,
  70. .selector_reg = REG_PAGE_CONTROL,
  71. .selector_mask = 0xff,
  72. .selector_shift = 0,
  73. .window_start = 0,
  74. .window_len = 0x100,
  75. };
  76. static const struct regmap_config lt9211_regmap_config = {
  77. .reg_bits = 8,
  78. .val_bits = 8,
  79. .rd_table = &lt9211_rw_table,
  80. .wr_table = &lt9211_rw_table,
  81. .volatile_table = &lt9211_rw_table,
  82. .ranges = &lt9211_range,
  83. .num_ranges = 1,
  84. .cache_type = REGCACHE_RBTREE,
  85. .max_register = 0xda00,
  86. };
  87. static struct lt9211 *bridge_to_lt9211(struct drm_bridge *bridge)
  88. {
  89. return container_of(bridge, struct lt9211, bridge);
  90. }
  91. static int lt9211_attach(struct drm_bridge *bridge,
  92. enum drm_bridge_attach_flags flags)
  93. {
  94. struct lt9211 *ctx = bridge_to_lt9211(bridge);
  95. return drm_bridge_attach(bridge->encoder, ctx->panel_bridge,
  96. &ctx->bridge, flags);
  97. }
  98. static int lt9211_read_chipid(struct lt9211 *ctx)
  99. {
  100. u8 chipid[3];
  101. int ret;
  102. /* Read Chip ID registers and verify the chip can communicate. */
  103. ret = regmap_bulk_read(ctx->regmap, REG_CHIPID0, chipid, 3);
  104. if (ret < 0) {
  105. dev_err(ctx->dev, "Failed to read Chip ID: %d\n", ret);
  106. return ret;
  107. }
  108. /* Test for known Chip ID. */
  109. if (chipid[0] != REG_CHIPID0_VALUE || chipid[1] != REG_CHIPID1_VALUE ||
  110. chipid[2] != REG_CHIPID2_VALUE) {
  111. dev_err(ctx->dev, "Unknown Chip ID: 0x%02x 0x%02x 0x%02x\n",
  112. chipid[0], chipid[1], chipid[2]);
  113. return -EINVAL;
  114. }
  115. return 0;
  116. }
  117. static int lt9211_system_init(struct lt9211 *ctx)
  118. {
  119. const struct reg_sequence lt9211_system_init_seq[] = {
  120. { 0x8201, 0x18 },
  121. { 0x8606, 0x61 },
  122. { 0x8607, 0xa8 },
  123. { 0x8714, 0x08 },
  124. { 0x8715, 0x00 },
  125. { 0x8718, 0x0f },
  126. { 0x8722, 0x08 },
  127. { 0x8723, 0x00 },
  128. { 0x8726, 0x0f },
  129. { 0x810b, 0xfe },
  130. };
  131. return regmap_multi_reg_write(ctx->regmap, lt9211_system_init_seq,
  132. ARRAY_SIZE(lt9211_system_init_seq));
  133. }
  134. static int lt9211_configure_rx(struct lt9211 *ctx)
  135. {
  136. const struct reg_sequence lt9211_rx_phy_seq[] = {
  137. { 0x8202, 0x44 },
  138. { 0x8204, 0xa0 },
  139. { 0x8205, 0x22 },
  140. { 0x8207, 0x9f },
  141. { 0x8208, 0xfc },
  142. /* ORR with 0xf8 here to enable DSI DN/DP swap. */
  143. { 0x8209, 0x01 },
  144. { 0x8217, 0x0c },
  145. { 0x8633, 0x1b },
  146. };
  147. const struct reg_sequence lt9211_rx_cal_reset_seq[] = {
  148. { 0x8120, 0x7f },
  149. { 0x8120, 0xff },
  150. };
  151. const struct reg_sequence lt9211_rx_dig_seq[] = {
  152. { 0x8630, 0x85 },
  153. /* 0x8588: BIT 6 set = MIPI-RX, BIT 4 unset = LVDS-TX */
  154. { 0x8588, 0x40 },
  155. { 0x85ff, 0xd0 },
  156. { REG_DSI_LANE, REG_DSI_LANE_COUNT(ctx->dsi->lanes) },
  157. { 0xd002, 0x05 },
  158. };
  159. const struct reg_sequence lt9211_rx_div_reset_seq[] = {
  160. { 0x810a, 0xc0 },
  161. { 0x8120, 0xbf },
  162. };
  163. const struct reg_sequence lt9211_rx_div_clear_seq[] = {
  164. { 0x810a, 0xc1 },
  165. { 0x8120, 0xff },
  166. };
  167. int ret;
  168. ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_phy_seq,
  169. ARRAY_SIZE(lt9211_rx_phy_seq));
  170. if (ret)
  171. return ret;
  172. ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_cal_reset_seq,
  173. ARRAY_SIZE(lt9211_rx_cal_reset_seq));
  174. if (ret)
  175. return ret;
  176. ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_dig_seq,
  177. ARRAY_SIZE(lt9211_rx_dig_seq));
  178. if (ret)
  179. return ret;
  180. ret = regmap_multi_reg_write(ctx->regmap, lt9211_rx_div_reset_seq,
  181. ARRAY_SIZE(lt9211_rx_div_reset_seq));
  182. if (ret)
  183. return ret;
  184. usleep_range(10000, 15000);
  185. return regmap_multi_reg_write(ctx->regmap, lt9211_rx_div_clear_seq,
  186. ARRAY_SIZE(lt9211_rx_div_clear_seq));
  187. }
  188. static int lt9211_autodetect_rx(struct lt9211 *ctx,
  189. const struct drm_display_mode *mode)
  190. {
  191. u16 width, height;
  192. u32 byteclk;
  193. u8 buf[5];
  194. u8 format;
  195. u8 bc[3];
  196. int ret;
  197. /* Measure ByteClock frequency. */
  198. ret = regmap_write(ctx->regmap, 0x8600, 0x01);
  199. if (ret)
  200. return ret;
  201. /* Give the chip time to lock onto RX stream. */
  202. msleep(100);
  203. /* Read the ByteClock frequency from the chip. */
  204. ret = regmap_bulk_read(ctx->regmap, 0x8608, bc, sizeof(bc));
  205. if (ret)
  206. return ret;
  207. /* RX ByteClock in kHz */
  208. byteclk = ((bc[0] & 0xf) << 16) | (bc[1] << 8) | bc[2];
  209. /* Width/Height/Format Auto-detection */
  210. ret = regmap_bulk_read(ctx->regmap, 0xd082, buf, sizeof(buf));
  211. if (ret)
  212. return ret;
  213. width = (buf[0] << 8) | buf[1];
  214. height = (buf[3] << 8) | buf[4];
  215. format = buf[2] & 0xf;
  216. if (format == 0x3) { /* YUV422 16bit */
  217. width /= 2;
  218. } else if (format == 0xa) { /* RGB888 24bit */
  219. width /= 3;
  220. } else {
  221. dev_err(ctx->dev, "Unsupported DSI pixel format 0x%01x\n",
  222. format);
  223. return -EINVAL;
  224. }
  225. if (width != mode->hdisplay) {
  226. dev_err(ctx->dev,
  227. "RX: Detected DSI width (%d) does not match mode hdisplay (%d)\n",
  228. width, mode->hdisplay);
  229. return -EINVAL;
  230. }
  231. if (height != mode->vdisplay) {
  232. dev_err(ctx->dev,
  233. "RX: Detected DSI height (%d) does not match mode vdisplay (%d)\n",
  234. height, mode->vdisplay);
  235. return -EINVAL;
  236. }
  237. dev_dbg(ctx->dev, "RX: %dx%d format=0x%01x byteclock=%d kHz\n",
  238. width, height, format, byteclk);
  239. return 0;
  240. }
  241. static int lt9211_configure_timing(struct lt9211 *ctx,
  242. const struct drm_display_mode *mode)
  243. {
  244. const struct reg_sequence lt9211_timing[] = {
  245. { 0xd00d, (mode->vtotal >> 8) & 0xff },
  246. { 0xd00e, mode->vtotal & 0xff },
  247. { 0xd00f, (mode->vdisplay >> 8) & 0xff },
  248. { 0xd010, mode->vdisplay & 0xff },
  249. { 0xd011, (mode->htotal >> 8) & 0xff },
  250. { 0xd012, mode->htotal & 0xff },
  251. { 0xd013, (mode->hdisplay >> 8) & 0xff },
  252. { 0xd014, mode->hdisplay & 0xff },
  253. { 0xd015, (mode->vsync_end - mode->vsync_start) & 0xff },
  254. { 0xd016, (mode->hsync_end - mode->hsync_start) & 0xff },
  255. { 0xd017, ((mode->vsync_start - mode->vdisplay) >> 8) & 0xff },
  256. { 0xd018, (mode->vsync_start - mode->vdisplay) & 0xff },
  257. { 0xd019, ((mode->hsync_start - mode->hdisplay) >> 8) & 0xff },
  258. { 0xd01a, (mode->hsync_start - mode->hdisplay) & 0xff },
  259. };
  260. return regmap_multi_reg_write(ctx->regmap, lt9211_timing,
  261. ARRAY_SIZE(lt9211_timing));
  262. }
  263. static int lt9211_configure_plls(struct lt9211 *ctx,
  264. const struct drm_display_mode *mode)
  265. {
  266. const struct reg_sequence lt9211_pcr_seq[] = {
  267. { 0xd026, 0x17 },
  268. { 0xd027, 0xc3 },
  269. { 0xd02d, 0x30 },
  270. { 0xd031, 0x10 },
  271. { 0xd023, 0x20 },
  272. { 0xd038, 0x02 },
  273. { 0xd039, 0x10 },
  274. { 0xd03a, 0x20 },
  275. { 0xd03b, 0x60 },
  276. { 0xd03f, 0x04 },
  277. { 0xd040, 0x08 },
  278. { 0xd041, 0x10 },
  279. { 0x810b, 0xee },
  280. { 0x810b, 0xfe },
  281. };
  282. unsigned int pval;
  283. int ret;
  284. /* DeSSC PLL reference clock is 25 MHz XTal. */
  285. ret = regmap_write(ctx->regmap, 0x822d, 0x48);
  286. if (ret)
  287. return ret;
  288. if (mode->clock < 44000) {
  289. ret = regmap_write(ctx->regmap, 0x8235, 0x83);
  290. } else if (mode->clock < 88000) {
  291. ret = regmap_write(ctx->regmap, 0x8235, 0x82);
  292. } else if (mode->clock < 176000) {
  293. ret = regmap_write(ctx->regmap, 0x8235, 0x81);
  294. } else {
  295. dev_err(ctx->dev,
  296. "Unsupported mode clock (%d kHz) above 176 MHz.\n",
  297. mode->clock);
  298. return -EINVAL;
  299. }
  300. if (ret)
  301. return ret;
  302. /* Wait for the DeSSC PLL to stabilize. */
  303. msleep(100);
  304. ret = regmap_multi_reg_write(ctx->regmap, lt9211_pcr_seq,
  305. ARRAY_SIZE(lt9211_pcr_seq));
  306. if (ret)
  307. return ret;
  308. /* PCR stability test takes seconds. */
  309. ret = regmap_read_poll_timeout(ctx->regmap, 0xd087, pval, pval & 0x8,
  310. 20000, 10000000);
  311. if (ret)
  312. dev_err(ctx->dev, "PCR unstable, ret=%i\n", ret);
  313. return ret;
  314. }
  315. static int lt9211_configure_tx(struct lt9211 *ctx, bool jeida,
  316. bool bpp24, bool de)
  317. {
  318. const struct reg_sequence system_lt9211_tx_phy_seq[] = {
  319. /* DPI output disable */
  320. { 0x8262, 0x00 },
  321. /* BIT(7) is LVDS dual-port */
  322. { 0x823b, 0x38 | (ctx->lvds_dual_link ? BIT(7) : 0) },
  323. { 0x823e, 0x92 },
  324. { 0x823f, 0x48 },
  325. { 0x8240, 0x31 },
  326. { 0x8243, 0x80 },
  327. { 0x8244, 0x00 },
  328. { 0x8245, 0x00 },
  329. { 0x8249, 0x00 },
  330. { 0x824a, 0x01 },
  331. { 0x824e, 0x00 },
  332. { 0x824f, 0x00 },
  333. { 0x8250, 0x00 },
  334. { 0x8253, 0x00 },
  335. { 0x8254, 0x01 },
  336. /* LVDS channel order, Odd:Even 0x10..A:B, 0x40..B:A */
  337. { 0x8646, ctx->lvds_dual_link_even_odd_swap ? 0x40 : 0x10 },
  338. { 0x8120, 0x7b },
  339. { 0x816b, 0xff },
  340. };
  341. const struct reg_sequence system_lt9211_tx_dig_seq[] = {
  342. { 0x8559, 0x40 | (jeida ? BIT(7) : 0) |
  343. (de ? BIT(5) : 0) | (bpp24 ? BIT(4) : 0) },
  344. { 0x855a, 0xaa },
  345. { 0x855b, 0xaa },
  346. { 0x855c, ctx->lvds_dual_link ? BIT(0) : 0 },
  347. { 0x85a1, 0x77 },
  348. { 0x8640, 0x40 },
  349. { 0x8641, 0x34 },
  350. { 0x8642, 0x10 },
  351. { 0x8643, 0x23 },
  352. { 0x8644, 0x41 },
  353. { 0x8645, 0x02 },
  354. };
  355. const struct reg_sequence system_lt9211_tx_pll_seq[] = {
  356. /* TX PLL power down */
  357. { 0x8236, 0x01 },
  358. { 0x8237, ctx->lvds_dual_link ? 0x2a : 0x29 },
  359. { 0x8238, 0x06 },
  360. { 0x8239, 0x30 },
  361. { 0x823a, 0x8e },
  362. { 0x8737, 0x14 },
  363. { 0x8713, 0x00 },
  364. { 0x8713, 0x80 },
  365. };
  366. unsigned int pval;
  367. int ret;
  368. ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_phy_seq,
  369. ARRAY_SIZE(system_lt9211_tx_phy_seq));
  370. if (ret)
  371. return ret;
  372. ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_dig_seq,
  373. ARRAY_SIZE(system_lt9211_tx_dig_seq));
  374. if (ret)
  375. return ret;
  376. ret = regmap_multi_reg_write(ctx->regmap, system_lt9211_tx_pll_seq,
  377. ARRAY_SIZE(system_lt9211_tx_pll_seq));
  378. if (ret)
  379. return ret;
  380. ret = regmap_read_poll_timeout(ctx->regmap, 0x871f, pval, pval & 0x80,
  381. 10000, 1000000);
  382. if (ret) {
  383. dev_err(ctx->dev, "TX PLL unstable, ret=%i\n", ret);
  384. return ret;
  385. }
  386. ret = regmap_read_poll_timeout(ctx->regmap, 0x8720, pval, pval & 0x80,
  387. 10000, 1000000);
  388. if (ret) {
  389. dev_err(ctx->dev, "TX PLL unstable, ret=%i\n", ret);
  390. return ret;
  391. }
  392. return 0;
  393. }
  394. static void lt9211_atomic_enable(struct drm_bridge *bridge,
  395. struct drm_bridge_state *old_bridge_state)
  396. {
  397. struct lt9211 *ctx = bridge_to_lt9211(bridge);
  398. struct drm_atomic_state *state = old_bridge_state->base.state;
  399. const struct drm_bridge_state *bridge_state;
  400. const struct drm_crtc_state *crtc_state;
  401. const struct drm_display_mode *mode;
  402. struct drm_connector *connector;
  403. struct drm_crtc *crtc;
  404. bool lvds_format_24bpp;
  405. bool lvds_format_jeida;
  406. u32 bus_flags;
  407. int ret;
  408. ret = regulator_enable(ctx->vccio);
  409. if (ret) {
  410. dev_err(ctx->dev, "Failed to enable vccio: %d\n", ret);
  411. return;
  412. }
  413. /* Deassert reset */
  414. gpiod_set_value(ctx->reset_gpio, 1);
  415. usleep_range(20000, 21000); /* Very long post-reset delay. */
  416. /* Get the LVDS format from the bridge state. */
  417. bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
  418. bus_flags = bridge_state->output_bus_cfg.flags;
  419. switch (bridge_state->output_bus_cfg.format) {
  420. case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
  421. lvds_format_24bpp = false;
  422. lvds_format_jeida = true;
  423. break;
  424. case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
  425. lvds_format_24bpp = true;
  426. lvds_format_jeida = true;
  427. break;
  428. case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
  429. lvds_format_24bpp = true;
  430. lvds_format_jeida = false;
  431. break;
  432. default:
  433. /*
  434. * Some bridges still don't set the correct
  435. * LVDS bus pixel format, use SPWG24 default
  436. * format until those are fixed.
  437. */
  438. lvds_format_24bpp = true;
  439. lvds_format_jeida = false;
  440. dev_warn(ctx->dev,
  441. "Unsupported LVDS bus format 0x%04x, please check output bridge driver. Falling back to SPWG24.\n",
  442. bridge_state->output_bus_cfg.format);
  443. break;
  444. }
  445. /*
  446. * Retrieve the CRTC adjusted mode. This requires a little dance to go
  447. * from the bridge to the encoder, to the connector and to the CRTC.
  448. */
  449. connector = drm_atomic_get_new_connector_for_encoder(state,
  450. bridge->encoder);
  451. crtc = drm_atomic_get_new_connector_state(state, connector)->crtc;
  452. crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
  453. mode = &crtc_state->adjusted_mode;
  454. ret = lt9211_read_chipid(ctx);
  455. if (ret)
  456. return;
  457. ret = lt9211_system_init(ctx);
  458. if (ret)
  459. return;
  460. ret = lt9211_configure_rx(ctx);
  461. if (ret)
  462. return;
  463. ret = lt9211_autodetect_rx(ctx, mode);
  464. if (ret)
  465. return;
  466. ret = lt9211_configure_timing(ctx, mode);
  467. if (ret)
  468. return;
  469. ret = lt9211_configure_plls(ctx, mode);
  470. if (ret)
  471. return;
  472. ret = lt9211_configure_tx(ctx, lvds_format_jeida, lvds_format_24bpp,
  473. bus_flags & DRM_BUS_FLAG_DE_HIGH);
  474. if (ret)
  475. return;
  476. dev_dbg(ctx->dev, "LT9211 enabled.\n");
  477. }
  478. static void lt9211_atomic_disable(struct drm_bridge *bridge,
  479. struct drm_bridge_state *old_bridge_state)
  480. {
  481. struct lt9211 *ctx = bridge_to_lt9211(bridge);
  482. int ret;
  483. /*
  484. * Put the chip in reset, pull nRST line low,
  485. * and assure lengthy 10ms reset low timing.
  486. */
  487. gpiod_set_value(ctx->reset_gpio, 0);
  488. usleep_range(10000, 11000); /* Very long reset duration. */
  489. ret = regulator_disable(ctx->vccio);
  490. if (ret)
  491. dev_err(ctx->dev, "Failed to disable vccio: %d\n", ret);
  492. regcache_mark_dirty(ctx->regmap);
  493. }
  494. static enum drm_mode_status
  495. lt9211_mode_valid(struct drm_bridge *bridge,
  496. const struct drm_display_info *info,
  497. const struct drm_display_mode *mode)
  498. {
  499. /* LVDS output clock range 25..176 MHz */
  500. if (mode->clock < 25000)
  501. return MODE_CLOCK_LOW;
  502. if (mode->clock > 176000)
  503. return MODE_CLOCK_HIGH;
  504. return MODE_OK;
  505. }
  506. #define MAX_INPUT_SEL_FORMATS 1
  507. static u32 *
  508. lt9211_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
  509. struct drm_bridge_state *bridge_state,
  510. struct drm_crtc_state *crtc_state,
  511. struct drm_connector_state *conn_state,
  512. u32 output_fmt,
  513. unsigned int *num_input_fmts)
  514. {
  515. u32 *input_fmts;
  516. *num_input_fmts = 0;
  517. input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
  518. GFP_KERNEL);
  519. if (!input_fmts)
  520. return NULL;
  521. /* This is the DSI-end bus format */
  522. input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
  523. *num_input_fmts = 1;
  524. return input_fmts;
  525. }
  526. static const struct drm_bridge_funcs lt9211_funcs = {
  527. .attach = lt9211_attach,
  528. .mode_valid = lt9211_mode_valid,
  529. .atomic_enable = lt9211_atomic_enable,
  530. .atomic_disable = lt9211_atomic_disable,
  531. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  532. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  533. .atomic_get_input_bus_fmts = lt9211_atomic_get_input_bus_fmts,
  534. .atomic_reset = drm_atomic_helper_bridge_reset,
  535. };
  536. static int lt9211_parse_dt(struct lt9211 *ctx)
  537. {
  538. struct device_node *port2, *port3;
  539. struct drm_bridge *panel_bridge;
  540. struct device *dev = ctx->dev;
  541. struct drm_panel *panel;
  542. int dual_link;
  543. int ret;
  544. ctx->vccio = devm_regulator_get(dev, "vccio");
  545. if (IS_ERR(ctx->vccio))
  546. return dev_err_probe(dev, PTR_ERR(ctx->vccio),
  547. "Failed to get supply 'vccio'\n");
  548. ctx->lvds_dual_link = false;
  549. ctx->lvds_dual_link_even_odd_swap = false;
  550. port2 = of_graph_get_port_by_id(dev->of_node, 2);
  551. port3 = of_graph_get_port_by_id(dev->of_node, 3);
  552. dual_link = drm_of_lvds_get_dual_link_pixel_order(port2, port3);
  553. of_node_put(port2);
  554. of_node_put(port3);
  555. if (dual_link == DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS) {
  556. ctx->lvds_dual_link = true;
  557. /* Odd pixels to LVDS Channel A, even pixels to B */
  558. ctx->lvds_dual_link_even_odd_swap = false;
  559. } else if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS) {
  560. ctx->lvds_dual_link = true;
  561. /* Even pixels to LVDS Channel A, odd pixels to B */
  562. ctx->lvds_dual_link_even_odd_swap = true;
  563. }
  564. ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &panel, &panel_bridge);
  565. if (ret < 0)
  566. return ret;
  567. if (panel) {
  568. panel_bridge = devm_drm_panel_bridge_add(dev, panel);
  569. if (IS_ERR(panel_bridge))
  570. return PTR_ERR(panel_bridge);
  571. }
  572. ctx->panel_bridge = panel_bridge;
  573. return 0;
  574. }
  575. static int lt9211_host_attach(struct lt9211 *ctx)
  576. {
  577. const struct mipi_dsi_device_info info = {
  578. .type = "lt9211",
  579. .channel = 0,
  580. .node = NULL,
  581. };
  582. struct device *dev = ctx->dev;
  583. struct device_node *host_node;
  584. struct device_node *endpoint;
  585. struct mipi_dsi_device *dsi;
  586. struct mipi_dsi_host *host;
  587. int dsi_lanes;
  588. int ret;
  589. endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1);
  590. dsi_lanes = drm_of_get_data_lanes_count(endpoint, 1, 4);
  591. host_node = of_graph_get_remote_port_parent(endpoint);
  592. host = of_find_mipi_dsi_host_by_node(host_node);
  593. of_node_put(host_node);
  594. of_node_put(endpoint);
  595. if (!host)
  596. return -EPROBE_DEFER;
  597. if (dsi_lanes < 0)
  598. return dsi_lanes;
  599. dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
  600. if (IS_ERR(dsi))
  601. return dev_err_probe(dev, PTR_ERR(dsi),
  602. "failed to create dsi device\n");
  603. ctx->dsi = dsi;
  604. dsi->lanes = dsi_lanes;
  605. dsi->format = MIPI_DSI_FMT_RGB888;
  606. dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  607. MIPI_DSI_MODE_VIDEO_HSE;
  608. ret = devm_mipi_dsi_attach(dev, dsi);
  609. if (ret < 0) {
  610. dev_err(dev, "failed to attach dsi to host: %d\n", ret);
  611. return ret;
  612. }
  613. return 0;
  614. }
  615. static int lt9211_probe(struct i2c_client *client,
  616. const struct i2c_device_id *id)
  617. {
  618. struct device *dev = &client->dev;
  619. struct lt9211 *ctx;
  620. int ret;
  621. ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
  622. if (!ctx)
  623. return -ENOMEM;
  624. ctx->dev = dev;
  625. /*
  626. * Put the chip in reset, pull nRST line low,
  627. * and assure lengthy 10ms reset low timing.
  628. */
  629. ctx->reset_gpio = devm_gpiod_get_optional(ctx->dev, "reset",
  630. GPIOD_OUT_LOW);
  631. if (IS_ERR(ctx->reset_gpio))
  632. return PTR_ERR(ctx->reset_gpio);
  633. usleep_range(10000, 11000); /* Very long reset duration. */
  634. ret = lt9211_parse_dt(ctx);
  635. if (ret)
  636. return ret;
  637. ctx->regmap = devm_regmap_init_i2c(client, &lt9211_regmap_config);
  638. if (IS_ERR(ctx->regmap))
  639. return PTR_ERR(ctx->regmap);
  640. dev_set_drvdata(dev, ctx);
  641. i2c_set_clientdata(client, ctx);
  642. ctx->bridge.funcs = &lt9211_funcs;
  643. ctx->bridge.of_node = dev->of_node;
  644. drm_bridge_add(&ctx->bridge);
  645. ret = lt9211_host_attach(ctx);
  646. if (ret)
  647. drm_bridge_remove(&ctx->bridge);
  648. return ret;
  649. }
  650. static void lt9211_remove(struct i2c_client *client)
  651. {
  652. struct lt9211 *ctx = i2c_get_clientdata(client);
  653. drm_bridge_remove(&ctx->bridge);
  654. }
  655. static struct i2c_device_id lt9211_id[] = {
  656. { "lontium,lt9211" },
  657. {},
  658. };
  659. MODULE_DEVICE_TABLE(i2c, lt9211_id);
  660. static const struct of_device_id lt9211_match_table[] = {
  661. { .compatible = "lontium,lt9211" },
  662. {},
  663. };
  664. MODULE_DEVICE_TABLE(of, lt9211_match_table);
  665. static struct i2c_driver lt9211_driver = {
  666. .probe = lt9211_probe,
  667. .remove = lt9211_remove,
  668. .id_table = lt9211_id,
  669. .driver = {
  670. .name = "lt9211",
  671. .of_match_table = lt9211_match_table,
  672. },
  673. };
  674. module_i2c_driver(lt9211_driver);
  675. MODULE_AUTHOR("Marek Vasut <[email protected]>");
  676. MODULE_DESCRIPTION("Lontium LT9211 DSI/LVDS/DPI bridge driver");
  677. MODULE_LICENSE("GPL");