samsung-dsim.c 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Samsung MIPI DSIM bridge driver.
  4. *
  5. * Copyright (C) 2021 Amarula Solutions(India)
  6. * Copyright (c) 2014 Samsung Electronics Co., Ltd
  7. * Author: Jagan Teki <jagan@amarulasolutions.com>
  8. *
  9. * Based on exynos_drm_dsi from
  10. * Tomasz Figa <t.figa@samsung.com>
  11. */
  12. #include <linux/unaligned.h>
  13. #include <linux/clk.h>
  14. #include <linux/delay.h>
  15. #include <linux/export.h>
  16. #include <linux/irq.h>
  17. #include <linux/media-bus-format.h>
  18. #include <linux/of.h>
  19. #include <linux/phy/phy.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/units.h>
  22. #include <video/mipi_display.h>
  23. #include <drm/bridge/samsung-dsim.h>
  24. #include <drm/drm_panel.h>
  25. #include <drm/drm_print.h>
  26. /* returns true iff both arguments logically differs */
  27. #define NEQV(a, b) (!(a) ^ !(b))
  28. /* DSIM_STATUS or DSIM_DPHY_STATUS */
  29. #define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
  30. #define DSIM_STOP_STATE_CLK BIT(8)
  31. #define DSIM_TX_READY_HS_CLK BIT(10)
  32. /* DSIM_SWRST */
  33. #define DSIM_FUNCRST BIT(16)
  34. #define DSIM_SWRST BIT(0)
  35. /* DSIM_TIMEOUT */
  36. #define DSIM_LPDR_TIMEOUT(x) ((x) << 0)
  37. #define DSIM_BTA_TIMEOUT(x) ((x) << 16)
  38. /* DSIM_CLKCTRL */
  39. #define DSIM_ESC_PRESCALER(x) (((x) & 0xffff) << 0)
  40. #define DSIM_ESC_PRESCALER_MASK (0xffff << 0)
  41. #define DSIM_LANE_ESC_CLK_EN_DATA(x, offset) (((x) & 0xf) << offset)
  42. #define DSIM_LANE_ESC_CLK_EN_DATA_MASK(offset) (0xf << offset)
  43. #define DSIM_BYTE_CLK_SRC(x) (((x) & 0x3) << 25)
  44. #define DSIM_BYTE_CLK_SRC_MASK (0x3 << 25)
  45. #define DSIM_PLL_BYPASS BIT(27)
  46. /* DSIM_CONFIG */
  47. #define DSIM_LANE_EN_CLK BIT(0)
  48. #define DSIM_LANE_EN(x) (((x) & 0xf) << 1)
  49. #define DSIM_NUM_OF_DATA_LANE(x) (((x) & 0x3) << 5)
  50. #define DSIM_SUB_PIX_FORMAT(x) (((x) & 0x7) << 8)
  51. #define DSIM_MAIN_PIX_FORMAT_MASK (0x7 << 12)
  52. #define DSIM_MAIN_PIX_FORMAT_RGB888 (0x7 << 12)
  53. #define DSIM_MAIN_PIX_FORMAT_RGB666 (0x6 << 12)
  54. #define DSIM_MAIN_PIX_FORMAT_RGB666_P (0x5 << 12)
  55. #define DSIM_MAIN_PIX_FORMAT_RGB565 (0x4 << 12)
  56. #define DSIM_SUB_VC (((x) & 0x3) << 16)
  57. #define DSIM_MAIN_VC (((x) & 0x3) << 18)
  58. #define DSIM_HSA_DISABLE_MODE BIT(20)
  59. #define DSIM_HBP_DISABLE_MODE BIT(21)
  60. #define DSIM_HFP_DISABLE_MODE BIT(22)
  61. /*
  62. * The i.MX 8M Mini Applications Processor Reference Manual,
  63. * Rev. 3, 11/2020 Page 4091
  64. * The i.MX 8M Nano Applications Processor Reference Manual,
  65. * Rev. 2, 07/2022 Page 3058
  66. * The i.MX 8M Plus Applications Processor Reference Manual,
  67. * Rev. 1, 06/2021 Page 5436
  68. * all claims this bit is 'HseDisableMode' with the definition
  69. * 0 = Disables transfer
  70. * 1 = Enables transfer
  71. *
  72. * This clearly states that HSE is not a disabled bit.
  73. *
  74. * The naming convention follows as per the manual and the
  75. * driver logic is based on the MIPI_DSI_MODE_VIDEO_HSE flag.
  76. */
  77. #define DSIM_HSE_DISABLE_MODE BIT(23)
  78. #define DSIM_AUTO_MODE BIT(24)
  79. #define DSIM_BURST_MODE BIT(26)
  80. #define DSIM_SYNC_INFORM BIT(27)
  81. #define DSIM_EOT_DISABLE BIT(28)
  82. #define DSIM_MFLUSH_VS BIT(29)
  83. /* This flag is valid only for exynos3250/3472/5260/5430 */
  84. #define DSIM_CLKLANE_STOP BIT(30)
  85. #define DSIM_NON_CONTINUOUS_CLKLANE BIT(31)
  86. /* DSIM_ESCMODE */
  87. #define DSIM_TX_TRIGGER_RST BIT(4)
  88. #define DSIM_TX_LPDT_LP BIT(6)
  89. #define DSIM_CMD_LPDT_LP BIT(7)
  90. #define DSIM_FORCE_BTA BIT(16)
  91. #define DSIM_FORCE_STOP_STATE BIT(20)
  92. #define DSIM_STOP_STATE_CNT(x) (((x) & 0x7ff) << 21)
  93. #define DSIM_STOP_STATE_CNT_MASK (0x7ff << 21)
  94. /* DSIM_MDRESOL */
  95. #define DSIM_MAIN_STAND_BY BIT(31)
  96. #define DSIM_MAIN_VRESOL(x, num_bits) (((x) & ((1 << (num_bits)) - 1)) << 16)
  97. #define DSIM_MAIN_HRESOL(x, num_bits) (((x) & ((1 << (num_bits)) - 1)) << 0)
  98. /* DSIM_MVPORCH */
  99. #define DSIM_CMD_ALLOW(x) ((x) << 28)
  100. #define DSIM_STABLE_VFP(x) ((x) << 16)
  101. #define DSIM_MAIN_VBP(x) ((x) << 0)
  102. #define DSIM_CMD_ALLOW_MASK (0xf << 28)
  103. #define DSIM_STABLE_VFP_MASK (0x7ff << 16)
  104. #define DSIM_MAIN_VBP_MASK (0x7ff << 0)
  105. /* DSIM_MHPORCH */
  106. #define DSIM_MAIN_HFP(x) ((x) << 16)
  107. #define DSIM_MAIN_HBP(x) ((x) << 0)
  108. #define DSIM_MAIN_HFP_MASK ((0xffff) << 16)
  109. #define DSIM_MAIN_HBP_MASK ((0xffff) << 0)
  110. /* DSIM_MSYNC */
  111. #define DSIM_MAIN_VSA(x, offset) ((x) << offset)
  112. #define DSIM_MAIN_HSA(x) ((x) << 0)
  113. #define DSIM_MAIN_VSA_MASK(offset) ((0x3ff) << offset)
  114. #define DSIM_MAIN_HSA_MASK ((0xffff) << 0)
  115. /* DSIM_SDRESOL */
  116. #define DSIM_SUB_STANDY(x) ((x) << 31)
  117. #define DSIM_SUB_VRESOL(x) ((x) << 16)
  118. #define DSIM_SUB_HRESOL(x) ((x) << 0)
  119. #define DSIM_SUB_STANDY_MASK ((0x1) << 31)
  120. #define DSIM_SUB_VRESOL_MASK ((0x7ff) << 16)
  121. #define DSIM_SUB_HRESOL_MASK ((0x7ff) << 0)
  122. /* DSIM_INTSRC */
  123. #define DSIM_INT_PLL_STABLE BIT(31)
  124. #define DSIM_INT_SW_RST_RELEASE BIT(30)
  125. #define DSIM_INT_SFR_FIFO_EMPTY BIT(29)
  126. #define DSIM_INT_SFR_HDR_FIFO_EMPTY BIT(28)
  127. #define DSIM_INT_BTA BIT(25)
  128. #define DSIM_INT_FRAME_DONE BIT(24)
  129. #define DSIM_INT_RX_TIMEOUT BIT(21)
  130. #define DSIM_INT_BTA_TIMEOUT BIT(20)
  131. #define DSIM_INT_RX_DONE BIT(18)
  132. #define DSIM_INT_RX_TE BIT(17)
  133. #define DSIM_INT_RX_ACK BIT(16)
  134. #define DSIM_INT_RX_ECC_ERR BIT(15)
  135. #define DSIM_INT_RX_CRC_ERR BIT(14)
  136. /* DSIM_SFRCTRL */
  137. #define DSIM_SFR_CTRL_STAND_BY BIT(4)
  138. #define DSIM_SFR_CTRL_SHADOW_UPDATE BIT(1)
  139. #define DSIM_SFR_CTRL_SHADOW_EN BIT(0)
  140. /* DSIM_FIFOCTRL */
  141. #define DSIM_RX_DATA_FULL BIT(25)
  142. #define DSIM_RX_DATA_EMPTY BIT(24)
  143. #define DSIM_SFR_HEADER_FULL BIT(23)
  144. #define DSIM_SFR_HEADER_EMPTY BIT(22)
  145. #define DSIM_SFR_PAYLOAD_FULL BIT(21)
  146. #define DSIM_SFR_PAYLOAD_EMPTY BIT(20)
  147. #define DSIM_I80_HEADER_FULL BIT(19)
  148. #define DSIM_I80_HEADER_EMPTY BIT(18)
  149. #define DSIM_I80_PAYLOAD_FULL BIT(17)
  150. #define DSIM_I80_PAYLOAD_EMPTY BIT(16)
  151. #define DSIM_SD_HEADER_FULL BIT(15)
  152. #define DSIM_SD_HEADER_EMPTY BIT(14)
  153. #define DSIM_SD_PAYLOAD_FULL BIT(13)
  154. #define DSIM_SD_PAYLOAD_EMPTY BIT(12)
  155. #define DSIM_MD_HEADER_FULL BIT(11)
  156. #define DSIM_MD_HEADER_EMPTY BIT(10)
  157. #define DSIM_MD_PAYLOAD_FULL BIT(9)
  158. #define DSIM_MD_PAYLOAD_EMPTY BIT(8)
  159. #define DSIM_RX_FIFO BIT(4)
  160. #define DSIM_SFR_FIFO BIT(3)
  161. #define DSIM_I80_FIFO BIT(2)
  162. #define DSIM_SD_FIFO BIT(1)
  163. #define DSIM_MD_FIFO BIT(0)
  164. /* DSIM_PHYACCHR */
  165. #define DSIM_AFC_EN BIT(14)
  166. #define DSIM_AFC_CTL(x) (((x) & 0x7) << 5)
  167. /* DSIM_PLLCTRL */
  168. #define DSIM_PLL_DPDNSWAP_CLK (1 << 25)
  169. #define DSIM_PLL_DPDNSWAP_DAT (1 << 24)
  170. #define DSIM_FREQ_BAND(x) ((x) << 24)
  171. #define DSIM_PLL_EN BIT(23)
  172. #define DSIM_PLL(x, offset) ((x) << (offset))
  173. /* DSIM_PHYCTRL */
  174. #define DSIM_PHYCTRL_ULPS_EXIT(x) (((x) & 0x1ff) << 0)
  175. #define DSIM_PHYCTRL_B_DPHYCTL_VREG_LP BIT(30)
  176. #define DSIM_PHYCTRL_B_DPHYCTL_SLEW_UP BIT(14)
  177. /* DSIM_PHYTIMING */
  178. #define DSIM_PHYTIMING_LPX(x) ((x) << 8)
  179. #define DSIM_PHYTIMING_HS_EXIT(x) ((x) << 0)
  180. /* DSIM_PHYTIMING1 */
  181. #define DSIM_PHYTIMING1_CLK_PREPARE(x) ((x) << 24)
  182. #define DSIM_PHYTIMING1_CLK_ZERO(x) ((x) << 16)
  183. #define DSIM_PHYTIMING1_CLK_POST(x) ((x) << 8)
  184. #define DSIM_PHYTIMING1_CLK_TRAIL(x) ((x) << 0)
  185. /* DSIM_PHYTIMING2 */
  186. #define DSIM_PHYTIMING2_HS_PREPARE(x) ((x) << 16)
  187. #define DSIM_PHYTIMING2_HS_ZERO(x) ((x) << 8)
  188. #define DSIM_PHYTIMING2_HS_TRAIL(x) ((x) << 0)
  189. #define DSI_MAX_BUS_WIDTH 4
  190. #define DSI_NUM_VIRTUAL_CHANNELS 4
  191. #define DSI_TX_FIFO_SIZE 2048
  192. #define DSI_RX_FIFO_SIZE 256
  193. #define DSI_XFER_TIMEOUT_MS 100
  194. #define DSI_RX_FIFO_EMPTY 0x30800002
  195. #define PS_TO_CYCLE(ps, hz) DIV64_U64_ROUND_CLOSEST(((ps) * (hz)), 1000000000000ULL)
  196. enum samsung_dsim_transfer_type {
  197. EXYNOS_DSI_TX,
  198. EXYNOS_DSI_RX,
  199. };
  200. static struct clk_bulk_data exynos3_clk_bulk_data[] = {
  201. { .id = "bus_clk" },
  202. { .id = "pll_clk" },
  203. };
  204. static struct clk_bulk_data exynos4_clk_bulk_data[] = {
  205. { .id = "bus_clk" },
  206. { .id = "sclk_mipi" },
  207. };
  208. static struct clk_bulk_data exynos5433_clk_bulk_data[] = {
  209. { .id = "bus_clk" },
  210. { .id = "sclk_mipi" },
  211. { .id = "phyclk_mipidphy0_bitclkdiv8" },
  212. { .id = "phyclk_mipidphy0_rxclkesc0" },
  213. { .id = "sclk_rgb_vclk_to_dsim0" },
  214. };
  215. static struct clk_bulk_data exynos7870_clk_bulk_data[] = {
  216. { .id = "bus" },
  217. { .id = "pll" },
  218. { .id = "byte" },
  219. { .id = "esc" },
  220. };
  221. enum reg_idx {
  222. DSIM_STATUS_REG, /* Status register (legacy) */
  223. DSIM_LINK_STATUS_REG, /* Link status register */
  224. DSIM_DPHY_STATUS_REG, /* D-PHY status register */
  225. DSIM_SWRST_REG, /* Software reset register */
  226. DSIM_CLKCTRL_REG, /* Clock control register */
  227. DSIM_TIMEOUT_REG, /* Time out register */
  228. DSIM_CONFIG_REG, /* Configuration register */
  229. DSIM_ESCMODE_REG, /* Escape mode register */
  230. DSIM_MDRESOL_REG,
  231. DSIM_MVPORCH_REG, /* Main display Vporch register */
  232. DSIM_MHPORCH_REG, /* Main display Hporch register */
  233. DSIM_MSYNC_REG, /* Main display sync area register */
  234. DSIM_INTSRC_REG, /* Interrupt source register */
  235. DSIM_INTMSK_REG, /* Interrupt mask register */
  236. DSIM_PKTHDR_REG, /* Packet Header FIFO register */
  237. DSIM_PAYLOAD_REG, /* Payload FIFO register */
  238. DSIM_RXFIFO_REG, /* Read FIFO register */
  239. DSIM_SFRCTRL_REG, /* SFR standby and shadow control register */
  240. DSIM_FIFOCTRL_REG, /* FIFO status and control register */
  241. DSIM_PLLCTRL_REG, /* PLL control register */
  242. DSIM_PHYCTRL_REG,
  243. DSIM_PHYTIMING_REG,
  244. DSIM_PHYTIMING1_REG,
  245. DSIM_PHYTIMING2_REG,
  246. NUM_REGS
  247. };
  248. static const unsigned int exynos_reg_ofs[] = {
  249. [DSIM_STATUS_REG] = 0x00,
  250. [DSIM_SWRST_REG] = 0x04,
  251. [DSIM_CLKCTRL_REG] = 0x08,
  252. [DSIM_TIMEOUT_REG] = 0x0c,
  253. [DSIM_CONFIG_REG] = 0x10,
  254. [DSIM_ESCMODE_REG] = 0x14,
  255. [DSIM_MDRESOL_REG] = 0x18,
  256. [DSIM_MVPORCH_REG] = 0x1c,
  257. [DSIM_MHPORCH_REG] = 0x20,
  258. [DSIM_MSYNC_REG] = 0x24,
  259. [DSIM_INTSRC_REG] = 0x2c,
  260. [DSIM_INTMSK_REG] = 0x30,
  261. [DSIM_PKTHDR_REG] = 0x34,
  262. [DSIM_PAYLOAD_REG] = 0x38,
  263. [DSIM_RXFIFO_REG] = 0x3c,
  264. [DSIM_FIFOCTRL_REG] = 0x44,
  265. [DSIM_PLLCTRL_REG] = 0x4c,
  266. [DSIM_PHYCTRL_REG] = 0x5c,
  267. [DSIM_PHYTIMING_REG] = 0x64,
  268. [DSIM_PHYTIMING1_REG] = 0x68,
  269. [DSIM_PHYTIMING2_REG] = 0x6c,
  270. };
  271. static const unsigned int exynos5433_reg_ofs[] = {
  272. [DSIM_STATUS_REG] = 0x04,
  273. [DSIM_SWRST_REG] = 0x0C,
  274. [DSIM_CLKCTRL_REG] = 0x10,
  275. [DSIM_TIMEOUT_REG] = 0x14,
  276. [DSIM_CONFIG_REG] = 0x18,
  277. [DSIM_ESCMODE_REG] = 0x1C,
  278. [DSIM_MDRESOL_REG] = 0x20,
  279. [DSIM_MVPORCH_REG] = 0x24,
  280. [DSIM_MHPORCH_REG] = 0x28,
  281. [DSIM_MSYNC_REG] = 0x2C,
  282. [DSIM_INTSRC_REG] = 0x34,
  283. [DSIM_INTMSK_REG] = 0x38,
  284. [DSIM_PKTHDR_REG] = 0x3C,
  285. [DSIM_PAYLOAD_REG] = 0x40,
  286. [DSIM_RXFIFO_REG] = 0x44,
  287. [DSIM_FIFOCTRL_REG] = 0x4C,
  288. [DSIM_PLLCTRL_REG] = 0x94,
  289. [DSIM_PHYCTRL_REG] = 0xA4,
  290. [DSIM_PHYTIMING_REG] = 0xB4,
  291. [DSIM_PHYTIMING1_REG] = 0xB8,
  292. [DSIM_PHYTIMING2_REG] = 0xBC,
  293. };
  294. static const unsigned int exynos7870_reg_ofs[] = {
  295. [DSIM_LINK_STATUS_REG] = 0x04,
  296. [DSIM_DPHY_STATUS_REG] = 0x08,
  297. [DSIM_SWRST_REG] = 0x0C,
  298. [DSIM_CLKCTRL_REG] = 0x10,
  299. [DSIM_TIMEOUT_REG] = 0x14,
  300. [DSIM_ESCMODE_REG] = 0x1C,
  301. [DSIM_MDRESOL_REG] = 0x20,
  302. [DSIM_MVPORCH_REG] = 0x24,
  303. [DSIM_MHPORCH_REG] = 0x28,
  304. [DSIM_MSYNC_REG] = 0x2C,
  305. [DSIM_CONFIG_REG] = 0x30,
  306. [DSIM_INTSRC_REG] = 0x34,
  307. [DSIM_INTMSK_REG] = 0x38,
  308. [DSIM_PKTHDR_REG] = 0x3C,
  309. [DSIM_PAYLOAD_REG] = 0x40,
  310. [DSIM_RXFIFO_REG] = 0x44,
  311. [DSIM_SFRCTRL_REG] = 0x48,
  312. [DSIM_FIFOCTRL_REG] = 0x4C,
  313. [DSIM_PLLCTRL_REG] = 0x94,
  314. [DSIM_PHYCTRL_REG] = 0xA4,
  315. [DSIM_PHYTIMING_REG] = 0xB4,
  316. [DSIM_PHYTIMING1_REG] = 0xB8,
  317. [DSIM_PHYTIMING2_REG] = 0xBC,
  318. };
  319. enum reg_value_idx {
  320. RESET_TYPE,
  321. PLL_TIMER,
  322. STOP_STATE_CNT,
  323. PHYCTRL_ULPS_EXIT,
  324. PHYCTRL_VREG_LP,
  325. PHYCTRL_SLEW_UP,
  326. PHYTIMING_LPX,
  327. PHYTIMING_HS_EXIT,
  328. PHYTIMING_CLK_PREPARE,
  329. PHYTIMING_CLK_ZERO,
  330. PHYTIMING_CLK_POST,
  331. PHYTIMING_CLK_TRAIL,
  332. PHYTIMING_HS_PREPARE,
  333. PHYTIMING_HS_ZERO,
  334. PHYTIMING_HS_TRAIL
  335. };
  336. static const unsigned int reg_values[] = {
  337. [RESET_TYPE] = DSIM_SWRST,
  338. [PLL_TIMER] = 500,
  339. [STOP_STATE_CNT] = 0xf,
  340. [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0x0af),
  341. [PHYCTRL_VREG_LP] = 0,
  342. [PHYCTRL_SLEW_UP] = 0,
  343. [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x06),
  344. [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0b),
  345. [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x07),
  346. [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x27),
  347. [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0d),
  348. [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x08),
  349. [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x09),
  350. [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x0d),
  351. [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0b),
  352. };
  353. static const unsigned int exynos5422_reg_values[] = {
  354. [RESET_TYPE] = DSIM_SWRST,
  355. [PLL_TIMER] = 500,
  356. [STOP_STATE_CNT] = 0xf,
  357. [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0xaf),
  358. [PHYCTRL_VREG_LP] = 0,
  359. [PHYCTRL_SLEW_UP] = 0,
  360. [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x08),
  361. [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0d),
  362. [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x09),
  363. [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x30),
  364. [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0e),
  365. [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x0a),
  366. [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x0c),
  367. [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x11),
  368. [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0d),
  369. };
  370. static const unsigned int exynos5433_reg_values[] = {
  371. [RESET_TYPE] = DSIM_FUNCRST,
  372. [PLL_TIMER] = 22200,
  373. [STOP_STATE_CNT] = 0xa,
  374. [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0x190),
  375. [PHYCTRL_VREG_LP] = DSIM_PHYCTRL_B_DPHYCTL_VREG_LP,
  376. [PHYCTRL_SLEW_UP] = DSIM_PHYCTRL_B_DPHYCTL_SLEW_UP,
  377. [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x07),
  378. [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0c),
  379. [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x09),
  380. [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x2d),
  381. [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0e),
  382. [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x09),
  383. [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x0b),
  384. [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x10),
  385. [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c),
  386. };
  387. static const unsigned int exynos7870_reg_values[] = {
  388. [RESET_TYPE] = DSIM_SWRST,
  389. [PLL_TIMER] = 80000,
  390. [STOP_STATE_CNT] = 0xa,
  391. [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0x177),
  392. [PHYCTRL_VREG_LP] = 0,
  393. [PHYCTRL_SLEW_UP] = 0,
  394. [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x07),
  395. [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0c),
  396. [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x08),
  397. [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x2b),
  398. [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0d),
  399. [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x09),
  400. [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x09),
  401. [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x0f),
  402. [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0c),
  403. };
  404. static const unsigned int imx8mm_dsim_reg_values[] = {
  405. [RESET_TYPE] = DSIM_SWRST,
  406. [PLL_TIMER] = 500,
  407. [STOP_STATE_CNT] = 0xf,
  408. [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0xaf),
  409. [PHYCTRL_VREG_LP] = 0,
  410. [PHYCTRL_SLEW_UP] = 0,
  411. [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x06),
  412. [PHYTIMING_HS_EXIT] = DSIM_PHYTIMING_HS_EXIT(0x0b),
  413. [PHYTIMING_CLK_PREPARE] = DSIM_PHYTIMING1_CLK_PREPARE(0x07),
  414. [PHYTIMING_CLK_ZERO] = DSIM_PHYTIMING1_CLK_ZERO(0x26),
  415. [PHYTIMING_CLK_POST] = DSIM_PHYTIMING1_CLK_POST(0x0d),
  416. [PHYTIMING_CLK_TRAIL] = DSIM_PHYTIMING1_CLK_TRAIL(0x08),
  417. [PHYTIMING_HS_PREPARE] = DSIM_PHYTIMING2_HS_PREPARE(0x08),
  418. [PHYTIMING_HS_ZERO] = DSIM_PHYTIMING2_HS_ZERO(0x0d),
  419. [PHYTIMING_HS_TRAIL] = DSIM_PHYTIMING2_HS_TRAIL(0x0b),
  420. };
  421. static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
  422. .reg_ofs = exynos_reg_ofs,
  423. .plltmr_reg = 0x50,
  424. .has_legacy_status_reg = 1,
  425. .has_freqband = 1,
  426. .has_clklane_stop = 1,
  427. .clk_data = exynos3_clk_bulk_data,
  428. .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data),
  429. .max_freq = 1000,
  430. .wait_for_hdr_fifo = 1,
  431. .wait_for_reset = 1,
  432. .num_bits_resol = 11,
  433. .video_mode_bit = 25,
  434. .pll_stable_bit = 31,
  435. .esc_clken_bit = 28,
  436. .byte_clken_bit = 24,
  437. .tx_req_hsclk_bit = 31,
  438. .lane_esc_clk_bit = 19,
  439. .lane_esc_data_offset = 20,
  440. .pll_p_offset = 13,
  441. .pll_m_offset = 4,
  442. .pll_s_offset = 1,
  443. .main_vsa_offset = 22,
  444. .reg_values = reg_values,
  445. .pll_fin_min = 6,
  446. .pll_fin_max = 12,
  447. .m_min = 41,
  448. .m_max = 125,
  449. .min_freq = 500,
  450. .has_broken_fifoctrl_emptyhdr = 1,
  451. };
  452. static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
  453. .reg_ofs = exynos_reg_ofs,
  454. .plltmr_reg = 0x50,
  455. .has_legacy_status_reg = 1,
  456. .has_freqband = 1,
  457. .has_clklane_stop = 1,
  458. .clk_data = exynos4_clk_bulk_data,
  459. .num_clks = ARRAY_SIZE(exynos4_clk_bulk_data),
  460. .max_freq = 1000,
  461. .wait_for_hdr_fifo = 1,
  462. .wait_for_reset = 1,
  463. .num_bits_resol = 11,
  464. .video_mode_bit = 25,
  465. .pll_stable_bit = 31,
  466. .esc_clken_bit = 28,
  467. .byte_clken_bit = 24,
  468. .tx_req_hsclk_bit = 31,
  469. .lane_esc_clk_bit = 19,
  470. .lane_esc_data_offset = 20,
  471. .pll_p_offset = 13,
  472. .pll_m_offset = 4,
  473. .pll_s_offset = 1,
  474. .main_vsa_offset = 22,
  475. .reg_values = reg_values,
  476. .pll_fin_min = 6,
  477. .pll_fin_max = 12,
  478. .m_min = 41,
  479. .m_max = 125,
  480. .min_freq = 500,
  481. .has_broken_fifoctrl_emptyhdr = 1,
  482. };
  483. static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
  484. .reg_ofs = exynos_reg_ofs,
  485. .plltmr_reg = 0x58,
  486. .has_legacy_status_reg = 1,
  487. .clk_data = exynos3_clk_bulk_data,
  488. .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data),
  489. .max_freq = 1000,
  490. .wait_for_hdr_fifo = 1,
  491. .wait_for_reset = 1,
  492. .num_bits_resol = 11,
  493. .video_mode_bit = 25,
  494. .pll_stable_bit = 31,
  495. .esc_clken_bit = 28,
  496. .byte_clken_bit = 24,
  497. .tx_req_hsclk_bit = 31,
  498. .lane_esc_clk_bit = 19,
  499. .lane_esc_data_offset = 20,
  500. .pll_p_offset = 13,
  501. .pll_m_offset = 4,
  502. .pll_s_offset = 1,
  503. .main_vsa_offset = 22,
  504. .reg_values = reg_values,
  505. .pll_fin_min = 6,
  506. .pll_fin_max = 12,
  507. .m_min = 41,
  508. .m_max = 125,
  509. .min_freq = 500,
  510. };
  511. static const struct samsung_dsim_driver_data exynos5433_dsi_driver_data = {
  512. .reg_ofs = exynos5433_reg_ofs,
  513. .plltmr_reg = 0xa0,
  514. .has_legacy_status_reg = 1,
  515. .has_clklane_stop = 1,
  516. .clk_data = exynos5433_clk_bulk_data,
  517. .num_clks = ARRAY_SIZE(exynos5433_clk_bulk_data),
  518. .max_freq = 1500,
  519. .wait_for_hdr_fifo = 1,
  520. .wait_for_reset = 0,
  521. .num_bits_resol = 12,
  522. .video_mode_bit = 25,
  523. .pll_stable_bit = 31,
  524. .esc_clken_bit = 28,
  525. .byte_clken_bit = 24,
  526. .tx_req_hsclk_bit = 31,
  527. .lane_esc_clk_bit = 19,
  528. .lane_esc_data_offset = 20,
  529. .pll_p_offset = 13,
  530. .pll_m_offset = 4,
  531. .pll_s_offset = 1,
  532. .main_vsa_offset = 22,
  533. .reg_values = exynos5433_reg_values,
  534. .pll_fin_min = 6,
  535. .pll_fin_max = 12,
  536. .m_min = 41,
  537. .m_max = 125,
  538. .min_freq = 500,
  539. };
  540. static const struct samsung_dsim_driver_data exynos5422_dsi_driver_data = {
  541. .reg_ofs = exynos5433_reg_ofs,
  542. .plltmr_reg = 0xa0,
  543. .has_legacy_status_reg = 1,
  544. .has_clklane_stop = 1,
  545. .clk_data = exynos3_clk_bulk_data,
  546. .num_clks = ARRAY_SIZE(exynos3_clk_bulk_data),
  547. .max_freq = 1500,
  548. .wait_for_hdr_fifo = 1,
  549. .wait_for_reset = 1,
  550. .num_bits_resol = 12,
  551. .video_mode_bit = 25,
  552. .pll_stable_bit = 31,
  553. .esc_clken_bit = 28,
  554. .byte_clken_bit = 24,
  555. .tx_req_hsclk_bit = 31,
  556. .lane_esc_clk_bit = 19,
  557. .lane_esc_data_offset = 20,
  558. .pll_p_offset = 13,
  559. .pll_m_offset = 4,
  560. .pll_s_offset = 1,
  561. .main_vsa_offset = 22,
  562. .reg_values = exynos5422_reg_values,
  563. .pll_fin_min = 6,
  564. .pll_fin_max = 12,
  565. .m_min = 41,
  566. .m_max = 125,
  567. .min_freq = 500,
  568. };
  569. static const struct samsung_dsim_driver_data exynos7870_dsi_driver_data = {
  570. .reg_ofs = exynos7870_reg_ofs,
  571. .plltmr_reg = 0xa0,
  572. .has_clklane_stop = 1,
  573. .has_sfrctrl = 1,
  574. .clk_data = exynos7870_clk_bulk_data,
  575. .num_clks = ARRAY_SIZE(exynos7870_clk_bulk_data),
  576. .max_freq = 1500,
  577. .wait_for_hdr_fifo = 0,
  578. .wait_for_reset = 1,
  579. .num_bits_resol = 12,
  580. .video_mode_bit = 18,
  581. .pll_stable_bit = 24,
  582. .esc_clken_bit = 16,
  583. .byte_clken_bit = 17,
  584. .tx_req_hsclk_bit = 20,
  585. .lane_esc_clk_bit = 8,
  586. .lane_esc_data_offset = 9,
  587. .pll_p_offset = 13,
  588. .pll_m_offset = 3,
  589. .pll_s_offset = 0,
  590. .main_vsa_offset = 16,
  591. .reg_values = exynos7870_reg_values,
  592. .pll_fin_min = 6,
  593. .pll_fin_max = 12,
  594. .m_min = 41,
  595. .m_max = 125,
  596. .min_freq = 500,
  597. };
  598. static const struct samsung_dsim_driver_data imx8mm_dsi_driver_data = {
  599. .reg_ofs = exynos5433_reg_ofs,
  600. .plltmr_reg = 0xa0,
  601. .has_legacy_status_reg = 1,
  602. .has_clklane_stop = 1,
  603. .clk_data = exynos4_clk_bulk_data,
  604. .num_clks = ARRAY_SIZE(exynos4_clk_bulk_data),
  605. .max_freq = 2100,
  606. .wait_for_hdr_fifo = 1,
  607. .wait_for_reset = 0,
  608. .num_bits_resol = 12,
  609. .video_mode_bit = 25,
  610. .pll_stable_bit = 31,
  611. .esc_clken_bit = 28,
  612. .byte_clken_bit = 24,
  613. .tx_req_hsclk_bit = 31,
  614. .lane_esc_clk_bit = 19,
  615. .lane_esc_data_offset = 20,
  616. /*
  617. * Unlike Exynos, PLL_P(PMS_P) offset 14 is used in i.MX8M Mini/Nano/Plus
  618. * downstream driver - drivers/gpu/drm/bridge/sec-dsim.c
  619. */
  620. .pll_p_offset = 14,
  621. .pll_m_offset = 4,
  622. .pll_s_offset = 1,
  623. .main_vsa_offset = 22,
  624. .reg_values = imx8mm_dsim_reg_values,
  625. .pll_fin_min = 2,
  626. .pll_fin_max = 30,
  627. .m_min = 64,
  628. .m_max = 1023,
  629. .min_freq = 1050,
  630. };
  631. static const struct samsung_dsim_driver_data *
  632. samsung_dsim_types[DSIM_TYPE_COUNT] = {
  633. [DSIM_TYPE_EXYNOS3250] = &exynos3_dsi_driver_data,
  634. [DSIM_TYPE_EXYNOS4210] = &exynos4_dsi_driver_data,
  635. [DSIM_TYPE_EXYNOS5410] = &exynos5_dsi_driver_data,
  636. [DSIM_TYPE_EXYNOS5422] = &exynos5422_dsi_driver_data,
  637. [DSIM_TYPE_EXYNOS5433] = &exynos5433_dsi_driver_data,
  638. [DSIM_TYPE_EXYNOS7870] = &exynos7870_dsi_driver_data,
  639. [DSIM_TYPE_IMX8MM] = &imx8mm_dsi_driver_data,
  640. [DSIM_TYPE_IMX8MP] = &imx8mm_dsi_driver_data,
  641. };
  642. static inline struct samsung_dsim *host_to_dsi(struct mipi_dsi_host *h)
  643. {
  644. return container_of(h, struct samsung_dsim, dsi_host);
  645. }
  646. static inline struct samsung_dsim *bridge_to_dsi(struct drm_bridge *b)
  647. {
  648. return container_of(b, struct samsung_dsim, bridge);
  649. }
  650. static inline void samsung_dsim_write(struct samsung_dsim *dsi,
  651. enum reg_idx idx, u32 val)
  652. {
  653. writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]);
  654. }
  655. static inline u32 samsung_dsim_read(struct samsung_dsim *dsi, enum reg_idx idx)
  656. {
  657. return readl(dsi->reg_base + dsi->driver_data->reg_ofs[idx]);
  658. }
  659. static void samsung_dsim_wait_for_reset(struct samsung_dsim *dsi)
  660. {
  661. if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300)))
  662. return;
  663. dev_err(dsi->dev, "timeout waiting for reset\n");
  664. }
  665. static void samsung_dsim_reset(struct samsung_dsim *dsi)
  666. {
  667. u32 reset_val = dsi->driver_data->reg_values[RESET_TYPE];
  668. reinit_completion(&dsi->completed);
  669. samsung_dsim_write(dsi, DSIM_SWRST_REG, reset_val);
  670. }
  671. static unsigned long samsung_dsim_pll_find_pms(struct samsung_dsim *dsi,
  672. unsigned long fin,
  673. unsigned long fout,
  674. u8 *p, u16 *m, u8 *s)
  675. {
  676. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  677. unsigned long best_freq = 0;
  678. u32 min_delta = 0xffffffff;
  679. u8 p_min, p_max;
  680. u8 _p, best_p;
  681. u16 _m, best_m;
  682. u8 _s, best_s;
  683. p_min = DIV_ROUND_UP(fin, (driver_data->pll_fin_max * HZ_PER_MHZ));
  684. p_max = fin / (driver_data->pll_fin_min * HZ_PER_MHZ);
  685. for (_p = p_min; _p <= p_max; ++_p) {
  686. for (_s = 0; _s <= 5; ++_s) {
  687. u64 tmp;
  688. u32 delta;
  689. tmp = (u64)fout * (_p << _s);
  690. do_div(tmp, fin);
  691. _m = tmp;
  692. if (_m < driver_data->m_min || _m > driver_data->m_max)
  693. continue;
  694. tmp = (u64)_m * fin;
  695. do_div(tmp, _p);
  696. if (tmp < driver_data->min_freq * HZ_PER_MHZ ||
  697. tmp > driver_data->max_freq * HZ_PER_MHZ)
  698. continue;
  699. tmp = (u64)_m * fin;
  700. do_div(tmp, _p << _s);
  701. delta = abs(fout - tmp);
  702. if (delta < min_delta) {
  703. best_p = _p;
  704. best_m = _m;
  705. best_s = _s;
  706. min_delta = delta;
  707. best_freq = tmp;
  708. }
  709. }
  710. }
  711. if (best_freq) {
  712. *p = best_p;
  713. *m = best_m;
  714. *s = best_s;
  715. }
  716. return best_freq;
  717. }
  718. static unsigned long samsung_dsim_set_pll(struct samsung_dsim *dsi,
  719. unsigned long freq)
  720. {
  721. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  722. unsigned long fin, fout;
  723. int timeout;
  724. u8 p, s;
  725. u16 m;
  726. u32 reg;
  727. if (dsi->pll_clk) {
  728. /*
  729. * Ensure that the reference clock is generated with a power of
  730. * two divider from its parent, but close to the PLLs upper
  731. * limit.
  732. */
  733. fin = clk_get_rate(clk_get_parent(dsi->pll_clk));
  734. while (fin > driver_data->pll_fin_max * HZ_PER_MHZ)
  735. fin /= 2;
  736. clk_set_rate(dsi->pll_clk, fin);
  737. fin = clk_get_rate(dsi->pll_clk);
  738. } else {
  739. fin = dsi->pll_clk_rate;
  740. }
  741. dev_dbg(dsi->dev, "PLL ref clock freq %lu\n", fin);
  742. fout = samsung_dsim_pll_find_pms(dsi, fin, freq, &p, &m, &s);
  743. if (!fout) {
  744. dev_err(dsi->dev,
  745. "failed to find PLL PMS for requested frequency\n");
  746. return 0;
  747. }
  748. dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s);
  749. writel(driver_data->reg_values[PLL_TIMER],
  750. dsi->reg_base + driver_data->plltmr_reg);
  751. reg = DSIM_PLL_EN | DSIM_PLL(p, driver_data->pll_p_offset)
  752. | DSIM_PLL(m, driver_data->pll_m_offset)
  753. | DSIM_PLL(s, driver_data->pll_s_offset);
  754. if (driver_data->has_freqband) {
  755. static const unsigned long freq_bands[] = {
  756. 100 * HZ_PER_MHZ, 120 * HZ_PER_MHZ, 160 * HZ_PER_MHZ,
  757. 200 * HZ_PER_MHZ, 270 * HZ_PER_MHZ, 320 * HZ_PER_MHZ,
  758. 390 * HZ_PER_MHZ, 450 * HZ_PER_MHZ, 510 * HZ_PER_MHZ,
  759. 560 * HZ_PER_MHZ, 640 * HZ_PER_MHZ, 690 * HZ_PER_MHZ,
  760. 770 * HZ_PER_MHZ, 870 * HZ_PER_MHZ, 950 * HZ_PER_MHZ,
  761. };
  762. int band;
  763. for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
  764. if (fout < freq_bands[band])
  765. break;
  766. dev_dbg(dsi->dev, "band %d\n", band);
  767. reg |= DSIM_FREQ_BAND(band);
  768. }
  769. if (dsi->swap_dn_dp_clk)
  770. reg |= DSIM_PLL_DPDNSWAP_CLK;
  771. if (dsi->swap_dn_dp_data)
  772. reg |= DSIM_PLL_DPDNSWAP_DAT;
  773. samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg);
  774. timeout = 3000;
  775. do {
  776. if (timeout-- == 0) {
  777. dev_err(dsi->dev, "PLL failed to stabilize\n");
  778. return 0;
  779. }
  780. if (driver_data->has_legacy_status_reg)
  781. reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
  782. else
  783. reg = samsung_dsim_read(dsi, DSIM_LINK_STATUS_REG);
  784. } while ((reg & BIT(driver_data->pll_stable_bit)) == 0);
  785. dsi->hs_clock = fout;
  786. return fout;
  787. }
  788. static int samsung_dsim_enable_clock(struct samsung_dsim *dsi)
  789. {
  790. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  791. unsigned long hs_clk, byte_clk, esc_clk, pix_clk;
  792. unsigned long esc_div;
  793. u32 reg;
  794. struct drm_display_mode *m = &dsi->mode;
  795. int bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
  796. /* m->clock is in KHz */
  797. pix_clk = m->clock * 1000;
  798. /* Use burst_clk_rate if available, otherwise use the pix_clk */
  799. if (dsi->burst_clk_rate)
  800. hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate);
  801. else
  802. hs_clk = samsung_dsim_set_pll(dsi, DIV_ROUND_UP(pix_clk * bpp, dsi->lanes));
  803. if (!hs_clk) {
  804. dev_err(dsi->dev, "failed to configure DSI PLL\n");
  805. return -EFAULT;
  806. }
  807. byte_clk = hs_clk / 8;
  808. esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate);
  809. esc_clk = byte_clk / esc_div;
  810. if (esc_clk > 20 * HZ_PER_MHZ) {
  811. ++esc_div;
  812. esc_clk = byte_clk / esc_div;
  813. }
  814. dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n",
  815. hs_clk, byte_clk, esc_clk);
  816. reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG);
  817. reg &= ~(DSIM_ESC_PRESCALER_MASK | BIT(driver_data->lane_esc_clk_bit)
  818. | DSIM_LANE_ESC_CLK_EN_DATA_MASK(driver_data->lane_esc_data_offset)
  819. | DSIM_PLL_BYPASS
  820. | DSIM_BYTE_CLK_SRC_MASK);
  821. reg |= BIT(driver_data->esc_clken_bit) | BIT(driver_data->byte_clken_bit)
  822. | DSIM_ESC_PRESCALER(esc_div)
  823. | BIT(driver_data->lane_esc_clk_bit)
  824. | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1,
  825. driver_data->lane_esc_data_offset)
  826. | DSIM_BYTE_CLK_SRC(0)
  827. | BIT(driver_data->tx_req_hsclk_bit);
  828. samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg);
  829. return 0;
  830. }
  831. static void samsung_dsim_set_phy_ctrl(struct samsung_dsim *dsi)
  832. {
  833. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  834. const unsigned int *reg_values = driver_data->reg_values;
  835. u32 reg;
  836. struct phy_configure_opts_mipi_dphy cfg;
  837. int clk_prepare, lpx, clk_zero, clk_post, clk_trail;
  838. int hs_exit, hs_prepare, hs_zero, hs_trail;
  839. unsigned long long byte_clock = dsi->hs_clock / 8;
  840. if (driver_data->has_freqband)
  841. return;
  842. phy_mipi_dphy_get_default_config_for_hsclk(dsi->hs_clock,
  843. dsi->lanes, &cfg);
  844. /*
  845. * TODO:
  846. * The tech Applications Processor manuals for i.MX8M Mini, Nano,
  847. * and Plus don't state what the definition of the PHYTIMING
  848. * bits are beyond their address and bit position.
  849. * After reviewing NXP's downstream code, it appears
  850. * that the various PHYTIMING registers take the number
  851. * of cycles and use various dividers on them. This
  852. * calculation does not result in an exact match to the
  853. * downstream code, but it is very close to the values
  854. * generated by their lookup table, and it appears
  855. * to sync at a variety of resolutions. If someone
  856. * can get a more accurate mathematical equation needed
  857. * for these registers, this should be updated.
  858. */
  859. lpx = PS_TO_CYCLE(cfg.lpx, byte_clock);
  860. hs_exit = PS_TO_CYCLE(cfg.hs_exit, byte_clock);
  861. clk_prepare = PS_TO_CYCLE(cfg.clk_prepare, byte_clock);
  862. clk_zero = PS_TO_CYCLE(cfg.clk_zero, byte_clock);
  863. clk_post = PS_TO_CYCLE(cfg.clk_post, byte_clock);
  864. clk_trail = PS_TO_CYCLE(cfg.clk_trail, byte_clock);
  865. hs_prepare = PS_TO_CYCLE(cfg.hs_prepare, byte_clock);
  866. hs_zero = PS_TO_CYCLE(cfg.hs_zero, byte_clock);
  867. hs_trail = PS_TO_CYCLE(cfg.hs_trail, byte_clock);
  868. /* B D-PHY: D-PHY Master & Slave Analog Block control */
  869. reg = reg_values[PHYCTRL_ULPS_EXIT] | reg_values[PHYCTRL_VREG_LP] |
  870. reg_values[PHYCTRL_SLEW_UP];
  871. samsung_dsim_write(dsi, DSIM_PHYCTRL_REG, reg);
  872. /*
  873. * T LPX: Transmitted length of any Low-Power state period
  874. * T HS-EXIT: Time that the transmitter drives LP-11 following a HS
  875. * burst
  876. */
  877. reg = DSIM_PHYTIMING_LPX(lpx) | DSIM_PHYTIMING_HS_EXIT(hs_exit);
  878. samsung_dsim_write(dsi, DSIM_PHYTIMING_REG, reg);
  879. /*
  880. * T CLK-PREPARE: Time that the transmitter drives the Clock Lane LP-00
  881. * Line state immediately before the HS-0 Line state starting the
  882. * HS transmission
  883. * T CLK-ZERO: Time that the transmitter drives the HS-0 state prior to
  884. * transmitting the Clock.
  885. * T CLK_POST: Time that the transmitter continues to send HS clock
  886. * after the last associated Data Lane has transitioned to LP Mode
  887. * Interval is defined as the period from the end of T HS-TRAIL to
  888. * the beginning of T CLK-TRAIL
  889. * T CLK-TRAIL: Time that the transmitter drives the HS-0 state after
  890. * the last payload clock bit of a HS transmission burst
  891. */
  892. reg = DSIM_PHYTIMING1_CLK_PREPARE(clk_prepare) |
  893. DSIM_PHYTIMING1_CLK_ZERO(clk_zero) |
  894. DSIM_PHYTIMING1_CLK_POST(clk_post) |
  895. DSIM_PHYTIMING1_CLK_TRAIL(clk_trail);
  896. samsung_dsim_write(dsi, DSIM_PHYTIMING1_REG, reg);
  897. /*
  898. * T HS-PREPARE: Time that the transmitter drives the Data Lane LP-00
  899. * Line state immediately before the HS-0 Line state starting the
  900. * HS transmission
  901. * T HS-ZERO: Time that the transmitter drives the HS-0 state prior to
  902. * transmitting the Sync sequence.
  903. * T HS-TRAIL: Time that the transmitter drives the flipped differential
  904. * state after last payload data bit of a HS transmission burst
  905. */
  906. reg = DSIM_PHYTIMING2_HS_PREPARE(hs_prepare) |
  907. DSIM_PHYTIMING2_HS_ZERO(hs_zero) |
  908. DSIM_PHYTIMING2_HS_TRAIL(hs_trail);
  909. samsung_dsim_write(dsi, DSIM_PHYTIMING2_REG, reg);
  910. }
  911. static void samsung_dsim_disable_clock(struct samsung_dsim *dsi)
  912. {
  913. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  914. u32 reg;
  915. reg = samsung_dsim_read(dsi, DSIM_CLKCTRL_REG);
  916. reg &= ~(BIT(driver_data->lane_esc_clk_bit)
  917. | DSIM_LANE_ESC_CLK_EN_DATA_MASK(driver_data->lane_esc_data_offset)
  918. | BIT(driver_data->esc_clken_bit)
  919. | BIT(driver_data->byte_clken_bit));
  920. samsung_dsim_write(dsi, DSIM_CLKCTRL_REG, reg);
  921. reg = samsung_dsim_read(dsi, DSIM_PLLCTRL_REG);
  922. reg &= ~DSIM_PLL_EN;
  923. samsung_dsim_write(dsi, DSIM_PLLCTRL_REG, reg);
  924. }
  925. static void samsung_dsim_enable_lane(struct samsung_dsim *dsi, u32 lane)
  926. {
  927. u32 reg = samsung_dsim_read(dsi, DSIM_CONFIG_REG);
  928. reg |= (DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1) | DSIM_LANE_EN_CLK |
  929. DSIM_LANE_EN(lane));
  930. samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg);
  931. }
  932. static int samsung_dsim_init_link(struct samsung_dsim *dsi)
  933. {
  934. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  935. int timeout;
  936. u32 reg;
  937. u32 lanes_mask;
  938. /* Initialize FIFO pointers */
  939. reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG);
  940. reg &= ~0x1f;
  941. samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg);
  942. usleep_range(9000, 11000);
  943. reg |= 0x1f;
  944. samsung_dsim_write(dsi, DSIM_FIFOCTRL_REG, reg);
  945. usleep_range(9000, 11000);
  946. /* DSI configuration */
  947. reg = 0;
  948. /*
  949. * The first bit of mode_flags specifies display configuration.
  950. * If this bit is set[= MIPI_DSI_MODE_VIDEO], dsi will support video
  951. * mode, otherwise it will support command mode.
  952. */
  953. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
  954. reg |= BIT(driver_data->video_mode_bit);
  955. /*
  956. * The user manual describes that following bits are ignored in
  957. * command mode.
  958. */
  959. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
  960. reg |= DSIM_SYNC_INFORM;
  961. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)
  962. reg |= DSIM_BURST_MODE;
  963. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT)
  964. reg |= DSIM_AUTO_MODE;
  965. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE)
  966. reg |= DSIM_HSE_DISABLE_MODE;
  967. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HFP)
  968. reg |= DSIM_HFP_DISABLE_MODE;
  969. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HBP)
  970. reg |= DSIM_HBP_DISABLE_MODE;
  971. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_NO_HSA)
  972. reg |= DSIM_HSA_DISABLE_MODE;
  973. }
  974. if (dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)
  975. reg |= DSIM_EOT_DISABLE;
  976. switch (dsi->format) {
  977. case MIPI_DSI_FMT_RGB888:
  978. reg |= DSIM_MAIN_PIX_FORMAT_RGB888;
  979. break;
  980. case MIPI_DSI_FMT_RGB666:
  981. reg |= DSIM_MAIN_PIX_FORMAT_RGB666;
  982. break;
  983. case MIPI_DSI_FMT_RGB666_PACKED:
  984. reg |= DSIM_MAIN_PIX_FORMAT_RGB666_P;
  985. break;
  986. case MIPI_DSI_FMT_RGB565:
  987. reg |= DSIM_MAIN_PIX_FORMAT_RGB565;
  988. break;
  989. default:
  990. dev_err(dsi->dev, "invalid pixel format\n");
  991. return -EINVAL;
  992. }
  993. /*
  994. * Use non-continuous clock mode if the periparal wants and
  995. * host controller supports
  996. *
  997. * In non-continous clock mode, host controller will turn off
  998. * the HS clock between high-speed transmissions to reduce
  999. * power consumption.
  1000. */
  1001. if (driver_data->has_clklane_stop &&
  1002. dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) {
  1003. if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type))
  1004. reg |= DSIM_NON_CONTINUOUS_CLKLANE;
  1005. reg |= DSIM_CLKLANE_STOP;
  1006. }
  1007. samsung_dsim_write(dsi, DSIM_CONFIG_REG, reg);
  1008. lanes_mask = BIT(dsi->lanes) - 1;
  1009. samsung_dsim_enable_lane(dsi, lanes_mask);
  1010. /* Check clock and data lane state are stop state */
  1011. timeout = 100;
  1012. do {
  1013. if (timeout-- == 0) {
  1014. dev_err(dsi->dev, "waiting for bus lanes timed out\n");
  1015. return -EFAULT;
  1016. }
  1017. if (driver_data->has_legacy_status_reg)
  1018. reg = samsung_dsim_read(dsi, DSIM_STATUS_REG);
  1019. else
  1020. reg = samsung_dsim_read(dsi, DSIM_DPHY_STATUS_REG);
  1021. if ((reg & DSIM_STOP_STATE_DAT(lanes_mask))
  1022. != DSIM_STOP_STATE_DAT(lanes_mask))
  1023. continue;
  1024. } while (!(reg & (DSIM_STOP_STATE_CLK | DSIM_TX_READY_HS_CLK)));
  1025. reg = samsung_dsim_read(dsi, DSIM_ESCMODE_REG);
  1026. reg &= ~DSIM_STOP_STATE_CNT_MASK;
  1027. reg |= DSIM_STOP_STATE_CNT(driver_data->reg_values[STOP_STATE_CNT]);
  1028. samsung_dsim_write(dsi, DSIM_ESCMODE_REG, reg);
  1029. reg = DSIM_BTA_TIMEOUT(0xff) | DSIM_LPDR_TIMEOUT(0xffff);
  1030. samsung_dsim_write(dsi, DSIM_TIMEOUT_REG, reg);
  1031. return 0;
  1032. }
  1033. static void samsung_dsim_set_display_mode(struct samsung_dsim *dsi)
  1034. {
  1035. struct drm_display_mode *m = &dsi->mode;
  1036. unsigned int num_bits_resol = dsi->driver_data->num_bits_resol;
  1037. unsigned int main_vsa_offset = dsi->driver_data->main_vsa_offset;
  1038. u32 reg;
  1039. if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
  1040. u64 byte_clk = dsi->hs_clock / 8;
  1041. u64 pix_clk = m->clock * 1000;
  1042. int hfp = DIV64_U64_ROUND_UP((m->hsync_start - m->hdisplay) * byte_clk, pix_clk);
  1043. int hbp = DIV64_U64_ROUND_UP((m->htotal - m->hsync_end) * byte_clk, pix_clk);
  1044. int hsa = DIV64_U64_ROUND_UP((m->hsync_end - m->hsync_start) * byte_clk, pix_clk);
  1045. /* remove packet overhead when possible */
  1046. hfp = max(hfp - 6, 0);
  1047. hbp = max(hbp - 6, 0);
  1048. hsa = max(hsa - 6, 0);
  1049. dev_dbg(dsi->dev, "calculated hfp: %u, hbp: %u, hsa: %u",
  1050. hfp, hbp, hsa);
  1051. reg = DSIM_CMD_ALLOW(0xf)
  1052. | DSIM_STABLE_VFP(m->vsync_start - m->vdisplay)
  1053. | DSIM_MAIN_VBP(m->vtotal - m->vsync_end);
  1054. samsung_dsim_write(dsi, DSIM_MVPORCH_REG, reg);
  1055. reg = DSIM_MAIN_HFP(hfp) | DSIM_MAIN_HBP(hbp);
  1056. samsung_dsim_write(dsi, DSIM_MHPORCH_REG, reg);
  1057. reg = DSIM_MAIN_VSA(m->vsync_end - m->vsync_start, main_vsa_offset)
  1058. | DSIM_MAIN_HSA(hsa);
  1059. samsung_dsim_write(dsi, DSIM_MSYNC_REG, reg);
  1060. }
  1061. reg = DSIM_MAIN_HRESOL(m->hdisplay, num_bits_resol) |
  1062. DSIM_MAIN_VRESOL(m->vdisplay, num_bits_resol);
  1063. samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg);
  1064. dev_dbg(dsi->dev, "LCD size = %dx%d\n", m->hdisplay, m->vdisplay);
  1065. }
  1066. static void samsung_dsim_set_display_enable(struct samsung_dsim *dsi, bool enable)
  1067. {
  1068. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  1069. u32 reg;
  1070. reg = samsung_dsim_read(dsi, DSIM_MDRESOL_REG);
  1071. if (enable)
  1072. reg |= DSIM_MAIN_STAND_BY;
  1073. else
  1074. reg &= ~DSIM_MAIN_STAND_BY;
  1075. samsung_dsim_write(dsi, DSIM_MDRESOL_REG, reg);
  1076. if (driver_data->has_sfrctrl) {
  1077. reg = samsung_dsim_read(dsi, DSIM_SFRCTRL_REG);
  1078. if (enable)
  1079. reg |= DSIM_SFR_CTRL_STAND_BY;
  1080. else
  1081. reg &= ~DSIM_SFR_CTRL_STAND_BY;
  1082. samsung_dsim_write(dsi, DSIM_SFRCTRL_REG, reg);
  1083. }
  1084. }
  1085. static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi)
  1086. {
  1087. int timeout = 2000;
  1088. do {
  1089. u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG);
  1090. if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) {
  1091. if (reg & DSIM_SFR_HEADER_EMPTY)
  1092. return 0;
  1093. } else {
  1094. if (!(reg & DSIM_SFR_HEADER_FULL)) {
  1095. /*
  1096. * Wait a little bit, so the pending data can
  1097. * actually leave the FIFO to avoid overflow.
  1098. */
  1099. if (!cond_resched())
  1100. usleep_range(950, 1050);
  1101. return 0;
  1102. }
  1103. }
  1104. if (!cond_resched())
  1105. usleep_range(950, 1050);
  1106. } while (--timeout);
  1107. return -ETIMEDOUT;
  1108. }
  1109. static void samsung_dsim_set_cmd_lpm(struct samsung_dsim *dsi, bool lpm)
  1110. {
  1111. u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG);
  1112. if (lpm)
  1113. v |= DSIM_CMD_LPDT_LP;
  1114. else
  1115. v &= ~DSIM_CMD_LPDT_LP;
  1116. samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v);
  1117. }
  1118. static void samsung_dsim_force_bta(struct samsung_dsim *dsi)
  1119. {
  1120. u32 v = samsung_dsim_read(dsi, DSIM_ESCMODE_REG);
  1121. v |= DSIM_FORCE_BTA;
  1122. samsung_dsim_write(dsi, DSIM_ESCMODE_REG, v);
  1123. }
  1124. static void samsung_dsim_send_to_fifo(struct samsung_dsim *dsi,
  1125. struct samsung_dsim_transfer *xfer)
  1126. {
  1127. struct device *dev = dsi->dev;
  1128. struct mipi_dsi_packet *pkt = &xfer->packet;
  1129. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  1130. const u8 *payload = pkt->payload + xfer->tx_done;
  1131. u16 length = pkt->payload_length - xfer->tx_done;
  1132. bool first = !xfer->tx_done;
  1133. u32 reg;
  1134. dev_dbg(dev, "< xfer %p: tx len %u, done %u, rx len %u, done %u\n",
  1135. xfer, length, xfer->tx_done, xfer->rx_len, xfer->rx_done);
  1136. if (length > DSI_TX_FIFO_SIZE)
  1137. length = DSI_TX_FIFO_SIZE;
  1138. xfer->tx_done += length;
  1139. /* Send payload */
  1140. while (length >= 4) {
  1141. reg = get_unaligned_le32(payload);
  1142. samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg);
  1143. payload += 4;
  1144. length -= 4;
  1145. }
  1146. reg = 0;
  1147. switch (length) {
  1148. case 3:
  1149. reg |= payload[2] << 16;
  1150. fallthrough;
  1151. case 2:
  1152. reg |= payload[1] << 8;
  1153. fallthrough;
  1154. case 1:
  1155. reg |= payload[0];
  1156. samsung_dsim_write(dsi, DSIM_PAYLOAD_REG, reg);
  1157. break;
  1158. }
  1159. /* Send packet header */
  1160. if (!first)
  1161. return;
  1162. reg = get_unaligned_le32(pkt->header);
  1163. if (driver_data->wait_for_hdr_fifo) {
  1164. if (samsung_dsim_wait_for_hdr_fifo(dsi)) {
  1165. dev_err(dev, "waiting for header FIFO timed out\n");
  1166. return;
  1167. }
  1168. }
  1169. if (NEQV(xfer->flags & MIPI_DSI_MSG_USE_LPM,
  1170. dsi->state & DSIM_STATE_CMD_LPM)) {
  1171. samsung_dsim_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM);
  1172. dsi->state ^= DSIM_STATE_CMD_LPM;
  1173. }
  1174. samsung_dsim_write(dsi, DSIM_PKTHDR_REG, reg);
  1175. if (xfer->flags & MIPI_DSI_MSG_REQ_ACK)
  1176. samsung_dsim_force_bta(dsi);
  1177. }
  1178. static void samsung_dsim_read_from_fifo(struct samsung_dsim *dsi,
  1179. struct samsung_dsim_transfer *xfer)
  1180. {
  1181. u8 *payload = xfer->rx_payload + xfer->rx_done;
  1182. bool first = !xfer->rx_done;
  1183. struct device *dev = dsi->dev;
  1184. u16 length;
  1185. u32 reg;
  1186. if (first) {
  1187. reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG);
  1188. switch (reg & 0x3f) {
  1189. case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_2BYTE:
  1190. case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE:
  1191. if (xfer->rx_len >= 2) {
  1192. payload[1] = reg >> 16;
  1193. ++xfer->rx_done;
  1194. }
  1195. fallthrough;
  1196. case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE:
  1197. case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE:
  1198. payload[0] = reg >> 8;
  1199. ++xfer->rx_done;
  1200. xfer->rx_len = xfer->rx_done;
  1201. xfer->result = 0;
  1202. goto clear_fifo;
  1203. case MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT:
  1204. dev_err(dev, "DSI Error Report: 0x%04x\n", (reg >> 8) & 0xffff);
  1205. xfer->result = 0;
  1206. goto clear_fifo;
  1207. }
  1208. length = (reg >> 8) & 0xffff;
  1209. if (length > xfer->rx_len) {
  1210. dev_err(dev,
  1211. "response too long (%u > %u bytes), stripping\n",
  1212. xfer->rx_len, length);
  1213. length = xfer->rx_len;
  1214. } else if (length < xfer->rx_len) {
  1215. xfer->rx_len = length;
  1216. }
  1217. }
  1218. length = xfer->rx_len - xfer->rx_done;
  1219. xfer->rx_done += length;
  1220. /* Receive payload */
  1221. while (length >= 4) {
  1222. reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG);
  1223. payload[0] = (reg >> 0) & 0xff;
  1224. payload[1] = (reg >> 8) & 0xff;
  1225. payload[2] = (reg >> 16) & 0xff;
  1226. payload[3] = (reg >> 24) & 0xff;
  1227. payload += 4;
  1228. length -= 4;
  1229. }
  1230. if (length) {
  1231. reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG);
  1232. switch (length) {
  1233. case 3:
  1234. payload[2] = (reg >> 16) & 0xff;
  1235. fallthrough;
  1236. case 2:
  1237. payload[1] = (reg >> 8) & 0xff;
  1238. fallthrough;
  1239. case 1:
  1240. payload[0] = reg & 0xff;
  1241. }
  1242. }
  1243. if (xfer->rx_done == xfer->rx_len)
  1244. xfer->result = 0;
  1245. clear_fifo:
  1246. length = DSI_RX_FIFO_SIZE / 4;
  1247. do {
  1248. reg = samsung_dsim_read(dsi, DSIM_RXFIFO_REG);
  1249. if (reg == DSI_RX_FIFO_EMPTY)
  1250. break;
  1251. } while (--length);
  1252. }
  1253. static void samsung_dsim_transfer_start(struct samsung_dsim *dsi)
  1254. {
  1255. unsigned long flags;
  1256. struct samsung_dsim_transfer *xfer;
  1257. spin_lock_irqsave(&dsi->transfer_lock, flags);
  1258. while (!list_empty(&dsi->transfer_list)) {
  1259. xfer = list_first_entry(&dsi->transfer_list,
  1260. struct samsung_dsim_transfer, list);
  1261. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1262. if (xfer->packet.payload_length &&
  1263. xfer->tx_done == xfer->packet.payload_length)
  1264. /* waiting for RX */
  1265. return;
  1266. samsung_dsim_send_to_fifo(dsi, xfer);
  1267. if (xfer->packet.payload_length || xfer->rx_len)
  1268. return;
  1269. xfer->result = 0;
  1270. complete(&xfer->completed);
  1271. spin_lock_irqsave(&dsi->transfer_lock, flags);
  1272. list_del_init(&xfer->list);
  1273. }
  1274. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1275. }
  1276. static bool samsung_dsim_transfer_finish(struct samsung_dsim *dsi)
  1277. {
  1278. struct samsung_dsim_transfer *xfer;
  1279. unsigned long flags;
  1280. bool start = true;
  1281. spin_lock_irqsave(&dsi->transfer_lock, flags);
  1282. if (list_empty(&dsi->transfer_list)) {
  1283. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1284. return false;
  1285. }
  1286. xfer = list_first_entry(&dsi->transfer_list,
  1287. struct samsung_dsim_transfer, list);
  1288. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1289. dev_dbg(dsi->dev,
  1290. "> xfer %p, tx_len %zu, tx_done %u, rx_len %u, rx_done %u\n",
  1291. xfer, xfer->packet.payload_length, xfer->tx_done, xfer->rx_len,
  1292. xfer->rx_done);
  1293. if (xfer->tx_done != xfer->packet.payload_length)
  1294. return true;
  1295. if (xfer->rx_done != xfer->rx_len)
  1296. samsung_dsim_read_from_fifo(dsi, xfer);
  1297. if (xfer->rx_done != xfer->rx_len)
  1298. return true;
  1299. spin_lock_irqsave(&dsi->transfer_lock, flags);
  1300. list_del_init(&xfer->list);
  1301. start = !list_empty(&dsi->transfer_list);
  1302. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1303. if (!xfer->rx_len)
  1304. xfer->result = 0;
  1305. complete(&xfer->completed);
  1306. return start;
  1307. }
  1308. static void samsung_dsim_remove_transfer(struct samsung_dsim *dsi,
  1309. struct samsung_dsim_transfer *xfer)
  1310. {
  1311. unsigned long flags;
  1312. bool start;
  1313. spin_lock_irqsave(&dsi->transfer_lock, flags);
  1314. if (!list_empty(&dsi->transfer_list) &&
  1315. xfer == list_first_entry(&dsi->transfer_list,
  1316. struct samsung_dsim_transfer, list)) {
  1317. list_del_init(&xfer->list);
  1318. start = !list_empty(&dsi->transfer_list);
  1319. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1320. if (start)
  1321. samsung_dsim_transfer_start(dsi);
  1322. return;
  1323. }
  1324. list_del_init(&xfer->list);
  1325. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1326. }
  1327. static int samsung_dsim_transfer(struct samsung_dsim *dsi,
  1328. struct samsung_dsim_transfer *xfer)
  1329. {
  1330. unsigned long flags;
  1331. bool stopped;
  1332. xfer->tx_done = 0;
  1333. xfer->rx_done = 0;
  1334. xfer->result = -ETIMEDOUT;
  1335. init_completion(&xfer->completed);
  1336. spin_lock_irqsave(&dsi->transfer_lock, flags);
  1337. stopped = list_empty(&dsi->transfer_list);
  1338. list_add_tail(&xfer->list, &dsi->transfer_list);
  1339. spin_unlock_irqrestore(&dsi->transfer_lock, flags);
  1340. if (stopped)
  1341. samsung_dsim_transfer_start(dsi);
  1342. wait_for_completion_timeout(&xfer->completed,
  1343. msecs_to_jiffies(DSI_XFER_TIMEOUT_MS));
  1344. if (xfer->result == -ETIMEDOUT) {
  1345. struct mipi_dsi_packet *pkt = &xfer->packet;
  1346. samsung_dsim_remove_transfer(dsi, xfer);
  1347. dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header,
  1348. (int)pkt->payload_length, pkt->payload);
  1349. return -ETIMEDOUT;
  1350. }
  1351. /* Also covers hardware timeout condition */
  1352. return xfer->result;
  1353. }
  1354. static irqreturn_t samsung_dsim_irq(int irq, void *dev_id)
  1355. {
  1356. struct samsung_dsim *dsi = dev_id;
  1357. u32 status;
  1358. status = samsung_dsim_read(dsi, DSIM_INTSRC_REG);
  1359. if (!status) {
  1360. static unsigned long j;
  1361. if (printk_timed_ratelimit(&j, 500))
  1362. dev_warn(dsi->dev, "spurious interrupt\n");
  1363. return IRQ_HANDLED;
  1364. }
  1365. samsung_dsim_write(dsi, DSIM_INTSRC_REG, status);
  1366. if (status & DSIM_INT_SW_RST_RELEASE) {
  1367. unsigned long mask = ~(DSIM_INT_RX_DONE |
  1368. DSIM_INT_SFR_FIFO_EMPTY |
  1369. DSIM_INT_SFR_HDR_FIFO_EMPTY |
  1370. DSIM_INT_RX_ECC_ERR |
  1371. DSIM_INT_SW_RST_RELEASE);
  1372. samsung_dsim_write(dsi, DSIM_INTMSK_REG, mask);
  1373. complete(&dsi->completed);
  1374. return IRQ_HANDLED;
  1375. }
  1376. if (!(status & (DSIM_INT_RX_DONE | DSIM_INT_SFR_FIFO_EMPTY |
  1377. DSIM_INT_PLL_STABLE)))
  1378. return IRQ_HANDLED;
  1379. if (samsung_dsim_transfer_finish(dsi))
  1380. samsung_dsim_transfer_start(dsi);
  1381. return IRQ_HANDLED;
  1382. }
  1383. static void samsung_dsim_enable_irq(struct samsung_dsim *dsi)
  1384. {
  1385. enable_irq(dsi->irq);
  1386. if (dsi->te_gpio)
  1387. enable_irq(gpiod_to_irq(dsi->te_gpio));
  1388. }
  1389. static void samsung_dsim_disable_irq(struct samsung_dsim *dsi)
  1390. {
  1391. if (dsi->te_gpio)
  1392. disable_irq(gpiod_to_irq(dsi->te_gpio));
  1393. disable_irq(dsi->irq);
  1394. }
  1395. static int samsung_dsim_init(struct samsung_dsim *dsi)
  1396. {
  1397. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  1398. if (dsi->state & DSIM_STATE_INITIALIZED)
  1399. return 0;
  1400. samsung_dsim_reset(dsi);
  1401. samsung_dsim_enable_irq(dsi);
  1402. if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST)
  1403. samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1);
  1404. samsung_dsim_enable_clock(dsi);
  1405. if (driver_data->wait_for_reset)
  1406. samsung_dsim_wait_for_reset(dsi);
  1407. samsung_dsim_set_phy_ctrl(dsi);
  1408. samsung_dsim_init_link(dsi);
  1409. dsi->state |= DSIM_STATE_INITIALIZED;
  1410. return 0;
  1411. }
  1412. static void samsung_dsim_atomic_pre_enable(struct drm_bridge *bridge,
  1413. struct drm_atomic_state *state)
  1414. {
  1415. struct samsung_dsim *dsi = bridge_to_dsi(bridge);
  1416. int ret;
  1417. if (dsi->state & DSIM_STATE_ENABLED)
  1418. return;
  1419. ret = pm_runtime_resume_and_get(dsi->dev);
  1420. if (ret < 0) {
  1421. dev_err(dsi->dev, "failed to enable DSI device.\n");
  1422. return;
  1423. }
  1424. dsi->state |= DSIM_STATE_ENABLED;
  1425. /*
  1426. * For Exynos-DSIM the downstream bridge, or panel are expecting
  1427. * the host initialization during DSI transfer.
  1428. */
  1429. if (!samsung_dsim_hw_is_exynos(dsi->plat_data->hw_type)) {
  1430. ret = samsung_dsim_init(dsi);
  1431. if (ret)
  1432. return;
  1433. }
  1434. }
  1435. static void samsung_dsim_atomic_enable(struct drm_bridge *bridge,
  1436. struct drm_atomic_state *state)
  1437. {
  1438. struct samsung_dsim *dsi = bridge_to_dsi(bridge);
  1439. samsung_dsim_set_display_mode(dsi);
  1440. samsung_dsim_set_display_enable(dsi, true);
  1441. dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE;
  1442. }
  1443. static void samsung_dsim_atomic_disable(struct drm_bridge *bridge,
  1444. struct drm_atomic_state *state)
  1445. {
  1446. struct samsung_dsim *dsi = bridge_to_dsi(bridge);
  1447. if (!(dsi->state & DSIM_STATE_ENABLED))
  1448. return;
  1449. samsung_dsim_set_display_enable(dsi, false);
  1450. dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE;
  1451. }
  1452. static void samsung_dsim_atomic_post_disable(struct drm_bridge *bridge,
  1453. struct drm_atomic_state *state)
  1454. {
  1455. struct samsung_dsim *dsi = bridge_to_dsi(bridge);
  1456. dsi->state &= ~DSIM_STATE_ENABLED;
  1457. pm_runtime_put_sync(dsi->dev);
  1458. }
  1459. /*
  1460. * This pixel output formats list referenced from,
  1461. * AN13573 i.MX 8/RT MIPI DSI/CSI-2, Rev. 0, 21 March 2022
  1462. * 3.7.4 Pixel formats
  1463. * Table 14. DSI pixel packing formats
  1464. */
  1465. static const u32 samsung_dsim_pixel_output_fmts[] = {
  1466. MEDIA_BUS_FMT_YUYV10_1X20,
  1467. MEDIA_BUS_FMT_YUYV12_1X24,
  1468. MEDIA_BUS_FMT_UYVY8_1X16,
  1469. MEDIA_BUS_FMT_RGB101010_1X30,
  1470. MEDIA_BUS_FMT_RGB121212_1X36,
  1471. MEDIA_BUS_FMT_RGB565_1X16,
  1472. MEDIA_BUS_FMT_RGB666_1X18,
  1473. MEDIA_BUS_FMT_RGB888_1X24,
  1474. };
  1475. static bool samsung_dsim_pixel_output_fmt_supported(u32 fmt)
  1476. {
  1477. int i;
  1478. if (fmt == MEDIA_BUS_FMT_FIXED)
  1479. return false;
  1480. for (i = 0; i < ARRAY_SIZE(samsung_dsim_pixel_output_fmts); i++) {
  1481. if (samsung_dsim_pixel_output_fmts[i] == fmt)
  1482. return true;
  1483. }
  1484. return false;
  1485. }
  1486. static u32 *
  1487. samsung_dsim_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
  1488. struct drm_bridge_state *bridge_state,
  1489. struct drm_crtc_state *crtc_state,
  1490. struct drm_connector_state *conn_state,
  1491. u32 output_fmt,
  1492. unsigned int *num_input_fmts)
  1493. {
  1494. u32 *input_fmts;
  1495. input_fmts = kmalloc_obj(*input_fmts);
  1496. if (!input_fmts)
  1497. return NULL;
  1498. if (!samsung_dsim_pixel_output_fmt_supported(output_fmt))
  1499. /*
  1500. * Some bridge/display drivers are still not able to pass the
  1501. * correct format, so handle those pipelines by falling back
  1502. * to the default format till the supported formats finalized.
  1503. */
  1504. output_fmt = MEDIA_BUS_FMT_RGB888_1X24;
  1505. input_fmts[0] = output_fmt;
  1506. *num_input_fmts = 1;
  1507. return input_fmts;
  1508. }
  1509. static int samsung_dsim_atomic_check(struct drm_bridge *bridge,
  1510. struct drm_bridge_state *bridge_state,
  1511. struct drm_crtc_state *crtc_state,
  1512. struct drm_connector_state *conn_state)
  1513. {
  1514. struct samsung_dsim *dsi = bridge_to_dsi(bridge);
  1515. struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
  1516. /*
  1517. * The i.MX8M Mini/Nano glue logic between LCDIF and DSIM
  1518. * inverts HS/VS/DE sync signals polarity, therefore, while
  1519. * i.MX 8M Mini Applications Processor Reference Manual Rev. 3, 11/2020
  1520. * 13.6.3.5.2 RGB interface
  1521. * i.MX 8M Nano Applications Processor Reference Manual Rev. 2, 07/2022
  1522. * 13.6.2.7.2 RGB interface
  1523. * both claim "Vsync, Hsync, and VDEN are active high signals.", the
  1524. * LCDIF must generate inverted HS/VS/DE signals, i.e. active LOW.
  1525. *
  1526. * The i.MX8M Plus glue logic between LCDIFv3 and DSIM does not
  1527. * implement the same behavior, therefore LCDIFv3 must generate
  1528. * HS/VS/DE signals active HIGH.
  1529. */
  1530. if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM) {
  1531. adjusted_mode->flags |= (DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC);
  1532. adjusted_mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
  1533. } else if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MP) {
  1534. adjusted_mode->flags &= ~(DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC);
  1535. adjusted_mode->flags |= (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
  1536. }
  1537. /*
  1538. * When using video sync pulses, the HFP, HBP, and HSA are divided between
  1539. * the available lanes if there is more than one lane. For certain
  1540. * timings and lane configurations, the HFP may not be evenly divisible.
  1541. * If the HFP is rounded down, it ends up being too small which can cause
  1542. * some monitors to not sync properly. In these instances, adjust htotal
  1543. * and hsync to round the HFP up, and recalculate the htotal. Through trial
  1544. * and error, it appears that the HBP and HSA do not appearto need the same
  1545. * correction that HFP does.
  1546. */
  1547. if (dsi->lanes > 1) {
  1548. int hfp = adjusted_mode->hsync_start - adjusted_mode->hdisplay;
  1549. int remainder = hfp % dsi->lanes;
  1550. if (remainder) {
  1551. adjusted_mode->hsync_start += remainder;
  1552. adjusted_mode->hsync_end += remainder;
  1553. adjusted_mode->htotal += remainder;
  1554. }
  1555. }
  1556. return 0;
  1557. }
  1558. static void samsung_dsim_mode_set(struct drm_bridge *bridge,
  1559. const struct drm_display_mode *mode,
  1560. const struct drm_display_mode *adjusted_mode)
  1561. {
  1562. struct samsung_dsim *dsi = bridge_to_dsi(bridge);
  1563. drm_mode_copy(&dsi->mode, adjusted_mode);
  1564. }
  1565. static int samsung_dsim_attach(struct drm_bridge *bridge,
  1566. struct drm_encoder *encoder,
  1567. enum drm_bridge_attach_flags flags)
  1568. {
  1569. struct samsung_dsim *dsi = bridge_to_dsi(bridge);
  1570. return drm_bridge_attach(encoder, dsi->bridge.next_bridge, bridge,
  1571. flags);
  1572. }
  1573. static const struct drm_bridge_funcs samsung_dsim_bridge_funcs = {
  1574. .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
  1575. .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
  1576. .atomic_reset = drm_atomic_helper_bridge_reset,
  1577. .atomic_get_input_bus_fmts = samsung_dsim_atomic_get_input_bus_fmts,
  1578. .atomic_check = samsung_dsim_atomic_check,
  1579. .atomic_pre_enable = samsung_dsim_atomic_pre_enable,
  1580. .atomic_enable = samsung_dsim_atomic_enable,
  1581. .atomic_disable = samsung_dsim_atomic_disable,
  1582. .atomic_post_disable = samsung_dsim_atomic_post_disable,
  1583. .mode_set = samsung_dsim_mode_set,
  1584. .attach = samsung_dsim_attach,
  1585. };
  1586. static irqreturn_t samsung_dsim_te_irq_handler(int irq, void *dev_id)
  1587. {
  1588. struct samsung_dsim *dsi = (struct samsung_dsim *)dev_id;
  1589. const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
  1590. if (pdata->host_ops && pdata->host_ops->te_irq_handler)
  1591. return pdata->host_ops->te_irq_handler(dsi);
  1592. return IRQ_HANDLED;
  1593. }
  1594. static int samsung_dsim_register_te_irq(struct samsung_dsim *dsi, struct device *dev)
  1595. {
  1596. int te_gpio_irq;
  1597. int ret;
  1598. dsi->te_gpio = devm_gpiod_get_optional(dev, "te", GPIOD_IN);
  1599. if (!dsi->te_gpio)
  1600. return 0;
  1601. else if (IS_ERR(dsi->te_gpio))
  1602. return dev_err_probe(dev, PTR_ERR(dsi->te_gpio), "failed to get te GPIO\n");
  1603. te_gpio_irq = gpiod_to_irq(dsi->te_gpio);
  1604. ret = request_threaded_irq(te_gpio_irq, samsung_dsim_te_irq_handler, NULL,
  1605. IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN, "TE", dsi);
  1606. if (ret) {
  1607. dev_err(dsi->dev, "request interrupt failed with %d\n", ret);
  1608. gpiod_put(dsi->te_gpio);
  1609. return ret;
  1610. }
  1611. return 0;
  1612. }
  1613. static void samsung_dsim_unregister_te_irq(struct samsung_dsim *dsi)
  1614. {
  1615. if (dsi->te_gpio) {
  1616. free_irq(gpiod_to_irq(dsi->te_gpio), dsi);
  1617. gpiod_put(dsi->te_gpio);
  1618. }
  1619. }
  1620. static int samsung_dsim_host_attach(struct mipi_dsi_host *host,
  1621. struct mipi_dsi_device *device)
  1622. {
  1623. struct samsung_dsim *dsi = host_to_dsi(host);
  1624. const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
  1625. struct drm_bridge *next_bridge __free(drm_bridge_put) = NULL;
  1626. struct device *dev = dsi->dev;
  1627. struct device_node *np = dev->of_node;
  1628. struct device_node *remote;
  1629. struct drm_panel *panel;
  1630. int ret = 0;
  1631. /*
  1632. * Devices can also be child nodes when we also control that device
  1633. * through the upstream device (ie, MIPI-DCS for a MIPI-DSI device).
  1634. *
  1635. * Lookup for a child node of the given parent that isn't either port
  1636. * or ports.
  1637. */
  1638. for_each_available_child_of_node(np, remote) {
  1639. if (of_node_name_eq(remote, "port") ||
  1640. of_node_name_eq(remote, "ports"))
  1641. continue;
  1642. goto of_find_panel_or_bridge;
  1643. }
  1644. /*
  1645. * of_graph_get_remote_node() produces a noisy error message if port
  1646. * node isn't found and the absence of the port is a legit case here,
  1647. * so at first we silently check whether graph presents in the
  1648. * device-tree node.
  1649. */
  1650. if (!of_graph_is_present(np))
  1651. return -ENODEV;
  1652. remote = of_graph_get_remote_node(np, 1, 0);
  1653. of_find_panel_or_bridge:
  1654. if (!remote)
  1655. return -ENODEV;
  1656. panel = of_drm_find_panel(remote);
  1657. if (!IS_ERR(panel)) {
  1658. next_bridge = devm_drm_panel_bridge_add(dev, panel);
  1659. if (IS_ERR(next_bridge)) {
  1660. ret = PTR_ERR(next_bridge);
  1661. next_bridge = NULL; // Inhibit the cleanup action on an ERR_PTR
  1662. } else {
  1663. drm_bridge_get(next_bridge);
  1664. }
  1665. } else {
  1666. next_bridge = of_drm_find_and_get_bridge(remote);
  1667. if (!next_bridge)
  1668. ret = -EINVAL;
  1669. }
  1670. of_node_put(remote);
  1671. if (ret) {
  1672. DRM_DEV_ERROR(dev, "failed to find the bridge: %d\n", ret);
  1673. return ret;
  1674. }
  1675. DRM_DEV_INFO(dev, "Attached %s device (lanes:%d bpp:%d mode-flags:0x%lx)\n",
  1676. device->name, device->lanes,
  1677. mipi_dsi_pixel_format_to_bpp(device->format),
  1678. device->mode_flags);
  1679. drm_bridge_add(&dsi->bridge);
  1680. /*
  1681. * This is a temporary solution and should be made by more generic way.
  1682. *
  1683. * If attached panel device is for command mode one, dsi should register
  1684. * TE interrupt handler.
  1685. */
  1686. if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO)) {
  1687. ret = samsung_dsim_register_te_irq(dsi, &device->dev);
  1688. if (ret)
  1689. goto err_remove_bridge;
  1690. }
  1691. // The next bridge can be used by host_ops->attach
  1692. dsi->bridge.next_bridge = drm_bridge_get(next_bridge);
  1693. if (pdata->host_ops && pdata->host_ops->attach) {
  1694. ret = pdata->host_ops->attach(dsi, device);
  1695. if (ret)
  1696. goto err_release_next_bridge;
  1697. }
  1698. dsi->lanes = device->lanes;
  1699. dsi->format = device->format;
  1700. dsi->mode_flags = device->mode_flags;
  1701. return 0;
  1702. err_release_next_bridge:
  1703. drm_bridge_put(dsi->bridge.next_bridge);
  1704. dsi->bridge.next_bridge = NULL;
  1705. if (!(device->mode_flags & MIPI_DSI_MODE_VIDEO))
  1706. samsung_dsim_unregister_te_irq(dsi);
  1707. err_remove_bridge:
  1708. drm_bridge_remove(&dsi->bridge);
  1709. return ret;
  1710. }
  1711. static int samsung_dsim_host_detach(struct mipi_dsi_host *host,
  1712. struct mipi_dsi_device *device)
  1713. {
  1714. struct samsung_dsim *dsi = host_to_dsi(host);
  1715. const struct samsung_dsim_plat_data *pdata = dsi->plat_data;
  1716. if (pdata->host_ops && pdata->host_ops->detach)
  1717. pdata->host_ops->detach(dsi, device);
  1718. drm_bridge_put(dsi->bridge.next_bridge);
  1719. dsi->bridge.next_bridge = NULL;
  1720. samsung_dsim_unregister_te_irq(dsi);
  1721. drm_bridge_remove(&dsi->bridge);
  1722. return 0;
  1723. }
  1724. static ssize_t samsung_dsim_host_transfer(struct mipi_dsi_host *host,
  1725. const struct mipi_dsi_msg *msg)
  1726. {
  1727. struct samsung_dsim *dsi = host_to_dsi(host);
  1728. struct samsung_dsim_transfer xfer;
  1729. int ret;
  1730. if (!(dsi->state & DSIM_STATE_ENABLED))
  1731. return -EINVAL;
  1732. ret = samsung_dsim_init(dsi);
  1733. if (ret)
  1734. return ret;
  1735. ret = mipi_dsi_create_packet(&xfer.packet, msg);
  1736. if (ret < 0)
  1737. return ret;
  1738. xfer.rx_len = msg->rx_len;
  1739. xfer.rx_payload = msg->rx_buf;
  1740. xfer.flags = msg->flags;
  1741. ret = samsung_dsim_transfer(dsi, &xfer);
  1742. return (ret < 0) ? ret : xfer.rx_done;
  1743. }
  1744. static const struct mipi_dsi_host_ops samsung_dsim_ops = {
  1745. .attach = samsung_dsim_host_attach,
  1746. .detach = samsung_dsim_host_detach,
  1747. .transfer = samsung_dsim_host_transfer,
  1748. };
  1749. static int samsung_dsim_of_read_u32(const struct device_node *np,
  1750. const char *propname, u32 *out_value, bool optional)
  1751. {
  1752. int ret = of_property_read_u32(np, propname, out_value);
  1753. if (ret < 0 && !optional)
  1754. pr_err("%pOF: failed to get '%s' property\n", np, propname);
  1755. return ret;
  1756. }
  1757. static int samsung_dsim_parse_dt(struct samsung_dsim *dsi)
  1758. {
  1759. struct device *dev = dsi->dev;
  1760. struct device_node *node = dev->of_node;
  1761. u32 lane_polarities[5] = { 0 };
  1762. struct device_node *endpoint;
  1763. int i, nr_lanes, ret;
  1764. ret = samsung_dsim_of_read_u32(node, "samsung,pll-clock-frequency",
  1765. &dsi->pll_clk_rate, 1);
  1766. /* If it doesn't exist, read it from the clock instead of failing */
  1767. if (ret < 0) {
  1768. dev_dbg(dev, "Using sclk_mipi for pll clock frequency\n");
  1769. dsi->pll_clk = devm_clk_get(dev, "sclk_mipi");
  1770. if (IS_ERR(dsi->pll_clk))
  1771. return PTR_ERR(dsi->pll_clk);
  1772. }
  1773. /* If it doesn't exist, use pixel clock instead of failing */
  1774. ret = samsung_dsim_of_read_u32(node, "samsung,burst-clock-frequency",
  1775. &dsi->burst_clk_rate, 1);
  1776. if (ret < 0) {
  1777. dev_dbg(dev, "Using pixel clock for HS clock frequency\n");
  1778. dsi->burst_clk_rate = 0;
  1779. }
  1780. ret = samsung_dsim_of_read_u32(node, "samsung,esc-clock-frequency",
  1781. &dsi->esc_clk_rate, 0);
  1782. if (ret < 0)
  1783. return ret;
  1784. endpoint = of_graph_get_endpoint_by_regs(node, 1, -1);
  1785. nr_lanes = of_property_count_u32_elems(endpoint, "data-lanes");
  1786. if (nr_lanes > 0 && nr_lanes <= 4) {
  1787. /* Polarity 0 is clock lane, 1..4 are data lanes. */
  1788. of_property_read_u32_array(endpoint, "lane-polarities",
  1789. lane_polarities, nr_lanes + 1);
  1790. for (i = 1; i <= nr_lanes; i++) {
  1791. if (lane_polarities[1] != lane_polarities[i])
  1792. DRM_DEV_ERROR(dsi->dev, "Data lanes polarities do not match");
  1793. }
  1794. if (lane_polarities[0])
  1795. dsi->swap_dn_dp_clk = true;
  1796. if (lane_polarities[1])
  1797. dsi->swap_dn_dp_data = true;
  1798. }
  1799. return 0;
  1800. }
  1801. static int generic_dsim_register_host(struct samsung_dsim *dsi)
  1802. {
  1803. return mipi_dsi_host_register(&dsi->dsi_host);
  1804. }
  1805. static void generic_dsim_unregister_host(struct samsung_dsim *dsi)
  1806. {
  1807. mipi_dsi_host_unregister(&dsi->dsi_host);
  1808. }
  1809. static const struct samsung_dsim_host_ops generic_dsim_host_ops = {
  1810. .register_host = generic_dsim_register_host,
  1811. .unregister_host = generic_dsim_unregister_host,
  1812. };
  1813. static const struct drm_bridge_timings samsung_dsim_bridge_timings_de_high = {
  1814. .input_bus_flags = DRM_BUS_FLAG_DE_HIGH,
  1815. };
  1816. static const struct drm_bridge_timings samsung_dsim_bridge_timings_de_low = {
  1817. .input_bus_flags = DRM_BUS_FLAG_DE_LOW,
  1818. };
  1819. int samsung_dsim_probe(struct platform_device *pdev)
  1820. {
  1821. struct device *dev = &pdev->dev;
  1822. struct samsung_dsim *dsi;
  1823. int ret;
  1824. dsi = devm_drm_bridge_alloc(dev, struct samsung_dsim, bridge, &samsung_dsim_bridge_funcs);
  1825. if (IS_ERR(dsi))
  1826. return PTR_ERR(dsi);
  1827. init_completion(&dsi->completed);
  1828. spin_lock_init(&dsi->transfer_lock);
  1829. INIT_LIST_HEAD(&dsi->transfer_list);
  1830. dsi->dsi_host.ops = &samsung_dsim_ops;
  1831. dsi->dsi_host.dev = dev;
  1832. dsi->dev = dev;
  1833. dsi->plat_data = of_device_get_match_data(dev);
  1834. dsi->driver_data = samsung_dsim_types[dsi->plat_data->hw_type];
  1835. dsi->supplies[0].supply = "vddcore";
  1836. dsi->supplies[1].supply = "vddio";
  1837. ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies),
  1838. dsi->supplies);
  1839. if (ret)
  1840. return dev_err_probe(dev, ret, "failed to get regulators\n");
  1841. ret = devm_clk_bulk_get(dev, dsi->driver_data->num_clks,
  1842. dsi->driver_data->clk_data);
  1843. if (ret) {
  1844. dev_err(dev, "failed to get clocks in bulk (%d)\n", ret);
  1845. return ret;
  1846. }
  1847. dsi->reg_base = devm_platform_ioremap_resource(pdev, 0);
  1848. if (IS_ERR(dsi->reg_base))
  1849. return PTR_ERR(dsi->reg_base);
  1850. dsi->phy = devm_phy_optional_get(dev, "dsim");
  1851. if (IS_ERR(dsi->phy)) {
  1852. dev_info(dev, "failed to get dsim phy\n");
  1853. return PTR_ERR(dsi->phy);
  1854. }
  1855. dsi->irq = platform_get_irq(pdev, 0);
  1856. if (dsi->irq < 0)
  1857. return dsi->irq;
  1858. ret = devm_request_threaded_irq(dev, dsi->irq, NULL,
  1859. samsung_dsim_irq,
  1860. IRQF_ONESHOT | IRQF_NO_AUTOEN,
  1861. dev_name(dev), dsi);
  1862. if (ret) {
  1863. dev_err(dev, "failed to request dsi irq\n");
  1864. return ret;
  1865. }
  1866. ret = samsung_dsim_parse_dt(dsi);
  1867. if (ret)
  1868. return ret;
  1869. platform_set_drvdata(pdev, dsi);
  1870. pm_runtime_enable(dev);
  1871. dsi->bridge.of_node = dev->of_node;
  1872. dsi->bridge.type = DRM_MODE_CONNECTOR_DSI;
  1873. /* DE_LOW: i.MX8M Mini/Nano LCDIF-DSIM glue logic inverts HS/VS/DE */
  1874. if (dsi->plat_data->hw_type == DSIM_TYPE_IMX8MM)
  1875. dsi->bridge.timings = &samsung_dsim_bridge_timings_de_low;
  1876. else
  1877. dsi->bridge.timings = &samsung_dsim_bridge_timings_de_high;
  1878. if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->register_host) {
  1879. ret = dsi->plat_data->host_ops->register_host(dsi);
  1880. if (ret)
  1881. goto err_disable_runtime;
  1882. }
  1883. return 0;
  1884. err_disable_runtime:
  1885. pm_runtime_disable(dev);
  1886. return ret;
  1887. }
  1888. EXPORT_SYMBOL_GPL(samsung_dsim_probe);
  1889. void samsung_dsim_remove(struct platform_device *pdev)
  1890. {
  1891. struct samsung_dsim *dsi = platform_get_drvdata(pdev);
  1892. pm_runtime_disable(&pdev->dev);
  1893. if (dsi->plat_data->host_ops && dsi->plat_data->host_ops->unregister_host)
  1894. dsi->plat_data->host_ops->unregister_host(dsi);
  1895. }
  1896. EXPORT_SYMBOL_GPL(samsung_dsim_remove);
  1897. static int samsung_dsim_suspend(struct device *dev)
  1898. {
  1899. struct samsung_dsim *dsi = dev_get_drvdata(dev);
  1900. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  1901. int ret;
  1902. usleep_range(10000, 20000);
  1903. if (dsi->state & DSIM_STATE_INITIALIZED) {
  1904. dsi->state &= ~DSIM_STATE_INITIALIZED;
  1905. samsung_dsim_disable_clock(dsi);
  1906. samsung_dsim_disable_irq(dsi);
  1907. }
  1908. dsi->state &= ~DSIM_STATE_CMD_LPM;
  1909. phy_power_off(dsi->phy);
  1910. clk_bulk_disable_unprepare(driver_data->num_clks, driver_data->clk_data);
  1911. ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
  1912. if (ret < 0)
  1913. dev_err(dsi->dev, "cannot disable regulators %d\n", ret);
  1914. return 0;
  1915. }
  1916. static int samsung_dsim_resume(struct device *dev)
  1917. {
  1918. struct samsung_dsim *dsi = dev_get_drvdata(dev);
  1919. const struct samsung_dsim_driver_data *driver_data = dsi->driver_data;
  1920. int ret;
  1921. ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
  1922. if (ret < 0) {
  1923. dev_err(dsi->dev, "cannot enable regulators %d\n", ret);
  1924. return ret;
  1925. }
  1926. ret = clk_bulk_prepare_enable(driver_data->num_clks, driver_data->clk_data);
  1927. if (ret < 0)
  1928. goto err_clk;
  1929. ret = phy_power_on(dsi->phy);
  1930. if (ret < 0) {
  1931. dev_err(dsi->dev, "cannot enable phy %d\n", ret);
  1932. goto err_clk;
  1933. }
  1934. return 0;
  1935. err_clk:
  1936. clk_bulk_disable_unprepare(driver_data->num_clks, driver_data->clk_data);
  1937. regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
  1938. return ret;
  1939. }
  1940. const struct dev_pm_ops samsung_dsim_pm_ops = {
  1941. RUNTIME_PM_OPS(samsung_dsim_suspend, samsung_dsim_resume, NULL)
  1942. SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
  1943. pm_runtime_force_resume)
  1944. };
  1945. EXPORT_SYMBOL_GPL(samsung_dsim_pm_ops);
  1946. static const struct samsung_dsim_plat_data samsung_dsim_imx8mm_pdata = {
  1947. .hw_type = DSIM_TYPE_IMX8MM,
  1948. .host_ops = &generic_dsim_host_ops,
  1949. };
  1950. static const struct samsung_dsim_plat_data samsung_dsim_imx8mp_pdata = {
  1951. .hw_type = DSIM_TYPE_IMX8MP,
  1952. .host_ops = &generic_dsim_host_ops,
  1953. };
  1954. static const struct of_device_id samsung_dsim_of_match[] = {
  1955. {
  1956. .compatible = "fsl,imx8mm-mipi-dsim",
  1957. .data = &samsung_dsim_imx8mm_pdata,
  1958. },
  1959. {
  1960. .compatible = "fsl,imx8mp-mipi-dsim",
  1961. .data = &samsung_dsim_imx8mp_pdata,
  1962. },
  1963. { /* sentinel. */ }
  1964. };
  1965. MODULE_DEVICE_TABLE(of, samsung_dsim_of_match);
  1966. static struct platform_driver samsung_dsim_driver = {
  1967. .probe = samsung_dsim_probe,
  1968. .remove = samsung_dsim_remove,
  1969. .driver = {
  1970. .name = "samsung-dsim",
  1971. .pm = pm_ptr(&samsung_dsim_pm_ops),
  1972. .of_match_table = samsung_dsim_of_match,
  1973. },
  1974. };
  1975. module_platform_driver(samsung_dsim_driver);
  1976. MODULE_AUTHOR("Jagan Teki <jagan@amarulasolutions.com>");
  1977. MODULE_DESCRIPTION("Samsung MIPI DSIM controller bridge");
  1978. MODULE_LICENSE("GPL");