ti-sn65dsi83.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * TI SN65DSI83,84,85 driver
  4. *
  5. * Currently supported:
  6. * - SN65DSI83
  7. * = 1x Single-link DSI ~ 1x Single-link LVDS
  8. * - Supported
  9. * - Single-link LVDS mode tested
  10. * - SN65DSI84
  11. * = 1x Single-link DSI ~ 2x Single-link or 1x Dual-link LVDS
  12. * - Supported
  13. * - Dual-link LVDS mode tested
  14. * - 2x Single-link LVDS mode unsupported
  15. * (should be easy to add by someone who has the HW)
  16. * - SN65DSI85
  17. * = 2x Single-link or 1x Dual-link DSI ~ 2x Single-link or 1x Dual-link LVDS
  18. * - Unsupported
  19. * (should be easy to add by someone who has the HW)
  20. *
  21. * Copyright (C) 2021 Marek Vasut <[email protected]>
  22. *
  23. * Based on previous work of:
  24. * Valentin Raevsky <[email protected]>
  25. * Philippe Schenker <[email protected]>
  26. */
  27. #include <linux/bits.h>
  28. #include <linux/clk.h>
  29. #include <linux/gpio/consumer.h>
  30. #include <linux/i2c.h>
  31. #include <linux/media-bus-format.h>
  32. #include <linux/module.h>
  33. #include <linux/of_device.h>
  34. #include <linux/of_graph.h>
  35. #include <linux/regmap.h>
  36. #include <linux/regulator/consumer.h>
  37. #include <drm/drm_atomic_helper.h>
  38. #include <drm/drm_bridge.h>
  39. #include <drm/drm_mipi_dsi.h>
  40. #include <drm/drm_of.h>
  41. #include <drm/drm_panel.h>
  42. #include <drm/drm_print.h>
  43. #include <drm/drm_probe_helper.h>
  44. /* ID registers */
  45. #define REG_ID(n) (0x00 + (n))
  46. /* Reset and clock registers */
  47. #define REG_RC_RESET 0x09
  48. #define REG_RC_RESET_SOFT_RESET BIT(0)
  49. #define REG_RC_LVDS_PLL 0x0a
  50. #define REG_RC_LVDS_PLL_PLL_EN_STAT BIT(7)
  51. #define REG_RC_LVDS_PLL_LVDS_CLK_RANGE(n) (((n) & 0x7) << 1)
  52. #define REG_RC_LVDS_PLL_HS_CLK_SRC_DPHY BIT(0)
  53. #define REG_RC_DSI_CLK 0x0b
  54. #define REG_RC_DSI_CLK_DSI_CLK_DIVIDER(n) (((n) & 0x1f) << 3)
  55. #define REG_RC_DSI_CLK_REFCLK_MULTIPLIER(n) ((n) & 0x3)
  56. #define REG_RC_PLL_EN 0x0d
  57. #define REG_RC_PLL_EN_PLL_EN BIT(0)
  58. /* DSI registers */
  59. #define REG_DSI_LANE 0x10
  60. #define REG_DSI_LANE_LEFT_RIGHT_PIXELS BIT(7) /* DSI85-only */
  61. #define REG_DSI_LANE_DSI_CHANNEL_MODE_DUAL 0 /* DSI85-only */
  62. #define REG_DSI_LANE_DSI_CHANNEL_MODE_2SINGLE BIT(6) /* DSI85-only */
  63. #define REG_DSI_LANE_DSI_CHANNEL_MODE_SINGLE BIT(5)
  64. #define REG_DSI_LANE_CHA_DSI_LANES(n) (((n) & 0x3) << 3)
  65. #define REG_DSI_LANE_CHB_DSI_LANES(n) (((n) & 0x3) << 1)
  66. #define REG_DSI_LANE_SOT_ERR_TOL_DIS BIT(0)
  67. #define REG_DSI_EQ 0x11
  68. #define REG_DSI_EQ_CHA_DSI_DATA_EQ(n) (((n) & 0x3) << 6)
  69. #define REG_DSI_EQ_CHA_DSI_CLK_EQ(n) (((n) & 0x3) << 2)
  70. #define REG_DSI_CLK 0x12
  71. #define REG_DSI_CLK_CHA_DSI_CLK_RANGE(n) ((n) & 0xff)
  72. /* LVDS registers */
  73. #define REG_LVDS_FMT 0x18
  74. #define REG_LVDS_FMT_DE_NEG_POLARITY BIT(7)
  75. #define REG_LVDS_FMT_HS_NEG_POLARITY BIT(6)
  76. #define REG_LVDS_FMT_VS_NEG_POLARITY BIT(5)
  77. #define REG_LVDS_FMT_LVDS_LINK_CFG BIT(4) /* 0:AB 1:A-only */
  78. #define REG_LVDS_FMT_CHA_24BPP_MODE BIT(3)
  79. #define REG_LVDS_FMT_CHB_24BPP_MODE BIT(2)
  80. #define REG_LVDS_FMT_CHA_24BPP_FORMAT1 BIT(1)
  81. #define REG_LVDS_FMT_CHB_24BPP_FORMAT1 BIT(0)
  82. #define REG_LVDS_VCOM 0x19
  83. #define REG_LVDS_VCOM_CHA_LVDS_VOCM BIT(6)
  84. #define REG_LVDS_VCOM_CHB_LVDS_VOCM BIT(4)
  85. #define REG_LVDS_VCOM_CHA_LVDS_VOD_SWING(n) (((n) & 0x3) << 2)
  86. #define REG_LVDS_VCOM_CHB_LVDS_VOD_SWING(n) ((n) & 0x3)
  87. #define REG_LVDS_LANE 0x1a
  88. #define REG_LVDS_LANE_EVEN_ODD_SWAP BIT(6)
  89. #define REG_LVDS_LANE_CHA_REVERSE_LVDS BIT(5)
  90. #define REG_LVDS_LANE_CHB_REVERSE_LVDS BIT(4)
  91. #define REG_LVDS_LANE_CHA_LVDS_TERM BIT(1)
  92. #define REG_LVDS_LANE_CHB_LVDS_TERM BIT(0)
  93. #define REG_LVDS_CM 0x1b
  94. #define REG_LVDS_CM_CHA_LVDS_CM_ADJUST(n) (((n) & 0x3) << 4)
  95. #define REG_LVDS_CM_CHB_LVDS_CM_ADJUST(n) ((n) & 0x3)
  96. /* Video registers */
  97. #define REG_VID_CHA_ACTIVE_LINE_LENGTH_LOW 0x20
  98. #define REG_VID_CHA_ACTIVE_LINE_LENGTH_HIGH 0x21
  99. #define REG_VID_CHA_VERTICAL_DISPLAY_SIZE_LOW 0x24
  100. #define REG_VID_CHA_VERTICAL_DISPLAY_SIZE_HIGH 0x25
  101. #define REG_VID_CHA_SYNC_DELAY_LOW 0x28
  102. #define REG_VID_CHA_SYNC_DELAY_HIGH 0x29
  103. #define REG_VID_CHA_HSYNC_PULSE_WIDTH_LOW 0x2c
  104. #define REG_VID_CHA_HSYNC_PULSE_WIDTH_HIGH 0x2d
  105. #define REG_VID_CHA_VSYNC_PULSE_WIDTH_LOW 0x30
  106. #define REG_VID_CHA_VSYNC_PULSE_WIDTH_HIGH 0x31
  107. #define REG_VID_CHA_HORIZONTAL_BACK_PORCH 0x34
  108. #define REG_VID_CHA_VERTICAL_BACK_PORCH 0x36
  109. #define REG_VID_CHA_HORIZONTAL_FRONT_PORCH 0x38
  110. #define REG_VID_CHA_VERTICAL_FRONT_PORCH 0x3a
  111. #define REG_VID_CHA_TEST_PATTERN 0x3c
  112. /* IRQ registers */
  113. #define REG_IRQ_GLOBAL 0xe0
  114. #define REG_IRQ_GLOBAL_IRQ_EN BIT(0)
  115. #define REG_IRQ_EN 0xe1
  116. #define REG_IRQ_EN_CHA_SYNCH_ERR_EN BIT(7)
  117. #define REG_IRQ_EN_CHA_CRC_ERR_EN BIT(6)
  118. #define REG_IRQ_EN_CHA_UNC_ECC_ERR_EN BIT(5)
  119. #define REG_IRQ_EN_CHA_COR_ECC_ERR_EN BIT(4)
  120. #define REG_IRQ_EN_CHA_LLP_ERR_EN BIT(3)
  121. #define REG_IRQ_EN_CHA_SOT_BIT_ERR_EN BIT(2)
  122. #define REG_IRQ_EN_CHA_PLL_UNLOCK_EN BIT(0)
  123. #define REG_IRQ_STAT 0xe5
  124. #define REG_IRQ_STAT_CHA_SYNCH_ERR BIT(7)
  125. #define REG_IRQ_STAT_CHA_CRC_ERR BIT(6)
  126. #define REG_IRQ_STAT_CHA_UNC_ECC_ERR BIT(5)
  127. #define REG_IRQ_STAT_CHA_COR_ECC_ERR BIT(4)
  128. #define REG_IRQ_STAT_CHA_LLP_ERR BIT(3)
  129. #define REG_IRQ_STAT_CHA_SOT_BIT_ERR BIT(2)
  130. #define REG_IRQ_STAT_CHA_PLL_UNLOCK BIT(0)
  131. enum sn65dsi83_model {
  132. MODEL_SN65DSI83,
  133. MODEL_SN65DSI84,
  134. };
  135. struct sn65dsi83 {
  136. struct drm_bridge bridge;
  137. struct device *dev;
  138. struct regmap *regmap;
  139. struct mipi_dsi_device *dsi;
  140. struct drm_bridge *panel_bridge;
  141. struct gpio_desc *enable_gpio;
  142. struct regulator *vcc;
  143. bool lvds_dual_link;
  144. bool lvds_dual_link_even_odd_swap;
  145. };
  146. static const struct regmap_range sn65dsi83_readable_ranges[] = {
  147. regmap_reg_range(REG_ID(0), REG_ID(8)),
  148. regmap_reg_range(REG_RC_LVDS_PLL, REG_RC_DSI_CLK),
  149. regmap_reg_range(REG_RC_PLL_EN, REG_RC_PLL_EN),
  150. regmap_reg_range(REG_DSI_LANE, REG_DSI_CLK),
  151. regmap_reg_range(REG_LVDS_FMT, REG_LVDS_CM),
  152. regmap_reg_range(REG_VID_CHA_ACTIVE_LINE_LENGTH_LOW,
  153. REG_VID_CHA_ACTIVE_LINE_LENGTH_HIGH),
  154. regmap_reg_range(REG_VID_CHA_VERTICAL_DISPLAY_SIZE_LOW,
  155. REG_VID_CHA_VERTICAL_DISPLAY_SIZE_HIGH),
  156. regmap_reg_range(REG_VID_CHA_SYNC_DELAY_LOW,
  157. REG_VID_CHA_SYNC_DELAY_HIGH),
  158. regmap_reg_range(REG_VID_CHA_HSYNC_PULSE_WIDTH_LOW,
  159. REG_VID_CHA_HSYNC_PULSE_WIDTH_HIGH),
  160. regmap_reg_range(REG_VID_CHA_VSYNC_PULSE_WIDTH_LOW,
  161. REG_VID_CHA_VSYNC_PULSE_WIDTH_HIGH),
  162. regmap_reg_range(REG_VID_CHA_HORIZONTAL_BACK_PORCH,
  163. REG_VID_CHA_HORIZONTAL_BACK_PORCH),
  164. regmap_reg_range(REG_VID_CHA_VERTICAL_BACK_PORCH,
  165. REG_VID_CHA_VERTICAL_BACK_PORCH),
  166. regmap_reg_range(REG_VID_CHA_HORIZONTAL_FRONT_PORCH,
  167. REG_VID_CHA_HORIZONTAL_FRONT_PORCH),
  168. regmap_reg_range(REG_VID_CHA_VERTICAL_FRONT_PORCH,
  169. REG_VID_CHA_VERTICAL_FRONT_PORCH),
  170. regmap_reg_range(REG_VID_CHA_TEST_PATTERN, REG_VID_CHA_TEST_PATTERN),
  171. regmap_reg_range(REG_IRQ_GLOBAL, REG_IRQ_EN),
  172. regmap_reg_range(REG_IRQ_STAT, REG_IRQ_STAT),
  173. };
  174. static const struct regmap_access_table sn65dsi83_readable_table = {
  175. .yes_ranges = sn65dsi83_readable_ranges,
  176. .n_yes_ranges = ARRAY_SIZE(sn65dsi83_readable_ranges),
  177. };
  178. static const struct regmap_range sn65dsi83_writeable_ranges[] = {
  179. regmap_reg_range(REG_RC_RESET, REG_RC_DSI_CLK),
  180. regmap_reg_range(REG_RC_PLL_EN, REG_RC_PLL_EN),
  181. regmap_reg_range(REG_DSI_LANE, REG_DSI_CLK),
  182. regmap_reg_range(REG_LVDS_FMT, REG_LVDS_CM),
  183. regmap_reg_range(REG_VID_CHA_ACTIVE_LINE_LENGTH_LOW,
  184. REG_VID_CHA_ACTIVE_LINE_LENGTH_HIGH),
  185. regmap_reg_range(REG_VID_CHA_VERTICAL_DISPLAY_SIZE_LOW,
  186. REG_VID_CHA_VERTICAL_DISPLAY_SIZE_HIGH),
  187. regmap_reg_range(REG_VID_CHA_SYNC_DELAY_LOW,
  188. REG_VID_CHA_SYNC_DELAY_HIGH),
  189. regmap_reg_range(REG_VID_CHA_HSYNC_PULSE_WIDTH_LOW,
  190. REG_VID_CHA_HSYNC_PULSE_WIDTH_HIGH),
  191. regmap_reg_range(REG_VID_CHA_VSYNC_PULSE_WIDTH_LOW,
  192. REG_VID_CHA_VSYNC_PULSE_WIDTH_HIGH),
  193. regmap_reg_range(REG_VID_CHA_HORIZONTAL_BACK_PORCH,
  194. REG_VID_CHA_HORIZONTAL_BACK_PORCH),
  195. regmap_reg_range(REG_VID_CHA_VERTICAL_BACK_PORCH,
  196. REG_VID_CHA_VERTICAL_BACK_PORCH),
  197. regmap_reg_range(REG_VID_CHA_HORIZONTAL_FRONT_PORCH,
  198. REG_VID_CHA_HORIZONTAL_FRONT_PORCH),
  199. regmap_reg_range(REG_VID_CHA_VERTICAL_FRONT_PORCH,
  200. REG_VID_CHA_VERTICAL_FRONT_PORCH),
  201. regmap_reg_range(REG_VID_CHA_TEST_PATTERN, REG_VID_CHA_TEST_PATTERN),
  202. regmap_reg_range(REG_IRQ_GLOBAL, REG_IRQ_EN),
  203. regmap_reg_range(REG_IRQ_STAT, REG_IRQ_STAT),
  204. };
  205. static const struct regmap_access_table sn65dsi83_writeable_table = {
  206. .yes_ranges = sn65dsi83_writeable_ranges,
  207. .n_yes_ranges = ARRAY_SIZE(sn65dsi83_writeable_ranges),
  208. };
  209. static const struct regmap_range sn65dsi83_volatile_ranges[] = {
  210. regmap_reg_range(REG_RC_RESET, REG_RC_RESET),
  211. regmap_reg_range(REG_RC_LVDS_PLL, REG_RC_LVDS_PLL),
  212. regmap_reg_range(REG_IRQ_STAT, REG_IRQ_STAT),
  213. };
  214. static const struct regmap_access_table sn65dsi83_volatile_table = {
  215. .yes_ranges = sn65dsi83_volatile_ranges,
  216. .n_yes_ranges = ARRAY_SIZE(sn65dsi83_volatile_ranges),
  217. };
  218. static const struct regmap_config sn65dsi83_regmap_config = {
  219. .reg_bits = 8,
  220. .val_bits = 8,
  221. .rd_table = &sn65dsi83_readable_table,
  222. .wr_table = &sn65dsi83_writeable_table,
  223. .volatile_table = &sn65dsi83_volatile_table,
  224. .cache_type = REGCACHE_RBTREE,
  225. .max_register = REG_IRQ_STAT,
  226. };
  227. static struct sn65dsi83 *bridge_to_sn65dsi83(struct drm_bridge *bridge)
  228. {
  229. return container_of(bridge, struct sn65dsi83, bridge);
  230. }
  231. static int sn65dsi83_attach(struct drm_bridge *bridge,
  232. enum drm_bridge_attach_flags flags)
  233. {
  234. struct sn65dsi83 *ctx = bridge_to_sn65dsi83(bridge);
  235. return drm_bridge_attach(bridge->encoder, ctx->panel_bridge,
  236. &ctx->bridge, flags);
  237. }
  238. static void sn65dsi83_detach(struct drm_bridge *bridge)
  239. {
  240. struct sn65dsi83 *ctx = bridge_to_sn65dsi83(bridge);
  241. if (!ctx->dsi)
  242. return;
  243. ctx->dsi = NULL;
  244. }
  245. static u8 sn65dsi83_get_lvds_range(struct sn65dsi83 *ctx,
  246. const struct drm_display_mode *mode)
  247. {
  248. /*
  249. * The encoding of the LVDS_CLK_RANGE is as follows:
  250. * 000 - 25 MHz <= LVDS_CLK < 37.5 MHz
  251. * 001 - 37.5 MHz <= LVDS_CLK < 62.5 MHz
  252. * 010 - 62.5 MHz <= LVDS_CLK < 87.5 MHz
  253. * 011 - 87.5 MHz <= LVDS_CLK < 112.5 MHz
  254. * 100 - 112.5 MHz <= LVDS_CLK < 137.5 MHz
  255. * 101 - 137.5 MHz <= LVDS_CLK <= 154 MHz
  256. * which is a range of 12.5MHz..162.5MHz in 50MHz steps, except that
  257. * the ends of the ranges are clamped to the supported range. Since
  258. * sn65dsi83_mode_valid() already filters the valid modes and limits
  259. * the clock to 25..154 MHz, the range calculation can be simplified
  260. * as follows:
  261. */
  262. int mode_clock = mode->clock;
  263. if (ctx->lvds_dual_link)
  264. mode_clock /= 2;
  265. return (mode_clock - 12500) / 25000;
  266. }
  267. static u8 sn65dsi83_get_dsi_range(struct sn65dsi83 *ctx,
  268. const struct drm_display_mode *mode)
  269. {
  270. /*
  271. * The encoding of the CHA_DSI_CLK_RANGE is as follows:
  272. * 0x00 through 0x07 - Reserved
  273. * 0x08 - 40 <= DSI_CLK < 45 MHz
  274. * 0x09 - 45 <= DSI_CLK < 50 MHz
  275. * ...
  276. * 0x63 - 495 <= DSI_CLK < 500 MHz
  277. * 0x64 - 500 MHz
  278. * 0x65 through 0xFF - Reserved
  279. * which is DSI clock in 5 MHz steps, clamped to 40..500 MHz.
  280. * The DSI clock are calculated as:
  281. * DSI_CLK = mode clock * bpp / dsi_data_lanes / 2
  282. * the 2 is there because the bus is DDR.
  283. */
  284. return DIV_ROUND_UP(clamp((unsigned int)mode->clock *
  285. mipi_dsi_pixel_format_to_bpp(ctx->dsi->format) /
  286. ctx->dsi->lanes / 2, 40000U, 500000U), 5000U);
  287. }
  288. static u8 sn65dsi83_get_dsi_div(struct sn65dsi83 *ctx)
  289. {
  290. /* The divider is (DSI_CLK / LVDS_CLK) - 1, which really is: */
  291. unsigned int dsi_div = mipi_dsi_pixel_format_to_bpp(ctx->dsi->format);
  292. dsi_div /= ctx->dsi->lanes;
  293. if (!ctx->lvds_dual_link)
  294. dsi_div /= 2;
  295. return dsi_div - 1;
  296. }
  297. static void sn65dsi83_atomic_enable(struct drm_bridge *bridge,
  298. struct drm_bridge_state *old_bridge_state)
  299. {
  300. struct sn65dsi83 *ctx = bridge_to_sn65dsi83(bridge);
  301. struct drm_atomic_state *state = old_bridge_state->base.state;
  302. const struct drm_bridge_state *bridge_state;
  303. const struct drm_crtc_state *crtc_state;
  304. const struct drm_display_mode *mode;
  305. struct drm_connector *connector;
  306. struct drm_crtc *crtc;
  307. bool lvds_format_24bpp;
  308. bool lvds_format_jeida;
  309. unsigned int pval;
  310. __le16 le16val;
  311. u16 val;
  312. int ret;
  313. ret = regulator_enable(ctx->vcc);
  314. if (ret) {
  315. dev_err(ctx->dev, "Failed to enable vcc: %d\n", ret);
  316. return;
  317. }
  318. /* Deassert reset */
  319. gpiod_set_value_cansleep(ctx->enable_gpio, 1);
  320. usleep_range(10000, 11000);
  321. /* Get the LVDS format from the bridge state. */
  322. bridge_state = drm_atomic_get_new_bridge_state(state, bridge);
  323. switch (bridge_state->output_bus_cfg.format) {
  324. case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
  325. lvds_format_24bpp = false;
  326. lvds_format_jeida = true;
  327. break;
  328. case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
  329. lvds_format_24bpp = true;
  330. lvds_format_jeida = true;
  331. break;
  332. case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
  333. lvds_format_24bpp = true;
  334. lvds_format_jeida = false;
  335. break;
  336. default:
  337. /*
  338. * Some bridges still don't set the correct
  339. * LVDS bus pixel format, use SPWG24 default
  340. * format until those are fixed.
  341. */
  342. lvds_format_24bpp = true;
  343. lvds_format_jeida = false;
  344. dev_warn(ctx->dev,
  345. "Unsupported LVDS bus format 0x%04x, please check output bridge driver. Falling back to SPWG24.\n",
  346. bridge_state->output_bus_cfg.format);
  347. break;
  348. }
  349. /*
  350. * Retrieve the CRTC adjusted mode. This requires a little dance to go
  351. * from the bridge to the encoder, to the connector and to the CRTC.
  352. */
  353. connector = drm_atomic_get_new_connector_for_encoder(state,
  354. bridge->encoder);
  355. crtc = drm_atomic_get_new_connector_state(state, connector)->crtc;
  356. crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
  357. mode = &crtc_state->adjusted_mode;
  358. /* Clear reset, disable PLL */
  359. regmap_write(ctx->regmap, REG_RC_RESET, 0x00);
  360. regmap_write(ctx->regmap, REG_RC_PLL_EN, 0x00);
  361. /* Reference clock derived from DSI link clock. */
  362. regmap_write(ctx->regmap, REG_RC_LVDS_PLL,
  363. REG_RC_LVDS_PLL_LVDS_CLK_RANGE(sn65dsi83_get_lvds_range(ctx, mode)) |
  364. REG_RC_LVDS_PLL_HS_CLK_SRC_DPHY);
  365. regmap_write(ctx->regmap, REG_DSI_CLK,
  366. REG_DSI_CLK_CHA_DSI_CLK_RANGE(sn65dsi83_get_dsi_range(ctx, mode)));
  367. regmap_write(ctx->regmap, REG_RC_DSI_CLK,
  368. REG_RC_DSI_CLK_DSI_CLK_DIVIDER(sn65dsi83_get_dsi_div(ctx)));
  369. /* Set number of DSI lanes and LVDS link config. */
  370. regmap_write(ctx->regmap, REG_DSI_LANE,
  371. REG_DSI_LANE_DSI_CHANNEL_MODE_SINGLE |
  372. REG_DSI_LANE_CHA_DSI_LANES(~(ctx->dsi->lanes - 1)) |
  373. /* CHB is DSI85-only, set to default on DSI83/DSI84 */
  374. REG_DSI_LANE_CHB_DSI_LANES(3));
  375. /* No equalization. */
  376. regmap_write(ctx->regmap, REG_DSI_EQ, 0x00);
  377. /* Set up sync signal polarity. */
  378. val = (mode->flags & DRM_MODE_FLAG_NHSYNC ?
  379. REG_LVDS_FMT_HS_NEG_POLARITY : 0) |
  380. (mode->flags & DRM_MODE_FLAG_NVSYNC ?
  381. REG_LVDS_FMT_VS_NEG_POLARITY : 0);
  382. /* Set up bits-per-pixel, 18bpp or 24bpp. */
  383. if (lvds_format_24bpp) {
  384. val |= REG_LVDS_FMT_CHA_24BPP_MODE;
  385. if (ctx->lvds_dual_link)
  386. val |= REG_LVDS_FMT_CHB_24BPP_MODE;
  387. }
  388. /* Set up LVDS format, JEIDA/Format 1 or SPWG/Format 2 */
  389. if (lvds_format_jeida) {
  390. val |= REG_LVDS_FMT_CHA_24BPP_FORMAT1;
  391. if (ctx->lvds_dual_link)
  392. val |= REG_LVDS_FMT_CHB_24BPP_FORMAT1;
  393. }
  394. /* Set up LVDS output config (DSI84,DSI85) */
  395. if (!ctx->lvds_dual_link)
  396. val |= REG_LVDS_FMT_LVDS_LINK_CFG;
  397. regmap_write(ctx->regmap, REG_LVDS_FMT, val);
  398. regmap_write(ctx->regmap, REG_LVDS_VCOM, 0x05);
  399. regmap_write(ctx->regmap, REG_LVDS_LANE,
  400. (ctx->lvds_dual_link_even_odd_swap ?
  401. REG_LVDS_LANE_EVEN_ODD_SWAP : 0) |
  402. REG_LVDS_LANE_CHA_LVDS_TERM |
  403. REG_LVDS_LANE_CHB_LVDS_TERM);
  404. regmap_write(ctx->regmap, REG_LVDS_CM, 0x00);
  405. le16val = cpu_to_le16(mode->hdisplay);
  406. regmap_bulk_write(ctx->regmap, REG_VID_CHA_ACTIVE_LINE_LENGTH_LOW,
  407. &le16val, 2);
  408. le16val = cpu_to_le16(mode->vdisplay);
  409. regmap_bulk_write(ctx->regmap, REG_VID_CHA_VERTICAL_DISPLAY_SIZE_LOW,
  410. &le16val, 2);
  411. /* 32 + 1 pixel clock to ensure proper operation */
  412. le16val = cpu_to_le16(32 + 1);
  413. regmap_bulk_write(ctx->regmap, REG_VID_CHA_SYNC_DELAY_LOW, &le16val, 2);
  414. le16val = cpu_to_le16(mode->hsync_end - mode->hsync_start);
  415. regmap_bulk_write(ctx->regmap, REG_VID_CHA_HSYNC_PULSE_WIDTH_LOW,
  416. &le16val, 2);
  417. le16val = cpu_to_le16(mode->vsync_end - mode->vsync_start);
  418. regmap_bulk_write(ctx->regmap, REG_VID_CHA_VSYNC_PULSE_WIDTH_LOW,
  419. &le16val, 2);
  420. regmap_write(ctx->regmap, REG_VID_CHA_HORIZONTAL_BACK_PORCH,
  421. mode->htotal - mode->hsync_end);
  422. regmap_write(ctx->regmap, REG_VID_CHA_VERTICAL_BACK_PORCH,
  423. mode->vtotal - mode->vsync_end);
  424. regmap_write(ctx->regmap, REG_VID_CHA_HORIZONTAL_FRONT_PORCH,
  425. mode->hsync_start - mode->hdisplay);
  426. regmap_write(ctx->regmap, REG_VID_CHA_VERTICAL_FRONT_PORCH,
  427. mode->vsync_start - mode->vdisplay);
  428. regmap_write(ctx->regmap, REG_VID_CHA_TEST_PATTERN, 0x00);
  429. /* Enable PLL */
  430. regmap_write(ctx->regmap, REG_RC_PLL_EN, REG_RC_PLL_EN_PLL_EN);
  431. usleep_range(3000, 4000);
  432. ret = regmap_read_poll_timeout(ctx->regmap, REG_RC_LVDS_PLL, pval,
  433. pval & REG_RC_LVDS_PLL_PLL_EN_STAT,
  434. 1000, 100000);
  435. if (ret) {
  436. dev_err(ctx->dev, "failed to lock PLL, ret=%i\n", ret);
  437. /* On failure, disable PLL again and exit. */
  438. regmap_write(ctx->regmap, REG_RC_PLL_EN, 0x00);
  439. regulator_disable(ctx->vcc);
  440. return;
  441. }
  442. /* Trigger reset after CSR register update. */
  443. regmap_write(ctx->regmap, REG_RC_RESET, REG_RC_RESET_SOFT_RESET);
  444. /* Clear all errors that got asserted during initialization. */
  445. regmap_read(ctx->regmap, REG_IRQ_STAT, &pval);
  446. regmap_write(ctx->regmap, REG_IRQ_STAT, pval);
  447. usleep_range(10000, 12000);
  448. regmap_read(ctx->regmap, REG_IRQ_STAT, &pval);
  449. if (pval)
  450. dev_err(ctx->dev, "Unexpected link status 0x%02x\n", pval);
  451. }
  452. static void sn65dsi83_atomic_disable(struct drm_bridge *bridge,
  453. struct drm_bridge_state *old_bridge_state)
  454. {
  455. struct sn65dsi83 *ctx = bridge_to_sn65dsi83(bridge);
  456. int ret;
  457. /* Put the chip in reset, pull EN line low, and assure 10ms reset low timing. */
  458. gpiod_set_value_cansleep(ctx->enable_gpio, 0);
  459. usleep_range(10000, 11000);
  460. ret = regulator_disable(ctx->vcc);
  461. if (ret)
  462. dev_err(ctx->dev, "Failed to disable vcc: %d\n", ret);
  463. regcache_mark_dirty(ctx->regmap);
  464. }
  465. static enum drm_mode_status
  466. sn65dsi83_mode_valid(struct drm_bridge *bridge,
  467. const struct drm_display_info *info,
  468. const struct drm_display_mode *mode)
  469. {
  470. /* LVDS output clock range 25..154 MHz */
  471. if (mode->clock < 25000)
  472. return MODE_CLOCK_LOW;
  473. if (mode->clock > 154000)
  474. return MODE_CLOCK_HIGH;
  475. return MODE_OK;
  476. }
  477. #define MAX_INPUT_SEL_FORMATS 1
  478. static u32 *
  479. sn65dsi83_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
  480. struct drm_bridge_state *bridge_state,
  481. struct drm_crtc_state *crtc_state,
  482. struct drm_connector_state *conn_state,
  483. u32 output_fmt,
  484. unsigned int *num_input_fmts)
  485. {
  486. u32 *input_fmts;
  487. *num_input_fmts = 0;
  488. input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
  489. GFP_KERNEL);
  490. if (!input_fmts)
  491. return NULL;
  492. /* This is the DSI-end bus format */
  493. input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
  494. *num_input_fmts = 1;
  495. return input_fmts;
  496. }
  497. static const struct drm_bridge_funcs sn65dsi83_funcs = {
  498. .attach = sn65dsi83_attach,
  499. .detach = sn65dsi83_detach,
  500. .atomic_enable = sn65dsi83_atomic_enable,
  501. .atomic_disable = sn65dsi83_atomic_disable,
  502. .mode_valid = sn65dsi83_mode_valid,
  503. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  504. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  505. .atomic_reset = drm_atomic_helper_bridge_reset,
  506. .atomic_get_input_bus_fmts = sn65dsi83_atomic_get_input_bus_fmts,
  507. };
  508. static int sn65dsi83_parse_dt(struct sn65dsi83 *ctx, enum sn65dsi83_model model)
  509. {
  510. struct drm_bridge *panel_bridge;
  511. struct device *dev = ctx->dev;
  512. ctx->lvds_dual_link = false;
  513. ctx->lvds_dual_link_even_odd_swap = false;
  514. if (model != MODEL_SN65DSI83) {
  515. struct device_node *port2, *port3;
  516. int dual_link;
  517. port2 = of_graph_get_port_by_id(dev->of_node, 2);
  518. port3 = of_graph_get_port_by_id(dev->of_node, 3);
  519. dual_link = drm_of_lvds_get_dual_link_pixel_order(port2, port3);
  520. of_node_put(port2);
  521. of_node_put(port3);
  522. if (dual_link == DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS) {
  523. ctx->lvds_dual_link = true;
  524. /* Odd pixels to LVDS Channel A, even pixels to B */
  525. ctx->lvds_dual_link_even_odd_swap = false;
  526. } else if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS) {
  527. ctx->lvds_dual_link = true;
  528. /* Even pixels to LVDS Channel A, odd pixels to B */
  529. ctx->lvds_dual_link_even_odd_swap = true;
  530. }
  531. }
  532. panel_bridge = devm_drm_of_get_bridge(dev, dev->of_node, 2, 0);
  533. if (IS_ERR(panel_bridge))
  534. return PTR_ERR(panel_bridge);
  535. ctx->panel_bridge = panel_bridge;
  536. ctx->vcc = devm_regulator_get(dev, "vcc");
  537. if (IS_ERR(ctx->vcc))
  538. return dev_err_probe(dev, PTR_ERR(ctx->vcc),
  539. "Failed to get supply 'vcc'\n");
  540. return 0;
  541. }
  542. static int sn65dsi83_host_attach(struct sn65dsi83 *ctx)
  543. {
  544. struct device *dev = ctx->dev;
  545. struct device_node *host_node;
  546. struct device_node *endpoint;
  547. struct mipi_dsi_device *dsi;
  548. struct mipi_dsi_host *host;
  549. const struct mipi_dsi_device_info info = {
  550. .type = "sn65dsi83",
  551. .channel = 0,
  552. .node = NULL,
  553. };
  554. int dsi_lanes, ret;
  555. endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1);
  556. dsi_lanes = drm_of_get_data_lanes_count(endpoint, 1, 4);
  557. host_node = of_graph_get_remote_port_parent(endpoint);
  558. host = of_find_mipi_dsi_host_by_node(host_node);
  559. of_node_put(host_node);
  560. of_node_put(endpoint);
  561. if (!host)
  562. return -EPROBE_DEFER;
  563. if (dsi_lanes < 0)
  564. return dsi_lanes;
  565. dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
  566. if (IS_ERR(dsi))
  567. return dev_err_probe(dev, PTR_ERR(dsi),
  568. "failed to create dsi device\n");
  569. ctx->dsi = dsi;
  570. dsi->lanes = dsi_lanes;
  571. dsi->format = MIPI_DSI_FMT_RGB888;
  572. dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
  573. MIPI_DSI_MODE_VIDEO_NO_HFP | MIPI_DSI_MODE_VIDEO_NO_HBP |
  574. MIPI_DSI_MODE_VIDEO_NO_HSA | MIPI_DSI_MODE_NO_EOT_PACKET;
  575. ret = devm_mipi_dsi_attach(dev, dsi);
  576. if (ret < 0) {
  577. dev_err(dev, "failed to attach dsi to host: %d\n", ret);
  578. return ret;
  579. }
  580. return 0;
  581. }
  582. static int sn65dsi83_probe(struct i2c_client *client,
  583. const struct i2c_device_id *id)
  584. {
  585. struct device *dev = &client->dev;
  586. enum sn65dsi83_model model;
  587. struct sn65dsi83 *ctx;
  588. int ret;
  589. ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
  590. if (!ctx)
  591. return -ENOMEM;
  592. ctx->dev = dev;
  593. if (dev->of_node) {
  594. model = (enum sn65dsi83_model)(uintptr_t)
  595. of_device_get_match_data(dev);
  596. } else {
  597. model = id->driver_data;
  598. }
  599. /* Put the chip in reset, pull EN line low, and assure 10ms reset low timing. */
  600. ctx->enable_gpio = devm_gpiod_get_optional(ctx->dev, "enable",
  601. GPIOD_OUT_LOW);
  602. if (IS_ERR(ctx->enable_gpio))
  603. return dev_err_probe(dev, PTR_ERR(ctx->enable_gpio), "failed to get enable GPIO\n");
  604. usleep_range(10000, 11000);
  605. ret = sn65dsi83_parse_dt(ctx, model);
  606. if (ret)
  607. return ret;
  608. ctx->regmap = devm_regmap_init_i2c(client, &sn65dsi83_regmap_config);
  609. if (IS_ERR(ctx->regmap))
  610. return dev_err_probe(dev, PTR_ERR(ctx->regmap), "failed to get regmap\n");
  611. dev_set_drvdata(dev, ctx);
  612. i2c_set_clientdata(client, ctx);
  613. ctx->bridge.funcs = &sn65dsi83_funcs;
  614. ctx->bridge.of_node = dev->of_node;
  615. drm_bridge_add(&ctx->bridge);
  616. ret = sn65dsi83_host_attach(ctx);
  617. if (ret)
  618. goto err_remove_bridge;
  619. return 0;
  620. err_remove_bridge:
  621. drm_bridge_remove(&ctx->bridge);
  622. return ret;
  623. }
  624. static void sn65dsi83_remove(struct i2c_client *client)
  625. {
  626. struct sn65dsi83 *ctx = i2c_get_clientdata(client);
  627. drm_bridge_remove(&ctx->bridge);
  628. }
  629. static struct i2c_device_id sn65dsi83_id[] = {
  630. { "ti,sn65dsi83", MODEL_SN65DSI83 },
  631. { "ti,sn65dsi84", MODEL_SN65DSI84 },
  632. {},
  633. };
  634. MODULE_DEVICE_TABLE(i2c, sn65dsi83_id);
  635. static const struct of_device_id sn65dsi83_match_table[] = {
  636. { .compatible = "ti,sn65dsi83", .data = (void *)MODEL_SN65DSI83 },
  637. { .compatible = "ti,sn65dsi84", .data = (void *)MODEL_SN65DSI84 },
  638. {},
  639. };
  640. MODULE_DEVICE_TABLE(of, sn65dsi83_match_table);
  641. static struct i2c_driver sn65dsi83_driver = {
  642. .probe = sn65dsi83_probe,
  643. .remove = sn65dsi83_remove,
  644. .id_table = sn65dsi83_id,
  645. .driver = {
  646. .name = "sn65dsi83",
  647. .of_match_table = sn65dsi83_match_table,
  648. },
  649. };
  650. module_i2c_driver(sn65dsi83_driver);
  651. MODULE_AUTHOR("Marek Vasut <[email protected]>");
  652. MODULE_DESCRIPTION("TI SN65DSI83 DSI to LVDS bridge driver");
  653. MODULE_LICENSE("GPL v2");