lvds.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2023, STMicroelectronics - All Rights Reserved
  4. * Author(s): Raphaël GALLAIS-POU <raphael.gallais-pou@foss.st.com> for STMicroelectronics.
  5. */
  6. #include <drm/drm_atomic_helper.h>
  7. #include <drm/drm_bridge.h>
  8. #include <drm/drm_device.h>
  9. #include <drm/drm_of.h>
  10. #include <drm/drm_panel.h>
  11. #include <drm/drm_print.h>
  12. #include <drm/drm_probe_helper.h>
  13. #include <linux/clk.h>
  14. #include <linux/clk-provider.h>
  15. #include <linux/io.h>
  16. #include <linux/iopoll.h>
  17. #include <linux/media-bus-format.h>
  18. #include <linux/module.h>
  19. #include <linux/of_device.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/reset.h>
  22. /* LVDS Host registers */
  23. #define LVDS_CR 0x0000 /* configuration register */
  24. #define LVDS_DMLCR0 0x0004 /* data mapping lsb configuration register 0 */
  25. #define LVDS_DMMCR0 0x0008 /* data mapping msb configuration register 0 */
  26. #define LVDS_DMLCR1 0x000C /* data mapping lsb configuration register 1 */
  27. #define LVDS_DMMCR1 0x0010 /* data mapping msb configuration register 1 */
  28. #define LVDS_DMLCR2 0x0014 /* data mapping lsb configuration register 2 */
  29. #define LVDS_DMMCR2 0x0018 /* data mapping msb configuration register 2 */
  30. #define LVDS_DMLCR3 0x001C /* data mapping lsb configuration register 3 */
  31. #define LVDS_DMMCR3 0x0020 /* data mapping msb configuration register 3 */
  32. #define LVDS_DMLCR4 0x0024 /* data mapping lsb configuration register 4 */
  33. #define LVDS_DMMCR4 0x0028 /* data mapping msb configuration register 4 */
  34. #define LVDS_CDL1CR 0x002C /* channel distrib link 1 configuration register */
  35. #define LVDS_CDL2CR 0x0030 /* channel distrib link 2 configuration register */
  36. #define CDL1CR_DEFAULT 0x04321 /* Default value for CDL1CR */
  37. #define CDL2CR_DEFAULT 0x59876 /* Default value for CDL2CR */
  38. #define LVDS_DMLCR(bit) (LVDS_DMLCR0 + 0x8 * (bit))
  39. #define LVDS_DMMCR(bit) (LVDS_DMMCR0 + 0x8 * (bit))
  40. /* LVDS Wrapper registers */
  41. #define LVDS_WCLKCR 0x11B0 /* Wrapper clock control register */
  42. #define LVDS_HWCFGR 0x1FF0 /* HW configuration register */
  43. #define LVDS_VERR 0x1FF4 /* Version register */
  44. #define LVDS_IPIDR 0x1FF8 /* Identification register */
  45. #define LVDS_SIDR 0x1FFC /* Size Identification register */
  46. /* Bitfield description */
  47. #define CR_LVDSEN BIT(0) /* LVDS PHY Enable */
  48. #define CR_HSPOL BIT(1) /* Horizontal Synchronization Polarity */
  49. #define CR_VSPOL BIT(2) /* Vertical Synchronization Polarity */
  50. #define CR_DEPOL BIT(3) /* Data Enable Polarity */
  51. #define CR_CI BIT(4) /* Control Internal (software controlled bit) */
  52. #define CR_LKMOD BIT(5) /* Link Mode, for both Links */
  53. #define CR_LKPHA BIT(6) /* Link Phase, for both Links */
  54. #define CR_LK1POL GENMASK(20, 16) /* Link-1 output Polarity */
  55. #define CR_LK2POL GENMASK(25, 21) /* Link-2 output Polarity */
  56. #define DMMCR_MAP0 GENMASK(4, 0) /* Mapping for bit 0 of datalane x */
  57. #define DMMCR_MAP1 GENMASK(9, 5) /* Mapping for bit 1 of datalane x */
  58. #define DMMCR_MAP2 GENMASK(14, 10) /* Mapping for bit 2 of datalane x */
  59. #define DMMCR_MAP3 GENMASK(19, 15) /* Mapping for bit 3 of datalane x */
  60. #define DMLCR_MAP4 GENMASK(4, 0) /* Mapping for bit 4 of datalane x */
  61. #define DMLCR_MAP5 GENMASK(9, 5) /* Mapping for bit 5 of datalane x */
  62. #define DMLCR_MAP6 GENMASK(14, 10) /* Mapping for bit 6 of datalane x */
  63. #define CDLCR_DISTR0 GENMASK(3, 0) /* Channel distribution for lane 0 */
  64. #define CDLCR_DISTR1 GENMASK(7, 4) /* Channel distribution for lane 1 */
  65. #define CDLCR_DISTR2 GENMASK(11, 8) /* Channel distribution for lane 2 */
  66. #define CDLCR_DISTR3 GENMASK(15, 12) /* Channel distribution for lane 3 */
  67. #define CDLCR_DISTR4 GENMASK(19, 16) /* Channel distribution for lane 4 */
  68. #define PHY_GCR_BIT_CLK_OUT BIT(0) /* BIT clock enable */
  69. #define PHY_GCR_LS_CLK_OUT BIT(4) /* LS clock enable */
  70. #define PHY_GCR_DP_CLK_OUT BIT(8) /* DP clock enable */
  71. #define PHY_GCR_RSTZ BIT(24) /* LVDS PHY digital reset */
  72. #define PHY_GCR_DIV_RSTN BIT(25) /* Output divider reset */
  73. #define PHY_SCR_TX_EN BIT(16) /* Transmission mode enable */
  74. /* Current mode driver enable */
  75. #define PHY_CMCR_CM_EN_DL (BIT(28) | BIT(20) | BIT(12) | BIT(4))
  76. #define PHY_CMCR_CM_EN_DL4 BIT(4)
  77. /* Bias enable */
  78. #define PHY_BCR1_EN_BIAS_DL (BIT(16) | BIT(12) | BIT(8) | BIT(4) | BIT(0))
  79. #define PHY_BCR2_BIAS_EN BIT(28)
  80. /* Voltage mode driver enable */
  81. #define PHY_BCR3_VM_EN_DL (BIT(16) | BIT(12) | BIT(8) | BIT(4) | BIT(0))
  82. #define PHY_DCR_POWER_OK BIT(12)
  83. #define PHY_CFGCR_EN_DIG_DL GENMASK(4, 0) /* LVDS PHY digital lane enable */
  84. #define PHY_PLLCR1_PLL_EN BIT(0) /* LVDS PHY PLL enable */
  85. #define PHY_PLLCR1_EN_SD BIT(1) /* LVDS PHY PLL sigma-delta signal enable */
  86. #define PHY_PLLCR1_EN_TWG BIT(2) /* LVDS PHY PLL triangular wave generator enable */
  87. #define PHY_PLLCR1_DIV_EN BIT(8) /* LVDS PHY PLL dividers enable */
  88. #define PHY_PLLCR2_NDIV GENMASK(25, 16) /* NDIV mask value */
  89. #define PHY_PLLCR2_BDIV GENMASK(9, 0) /* BDIV mask value */
  90. #define PHY_PLLSR_PLL_LOCK BIT(0) /* LVDS PHY PLL lock status */
  91. #define PHY_PLLSDCR1_MDIV GENMASK(9, 0) /* MDIV mask value */
  92. #define PHY_PLLTESTCR_TDIV GENMASK(25, 16) /* TDIV mask value */
  93. #define PHY_PLLTESTCR_CLK_EN BIT(0) /* Test clock enable */
  94. #define PHY_PLLTESTCR_EN BIT(8) /* Test divider output enable */
  95. #define WCLKCR_SECND_CLKPIX_SEL BIT(0) /* Pixel clock selection */
  96. #define WCLKCR_SRCSEL BIT(8) /* Source selection for the pixel clock */
  97. /* Sleep & timeout for pll lock/unlock */
  98. #define SLEEP_US 1000
  99. #define TIMEOUT_US 200000
  100. /*
  101. * The link phase defines whether an ODD pixel is carried over together with
  102. * the next EVEN pixel or together with the previous EVEN pixel.
  103. *
  104. * LVDS_DUAL_LINK_EVEN_ODD_PIXELS (LKPHA = 0)
  105. *
  106. * ,--------. ,--------. ,--------. ,--------. ,---------.
  107. * | ODD LK \/ PIXEL 3 \/ PIXEL 1 \/ PIXEL' 1 \/ PIXEL' 3 |
  108. * | EVEN LK /\ PIXEL 2 /\ PIXEL' 0 /\ PIXEL' 2 /\ PIXEL' 4 |
  109. * `--------' `--------' `--------' `--------' `---------'
  110. *
  111. * LVDS_DUAL_LINK_ODD_EVEN_PIXELS (LKPHA = 1)
  112. *
  113. * ,--------. ,--------. ,--------. ,--------. ,---------.
  114. * | ODD LK \/ PIXEL 3 \/ PIXEL 1 \/ PIXEL' 1 \/ PIXEL' 3 |
  115. * | EVEN LK /\ PIXEL 4 /\ PIXEL 2 /\ PIXEL' 0 /\ PIXEL' 2 |
  116. * `--------' `--------' `--------' `--------' `---------'
  117. *
  118. */
  119. enum lvds_link_type {
  120. LVDS_SINGLE_LINK_PRIMARY = 0,
  121. LVDS_SINGLE_LINK_SECONDARY,
  122. LVDS_DUAL_LINK_EVEN_ODD_PIXELS,
  123. LVDS_DUAL_LINK_ODD_EVEN_PIXELS,
  124. };
  125. enum lvds_pixel {
  126. PIX_R_0 = 0,
  127. PIX_R_1,
  128. PIX_R_2,
  129. PIX_R_3,
  130. PIX_R_4,
  131. PIX_R_5,
  132. PIX_R_6,
  133. PIX_R_7,
  134. PIX_G_0,
  135. PIX_G_1,
  136. PIX_G_2,
  137. PIX_G_3,
  138. PIX_G_4,
  139. PIX_G_5,
  140. PIX_G_6,
  141. PIX_G_7,
  142. PIX_B_0,
  143. PIX_B_1,
  144. PIX_B_2,
  145. PIX_B_3,
  146. PIX_B_4,
  147. PIX_B_5,
  148. PIX_B_6,
  149. PIX_B_7,
  150. PIX_H_S,
  151. PIX_V_S,
  152. PIX_D_E,
  153. PIX_C_E,
  154. PIX_C_I,
  155. PIX_TOG,
  156. PIX_ONE,
  157. PIX_ZER,
  158. };
  159. struct phy_reg_offsets {
  160. u32 GCR; /* Global Control Register */
  161. u32 CMCR1; /* Current Mode Control Register 1 */
  162. u32 CMCR2; /* Current Mode Control Register 2 */
  163. u32 SCR; /* Serial Control Register */
  164. u32 BCR1; /* Bias Control Register 1 */
  165. u32 BCR2; /* Bias Control Register 2 */
  166. u32 BCR3; /* Bias Control Register 3 */
  167. u32 MPLCR; /* Monitor PLL Lock Control Register */
  168. u32 DCR; /* Debug Control Register */
  169. u32 SSR1; /* Spare Status Register 1 */
  170. u32 CFGCR; /* Configuration Control Register */
  171. u32 PLLCR1; /* PLL_MODE 1 Control Register */
  172. u32 PLLCR2; /* PLL_MODE 2 Control Register */
  173. u32 PLLSR; /* PLL Status Register */
  174. u32 PLLSDCR1; /* PLL_SD_1 Control Register */
  175. u32 PLLSDCR2; /* PLL_SD_2 Control Register */
  176. u32 PLLTWGCR1;/* PLL_TWG_1 Control Register */
  177. u32 PLLTWGCR2;/* PLL_TWG_2 Control Register */
  178. u32 PLLCPCR; /* PLL_CP Control Register */
  179. u32 PLLTESTCR;/* PLL_TEST Control Register */
  180. };
  181. struct lvds_phy_info {
  182. u32 base;
  183. struct phy_reg_offsets ofs;
  184. };
  185. static struct lvds_phy_info lvds_phy_16ff_primary = {
  186. .base = 0x1000,
  187. .ofs = {
  188. .GCR = 0x0,
  189. .CMCR1 = 0xC,
  190. .CMCR2 = 0x10,
  191. .SCR = 0x20,
  192. .BCR1 = 0x2C,
  193. .BCR2 = 0x30,
  194. .BCR3 = 0x34,
  195. .MPLCR = 0x64,
  196. .DCR = 0x84,
  197. .SSR1 = 0x88,
  198. .CFGCR = 0xA0,
  199. .PLLCR1 = 0xC0,
  200. .PLLCR2 = 0xC4,
  201. .PLLSR = 0xC8,
  202. .PLLSDCR1 = 0xCC,
  203. .PLLSDCR2 = 0xD0,
  204. .PLLTWGCR1 = 0xD4,
  205. .PLLTWGCR2 = 0xD8,
  206. .PLLCPCR = 0xE0,
  207. .PLLTESTCR = 0xE8,
  208. }
  209. };
  210. static struct lvds_phy_info lvds_phy_16ff_secondary = {
  211. .base = 0x1100,
  212. .ofs = {
  213. .GCR = 0x0,
  214. .CMCR1 = 0xC,
  215. .CMCR2 = 0x10,
  216. .SCR = 0x20,
  217. .BCR1 = 0x2C,
  218. .BCR2 = 0x30,
  219. .BCR3 = 0x34,
  220. .MPLCR = 0x64,
  221. .DCR = 0x84,
  222. .SSR1 = 0x88,
  223. .CFGCR = 0xA0,
  224. .PLLCR1 = 0xC0,
  225. .PLLCR2 = 0xC4,
  226. .PLLSR = 0xC8,
  227. .PLLSDCR1 = 0xCC,
  228. .PLLSDCR2 = 0xD0,
  229. .PLLTWGCR1 = 0xD4,
  230. .PLLTWGCR2 = 0xD8,
  231. .PLLCPCR = 0xE0,
  232. .PLLTESTCR = 0xE8,
  233. }
  234. };
  235. struct stm_lvds {
  236. void __iomem *base;
  237. struct device *dev;
  238. struct clk *pclk; /* APB peripheral clock */
  239. struct clk *pllref_clk; /* Reference clock for the internal PLL */
  240. struct clk_hw lvds_ck_px; /* Pixel clock */
  241. u32 pixel_clock_rate; /* Pixel clock rate */
  242. struct lvds_phy_info *primary;
  243. struct lvds_phy_info *secondary;
  244. struct drm_bridge lvds_bridge;
  245. struct drm_bridge *next_bridge;
  246. struct drm_connector connector;
  247. struct drm_encoder *encoder;
  248. struct drm_panel *panel;
  249. u32 hw_version;
  250. u32 link_type;
  251. };
  252. #define bridge_to_stm_lvds(b) \
  253. container_of(b, struct stm_lvds, lvds_bridge)
  254. #define connector_to_stm_lvds(c) \
  255. container_of(c, struct stm_lvds, connector)
  256. #define lvds_is_dual_link(lvds) \
  257. ({ \
  258. typeof(lvds) __lvds = (lvds); \
  259. __lvds == LVDS_DUAL_LINK_EVEN_ODD_PIXELS || \
  260. __lvds == LVDS_DUAL_LINK_ODD_EVEN_PIXELS; \
  261. })
  262. static inline void lvds_write(struct stm_lvds *lvds, u32 reg, u32 val)
  263. {
  264. writel(val, lvds->base + reg);
  265. }
  266. static inline u32 lvds_read(struct stm_lvds *lvds, u32 reg)
  267. {
  268. return readl(lvds->base + reg);
  269. }
  270. static inline void lvds_set(struct stm_lvds *lvds, u32 reg, u32 mask)
  271. {
  272. lvds_write(lvds, reg, lvds_read(lvds, reg) | mask);
  273. }
  274. static inline void lvds_clear(struct stm_lvds *lvds, u32 reg, u32 mask)
  275. {
  276. lvds_write(lvds, reg, lvds_read(lvds, reg) & ~mask);
  277. }
  278. /*
  279. * Expected JEIDA-RGB888 data to be sent in LSB format
  280. * bit6 ............................bit0
  281. * CHAN0 {ONE, ONE, ZERO, ZERO, ZERO, ONE, ONE}
  282. * CHAN1 {G2, R7, R6, R5, R4, R3, R2}
  283. * CHAN2 {B3, B2, G7, G6, G5, G4, G3}
  284. * CHAN3 {DE, VS, HS, B7, B6, B5, B4}
  285. * CHAN4 {CE, B1, B0, G1, G0, R1, R0}
  286. */
  287. static enum lvds_pixel lvds_bitmap_jeida_rgb888[5][7] = {
  288. { PIX_ONE, PIX_ONE, PIX_ZER, PIX_ZER, PIX_ZER, PIX_ONE, PIX_ONE },
  289. { PIX_G_2, PIX_R_7, PIX_R_6, PIX_R_5, PIX_R_4, PIX_R_3, PIX_R_2 },
  290. { PIX_B_3, PIX_B_2, PIX_G_7, PIX_G_6, PIX_G_5, PIX_G_4, PIX_G_3 },
  291. { PIX_D_E, PIX_V_S, PIX_H_S, PIX_B_7, PIX_B_6, PIX_B_5, PIX_B_4 },
  292. { PIX_C_E, PIX_B_1, PIX_B_0, PIX_G_1, PIX_G_0, PIX_R_1, PIX_R_0 }
  293. };
  294. /*
  295. * Expected VESA-RGB888 data to be sent in LSB format
  296. * bit6 ............................bit0
  297. * CHAN0 {ONE, ONE, ZERO, ZERO, ZERO, ONE, ONE}
  298. * CHAN1 {G0, R5, R4, R3, R2, R1, R0}
  299. * CHAN2 {B1, B0, G5, G4, G3, G2, G1}
  300. * CHAN3 {DE, VS, HS, B5, B4, B3, B2}
  301. * CHAN4 {CE, B7, B6, G7, G6, R7, R6}
  302. */
  303. static enum lvds_pixel lvds_bitmap_vesa_rgb888[5][7] = {
  304. { PIX_ONE, PIX_ONE, PIX_ZER, PIX_ZER, PIX_ZER, PIX_ONE, PIX_ONE },
  305. { PIX_G_0, PIX_R_5, PIX_R_4, PIX_R_3, PIX_R_2, PIX_R_1, PIX_R_0 },
  306. { PIX_B_1, PIX_B_0, PIX_G_5, PIX_G_4, PIX_G_3, PIX_G_2, PIX_G_1 },
  307. { PIX_D_E, PIX_V_S, PIX_H_S, PIX_B_5, PIX_B_4, PIX_B_3, PIX_B_2 },
  308. { PIX_C_E, PIX_B_7, PIX_B_6, PIX_G_7, PIX_G_6, PIX_R_7, PIX_R_6 }
  309. };
  310. /*
  311. * Clocks and PHY related functions
  312. */
  313. static int lvds_pll_enable(struct stm_lvds *lvds, struct lvds_phy_info *phy)
  314. {
  315. struct drm_device *drm = lvds->lvds_bridge.dev;
  316. u32 lvds_gcr;
  317. int val, ret;
  318. /*
  319. * PLL lock timing control for the monitor unmask after startup (pll_en)
  320. * Adjusted value so that the masking window is opened at start-up
  321. */
  322. lvds_write(lvds, phy->base + phy->ofs.MPLCR, (0x200 - 0x160) << 16);
  323. /* Enable bias */
  324. lvds_write(lvds, phy->base + phy->ofs.BCR2, PHY_BCR2_BIAS_EN);
  325. /* Enable DP, LS, BIT clock output */
  326. lvds_gcr = PHY_GCR_DP_CLK_OUT | PHY_GCR_LS_CLK_OUT | PHY_GCR_BIT_CLK_OUT;
  327. lvds_set(lvds, phy->base + phy->ofs.GCR, lvds_gcr);
  328. /* Power up all output dividers */
  329. lvds_set(lvds, phy->base + phy->ofs.PLLTESTCR, PHY_PLLTESTCR_EN);
  330. lvds_set(lvds, phy->base + phy->ofs.PLLCR1, PHY_PLLCR1_DIV_EN);
  331. /* Set PHY in serial transmission mode */
  332. lvds_set(lvds, phy->base + phy->ofs.SCR, PHY_SCR_TX_EN);
  333. /* Enable the LVDS PLL & wait for its lock */
  334. lvds_set(lvds, phy->base + phy->ofs.PLLCR1, PHY_PLLCR1_PLL_EN);
  335. ret = readl_poll_timeout_atomic(lvds->base + phy->base + phy->ofs.PLLSR,
  336. val, val & PHY_PLLSR_PLL_LOCK,
  337. SLEEP_US, TIMEOUT_US);
  338. if (ret)
  339. drm_err(drm, "!TIMEOUT! waiting PLL, let's continue\n");
  340. /* WCLKCR_SECND_CLKPIX_SEL is for dual link */
  341. lvds_write(lvds, LVDS_WCLKCR, WCLKCR_SECND_CLKPIX_SEL);
  342. lvds_set(lvds, phy->ofs.PLLTESTCR, PHY_PLLTESTCR_CLK_EN);
  343. return ret;
  344. }
  345. static int pll_get_clkout_khz(int clkin_khz, int bdiv, int mdiv, int ndiv)
  346. {
  347. int divisor = ndiv * bdiv;
  348. /* Prevents from division by 0 */
  349. if (!divisor)
  350. return 0;
  351. return clkin_khz * mdiv / divisor;
  352. }
  353. #define TDIV 70
  354. #define NDIV_MIN 2
  355. #define NDIV_MAX 6
  356. #define BDIV_MIN 2
  357. #define BDIV_MAX 6
  358. #define MDIV_MIN 1
  359. #define MDIV_MAX 1023
  360. static int lvds_pll_get_params(struct stm_lvds *lvds,
  361. unsigned int clkin_khz, unsigned int clkout_khz,
  362. unsigned int *bdiv, unsigned int *mdiv, unsigned int *ndiv)
  363. {
  364. int delta, best_delta; /* all in khz */
  365. int i, o, n;
  366. /* Early checks preventing division by 0 & odd results */
  367. if (clkin_khz <= 0 || clkout_khz <= 0)
  368. return -EINVAL;
  369. best_delta = 1000000; /* big started value (1000000khz) */
  370. for (i = NDIV_MIN; i <= NDIV_MAX; i++) {
  371. for (o = BDIV_MIN; o <= BDIV_MAX; o++) {
  372. n = DIV_ROUND_CLOSEST(i * o * clkout_khz, clkin_khz);
  373. /* Check ndiv according to vco range */
  374. if (n < MDIV_MIN || n > MDIV_MAX)
  375. continue;
  376. /* Check if new delta is better & saves parameters */
  377. delta = pll_get_clkout_khz(clkin_khz, i, n, o) - clkout_khz;
  378. if (delta < 0)
  379. delta = -delta;
  380. if (delta < best_delta) {
  381. *ndiv = i;
  382. *mdiv = n;
  383. *bdiv = o;
  384. best_delta = delta;
  385. }
  386. /* fast return in case of "perfect result" */
  387. if (!delta)
  388. return 0;
  389. }
  390. }
  391. return 0;
  392. }
  393. static void lvds_pll_config(struct stm_lvds *lvds, struct lvds_phy_info *phy)
  394. {
  395. unsigned int pll_in_khz, bdiv = 0, mdiv = 0, ndiv = 0;
  396. struct clk_hw *hwclk;
  397. int multiplier;
  398. /*
  399. * The LVDS PHY includes a low power low jitter high performance and
  400. * highly configuration Phase Locked Loop supporting integer and
  401. * fractional multiplication ratios and Spread Spectrum Clocking. In
  402. * integer mode, the only software supported feature for now, the PLL is
  403. * made of a pre-divider NDIV, a feedback multiplier MDIV, followed by
  404. * several post-dividers, each one with a specific application.
  405. *
  406. * ,------. ,-----. ,-----.
  407. * Fref --> | NDIV | -Fpdf-> | PFD | --> | VCO | --------> Fvco
  408. * `------' ,-> | | `-----' |
  409. * | `-----' |
  410. * | ,------. |
  411. * `-------- | MDIV | <-----'
  412. * `------'
  413. *
  414. * From the output of the VCO, the clock can be optionally extracted on
  415. * the RCC clock observer, with a divider TDIV, for testing purpose, or
  416. * is passed through a programmable post-divider BDIV. Finally, the
  417. * frequency can be divided further with two fixed dividers.
  418. *
  419. * ,--------.
  420. * ,-----> | DP div | ----------------> Fdp
  421. * ,------. | `--------'
  422. * Fvco --> | BDIV | ------------------------------------> Fbit
  423. * | `------' ,------. |
  424. * `-------------> | TDIV | --.---------------------> ClkObs
  425. * '------' | ,--------.
  426. * `--> | LS div | ------> Fls
  427. * '--------'
  428. *
  429. * The LS and DP clock dividers operate at a fixed ratio of 7 and 3.5
  430. * respectively with regards to fbit. LS divider converts the bit clock
  431. * to a pixel clock per lane per clock sample (Fls). This is useful
  432. * when used to generate a dot clock for the display unit RGB output,
  433. * and DP divider is.
  434. */
  435. hwclk = __clk_get_hw(lvds->pllref_clk);
  436. if (!hwclk)
  437. return;
  438. pll_in_khz = clk_hw_get_rate(hwclk) / 1000;
  439. if (lvds_is_dual_link(lvds->link_type))
  440. multiplier = 2;
  441. else
  442. multiplier = 1;
  443. lvds_pll_get_params(lvds, pll_in_khz,
  444. lvds->pixel_clock_rate * 7 / 1000 / multiplier,
  445. &bdiv, &mdiv, &ndiv);
  446. /* Set BDIV, MDIV and NDIV */
  447. lvds_write(lvds, phy->base + phy->ofs.PLLCR2, ndiv << 16);
  448. lvds_set(lvds, phy->base + phy->ofs.PLLCR2, bdiv);
  449. lvds_write(lvds, phy->base + phy->ofs.PLLSDCR1, mdiv);
  450. /* Hardcode TDIV as dynamic values are not yet implemented */
  451. lvds_write(lvds, phy->base + phy->ofs.PLLTESTCR, TDIV << 16);
  452. /*
  453. * For now, PLL just needs to be in integer mode
  454. * Fractional and spread spectrum clocking are not yet implemented
  455. *
  456. * PLL integer mode:
  457. * - PMRY_PLL_TWG_STEP = PMRY_PLL_SD_INT_RATIO
  458. * - EN_TWG = 0
  459. * - EN_SD = 0
  460. * - DOWN_SPREAD = 0
  461. *
  462. * PLL fractional mode:
  463. * - EN_TWG = 0
  464. * - EN_SD = 1
  465. * - DOWN_SPREAD = 0
  466. *
  467. * Spread Spectrum Clocking
  468. * - EN_TWG = 1
  469. * - EN_SD = 1
  470. */
  471. /* Disable TWG and SD */
  472. lvds_clear(lvds, phy->base + phy->ofs.PLLCR1, PHY_PLLCR1_EN_TWG | PHY_PLLCR1_EN_SD);
  473. /* Power up bias and PLL dividers */
  474. lvds_set(lvds, phy->base + phy->ofs.DCR, PHY_DCR_POWER_OK);
  475. lvds_set(lvds, phy->base + phy->ofs.CMCR1, PHY_CMCR_CM_EN_DL);
  476. lvds_set(lvds, phy->base + phy->ofs.CMCR2, PHY_CMCR_CM_EN_DL4);
  477. /* Set up voltage mode */
  478. lvds_set(lvds, phy->base + phy->ofs.PLLCPCR, 0x1);
  479. lvds_set(lvds, phy->base + phy->ofs.BCR3, PHY_BCR3_VM_EN_DL);
  480. lvds_set(lvds, phy->base + phy->ofs.BCR1, PHY_BCR1_EN_BIAS_DL);
  481. /* Enable digital datalanes */
  482. lvds_set(lvds, phy->base + phy->ofs.CFGCR, PHY_CFGCR_EN_DIG_DL);
  483. }
  484. static int lvds_pixel_clk_enable(struct clk_hw *hw)
  485. {
  486. struct stm_lvds *lvds = container_of(hw, struct stm_lvds, lvds_ck_px);
  487. struct drm_device *drm = lvds->lvds_bridge.dev;
  488. struct lvds_phy_info *phy;
  489. int ret;
  490. ret = clk_prepare_enable(lvds->pclk);
  491. if (ret) {
  492. drm_err(drm, "Failed to enable lvds peripheral clk\n");
  493. return ret;
  494. }
  495. ret = clk_prepare_enable(lvds->pllref_clk);
  496. if (ret) {
  497. drm_err(drm, "Failed to enable lvds reference clk\n");
  498. clk_disable_unprepare(lvds->pclk);
  499. return ret;
  500. }
  501. /* In case we are operating in dual link the second PHY is set before the primary PHY. */
  502. if (lvds->secondary) {
  503. phy = lvds->secondary;
  504. /* Release LVDS PHY from reset mode */
  505. lvds_set(lvds, phy->base + phy->ofs.GCR, PHY_GCR_DIV_RSTN | PHY_GCR_RSTZ);
  506. lvds_pll_config(lvds, phy);
  507. ret = lvds_pll_enable(lvds, phy);
  508. if (ret) {
  509. drm_err(drm, "Failed to enable secondary PHY PLL: %d\n", ret);
  510. return ret;
  511. }
  512. }
  513. if (lvds->primary) {
  514. phy = lvds->primary;
  515. /* Release LVDS PHY from reset mode */
  516. lvds_set(lvds, phy->base + phy->ofs.GCR, PHY_GCR_DIV_RSTN | PHY_GCR_RSTZ);
  517. lvds_pll_config(lvds, phy);
  518. ret = lvds_pll_enable(lvds, phy);
  519. if (ret) {
  520. drm_err(drm, "Failed to enable primary PHY PLL: %d\n", ret);
  521. return ret;
  522. }
  523. }
  524. return 0;
  525. }
  526. static void lvds_pixel_clk_disable(struct clk_hw *hw)
  527. {
  528. struct stm_lvds *lvds = container_of(hw, struct stm_lvds, lvds_ck_px);
  529. /*
  530. * For each PHY:
  531. * Disable DP, LS, BIT clock outputs
  532. * Shutdown the PLL
  533. * Assert LVDS PHY in reset mode
  534. */
  535. if (lvds->primary) {
  536. lvds_clear(lvds, lvds->primary->base + lvds->primary->ofs.GCR,
  537. (PHY_GCR_DP_CLK_OUT | PHY_GCR_LS_CLK_OUT | PHY_GCR_BIT_CLK_OUT));
  538. lvds_clear(lvds, lvds->primary->base + lvds->primary->ofs.PLLCR1,
  539. PHY_PLLCR1_PLL_EN);
  540. lvds_clear(lvds, lvds->primary->base + lvds->primary->ofs.GCR,
  541. PHY_GCR_DIV_RSTN | PHY_GCR_RSTZ);
  542. }
  543. if (lvds->secondary) {
  544. lvds_clear(lvds, lvds->secondary->base + lvds->secondary->ofs.GCR,
  545. (PHY_GCR_DP_CLK_OUT | PHY_GCR_LS_CLK_OUT | PHY_GCR_BIT_CLK_OUT));
  546. lvds_clear(lvds, lvds->secondary->base + lvds->secondary->ofs.PLLCR1,
  547. PHY_PLLCR1_PLL_EN);
  548. lvds_clear(lvds, lvds->secondary->base + lvds->secondary->ofs.GCR,
  549. PHY_GCR_DIV_RSTN | PHY_GCR_RSTZ);
  550. }
  551. clk_disable_unprepare(lvds->pllref_clk);
  552. clk_disable_unprepare(lvds->pclk);
  553. }
  554. static unsigned long lvds_pixel_clk_recalc_rate(struct clk_hw *hw,
  555. unsigned long parent_rate)
  556. {
  557. struct stm_lvds *lvds = container_of(hw, struct stm_lvds, lvds_ck_px);
  558. struct drm_device *drm = lvds->lvds_bridge.dev;
  559. unsigned int pll_in_khz, bdiv, mdiv, ndiv;
  560. int ret, multiplier, pll_out_khz;
  561. u32 val;
  562. ret = clk_prepare_enable(lvds->pclk);
  563. if (ret) {
  564. drm_err(drm, "Failed to enable lvds peripheral clk\n");
  565. return 0;
  566. }
  567. if (lvds_is_dual_link(lvds->link_type))
  568. multiplier = 2;
  569. else
  570. multiplier = 1;
  571. val = lvds_read(lvds, lvds->primary->base + lvds->primary->ofs.PLLCR2);
  572. ndiv = (val & PHY_PLLCR2_NDIV) >> 16;
  573. bdiv = (val & PHY_PLLCR2_BDIV) >> 0;
  574. mdiv = (unsigned int)lvds_read(lvds,
  575. lvds->primary->base + lvds->primary->ofs.PLLSDCR1);
  576. pll_in_khz = (unsigned int)(parent_rate / 1000);
  577. /* Compute values if not yet accessible */
  578. if (val == 0 || mdiv == 0) {
  579. lvds_pll_get_params(lvds, pll_in_khz,
  580. lvds->pixel_clock_rate * 7 / 1000 / multiplier,
  581. &bdiv, &mdiv, &ndiv);
  582. }
  583. pll_out_khz = pll_get_clkout_khz(pll_in_khz, bdiv, mdiv, ndiv);
  584. drm_dbg(drm, "ndiv %d , bdiv %d, mdiv %d, pll_out_khz %d\n",
  585. ndiv, bdiv, mdiv, pll_out_khz);
  586. /*
  587. * 1/7 because for each pixel in 1 lane there is 7 bits
  588. * We want pixclk, not bitclk
  589. */
  590. lvds->pixel_clock_rate = pll_out_khz * 1000 * multiplier / 7;
  591. clk_disable_unprepare(lvds->pclk);
  592. return (unsigned long)lvds->pixel_clock_rate;
  593. }
  594. static long lvds_pixel_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  595. unsigned long *parent_rate)
  596. {
  597. struct stm_lvds *lvds = container_of(hw, struct stm_lvds, lvds_ck_px);
  598. unsigned int pll_in_khz, bdiv = 0, mdiv = 0, ndiv = 0;
  599. const struct drm_connector *connector;
  600. const struct drm_display_mode *mode;
  601. int multiplier;
  602. connector = &lvds->connector;
  603. if (!connector)
  604. return -EINVAL;
  605. if (list_empty(&connector->modes)) {
  606. drm_dbg(connector->dev, "connector: empty modes list\n");
  607. return -EINVAL;
  608. }
  609. mode = list_first_entry(&connector->modes,
  610. struct drm_display_mode, head);
  611. pll_in_khz = (unsigned int)(*parent_rate / 1000);
  612. if (lvds_is_dual_link(lvds->link_type))
  613. multiplier = 2;
  614. else
  615. multiplier = 1;
  616. lvds_pll_get_params(lvds, pll_in_khz, mode->clock * 7 / multiplier, &bdiv, &mdiv, &ndiv);
  617. /*
  618. * 1/7 because for each pixel in 1 lane there is 7 bits
  619. * We want pixclk, not bitclk
  620. */
  621. lvds->pixel_clock_rate = (unsigned long)pll_get_clkout_khz(pll_in_khz, bdiv, mdiv, ndiv)
  622. * 1000 * multiplier / 7;
  623. return lvds->pixel_clock_rate;
  624. }
  625. static const struct clk_ops lvds_pixel_clk_ops = {
  626. .enable = lvds_pixel_clk_enable,
  627. .disable = lvds_pixel_clk_disable,
  628. .recalc_rate = lvds_pixel_clk_recalc_rate,
  629. .round_rate = lvds_pixel_clk_round_rate,
  630. };
  631. static const struct clk_init_data clk_data = {
  632. .name = "clk_pix_lvds",
  633. .ops = &lvds_pixel_clk_ops,
  634. .parent_names = (const char * []) {"ck_ker_lvdsphy"},
  635. .num_parents = 1,
  636. .flags = CLK_IGNORE_UNUSED,
  637. };
  638. static void lvds_pixel_clk_unregister(void *data)
  639. {
  640. struct stm_lvds *lvds = data;
  641. of_clk_del_provider(lvds->dev->of_node);
  642. clk_hw_unregister(&lvds->lvds_ck_px);
  643. }
  644. static int lvds_pixel_clk_register(struct stm_lvds *lvds)
  645. {
  646. struct device_node *node = lvds->dev->of_node;
  647. int ret;
  648. lvds->lvds_ck_px.init = &clk_data;
  649. /* set the rate by default at 148500000 */
  650. lvds->pixel_clock_rate = 148500000;
  651. ret = clk_hw_register(lvds->dev, &lvds->lvds_ck_px);
  652. if (ret)
  653. return ret;
  654. ret = of_clk_add_hw_provider(node, of_clk_hw_simple_get,
  655. &lvds->lvds_ck_px);
  656. if (ret)
  657. clk_hw_unregister(&lvds->lvds_ck_px);
  658. return ret;
  659. }
  660. /*
  661. * Host configuration related
  662. */
  663. static void lvds_config_data_mapping(struct stm_lvds *lvds)
  664. {
  665. struct drm_device *drm = lvds->lvds_bridge.dev;
  666. const struct drm_display_info *info;
  667. enum lvds_pixel (*bitmap)[7];
  668. u32 lvds_dmlcr, lvds_dmmcr;
  669. int i;
  670. info = &(&lvds->connector)->display_info;
  671. if (!info->num_bus_formats || !info->bus_formats) {
  672. drm_warn(drm, "No LVDS bus format reported\n");
  673. return;
  674. }
  675. switch (info->bus_formats[0]) {
  676. case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: /* VESA-RGB666 */
  677. drm_warn(drm, "Pixel format with data mapping not yet supported.\n");
  678. return;
  679. case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: /* VESA-RGB888 */
  680. bitmap = lvds_bitmap_vesa_rgb888;
  681. break;
  682. case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: /* JEIDA-RGB888 */
  683. bitmap = lvds_bitmap_jeida_rgb888;
  684. break;
  685. default:
  686. drm_warn(drm, "Unsupported LVDS bus format 0x%04x\n", info->bus_formats[0]);
  687. return;
  688. }
  689. /* Set bitmap for each lane */
  690. for (i = 0; i < 5; i++) {
  691. lvds_dmlcr = ((bitmap[i][0])
  692. + (bitmap[i][1] << 5)
  693. + (bitmap[i][2] << 10)
  694. + (bitmap[i][3] << 15));
  695. lvds_dmmcr = ((bitmap[i][4])
  696. + (bitmap[i][5] << 5)
  697. + (bitmap[i][6] << 10));
  698. lvds_write(lvds, LVDS_DMLCR(i), lvds_dmlcr);
  699. lvds_write(lvds, LVDS_DMMCR(i), lvds_dmmcr);
  700. }
  701. }
  702. static void lvds_config_mode(struct stm_lvds *lvds)
  703. {
  704. u32 bus_flags, lvds_cr = 0, lvds_cdl1cr = 0, lvds_cdl2cr = 0;
  705. const struct drm_display_mode *mode;
  706. const struct drm_connector *connector;
  707. connector = &lvds->connector;
  708. if (!connector)
  709. return;
  710. if (list_empty(&connector->modes)) {
  711. drm_dbg(connector->dev, "connector: empty modes list\n");
  712. return;
  713. }
  714. bus_flags = connector->display_info.bus_flags;
  715. mode = list_first_entry(&connector->modes,
  716. struct drm_display_mode, head);
  717. lvds_clear(lvds, LVDS_CR, CR_LKMOD);
  718. lvds_clear(lvds, LVDS_CDL1CR, CDLCR_DISTR0 | CDLCR_DISTR1 | CDLCR_DISTR2 |
  719. CDLCR_DISTR3 | CDLCR_DISTR4);
  720. lvds_clear(lvds, LVDS_CDL2CR, CDLCR_DISTR0 | CDLCR_DISTR1 | CDLCR_DISTR2 |
  721. CDLCR_DISTR3 | CDLCR_DISTR4);
  722. /* Set channel distribution */
  723. if (lvds->primary)
  724. lvds_cdl1cr = CDL1CR_DEFAULT;
  725. if (lvds->secondary) {
  726. lvds_cr |= CR_LKMOD;
  727. lvds_cdl2cr = CDL2CR_DEFAULT;
  728. }
  729. /* Set signal polarity */
  730. if (bus_flags & DRM_BUS_FLAG_DE_LOW)
  731. lvds_cr |= CR_DEPOL;
  732. if (mode->flags & DRM_MODE_FLAG_NHSYNC)
  733. lvds_cr |= CR_HSPOL;
  734. if (mode->flags & DRM_MODE_FLAG_NVSYNC)
  735. lvds_cr |= CR_VSPOL;
  736. switch (lvds->link_type) {
  737. case LVDS_DUAL_LINK_EVEN_ODD_PIXELS: /* LKPHA = 0 */
  738. lvds_cr &= ~CR_LKPHA;
  739. break;
  740. case LVDS_DUAL_LINK_ODD_EVEN_PIXELS: /* LKPHA = 1 */
  741. lvds_cr |= CR_LKPHA;
  742. break;
  743. default:
  744. drm_notice(lvds->lvds_bridge.dev, "No phase precised, setting default\n");
  745. lvds_cr &= ~CR_LKPHA;
  746. break;
  747. }
  748. /* Write config to registers */
  749. lvds_set(lvds, LVDS_CR, lvds_cr);
  750. lvds_write(lvds, LVDS_CDL1CR, lvds_cdl1cr);
  751. lvds_write(lvds, LVDS_CDL2CR, lvds_cdl2cr);
  752. }
  753. static int lvds_connector_get_modes(struct drm_connector *connector)
  754. {
  755. struct stm_lvds *lvds = connector_to_stm_lvds(connector);
  756. return drm_panel_get_modes(lvds->panel, connector);
  757. }
  758. static int lvds_connector_atomic_check(struct drm_connector *connector,
  759. struct drm_atomic_state *state)
  760. {
  761. const struct drm_display_mode *panel_mode;
  762. struct drm_connector_state *conn_state;
  763. struct drm_crtc_state *crtc_state;
  764. conn_state = drm_atomic_get_new_connector_state(state, connector);
  765. if (!conn_state)
  766. return -EINVAL;
  767. if (list_empty(&connector->modes)) {
  768. drm_dbg(connector->dev, "connector: empty modes list\n");
  769. return -EINVAL;
  770. }
  771. if (!conn_state->crtc)
  772. return -EINVAL;
  773. panel_mode = list_first_entry(&connector->modes,
  774. struct drm_display_mode, head);
  775. /* We're not allowed to modify the resolution. */
  776. crtc_state = drm_atomic_get_crtc_state(state, conn_state->crtc);
  777. if (IS_ERR(crtc_state))
  778. return PTR_ERR(crtc_state);
  779. if (crtc_state->mode.hdisplay != panel_mode->hdisplay ||
  780. crtc_state->mode.vdisplay != panel_mode->vdisplay)
  781. return -EINVAL;
  782. /* The flat panel mode is fixed, just copy it to the adjusted mode. */
  783. drm_mode_copy(&crtc_state->adjusted_mode, panel_mode);
  784. return 0;
  785. }
  786. static const struct drm_connector_helper_funcs lvds_conn_helper_funcs = {
  787. .get_modes = lvds_connector_get_modes,
  788. .atomic_check = lvds_connector_atomic_check,
  789. };
  790. static const struct drm_connector_funcs lvds_conn_funcs = {
  791. .reset = drm_atomic_helper_connector_reset,
  792. .fill_modes = drm_helper_probe_single_connector_modes,
  793. .destroy = drm_connector_cleanup,
  794. .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
  795. .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  796. };
  797. static int lvds_attach(struct drm_bridge *bridge,
  798. enum drm_bridge_attach_flags flags)
  799. {
  800. struct stm_lvds *lvds = bridge_to_stm_lvds(bridge);
  801. struct drm_connector *connector = &lvds->connector;
  802. struct drm_encoder *encoder = bridge->encoder;
  803. int ret;
  804. if (!bridge->encoder) {
  805. drm_err(bridge->dev, "Parent encoder object not found\n");
  806. return -ENODEV;
  807. }
  808. /* Set the encoder type as caller does not know it */
  809. bridge->encoder->encoder_type = DRM_MODE_ENCODER_LVDS;
  810. /* No cloning support */
  811. bridge->encoder->possible_clones = 0;
  812. /* If we have a next bridge just attach it. */
  813. if (lvds->next_bridge)
  814. return drm_bridge_attach(bridge->encoder, lvds->next_bridge,
  815. bridge, flags);
  816. if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
  817. drm_err(bridge->dev, "Fix bridge driver to make connector optional!");
  818. return -EINVAL;
  819. }
  820. /* Otherwise if we have a panel, create a connector. */
  821. if (!lvds->panel)
  822. return 0;
  823. ret = drm_connector_init(bridge->dev, connector,
  824. &lvds_conn_funcs, DRM_MODE_CONNECTOR_LVDS);
  825. if (ret < 0)
  826. return ret;
  827. drm_connector_helper_add(connector, &lvds_conn_helper_funcs);
  828. ret = drm_connector_attach_encoder(connector, encoder);
  829. return ret;
  830. }
  831. static void lvds_atomic_enable(struct drm_bridge *bridge,
  832. struct drm_bridge_state *old_bridge_state)
  833. {
  834. struct drm_atomic_state *state = old_bridge_state->base.state;
  835. struct stm_lvds *lvds = bridge_to_stm_lvds(bridge);
  836. struct drm_connector_state *conn_state;
  837. struct drm_connector *connector;
  838. int ret;
  839. ret = clk_prepare_enable(lvds->pclk);
  840. if (ret) {
  841. drm_err(bridge->dev, "Failed to enable lvds peripheral clk\n");
  842. return;
  843. }
  844. connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
  845. if (!connector)
  846. return;
  847. conn_state = drm_atomic_get_new_connector_state(state, connector);
  848. if (!conn_state)
  849. return;
  850. lvds_config_mode(lvds);
  851. /* Set Data Mapping */
  852. lvds_config_data_mapping(lvds);
  853. /* Turn the output on. */
  854. lvds_set(lvds, LVDS_CR, CR_LVDSEN);
  855. if (lvds->panel) {
  856. drm_panel_prepare(lvds->panel);
  857. drm_panel_enable(lvds->panel);
  858. }
  859. }
  860. static void lvds_atomic_disable(struct drm_bridge *bridge,
  861. struct drm_bridge_state *old_bridge_state)
  862. {
  863. struct stm_lvds *lvds = bridge_to_stm_lvds(bridge);
  864. if (lvds->panel) {
  865. drm_panel_disable(lvds->panel);
  866. drm_panel_unprepare(lvds->panel);
  867. }
  868. /* Disable LVDS module */
  869. lvds_clear(lvds, LVDS_CR, CR_LVDSEN);
  870. clk_disable_unprepare(lvds->pclk);
  871. }
  872. static const struct drm_bridge_funcs lvds_bridge_funcs = {
  873. .attach = lvds_attach,
  874. .atomic_enable = lvds_atomic_enable,
  875. .atomic_disable = lvds_atomic_disable,
  876. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  877. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  878. .atomic_reset = drm_atomic_helper_bridge_reset,
  879. };
  880. static int lvds_probe(struct platform_device *pdev)
  881. {
  882. struct device_node *port1, *port2, *remote;
  883. struct device *dev = &pdev->dev;
  884. struct reset_control *rstc;
  885. struct stm_lvds *lvds;
  886. int ret, dual_link;
  887. dev_dbg(dev, "Probing LVDS driver...\n");
  888. lvds = devm_kzalloc(dev, sizeof(*lvds), GFP_KERNEL);
  889. if (!lvds)
  890. return -ENOMEM;
  891. lvds->dev = dev;
  892. ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0,
  893. &lvds->panel, &lvds->next_bridge);
  894. if (ret) {
  895. dev_err_probe(dev, ret, "Panel not found\n");
  896. return ret;
  897. }
  898. lvds->base = devm_platform_ioremap_resource(pdev, 0);
  899. if (IS_ERR(lvds->base)) {
  900. ret = PTR_ERR(lvds->base);
  901. dev_err(dev, "Unable to get regs %d\n", ret);
  902. return ret;
  903. }
  904. lvds->pclk = devm_clk_get(dev, "pclk");
  905. if (IS_ERR(lvds->pclk)) {
  906. ret = PTR_ERR(lvds->pclk);
  907. dev_err(dev, "Unable to get peripheral clock: %d\n", ret);
  908. return ret;
  909. }
  910. ret = clk_prepare_enable(lvds->pclk);
  911. if (ret) {
  912. dev_err(dev, "%s: Failed to enable peripheral clk\n", __func__);
  913. return ret;
  914. }
  915. rstc = devm_reset_control_get_exclusive(dev, NULL);
  916. if (IS_ERR(rstc)) {
  917. ret = PTR_ERR(rstc);
  918. goto err_lvds_probe;
  919. }
  920. reset_control_assert(rstc);
  921. usleep_range(10, 20);
  922. reset_control_deassert(rstc);
  923. port1 = of_graph_get_port_by_id(dev->of_node, 1);
  924. port2 = of_graph_get_port_by_id(dev->of_node, 2);
  925. dual_link = drm_of_lvds_get_dual_link_pixel_order(port1, port2);
  926. switch (dual_link) {
  927. case DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS:
  928. lvds->link_type = LVDS_DUAL_LINK_ODD_EVEN_PIXELS;
  929. lvds->primary = &lvds_phy_16ff_primary;
  930. lvds->secondary = &lvds_phy_16ff_secondary;
  931. break;
  932. case DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS:
  933. lvds->link_type = LVDS_DUAL_LINK_EVEN_ODD_PIXELS;
  934. lvds->primary = &lvds_phy_16ff_primary;
  935. lvds->secondary = &lvds_phy_16ff_secondary;
  936. break;
  937. case -EINVAL:
  938. /*
  939. * drm_of_lvds_get_dual_pixel_order returns 4 possible values.
  940. * In the case where the returned value is an error, it can be
  941. * either ENODEV or EINVAL. Seeing the structure of this
  942. * function, EINVAL means that either port1 or port2 is not
  943. * present in the device tree.
  944. * In that case, the lvds panel can be a single link panel, or
  945. * there is a semantical error in the device tree code.
  946. */
  947. remote = of_get_next_available_child(port1, NULL);
  948. if (remote) {
  949. if (of_graph_get_remote_endpoint(remote)) {
  950. lvds->link_type = LVDS_SINGLE_LINK_PRIMARY;
  951. lvds->primary = &lvds_phy_16ff_primary;
  952. lvds->secondary = NULL;
  953. } else {
  954. ret = -EINVAL;
  955. }
  956. of_node_put(remote);
  957. }
  958. remote = of_get_next_available_child(port2, NULL);
  959. if (remote) {
  960. if (of_graph_get_remote_endpoint(remote)) {
  961. lvds->link_type = LVDS_SINGLE_LINK_SECONDARY;
  962. lvds->primary = NULL;
  963. lvds->secondary = &lvds_phy_16ff_secondary;
  964. } else {
  965. ret = (ret == -EINVAL) ? -EINVAL : 0;
  966. }
  967. of_node_put(remote);
  968. }
  969. break;
  970. default:
  971. ret = -EINVAL;
  972. goto err_lvds_probe;
  973. }
  974. of_node_put(port1);
  975. of_node_put(port2);
  976. lvds->pllref_clk = devm_clk_get(dev, "ref");
  977. if (IS_ERR(lvds->pllref_clk)) {
  978. ret = PTR_ERR(lvds->pllref_clk);
  979. dev_err(dev, "Unable to get reference clock: %d\n", ret);
  980. goto err_lvds_probe;
  981. }
  982. ret = lvds_pixel_clk_register(lvds);
  983. if (ret) {
  984. dev_err(dev, "Failed to register LVDS pixel clock: %d\n", ret);
  985. goto err_lvds_probe;
  986. }
  987. lvds->lvds_bridge.funcs = &lvds_bridge_funcs;
  988. lvds->lvds_bridge.of_node = dev->of_node;
  989. lvds->hw_version = lvds_read(lvds, LVDS_VERR);
  990. dev_info(dev, "version 0x%02x initialized\n", lvds->hw_version);
  991. drm_bridge_add(&lvds->lvds_bridge);
  992. platform_set_drvdata(pdev, lvds);
  993. clk_disable_unprepare(lvds->pclk);
  994. return 0;
  995. err_lvds_probe:
  996. clk_disable_unprepare(lvds->pclk);
  997. return ret;
  998. }
  999. static void lvds_remove(struct platform_device *pdev)
  1000. {
  1001. struct stm_lvds *lvds = platform_get_drvdata(pdev);
  1002. lvds_pixel_clk_unregister(lvds);
  1003. drm_bridge_remove(&lvds->lvds_bridge);
  1004. }
  1005. static const struct of_device_id lvds_dt_ids[] = {
  1006. {
  1007. .compatible = "st,stm32mp25-lvds",
  1008. .data = NULL
  1009. },
  1010. { /* sentinel */ }
  1011. };
  1012. MODULE_DEVICE_TABLE(of, lvds_dt_ids);
  1013. static struct platform_driver lvds_platform_driver = {
  1014. .probe = lvds_probe,
  1015. .remove = lvds_remove,
  1016. .driver = {
  1017. .name = "stm32-display-lvds",
  1018. .of_match_table = lvds_dt_ids,
  1019. },
  1020. };
  1021. module_platform_driver(lvds_platform_driver);
  1022. MODULE_AUTHOR("Raphaël Gallais-Pou <raphael.gallais-pou@foss.st.com>");
  1023. MODULE_AUTHOR("Philippe Cornu <philippe.cornu@foss.st.com>");
  1024. MODULE_AUTHOR("Yannick Fertre <yannick.fertre@foss.st.com>");
  1025. MODULE_DESCRIPTION("STMicroelectronics LVDS Display Interface Transmitter DRM driver");
  1026. MODULE_LICENSE("GPL");