lontium-lt9611.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2018, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2019-2020. Linaro Limited.
  5. */
  6. #include <linux/gpio/consumer.h>
  7. #include <linux/i2c.h>
  8. #include <linux/interrupt.h>
  9. #include <linux/media-bus-format.h>
  10. #include <linux/module.h>
  11. #include <linux/of_graph.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/regmap.h>
  14. #include <linux/regulator/consumer.h>
  15. #include <sound/hdmi-codec.h>
  16. #include <drm/drm_atomic_helper.h>
  17. #include <drm/drm_bridge.h>
  18. #include <drm/drm_mipi_dsi.h>
  19. #include <drm/drm_print.h>
  20. #include <drm/drm_probe_helper.h>
  21. #define EDID_SEG_SIZE 256
  22. #define EDID_LEN 32
  23. #define EDID_LOOP 8
  24. #define KEY_DDC_ACCS_DONE 0x02
  25. #define DDC_NO_ACK 0x50
  26. #define LT9611_4LANES 0
  27. struct lt9611 {
  28. struct device *dev;
  29. struct drm_bridge bridge;
  30. struct drm_connector connector;
  31. struct regmap *regmap;
  32. struct device_node *dsi0_node;
  33. struct device_node *dsi1_node;
  34. struct mipi_dsi_device *dsi0;
  35. struct mipi_dsi_device *dsi1;
  36. struct platform_device *audio_pdev;
  37. bool ac_mode;
  38. struct gpio_desc *reset_gpio;
  39. struct gpio_desc *enable_gpio;
  40. bool power_on;
  41. bool sleep;
  42. struct regulator_bulk_data supplies[2];
  43. struct i2c_client *client;
  44. enum drm_connector_status status;
  45. u8 edid_buf[EDID_SEG_SIZE];
  46. u32 vic;
  47. };
  48. #define LT9611_PAGE_CONTROL 0xff
  49. static const struct regmap_range_cfg lt9611_ranges[] = {
  50. {
  51. .name = "register_range",
  52. .range_min = 0,
  53. .range_max = 0x85ff,
  54. .selector_reg = LT9611_PAGE_CONTROL,
  55. .selector_mask = 0xff,
  56. .selector_shift = 0,
  57. .window_start = 0,
  58. .window_len = 0x100,
  59. },
  60. };
  61. static const struct regmap_config lt9611_regmap_config = {
  62. .reg_bits = 8,
  63. .val_bits = 8,
  64. .max_register = 0xffff,
  65. .ranges = lt9611_ranges,
  66. .num_ranges = ARRAY_SIZE(lt9611_ranges),
  67. };
  68. struct lt9611_mode {
  69. u16 hdisplay;
  70. u16 vdisplay;
  71. u8 vrefresh;
  72. u8 lanes;
  73. u8 intfs;
  74. };
  75. static struct lt9611_mode lt9611_modes[] = {
  76. { 3840, 2160, 30, 4, 2 }, /* 3840x2160 24bit 30Hz 4Lane 2ports */
  77. { 1920, 1080, 60, 4, 1 }, /* 1080P 24bit 60Hz 4lane 1port */
  78. { 1920, 1080, 30, 3, 1 }, /* 1080P 24bit 30Hz 3lane 1port */
  79. { 1920, 1080, 24, 3, 1 },
  80. { 720, 480, 60, 4, 1 },
  81. { 720, 576, 50, 2, 1 },
  82. { 640, 480, 60, 2, 1 },
  83. };
  84. static struct lt9611 *bridge_to_lt9611(struct drm_bridge *bridge)
  85. {
  86. return container_of(bridge, struct lt9611, bridge);
  87. }
  88. static struct lt9611 *connector_to_lt9611(struct drm_connector *connector)
  89. {
  90. return container_of(connector, struct lt9611, connector);
  91. }
  92. static int lt9611_mipi_input_analog(struct lt9611 *lt9611)
  93. {
  94. const struct reg_sequence reg_cfg[] = {
  95. { 0x8106, 0x40 }, /* port A rx current */
  96. { 0x810a, 0xfe }, /* port A ldo voltage set */
  97. { 0x810b, 0xbf }, /* enable port A lprx */
  98. { 0x8111, 0x40 }, /* port B rx current */
  99. { 0x8115, 0xfe }, /* port B ldo voltage set */
  100. { 0x8116, 0xbf }, /* enable port B lprx */
  101. { 0x811c, 0x03 }, /* PortA clk lane no-LP mode */
  102. { 0x8120, 0x03 }, /* PortB clk lane with-LP mode */
  103. };
  104. return regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
  105. }
  106. static int lt9611_mipi_input_digital(struct lt9611 *lt9611,
  107. const struct drm_display_mode *mode)
  108. {
  109. struct reg_sequence reg_cfg[] = {
  110. { 0x8300, LT9611_4LANES },
  111. { 0x830a, 0x00 },
  112. { 0x824f, 0x80 },
  113. { 0x8250, 0x10 },
  114. { 0x8302, 0x0a },
  115. { 0x8306, 0x0a },
  116. };
  117. if (mode->hdisplay == 3840)
  118. reg_cfg[1].def = 0x03;
  119. return regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
  120. }
  121. static void lt9611_mipi_video_setup(struct lt9611 *lt9611,
  122. const struct drm_display_mode *mode)
  123. {
  124. u32 h_total, hactive, hsync_len, hfront_porch, hsync_porch;
  125. u32 v_total, vactive, vsync_len, vfront_porch, vsync_porch;
  126. h_total = mode->htotal;
  127. v_total = mode->vtotal;
  128. hactive = mode->hdisplay;
  129. hsync_len = mode->hsync_end - mode->hsync_start;
  130. hfront_porch = mode->hsync_start - mode->hdisplay;
  131. hsync_porch = hsync_len + mode->htotal - mode->hsync_end;
  132. vactive = mode->vdisplay;
  133. vsync_len = mode->vsync_end - mode->vsync_start;
  134. vfront_porch = mode->vsync_start - mode->vdisplay;
  135. vsync_porch = vsync_len + mode->vtotal - mode->vsync_end;
  136. regmap_write(lt9611->regmap, 0x830d, (u8)(v_total / 256));
  137. regmap_write(lt9611->regmap, 0x830e, (u8)(v_total % 256));
  138. regmap_write(lt9611->regmap, 0x830f, (u8)(vactive / 256));
  139. regmap_write(lt9611->regmap, 0x8310, (u8)(vactive % 256));
  140. regmap_write(lt9611->regmap, 0x8311, (u8)(h_total / 256));
  141. regmap_write(lt9611->regmap, 0x8312, (u8)(h_total % 256));
  142. regmap_write(lt9611->regmap, 0x8313, (u8)(hactive / 256));
  143. regmap_write(lt9611->regmap, 0x8314, (u8)(hactive % 256));
  144. regmap_write(lt9611->regmap, 0x8315, (u8)(vsync_len % 256));
  145. regmap_write(lt9611->regmap, 0x8316, (u8)(hsync_len % 256));
  146. regmap_write(lt9611->regmap, 0x8317, (u8)(vfront_porch % 256));
  147. regmap_write(lt9611->regmap, 0x8318, (u8)(vsync_porch % 256));
  148. regmap_write(lt9611->regmap, 0x8319, (u8)(hfront_porch % 256));
  149. regmap_write(lt9611->regmap, 0x831a, (u8)(hsync_porch / 256) |
  150. ((hfront_porch / 256) << 4));
  151. regmap_write(lt9611->regmap, 0x831b, (u8)(hsync_porch % 256));
  152. }
  153. static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int postdiv)
  154. {
  155. unsigned int pcr_m = mode->clock * 5 * postdiv / 27000;
  156. const struct reg_sequence reg_cfg[] = {
  157. { 0x830b, 0x01 },
  158. { 0x830c, 0x10 },
  159. { 0x8348, 0x00 },
  160. { 0x8349, 0x81 },
  161. /* stage 1 */
  162. { 0x8321, 0x4a },
  163. { 0x8324, 0x71 },
  164. { 0x8325, 0x30 },
  165. { 0x832a, 0x01 },
  166. /* stage 2 */
  167. { 0x834a, 0x40 },
  168. /* MK limit */
  169. { 0x832d, 0x38 },
  170. { 0x8331, 0x08 },
  171. };
  172. const struct reg_sequence reg_cfg2[] = {
  173. { 0x830b, 0x03 },
  174. { 0x830c, 0xd0 },
  175. { 0x8348, 0x03 },
  176. { 0x8349, 0xe0 },
  177. { 0x8324, 0x72 },
  178. { 0x8325, 0x00 },
  179. { 0x832a, 0x01 },
  180. { 0x834a, 0x10 },
  181. };
  182. u8 pol = 0x10;
  183. if (mode->flags & DRM_MODE_FLAG_NHSYNC)
  184. pol |= 0x2;
  185. if (mode->flags & DRM_MODE_FLAG_NVSYNC)
  186. pol |= 0x1;
  187. regmap_write(lt9611->regmap, 0x831d, pol);
  188. if (mode->hdisplay == 3840)
  189. regmap_multi_reg_write(lt9611->regmap, reg_cfg2, ARRAY_SIZE(reg_cfg2));
  190. else
  191. regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
  192. regmap_write(lt9611->regmap, 0x8326, pcr_m);
  193. /* pcr rst */
  194. regmap_write(lt9611->regmap, 0x8011, 0x5a);
  195. regmap_write(lt9611->regmap, 0x8011, 0xfa);
  196. }
  197. static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int *postdiv)
  198. {
  199. unsigned int pclk = mode->clock;
  200. const struct reg_sequence reg_cfg[] = {
  201. /* txpll init */
  202. { 0x8123, 0x40 },
  203. { 0x8124, 0x64 },
  204. { 0x8125, 0x80 },
  205. { 0x8126, 0x55 },
  206. { 0x812c, 0x37 },
  207. { 0x812f, 0x01 },
  208. { 0x8126, 0x55 },
  209. { 0x8127, 0x66 },
  210. { 0x8128, 0x88 },
  211. { 0x812a, 0x20 },
  212. };
  213. regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
  214. if (pclk > 150000) {
  215. regmap_write(lt9611->regmap, 0x812d, 0x88);
  216. *postdiv = 1;
  217. } else if (pclk > 70000) {
  218. regmap_write(lt9611->regmap, 0x812d, 0x99);
  219. *postdiv = 2;
  220. } else {
  221. regmap_write(lt9611->regmap, 0x812d, 0xaa);
  222. *postdiv = 4;
  223. }
  224. /*
  225. * first divide pclk by 2 first
  226. * - write divide by 64k to 19:16 bits which means shift by 17
  227. * - write divide by 256 to 15:8 bits which means shift by 9
  228. * - write remainder to 7:0 bits, which means shift by 1
  229. */
  230. regmap_write(lt9611->regmap, 0x82e3, pclk >> 17); /* pclk[19:16] */
  231. regmap_write(lt9611->regmap, 0x82e4, pclk >> 9); /* pclk[15:8] */
  232. regmap_write(lt9611->regmap, 0x82e5, pclk >> 1); /* pclk[7:0] */
  233. regmap_write(lt9611->regmap, 0x82de, 0x20);
  234. regmap_write(lt9611->regmap, 0x82de, 0xe0);
  235. regmap_write(lt9611->regmap, 0x8016, 0xf1);
  236. regmap_write(lt9611->regmap, 0x8016, 0xf3);
  237. return 0;
  238. }
  239. static int lt9611_read_video_check(struct lt9611 *lt9611, unsigned int reg)
  240. {
  241. unsigned int temp, temp2;
  242. int ret;
  243. ret = regmap_read(lt9611->regmap, reg, &temp);
  244. if (ret)
  245. return ret;
  246. temp <<= 8;
  247. ret = regmap_read(lt9611->regmap, reg + 1, &temp2);
  248. if (ret)
  249. return ret;
  250. return (temp + temp2);
  251. }
  252. static int lt9611_video_check(struct lt9611 *lt9611)
  253. {
  254. u32 v_total, vactive, hactive_a, hactive_b, h_total_sysclk;
  255. int temp;
  256. /* top module video check */
  257. /* vactive */
  258. temp = lt9611_read_video_check(lt9611, 0x8282);
  259. if (temp < 0)
  260. goto end;
  261. vactive = temp;
  262. /* v_total */
  263. temp = lt9611_read_video_check(lt9611, 0x826c);
  264. if (temp < 0)
  265. goto end;
  266. v_total = temp;
  267. /* h_total_sysclk */
  268. temp = lt9611_read_video_check(lt9611, 0x8286);
  269. if (temp < 0)
  270. goto end;
  271. h_total_sysclk = temp;
  272. /* hactive_a */
  273. temp = lt9611_read_video_check(lt9611, 0x8382);
  274. if (temp < 0)
  275. goto end;
  276. hactive_a = temp / 3;
  277. /* hactive_b */
  278. temp = lt9611_read_video_check(lt9611, 0x8386);
  279. if (temp < 0)
  280. goto end;
  281. hactive_b = temp / 3;
  282. dev_info(lt9611->dev,
  283. "video check: hactive_a=%d, hactive_b=%d, vactive=%d, v_total=%d, h_total_sysclk=%d\n",
  284. hactive_a, hactive_b, vactive, v_total, h_total_sysclk);
  285. return 0;
  286. end:
  287. dev_err(lt9611->dev, "read video check error\n");
  288. return temp;
  289. }
  290. static void lt9611_hdmi_tx_digital(struct lt9611 *lt9611)
  291. {
  292. regmap_write(lt9611->regmap, 0x8443, 0x46 - lt9611->vic);
  293. regmap_write(lt9611->regmap, 0x8447, lt9611->vic);
  294. regmap_write(lt9611->regmap, 0x843d, 0x0a); /* UD1 infoframe */
  295. regmap_write(lt9611->regmap, 0x82d6, 0x8c);
  296. regmap_write(lt9611->regmap, 0x82d7, 0x04);
  297. }
  298. static void lt9611_hdmi_tx_phy(struct lt9611 *lt9611)
  299. {
  300. struct reg_sequence reg_cfg[] = {
  301. { 0x8130, 0x6a },
  302. { 0x8131, 0x44 }, /* HDMI DC mode */
  303. { 0x8132, 0x4a },
  304. { 0x8133, 0x0b },
  305. { 0x8134, 0x00 },
  306. { 0x8135, 0x00 },
  307. { 0x8136, 0x00 },
  308. { 0x8137, 0x44 },
  309. { 0x813f, 0x0f },
  310. { 0x8140, 0xa0 },
  311. { 0x8141, 0xa0 },
  312. { 0x8142, 0xa0 },
  313. { 0x8143, 0xa0 },
  314. { 0x8144, 0x0a },
  315. };
  316. /* HDMI AC mode */
  317. if (lt9611->ac_mode)
  318. reg_cfg[2].def = 0x73;
  319. regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
  320. }
  321. static irqreturn_t lt9611_irq_thread_handler(int irq, void *dev_id)
  322. {
  323. struct lt9611 *lt9611 = dev_id;
  324. unsigned int irq_flag0 = 0;
  325. unsigned int irq_flag3 = 0;
  326. regmap_read(lt9611->regmap, 0x820f, &irq_flag3);
  327. regmap_read(lt9611->regmap, 0x820c, &irq_flag0);
  328. /* hpd changed low */
  329. if (irq_flag3 & 0x80) {
  330. dev_info(lt9611->dev, "hdmi cable disconnected\n");
  331. regmap_write(lt9611->regmap, 0x8207, 0xbf);
  332. regmap_write(lt9611->regmap, 0x8207, 0x3f);
  333. }
  334. /* hpd changed high */
  335. if (irq_flag3 & 0x40) {
  336. dev_info(lt9611->dev, "hdmi cable connected\n");
  337. regmap_write(lt9611->regmap, 0x8207, 0x7f);
  338. regmap_write(lt9611->regmap, 0x8207, 0x3f);
  339. }
  340. if (irq_flag3 & 0xc0 && lt9611->bridge.dev)
  341. drm_kms_helper_hotplug_event(lt9611->bridge.dev);
  342. /* video input changed */
  343. if (irq_flag0 & 0x01) {
  344. dev_info(lt9611->dev, "video input changed\n");
  345. regmap_write(lt9611->regmap, 0x829e, 0xff);
  346. regmap_write(lt9611->regmap, 0x829e, 0xf7);
  347. regmap_write(lt9611->regmap, 0x8204, 0xff);
  348. regmap_write(lt9611->regmap, 0x8204, 0xfe);
  349. }
  350. return IRQ_HANDLED;
  351. }
  352. static void lt9611_enable_hpd_interrupts(struct lt9611 *lt9611)
  353. {
  354. unsigned int val;
  355. regmap_read(lt9611->regmap, 0x8203, &val);
  356. val &= ~0xc0;
  357. regmap_write(lt9611->regmap, 0x8203, val);
  358. regmap_write(lt9611->regmap, 0x8207, 0xff); /* clear */
  359. regmap_write(lt9611->regmap, 0x8207, 0x3f);
  360. }
  361. static void lt9611_sleep_setup(struct lt9611 *lt9611)
  362. {
  363. const struct reg_sequence sleep_setup[] = {
  364. { 0x8024, 0x76 },
  365. { 0x8023, 0x01 },
  366. { 0x8157, 0x03 }, /* set addr pin as output */
  367. { 0x8149, 0x0b },
  368. { 0x8102, 0x48 }, /* MIPI Rx power down */
  369. { 0x8123, 0x80 },
  370. { 0x8130, 0x00 },
  371. { 0x8011, 0x0a },
  372. };
  373. regmap_multi_reg_write(lt9611->regmap,
  374. sleep_setup, ARRAY_SIZE(sleep_setup));
  375. lt9611->sleep = true;
  376. }
  377. static int lt9611_power_on(struct lt9611 *lt9611)
  378. {
  379. int ret;
  380. const struct reg_sequence seq[] = {
  381. /* LT9611_System_Init */
  382. { 0x8101, 0x18 }, /* sel xtal clock */
  383. /* timer for frequency meter */
  384. { 0x821b, 0x69 }, /* timer 2 */
  385. { 0x821c, 0x78 },
  386. { 0x82cb, 0x69 }, /* timer 1 */
  387. { 0x82cc, 0x78 },
  388. /* irq init */
  389. { 0x8251, 0x01 },
  390. { 0x8258, 0x0a }, /* hpd irq */
  391. { 0x8259, 0x80 }, /* hpd debounce width */
  392. { 0x829e, 0xf7 }, /* video check irq */
  393. /* power consumption for work */
  394. { 0x8004, 0xf0 },
  395. { 0x8006, 0xf0 },
  396. { 0x800a, 0x80 },
  397. { 0x800b, 0x40 },
  398. { 0x800d, 0xef },
  399. { 0x8011, 0xfa },
  400. };
  401. if (lt9611->power_on)
  402. return 0;
  403. ret = regmap_multi_reg_write(lt9611->regmap, seq, ARRAY_SIZE(seq));
  404. if (!ret)
  405. lt9611->power_on = true;
  406. return ret;
  407. }
  408. static int lt9611_power_off(struct lt9611 *lt9611)
  409. {
  410. int ret;
  411. ret = regmap_write(lt9611->regmap, 0x8130, 0x6a);
  412. if (!ret)
  413. lt9611->power_on = false;
  414. return ret;
  415. }
  416. static void lt9611_reset(struct lt9611 *lt9611)
  417. {
  418. gpiod_set_value_cansleep(lt9611->reset_gpio, 1);
  419. msleep(20);
  420. gpiod_set_value_cansleep(lt9611->reset_gpio, 0);
  421. msleep(20);
  422. gpiod_set_value_cansleep(lt9611->reset_gpio, 1);
  423. msleep(100);
  424. }
  425. static void lt9611_assert_5v(struct lt9611 *lt9611)
  426. {
  427. if (!lt9611->enable_gpio)
  428. return;
  429. gpiod_set_value_cansleep(lt9611->enable_gpio, 1);
  430. msleep(20);
  431. }
  432. static int lt9611_regulator_init(struct lt9611 *lt9611)
  433. {
  434. int ret;
  435. lt9611->supplies[0].supply = "vdd";
  436. lt9611->supplies[1].supply = "vcc";
  437. ret = devm_regulator_bulk_get(lt9611->dev, 2, lt9611->supplies);
  438. if (ret < 0)
  439. return ret;
  440. return regulator_set_load(lt9611->supplies[0].consumer, 300000);
  441. }
  442. static int lt9611_regulator_enable(struct lt9611 *lt9611)
  443. {
  444. int ret;
  445. ret = regulator_enable(lt9611->supplies[0].consumer);
  446. if (ret < 0)
  447. return ret;
  448. usleep_range(1000, 10000);
  449. ret = regulator_enable(lt9611->supplies[1].consumer);
  450. if (ret < 0) {
  451. regulator_disable(lt9611->supplies[0].consumer);
  452. return ret;
  453. }
  454. return 0;
  455. }
  456. static struct lt9611_mode *lt9611_find_mode(const struct drm_display_mode *mode)
  457. {
  458. int i;
  459. for (i = 0; i < ARRAY_SIZE(lt9611_modes); i++) {
  460. if (lt9611_modes[i].hdisplay == mode->hdisplay &&
  461. lt9611_modes[i].vdisplay == mode->vdisplay &&
  462. lt9611_modes[i].vrefresh == drm_mode_vrefresh(mode)) {
  463. return &lt9611_modes[i];
  464. }
  465. }
  466. return NULL;
  467. }
  468. /* connector funcs */
  469. static enum drm_connector_status __lt9611_detect(struct lt9611 *lt9611)
  470. {
  471. unsigned int reg_val = 0;
  472. int connected = 0;
  473. regmap_read(lt9611->regmap, 0x825e, &reg_val);
  474. connected = (reg_val & (BIT(2) | BIT(0)));
  475. lt9611->status = connected ? connector_status_connected :
  476. connector_status_disconnected;
  477. return lt9611->status;
  478. }
  479. static enum drm_connector_status
  480. lt9611_connector_detect(struct drm_connector *connector, bool force)
  481. {
  482. return __lt9611_detect(connector_to_lt9611(connector));
  483. }
  484. static int lt9611_read_edid(struct lt9611 *lt9611)
  485. {
  486. unsigned int temp;
  487. int ret = 0;
  488. int i, j;
  489. /* memset to clear old buffer, if any */
  490. memset(lt9611->edid_buf, 0, sizeof(lt9611->edid_buf));
  491. regmap_write(lt9611->regmap, 0x8503, 0xc9);
  492. /* 0xA0 is EDID device address */
  493. regmap_write(lt9611->regmap, 0x8504, 0xa0);
  494. /* 0x00 is EDID offset address */
  495. regmap_write(lt9611->regmap, 0x8505, 0x00);
  496. /* length for read */
  497. regmap_write(lt9611->regmap, 0x8506, EDID_LEN);
  498. regmap_write(lt9611->regmap, 0x8514, 0x7f);
  499. for (i = 0; i < EDID_LOOP; i++) {
  500. /* offset address */
  501. regmap_write(lt9611->regmap, 0x8505, i * EDID_LEN);
  502. regmap_write(lt9611->regmap, 0x8507, 0x36);
  503. regmap_write(lt9611->regmap, 0x8507, 0x31);
  504. regmap_write(lt9611->regmap, 0x8507, 0x37);
  505. usleep_range(5000, 10000);
  506. regmap_read(lt9611->regmap, 0x8540, &temp);
  507. if (temp & KEY_DDC_ACCS_DONE) {
  508. for (j = 0; j < EDID_LEN; j++) {
  509. regmap_read(lt9611->regmap, 0x8583, &temp);
  510. lt9611->edid_buf[i * EDID_LEN + j] = temp;
  511. }
  512. } else if (temp & DDC_NO_ACK) { /* DDC No Ack or Abitration lost */
  513. dev_err(lt9611->dev, "read edid failed: no ack\n");
  514. ret = -EIO;
  515. goto end;
  516. } else {
  517. dev_err(lt9611->dev, "read edid failed: access not done\n");
  518. ret = -EIO;
  519. goto end;
  520. }
  521. }
  522. end:
  523. regmap_write(lt9611->regmap, 0x8507, 0x1f);
  524. return ret;
  525. }
  526. static int
  527. lt9611_get_edid_block(void *data, u8 *buf, unsigned int block, size_t len)
  528. {
  529. struct lt9611 *lt9611 = data;
  530. int ret;
  531. if (len > 128)
  532. return -EINVAL;
  533. /* supports up to 1 extension block */
  534. /* TODO: add support for more extension blocks */
  535. if (block > 1)
  536. return -EINVAL;
  537. if (block == 0) {
  538. ret = lt9611_read_edid(lt9611);
  539. if (ret) {
  540. dev_err(lt9611->dev, "edid read failed\n");
  541. return ret;
  542. }
  543. }
  544. block %= 2;
  545. memcpy(buf, lt9611->edid_buf + (block * 128), len);
  546. return 0;
  547. }
  548. static int lt9611_connector_get_modes(struct drm_connector *connector)
  549. {
  550. struct lt9611 *lt9611 = connector_to_lt9611(connector);
  551. unsigned int count;
  552. struct edid *edid;
  553. lt9611_power_on(lt9611);
  554. edid = drm_do_get_edid(connector, lt9611_get_edid_block, lt9611);
  555. drm_connector_update_edid_property(connector, edid);
  556. count = drm_add_edid_modes(connector, edid);
  557. kfree(edid);
  558. return count;
  559. }
  560. static enum drm_mode_status
  561. lt9611_connector_mode_valid(struct drm_connector *connector,
  562. struct drm_display_mode *mode)
  563. {
  564. struct lt9611_mode *lt9611_mode = lt9611_find_mode(mode);
  565. return lt9611_mode ? MODE_OK : MODE_BAD;
  566. }
  567. /* bridge funcs */
  568. static void
  569. lt9611_bridge_atomic_enable(struct drm_bridge *bridge,
  570. struct drm_bridge_state *old_bridge_state)
  571. {
  572. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  573. if (lt9611_power_on(lt9611)) {
  574. dev_err(lt9611->dev, "power on failed\n");
  575. return;
  576. }
  577. lt9611_mipi_input_analog(lt9611);
  578. lt9611_hdmi_tx_digital(lt9611);
  579. lt9611_hdmi_tx_phy(lt9611);
  580. msleep(500);
  581. lt9611_video_check(lt9611);
  582. /* Enable HDMI output */
  583. regmap_write(lt9611->regmap, 0x8130, 0xea);
  584. }
  585. static void
  586. lt9611_bridge_atomic_disable(struct drm_bridge *bridge,
  587. struct drm_bridge_state *old_bridge_state)
  588. {
  589. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  590. int ret;
  591. /* Disable HDMI output */
  592. ret = regmap_write(lt9611->regmap, 0x8130, 0x6a);
  593. if (ret) {
  594. dev_err(lt9611->dev, "video on failed\n");
  595. return;
  596. }
  597. if (lt9611_power_off(lt9611)) {
  598. dev_err(lt9611->dev, "power on failed\n");
  599. return;
  600. }
  601. }
  602. static struct
  603. drm_connector_helper_funcs lt9611_bridge_connector_helper_funcs = {
  604. .get_modes = lt9611_connector_get_modes,
  605. .mode_valid = lt9611_connector_mode_valid,
  606. };
  607. static const struct drm_connector_funcs lt9611_bridge_connector_funcs = {
  608. .fill_modes = drm_helper_probe_single_connector_modes,
  609. .detect = lt9611_connector_detect,
  610. .destroy = drm_connector_cleanup,
  611. .reset = drm_atomic_helper_connector_reset,
  612. .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
  613. .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  614. };
  615. static struct mipi_dsi_device *lt9611_attach_dsi(struct lt9611 *lt9611,
  616. struct device_node *dsi_node)
  617. {
  618. const struct mipi_dsi_device_info info = { "lt9611", 0, lt9611->dev->of_node};
  619. struct mipi_dsi_device *dsi;
  620. struct mipi_dsi_host *host;
  621. struct device *dev = lt9611->dev;
  622. int ret;
  623. host = of_find_mipi_dsi_host_by_node(dsi_node);
  624. if (!host) {
  625. dev_err(lt9611->dev, "failed to find dsi host\n");
  626. return ERR_PTR(-EPROBE_DEFER);
  627. }
  628. dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
  629. if (IS_ERR(dsi)) {
  630. dev_err(lt9611->dev, "failed to create dsi device\n");
  631. return dsi;
  632. }
  633. dsi->lanes = 4;
  634. dsi->format = MIPI_DSI_FMT_RGB888;
  635. dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  636. MIPI_DSI_MODE_VIDEO_HSE;
  637. ret = devm_mipi_dsi_attach(dev, dsi);
  638. if (ret < 0) {
  639. dev_err(dev, "failed to attach dsi to host\n");
  640. return ERR_PTR(ret);
  641. }
  642. return dsi;
  643. }
  644. static int lt9611_connector_init(struct drm_bridge *bridge, struct lt9611 *lt9611)
  645. {
  646. int ret;
  647. ret = drm_connector_init(bridge->dev, &lt9611->connector,
  648. &lt9611_bridge_connector_funcs,
  649. DRM_MODE_CONNECTOR_HDMIA);
  650. if (ret) {
  651. DRM_ERROR("Failed to initialize connector with drm\n");
  652. return ret;
  653. }
  654. drm_connector_helper_add(&lt9611->connector,
  655. &lt9611_bridge_connector_helper_funcs);
  656. if (!bridge->encoder) {
  657. DRM_ERROR("Parent encoder object not found");
  658. return -ENODEV;
  659. }
  660. drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
  661. return 0;
  662. }
  663. static int lt9611_bridge_attach(struct drm_bridge *bridge,
  664. enum drm_bridge_attach_flags flags)
  665. {
  666. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  667. int ret;
  668. if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
  669. ret = lt9611_connector_init(bridge, lt9611);
  670. if (ret < 0)
  671. return ret;
  672. }
  673. return 0;
  674. }
  675. static enum drm_mode_status lt9611_bridge_mode_valid(struct drm_bridge *bridge,
  676. const struct drm_display_info *info,
  677. const struct drm_display_mode *mode)
  678. {
  679. struct lt9611_mode *lt9611_mode = lt9611_find_mode(mode);
  680. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  681. if (!lt9611_mode)
  682. return MODE_BAD;
  683. else if (lt9611_mode->intfs > 1 && !lt9611->dsi1)
  684. return MODE_PANEL;
  685. else
  686. return MODE_OK;
  687. }
  688. static void lt9611_bridge_pre_enable(struct drm_bridge *bridge)
  689. {
  690. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  691. static const struct reg_sequence reg_cfg[] = {
  692. { 0x8102, 0x12 },
  693. { 0x8123, 0x40 },
  694. { 0x8130, 0xea },
  695. { 0x8011, 0xfa },
  696. };
  697. if (!lt9611->sleep)
  698. return;
  699. regmap_multi_reg_write(lt9611->regmap,
  700. reg_cfg, ARRAY_SIZE(reg_cfg));
  701. lt9611->sleep = false;
  702. }
  703. static void
  704. lt9611_bridge_atomic_post_disable(struct drm_bridge *bridge,
  705. struct drm_bridge_state *old_bridge_state)
  706. {
  707. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  708. lt9611_sleep_setup(lt9611);
  709. }
  710. static void lt9611_bridge_mode_set(struct drm_bridge *bridge,
  711. const struct drm_display_mode *mode,
  712. const struct drm_display_mode *adj_mode)
  713. {
  714. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  715. struct hdmi_avi_infoframe avi_frame;
  716. unsigned int postdiv;
  717. int ret;
  718. lt9611_bridge_pre_enable(bridge);
  719. lt9611_mipi_input_digital(lt9611, mode);
  720. lt9611_pll_setup(lt9611, mode, &postdiv);
  721. lt9611_mipi_video_setup(lt9611, mode);
  722. lt9611_pcr_setup(lt9611, mode, postdiv);
  723. ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame,
  724. &lt9611->connector,
  725. mode);
  726. if (!ret)
  727. lt9611->vic = avi_frame.video_code;
  728. }
  729. static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge)
  730. {
  731. return __lt9611_detect(bridge_to_lt9611(bridge));
  732. }
  733. static struct edid *lt9611_bridge_get_edid(struct drm_bridge *bridge,
  734. struct drm_connector *connector)
  735. {
  736. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  737. lt9611_power_on(lt9611);
  738. return drm_do_get_edid(connector, lt9611_get_edid_block, lt9611);
  739. }
  740. static void lt9611_bridge_hpd_enable(struct drm_bridge *bridge)
  741. {
  742. struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
  743. lt9611_enable_hpd_interrupts(lt9611);
  744. }
  745. #define MAX_INPUT_SEL_FORMATS 1
  746. static u32 *
  747. lt9611_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
  748. struct drm_bridge_state *bridge_state,
  749. struct drm_crtc_state *crtc_state,
  750. struct drm_connector_state *conn_state,
  751. u32 output_fmt,
  752. unsigned int *num_input_fmts)
  753. {
  754. u32 *input_fmts;
  755. *num_input_fmts = 0;
  756. input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
  757. GFP_KERNEL);
  758. if (!input_fmts)
  759. return NULL;
  760. /* This is the DSI-end bus format */
  761. input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
  762. *num_input_fmts = 1;
  763. return input_fmts;
  764. }
  765. static const struct drm_bridge_funcs lt9611_bridge_funcs = {
  766. .attach = lt9611_bridge_attach,
  767. .mode_valid = lt9611_bridge_mode_valid,
  768. .mode_set = lt9611_bridge_mode_set,
  769. .detect = lt9611_bridge_detect,
  770. .get_edid = lt9611_bridge_get_edid,
  771. .hpd_enable = lt9611_bridge_hpd_enable,
  772. .atomic_enable = lt9611_bridge_atomic_enable,
  773. .atomic_disable = lt9611_bridge_atomic_disable,
  774. .atomic_post_disable = lt9611_bridge_atomic_post_disable,
  775. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  776. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  777. .atomic_reset = drm_atomic_helper_bridge_reset,
  778. .atomic_get_input_bus_fmts = lt9611_atomic_get_input_bus_fmts,
  779. };
  780. static int lt9611_parse_dt(struct device *dev,
  781. struct lt9611 *lt9611)
  782. {
  783. lt9611->dsi0_node = of_graph_get_remote_node(dev->of_node, 0, -1);
  784. if (!lt9611->dsi0_node) {
  785. dev_err(lt9611->dev, "failed to get remote node for primary dsi\n");
  786. return -ENODEV;
  787. }
  788. lt9611->dsi1_node = of_graph_get_remote_node(dev->of_node, 1, -1);
  789. lt9611->ac_mode = of_property_read_bool(dev->of_node, "lt,ac-mode");
  790. return 0;
  791. }
  792. static int lt9611_gpio_init(struct lt9611 *lt9611)
  793. {
  794. struct device *dev = lt9611->dev;
  795. lt9611->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
  796. if (IS_ERR(lt9611->reset_gpio)) {
  797. dev_err(dev, "failed to acquire reset gpio\n");
  798. return PTR_ERR(lt9611->reset_gpio);
  799. }
  800. lt9611->enable_gpio = devm_gpiod_get_optional(dev, "enable",
  801. GPIOD_OUT_LOW);
  802. if (IS_ERR(lt9611->enable_gpio)) {
  803. dev_err(dev, "failed to acquire enable gpio\n");
  804. return PTR_ERR(lt9611->enable_gpio);
  805. }
  806. return 0;
  807. }
  808. static int lt9611_read_device_rev(struct lt9611 *lt9611)
  809. {
  810. unsigned int rev;
  811. int ret;
  812. regmap_write(lt9611->regmap, 0x80ee, 0x01);
  813. ret = regmap_read(lt9611->regmap, 0x8002, &rev);
  814. if (ret)
  815. dev_err(lt9611->dev, "failed to read revision: %d\n", ret);
  816. else
  817. dev_info(lt9611->dev, "LT9611 revision: 0x%x\n", rev);
  818. return ret;
  819. }
  820. static int lt9611_hdmi_hw_params(struct device *dev, void *data,
  821. struct hdmi_codec_daifmt *fmt,
  822. struct hdmi_codec_params *hparms)
  823. {
  824. struct lt9611 *lt9611 = data;
  825. if (hparms->sample_rate == 48000)
  826. regmap_write(lt9611->regmap, 0x840f, 0x2b);
  827. else if (hparms->sample_rate == 96000)
  828. regmap_write(lt9611->regmap, 0x840f, 0xab);
  829. else
  830. return -EINVAL;
  831. regmap_write(lt9611->regmap, 0x8435, 0x00);
  832. regmap_write(lt9611->regmap, 0x8436, 0x18);
  833. regmap_write(lt9611->regmap, 0x8437, 0x00);
  834. return 0;
  835. }
  836. static int lt9611_audio_startup(struct device *dev, void *data)
  837. {
  838. struct lt9611 *lt9611 = data;
  839. regmap_write(lt9611->regmap, 0x82d6, 0x8c);
  840. regmap_write(lt9611->regmap, 0x82d7, 0x04);
  841. regmap_write(lt9611->regmap, 0x8406, 0x08);
  842. regmap_write(lt9611->regmap, 0x8407, 0x10);
  843. regmap_write(lt9611->regmap, 0x8434, 0xd5);
  844. return 0;
  845. }
  846. static void lt9611_audio_shutdown(struct device *dev, void *data)
  847. {
  848. struct lt9611 *lt9611 = data;
  849. regmap_write(lt9611->regmap, 0x8406, 0x00);
  850. regmap_write(lt9611->regmap, 0x8407, 0x00);
  851. }
  852. static int lt9611_hdmi_i2s_get_dai_id(struct snd_soc_component *component,
  853. struct device_node *endpoint)
  854. {
  855. struct of_endpoint of_ep;
  856. int ret;
  857. ret = of_graph_parse_endpoint(endpoint, &of_ep);
  858. if (ret < 0)
  859. return ret;
  860. /*
  861. * HDMI sound should be located as reg = <2>
  862. * Then, it is sound port 0
  863. */
  864. if (of_ep.port == 2)
  865. return 0;
  866. return -EINVAL;
  867. }
  868. static const struct hdmi_codec_ops lt9611_codec_ops = {
  869. .hw_params = lt9611_hdmi_hw_params,
  870. .audio_shutdown = lt9611_audio_shutdown,
  871. .audio_startup = lt9611_audio_startup,
  872. .get_dai_id = lt9611_hdmi_i2s_get_dai_id,
  873. };
  874. static struct hdmi_codec_pdata codec_data = {
  875. .ops = &lt9611_codec_ops,
  876. .max_i2s_channels = 8,
  877. .i2s = 1,
  878. };
  879. static int lt9611_audio_init(struct device *dev, struct lt9611 *lt9611)
  880. {
  881. codec_data.data = lt9611;
  882. lt9611->audio_pdev =
  883. platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
  884. PLATFORM_DEVID_AUTO,
  885. &codec_data, sizeof(codec_data));
  886. return PTR_ERR_OR_ZERO(lt9611->audio_pdev);
  887. }
  888. static void lt9611_audio_exit(struct lt9611 *lt9611)
  889. {
  890. if (lt9611->audio_pdev) {
  891. platform_device_unregister(lt9611->audio_pdev);
  892. lt9611->audio_pdev = NULL;
  893. }
  894. }
  895. static int lt9611_probe(struct i2c_client *client,
  896. const struct i2c_device_id *id)
  897. {
  898. struct lt9611 *lt9611;
  899. struct device *dev = &client->dev;
  900. int ret;
  901. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  902. dev_err(dev, "device doesn't support I2C\n");
  903. return -ENODEV;
  904. }
  905. lt9611 = devm_kzalloc(dev, sizeof(*lt9611), GFP_KERNEL);
  906. if (!lt9611)
  907. return -ENOMEM;
  908. lt9611->dev = dev;
  909. lt9611->client = client;
  910. lt9611->sleep = false;
  911. lt9611->regmap = devm_regmap_init_i2c(client, &lt9611_regmap_config);
  912. if (IS_ERR(lt9611->regmap)) {
  913. dev_err(lt9611->dev, "regmap i2c init failed\n");
  914. return PTR_ERR(lt9611->regmap);
  915. }
  916. ret = lt9611_parse_dt(dev, lt9611);
  917. if (ret) {
  918. dev_err(dev, "failed to parse device tree\n");
  919. return ret;
  920. }
  921. ret = lt9611_gpio_init(lt9611);
  922. if (ret < 0)
  923. goto err_of_put;
  924. ret = lt9611_regulator_init(lt9611);
  925. if (ret < 0)
  926. goto err_of_put;
  927. lt9611_assert_5v(lt9611);
  928. ret = lt9611_regulator_enable(lt9611);
  929. if (ret)
  930. goto err_of_put;
  931. lt9611_reset(lt9611);
  932. ret = lt9611_read_device_rev(lt9611);
  933. if (ret) {
  934. dev_err(dev, "failed to read chip rev\n");
  935. goto err_disable_regulators;
  936. }
  937. ret = devm_request_threaded_irq(dev, client->irq, NULL,
  938. lt9611_irq_thread_handler,
  939. IRQF_ONESHOT, "lt9611", lt9611);
  940. if (ret) {
  941. dev_err(dev, "failed to request irq\n");
  942. goto err_disable_regulators;
  943. }
  944. i2c_set_clientdata(client, lt9611);
  945. lt9611->bridge.funcs = &lt9611_bridge_funcs;
  946. lt9611->bridge.of_node = client->dev.of_node;
  947. lt9611->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
  948. DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_MODES;
  949. lt9611->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
  950. drm_bridge_add(&lt9611->bridge);
  951. /* Attach primary DSI */
  952. lt9611->dsi0 = lt9611_attach_dsi(lt9611, lt9611->dsi0_node);
  953. if (IS_ERR(lt9611->dsi0)) {
  954. ret = PTR_ERR(lt9611->dsi0);
  955. goto err_remove_bridge;
  956. }
  957. /* Attach secondary DSI, if specified */
  958. if (lt9611->dsi1_node) {
  959. lt9611->dsi1 = lt9611_attach_dsi(lt9611, lt9611->dsi1_node);
  960. if (IS_ERR(lt9611->dsi1)) {
  961. ret = PTR_ERR(lt9611->dsi1);
  962. goto err_remove_bridge;
  963. }
  964. }
  965. lt9611_enable_hpd_interrupts(lt9611);
  966. ret = lt9611_audio_init(dev, lt9611);
  967. if (ret)
  968. goto err_remove_bridge;
  969. return 0;
  970. err_remove_bridge:
  971. drm_bridge_remove(&lt9611->bridge);
  972. err_disable_regulators:
  973. regulator_bulk_disable(ARRAY_SIZE(lt9611->supplies), lt9611->supplies);
  974. err_of_put:
  975. of_node_put(lt9611->dsi1_node);
  976. of_node_put(lt9611->dsi0_node);
  977. return ret;
  978. }
  979. static void lt9611_remove(struct i2c_client *client)
  980. {
  981. struct lt9611 *lt9611 = i2c_get_clientdata(client);
  982. disable_irq(client->irq);
  983. lt9611_audio_exit(lt9611);
  984. drm_bridge_remove(&lt9611->bridge);
  985. regulator_bulk_disable(ARRAY_SIZE(lt9611->supplies), lt9611->supplies);
  986. of_node_put(lt9611->dsi1_node);
  987. of_node_put(lt9611->dsi0_node);
  988. }
  989. static struct i2c_device_id lt9611_id[] = {
  990. { "lontium,lt9611", 0 },
  991. {}
  992. };
  993. MODULE_DEVICE_TABLE(i2c, lt9611_id);
  994. static const struct of_device_id lt9611_match_table[] = {
  995. { .compatible = "lontium,lt9611" },
  996. { }
  997. };
  998. MODULE_DEVICE_TABLE(of, lt9611_match_table);
  999. static struct i2c_driver lt9611_driver = {
  1000. .driver = {
  1001. .name = "lt9611",
  1002. .of_match_table = lt9611_match_table,
  1003. },
  1004. .probe = lt9611_probe,
  1005. .remove = lt9611_remove,
  1006. .id_table = lt9611_id,
  1007. };
  1008. module_i2c_driver(lt9611_driver);
  1009. MODULE_LICENSE("GPL v2");