dsi_pll_5nm.c 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) "%s: " fmt, __func__
  6. #include <linux/kernel.h>
  7. #include <linux/err.h>
  8. #include <linux/iopoll.h>
  9. #include <linux/delay.h>
  10. #include <linux/of.h>
  11. #include <linux/platform_device.h>
  12. #include "dsi_pll.h"
  13. #include <dt-bindings/clock/mdss-5nm-pll-clk.h>
  14. #define VCO_DELAY_USEC 1
  15. #define MHZ_250 250000000UL
  16. #define MHZ_500 500000000UL
  17. #define MHZ_1000 1000000000UL
  18. #define MHZ_1100 1100000000UL
  19. #define MHZ_1900 1900000000UL
  20. #define MHZ_3000 3000000000UL
  21. /* Register Offsets from PLL base address */
  22. #define PLL_ANALOG_CONTROLS_ONE 0x0000
  23. #define PLL_ANALOG_CONTROLS_TWO 0x0004
  24. #define PLL_INT_LOOP_SETTINGS 0x0008
  25. #define PLL_INT_LOOP_SETTINGS_TWO 0x000C
  26. #define PLL_ANALOG_CONTROLS_THREE 0x0010
  27. #define PLL_ANALOG_CONTROLS_FOUR 0x0014
  28. #define PLL_ANALOG_CONTROLS_FIVE 0x0018
  29. #define PLL_INT_LOOP_CONTROLS 0x001C
  30. #define PLL_DSM_DIVIDER 0x0020
  31. #define PLL_FEEDBACK_DIVIDER 0x0024
  32. #define PLL_SYSTEM_MUXES 0x0028
  33. #define PLL_FREQ_UPDATE_CONTROL_OVERRIDES 0x002C
  34. #define PLL_CMODE 0x0030
  35. #define PLL_PSM_CTRL 0x0034
  36. #define PLL_RSM_CTRL 0x0038
  37. #define PLL_VCO_TUNE_MAP 0x003C
  38. #define PLL_PLL_CNTRL 0x0040
  39. #define PLL_CALIBRATION_SETTINGS 0x0044
  40. #define PLL_BAND_SEL_CAL_TIMER_LOW 0x0048
  41. #define PLL_BAND_SEL_CAL_TIMER_HIGH 0x004C
  42. #define PLL_BAND_SEL_CAL_SETTINGS 0x0050
  43. #define PLL_BAND_SEL_MIN 0x0054
  44. #define PLL_BAND_SEL_MAX 0x0058
  45. #define PLL_BAND_SEL_PFILT 0x005C
  46. #define PLL_BAND_SEL_IFILT 0x0060
  47. #define PLL_BAND_SEL_CAL_SETTINGS_TWO 0x0064
  48. #define PLL_BAND_SEL_CAL_SETTINGS_THREE 0x0068
  49. #define PLL_BAND_SEL_CAL_SETTINGS_FOUR 0x006C
  50. #define PLL_BAND_SEL_ICODE_HIGH 0x0070
  51. #define PLL_BAND_SEL_ICODE_LOW 0x0074
  52. #define PLL_FREQ_DETECT_SETTINGS_ONE 0x0078
  53. #define PLL_FREQ_DETECT_THRESH 0x007C
  54. #define PLL_FREQ_DET_REFCLK_HIGH 0x0080
  55. #define PLL_FREQ_DET_REFCLK_LOW 0x0084
  56. #define PLL_FREQ_DET_PLLCLK_HIGH 0x0088
  57. #define PLL_FREQ_DET_PLLCLK_LOW 0x008C
  58. #define PLL_PFILT 0x0090
  59. #define PLL_IFILT 0x0094
  60. #define PLL_PLL_GAIN 0x0098
  61. #define PLL_ICODE_LOW 0x009C
  62. #define PLL_ICODE_HIGH 0x00A0
  63. #define PLL_LOCKDET 0x00A4
  64. #define PLL_OUTDIV 0x00A8
  65. #define PLL_FASTLOCK_CONTROL 0x00AC
  66. #define PLL_PASS_OUT_OVERRIDE_ONE 0x00B0
  67. #define PLL_PASS_OUT_OVERRIDE_TWO 0x00B4
  68. #define PLL_CORE_OVERRIDE 0x00B8
  69. #define PLL_CORE_INPUT_OVERRIDE 0x00BC
  70. #define PLL_RATE_CHANGE 0x00C0
  71. #define PLL_PLL_DIGITAL_TIMERS 0x00C4
  72. #define PLL_PLL_DIGITAL_TIMERS_TWO 0x00C8
  73. #define PLL_DECIMAL_DIV_START 0x00CC
  74. #define PLL_FRAC_DIV_START_LOW 0x00D0
  75. #define PLL_FRAC_DIV_START_MID 0x00D4
  76. #define PLL_FRAC_DIV_START_HIGH 0x00D8
  77. #define PLL_DEC_FRAC_MUXES 0x00DC
  78. #define PLL_DECIMAL_DIV_START_1 0x00E0
  79. #define PLL_FRAC_DIV_START_LOW_1 0x00E4
  80. #define PLL_FRAC_DIV_START_MID_1 0x00E8
  81. #define PLL_FRAC_DIV_START_HIGH_1 0x00EC
  82. #define PLL_DECIMAL_DIV_START_2 0x00F0
  83. #define PLL_FRAC_DIV_START_LOW_2 0x00F4
  84. #define PLL_FRAC_DIV_START_MID_2 0x00F8
  85. #define PLL_FRAC_DIV_START_HIGH_2 0x00FC
  86. #define PLL_MASH_CONTROL 0x0100
  87. #define PLL_SSC_STEPSIZE_LOW 0x0104
  88. #define PLL_SSC_STEPSIZE_HIGH 0x0108
  89. #define PLL_SSC_DIV_PER_LOW 0x010C
  90. #define PLL_SSC_DIV_PER_HIGH 0x0110
  91. #define PLL_SSC_ADJPER_LOW 0x0114
  92. #define PLL_SSC_ADJPER_HIGH 0x0118
  93. #define PLL_SSC_MUX_CONTROL 0x011C
  94. #define PLL_SSC_STEPSIZE_LOW_1 0x0120
  95. #define PLL_SSC_STEPSIZE_HIGH_1 0x0124
  96. #define PLL_SSC_DIV_PER_LOW_1 0x0128
  97. #define PLL_SSC_DIV_PER_HIGH_1 0x012C
  98. #define PLL_SSC_ADJPER_LOW_1 0x0130
  99. #define PLL_SSC_ADJPER_HIGH_1 0x0134
  100. #define PLL_SSC_STEPSIZE_LOW_2 0x0138
  101. #define PLL_SSC_STEPSIZE_HIGH_2 0x013C
  102. #define PLL_SSC_DIV_PER_LOW_2 0x0140
  103. #define PLL_SSC_DIV_PER_HIGH_2 0x0144
  104. #define PLL_SSC_ADJPER_LOW_2 0x0148
  105. #define PLL_SSC_ADJPER_HIGH_2 0x014C
  106. #define PLL_SSC_CONTROL 0x0150
  107. #define PLL_PLL_OUTDIV_RATE 0x0154
  108. #define PLL_PLL_LOCKDET_RATE_1 0x0158
  109. #define PLL_PLL_LOCKDET_RATE_2 0x015C
  110. #define PLL_PLL_PROP_GAIN_RATE_1 0x0160
  111. #define PLL_PLL_PROP_GAIN_RATE_2 0x0164
  112. #define PLL_PLL_BAND_SEL_RATE_1 0x0168
  113. #define PLL_PLL_BAND_SEL_RATE_2 0x016C
  114. #define PLL_PLL_INT_GAIN_IFILT_BAND_1 0x0170
  115. #define PLL_PLL_INT_GAIN_IFILT_BAND_2 0x0174
  116. #define PLL_PLL_FL_INT_GAIN_PFILT_BAND_1 0x0178
  117. #define PLL_PLL_FL_INT_GAIN_PFILT_BAND_2 0x017C
  118. #define PLL_PLL_FASTLOCK_EN_BAND 0x0180
  119. #define PLL_FREQ_TUNE_ACCUM_INIT_MID 0x0184
  120. #define PLL_FREQ_TUNE_ACCUM_INIT_HIGH 0x0188
  121. #define PLL_FREQ_TUNE_ACCUM_INIT_MUX 0x018C
  122. #define PLL_PLL_LOCK_OVERRIDE 0x0190
  123. #define PLL_PLL_LOCK_DELAY 0x0194
  124. #define PLL_PLL_LOCK_MIN_DELAY 0x0198
  125. #define PLL_CLOCK_INVERTERS 0x019C
  126. #define PLL_SPARE_AND_JPC_OVERRIDES 0x01A0
  127. #define PLL_BIAS_CONTROL_1 0x01A4
  128. #define PLL_BIAS_CONTROL_2 0x01A8
  129. #define PLL_ALOG_OBSV_BUS_CTRL_1 0x01AC
  130. #define PLL_COMMON_STATUS_ONE 0x01B0
  131. #define PLL_COMMON_STATUS_TWO 0x01B4
  132. #define PLL_BAND_SEL_CAL 0x01B8
  133. #define PLL_ICODE_ACCUM_STATUS_LOW 0x01BC
  134. #define PLL_ICODE_ACCUM_STATUS_HIGH 0x01C0
  135. #define PLL_FD_OUT_LOW 0x01C4
  136. #define PLL_FD_OUT_HIGH 0x01C8
  137. #define PLL_ALOG_OBSV_BUS_STATUS_1 0x01CC
  138. #define PLL_PLL_MISC_CONFIG 0x01D0
  139. #define PLL_FLL_CONFIG 0x01D4
  140. #define PLL_FLL_FREQ_ACQ_TIME 0x01D8
  141. #define PLL_FLL_CODE0 0x01DC
  142. #define PLL_FLL_CODE1 0x01E0
  143. #define PLL_FLL_GAIN0 0x01E4
  144. #define PLL_FLL_GAIN1 0x01E8
  145. #define PLL_SW_RESET 0x01EC
  146. #define PLL_FAST_PWRUP 0x01F0
  147. #define PLL_LOCKTIME0 0x01F4
  148. #define PLL_LOCKTIME1 0x01F8
  149. #define PLL_DEBUG_BUS_SEL 0x01FC
  150. #define PLL_DEBUG_BUS0 0x0200
  151. #define PLL_DEBUG_BUS1 0x0204
  152. #define PLL_DEBUG_BUS2 0x0208
  153. #define PLL_DEBUG_BUS3 0x020C
  154. #define PLL_ANALOG_FLL_CONTROL_OVERRIDES 0x0210
  155. #define PLL_VCO_CONFIG 0x0214
  156. #define PLL_VCO_CAL_CODE1_MODE0_STATUS 0x0218
  157. #define PLL_VCO_CAL_CODE1_MODE1_STATUS 0x021C
  158. #define PLL_RESET_SM_STATUS 0x0220
  159. #define PLL_TDC_OFFSET 0x0224
  160. #define PLL_PS3_PWRDOWN_CONTROLS 0x0228
  161. #define PLL_PS4_PWRDOWN_CONTROLS 0x022C
  162. #define PLL_PLL_RST_CONTROLS 0x0230
  163. #define PLL_GEAR_BAND_SELECT_CONTROLS 0x0234
  164. #define PLL_PSM_CLK_CONTROLS 0x0238
  165. #define PLL_SYSTEM_MUXES_2 0x023C
  166. #define PLL_VCO_CONFIG_1 0x0240
  167. #define PLL_VCO_CONFIG_2 0x0244
  168. #define PLL_CLOCK_INVERTERS_1 0x0248
  169. #define PLL_CLOCK_INVERTERS_2 0x024C
  170. #define PLL_CMODE_1 0x0250
  171. #define PLL_CMODE_2 0x0254
  172. #define PLL_ANALOG_CONTROLS_FIVE_1 0x0258
  173. #define PLL_ANALOG_CONTROLS_FIVE_2 0x025C
  174. #define PLL_PERF_OPTIMIZE 0x0260
  175. /* Register Offsets from PHY base address */
  176. #define PHY_CMN_CLK_CFG0 0x010
  177. #define PHY_CMN_CLK_CFG1 0x014
  178. #define PHY_CMN_RBUF_CTRL 0x01C
  179. #define PHY_CMN_CTRL_0 0x024
  180. #define PHY_CMN_CTRL_2 0x02C
  181. #define PHY_CMN_CTRL_3 0x030
  182. #define PHY_CMN_PLL_CNTRL 0x03C
  183. #define PHY_CMN_GLBL_DIGTOP_SPARE4 0x128
  184. /* Bit definition of SSC control registers */
  185. #define SSC_CENTER BIT(0)
  186. #define SSC_EN BIT(1)
  187. #define SSC_FREQ_UPDATE BIT(2)
  188. #define SSC_FREQ_UPDATE_MUX BIT(3)
  189. #define SSC_UPDATE_SSC BIT(4)
  190. #define SSC_UPDATE_SSC_MUX BIT(5)
  191. #define SSC_START BIT(6)
  192. #define SSC_START_MUX BIT(7)
  193. /* Dynamic Refresh Control Registers */
  194. #define DSI_DYNAMIC_REFRESH_PLL_CTRL0 (0x014)
  195. #define DSI_DYNAMIC_REFRESH_PLL_CTRL1 (0x018)
  196. #define DSI_DYNAMIC_REFRESH_PLL_CTRL2 (0x01C)
  197. #define DSI_DYNAMIC_REFRESH_PLL_CTRL3 (0x020)
  198. #define DSI_DYNAMIC_REFRESH_PLL_CTRL4 (0x024)
  199. #define DSI_DYNAMIC_REFRESH_PLL_CTRL5 (0x028)
  200. #define DSI_DYNAMIC_REFRESH_PLL_CTRL6 (0x02C)
  201. #define DSI_DYNAMIC_REFRESH_PLL_CTRL7 (0x030)
  202. #define DSI_DYNAMIC_REFRESH_PLL_CTRL8 (0x034)
  203. #define DSI_DYNAMIC_REFRESH_PLL_CTRL9 (0x038)
  204. #define DSI_DYNAMIC_REFRESH_PLL_CTRL10 (0x03C)
  205. #define DSI_DYNAMIC_REFRESH_PLL_CTRL11 (0x040)
  206. #define DSI_DYNAMIC_REFRESH_PLL_CTRL12 (0x044)
  207. #define DSI_DYNAMIC_REFRESH_PLL_CTRL13 (0x048)
  208. #define DSI_DYNAMIC_REFRESH_PLL_CTRL14 (0x04C)
  209. #define DSI_DYNAMIC_REFRESH_PLL_CTRL15 (0x050)
  210. #define DSI_DYNAMIC_REFRESH_PLL_CTRL16 (0x054)
  211. #define DSI_DYNAMIC_REFRESH_PLL_CTRL17 (0x058)
  212. #define DSI_DYNAMIC_REFRESH_PLL_CTRL18 (0x05C)
  213. #define DSI_DYNAMIC_REFRESH_PLL_CTRL19 (0x060)
  214. #define DSI_DYNAMIC_REFRESH_PLL_CTRL20 (0x064)
  215. #define DSI_DYNAMIC_REFRESH_PLL_CTRL21 (0x068)
  216. #define DSI_DYNAMIC_REFRESH_PLL_CTRL22 (0x06C)
  217. #define DSI_DYNAMIC_REFRESH_PLL_CTRL23 (0x070)
  218. #define DSI_DYNAMIC_REFRESH_PLL_CTRL24 (0x074)
  219. #define DSI_DYNAMIC_REFRESH_PLL_CTRL25 (0x078)
  220. #define DSI_DYNAMIC_REFRESH_PLL_CTRL26 (0x07C)
  221. #define DSI_DYNAMIC_REFRESH_PLL_CTRL27 (0x080)
  222. #define DSI_DYNAMIC_REFRESH_PLL_CTRL28 (0x084)
  223. #define DSI_DYNAMIC_REFRESH_PLL_CTRL29 (0x088)
  224. #define DSI_DYNAMIC_REFRESH_PLL_CTRL30 (0x08C)
  225. #define DSI_DYNAMIC_REFRESH_PLL_CTRL31 (0x090)
  226. #define DSI_DYNAMIC_REFRESH_PLL_UPPER_ADDR (0x094)
  227. #define DSI_DYNAMIC_REFRESH_PLL_UPPER_ADDR2 (0x098)
  228. #define DSI_PHY_TO_PLL_OFFSET (0x500)
  229. enum {
  230. DSI_PLL_0,
  231. DSI_PLL_1,
  232. DSI_PLL_MAX
  233. };
  234. struct dsi_pll_regs {
  235. u32 pll_prop_gain_rate;
  236. u32 pll_lockdet_rate;
  237. u32 decimal_div_start;
  238. u32 frac_div_start_low;
  239. u32 frac_div_start_mid;
  240. u32 frac_div_start_high;
  241. u32 pll_clock_inverters;
  242. u32 ssc_stepsize_low;
  243. u32 ssc_stepsize_high;
  244. u32 ssc_div_per_low;
  245. u32 ssc_div_per_high;
  246. u32 ssc_adjper_low;
  247. u32 ssc_adjper_high;
  248. u32 ssc_control;
  249. };
  250. struct dsi_pll_config {
  251. u32 ref_freq;
  252. bool div_override;
  253. u32 output_div;
  254. bool ignore_frac;
  255. bool disable_prescaler;
  256. bool enable_ssc;
  257. bool ssc_center;
  258. u32 dec_bits;
  259. u32 frac_bits;
  260. u32 lock_timer;
  261. u32 ssc_freq;
  262. u32 ssc_offset;
  263. u32 ssc_adj_per;
  264. u32 thresh_cycles;
  265. u32 refclk_cycles;
  266. };
  267. struct dsi_pll_5nm {
  268. struct dsi_pll_resource *rsc;
  269. struct dsi_pll_config pll_configuration;
  270. struct dsi_pll_regs reg_setup;
  271. };
  272. static inline bool dsi_pll_5nm_is_hw_revision(
  273. struct dsi_pll_resource *rsc)
  274. {
  275. return (rsc->pll_revision == DSI_PLL_5NM) ?
  276. true : false;
  277. }
  278. static inline int pll_reg_read(void *context, unsigned int reg,
  279. unsigned int *val)
  280. {
  281. int rc = 0;
  282. u32 data;
  283. struct dsi_pll_resource *rsc = context;
  284. data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CTRL_0);
  285. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CTRL_0, data | BIT(5));
  286. ndelay(250);
  287. *val = DSI_PLL_REG_R(rsc->pll_base, reg);
  288. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CTRL_0, data);
  289. return rc;
  290. }
  291. static inline int pll_reg_write(void *context, unsigned int reg,
  292. unsigned int val)
  293. {
  294. int rc = 0;
  295. struct dsi_pll_resource *rsc = context;
  296. DSI_PLL_REG_W(rsc->pll_base, reg, val);
  297. return rc;
  298. }
  299. static inline int phy_reg_read(void *context, unsigned int reg,
  300. unsigned int *val)
  301. {
  302. int rc = 0;
  303. struct dsi_pll_resource *rsc = context;
  304. *val = DSI_PLL_REG_R(rsc->phy_base, reg);
  305. return rc;
  306. }
  307. static inline int phy_reg_write(void *context, unsigned int reg,
  308. unsigned int val)
  309. {
  310. int rc = 0;
  311. struct dsi_pll_resource *rsc = context;
  312. DSI_PLL_REG_W(rsc->phy_base, reg, val);
  313. return rc;
  314. }
  315. static inline int phy_reg_update_bits_sub(struct dsi_pll_resource *rsc,
  316. unsigned int reg, unsigned int mask, unsigned int val)
  317. {
  318. u32 reg_val;
  319. reg_val = DSI_PLL_REG_R(rsc->phy_base, reg);
  320. reg_val &= ~mask;
  321. reg_val |= (val & mask);
  322. DSI_PLL_REG_W(rsc->phy_base, reg, reg_val);
  323. return 0;
  324. }
  325. static inline int phy_reg_update_bits(void *context, unsigned int reg,
  326. unsigned int mask, unsigned int val)
  327. {
  328. int rc = 0;
  329. struct dsi_pll_resource *rsc = context;
  330. rc = phy_reg_update_bits_sub(rsc, reg, mask, val);
  331. if (!rc && rsc->slave)
  332. rc = phy_reg_update_bits_sub(rsc->slave, reg, mask, val);
  333. return rc;
  334. }
  335. static inline int pclk_mux_read_sel(void *context, unsigned int reg,
  336. unsigned int *val)
  337. {
  338. int rc = 0;
  339. struct dsi_pll_resource *rsc = context;
  340. *val = (DSI_PLL_REG_R(rsc->phy_base, reg) & 0x3);
  341. return rc;
  342. }
  343. static inline int pclk_mux_write_sel_sub(struct dsi_pll_resource *rsc,
  344. unsigned int reg, unsigned int val)
  345. {
  346. u32 reg_val;
  347. reg_val = DSI_PLL_REG_R(rsc->phy_base, reg);
  348. reg_val &= ~0x03;
  349. reg_val |= val;
  350. DSI_PLL_REG_W(rsc->phy_base, reg, reg_val);
  351. return 0;
  352. }
  353. static inline int pclk_mux_write_sel(void *context, unsigned int reg,
  354. unsigned int val)
  355. {
  356. int rc = 0;
  357. struct dsi_pll_resource *rsc = context;
  358. rc = pclk_mux_write_sel_sub(rsc, reg, val);
  359. if (!rc && rsc->slave)
  360. rc = pclk_mux_write_sel_sub(rsc->slave, reg, val);
  361. /*
  362. * cache the current parent index for cases where parent
  363. * is not changing but rate is changing. In that case
  364. * clock framework won't call parent_set and hence dsiclk_sel
  365. * bit won't be programmed. e.g. dfps update use case.
  366. */
  367. rsc->cached_cfg1 = val;
  368. return rc;
  369. }
  370. static int dsi_pll_5nm_get_gdsc_status(struct dsi_pll_resource *rsc)
  371. {
  372. u32 reg = 0;
  373. bool status;
  374. reg = DSI_PLL_REG_R(rsc->gdsc_base, 0x0);
  375. status = reg & BIT(31);
  376. pr_err("reg:0x%x status:%d\n", reg, status);
  377. return status;
  378. }
  379. static struct dsi_pll_resource *pll_rsc_db[DSI_PLL_MAX];
  380. static struct dsi_pll_5nm plls[DSI_PLL_MAX];
  381. static void dsi_pll_config_slave(struct dsi_pll_resource *rsc)
  382. {
  383. u32 reg;
  384. struct dsi_pll_resource *orsc = pll_rsc_db[DSI_PLL_1];
  385. if (!rsc)
  386. return;
  387. /* Only DSI PLL0 can act as a master */
  388. if (rsc->index != DSI_PLL_0)
  389. return;
  390. /* default configuration: source is either internal or ref clock */
  391. rsc->slave = NULL;
  392. if (!orsc) {
  393. pr_warn("slave PLL unavilable, assuming standalone config\n");
  394. return;
  395. }
  396. /* check to see if the source of DSI1 PLL bitclk is set to external */
  397. reg = DSI_PLL_REG_R(orsc->phy_base, PHY_CMN_CLK_CFG1);
  398. reg &= (BIT(2) | BIT(3));
  399. if (reg == 0x04)
  400. rsc->slave = pll_rsc_db[DSI_PLL_1]; /* external source */
  401. pr_debug("Slave PLL %s\n", rsc->slave ? "configured" : "absent");
  402. }
  403. static void dsi_pll_setup_config(struct dsi_pll_5nm *pll,
  404. struct dsi_pll_resource *rsc)
  405. {
  406. struct dsi_pll_config *config = &pll->pll_configuration;
  407. config->ref_freq = 19200000;
  408. config->output_div = 1;
  409. config->dec_bits = 8;
  410. config->frac_bits = 18;
  411. config->lock_timer = 64;
  412. config->ssc_freq = 31500;
  413. config->ssc_offset = 4800;
  414. config->ssc_adj_per = 2;
  415. config->thresh_cycles = 32;
  416. config->refclk_cycles = 256;
  417. config->div_override = false;
  418. config->ignore_frac = false;
  419. config->disable_prescaler = false;
  420. config->enable_ssc = rsc->ssc_en;
  421. config->ssc_center = rsc->ssc_center;
  422. if (config->enable_ssc) {
  423. if (rsc->ssc_freq)
  424. config->ssc_freq = rsc->ssc_freq;
  425. if (rsc->ssc_ppm)
  426. config->ssc_offset = rsc->ssc_ppm;
  427. }
  428. dsi_pll_config_slave(rsc);
  429. }
  430. static void dsi_pll_calc_dec_frac(struct dsi_pll_5nm *pll,
  431. struct dsi_pll_resource *rsc)
  432. {
  433. struct dsi_pll_config *config = &pll->pll_configuration;
  434. struct dsi_pll_regs *regs = &pll->reg_setup;
  435. u64 fref = rsc->vco_ref_clk_rate;
  436. u64 pll_freq;
  437. u64 divider;
  438. u64 dec, dec_multiple;
  439. u32 frac;
  440. u64 multiplier;
  441. pll_freq = rsc->vco_current_rate;
  442. if (config->disable_prescaler)
  443. divider = fref;
  444. else
  445. divider = fref * 2;
  446. multiplier = 1 << config->frac_bits;
  447. dec_multiple = div_u64(pll_freq * multiplier, divider);
  448. div_u64_rem(dec_multiple, multiplier, &frac);
  449. dec = div_u64(dec_multiple, multiplier);
  450. switch (rsc->pll_revision) {
  451. case DSI_PLL_5NM:
  452. default:
  453. if (pll_freq <= 1000000000)
  454. regs->pll_clock_inverters = 0xA0;
  455. else if (pll_freq <= 2500000000)
  456. regs->pll_clock_inverters = 0x20;
  457. else if (pll_freq <= 3500000000)
  458. regs->pll_clock_inverters = 0x00;
  459. else
  460. regs->pll_clock_inverters = 0x40;
  461. break;
  462. }
  463. regs->pll_lockdet_rate = config->lock_timer;
  464. regs->decimal_div_start = dec;
  465. regs->frac_div_start_low = (frac & 0xff);
  466. regs->frac_div_start_mid = (frac & 0xff00) >> 8;
  467. regs->frac_div_start_high = (frac & 0x30000) >> 16;
  468. regs->pll_prop_gain_rate = 10;
  469. }
  470. static void dsi_pll_calc_ssc(struct dsi_pll_5nm *pll,
  471. struct dsi_pll_resource *rsc)
  472. {
  473. struct dsi_pll_config *config = &pll->pll_configuration;
  474. struct dsi_pll_regs *regs = &pll->reg_setup;
  475. u32 ssc_per;
  476. u32 ssc_mod;
  477. u64 ssc_step_size;
  478. u64 frac;
  479. if (!config->enable_ssc) {
  480. pr_debug("SSC not enabled\n");
  481. return;
  482. }
  483. ssc_per = DIV_ROUND_CLOSEST(config->ref_freq, config->ssc_freq) / 2 - 1;
  484. ssc_mod = (ssc_per + 1) % (config->ssc_adj_per + 1);
  485. ssc_per -= ssc_mod;
  486. frac = regs->frac_div_start_low |
  487. (regs->frac_div_start_mid << 8) |
  488. (regs->frac_div_start_high << 16);
  489. ssc_step_size = regs->decimal_div_start;
  490. ssc_step_size *= (1 << config->frac_bits);
  491. ssc_step_size += frac;
  492. ssc_step_size *= config->ssc_offset;
  493. ssc_step_size *= (config->ssc_adj_per + 1);
  494. ssc_step_size = div_u64(ssc_step_size, (ssc_per + 1));
  495. ssc_step_size = DIV_ROUND_CLOSEST_ULL(ssc_step_size, 1000000);
  496. regs->ssc_div_per_low = ssc_per & 0xFF;
  497. regs->ssc_div_per_high = (ssc_per & 0xFF00) >> 8;
  498. regs->ssc_stepsize_low = (u32)(ssc_step_size & 0xFF);
  499. regs->ssc_stepsize_high = (u32)((ssc_step_size & 0xFF00) >> 8);
  500. regs->ssc_adjper_low = config->ssc_adj_per & 0xFF;
  501. regs->ssc_adjper_high = (config->ssc_adj_per & 0xFF00) >> 8;
  502. regs->ssc_control = config->ssc_center ? SSC_CENTER : 0;
  503. pr_debug("SCC: Dec:%d, frac:%llu, frac_bits:%d\n",
  504. regs->decimal_div_start, frac, config->frac_bits);
  505. pr_debug("SSC: div_per:0x%X, stepsize:0x%X, adjper:0x%X\n",
  506. ssc_per, (u32)ssc_step_size, config->ssc_adj_per);
  507. }
  508. static void dsi_pll_ssc_commit(struct dsi_pll_5nm *pll,
  509. struct dsi_pll_resource *rsc)
  510. {
  511. void __iomem *pll_base = rsc->pll_base;
  512. struct dsi_pll_regs *regs = &pll->reg_setup;
  513. if (pll->pll_configuration.enable_ssc) {
  514. pr_debug("SSC is enabled\n");
  515. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_LOW_1,
  516. regs->ssc_stepsize_low);
  517. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_HIGH_1,
  518. regs->ssc_stepsize_high);
  519. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_LOW_1,
  520. regs->ssc_div_per_low);
  521. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_HIGH_1,
  522. regs->ssc_div_per_high);
  523. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_LOW_1,
  524. regs->ssc_adjper_low);
  525. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_HIGH_1,
  526. regs->ssc_adjper_high);
  527. DSI_PLL_REG_W(pll_base, PLL_SSC_CONTROL,
  528. SSC_EN | regs->ssc_control);
  529. }
  530. }
  531. static void dsi_pll_config_hzindep_reg(struct dsi_pll_5nm *pll,
  532. struct dsi_pll_resource *rsc)
  533. {
  534. void __iomem *pll_base = rsc->pll_base;
  535. u64 vco_rate = rsc->vco_current_rate;
  536. switch (rsc->pll_revision) {
  537. case DSI_PLL_5NM:
  538. default:
  539. if (vco_rate < 3100000000)
  540. DSI_PLL_REG_W(pll_base,
  541. PLL_ANALOG_CONTROLS_FIVE_1, 0x01);
  542. else
  543. DSI_PLL_REG_W(pll_base,
  544. PLL_ANALOG_CONTROLS_FIVE_1, 0x03);
  545. if (vco_rate < 1520000000)
  546. DSI_PLL_REG_W(pll_base, PLL_VCO_CONFIG_1, 0x08);
  547. else if (vco_rate < 2990000000)
  548. DSI_PLL_REG_W(pll_base, PLL_VCO_CONFIG_1, 0x00);
  549. else
  550. DSI_PLL_REG_W(pll_base, PLL_VCO_CONFIG_1, 0x01);
  551. break;
  552. }
  553. DSI_PLL_REG_W(pll_base, PLL_ANALOG_CONTROLS_FIVE, 0x01);
  554. DSI_PLL_REG_W(pll_base, PLL_ANALOG_CONTROLS_TWO, 0x03);
  555. DSI_PLL_REG_W(pll_base, PLL_ANALOG_CONTROLS_THREE, 0x00);
  556. DSI_PLL_REG_W(pll_base, PLL_DSM_DIVIDER, 0x00);
  557. DSI_PLL_REG_W(pll_base, PLL_FEEDBACK_DIVIDER, 0x4e);
  558. DSI_PLL_REG_W(pll_base, PLL_CALIBRATION_SETTINGS, 0x40);
  559. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL_SETTINGS_THREE, 0xba);
  560. DSI_PLL_REG_W(pll_base, PLL_FREQ_DETECT_SETTINGS_ONE, 0x0c);
  561. DSI_PLL_REG_W(pll_base, PLL_OUTDIV, 0x00);
  562. DSI_PLL_REG_W(pll_base, PLL_CORE_OVERRIDE, 0x00);
  563. DSI_PLL_REG_W(pll_base, PLL_PLL_DIGITAL_TIMERS_TWO, 0x08);
  564. DSI_PLL_REG_W(pll_base, PLL_PLL_PROP_GAIN_RATE_1, 0x0a);
  565. DSI_PLL_REG_W(pll_base, PLL_PLL_BAND_SEL_RATE_1, 0xc0);
  566. DSI_PLL_REG_W(pll_base, PLL_PLL_INT_GAIN_IFILT_BAND_1, 0x84);
  567. DSI_PLL_REG_W(pll_base, PLL_PLL_INT_GAIN_IFILT_BAND_1, 0x82);
  568. DSI_PLL_REG_W(pll_base, PLL_PLL_FL_INT_GAIN_PFILT_BAND_1, 0x4c);
  569. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCK_OVERRIDE, 0x80);
  570. DSI_PLL_REG_W(pll_base, PLL_PFILT, 0x29);
  571. DSI_PLL_REG_W(pll_base, PLL_PFILT, 0x2f);
  572. DSI_PLL_REG_W(pll_base, PLL_IFILT, 0x2a);
  573. switch (rsc->pll_revision) {
  574. case DSI_PLL_5NM:
  575. default:
  576. DSI_PLL_REG_W(pll_base, PLL_IFILT, 0x3F);
  577. break;
  578. }
  579. DSI_PLL_REG_W(pll_base, PLL_PERF_OPTIMIZE, 0x22);
  580. if (rsc->slave)
  581. DSI_PLL_REG_W(rsc->slave->pll_base, PLL_PERF_OPTIMIZE, 0x22);
  582. }
  583. static void dsi_pll_init_val(struct dsi_pll_resource *rsc)
  584. {
  585. void __iomem *pll_base = rsc->pll_base;
  586. DSI_PLL_REG_W(pll_base, PLL_ANALOG_CONTROLS_ONE, 0x00000000);
  587. DSI_PLL_REG_W(pll_base, PLL_INT_LOOP_SETTINGS, 0x0000003F);
  588. DSI_PLL_REG_W(pll_base, PLL_INT_LOOP_SETTINGS_TWO, 0x00000000);
  589. DSI_PLL_REG_W(pll_base, PLL_ANALOG_CONTROLS_FOUR, 0x00000000);
  590. DSI_PLL_REG_W(pll_base, PLL_INT_LOOP_CONTROLS, 0x00000080);
  591. DSI_PLL_REG_W(pll_base, PLL_SYSTEM_MUXES, 0x00000000);
  592. DSI_PLL_REG_W(pll_base, PLL_FREQ_UPDATE_CONTROL_OVERRIDES, 0x00000000);
  593. DSI_PLL_REG_W(pll_base, PLL_CMODE, 0x00000010);
  594. DSI_PLL_REG_W(pll_base, PLL_PSM_CTRL, 0x00000020);
  595. DSI_PLL_REG_W(pll_base, PLL_RSM_CTRL, 0x00000010);
  596. DSI_PLL_REG_W(pll_base, PLL_VCO_TUNE_MAP, 0x00000002);
  597. DSI_PLL_REG_W(pll_base, PLL_PLL_CNTRL, 0x0000001C);
  598. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL_TIMER_LOW, 0x00000000);
  599. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL_TIMER_HIGH, 0x00000002);
  600. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL_SETTINGS, 0x00000020);
  601. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_MIN, 0x00000000);
  602. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_MAX, 0x000000FF);
  603. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_PFILT, 0x00000000);
  604. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_IFILT, 0x0000000A);
  605. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL_SETTINGS_TWO, 0x00000025);
  606. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL_SETTINGS_THREE, 0x000000BA);
  607. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL_SETTINGS_FOUR, 0x0000004F);
  608. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_ICODE_HIGH, 0x0000000A);
  609. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_ICODE_LOW, 0x00000000);
  610. DSI_PLL_REG_W(pll_base, PLL_FREQ_DETECT_SETTINGS_ONE, 0x0000000C);
  611. DSI_PLL_REG_W(pll_base, PLL_FREQ_DETECT_THRESH, 0x00000020);
  612. DSI_PLL_REG_W(pll_base, PLL_FREQ_DET_REFCLK_HIGH, 0x00000000);
  613. DSI_PLL_REG_W(pll_base, PLL_FREQ_DET_REFCLK_LOW, 0x000000FF);
  614. DSI_PLL_REG_W(pll_base, PLL_FREQ_DET_PLLCLK_HIGH, 0x00000010);
  615. DSI_PLL_REG_W(pll_base, PLL_FREQ_DET_PLLCLK_LOW, 0x00000046);
  616. DSI_PLL_REG_W(pll_base, PLL_PLL_GAIN, 0x00000054);
  617. DSI_PLL_REG_W(pll_base, PLL_ICODE_LOW, 0x00000000);
  618. DSI_PLL_REG_W(pll_base, PLL_ICODE_HIGH, 0x00000000);
  619. DSI_PLL_REG_W(pll_base, PLL_LOCKDET, 0x00000040);
  620. DSI_PLL_REG_W(pll_base, PLL_FASTLOCK_CONTROL, 0x00000004);
  621. DSI_PLL_REG_W(pll_base, PLL_PASS_OUT_OVERRIDE_ONE, 0x00000000);
  622. DSI_PLL_REG_W(pll_base, PLL_PASS_OUT_OVERRIDE_TWO, 0x00000000);
  623. DSI_PLL_REG_W(pll_base, PLL_CORE_OVERRIDE, 0x00000000);
  624. DSI_PLL_REG_W(pll_base, PLL_CORE_INPUT_OVERRIDE, 0x00000010);
  625. DSI_PLL_REG_W(pll_base, PLL_RATE_CHANGE, 0x00000000);
  626. DSI_PLL_REG_W(pll_base, PLL_PLL_DIGITAL_TIMERS, 0x00000008);
  627. DSI_PLL_REG_W(pll_base, PLL_PLL_DIGITAL_TIMERS_TWO, 0x00000008);
  628. DSI_PLL_REG_W(pll_base, PLL_DEC_FRAC_MUXES, 0x00000000);
  629. DSI_PLL_REG_W(pll_base, PLL_MASH_CONTROL, 0x00000003);
  630. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_LOW, 0x00000000);
  631. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_HIGH, 0x00000000);
  632. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_LOW, 0x00000000);
  633. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_HIGH, 0x00000000);
  634. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_LOW, 0x00000000);
  635. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_HIGH, 0x00000000);
  636. DSI_PLL_REG_W(pll_base, PLL_SSC_MUX_CONTROL, 0x00000000);
  637. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_LOW_1, 0x00000000);
  638. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_HIGH_1, 0x00000000);
  639. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_LOW_1, 0x00000000);
  640. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_HIGH_1, 0x00000000);
  641. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_LOW_1, 0x00000000);
  642. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_HIGH_1, 0x00000000);
  643. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_LOW_2, 0x00000000);
  644. DSI_PLL_REG_W(pll_base, PLL_SSC_STEPSIZE_HIGH_2, 0x00000000);
  645. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_LOW_2, 0x00000000);
  646. DSI_PLL_REG_W(pll_base, PLL_SSC_DIV_PER_HIGH_2, 0x00000000);
  647. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_LOW_2, 0x00000000);
  648. DSI_PLL_REG_W(pll_base, PLL_SSC_ADJPER_HIGH_2, 0x00000000);
  649. DSI_PLL_REG_W(pll_base, PLL_SSC_CONTROL, 0x00000000);
  650. DSI_PLL_REG_W(pll_base, PLL_PLL_OUTDIV_RATE, 0x00000000);
  651. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCKDET_RATE_1, 0x00000040);
  652. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCKDET_RATE_2, 0x00000040);
  653. DSI_PLL_REG_W(pll_base, PLL_PLL_PROP_GAIN_RATE_1, 0x0000000C);
  654. DSI_PLL_REG_W(pll_base, PLL_PLL_PROP_GAIN_RATE_2, 0x0000000A);
  655. DSI_PLL_REG_W(pll_base, PLL_PLL_BAND_SEL_RATE_1, 0x000000C0);
  656. DSI_PLL_REG_W(pll_base, PLL_PLL_BAND_SEL_RATE_2, 0x00000000);
  657. DSI_PLL_REG_W(pll_base, PLL_PLL_INT_GAIN_IFILT_BAND_1, 0x00000054);
  658. DSI_PLL_REG_W(pll_base, PLL_PLL_INT_GAIN_IFILT_BAND_2, 0x00000054);
  659. DSI_PLL_REG_W(pll_base, PLL_PLL_FL_INT_GAIN_PFILT_BAND_1, 0x0000004C);
  660. DSI_PLL_REG_W(pll_base, PLL_PLL_FL_INT_GAIN_PFILT_BAND_2, 0x0000004C);
  661. DSI_PLL_REG_W(pll_base, PLL_PLL_FASTLOCK_EN_BAND, 0x00000003);
  662. DSI_PLL_REG_W(pll_base, PLL_FREQ_TUNE_ACCUM_INIT_MID, 0x00000000);
  663. DSI_PLL_REG_W(pll_base, PLL_FREQ_TUNE_ACCUM_INIT_HIGH, 0x00000000);
  664. DSI_PLL_REG_W(pll_base, PLL_FREQ_TUNE_ACCUM_INIT_MUX, 0x00000000);
  665. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCK_OVERRIDE, 0x00000080);
  666. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCK_DELAY, 0x00000006);
  667. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCK_MIN_DELAY, 0x00000019);
  668. DSI_PLL_REG_W(pll_base, PLL_CLOCK_INVERTERS, 0x00000000);
  669. DSI_PLL_REG_W(pll_base, PLL_SPARE_AND_JPC_OVERRIDES, 0x00000000);
  670. DSI_PLL_REG_W(pll_base, PLL_BIAS_CONTROL_1, 0x00000040);
  671. DSI_PLL_REG_W(pll_base, PLL_BIAS_CONTROL_2, 0x00000020);
  672. DSI_PLL_REG_W(pll_base, PLL_ALOG_OBSV_BUS_CTRL_1, 0x00000000);
  673. DSI_PLL_REG_W(pll_base, PLL_COMMON_STATUS_ONE, 0x00000000);
  674. DSI_PLL_REG_W(pll_base, PLL_COMMON_STATUS_TWO, 0x00000000);
  675. DSI_PLL_REG_W(pll_base, PLL_BAND_SEL_CAL, 0x00000000);
  676. DSI_PLL_REG_W(pll_base, PLL_ICODE_ACCUM_STATUS_LOW, 0x00000000);
  677. DSI_PLL_REG_W(pll_base, PLL_ICODE_ACCUM_STATUS_HIGH, 0x00000000);
  678. DSI_PLL_REG_W(pll_base, PLL_FD_OUT_LOW, 0x00000000);
  679. DSI_PLL_REG_W(pll_base, PLL_FD_OUT_HIGH, 0x00000000);
  680. DSI_PLL_REG_W(pll_base, PLL_ALOG_OBSV_BUS_STATUS_1, 0x00000000);
  681. DSI_PLL_REG_W(pll_base, PLL_PLL_MISC_CONFIG, 0x00000000);
  682. DSI_PLL_REG_W(pll_base, PLL_FLL_CONFIG, 0x00000002);
  683. DSI_PLL_REG_W(pll_base, PLL_FLL_FREQ_ACQ_TIME, 0x00000011);
  684. DSI_PLL_REG_W(pll_base, PLL_FLL_CODE0, 0x00000000);
  685. DSI_PLL_REG_W(pll_base, PLL_FLL_CODE1, 0x00000000);
  686. DSI_PLL_REG_W(pll_base, PLL_FLL_GAIN0, 0x00000080);
  687. DSI_PLL_REG_W(pll_base, PLL_FLL_GAIN1, 0x00000000);
  688. DSI_PLL_REG_W(pll_base, PLL_SW_RESET, 0x00000000);
  689. DSI_PLL_REG_W(pll_base, PLL_FAST_PWRUP, 0x00000000);
  690. DSI_PLL_REG_W(pll_base, PLL_LOCKTIME0, 0x00000000);
  691. DSI_PLL_REG_W(pll_base, PLL_LOCKTIME1, 0x00000000);
  692. DSI_PLL_REG_W(pll_base, PLL_DEBUG_BUS_SEL, 0x00000000);
  693. DSI_PLL_REG_W(pll_base, PLL_DEBUG_BUS0, 0x00000000);
  694. DSI_PLL_REG_W(pll_base, PLL_DEBUG_BUS1, 0x00000000);
  695. DSI_PLL_REG_W(pll_base, PLL_DEBUG_BUS2, 0x00000000);
  696. DSI_PLL_REG_W(pll_base, PLL_DEBUG_BUS3, 0x00000000);
  697. DSI_PLL_REG_W(pll_base, PLL_ANALOG_FLL_CONTROL_OVERRIDES, 0x00000000);
  698. DSI_PLL_REG_W(pll_base, PLL_VCO_CONFIG, 0x00000000);
  699. DSI_PLL_REG_W(pll_base, PLL_VCO_CAL_CODE1_MODE0_STATUS, 0x00000000);
  700. DSI_PLL_REG_W(pll_base, PLL_VCO_CAL_CODE1_MODE1_STATUS, 0x00000000);
  701. DSI_PLL_REG_W(pll_base, PLL_RESET_SM_STATUS, 0x00000000);
  702. DSI_PLL_REG_W(pll_base, PLL_TDC_OFFSET, 0x00000000);
  703. DSI_PLL_REG_W(pll_base, PLL_PS3_PWRDOWN_CONTROLS, 0x0000001D);
  704. DSI_PLL_REG_W(pll_base, PLL_PS4_PWRDOWN_CONTROLS, 0x0000001C);
  705. DSI_PLL_REG_W(pll_base, PLL_PLL_RST_CONTROLS, 0x000000FF);
  706. DSI_PLL_REG_W(pll_base, PLL_GEAR_BAND_SELECT_CONTROLS, 0x00000022);
  707. DSI_PLL_REG_W(pll_base, PLL_PSM_CLK_CONTROLS, 0x00000009);
  708. DSI_PLL_REG_W(pll_base, PLL_SYSTEM_MUXES_2, 0x00000000);
  709. DSI_PLL_REG_W(pll_base, PLL_VCO_CONFIG_1, 0x00000000);
  710. DSI_PLL_REG_W(pll_base, PLL_VCO_CONFIG_2, 0x00000000);
  711. DSI_PLL_REG_W(pll_base, PLL_CLOCK_INVERTERS_1, 0x00000040);
  712. DSI_PLL_REG_W(pll_base, PLL_CLOCK_INVERTERS_2, 0x00000000);
  713. DSI_PLL_REG_W(pll_base, PLL_CMODE_1, 0x00000010);
  714. DSI_PLL_REG_W(pll_base, PLL_CMODE_2, 0x00000010);
  715. DSI_PLL_REG_W(pll_base, PLL_ANALOG_CONTROLS_FIVE_2, 0x00000003);
  716. }
  717. static void dsi_pll_commit(struct dsi_pll_5nm *pll,
  718. struct dsi_pll_resource *rsc)
  719. {
  720. void __iomem *pll_base = rsc->pll_base;
  721. struct dsi_pll_regs *reg = &pll->reg_setup;
  722. DSI_PLL_REG_W(pll_base, PLL_CORE_INPUT_OVERRIDE, 0x12);
  723. DSI_PLL_REG_W(pll_base, PLL_DECIMAL_DIV_START_1,
  724. reg->decimal_div_start);
  725. DSI_PLL_REG_W(pll_base, PLL_FRAC_DIV_START_LOW_1,
  726. reg->frac_div_start_low);
  727. DSI_PLL_REG_W(pll_base, PLL_FRAC_DIV_START_MID_1,
  728. reg->frac_div_start_mid);
  729. DSI_PLL_REG_W(pll_base, PLL_FRAC_DIV_START_HIGH_1,
  730. reg->frac_div_start_high);
  731. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCKDET_RATE_1, 0x40);
  732. DSI_PLL_REG_W(pll_base, PLL_PLL_LOCK_DELAY, 0x06);
  733. DSI_PLL_REG_W(pll_base, PLL_CMODE_1, 0x10);
  734. DSI_PLL_REG_W(pll_base, PLL_CLOCK_INVERTERS_1,
  735. reg->pll_clock_inverters);
  736. }
  737. static int vco_5nm_set_rate(struct clk_hw *hw, unsigned long rate,
  738. unsigned long parent_rate)
  739. {
  740. struct dsi_pll_vco_clk *vco = to_vco_clk_hw(hw);
  741. struct dsi_pll_resource *rsc = vco->priv;
  742. struct dsi_pll_5nm *pll;
  743. if (!rsc) {
  744. pr_err("pll resource not found\n");
  745. return -EINVAL;
  746. }
  747. if (rsc->pll_on)
  748. return 0;
  749. pll = rsc->priv;
  750. if (!pll) {
  751. pr_err("pll configuration not found\n");
  752. return -EINVAL;
  753. }
  754. pr_debug("ndx=%d, rate=%lu\n", rsc->index, rate);
  755. rsc->vco_current_rate = rate;
  756. rsc->vco_ref_clk_rate = vco->ref_clk_rate;
  757. rsc->dfps_trigger = false;
  758. dsi_pll_init_val(rsc);
  759. dsi_pll_setup_config(pll, rsc);
  760. dsi_pll_calc_dec_frac(pll, rsc);
  761. dsi_pll_calc_ssc(pll, rsc);
  762. dsi_pll_commit(pll, rsc);
  763. dsi_pll_config_hzindep_reg(pll, rsc);
  764. dsi_pll_ssc_commit(pll, rsc);
  765. /* flush, ensure all register writes are done*/
  766. wmb();
  767. return 0;
  768. }
  769. static int dsi_pll_read_stored_trim_codes(struct dsi_pll_resource *pll_res,
  770. unsigned long vco_clk_rate)
  771. {
  772. int i;
  773. bool found = false;
  774. if (!pll_res->dfps)
  775. return -EINVAL;
  776. for (i = 0; i < pll_res->dfps->vco_rate_cnt; i++) {
  777. struct dfps_codes_info *codes_info =
  778. &pll_res->dfps->codes_dfps[i];
  779. pr_debug("valid=%d vco_rate=%d, code %d %d %d\n",
  780. codes_info->is_valid, codes_info->clk_rate,
  781. codes_info->pll_codes.pll_codes_1,
  782. codes_info->pll_codes.pll_codes_2,
  783. codes_info->pll_codes.pll_codes_3);
  784. if (vco_clk_rate != codes_info->clk_rate &&
  785. codes_info->is_valid)
  786. continue;
  787. pll_res->cache_pll_trim_codes[0] =
  788. codes_info->pll_codes.pll_codes_1;
  789. pll_res->cache_pll_trim_codes[1] =
  790. codes_info->pll_codes.pll_codes_2;
  791. pll_res->cache_pll_trim_codes[2] =
  792. codes_info->pll_codes.pll_codes_3;
  793. found = true;
  794. break;
  795. }
  796. if (!found)
  797. return -EINVAL;
  798. pr_debug("trim_code_0=0x%x trim_code_1=0x%x trim_code_2=0x%x\n",
  799. pll_res->cache_pll_trim_codes[0],
  800. pll_res->cache_pll_trim_codes[1],
  801. pll_res->cache_pll_trim_codes[2]);
  802. return 0;
  803. }
  804. static void shadow_dsi_pll_dynamic_refresh_5nm(struct dsi_pll_5nm *pll,
  805. struct dsi_pll_resource *rsc)
  806. {
  807. u32 data;
  808. u32 offset = DSI_PHY_TO_PLL_OFFSET;
  809. u32 upper_addr = 0;
  810. u32 upper_addr2 = 0;
  811. struct dsi_pll_regs *reg = &pll->reg_setup;
  812. data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CLK_CFG1);
  813. data &= ~BIT(5);
  814. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL0,
  815. PHY_CMN_CLK_CFG1, PHY_CMN_PLL_CNTRL, data, 0);
  816. upper_addr |= (upper_8_bit(PHY_CMN_CLK_CFG1) << 0);
  817. upper_addr |= (upper_8_bit(PHY_CMN_PLL_CNTRL) << 1);
  818. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL1,
  819. PHY_CMN_RBUF_CTRL,
  820. (PLL_CORE_INPUT_OVERRIDE + offset),
  821. 0, 0x12);
  822. upper_addr |= (upper_8_bit(PHY_CMN_RBUF_CTRL) << 2);
  823. upper_addr |= (upper_8_bit(PLL_CORE_INPUT_OVERRIDE + offset) << 3);
  824. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL2,
  825. (PLL_DECIMAL_DIV_START_1 + offset),
  826. (PLL_FRAC_DIV_START_LOW_1 + offset),
  827. reg->decimal_div_start, reg->frac_div_start_low);
  828. upper_addr |= (upper_8_bit(PLL_DECIMAL_DIV_START_1 + offset) << 4);
  829. upper_addr |= (upper_8_bit(PLL_FRAC_DIV_START_LOW_1 + offset) << 5);
  830. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL3,
  831. (PLL_FRAC_DIV_START_MID_1 + offset),
  832. (PLL_FRAC_DIV_START_HIGH_1 + offset),
  833. reg->frac_div_start_mid, reg->frac_div_start_high);
  834. upper_addr |= (upper_8_bit(PLL_FRAC_DIV_START_MID_1 + offset) << 6);
  835. upper_addr |= (upper_8_bit(PLL_FRAC_DIV_START_HIGH_1 + offset) << 7);
  836. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL4,
  837. (PLL_SYSTEM_MUXES + offset),
  838. (PLL_PLL_LOCKDET_RATE_1 + offset),
  839. 0xc0, 0x10);
  840. upper_addr |= (upper_8_bit(PLL_SYSTEM_MUXES + offset) << 8);
  841. upper_addr |= (upper_8_bit(PLL_PLL_LOCKDET_RATE_1 + offset) << 9);
  842. data = DSI_PLL_REG_R(rsc->pll_base, PLL_PLL_OUTDIV_RATE) & 0x03;
  843. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL5,
  844. (PLL_PLL_OUTDIV_RATE + offset),
  845. (PLL_PLL_LOCK_DELAY + offset),
  846. data, 0x06);
  847. upper_addr |= (upper_8_bit(PLL_PLL_OUTDIV_RATE + offset) << 10);
  848. upper_addr |= (upper_8_bit(PLL_PLL_LOCK_DELAY + offset) << 11);
  849. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL6,
  850. (PLL_CMODE_1 + offset),
  851. (PLL_CLOCK_INVERTERS_1 + offset),
  852. 0x10, reg->pll_clock_inverters);
  853. upper_addr |=
  854. (upper_8_bit(PLL_CMODE_1 + offset) << 12);
  855. upper_addr |= (upper_8_bit(PLL_CLOCK_INVERTERS_1 + offset) << 13);
  856. data = DSI_PLL_REG_R(rsc->pll_base, PLL_VCO_CONFIG_1);
  857. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL7,
  858. (PLL_ANALOG_CONTROLS_FIVE_1 + offset),
  859. (PLL_VCO_CONFIG_1 + offset),
  860. 0x01, data);
  861. upper_addr |= (upper_8_bit(PLL_ANALOG_CONTROLS_FIVE_1 + offset) << 14);
  862. upper_addr |= (upper_8_bit(PLL_VCO_CONFIG_1 + offset) << 15);
  863. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL8,
  864. (PLL_ANALOG_CONTROLS_FIVE + offset),
  865. (PLL_ANALOG_CONTROLS_TWO + offset), 0x01, 0x03);
  866. upper_addr |= (upper_8_bit(PLL_ANALOG_CONTROLS_FIVE + offset) << 16);
  867. upper_addr |= (upper_8_bit(PLL_ANALOG_CONTROLS_TWO + offset) << 17);
  868. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL9,
  869. (PLL_ANALOG_CONTROLS_THREE + offset),
  870. (PLL_DSM_DIVIDER + offset),
  871. rsc->cache_pll_trim_codes[2], 0x00);
  872. upper_addr |= (upper_8_bit(PLL_ANALOG_CONTROLS_THREE + offset) << 18);
  873. upper_addr |= (upper_8_bit(PLL_DSM_DIVIDER + offset) << 19);
  874. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL10,
  875. (PLL_FEEDBACK_DIVIDER + offset),
  876. (PLL_CALIBRATION_SETTINGS + offset), 0x4E, 0x40);
  877. upper_addr |= (upper_8_bit(PLL_FEEDBACK_DIVIDER + offset) << 20);
  878. upper_addr |= (upper_8_bit(PLL_CALIBRATION_SETTINGS + offset) << 21);
  879. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL11,
  880. (PLL_BAND_SEL_CAL_SETTINGS_THREE + offset),
  881. (PLL_FREQ_DETECT_SETTINGS_ONE + offset), 0xBA, 0x0C);
  882. upper_addr |= (upper_8_bit(PLL_BAND_SEL_CAL_SETTINGS_THREE + offset)
  883. << 22);
  884. upper_addr |= (upper_8_bit(PLL_FREQ_DETECT_SETTINGS_ONE + offset)
  885. << 23);
  886. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL12,
  887. (PLL_OUTDIV + offset),
  888. (PLL_CORE_OVERRIDE + offset), 0, 0);
  889. upper_addr |= (upper_8_bit(PLL_OUTDIV + offset) << 24);
  890. upper_addr |= (upper_8_bit(PLL_CORE_OVERRIDE + offset) << 25);
  891. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL13,
  892. (PLL_PLL_DIGITAL_TIMERS_TWO + offset),
  893. (PLL_PLL_PROP_GAIN_RATE_1 + offset),
  894. 0x08, reg->pll_prop_gain_rate);
  895. upper_addr |= (upper_8_bit(PLL_PLL_DIGITAL_TIMERS_TWO + offset) << 26);
  896. upper_addr |= (upper_8_bit(PLL_PLL_PROP_GAIN_RATE_1 + offset) << 27);
  897. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL14,
  898. (PLL_PLL_BAND_SEL_RATE_1 + offset),
  899. (PLL_PLL_INT_GAIN_IFILT_BAND_1 + offset),
  900. 0xC0, 0x82);
  901. upper_addr |= (upper_8_bit(PLL_PLL_BAND_SEL_RATE_1 + offset) << 28);
  902. upper_addr |= (upper_8_bit(PLL_PLL_INT_GAIN_IFILT_BAND_1 + offset)
  903. << 29);
  904. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL15,
  905. (PLL_PLL_FL_INT_GAIN_PFILT_BAND_1 + offset),
  906. (PLL_PLL_LOCK_OVERRIDE + offset),
  907. 0x4c, 0x80);
  908. upper_addr |= (upper_8_bit(PLL_PLL_FL_INT_GAIN_PFILT_BAND_1 + offset)
  909. << 30);
  910. upper_addr |= (upper_8_bit(PLL_PLL_LOCK_OVERRIDE + offset) << 31);
  911. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL16,
  912. (PLL_PFILT + offset),
  913. (PLL_IFILT + offset),
  914. 0x29, 0x3f);
  915. upper_addr2 |= (upper_8_bit(PLL_PFILT + offset) << 0);
  916. upper_addr2 |= (upper_8_bit(PLL_IFILT + offset) << 1);
  917. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL17,
  918. (PLL_SYSTEM_MUXES + offset),
  919. (PLL_CALIBRATION_SETTINGS + offset),
  920. 0xe0, 0x44);
  921. upper_addr2 |= (upper_8_bit(PLL_BAND_SEL_CAL + offset) << 2);
  922. upper_addr2 |= (upper_8_bit(PLL_CALIBRATION_SETTINGS + offset) << 3);
  923. data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CLK_CFG0);
  924. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL18,
  925. PHY_CMN_CTRL_2, PHY_CMN_CLK_CFG0, 0x40, data);
  926. if (rsc->slave)
  927. DSI_DYN_PLL_REG_W(rsc->slave->dyn_pll_base,
  928. DSI_DYNAMIC_REFRESH_PLL_CTRL10,
  929. PHY_CMN_CLK_CFG0, PHY_CMN_CTRL_0,
  930. data, 0x7f);
  931. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL27,
  932. PHY_CMN_PLL_CNTRL, PHY_CMN_PLL_CNTRL, 0x01, 0x01);
  933. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL28,
  934. PHY_CMN_PLL_CNTRL, PHY_CMN_PLL_CNTRL, 0x01, 0x01);
  935. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL29,
  936. PHY_CMN_PLL_CNTRL, PHY_CMN_PLL_CNTRL, 0x01, 0x01);
  937. data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CLK_CFG1) | BIT(5);
  938. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL30,
  939. PHY_CMN_CLK_CFG1, PHY_CMN_RBUF_CTRL, data, 0x01);
  940. DSI_DYN_PLL_REG_W(rsc->dyn_pll_base, DSI_DYNAMIC_REFRESH_PLL_CTRL31,
  941. PHY_CMN_CLK_CFG1, PHY_CMN_CLK_CFG1, data, data);
  942. if (rsc->slave) {
  943. data = DSI_PLL_REG_R(rsc->slave->phy_base, PHY_CMN_CLK_CFG1) |
  944. BIT(5);
  945. DSI_DYN_PLL_REG_W(rsc->slave->dyn_pll_base,
  946. DSI_DYNAMIC_REFRESH_PLL_CTRL30,
  947. PHY_CMN_CLK_CFG1, PHY_CMN_RBUF_CTRL,
  948. data, 0x01);
  949. DSI_DYN_PLL_REG_W(rsc->slave->dyn_pll_base,
  950. DSI_DYNAMIC_REFRESH_PLL_CTRL31,
  951. PHY_CMN_CLK_CFG1, PHY_CMN_CLK_CFG1,
  952. data, data);
  953. }
  954. DSI_PLL_REG_W(rsc->dyn_pll_base,
  955. DSI_DYNAMIC_REFRESH_PLL_UPPER_ADDR, upper_addr);
  956. DSI_PLL_REG_W(rsc->dyn_pll_base,
  957. DSI_DYNAMIC_REFRESH_PLL_UPPER_ADDR2, upper_addr2);
  958. wmb(); /* commit register writes */
  959. }
  960. static int shadow_vco_5nm_set_rate(struct clk_hw *hw, unsigned long rate,
  961. unsigned long parent_rate)
  962. {
  963. int rc;
  964. struct dsi_pll_5nm *pll;
  965. struct dsi_pll_vco_clk *vco = to_vco_clk_hw(hw);
  966. struct dsi_pll_resource *rsc = vco->priv;
  967. if (!rsc) {
  968. pr_err("pll resource not found\n");
  969. return -EINVAL;
  970. }
  971. pll = rsc->priv;
  972. if (!pll) {
  973. pr_err("pll configuration not found\n");
  974. return -EINVAL;
  975. }
  976. rc = dsi_pll_read_stored_trim_codes(rsc, rate);
  977. if (rc) {
  978. pr_err("cannot find pll codes rate=%ld\n", rate);
  979. return -EINVAL;
  980. }
  981. pr_debug("ndx=%d, rate=%lu\n", rsc->index, rate);
  982. rsc->vco_current_rate = rate;
  983. rsc->vco_ref_clk_rate = vco->ref_clk_rate;
  984. dsi_pll_setup_config(pll, rsc);
  985. dsi_pll_calc_dec_frac(pll, rsc);
  986. /* program dynamic refresh control registers */
  987. shadow_dsi_pll_dynamic_refresh_5nm(pll, rsc);
  988. /* update cached vco rate */
  989. rsc->vco_cached_rate = rate;
  990. rsc->dfps_trigger = true;
  991. return 0;
  992. }
  993. static int dsi_pll_5nm_lock_status(struct dsi_pll_resource *pll)
  994. {
  995. int rc;
  996. u32 status;
  997. u32 const delay_us = 100;
  998. u32 const timeout_us = 5000;
  999. rc = readl_poll_timeout_atomic(pll->pll_base + PLL_COMMON_STATUS_ONE,
  1000. status,
  1001. ((status & BIT(0)) > 0),
  1002. delay_us,
  1003. timeout_us);
  1004. if (rc && !pll->handoff_resources)
  1005. pr_err("DSI PLL(%d) lock failed, status=0x%08x\n",
  1006. pll->index, status);
  1007. return rc;
  1008. }
  1009. static void dsi_pll_disable_pll_bias(struct dsi_pll_resource *rsc)
  1010. {
  1011. u32 data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CTRL_0);
  1012. DSI_PLL_REG_W(rsc->pll_base, PLL_SYSTEM_MUXES, 0);
  1013. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CTRL_0, data & ~BIT(5));
  1014. ndelay(250);
  1015. }
  1016. static void dsi_pll_enable_pll_bias(struct dsi_pll_resource *rsc)
  1017. {
  1018. u32 data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CTRL_0);
  1019. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CTRL_0, data | BIT(5));
  1020. DSI_PLL_REG_W(rsc->pll_base, PLL_SYSTEM_MUXES, 0xc0);
  1021. ndelay(250);
  1022. }
  1023. static void dsi_pll_disable_global_clk(struct dsi_pll_resource *rsc)
  1024. {
  1025. u32 data;
  1026. data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CLK_CFG1);
  1027. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CLK_CFG1, (data & ~BIT(5)));
  1028. }
  1029. static void dsi_pll_enable_global_clk(struct dsi_pll_resource *rsc)
  1030. {
  1031. u32 data;
  1032. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CTRL_3, 0x04);
  1033. data = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CLK_CFG1);
  1034. /* Turn on clk_en_sel bit prior to resync toggle fifo */
  1035. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CLK_CFG1, (data | BIT(5) |
  1036. BIT(4)));
  1037. }
  1038. static void dsi_pll_phy_dig_reset(struct dsi_pll_resource *rsc)
  1039. {
  1040. /*
  1041. * Reset the PHY digital domain. This would be needed when
  1042. * coming out of a CX or analog rail power collapse while
  1043. * ensuring that the pads maintain LP00 or LP11 state
  1044. */
  1045. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_GLBL_DIGTOP_SPARE4, BIT(0));
  1046. wmb(); /* Ensure that the reset is asserted */
  1047. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_GLBL_DIGTOP_SPARE4, 0x0);
  1048. wmb(); /* Ensure that the reset is deasserted */
  1049. }
  1050. static int dsi_pll_enable(struct dsi_pll_vco_clk *vco)
  1051. {
  1052. int rc;
  1053. struct dsi_pll_resource *rsc = vco->priv;
  1054. dsi_pll_enable_pll_bias(rsc);
  1055. if (rsc->slave)
  1056. dsi_pll_enable_pll_bias(rsc->slave);
  1057. phy_reg_update_bits_sub(rsc, PHY_CMN_CLK_CFG1, 0x03, rsc->cached_cfg1);
  1058. if (rsc->slave)
  1059. phy_reg_update_bits_sub(rsc->slave, PHY_CMN_CLK_CFG1,
  1060. 0x03, rsc->slave->cached_cfg1);
  1061. wmb(); /* ensure dsiclk_sel is always programmed before pll start */
  1062. /* Start PLL */
  1063. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_PLL_CNTRL, 0x01);
  1064. /*
  1065. * ensure all PLL configurations are written prior to checking
  1066. * for PLL lock.
  1067. */
  1068. wmb();
  1069. /* Check for PLL lock */
  1070. rc = dsi_pll_5nm_lock_status(rsc);
  1071. if (rc) {
  1072. pr_err("PLL(%d) lock failed\n", rsc->index);
  1073. goto error;
  1074. }
  1075. rsc->pll_on = true;
  1076. /*
  1077. * assert power on reset for PHY digital in case the PLL is
  1078. * enabled after CX of analog domain power collapse. This needs
  1079. * to be done before enabling the global clk.
  1080. */
  1081. dsi_pll_phy_dig_reset(rsc);
  1082. if (rsc->slave)
  1083. dsi_pll_phy_dig_reset(rsc->slave);
  1084. dsi_pll_enable_global_clk(rsc);
  1085. if (rsc->slave)
  1086. dsi_pll_enable_global_clk(rsc->slave);
  1087. error:
  1088. return rc;
  1089. }
  1090. static void dsi_pll_disable_sub(struct dsi_pll_resource *rsc)
  1091. {
  1092. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_RBUF_CTRL, 0);
  1093. dsi_pll_disable_pll_bias(rsc);
  1094. }
  1095. static void dsi_pll_disable(struct dsi_pll_vco_clk *vco)
  1096. {
  1097. struct dsi_pll_resource *rsc = vco->priv;
  1098. if (!rsc->pll_on) {
  1099. pr_err("failed to enable pll (%d) resources\n", rsc->index);
  1100. return;
  1101. }
  1102. rsc->handoff_resources = false;
  1103. rsc->dfps_trigger = false;
  1104. pr_debug("stop PLL (%d)\n", rsc->index);
  1105. /*
  1106. * To avoid any stray glitches while
  1107. * abruptly powering down the PLL
  1108. * make sure to gate the clock using
  1109. * the clock enable bit before powering
  1110. * down the PLL
  1111. */
  1112. dsi_pll_disable_global_clk(rsc);
  1113. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_PLL_CNTRL, 0);
  1114. dsi_pll_disable_sub(rsc);
  1115. if (rsc->slave) {
  1116. dsi_pll_disable_global_clk(rsc->slave);
  1117. dsi_pll_disable_sub(rsc->slave);
  1118. }
  1119. /* flush, ensure all register writes are done*/
  1120. wmb();
  1121. rsc->pll_on = false;
  1122. }
  1123. long vco_5nm_round_rate(struct clk_hw *hw, unsigned long rate,
  1124. unsigned long *parent_rate)
  1125. {
  1126. unsigned long rrate = rate;
  1127. struct dsi_pll_vco_clk *vco = to_vco_clk_hw(hw);
  1128. if (rate < vco->min_rate)
  1129. rrate = vco->min_rate;
  1130. if (rate > vco->max_rate)
  1131. rrate = vco->max_rate;
  1132. *parent_rate = rrate;
  1133. return rrate;
  1134. }
  1135. static void vco_5nm_unprepare(struct clk_hw *hw)
  1136. {
  1137. struct dsi_pll_vco_clk *vco = to_vco_clk_hw(hw);
  1138. struct dsi_pll_resource *pll = vco->priv;
  1139. if (!pll) {
  1140. pr_err("dsi pll resources not available\n");
  1141. return;
  1142. }
  1143. /*
  1144. * During unprepare in continuous splash use case we want driver
  1145. * to pick all dividers instead of retaining bootloader configurations.
  1146. * Also handle the usecases when dynamic refresh gets triggered while
  1147. * handoff_resources flag is still set. For video mode, this flag does
  1148. * not get cleared until first suspend. Whereas for command mode, it
  1149. * doesnt get cleared until first idle power collapse. We need to make
  1150. * sure that we save and restore the divider settings when dynamic FPS
  1151. * is triggered.
  1152. */
  1153. if (!pll->handoff_resources || pll->dfps_trigger) {
  1154. pll->cached_cfg0 = DSI_PLL_REG_R(pll->phy_base,
  1155. PHY_CMN_CLK_CFG0);
  1156. pll->cached_outdiv = DSI_PLL_REG_R(pll->pll_base,
  1157. PLL_PLL_OUTDIV_RATE);
  1158. pr_debug("cfg0=%d,cfg1=%d, outdiv=%d\n", pll->cached_cfg0,
  1159. pll->cached_cfg1, pll->cached_outdiv);
  1160. pll->vco_cached_rate = clk_get_rate(hw->clk);
  1161. }
  1162. /*
  1163. * When continuous splash screen feature is enabled, we need to cache
  1164. * the mux configuration for the pixel_clk_src mux clock. The clock
  1165. * framework does not call back to re-configure the mux value if it is
  1166. * does not change.For such usecases, we need to ensure that the cached
  1167. * value is programmed prior to PLL being locked
  1168. */
  1169. if (pll->handoff_resources) {
  1170. pll->cached_cfg1 = DSI_PLL_REG_R(pll->phy_base,
  1171. PHY_CMN_CLK_CFG1);
  1172. if (pll->slave)
  1173. pll->slave->cached_cfg1 =
  1174. DSI_PLL_REG_R(pll->slave->phy_base,
  1175. PHY_CMN_CLK_CFG1);
  1176. }
  1177. dsi_pll_disable(vco);
  1178. }
  1179. static int vco_5nm_prepare(struct clk_hw *hw)
  1180. {
  1181. int rc = 0;
  1182. struct dsi_pll_vco_clk *vco = to_vco_clk_hw(hw);
  1183. struct dsi_pll_resource *pll = vco->priv;
  1184. if (!pll) {
  1185. pr_err("dsi pll resources are not available\n");
  1186. return -EINVAL;
  1187. }
  1188. /* Skip vco recalculation for continuous splash use case */
  1189. if (pll->handoff_resources) {
  1190. pll->pll_on = true;
  1191. return 0;
  1192. }
  1193. if ((pll->vco_cached_rate != 0) &&
  1194. (pll->vco_cached_rate == clk_hw_get_rate(hw))) {
  1195. rc = vco_5nm_set_rate(hw, pll->vco_cached_rate,
  1196. pll->vco_cached_rate);
  1197. if (rc) {
  1198. pr_err("pll(%d) set_rate failed, rc=%d\n",
  1199. pll->index, rc);
  1200. return rc;
  1201. }
  1202. pr_debug("cfg0=%d, cfg1=%d\n", pll->cached_cfg0,
  1203. pll->cached_cfg1);
  1204. DSI_PLL_REG_W(pll->phy_base, PHY_CMN_CLK_CFG0,
  1205. pll->cached_cfg0);
  1206. if (pll->slave)
  1207. DSI_PLL_REG_W(pll->slave->phy_base, PHY_CMN_CLK_CFG0,
  1208. pll->cached_cfg0);
  1209. DSI_PLL_REG_W(pll->pll_base, PLL_PLL_OUTDIV_RATE,
  1210. pll->cached_outdiv);
  1211. }
  1212. rc = dsi_pll_enable(vco);
  1213. return rc;
  1214. }
  1215. static unsigned long vco_5nm_recalc_rate(struct clk_hw *hw,
  1216. unsigned long parent_rate)
  1217. {
  1218. int rc = 0;
  1219. struct dsi_pll_vco_clk *vco = to_vco_clk_hw(hw);
  1220. struct dsi_pll_resource *pll = vco->priv;
  1221. if (!vco->priv) {
  1222. pr_err("vco priv is null\n");
  1223. return 0;
  1224. }
  1225. /*
  1226. * In the case when vco arte is set, the recalculation function should
  1227. * return the current rate as to avoid trying to set the vco rate
  1228. * again. However durng handoff, recalculation should set the flag
  1229. * according to the status of PLL.
  1230. */
  1231. if (pll->vco_current_rate != 0) {
  1232. pr_debug("returning vco rate = %lld\n", pll->vco_current_rate);
  1233. return pll->vco_current_rate;
  1234. }
  1235. pll->handoff_resources = true;
  1236. if (!dsi_pll_5nm_get_gdsc_status(pll)) {
  1237. pll->handoff_resources = false;
  1238. pr_err("Hand_off_resources not needed since gdsc is off\n");
  1239. return 0;
  1240. }
  1241. if (dsi_pll_5nm_lock_status(pll)) {
  1242. pr_err("PLL not enabled\n");
  1243. pll->handoff_resources = false;
  1244. }
  1245. pr_err("handoff_resources %s\n", pll->handoff_resources ? "true" : "false");
  1246. return rc;
  1247. }
  1248. static int pixel_clk_get_div(void *context, unsigned int reg, unsigned int *div)
  1249. {
  1250. struct dsi_pll_resource *pll = context;
  1251. u32 reg_val;
  1252. reg_val = DSI_PLL_REG_R(pll->phy_base, PHY_CMN_CLK_CFG0);
  1253. *div = (reg_val & 0xF0) >> 4;
  1254. return 0;
  1255. }
  1256. static void pixel_clk_set_div_sub(struct dsi_pll_resource *pll, int div)
  1257. {
  1258. u32 reg_val;
  1259. reg_val = DSI_PLL_REG_R(pll->phy_base, PHY_CMN_CLK_CFG0);
  1260. reg_val &= ~0xF0;
  1261. reg_val |= (div << 4);
  1262. DSI_PLL_REG_W(pll->phy_base, PHY_CMN_CLK_CFG0, reg_val);
  1263. /*
  1264. * cache the current parent index for cases where parent
  1265. * is not changing but rate is changing. In that case
  1266. * clock framework won't call parent_set and hence dsiclk_sel
  1267. * bit won't be programmed. e.g. dfps update use case.
  1268. */
  1269. pll->cached_cfg0 = reg_val;
  1270. }
  1271. static int pixel_clk_set_div(void *context, unsigned int reg, unsigned int div)
  1272. {
  1273. struct dsi_pll_resource *pll = context;
  1274. pixel_clk_set_div_sub(pll, div);
  1275. if (pll->slave)
  1276. pixel_clk_set_div_sub(pll->slave, div);
  1277. return 0;
  1278. }
  1279. static int bit_clk_get_div(void *context, unsigned int reg, unsigned int *div)
  1280. {
  1281. struct dsi_pll_resource *pll = context;
  1282. u32 reg_val;
  1283. reg_val = DSI_PLL_REG_R(pll->phy_base, PHY_CMN_CLK_CFG0);
  1284. *div = (reg_val & 0x0F);
  1285. return 0;
  1286. }
  1287. static void bit_clk_set_div_sub(struct dsi_pll_resource *rsc, int div)
  1288. {
  1289. u32 reg_val;
  1290. reg_val = DSI_PLL_REG_R(rsc->phy_base, PHY_CMN_CLK_CFG0);
  1291. reg_val &= ~0x0F;
  1292. reg_val |= div;
  1293. DSI_PLL_REG_W(rsc->phy_base, PHY_CMN_CLK_CFG0, reg_val);
  1294. }
  1295. static int bit_clk_set_div(void *context, unsigned int reg, unsigned int div)
  1296. {
  1297. struct dsi_pll_resource *rsc = context;
  1298. if (!rsc) {
  1299. pr_err("pll resource not found\n");
  1300. return -EINVAL;
  1301. }
  1302. bit_clk_set_div_sub(rsc, div);
  1303. /* For slave PLL, this divider always should be set to 1 */
  1304. if (rsc->slave)
  1305. bit_clk_set_div_sub(rsc->slave, 1);
  1306. return 0;
  1307. }
  1308. static struct regmap_config dsi_pll_5nm_config = {
  1309. .reg_bits = 32,
  1310. .reg_stride = 4,
  1311. .val_bits = 32,
  1312. .max_register = 0x7c0,
  1313. };
  1314. static struct regmap_bus pll_regmap_bus = {
  1315. .reg_write = pll_reg_write,
  1316. .reg_read = pll_reg_read,
  1317. };
  1318. static struct regmap_bus pclk_src_mux_regmap_bus = {
  1319. .reg_read = pclk_mux_read_sel,
  1320. .reg_write = pclk_mux_write_sel,
  1321. };
  1322. static struct regmap_bus pclk_src_regmap_bus = {
  1323. .reg_write = pixel_clk_set_div,
  1324. .reg_read = pixel_clk_get_div,
  1325. };
  1326. static struct regmap_bus bitclk_src_regmap_bus = {
  1327. .reg_write = bit_clk_set_div,
  1328. .reg_read = bit_clk_get_div,
  1329. };
  1330. static const struct clk_ops clk_ops_vco_5nm = {
  1331. .recalc_rate = vco_5nm_recalc_rate,
  1332. .set_rate = vco_5nm_set_rate,
  1333. .round_rate = vco_5nm_round_rate,
  1334. .prepare = vco_5nm_prepare,
  1335. .unprepare = vco_5nm_unprepare,
  1336. };
  1337. static const struct clk_ops clk_ops_shadow_vco_5nm = {
  1338. .recalc_rate = vco_5nm_recalc_rate,
  1339. .set_rate = shadow_vco_5nm_set_rate,
  1340. .round_rate = vco_5nm_round_rate,
  1341. };
  1342. static struct regmap_bus dsi_mux_regmap_bus = {
  1343. .reg_write = dsi_set_mux_sel,
  1344. .reg_read = dsi_get_mux_sel,
  1345. };
  1346. /*
  1347. * Clock tree for generating DSI byte and pclk.
  1348. *
  1349. *
  1350. * +---------------+
  1351. * | vco_clk |
  1352. * +-------+-------+
  1353. * |
  1354. * |
  1355. * +---------------+
  1356. * | pll_out_div |
  1357. * | DIV(1,2,4,8) |
  1358. * +-------+-------+
  1359. * |
  1360. * +-----------------------------+--------+
  1361. * | | |
  1362. * +-------v-------+ | |
  1363. * | bitclk_src |
  1364. * | DIV(1..15) | Not supported for DPHY
  1365. * +-------+-------+
  1366. * | | |
  1367. * +----------+---------+ | |
  1368. * Shadow Path | | | | |
  1369. * + +-------v-------+ | +------v------+ | +------v-------+
  1370. * | | byteclk_src | | |post_bit_div | | |post_vco_div |
  1371. * | | DIV(8) | | |DIV (2) | | |DIV(4) |
  1372. * | +-------+-------+ | +------+------+ | +------+-------+
  1373. * | | | | | | |
  1374. * | | | +------+ | |
  1375. * | | +-------------+ | | +----+
  1376. * | +--------+ | | | |
  1377. * | | +-v--v-v---v------+
  1378. * +-v---------v----+ \ pclk_src_mux /
  1379. * \ byteclk_mux / \ /
  1380. * \ / +-----+-----+
  1381. * +----+-----+ | Shadow Path
  1382. * | | +
  1383. * v +-----v------+ |
  1384. * dsi_byte_clk | pclk_src | |
  1385. * | DIV(1..15) | |
  1386. * +-----+------+ |
  1387. * | |
  1388. * | |
  1389. * +--------+ |
  1390. * | |
  1391. * +---v----v----+
  1392. * \ pclk_mux /
  1393. * \ /
  1394. * +---+---+
  1395. * |
  1396. * |
  1397. * v
  1398. * dsi_pclk
  1399. *
  1400. */
  1401. static struct dsi_pll_vco_clk dsi0pll_vco_clk = {
  1402. .ref_clk_rate = 19200000UL,
  1403. .min_rate = 1000000000UL,
  1404. .max_rate = 3500000000UL,
  1405. .hw.init = &(struct clk_init_data){
  1406. .name = "dsi0pll_vco_clk",
  1407. .parent_names = (const char *[]){"bi_tcxo"},
  1408. .num_parents = 1,
  1409. .ops = &clk_ops_vco_5nm,
  1410. },
  1411. };
  1412. static struct dsi_pll_vco_clk dsi0pll_shadow_vco_clk = {
  1413. .ref_clk_rate = 19200000UL,
  1414. .min_rate = 1000000000UL,
  1415. .max_rate = 3500000000UL,
  1416. .hw.init = &(struct clk_init_data){
  1417. .name = "dsi0pll_shadow_vco_clk",
  1418. .parent_names = (const char *[]){"bi_tcxo"},
  1419. .num_parents = 1,
  1420. .ops = &clk_ops_shadow_vco_5nm,
  1421. },
  1422. };
  1423. static struct dsi_pll_vco_clk dsi1pll_vco_clk = {
  1424. .ref_clk_rate = 19200000UL,
  1425. .min_rate = 1000000000UL,
  1426. .max_rate = 3500000000UL,
  1427. .hw.init = &(struct clk_init_data){
  1428. .name = "dsi1pll_vco_clk",
  1429. .parent_names = (const char *[]){"bi_tcxo"},
  1430. .num_parents = 1,
  1431. .ops = &clk_ops_vco_5nm,
  1432. },
  1433. };
  1434. static struct dsi_pll_vco_clk dsi1pll_shadow_vco_clk = {
  1435. .ref_clk_rate = 19200000UL,
  1436. .min_rate = 1000000000UL,
  1437. .max_rate = 3500000000UL,
  1438. .hw.init = &(struct clk_init_data){
  1439. .name = "dsi1pll_shadow_vco_clk",
  1440. .parent_names = (const char *[]){"bi_tcxo"},
  1441. .num_parents = 1,
  1442. .ops = &clk_ops_shadow_vco_5nm,
  1443. },
  1444. };
  1445. static struct clk_regmap_div dsi0pll_pll_out_div = {
  1446. .reg = PLL_PLL_OUTDIV_RATE,
  1447. .shift = 0,
  1448. .width = 2,
  1449. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1450. .clkr = {
  1451. .hw.init = &(struct clk_init_data){
  1452. .name = "dsi0pll_pll_out_div",
  1453. .parent_names = (const char *[]){"dsi0pll_vco_clk"},
  1454. .num_parents = 1,
  1455. .flags = CLK_SET_RATE_PARENT,
  1456. .ops = &clk_regmap_div_ops,
  1457. },
  1458. },
  1459. };
  1460. static struct clk_regmap_div dsi0pll_shadow_pll_out_div = {
  1461. .reg = PLL_PLL_OUTDIV_RATE,
  1462. .shift = 0,
  1463. .width = 2,
  1464. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1465. .clkr = {
  1466. .hw.init = &(struct clk_init_data){
  1467. .name = "dsi0pll_shadow_pll_out_div",
  1468. .parent_names = (const char *[]){
  1469. "dsi0pll_shadow_vco_clk"},
  1470. .num_parents = 1,
  1471. .flags = CLK_SET_RATE_PARENT,
  1472. .ops = &clk_regmap_div_ops,
  1473. },
  1474. },
  1475. };
  1476. static struct clk_regmap_div dsi1pll_pll_out_div = {
  1477. .reg = PLL_PLL_OUTDIV_RATE,
  1478. .shift = 0,
  1479. .width = 2,
  1480. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1481. .clkr = {
  1482. .hw.init = &(struct clk_init_data){
  1483. .name = "dsi1pll_pll_out_div",
  1484. .parent_names = (const char *[]){"dsi1pll_vco_clk"},
  1485. .num_parents = 1,
  1486. .flags = CLK_SET_RATE_PARENT,
  1487. .ops = &clk_regmap_div_ops,
  1488. },
  1489. },
  1490. };
  1491. static struct clk_regmap_div dsi1pll_shadow_pll_out_div = {
  1492. .reg = PLL_PLL_OUTDIV_RATE,
  1493. .shift = 0,
  1494. .width = 2,
  1495. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1496. .clkr = {
  1497. .hw.init = &(struct clk_init_data){
  1498. .name = "dsi1pll_shadow_pll_out_div",
  1499. .parent_names = (const char *[]){
  1500. "dsi1pll_shadow_vco_clk"},
  1501. .num_parents = 1,
  1502. .flags = CLK_SET_RATE_PARENT,
  1503. .ops = &clk_regmap_div_ops,
  1504. },
  1505. },
  1506. };
  1507. static struct clk_regmap_div dsi0pll_bitclk_src = {
  1508. .shift = 0,
  1509. .width = 4,
  1510. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1511. .clkr = {
  1512. .hw.init = &(struct clk_init_data){
  1513. .name = "dsi0pll_bitclk_src",
  1514. .parent_names = (const char *[]){"dsi0pll_pll_out_div"},
  1515. .num_parents = 1,
  1516. .flags = CLK_SET_RATE_PARENT,
  1517. .ops = &clk_regmap_div_ops,
  1518. },
  1519. },
  1520. };
  1521. static struct clk_regmap_div dsi0pll_shadow_bitclk_src = {
  1522. .shift = 0,
  1523. .width = 4,
  1524. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1525. .clkr = {
  1526. .hw.init = &(struct clk_init_data){
  1527. .name = "dsi0pll_shadow_bitclk_src",
  1528. .parent_names = (const char *[]){
  1529. "dsi0pll_shadow_pll_out_div"},
  1530. .num_parents = 1,
  1531. .flags = CLK_SET_RATE_PARENT,
  1532. .ops = &clk_regmap_div_ops,
  1533. },
  1534. },
  1535. };
  1536. static struct clk_regmap_div dsi1pll_bitclk_src = {
  1537. .shift = 0,
  1538. .width = 4,
  1539. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1540. .clkr = {
  1541. .hw.init = &(struct clk_init_data){
  1542. .name = "dsi1pll_bitclk_src",
  1543. .parent_names = (const char *[]){"dsi1pll_pll_out_div"},
  1544. .num_parents = 1,
  1545. .flags = CLK_SET_RATE_PARENT,
  1546. .ops = &clk_regmap_div_ops,
  1547. },
  1548. },
  1549. };
  1550. static struct clk_regmap_div dsi1pll_shadow_bitclk_src = {
  1551. .shift = 0,
  1552. .width = 4,
  1553. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1554. .clkr = {
  1555. .hw.init = &(struct clk_init_data){
  1556. .name = "dsi1pll_shadow_bitclk_src",
  1557. .parent_names = (const char *[]){
  1558. "dsi1pll_shadow_pll_out_div"},
  1559. .num_parents = 1,
  1560. .flags = CLK_SET_RATE_PARENT,
  1561. .ops = &clk_regmap_div_ops,
  1562. },
  1563. },
  1564. };
  1565. static struct clk_fixed_factor dsi0pll_post_vco_div = {
  1566. .div = 4,
  1567. .mult = 1,
  1568. .hw.init = &(struct clk_init_data){
  1569. .name = "dsi0pll_post_vco_div",
  1570. .parent_names = (const char *[]){"dsi0pll_pll_out_div"},
  1571. .num_parents = 1,
  1572. .ops = &clk_fixed_factor_ops,
  1573. },
  1574. };
  1575. static struct clk_fixed_factor dsi0pll_shadow_post_vco_div = {
  1576. .div = 4,
  1577. .mult = 1,
  1578. .hw.init = &(struct clk_init_data){
  1579. .name = "dsi0pll_shadow_post_vco_div",
  1580. .parent_names = (const char *[]){"dsi0pll_shadow_pll_out_div"},
  1581. .num_parents = 1,
  1582. .ops = &clk_fixed_factor_ops,
  1583. },
  1584. };
  1585. static struct clk_fixed_factor dsi1pll_post_vco_div = {
  1586. .div = 4,
  1587. .mult = 1,
  1588. .hw.init = &(struct clk_init_data){
  1589. .name = "dsi1pll_post_vco_div",
  1590. .parent_names = (const char *[]){"dsi1pll_pll_out_div"},
  1591. .num_parents = 1,
  1592. .ops = &clk_fixed_factor_ops,
  1593. },
  1594. };
  1595. static struct clk_fixed_factor dsi1pll_shadow_post_vco_div = {
  1596. .div = 4,
  1597. .mult = 1,
  1598. .hw.init = &(struct clk_init_data){
  1599. .name = "dsi1pll_shadow_post_vco_div",
  1600. .parent_names = (const char *[]){"dsi1pll_shadow_pll_out_div"},
  1601. .num_parents = 1,
  1602. .ops = &clk_fixed_factor_ops,
  1603. },
  1604. };
  1605. static struct clk_fixed_factor dsi0pll_byteclk_src = {
  1606. .div = 8,
  1607. .mult = 1,
  1608. .hw.init = &(struct clk_init_data){
  1609. .name = "dsi0pll_byteclk_src",
  1610. .parent_names = (const char *[]){"dsi0pll_bitclk_src"},
  1611. .num_parents = 1,
  1612. .flags = CLK_SET_RATE_PARENT,
  1613. .ops = &clk_fixed_factor_ops,
  1614. },
  1615. };
  1616. static struct clk_fixed_factor dsi0pll_shadow_byteclk_src = {
  1617. .div = 8,
  1618. .mult = 1,
  1619. .hw.init = &(struct clk_init_data){
  1620. .name = "dsi0pll_shadow_byteclk_src",
  1621. .parent_names = (const char *[]){"dsi0pll_shadow_bitclk_src"},
  1622. .num_parents = 1,
  1623. .flags = CLK_SET_RATE_PARENT,
  1624. .ops = &clk_fixed_factor_ops,
  1625. },
  1626. };
  1627. static struct clk_fixed_factor dsi1pll_byteclk_src = {
  1628. .div = 8,
  1629. .mult = 1,
  1630. .hw.init = &(struct clk_init_data){
  1631. .name = "dsi1pll_byteclk_src",
  1632. .parent_names = (const char *[]){"dsi1pll_bitclk_src"},
  1633. .num_parents = 1,
  1634. .flags = CLK_SET_RATE_PARENT,
  1635. .ops = &clk_fixed_factor_ops,
  1636. },
  1637. };
  1638. static struct clk_fixed_factor dsi1pll_shadow_byteclk_src = {
  1639. .div = 8,
  1640. .mult = 1,
  1641. .hw.init = &(struct clk_init_data){
  1642. .name = "dsi1pll_shadow_byteclk_src",
  1643. .parent_names = (const char *[]){"dsi1pll_shadow_bitclk_src"},
  1644. .num_parents = 1,
  1645. .flags = CLK_SET_RATE_PARENT,
  1646. .ops = &clk_fixed_factor_ops,
  1647. },
  1648. };
  1649. static struct clk_fixed_factor dsi0pll_post_bit_div = {
  1650. .div = 2,
  1651. .mult = 1,
  1652. .hw.init = &(struct clk_init_data){
  1653. .name = "dsi0pll_post_bit_div",
  1654. .parent_names = (const char *[]){"dsi0pll_bitclk_src"},
  1655. .num_parents = 1,
  1656. .ops = &clk_fixed_factor_ops,
  1657. },
  1658. };
  1659. static struct clk_fixed_factor dsi0pll_shadow_post_bit_div = {
  1660. .div = 2,
  1661. .mult = 1,
  1662. .hw.init = &(struct clk_init_data){
  1663. .name = "dsi0pll_shadow_post_bit_div",
  1664. .parent_names = (const char *[]){"dsi0pll_shadow_bitclk_src"},
  1665. .num_parents = 1,
  1666. .ops = &clk_fixed_factor_ops,
  1667. },
  1668. };
  1669. static struct clk_fixed_factor dsi1pll_post_bit_div = {
  1670. .div = 2,
  1671. .mult = 1,
  1672. .hw.init = &(struct clk_init_data){
  1673. .name = "dsi1pll_post_bit_div",
  1674. .parent_names = (const char *[]){"dsi1pll_bitclk_src"},
  1675. .num_parents = 1,
  1676. .ops = &clk_fixed_factor_ops,
  1677. },
  1678. };
  1679. static struct clk_fixed_factor dsi1pll_shadow_post_bit_div = {
  1680. .div = 2,
  1681. .mult = 1,
  1682. .hw.init = &(struct clk_init_data){
  1683. .name = "dsi1pll_shadow_post_bit_div",
  1684. .parent_names = (const char *[]){"dsi1pll_shadow_bitclk_src"},
  1685. .num_parents = 1,
  1686. .ops = &clk_fixed_factor_ops,
  1687. },
  1688. };
  1689. static struct clk_regmap_mux dsi0pll_byteclk_mux = {
  1690. .shift = 0,
  1691. .width = 1,
  1692. .clkr = {
  1693. .hw.init = &(struct clk_init_data){
  1694. .name = "dsi0_phy_pll_out_byteclk",
  1695. .parent_names = (const char *[]){"dsi0pll_byteclk_src",
  1696. "dsi0pll_shadow_byteclk_src"},
  1697. .num_parents = 2,
  1698. .flags = (CLK_SET_RATE_PARENT |
  1699. CLK_SET_RATE_NO_REPARENT),
  1700. .ops = &clk_regmap_mux_closest_ops,
  1701. },
  1702. },
  1703. };
  1704. static struct clk_regmap_mux dsi1pll_byteclk_mux = {
  1705. .shift = 0,
  1706. .width = 1,
  1707. .clkr = {
  1708. .hw.init = &(struct clk_init_data){
  1709. .name = "dsi1_phy_pll_out_byteclk",
  1710. .parent_names = (const char *[]){"dsi1pll_byteclk_src",
  1711. "dsi1pll_shadow_byteclk_src"},
  1712. .num_parents = 2,
  1713. .flags = (CLK_SET_RATE_PARENT |
  1714. CLK_SET_RATE_NO_REPARENT),
  1715. .ops = &clk_regmap_mux_closest_ops,
  1716. },
  1717. },
  1718. };
  1719. static struct clk_regmap_mux dsi0pll_pclk_src_mux = {
  1720. .reg = PHY_CMN_CLK_CFG1,
  1721. .shift = 0,
  1722. .width = 1,
  1723. .clkr = {
  1724. .hw.init = &(struct clk_init_data){
  1725. .name = "dsi0pll_pclk_src_mux",
  1726. .parent_names = (const char *[]){"dsi0pll_bitclk_src",
  1727. "dsi0pll_post_bit_div"},
  1728. .num_parents = 2,
  1729. .ops = &clk_regmap_mux_closest_ops,
  1730. },
  1731. },
  1732. };
  1733. static struct clk_regmap_mux dsi0pll_shadow_pclk_src_mux = {
  1734. .reg = PHY_CMN_CLK_CFG1,
  1735. .shift = 0,
  1736. .width = 1,
  1737. .clkr = {
  1738. .hw.init = &(struct clk_init_data){
  1739. .name = "dsi0pll_shadow_pclk_src_mux",
  1740. .parent_names = (const char *[]){
  1741. "dsi0pll_shadow_bitclk_src",
  1742. "dsi0pll_shadow_post_bit_div"},
  1743. .num_parents = 2,
  1744. .ops = &clk_regmap_mux_closest_ops,
  1745. },
  1746. },
  1747. };
  1748. static struct clk_regmap_mux dsi1pll_pclk_src_mux = {
  1749. .reg = PHY_CMN_CLK_CFG1,
  1750. .shift = 0,
  1751. .width = 1,
  1752. .clkr = {
  1753. .hw.init = &(struct clk_init_data){
  1754. .name = "dsi1pll_pclk_src_mux",
  1755. .parent_names = (const char *[]){"dsi1pll_bitclk_src",
  1756. "dsi1pll_post_bit_div"},
  1757. .num_parents = 2,
  1758. .ops = &clk_regmap_mux_closest_ops,
  1759. },
  1760. },
  1761. };
  1762. static struct clk_regmap_mux dsi1pll_shadow_pclk_src_mux = {
  1763. .reg = PHY_CMN_CLK_CFG1,
  1764. .shift = 0,
  1765. .width = 1,
  1766. .clkr = {
  1767. .hw.init = &(struct clk_init_data){
  1768. .name = "dsi1pll_shadow_pclk_src_mux",
  1769. .parent_names = (const char *[]){
  1770. "dsi1pll_shadow_bitclk_src",
  1771. "dsi1pll_shadow_post_bit_div"},
  1772. .num_parents = 2,
  1773. .ops = &clk_regmap_mux_closest_ops,
  1774. },
  1775. },
  1776. };
  1777. static struct clk_regmap_div dsi0pll_pclk_src = {
  1778. .shift = 0,
  1779. .width = 4,
  1780. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1781. .clkr = {
  1782. .hw.init = &(struct clk_init_data){
  1783. .name = "dsi0pll_pclk_src",
  1784. .parent_names = (const char *[]){
  1785. "dsi0pll_pclk_src_mux"},
  1786. .num_parents = 1,
  1787. .flags = CLK_SET_RATE_PARENT,
  1788. .ops = &clk_regmap_div_ops,
  1789. },
  1790. },
  1791. };
  1792. static struct clk_regmap_div dsi0pll_shadow_pclk_src = {
  1793. .shift = 0,
  1794. .width = 4,
  1795. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1796. .clkr = {
  1797. .hw.init = &(struct clk_init_data){
  1798. .name = "dsi0pll_shadow_pclk_src",
  1799. .parent_names = (const char *[]){
  1800. "dsi0pll_shadow_pclk_src_mux"},
  1801. .num_parents = 1,
  1802. .flags = CLK_SET_RATE_PARENT,
  1803. .ops = &clk_regmap_div_ops,
  1804. },
  1805. },
  1806. };
  1807. static struct clk_regmap_div dsi1pll_pclk_src = {
  1808. .shift = 0,
  1809. .width = 4,
  1810. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1811. .clkr = {
  1812. .hw.init = &(struct clk_init_data){
  1813. .name = "dsi1pll_pclk_src",
  1814. .parent_names = (const char *[]){
  1815. "dsi1pll_pclk_src_mux"},
  1816. .num_parents = 1,
  1817. .flags = CLK_SET_RATE_PARENT,
  1818. .ops = &clk_regmap_div_ops,
  1819. },
  1820. },
  1821. };
  1822. static struct clk_regmap_div dsi1pll_shadow_pclk_src = {
  1823. .shift = 0,
  1824. .width = 4,
  1825. .flags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
  1826. .clkr = {
  1827. .hw.init = &(struct clk_init_data){
  1828. .name = "dsi1pll_shadow_pclk_src",
  1829. .parent_names = (const char *[]){
  1830. "dsi1pll_shadow_pclk_src_mux"},
  1831. .num_parents = 1,
  1832. .flags = CLK_SET_RATE_PARENT,
  1833. .ops = &clk_regmap_div_ops,
  1834. },
  1835. },
  1836. };
  1837. static struct clk_regmap_mux dsi0pll_pclk_mux = {
  1838. .shift = 0,
  1839. .width = 1,
  1840. .clkr = {
  1841. .hw.init = &(struct clk_init_data){
  1842. .name = "dsi0_phy_pll_out_dsiclk",
  1843. .parent_names = (const char *[]){"dsi0pll_pclk_src",
  1844. "dsi0pll_shadow_pclk_src"},
  1845. .num_parents = 2,
  1846. .flags = (CLK_SET_RATE_PARENT |
  1847. CLK_SET_RATE_NO_REPARENT),
  1848. .ops = &clk_regmap_mux_closest_ops,
  1849. },
  1850. },
  1851. };
  1852. static struct clk_regmap_mux dsi1pll_pclk_mux = {
  1853. .shift = 0,
  1854. .width = 1,
  1855. .clkr = {
  1856. .hw.init = &(struct clk_init_data){
  1857. .name = "dsi1_phy_pll_out_dsiclk",
  1858. .parent_names = (const char *[]){"dsi1pll_pclk_src",
  1859. "dsi1pll_shadow_pclk_src"},
  1860. .num_parents = 2,
  1861. .flags = (CLK_SET_RATE_PARENT |
  1862. CLK_SET_RATE_NO_REPARENT),
  1863. .ops = &clk_regmap_mux_closest_ops,
  1864. },
  1865. },
  1866. };
  1867. static struct clk_hw *dsi_pllcc_5nm[] = {
  1868. [VCO_CLK_0] = &dsi0pll_vco_clk.hw,
  1869. [PLL_OUT_DIV_0_CLK] = &dsi0pll_pll_out_div.clkr.hw,
  1870. [BITCLK_SRC_0_CLK] = &dsi0pll_bitclk_src.clkr.hw,
  1871. [BYTECLK_SRC_0_CLK] = &dsi0pll_byteclk_src.hw,
  1872. [POST_BIT_DIV_0_CLK] = &dsi0pll_post_bit_div.hw,
  1873. [POST_VCO_DIV_0_CLK] = &dsi0pll_post_vco_div.hw,
  1874. [BYTECLK_MUX_0_CLK] = &dsi0pll_byteclk_mux.clkr.hw,
  1875. [PCLK_SRC_MUX_0_CLK] = &dsi0pll_pclk_src_mux.clkr.hw,
  1876. [PCLK_SRC_0_CLK] = &dsi0pll_pclk_src.clkr.hw,
  1877. [PCLK_MUX_0_CLK] = &dsi0pll_pclk_mux.clkr.hw,
  1878. [SHADOW_VCO_CLK_0] = &dsi0pll_shadow_vco_clk.hw,
  1879. [SHADOW_PLL_OUT_DIV_0_CLK] = &dsi0pll_shadow_pll_out_div.clkr.hw,
  1880. [SHADOW_BITCLK_SRC_0_CLK] = &dsi0pll_shadow_bitclk_src.clkr.hw,
  1881. [SHADOW_BYTECLK_SRC_0_CLK] = &dsi0pll_shadow_byteclk_src.hw,
  1882. [SHADOW_POST_BIT_DIV_0_CLK] = &dsi0pll_shadow_post_bit_div.hw,
  1883. [SHADOW_POST_VCO_DIV_0_CLK] = &dsi0pll_shadow_post_vco_div.hw,
  1884. [SHADOW_PCLK_SRC_MUX_0_CLK] = &dsi0pll_shadow_pclk_src_mux.clkr.hw,
  1885. [SHADOW_PCLK_SRC_0_CLK] = &dsi0pll_shadow_pclk_src.clkr.hw,
  1886. [VCO_CLK_1] = &dsi1pll_vco_clk.hw,
  1887. [PLL_OUT_DIV_1_CLK] = &dsi1pll_pll_out_div.clkr.hw,
  1888. [BITCLK_SRC_1_CLK] = &dsi1pll_bitclk_src.clkr.hw,
  1889. [BYTECLK_SRC_1_CLK] = &dsi1pll_byteclk_src.hw,
  1890. [POST_BIT_DIV_1_CLK] = &dsi1pll_post_bit_div.hw,
  1891. [POST_VCO_DIV_1_CLK] = &dsi1pll_post_vco_div.hw,
  1892. [BYTECLK_MUX_1_CLK] = &dsi1pll_byteclk_mux.clkr.hw,
  1893. [PCLK_SRC_MUX_1_CLK] = &dsi1pll_pclk_src_mux.clkr.hw,
  1894. [PCLK_SRC_1_CLK] = &dsi1pll_pclk_src.clkr.hw,
  1895. [PCLK_MUX_1_CLK] = &dsi1pll_pclk_mux.clkr.hw,
  1896. [SHADOW_VCO_CLK_1] = &dsi1pll_shadow_vco_clk.hw,
  1897. [SHADOW_PLL_OUT_DIV_1_CLK] = &dsi1pll_shadow_pll_out_div.clkr.hw,
  1898. [SHADOW_BITCLK_SRC_1_CLK] = &dsi1pll_shadow_bitclk_src.clkr.hw,
  1899. [SHADOW_BYTECLK_SRC_1_CLK] = &dsi1pll_shadow_byteclk_src.hw,
  1900. [SHADOW_POST_BIT_DIV_1_CLK] = &dsi1pll_shadow_post_bit_div.hw,
  1901. [SHADOW_POST_VCO_DIV_1_CLK] = &dsi1pll_shadow_post_vco_div.hw,
  1902. [SHADOW_PCLK_SRC_MUX_1_CLK] = &dsi1pll_shadow_pclk_src_mux.clkr.hw,
  1903. [SHADOW_PCLK_SRC_1_CLK] = &dsi1pll_shadow_pclk_src.clkr.hw,
  1904. };
  1905. int dsi_pll_clock_register_5nm(struct platform_device *pdev,
  1906. struct dsi_pll_resource *pll_res)
  1907. {
  1908. int rc = 0, ndx, i;
  1909. struct clk *clk;
  1910. struct clk_onecell_data *clk_data;
  1911. int num_clks = ARRAY_SIZE(dsi_pllcc_5nm);
  1912. struct regmap *rmap;
  1913. if (!pdev || !pdev->dev.of_node ||
  1914. !pll_res || !pll_res->pll_base || !pll_res->phy_base) {
  1915. pr_err("Invalid params\n");
  1916. return -EINVAL;
  1917. }
  1918. ndx = pll_res->index;
  1919. if (ndx >= DSI_PLL_MAX) {
  1920. pr_err("pll index(%d) NOT supported\n", ndx);
  1921. return -EINVAL;
  1922. }
  1923. pll_rsc_db[ndx] = pll_res;
  1924. plls[ndx].rsc = pll_res;
  1925. pll_res->priv = &plls[ndx];
  1926. pll_res->vco_delay = VCO_DELAY_USEC;
  1927. clk_data = devm_kzalloc(&pdev->dev, sizeof(struct clk_onecell_data),
  1928. GFP_KERNEL);
  1929. if (!clk_data)
  1930. return -ENOMEM;
  1931. clk_data->clks = devm_kzalloc(&pdev->dev, (num_clks *
  1932. sizeof(struct clk *)), GFP_KERNEL);
  1933. if (!clk_data->clks)
  1934. return -ENOMEM;
  1935. clk_data->clk_num = num_clks;
  1936. /* Establish client data */
  1937. if (ndx == 0) {
  1938. rmap = devm_regmap_init(&pdev->dev, &pll_regmap_bus,
  1939. pll_res, &dsi_pll_5nm_config);
  1940. dsi0pll_pll_out_div.clkr.regmap = rmap;
  1941. dsi0pll_shadow_pll_out_div.clkr.regmap = rmap;
  1942. rmap = devm_regmap_init(&pdev->dev, &bitclk_src_regmap_bus,
  1943. pll_res, &dsi_pll_5nm_config);
  1944. dsi0pll_bitclk_src.clkr.regmap = rmap;
  1945. dsi0pll_shadow_bitclk_src.clkr.regmap = rmap;
  1946. rmap = devm_regmap_init(&pdev->dev, &pclk_src_regmap_bus,
  1947. pll_res, &dsi_pll_5nm_config);
  1948. dsi0pll_pclk_src.clkr.regmap = rmap;
  1949. dsi0pll_shadow_pclk_src.clkr.regmap = rmap;
  1950. rmap = devm_regmap_init(&pdev->dev, &dsi_mux_regmap_bus,
  1951. pll_res, &dsi_pll_5nm_config);
  1952. dsi0pll_pclk_mux.clkr.regmap = rmap;
  1953. rmap = devm_regmap_init(&pdev->dev, &pclk_src_mux_regmap_bus,
  1954. pll_res, &dsi_pll_5nm_config);
  1955. dsi0pll_pclk_src_mux.clkr.regmap = rmap;
  1956. dsi0pll_shadow_pclk_src_mux.clkr.regmap = rmap;
  1957. rmap = devm_regmap_init(&pdev->dev, &dsi_mux_regmap_bus,
  1958. pll_res, &dsi_pll_5nm_config);
  1959. dsi0pll_byteclk_mux.clkr.regmap = rmap;
  1960. dsi0pll_vco_clk.priv = pll_res;
  1961. dsi0pll_shadow_vco_clk.priv = pll_res;
  1962. if (dsi_pll_5nm_is_hw_revision(pll_res)) {
  1963. dsi0pll_vco_clk.min_rate = 600000000;
  1964. dsi0pll_vco_clk.max_rate = 5000000000;
  1965. dsi0pll_shadow_vco_clk.min_rate = 600000000;
  1966. dsi0pll_shadow_vco_clk.max_rate = 5000000000;
  1967. }
  1968. for (i = VCO_CLK_0; i <= SHADOW_PCLK_SRC_0_CLK; i++) {
  1969. clk = devm_clk_register(&pdev->dev,
  1970. dsi_pllcc_5nm[i]);
  1971. if (IS_ERR(clk)) {
  1972. pr_err("clk registration failed for DSI clock:%d\n",
  1973. pll_res->index);
  1974. rc = -EINVAL;
  1975. goto clk_register_fail;
  1976. }
  1977. clk_data->clks[i] = clk;
  1978. }
  1979. rc = of_clk_add_provider(pdev->dev.of_node,
  1980. of_clk_src_onecell_get, clk_data);
  1981. } else {
  1982. rmap = devm_regmap_init(&pdev->dev, &pll_regmap_bus,
  1983. pll_res, &dsi_pll_5nm_config);
  1984. dsi1pll_pll_out_div.clkr.regmap = rmap;
  1985. dsi1pll_shadow_pll_out_div.clkr.regmap = rmap;
  1986. rmap = devm_regmap_init(&pdev->dev, &bitclk_src_regmap_bus,
  1987. pll_res, &dsi_pll_5nm_config);
  1988. dsi1pll_bitclk_src.clkr.regmap = rmap;
  1989. dsi1pll_shadow_bitclk_src.clkr.regmap = rmap;
  1990. rmap = devm_regmap_init(&pdev->dev, &pclk_src_regmap_bus,
  1991. pll_res, &dsi_pll_5nm_config);
  1992. dsi1pll_pclk_src.clkr.regmap = rmap;
  1993. dsi1pll_shadow_pclk_src.clkr.regmap = rmap;
  1994. rmap = devm_regmap_init(&pdev->dev, &dsi_mux_regmap_bus,
  1995. pll_res, &dsi_pll_5nm_config);
  1996. dsi1pll_pclk_mux.clkr.regmap = rmap;
  1997. rmap = devm_regmap_init(&pdev->dev, &pclk_src_mux_regmap_bus,
  1998. pll_res, &dsi_pll_5nm_config);
  1999. dsi1pll_pclk_src_mux.clkr.regmap = rmap;
  2000. dsi1pll_shadow_pclk_src_mux.clkr.regmap = rmap;
  2001. rmap = devm_regmap_init(&pdev->dev, &dsi_mux_regmap_bus,
  2002. pll_res, &dsi_pll_5nm_config);
  2003. dsi1pll_byteclk_mux.clkr.regmap = rmap;
  2004. dsi1pll_vco_clk.priv = pll_res;
  2005. dsi1pll_shadow_vco_clk.priv = pll_res;
  2006. if (dsi_pll_5nm_is_hw_revision(pll_res)) {
  2007. dsi1pll_vco_clk.min_rate = 600000000;
  2008. dsi1pll_vco_clk.max_rate = 5000000000;
  2009. dsi1pll_shadow_vco_clk.min_rate = 600000000;
  2010. dsi1pll_shadow_vco_clk.max_rate = 5000000000;
  2011. }
  2012. for (i = VCO_CLK_1; i <= SHADOW_PCLK_SRC_1_CLK; i++) {
  2013. clk = devm_clk_register(&pdev->dev,
  2014. dsi_pllcc_5nm[i]);
  2015. if (IS_ERR(clk)) {
  2016. pr_err("clk registration failed for DSI clock:%d\n",
  2017. pll_res->index);
  2018. rc = -EINVAL;
  2019. goto clk_register_fail;
  2020. }
  2021. clk_data->clks[i] = clk;
  2022. }
  2023. rc = of_clk_add_provider(pdev->dev.of_node,
  2024. of_clk_src_onecell_get, clk_data);
  2025. }
  2026. if (!rc) {
  2027. pr_info("Registered DSI PLL ndx=%d, clocks successfully\n",
  2028. ndx);
  2029. return rc;
  2030. }
  2031. clk_register_fail:
  2032. return rc;
  2033. }