chipone-icn6211.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2020 Amarula Solutions(India)
  4. * Author: Jagan Teki <jagan@amarulasolutions.com>
  5. */
  6. #include <drm/drm_atomic_helper.h>
  7. #include <drm/drm_of.h>
  8. #include <drm/drm_print.h>
  9. #include <drm/drm_mipi_dsi.h>
  10. #include <linux/bitfield.h>
  11. #include <linux/bits.h>
  12. #include <linux/clk.h>
  13. #include <linux/delay.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.h>
  19. #include <linux/regmap.h>
  20. #include <linux/regulator/consumer.h>
  21. #define VENDOR_ID 0x00
  22. #define DEVICE_ID_H 0x01
  23. #define DEVICE_ID_L 0x02
  24. #define VERSION_ID 0x03
  25. #define FIRMWARE_VERSION 0x08
  26. #define CONFIG_FINISH 0x09
  27. #define PD_CTRL(n) (0x0a + ((n) & 0x3)) /* 0..3 */
  28. #define RST_CTRL(n) (0x0e + ((n) & 0x1)) /* 0..1 */
  29. #define SYS_CTRL(n) (0x10 + ((n) & 0x7)) /* 0..4 */
  30. #define SYS_CTRL_1_CLK_PHASE_MSK GENMASK(5, 4)
  31. #define CLK_PHASE_0 0
  32. #define CLK_PHASE_1_4 1
  33. #define CLK_PHASE_1_2 2
  34. #define CLK_PHASE_3_4 3
  35. #define RGB_DRV(n) (0x18 + ((n) & 0x3)) /* 0..3 */
  36. #define RGB_DLY(n) (0x1c + ((n) & 0x1)) /* 0..1 */
  37. #define RGB_TEST_CTRL 0x1e
  38. #define ATE_PLL_EN 0x1f
  39. #define HACTIVE_LI 0x20
  40. #define VACTIVE_LI 0x21
  41. #define VACTIVE_HACTIVE_HI 0x22
  42. #define HFP_LI 0x23
  43. #define HSYNC_LI 0x24
  44. #define HBP_LI 0x25
  45. #define HFP_HSW_HBP_HI 0x26
  46. #define HFP_HSW_HBP_HI_HFP(n) (((n) & 0x300) >> 4)
  47. #define HFP_HSW_HBP_HI_HS(n) (((n) & 0x300) >> 6)
  48. #define HFP_HSW_HBP_HI_HBP(n) (((n) & 0x300) >> 8)
  49. #define VFP 0x27
  50. #define VSYNC 0x28
  51. #define VBP 0x29
  52. #define BIST_POL 0x2a
  53. #define BIST_POL_BIST_MODE(n) (((n) & 0xf) << 4)
  54. #define BIST_POL_BIST_GEN BIT(3)
  55. #define BIST_POL_HSYNC_POL BIT(2)
  56. #define BIST_POL_VSYNC_POL BIT(1)
  57. #define BIST_POL_DE_POL BIT(0)
  58. #define BIST_RED 0x2b
  59. #define BIST_GREEN 0x2c
  60. #define BIST_BLUE 0x2d
  61. #define BIST_CHESS_X 0x2e
  62. #define BIST_CHESS_Y 0x2f
  63. #define BIST_CHESS_XY_H 0x30
  64. #define BIST_FRAME_TIME_L 0x31
  65. #define BIST_FRAME_TIME_H 0x32
  66. #define FIFO_MAX_ADDR_LOW 0x33
  67. #define SYNC_EVENT_DLY 0x34
  68. #define HSW_MIN 0x35
  69. #define HFP_MIN 0x36
  70. #define LOGIC_RST_NUM 0x37
  71. #define OSC_CTRL(n) (0x48 + ((n) & 0x7)) /* 0..5 */
  72. #define BG_CTRL 0x4e
  73. #define LDO_PLL 0x4f
  74. #define PLL_CTRL(n) (0x50 + ((n) & 0xf)) /* 0..15 */
  75. #define PLL_CTRL_6_EXTERNAL 0x90
  76. #define PLL_CTRL_6_MIPI_CLK 0x92
  77. #define PLL_CTRL_6_INTERNAL 0x93
  78. #define PLL_REM(n) (0x60 + ((n) & 0x3)) /* 0..2 */
  79. #define PLL_DIV(n) (0x63 + ((n) & 0x3)) /* 0..2 */
  80. #define PLL_FRAC(n) (0x66 + ((n) & 0x3)) /* 0..2 */
  81. #define PLL_INT(n) (0x69 + ((n) & 0x1)) /* 0..1 */
  82. #define PLL_REF_DIV 0x6b
  83. #define PLL_REF_DIV_P(n) ((n) & 0xf)
  84. #define PLL_REF_DIV_Pe BIT(4)
  85. #define PLL_REF_DIV_S(n) (((n) & 0x7) << 5)
  86. #define PLL_SSC_P(n) (0x6c + ((n) & 0x3)) /* 0..2 */
  87. #define PLL_SSC_STEP(n) (0x6f + ((n) & 0x3)) /* 0..2 */
  88. #define PLL_SSC_OFFSET(n) (0x72 + ((n) & 0x3)) /* 0..3 */
  89. #define GPIO_OEN 0x79
  90. #define MIPI_CFG_PW 0x7a
  91. #define MIPI_CFG_PW_CONFIG_DSI 0xc1
  92. #define MIPI_CFG_PW_CONFIG_I2C 0x3e
  93. #define GPIO_SEL(n) (0x7b + ((n) & 0x1)) /* 0..1 */
  94. #define IRQ_SEL 0x7d
  95. #define DBG_SEL 0x7e
  96. #define DBG_SIGNAL 0x7f
  97. #define MIPI_ERR_VECTOR_L 0x80
  98. #define MIPI_ERR_VECTOR_H 0x81
  99. #define MIPI_ERR_VECTOR_EN_L 0x82
  100. #define MIPI_ERR_VECTOR_EN_H 0x83
  101. #define MIPI_MAX_SIZE_L 0x84
  102. #define MIPI_MAX_SIZE_H 0x85
  103. #define DSI_CTRL 0x86
  104. #define DSI_CTRL_UNKNOWN 0x28
  105. #define DSI_CTRL_DSI_LANES(n) ((n) & 0x3)
  106. #define MIPI_PN_SWAP 0x87
  107. #define MIPI_PN_SWAP_CLK BIT(4)
  108. #define MIPI_PN_SWAP_D(n) BIT((n) & 0x3)
  109. #define MIPI_SOT_SYNC_BIT(n) (0x88 + ((n) & 0x1)) /* 0..1 */
  110. #define MIPI_ULPS_CTRL 0x8a
  111. #define MIPI_CLK_CHK_VAR 0x8e
  112. #define MIPI_CLK_CHK_INI 0x8f
  113. #define MIPI_T_TERM_EN 0x90
  114. #define MIPI_T_HS_SETTLE 0x91
  115. #define MIPI_T_TA_SURE_PRE 0x92
  116. #define MIPI_T_LPX_SET 0x94
  117. #define MIPI_T_CLK_MISS 0x95
  118. #define MIPI_INIT_TIME_L 0x96
  119. #define MIPI_INIT_TIME_H 0x97
  120. #define MIPI_T_CLK_TERM_EN 0x99
  121. #define MIPI_T_CLK_SETTLE 0x9a
  122. #define MIPI_TO_HS_RX_L 0x9e
  123. #define MIPI_TO_HS_RX_H 0x9f
  124. #define MIPI_PHY(n) (0xa0 + ((n) & 0x7)) /* 0..5 */
  125. #define MIPI_PD_RX 0xb0
  126. #define MIPI_PD_TERM 0xb1
  127. #define MIPI_PD_HSRX 0xb2
  128. #define MIPI_PD_LPTX 0xb3
  129. #define MIPI_PD_LPRX 0xb4
  130. #define MIPI_PD_CK_LANE 0xb5
  131. #define MIPI_FORCE_0 0xb6
  132. #define MIPI_RST_CTRL 0xb7
  133. #define MIPI_RST_NUM 0xb8
  134. #define MIPI_DBG_SET(n) (0xc0 + ((n) & 0xf)) /* 0..9 */
  135. #define MIPI_DBG_SEL 0xe0
  136. #define MIPI_DBG_DATA 0xe1
  137. #define MIPI_ATE_TEST_SEL 0xe2
  138. #define MIPI_ATE_STATUS(n) (0xe3 + ((n) & 0x1)) /* 0..1 */
  139. struct chipone {
  140. struct device *dev;
  141. struct regmap *regmap;
  142. struct i2c_client *client;
  143. struct drm_bridge bridge;
  144. struct drm_display_mode mode;
  145. struct drm_bridge *panel_bridge;
  146. struct mipi_dsi_device *dsi;
  147. struct gpio_desc *enable_gpio;
  148. struct regulator *vdd1;
  149. struct regulator *vdd2;
  150. struct regulator *vdd3;
  151. struct clk *refclk;
  152. unsigned long refclk_rate;
  153. bool interface_i2c;
  154. };
  155. static const struct regmap_range chipone_dsi_readable_ranges[] = {
  156. regmap_reg_range(VENDOR_ID, VERSION_ID),
  157. regmap_reg_range(FIRMWARE_VERSION, PLL_SSC_OFFSET(3)),
  158. regmap_reg_range(GPIO_OEN, MIPI_ULPS_CTRL),
  159. regmap_reg_range(MIPI_CLK_CHK_VAR, MIPI_T_TA_SURE_PRE),
  160. regmap_reg_range(MIPI_T_LPX_SET, MIPI_INIT_TIME_H),
  161. regmap_reg_range(MIPI_T_CLK_TERM_EN, MIPI_T_CLK_SETTLE),
  162. regmap_reg_range(MIPI_TO_HS_RX_L, MIPI_PHY(5)),
  163. regmap_reg_range(MIPI_PD_RX, MIPI_RST_NUM),
  164. regmap_reg_range(MIPI_DBG_SET(0), MIPI_DBG_SET(9)),
  165. regmap_reg_range(MIPI_DBG_SEL, MIPI_ATE_STATUS(1)),
  166. };
  167. static const struct regmap_access_table chipone_dsi_readable_table = {
  168. .yes_ranges = chipone_dsi_readable_ranges,
  169. .n_yes_ranges = ARRAY_SIZE(chipone_dsi_readable_ranges),
  170. };
  171. static const struct regmap_range chipone_dsi_writeable_ranges[] = {
  172. regmap_reg_range(CONFIG_FINISH, PLL_SSC_OFFSET(3)),
  173. regmap_reg_range(GPIO_OEN, MIPI_ULPS_CTRL),
  174. regmap_reg_range(MIPI_CLK_CHK_VAR, MIPI_T_TA_SURE_PRE),
  175. regmap_reg_range(MIPI_T_LPX_SET, MIPI_INIT_TIME_H),
  176. regmap_reg_range(MIPI_T_CLK_TERM_EN, MIPI_T_CLK_SETTLE),
  177. regmap_reg_range(MIPI_TO_HS_RX_L, MIPI_PHY(5)),
  178. regmap_reg_range(MIPI_PD_RX, MIPI_RST_NUM),
  179. regmap_reg_range(MIPI_DBG_SET(0), MIPI_DBG_SET(9)),
  180. regmap_reg_range(MIPI_DBG_SEL, MIPI_ATE_STATUS(1)),
  181. };
  182. static const struct regmap_access_table chipone_dsi_writeable_table = {
  183. .yes_ranges = chipone_dsi_writeable_ranges,
  184. .n_yes_ranges = ARRAY_SIZE(chipone_dsi_writeable_ranges),
  185. };
  186. static const struct regmap_config chipone_regmap_config = {
  187. .reg_bits = 8,
  188. .val_bits = 8,
  189. .rd_table = &chipone_dsi_readable_table,
  190. .wr_table = &chipone_dsi_writeable_table,
  191. .cache_type = REGCACHE_MAPLE,
  192. .max_register = MIPI_ATE_STATUS(1),
  193. };
  194. static int chipone_dsi_read(void *context,
  195. const void *reg, size_t reg_size,
  196. void *val, size_t val_size)
  197. {
  198. struct mipi_dsi_device *dsi = context;
  199. const u16 reg16 = (val_size << 8) | *(u8 *)reg;
  200. int ret;
  201. ret = mipi_dsi_generic_read(dsi, &reg16, 2, val, val_size);
  202. return ret == val_size ? 0 : -EINVAL;
  203. }
  204. static int chipone_dsi_write(void *context, const void *data, size_t count)
  205. {
  206. struct mipi_dsi_device *dsi = context;
  207. return mipi_dsi_generic_write(dsi, data, 2);
  208. }
  209. static const struct regmap_bus chipone_dsi_regmap_bus = {
  210. .read = chipone_dsi_read,
  211. .write = chipone_dsi_write,
  212. .reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
  213. .val_format_endian_default = REGMAP_ENDIAN_NATIVE,
  214. };
  215. static inline struct chipone *bridge_to_chipone(struct drm_bridge *bridge)
  216. {
  217. return container_of(bridge, struct chipone, bridge);
  218. }
  219. static void chipone_readb(struct chipone *icn, u8 reg, u8 *val)
  220. {
  221. int ret, pval;
  222. ret = regmap_read(icn->regmap, reg, &pval);
  223. *val = ret ? 0 : pval & 0xff;
  224. }
  225. static int chipone_writeb(struct chipone *icn, u8 reg, u8 val)
  226. {
  227. return regmap_write(icn->regmap, reg, val);
  228. }
  229. static void chipone_configure_pll(struct chipone *icn,
  230. const struct drm_display_mode *mode)
  231. {
  232. unsigned int best_p = 0, best_m = 0, best_s = 0;
  233. unsigned int mode_clock = mode->clock * 1000;
  234. unsigned int delta, min_delta = 0xffffffff;
  235. unsigned int freq_p, freq_s, freq_out;
  236. unsigned int p_min, p_max;
  237. unsigned int p, m, s;
  238. unsigned int fin;
  239. bool best_p_pot;
  240. u8 ref_div;
  241. /*
  242. * DSI byte clock frequency (input into PLL) is calculated as:
  243. * DSI_CLK = HS clock / 4
  244. *
  245. * DPI pixel clock frequency (output from PLL) is mode clock.
  246. *
  247. * The chip contains fractional PLL which works as follows:
  248. * DPI_CLK = ((DSI_CLK / P) * M) / S
  249. * P is pre-divider, register PLL_REF_DIV[3:0] is 1:n divider
  250. * register PLL_REF_DIV[4] is extra 1:2 divider
  251. * M is integer multiplier, register PLL_INT(0) is multiplier
  252. * S is post-divider, register PLL_REF_DIV[7:5] is 2^(n+1) divider
  253. *
  254. * It seems the PLL input clock after applying P pre-divider have
  255. * to be lower than 20 MHz.
  256. */
  257. if (icn->refclk)
  258. fin = icn->refclk_rate;
  259. else
  260. fin = icn->dsi->hs_rate / 4; /* in Hz */
  261. /* Minimum value of P predivider for PLL input in 5..20 MHz */
  262. p_min = clamp(DIV_ROUND_UP(fin, 20000000), 1U, 31U);
  263. p_max = clamp(fin / 5000000, 1U, 31U);
  264. for (p = p_min; p < p_max; p++) { /* PLL_REF_DIV[4,3:0] */
  265. if (p > 16 && p & 1) /* P > 16 uses extra /2 */
  266. continue;
  267. freq_p = fin / p;
  268. if (freq_p == 0) /* Divider too high */
  269. break;
  270. for (s = 0; s < 0x7; s++) { /* PLL_REF_DIV[7:5] */
  271. freq_s = freq_p / BIT(s + 1);
  272. if (freq_s == 0) /* Divider too high */
  273. break;
  274. m = mode_clock / freq_s;
  275. /* Multiplier is 8 bit */
  276. if (m > 0xff)
  277. continue;
  278. /* Limit PLL VCO frequency to 1 GHz */
  279. freq_out = (fin * m) / p;
  280. if (freq_out > 1000000000)
  281. continue;
  282. /* Apply post-divider */
  283. freq_out /= BIT(s + 1);
  284. delta = abs(mode_clock - freq_out);
  285. if (delta < min_delta) {
  286. best_p = p;
  287. best_m = m;
  288. best_s = s;
  289. min_delta = delta;
  290. }
  291. }
  292. }
  293. best_p_pot = !(best_p & 1);
  294. dev_dbg(icn->dev,
  295. "PLL: P[3:0]=%d P[4]=2*%d M=%d S[7:5]=2^%d delta=%d => DSI f_in(%s)=%d Hz ; DPI f_out=%d Hz\n",
  296. best_p >> best_p_pot, best_p_pot, best_m, best_s + 1,
  297. min_delta, icn->refclk ? "EXT" : "DSI", fin,
  298. (fin * best_m) / (best_p << (best_s + 1)));
  299. ref_div = PLL_REF_DIV_P(best_p >> best_p_pot) | PLL_REF_DIV_S(best_s);
  300. if (best_p_pot) /* Prefer /2 pre-divider */
  301. ref_div |= PLL_REF_DIV_Pe;
  302. /* Clock source selection either external clock or MIPI DSI clock lane */
  303. chipone_writeb(icn, PLL_CTRL(6),
  304. icn->refclk ? PLL_CTRL_6_EXTERNAL : PLL_CTRL_6_MIPI_CLK);
  305. chipone_writeb(icn, PLL_REF_DIV, ref_div);
  306. chipone_writeb(icn, PLL_INT(0), best_m);
  307. }
  308. static void chipone_atomic_enable(struct drm_bridge *bridge,
  309. struct drm_atomic_state *state)
  310. {
  311. struct chipone *icn = bridge_to_chipone(bridge);
  312. struct drm_display_mode *mode = &icn->mode;
  313. const struct drm_bridge_state *bridge_state;
  314. u16 hfp, hbp, hsync;
  315. u32 bus_flags;
  316. u8 pol, sys_ctrl_1, id[4];
  317. chipone_readb(icn, VENDOR_ID, id);
  318. chipone_readb(icn, DEVICE_ID_H, id + 1);
  319. chipone_readb(icn, DEVICE_ID_L, id + 2);
  320. chipone_readb(icn, VERSION_ID, id + 3);
  321. dev_dbg(icn->dev,
  322. "Chip IDs: Vendor=0x%02x Device=0x%02x:0x%02x Version=0x%02x\n",
  323. id[0], id[1], id[2], id[3]);
  324. if (id[0] != 0xc1 || id[1] != 0x62 || id[2] != 0x11) {
  325. dev_dbg(icn->dev, "Invalid Chip IDs, aborting configuration\n");
  326. return;
  327. }
  328. /* Get the DPI flags from the bridge state. */
  329. bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
  330. bus_flags = bridge_state->output_bus_cfg.flags;
  331. if (icn->interface_i2c)
  332. chipone_writeb(icn, MIPI_CFG_PW, MIPI_CFG_PW_CONFIG_I2C);
  333. else
  334. chipone_writeb(icn, MIPI_CFG_PW, MIPI_CFG_PW_CONFIG_DSI);
  335. chipone_writeb(icn, HACTIVE_LI, mode->hdisplay & 0xff);
  336. chipone_writeb(icn, VACTIVE_LI, mode->vdisplay & 0xff);
  337. /*
  338. * lsb nibble: 2nd nibble of hdisplay
  339. * msb nibble: 2nd nibble of vdisplay
  340. */
  341. chipone_writeb(icn, VACTIVE_HACTIVE_HI,
  342. ((mode->hdisplay >> 8) & 0xf) |
  343. (((mode->vdisplay >> 8) & 0xf) << 4));
  344. hfp = mode->hsync_start - mode->hdisplay;
  345. hsync = mode->hsync_end - mode->hsync_start;
  346. hbp = mode->htotal - mode->hsync_end;
  347. chipone_writeb(icn, HFP_LI, hfp & 0xff);
  348. chipone_writeb(icn, HSYNC_LI, hsync & 0xff);
  349. chipone_writeb(icn, HBP_LI, hbp & 0xff);
  350. /* Top two bits of Horizontal Front porch/Sync/Back porch */
  351. chipone_writeb(icn, HFP_HSW_HBP_HI,
  352. HFP_HSW_HBP_HI_HFP(hfp) |
  353. HFP_HSW_HBP_HI_HS(hsync) |
  354. HFP_HSW_HBP_HI_HBP(hbp));
  355. chipone_writeb(icn, VFP, mode->vsync_start - mode->vdisplay);
  356. chipone_writeb(icn, VSYNC, mode->vsync_end - mode->vsync_start);
  357. chipone_writeb(icn, VBP, mode->vtotal - mode->vsync_end);
  358. /* dsi specific sequence */
  359. chipone_writeb(icn, SYNC_EVENT_DLY, 0x80);
  360. chipone_writeb(icn, HFP_MIN, hfp & 0xff);
  361. /* DSI data lane count */
  362. chipone_writeb(icn, DSI_CTRL,
  363. DSI_CTRL_UNKNOWN | DSI_CTRL_DSI_LANES(icn->dsi->lanes - 1));
  364. chipone_writeb(icn, MIPI_PD_CK_LANE, 0xa0);
  365. chipone_writeb(icn, PLL_CTRL(12), 0xff);
  366. chipone_writeb(icn, MIPI_PN_SWAP, 0x00);
  367. /* DPI HS/VS/DE polarity */
  368. pol = ((mode->flags & DRM_MODE_FLAG_PHSYNC) ? BIST_POL_HSYNC_POL : 0) |
  369. ((mode->flags & DRM_MODE_FLAG_PVSYNC) ? BIST_POL_VSYNC_POL : 0) |
  370. ((bus_flags & DRM_BUS_FLAG_DE_HIGH) ? BIST_POL_DE_POL : 0);
  371. chipone_writeb(icn, BIST_POL, pol);
  372. /* Configure PLL settings */
  373. chipone_configure_pll(icn, mode);
  374. chipone_writeb(icn, SYS_CTRL(0), 0x40);
  375. sys_ctrl_1 = 0x88;
  376. if (bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE)
  377. sys_ctrl_1 |= FIELD_PREP(SYS_CTRL_1_CLK_PHASE_MSK, CLK_PHASE_0);
  378. else
  379. sys_ctrl_1 |= FIELD_PREP(SYS_CTRL_1_CLK_PHASE_MSK, CLK_PHASE_1_2);
  380. chipone_writeb(icn, SYS_CTRL(1), sys_ctrl_1);
  381. /* icn6211 specific sequence */
  382. chipone_writeb(icn, MIPI_FORCE_0, 0x20);
  383. chipone_writeb(icn, PLL_CTRL(1), 0x20);
  384. chipone_writeb(icn, CONFIG_FINISH, 0x10);
  385. usleep_range(10000, 11000);
  386. }
  387. static void chipone_atomic_pre_enable(struct drm_bridge *bridge,
  388. struct drm_atomic_state *state)
  389. {
  390. struct chipone *icn = bridge_to_chipone(bridge);
  391. int ret;
  392. if (icn->vdd1) {
  393. ret = regulator_enable(icn->vdd1);
  394. if (ret)
  395. DRM_DEV_ERROR(icn->dev,
  396. "failed to enable VDD1 regulator: %d\n", ret);
  397. }
  398. if (icn->vdd2) {
  399. ret = regulator_enable(icn->vdd2);
  400. if (ret)
  401. DRM_DEV_ERROR(icn->dev,
  402. "failed to enable VDD2 regulator: %d\n", ret);
  403. }
  404. if (icn->vdd3) {
  405. ret = regulator_enable(icn->vdd3);
  406. if (ret)
  407. DRM_DEV_ERROR(icn->dev,
  408. "failed to enable VDD3 regulator: %d\n", ret);
  409. }
  410. ret = clk_prepare_enable(icn->refclk);
  411. if (ret)
  412. DRM_DEV_ERROR(icn->dev,
  413. "failed to enable RECLK clock: %d\n", ret);
  414. gpiod_set_value(icn->enable_gpio, 1);
  415. usleep_range(10000, 11000);
  416. }
  417. static void chipone_atomic_post_disable(struct drm_bridge *bridge,
  418. struct drm_atomic_state *state)
  419. {
  420. struct chipone *icn = bridge_to_chipone(bridge);
  421. clk_disable_unprepare(icn->refclk);
  422. if (icn->vdd1)
  423. regulator_disable(icn->vdd1);
  424. if (icn->vdd2)
  425. regulator_disable(icn->vdd2);
  426. if (icn->vdd3)
  427. regulator_disable(icn->vdd3);
  428. gpiod_set_value(icn->enable_gpio, 0);
  429. }
  430. static void chipone_mode_set(struct drm_bridge *bridge,
  431. const struct drm_display_mode *mode,
  432. const struct drm_display_mode *adjusted_mode)
  433. {
  434. struct chipone *icn = bridge_to_chipone(bridge);
  435. drm_mode_copy(&icn->mode, adjusted_mode);
  436. };
  437. static int chipone_dsi_attach(struct chipone *icn)
  438. {
  439. struct mipi_dsi_device *dsi = icn->dsi;
  440. struct device *dev = icn->dev;
  441. int dsi_lanes, ret;
  442. dsi_lanes = drm_of_get_data_lanes_count_ep(dev->of_node, 0, 0, 1, 4);
  443. /*
  444. * If the 'data-lanes' property does not exist in DT or is invalid,
  445. * default to previously hard-coded behavior, which was 4 data lanes.
  446. */
  447. if (dsi_lanes < 0)
  448. icn->dsi->lanes = 4;
  449. else
  450. icn->dsi->lanes = dsi_lanes;
  451. dsi->format = MIPI_DSI_FMT_RGB888;
  452. dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
  453. MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_NO_EOT_PACKET;
  454. dsi->hs_rate = 500000000;
  455. dsi->lp_rate = 16000000;
  456. ret = mipi_dsi_attach(dsi);
  457. if (ret < 0)
  458. dev_err(icn->dev, "failed to attach dsi\n");
  459. return ret;
  460. }
  461. static int chipone_dsi_host_attach(struct chipone *icn)
  462. {
  463. struct device *dev = icn->dev;
  464. struct device_node *host_node;
  465. struct device_node *endpoint;
  466. struct mipi_dsi_device *dsi;
  467. struct mipi_dsi_host *host;
  468. int ret = 0;
  469. const struct mipi_dsi_device_info info = {
  470. .type = "chipone",
  471. .channel = 0,
  472. .node = NULL,
  473. };
  474. endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, 0);
  475. host_node = of_graph_get_remote_port_parent(endpoint);
  476. of_node_put(endpoint);
  477. if (!host_node)
  478. return -EINVAL;
  479. host = of_find_mipi_dsi_host_by_node(host_node);
  480. of_node_put(host_node);
  481. if (!host)
  482. return dev_err_probe(dev, -EPROBE_DEFER, "failed to find dsi host\n");
  483. dsi = mipi_dsi_device_register_full(host, &info);
  484. if (IS_ERR(dsi)) {
  485. return dev_err_probe(dev, PTR_ERR(dsi),
  486. "failed to create dsi device\n");
  487. }
  488. icn->dsi = dsi;
  489. ret = chipone_dsi_attach(icn);
  490. if (ret < 0)
  491. mipi_dsi_device_unregister(dsi);
  492. return ret;
  493. }
  494. static int chipone_attach(struct drm_bridge *bridge,
  495. struct drm_encoder *encoder,
  496. enum drm_bridge_attach_flags flags)
  497. {
  498. struct chipone *icn = bridge_to_chipone(bridge);
  499. return drm_bridge_attach(encoder, icn->panel_bridge, bridge, flags);
  500. }
  501. #define MAX_INPUT_SEL_FORMATS 1
  502. static u32 *
  503. chipone_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
  504. struct drm_bridge_state *bridge_state,
  505. struct drm_crtc_state *crtc_state,
  506. struct drm_connector_state *conn_state,
  507. u32 output_fmt,
  508. unsigned int *num_input_fmts)
  509. {
  510. u32 *input_fmts;
  511. *num_input_fmts = 0;
  512. input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
  513. GFP_KERNEL);
  514. if (!input_fmts)
  515. return NULL;
  516. /* This is the DSI-end bus format */
  517. input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
  518. *num_input_fmts = 1;
  519. return input_fmts;
  520. }
  521. static const struct drm_bridge_funcs chipone_bridge_funcs = {
  522. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  523. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  524. .atomic_reset = drm_atomic_helper_bridge_reset,
  525. .atomic_pre_enable = chipone_atomic_pre_enable,
  526. .atomic_enable = chipone_atomic_enable,
  527. .atomic_post_disable = chipone_atomic_post_disable,
  528. .mode_set = chipone_mode_set,
  529. .attach = chipone_attach,
  530. .atomic_get_input_bus_fmts = chipone_atomic_get_input_bus_fmts,
  531. };
  532. static int chipone_parse_dt(struct chipone *icn)
  533. {
  534. struct device *dev = icn->dev;
  535. int ret;
  536. icn->refclk = devm_clk_get_optional(dev, "refclk");
  537. if (IS_ERR(icn->refclk)) {
  538. ret = PTR_ERR(icn->refclk);
  539. DRM_DEV_ERROR(dev, "failed to get REFCLK clock: %d\n", ret);
  540. return ret;
  541. } else if (icn->refclk) {
  542. icn->refclk_rate = clk_get_rate(icn->refclk);
  543. if (icn->refclk_rate < 10000000 || icn->refclk_rate > 154000000) {
  544. DRM_DEV_ERROR(dev, "REFCLK out of range: %ld Hz\n",
  545. icn->refclk_rate);
  546. return -EINVAL;
  547. }
  548. }
  549. icn->vdd1 = devm_regulator_get_optional(dev, "vdd1");
  550. if (IS_ERR(icn->vdd1)) {
  551. ret = PTR_ERR(icn->vdd1);
  552. if (ret == -EPROBE_DEFER)
  553. return -EPROBE_DEFER;
  554. icn->vdd1 = NULL;
  555. DRM_DEV_DEBUG(dev, "failed to get VDD1 regulator: %d\n", ret);
  556. }
  557. icn->vdd2 = devm_regulator_get_optional(dev, "vdd2");
  558. if (IS_ERR(icn->vdd2)) {
  559. ret = PTR_ERR(icn->vdd2);
  560. if (ret == -EPROBE_DEFER)
  561. return -EPROBE_DEFER;
  562. icn->vdd2 = NULL;
  563. DRM_DEV_DEBUG(dev, "failed to get VDD2 regulator: %d\n", ret);
  564. }
  565. icn->vdd3 = devm_regulator_get_optional(dev, "vdd3");
  566. if (IS_ERR(icn->vdd3)) {
  567. ret = PTR_ERR(icn->vdd3);
  568. if (ret == -EPROBE_DEFER)
  569. return -EPROBE_DEFER;
  570. icn->vdd3 = NULL;
  571. DRM_DEV_DEBUG(dev, "failed to get VDD3 regulator: %d\n", ret);
  572. }
  573. icn->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
  574. if (IS_ERR(icn->enable_gpio)) {
  575. DRM_DEV_ERROR(dev, "failed to get enable GPIO\n");
  576. return PTR_ERR(icn->enable_gpio);
  577. }
  578. icn->panel_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 1, 0);
  579. if (IS_ERR(icn->panel_bridge))
  580. return PTR_ERR(icn->panel_bridge);
  581. return 0;
  582. }
  583. static int chipone_common_probe(struct device *dev, struct chipone **icnr)
  584. {
  585. struct chipone *icn;
  586. int ret;
  587. icn = devm_drm_bridge_alloc(dev, struct chipone, bridge,
  588. &chipone_bridge_funcs);
  589. if (IS_ERR(icn))
  590. return PTR_ERR(icn);
  591. icn->dev = dev;
  592. ret = chipone_parse_dt(icn);
  593. if (ret)
  594. return ret;
  595. icn->bridge.type = DRM_MODE_CONNECTOR_DPI;
  596. icn->bridge.of_node = dev->of_node;
  597. *icnr = icn;
  598. return ret;
  599. }
  600. static int chipone_dsi_probe(struct mipi_dsi_device *dsi)
  601. {
  602. struct device *dev = &dsi->dev;
  603. struct chipone *icn;
  604. int ret;
  605. ret = chipone_common_probe(dev, &icn);
  606. if (ret)
  607. return ret;
  608. icn->regmap = devm_regmap_init(dev, &chipone_dsi_regmap_bus,
  609. dsi, &chipone_regmap_config);
  610. if (IS_ERR(icn->regmap))
  611. return PTR_ERR(icn->regmap);
  612. icn->interface_i2c = false;
  613. icn->dsi = dsi;
  614. mipi_dsi_set_drvdata(dsi, icn);
  615. drm_bridge_add(&icn->bridge);
  616. ret = chipone_dsi_attach(icn);
  617. if (ret)
  618. drm_bridge_remove(&icn->bridge);
  619. return ret;
  620. }
  621. static int chipone_i2c_probe(struct i2c_client *client)
  622. {
  623. struct device *dev = &client->dev;
  624. struct chipone *icn;
  625. int ret;
  626. ret = chipone_common_probe(dev, &icn);
  627. if (ret)
  628. return ret;
  629. icn->regmap = devm_regmap_init_i2c(client, &chipone_regmap_config);
  630. if (IS_ERR(icn->regmap))
  631. return PTR_ERR(icn->regmap);
  632. icn->interface_i2c = true;
  633. icn->client = client;
  634. dev_set_drvdata(dev, icn);
  635. i2c_set_clientdata(client, icn);
  636. drm_bridge_add(&icn->bridge);
  637. return chipone_dsi_host_attach(icn);
  638. }
  639. static void chipone_dsi_remove(struct mipi_dsi_device *dsi)
  640. {
  641. struct chipone *icn = mipi_dsi_get_drvdata(dsi);
  642. mipi_dsi_detach(dsi);
  643. drm_bridge_remove(&icn->bridge);
  644. }
  645. static const struct of_device_id chipone_of_match[] = {
  646. { .compatible = "chipone,icn6211", },
  647. { /* sentinel */ }
  648. };
  649. MODULE_DEVICE_TABLE(of, chipone_of_match);
  650. static struct mipi_dsi_driver chipone_dsi_driver = {
  651. .probe = chipone_dsi_probe,
  652. .remove = chipone_dsi_remove,
  653. .driver = {
  654. .name = "chipone-icn6211",
  655. .of_match_table = chipone_of_match,
  656. },
  657. };
  658. static const struct i2c_device_id chipone_i2c_id[] = {
  659. { "chipone,icn6211" },
  660. {},
  661. };
  662. MODULE_DEVICE_TABLE(i2c, chipone_i2c_id);
  663. static struct i2c_driver chipone_i2c_driver = {
  664. .probe = chipone_i2c_probe,
  665. .id_table = chipone_i2c_id,
  666. .driver = {
  667. .name = "chipone-icn6211-i2c",
  668. .of_match_table = chipone_of_match,
  669. },
  670. };
  671. static int __init chipone_init(void)
  672. {
  673. if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
  674. mipi_dsi_driver_register(&chipone_dsi_driver);
  675. return i2c_add_driver(&chipone_i2c_driver);
  676. }
  677. module_init(chipone_init);
  678. static void __exit chipone_exit(void)
  679. {
  680. i2c_del_driver(&chipone_i2c_driver);
  681. if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
  682. mipi_dsi_driver_unregister(&chipone_dsi_driver);
  683. }
  684. module_exit(chipone_exit);
  685. MODULE_AUTHOR("Jagan Teki <jagan@amarulasolutions.com>");
  686. MODULE_DESCRIPTION("Chipone ICN6211 MIPI-DSI to RGB Converter Bridge");
  687. MODULE_LICENSE("GPL");