clk-rp1.c 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2023 Raspberry Pi Ltd.
  4. *
  5. * Clock driver for RP1 PCIe multifunction chip.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/clk-provider.h>
  9. #include <linux/regmap.h>
  10. #include <linux/math64.h>
  11. #include <linux/module.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/units.h>
  14. #include <dt-bindings/clock/raspberrypi,rp1-clocks.h>
  15. #define PLL_SYS_OFFSET 0x08000
  16. #define PLL_SYS_CS (PLL_SYS_OFFSET + 0x00)
  17. #define PLL_SYS_PWR (PLL_SYS_OFFSET + 0x04)
  18. #define PLL_SYS_FBDIV_INT (PLL_SYS_OFFSET + 0x08)
  19. #define PLL_SYS_FBDIV_FRAC (PLL_SYS_OFFSET + 0x0c)
  20. #define PLL_SYS_PRIM (PLL_SYS_OFFSET + 0x10)
  21. #define PLL_SYS_SEC (PLL_SYS_OFFSET + 0x14)
  22. #define PLL_AUDIO_OFFSET 0x0c000
  23. #define PLL_AUDIO_CS (PLL_AUDIO_OFFSET + 0x00)
  24. #define PLL_AUDIO_PWR (PLL_AUDIO_OFFSET + 0x04)
  25. #define PLL_AUDIO_FBDIV_INT (PLL_AUDIO_OFFSET + 0x08)
  26. #define PLL_AUDIO_FBDIV_FRAC (PLL_AUDIO_OFFSET + 0x0c)
  27. #define PLL_AUDIO_PRIM (PLL_AUDIO_OFFSET + 0x10)
  28. #define PLL_AUDIO_SEC (PLL_AUDIO_OFFSET + 0x14)
  29. #define PLL_AUDIO_TERN (PLL_AUDIO_OFFSET + 0x18)
  30. #define PLL_VIDEO_OFFSET 0x10000
  31. #define PLL_VIDEO_CS (PLL_VIDEO_OFFSET + 0x00)
  32. #define PLL_VIDEO_PWR (PLL_VIDEO_OFFSET + 0x04)
  33. #define PLL_VIDEO_FBDIV_INT (PLL_VIDEO_OFFSET + 0x08)
  34. #define PLL_VIDEO_FBDIV_FRAC (PLL_VIDEO_OFFSET + 0x0c)
  35. #define PLL_VIDEO_PRIM (PLL_VIDEO_OFFSET + 0x10)
  36. #define PLL_VIDEO_SEC (PLL_VIDEO_OFFSET + 0x14)
  37. #define GPCLK_OE_CTRL 0x00000
  38. #define CLK_SYS_OFFSET 0x00014
  39. #define CLK_SYS_CTRL (CLK_SYS_OFFSET + 0x00)
  40. #define CLK_SYS_DIV_INT (CLK_SYS_OFFSET + 0x04)
  41. #define CLK_SYS_SEL (CLK_SYS_OFFSET + 0x0c)
  42. #define CLK_SLOW_OFFSET 0x00024
  43. #define CLK_SLOW_SYS_CTRL (CLK_SLOW_OFFSET + 0x00)
  44. #define CLK_SLOW_SYS_DIV_INT (CLK_SLOW_OFFSET + 0x04)
  45. #define CLK_SLOW_SYS_SEL (CLK_SLOW_OFFSET + 0x0c)
  46. #define CLK_DMA_OFFSET 0x00044
  47. #define CLK_DMA_CTRL (CLK_DMA_OFFSET + 0x00)
  48. #define CLK_DMA_DIV_INT (CLK_DMA_OFFSET + 0x04)
  49. #define CLK_DMA_SEL (CLK_DMA_OFFSET + 0x0c)
  50. #define CLK_UART_OFFSET 0x00054
  51. #define CLK_UART_CTRL (CLK_UART_OFFSET + 0x00)
  52. #define CLK_UART_DIV_INT (CLK_UART_OFFSET + 0x04)
  53. #define CLK_UART_SEL (CLK_UART_OFFSET + 0x0c)
  54. #define CLK_ETH_OFFSET 0x00064
  55. #define CLK_ETH_CTRL (CLK_ETH_OFFSET + 0x00)
  56. #define CLK_ETH_DIV_INT (CLK_ETH_OFFSET + 0x04)
  57. #define CLK_ETH_SEL (CLK_ETH_OFFSET + 0x0c)
  58. #define CLK_PWM0_OFFSET 0x00074
  59. #define CLK_PWM0_CTRL (CLK_PWM0_OFFSET + 0x00)
  60. #define CLK_PWM0_DIV_INT (CLK_PWM0_OFFSET + 0x04)
  61. #define CLK_PWM0_DIV_FRAC (CLK_PWM0_OFFSET + 0x08)
  62. #define CLK_PWM0_SEL (CLK_PWM0_OFFSET + 0x0c)
  63. #define CLK_PWM1_OFFSET 0x00084
  64. #define CLK_PWM1_CTRL (CLK_PWM1_OFFSET + 0x00)
  65. #define CLK_PWM1_DIV_INT (CLK_PWM1_OFFSET + 0x04)
  66. #define CLK_PWM1_DIV_FRAC (CLK_PWM1_OFFSET + 0x08)
  67. #define CLK_PWM1_SEL (CLK_PWM1_OFFSET + 0x0c)
  68. #define CLK_AUDIO_IN_OFFSET 0x00094
  69. #define CLK_AUDIO_IN_CTRL (CLK_AUDIO_IN_OFFSET + 0x00)
  70. #define CLK_AUDIO_IN_DIV_INT (CLK_AUDIO_IN_OFFSET + 0x04)
  71. #define CLK_AUDIO_IN_SEL (CLK_AUDIO_IN_OFFSET + 0x0c)
  72. #define CLK_AUDIO_OUT_OFFSET 0x000a4
  73. #define CLK_AUDIO_OUT_CTRL (CLK_AUDIO_OUT_OFFSET + 0x00)
  74. #define CLK_AUDIO_OUT_DIV_INT (CLK_AUDIO_OUT_OFFSET + 0x04)
  75. #define CLK_AUDIO_OUT_SEL (CLK_AUDIO_OUT_OFFSET + 0x0c)
  76. #define CLK_I2S_OFFSET 0x000b4
  77. #define CLK_I2S_CTRL (CLK_I2S_OFFSET + 0x00)
  78. #define CLK_I2S_DIV_INT (CLK_I2S_OFFSET + 0x04)
  79. #define CLK_I2S_SEL (CLK_I2S_OFFSET + 0x0c)
  80. #define CLK_MIPI0_CFG_OFFSET 0x000c4
  81. #define CLK_MIPI0_CFG_CTRL (CLK_MIPI0_CFG_OFFSET + 0x00)
  82. #define CLK_MIPI0_CFG_DIV_INT (CLK_MIPI0_CFG_OFFSET + 0x04)
  83. #define CLK_MIPI0_CFG_SEL (CLK_MIPI0_CFG_OFFSET + 0x0c)
  84. #define CLK_MIPI1_CFG_OFFSET 0x000d4
  85. #define CLK_MIPI1_CFG_CTRL (CLK_MIPI1_CFG_OFFSET + 0x00)
  86. #define CLK_MIPI1_CFG_DIV_INT (CLK_MIPI1_CFG_OFFSET + 0x04)
  87. #define CLK_MIPI1_CFG_SEL (CLK_MIPI1_CFG_OFFSET + 0x0c)
  88. #define CLK_PCIE_AUX_OFFSET 0x000e4
  89. #define CLK_PCIE_AUX_CTRL (CLK_PCIE_AUX_OFFSET + 0x00)
  90. #define CLK_PCIE_AUX_DIV_INT (CLK_PCIE_AUX_OFFSET + 0x04)
  91. #define CLK_PCIE_AUX_SEL (CLK_PCIE_AUX_OFFSET + 0x0c)
  92. #define CLK_USBH0_MICROFRAME_OFFSET 0x000f4
  93. #define CLK_USBH0_MICROFRAME_CTRL (CLK_USBH0_MICROFRAME_OFFSET + 0x00)
  94. #define CLK_USBH0_MICROFRAME_DIV_INT (CLK_USBH0_MICROFRAME_OFFSET + 0x04)
  95. #define CLK_USBH0_MICROFRAME_SEL (CLK_USBH0_MICROFRAME_OFFSET + 0x0c)
  96. #define CLK_USBH1_MICROFRAME_OFFSET 0x00104
  97. #define CLK_USBH1_MICROFRAME_CTRL (CLK_USBH1_MICROFRAME_OFFSET + 0x00)
  98. #define CLK_USBH1_MICROFRAME_DIV_INT (CLK_USBH1_MICROFRAME_OFFSET + 0x04)
  99. #define CLK_USBH1_MICROFRAME_SEL (CLK_USBH1_MICROFRAME_OFFSET + 0x0c)
  100. #define CLK_USBH0_SUSPEND_OFFSET 0x00114
  101. #define CLK_USBH0_SUSPEND_CTRL (CLK_USBH0_SUSPEND_OFFSET + 0x00)
  102. #define CLK_USBH0_SUSPEND_DIV_INT (CLK_USBH0_SUSPEND_OFFSET + 0x04)
  103. #define CLK_USBH0_SUSPEND_SEL (CLK_USBH0_SUSPEND_OFFSET + 0x0c)
  104. #define CLK_USBH1_SUSPEND_OFFSET 0x00124
  105. #define CLK_USBH1_SUSPEND_CTRL (CLK_USBH1_SUSPEND_OFFSET + 0x00)
  106. #define CLK_USBH1_SUSPEND_DIV_INT (CLK_USBH1_SUSPEND_OFFSET + 0x04)
  107. #define CLK_USBH1_SUSPEND_SEL (CLK_USBH1_SUSPEND_OFFSET + 0x0c)
  108. #define CLK_ETH_TSU_OFFSET 0x00134
  109. #define CLK_ETH_TSU_CTRL (CLK_ETH_TSU_OFFSET + 0x00)
  110. #define CLK_ETH_TSU_DIV_INT (CLK_ETH_TSU_OFFSET + 0x04)
  111. #define CLK_ETH_TSU_SEL (CLK_ETH_TSU_OFFSET + 0x0c)
  112. #define CLK_ADC_OFFSET 0x00144
  113. #define CLK_ADC_CTRL (CLK_ADC_OFFSET + 0x00)
  114. #define CLK_ADC_DIV_INT (CLK_ADC_OFFSET + 0x04)
  115. #define CLK_ADC_SEL (CLK_ADC_OFFSET + 0x0c)
  116. #define CLK_SDIO_TIMER_OFFSET 0x00154
  117. #define CLK_SDIO_TIMER_CTRL (CLK_SDIO_TIMER_OFFSET + 0x00)
  118. #define CLK_SDIO_TIMER_DIV_INT (CLK_SDIO_TIMER_OFFSET + 0x04)
  119. #define CLK_SDIO_TIMER_SEL (CLK_SDIO_TIMER_OFFSET + 0x0c)
  120. #define CLK_SDIO_ALT_SRC_OFFSET 0x00164
  121. #define CLK_SDIO_ALT_SRC_CTRL (CLK_SDIO_ALT_SRC_OFFSET + 0x00)
  122. #define CLK_SDIO_ALT_SRC_DIV_INT (CLK_SDIO_ALT_SRC_OFFSET + 0x04)
  123. #define CLK_SDIO_ALT_SRC_SEL (CLK_SDIO_ALT_SRC_OFFSET + 0x0c)
  124. #define CLK_GP0_OFFSET 0x00174
  125. #define CLK_GP0_CTRL (CLK_GP0_OFFSET + 0x00)
  126. #define CLK_GP0_DIV_INT (CLK_GP0_OFFSET + 0x04)
  127. #define CLK_GP0_DIV_FRAC (CLK_GP0_OFFSET + 0x08)
  128. #define CLK_GP0_SEL (CLK_GP0_OFFSET + 0x0c)
  129. #define CLK_GP1_OFFSET 0x00184
  130. #define CLK_GP1_CTRL (CLK_GP1_OFFSET + 0x00)
  131. #define CLK_GP1_DIV_INT (CLK_GP1_OFFSET + 0x04)
  132. #define CLK_GP1_DIV_FRAC (CLK_GP1_OFFSET + 0x08)
  133. #define CLK_GP1_SEL (CLK_GP1_OFFSET + 0x0c)
  134. #define CLK_GP2_OFFSET 0x00194
  135. #define CLK_GP2_CTRL (CLK_GP2_OFFSET + 0x00)
  136. #define CLK_GP2_DIV_INT (CLK_GP2_OFFSET + 0x04)
  137. #define CLK_GP2_DIV_FRAC (CLK_GP2_OFFSET + 0x08)
  138. #define CLK_GP2_SEL (CLK_GP2_OFFSET + 0x0c)
  139. #define CLK_GP3_OFFSET 0x001a4
  140. #define CLK_GP3_CTRL (CLK_GP3_OFFSET + 0x00)
  141. #define CLK_GP3_DIV_INT (CLK_GP3_OFFSET + 0x04)
  142. #define CLK_GP3_DIV_FRAC (CLK_GP3_OFFSET + 0x08)
  143. #define CLK_GP3_SEL (CLK_GP3_OFFSET + 0x0c)
  144. #define CLK_GP4_OFFSET 0x001b4
  145. #define CLK_GP4_CTRL (CLK_GP4_OFFSET + 0x00)
  146. #define CLK_GP4_DIV_INT (CLK_GP4_OFFSET + 0x04)
  147. #define CLK_GP4_DIV_FRAC (CLK_GP4_OFFSET + 0x08)
  148. #define CLK_GP4_SEL (CLK_GP4_OFFSET + 0x0c)
  149. #define CLK_GP5_OFFSET 0x001c4
  150. #define CLK_GP5_CTRL (CLK_GP5_OFFSET + 0x00)
  151. #define CLK_GP5_DIV_INT (CLK_GP5_OFFSET + 0x04)
  152. #define CLK_GP5_DIV_FRAC (CLK_GP5_OFFSET + 0x08)
  153. #define CLK_GP5_SEL (CLK_GP5_OFFSET + 0x0c)
  154. #define CLK_SYS_RESUS_CTRL 0x0020c
  155. #define CLK_SLOW_SYS_RESUS_CTRL 0x00214
  156. #define FC0_OFFSET 0x0021c
  157. #define FC0_REF_KHZ (FC0_OFFSET + 0x00)
  158. #define FC0_MIN_KHZ (FC0_OFFSET + 0x04)
  159. #define FC0_MAX_KHZ (FC0_OFFSET + 0x08)
  160. #define FC0_DELAY (FC0_OFFSET + 0x0c)
  161. #define FC0_INTERVAL (FC0_OFFSET + 0x10)
  162. #define FC0_SRC (FC0_OFFSET + 0x14)
  163. #define FC0_STATUS (FC0_OFFSET + 0x18)
  164. #define FC0_RESULT (FC0_OFFSET + 0x1c)
  165. #define FC_SIZE 0x20
  166. #define FC_COUNT 8
  167. #define FC_NUM(idx, off) ((idx) * 32 + (off))
  168. #define AUX_SEL 1
  169. #define VIDEO_CLOCKS_OFFSET 0x4000
  170. #define VIDEO_CLK_VEC_CTRL (VIDEO_CLOCKS_OFFSET + 0x0000)
  171. #define VIDEO_CLK_VEC_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0004)
  172. #define VIDEO_CLK_VEC_SEL (VIDEO_CLOCKS_OFFSET + 0x000c)
  173. #define VIDEO_CLK_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0010)
  174. #define VIDEO_CLK_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0014)
  175. #define VIDEO_CLK_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x001c)
  176. #define VIDEO_CLK_MIPI0_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0020)
  177. #define VIDEO_CLK_MIPI0_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0024)
  178. #define VIDEO_CLK_MIPI0_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0028)
  179. #define VIDEO_CLK_MIPI0_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x002c)
  180. #define VIDEO_CLK_MIPI1_DPI_CTRL (VIDEO_CLOCKS_OFFSET + 0x0030)
  181. #define VIDEO_CLK_MIPI1_DPI_DIV_INT (VIDEO_CLOCKS_OFFSET + 0x0034)
  182. #define VIDEO_CLK_MIPI1_DPI_DIV_FRAC (VIDEO_CLOCKS_OFFSET + 0x0038)
  183. #define VIDEO_CLK_MIPI1_DPI_SEL (VIDEO_CLOCKS_OFFSET + 0x003c)
  184. #define DIV_INT_8BIT_MAX GENMASK(7, 0) /* max divide for most clocks */
  185. #define DIV_INT_16BIT_MAX GENMASK(15, 0) /* max divide for GPx, PWM */
  186. #define DIV_INT_24BIT_MAX GENMASK(23, 0) /* max divide for CLK_SYS */
  187. #define FC0_STATUS_DONE BIT(4)
  188. #define FC0_STATUS_RUNNING BIT(8)
  189. #define FC0_RESULT_FRAC_SHIFT 5
  190. #define PLL_PRIM_DIV1_MASK GENMASK(18, 16)
  191. #define PLL_PRIM_DIV2_MASK GENMASK(14, 12)
  192. #define PLL_SEC_DIV_MASK GENMASK(12, 8)
  193. #define PLL_CS_LOCK BIT(31)
  194. #define PLL_CS_REFDIV_MASK BIT(1)
  195. #define PLL_PWR_PD BIT(0)
  196. #define PLL_PWR_DACPD BIT(1)
  197. #define PLL_PWR_DSMPD BIT(2)
  198. #define PLL_PWR_POSTDIVPD BIT(3)
  199. #define PLL_PWR_4PHASEPD BIT(4)
  200. #define PLL_PWR_VCOPD BIT(5)
  201. #define PLL_PWR_MASK GENMASK(5, 0)
  202. #define PLL_SEC_RST BIT(16)
  203. #define PLL_SEC_IMPL BIT(31)
  204. /* PLL phase output for both PRI and SEC */
  205. #define PLL_PH_EN BIT(4)
  206. #define PLL_PH_PHASE_SHIFT 0
  207. #define RP1_PLL_PHASE_0 0
  208. #define RP1_PLL_PHASE_90 1
  209. #define RP1_PLL_PHASE_180 2
  210. #define RP1_PLL_PHASE_270 3
  211. /* Clock fields for all clocks */
  212. #define CLK_CTRL_ENABLE BIT(11)
  213. #define CLK_CTRL_AUXSRC_MASK GENMASK(9, 5)
  214. #define CLK_CTRL_SRC_SHIFT 0
  215. #define CLK_DIV_FRAC_BITS 16
  216. #define LOCK_TIMEOUT_US 100000
  217. #define LOCK_POLL_DELAY_US 5
  218. #define MAX_CLK_PARENTS 16
  219. #define PLL_DIV_INVALID 19
  220. /*
  221. * Secondary PLL channel output divider table.
  222. * Divider values range from 8 to 19, where
  223. * 19 means invalid.
  224. */
  225. static const struct clk_div_table pll_sec_div_table[] = {
  226. { 0x00, PLL_DIV_INVALID },
  227. { 0x01, PLL_DIV_INVALID },
  228. { 0x02, PLL_DIV_INVALID },
  229. { 0x03, PLL_DIV_INVALID },
  230. { 0x04, PLL_DIV_INVALID },
  231. { 0x05, PLL_DIV_INVALID },
  232. { 0x06, PLL_DIV_INVALID },
  233. { 0x07, PLL_DIV_INVALID },
  234. { 0x08, 8 },
  235. { 0x09, 9 },
  236. { 0x0a, 10 },
  237. { 0x0b, 11 },
  238. { 0x0c, 12 },
  239. { 0x0d, 13 },
  240. { 0x0e, 14 },
  241. { 0x0f, 15 },
  242. { 0x10, 16 },
  243. { 0x11, 17 },
  244. { 0x12, 18 },
  245. { 0x13, PLL_DIV_INVALID },
  246. { 0x14, PLL_DIV_INVALID },
  247. { 0x15, PLL_DIV_INVALID },
  248. { 0x16, PLL_DIV_INVALID },
  249. { 0x17, PLL_DIV_INVALID },
  250. { 0x18, PLL_DIV_INVALID },
  251. { 0x19, PLL_DIV_INVALID },
  252. { 0x1a, PLL_DIV_INVALID },
  253. { 0x1b, PLL_DIV_INVALID },
  254. { 0x1c, PLL_DIV_INVALID },
  255. { 0x1d, PLL_DIV_INVALID },
  256. { 0x1e, PLL_DIV_INVALID },
  257. { 0x1f, PLL_DIV_INVALID },
  258. { 0 }
  259. };
  260. struct rp1_clockman {
  261. struct device *dev;
  262. void __iomem *regs;
  263. struct regmap *regmap;
  264. spinlock_t regs_lock; /* spinlock for all clocks */
  265. /* Must be last */
  266. struct clk_hw_onecell_data onecell;
  267. };
  268. struct rp1_pll_core_data {
  269. u32 cs_reg;
  270. u32 pwr_reg;
  271. u32 fbdiv_int_reg;
  272. u32 fbdiv_frac_reg;
  273. u32 fc0_src;
  274. };
  275. struct rp1_pll_data {
  276. u32 ctrl_reg;
  277. u32 fc0_src;
  278. };
  279. struct rp1_pll_ph_data {
  280. unsigned int phase;
  281. unsigned int fixed_divider;
  282. u32 ph_reg;
  283. u32 fc0_src;
  284. };
  285. struct rp1_pll_divider_data {
  286. u32 sec_reg;
  287. u32 fc0_src;
  288. };
  289. struct rp1_clock_data {
  290. int num_std_parents;
  291. int num_aux_parents;
  292. u32 oe_mask;
  293. u32 clk_src_mask;
  294. u32 ctrl_reg;
  295. u32 div_int_reg;
  296. u32 div_frac_reg;
  297. u32 sel_reg;
  298. u32 div_int_max;
  299. unsigned long max_freq;
  300. u32 fc0_src;
  301. };
  302. struct rp1_clk_desc {
  303. struct clk_hw *(*clk_register)(struct rp1_clockman *clockman,
  304. struct rp1_clk_desc *desc);
  305. const void *data;
  306. struct clk_hw hw;
  307. struct rp1_clockman *clockman;
  308. unsigned long cached_rate;
  309. struct clk_divider div;
  310. };
  311. static struct rp1_clk_desc *clk_audio_core;
  312. static struct rp1_clk_desc *clk_audio;
  313. static struct rp1_clk_desc *clk_i2s;
  314. static struct clk_hw *clk_xosc;
  315. static inline
  316. void clockman_write(struct rp1_clockman *clockman, u32 reg, u32 val)
  317. {
  318. regmap_write(clockman->regmap, reg, val);
  319. }
  320. static inline u32 clockman_read(struct rp1_clockman *clockman, u32 reg)
  321. {
  322. u32 val;
  323. regmap_read(clockman->regmap, reg, &val);
  324. return val;
  325. }
  326. static int rp1_pll_core_is_on(struct clk_hw *hw)
  327. {
  328. struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
  329. struct rp1_clockman *clockman = pll_core->clockman;
  330. const struct rp1_pll_core_data *data = pll_core->data;
  331. u32 pwr = clockman_read(clockman, data->pwr_reg);
  332. return (pwr & PLL_PWR_PD) || (pwr & PLL_PWR_POSTDIVPD);
  333. }
  334. static int rp1_pll_core_on(struct clk_hw *hw)
  335. {
  336. struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
  337. struct rp1_clockman *clockman = pll_core->clockman;
  338. const struct rp1_pll_core_data *data = pll_core->data;
  339. u32 fbdiv_frac, val;
  340. int ret;
  341. spin_lock(&clockman->regs_lock);
  342. if (!(clockman_read(clockman, data->cs_reg) & PLL_CS_LOCK)) {
  343. /* Reset to a known state. */
  344. clockman_write(clockman, data->pwr_reg, PLL_PWR_MASK);
  345. clockman_write(clockman, data->fbdiv_int_reg, 20);
  346. clockman_write(clockman, data->fbdiv_frac_reg, 0);
  347. clockman_write(clockman, data->cs_reg, PLL_CS_REFDIV_MASK);
  348. }
  349. /* Come out of reset. */
  350. fbdiv_frac = clockman_read(clockman, data->fbdiv_frac_reg);
  351. clockman_write(clockman, data->pwr_reg, fbdiv_frac ? 0 : PLL_PWR_DSMPD);
  352. spin_unlock(&clockman->regs_lock);
  353. /* Wait for the PLL to lock. */
  354. ret = regmap_read_poll_timeout(clockman->regmap, data->cs_reg, val,
  355. val & PLL_CS_LOCK,
  356. LOCK_POLL_DELAY_US, LOCK_TIMEOUT_US);
  357. if (ret)
  358. dev_err(clockman->dev, "%s: can't lock PLL\n",
  359. clk_hw_get_name(hw));
  360. return ret;
  361. }
  362. static void rp1_pll_core_off(struct clk_hw *hw)
  363. {
  364. struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
  365. struct rp1_clockman *clockman = pll_core->clockman;
  366. const struct rp1_pll_core_data *data = pll_core->data;
  367. spin_lock(&clockman->regs_lock);
  368. clockman_write(clockman, data->pwr_reg, 0);
  369. spin_unlock(&clockman->regs_lock);
  370. }
  371. static inline unsigned long get_pll_core_divider(struct clk_hw *hw,
  372. unsigned long rate,
  373. unsigned long parent_rate,
  374. u32 *div_int, u32 *div_frac)
  375. {
  376. u32 fbdiv_int, fbdiv_frac;
  377. unsigned long calc_rate;
  378. u64 shifted_fbdiv_int;
  379. u64 div_fp64; /* 32.32 fixed point fraction. */
  380. /* Factor of reference clock to VCO frequency. */
  381. div_fp64 = (u64)(rate) << 32;
  382. div_fp64 = DIV_ROUND_CLOSEST_ULL(div_fp64, parent_rate);
  383. /* Round the fractional component at 24 bits. */
  384. div_fp64 += 1 << (32 - 24 - 1);
  385. fbdiv_int = div_fp64 >> 32;
  386. fbdiv_frac = (div_fp64 >> (32 - 24)) & 0xffffff;
  387. shifted_fbdiv_int = (u64)fbdiv_int << 24;
  388. calc_rate = (u64)parent_rate * (shifted_fbdiv_int + fbdiv_frac);
  389. calc_rate += BIT(23);
  390. calc_rate >>= 24;
  391. *div_int = fbdiv_int;
  392. *div_frac = fbdiv_frac;
  393. return calc_rate;
  394. }
  395. static int rp1_pll_core_set_rate(struct clk_hw *hw,
  396. unsigned long rate, unsigned long parent_rate)
  397. {
  398. struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
  399. struct rp1_clockman *clockman = pll_core->clockman;
  400. const struct rp1_pll_core_data *data = pll_core->data;
  401. u32 fbdiv_int, fbdiv_frac;
  402. /* Disable dividers to start with. */
  403. spin_lock(&clockman->regs_lock);
  404. clockman_write(clockman, data->fbdiv_int_reg, 0);
  405. clockman_write(clockman, data->fbdiv_frac_reg, 0);
  406. spin_unlock(&clockman->regs_lock);
  407. get_pll_core_divider(hw, rate, parent_rate,
  408. &fbdiv_int, &fbdiv_frac);
  409. spin_lock(&clockman->regs_lock);
  410. clockman_write(clockman, data->pwr_reg, fbdiv_frac ? 0 : PLL_PWR_DSMPD);
  411. clockman_write(clockman, data->fbdiv_int_reg, fbdiv_int);
  412. clockman_write(clockman, data->fbdiv_frac_reg, fbdiv_frac);
  413. spin_unlock(&clockman->regs_lock);
  414. /* Check that reference frequency is no greater than VCO / 16. */
  415. if (WARN_ON_ONCE(parent_rate > (rate / 16)))
  416. return -ERANGE;
  417. spin_lock(&clockman->regs_lock);
  418. /* Don't need to divide ref unless parent_rate > (output freq / 16) */
  419. clockman_write(clockman, data->cs_reg,
  420. clockman_read(clockman, data->cs_reg) |
  421. PLL_CS_REFDIV_MASK);
  422. spin_unlock(&clockman->regs_lock);
  423. return 0;
  424. }
  425. static unsigned long rp1_pll_core_recalc_rate(struct clk_hw *hw,
  426. unsigned long parent_rate)
  427. {
  428. struct rp1_clk_desc *pll_core = container_of(hw, struct rp1_clk_desc, hw);
  429. struct rp1_clockman *clockman = pll_core->clockman;
  430. const struct rp1_pll_core_data *data = pll_core->data;
  431. u32 fbdiv_int, fbdiv_frac;
  432. unsigned long calc_rate;
  433. u64 shifted_fbdiv_int;
  434. fbdiv_int = clockman_read(clockman, data->fbdiv_int_reg);
  435. fbdiv_frac = clockman_read(clockman, data->fbdiv_frac_reg);
  436. shifted_fbdiv_int = (u64)fbdiv_int << 24;
  437. calc_rate = (u64)parent_rate * (shifted_fbdiv_int + fbdiv_frac);
  438. calc_rate += BIT(23);
  439. calc_rate >>= 24;
  440. return calc_rate;
  441. }
  442. static int rp1_pll_core_determine_rate(struct clk_hw *hw,
  443. struct clk_rate_request *req)
  444. {
  445. u32 fbdiv_int, fbdiv_frac;
  446. req->rate = get_pll_core_divider(hw, req->rate, req->best_parent_rate,
  447. &fbdiv_int,
  448. &fbdiv_frac);
  449. return 0;
  450. }
  451. static void get_pll_prim_dividers(unsigned long rate, unsigned long parent_rate,
  452. u32 *divider1, u32 *divider2)
  453. {
  454. unsigned int div1, div2;
  455. unsigned int best_div1 = 7, best_div2 = 7;
  456. unsigned long best_rate_diff =
  457. abs_diff(DIV_ROUND_CLOSEST(parent_rate, best_div1 * best_div2), rate);
  458. unsigned long rate_diff, calc_rate;
  459. for (div1 = 1; div1 <= 7; div1++) {
  460. for (div2 = 1; div2 <= div1; div2++) {
  461. calc_rate = DIV_ROUND_CLOSEST(parent_rate, div1 * div2);
  462. rate_diff = abs_diff(calc_rate, rate);
  463. if (calc_rate == rate) {
  464. best_div1 = div1;
  465. best_div2 = div2;
  466. goto done;
  467. } else if (rate_diff < best_rate_diff) {
  468. best_div1 = div1;
  469. best_div2 = div2;
  470. best_rate_diff = rate_diff;
  471. }
  472. }
  473. }
  474. done:
  475. *divider1 = best_div1;
  476. *divider2 = best_div2;
  477. }
  478. static int rp1_pll_set_rate(struct clk_hw *hw,
  479. unsigned long rate, unsigned long parent_rate)
  480. {
  481. struct rp1_clk_desc *pll = container_of(hw, struct rp1_clk_desc, hw);
  482. struct rp1_clockman *clockman = pll->clockman;
  483. const struct rp1_pll_data *data = pll->data;
  484. u32 prim, prim_div1, prim_div2;
  485. get_pll_prim_dividers(rate, parent_rate, &prim_div1, &prim_div2);
  486. spin_lock(&clockman->regs_lock);
  487. prim = clockman_read(clockman, data->ctrl_reg);
  488. prim &= ~PLL_PRIM_DIV1_MASK;
  489. prim |= FIELD_PREP(PLL_PRIM_DIV1_MASK, prim_div1);
  490. prim &= ~PLL_PRIM_DIV2_MASK;
  491. prim |= FIELD_PREP(PLL_PRIM_DIV2_MASK, prim_div2);
  492. clockman_write(clockman, data->ctrl_reg, prim);
  493. spin_unlock(&clockman->regs_lock);
  494. return 0;
  495. }
  496. static unsigned long rp1_pll_recalc_rate(struct clk_hw *hw,
  497. unsigned long parent_rate)
  498. {
  499. struct rp1_clk_desc *pll = container_of(hw, struct rp1_clk_desc, hw);
  500. struct rp1_clockman *clockman = pll->clockman;
  501. const struct rp1_pll_data *data = pll->data;
  502. u32 prim, prim_div1, prim_div2;
  503. prim = clockman_read(clockman, data->ctrl_reg);
  504. prim_div1 = FIELD_GET(PLL_PRIM_DIV1_MASK, prim);
  505. prim_div2 = FIELD_GET(PLL_PRIM_DIV2_MASK, prim);
  506. if (!prim_div1 || !prim_div2) {
  507. dev_err(clockman->dev, "%s: (%s) zero divider value\n",
  508. __func__, clk_hw_get_name(hw));
  509. return 0;
  510. }
  511. return DIV_ROUND_CLOSEST(parent_rate, prim_div1 * prim_div2);
  512. }
  513. static int rp1_pll_determine_rate(struct clk_hw *hw,
  514. struct clk_rate_request *req)
  515. {
  516. struct clk_hw *clk_audio_hw = &clk_audio->hw;
  517. u32 div1, div2;
  518. if (hw == clk_audio_hw && clk_audio->cached_rate == req->rate)
  519. req->best_parent_rate = clk_audio_core->cached_rate;
  520. get_pll_prim_dividers(req->rate, req->best_parent_rate, &div1, &div2);
  521. req->rate = DIV_ROUND_CLOSEST(req->best_parent_rate, div1 * div2);
  522. return 0;
  523. }
  524. static int rp1_pll_ph_is_on(struct clk_hw *hw)
  525. {
  526. struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw);
  527. struct rp1_clockman *clockman = pll_ph->clockman;
  528. const struct rp1_pll_ph_data *data = pll_ph->data;
  529. return !!(clockman_read(clockman, data->ph_reg) & PLL_PH_EN);
  530. }
  531. static int rp1_pll_ph_on(struct clk_hw *hw)
  532. {
  533. struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw);
  534. struct rp1_clockman *clockman = pll_ph->clockman;
  535. const struct rp1_pll_ph_data *data = pll_ph->data;
  536. u32 ph_reg;
  537. spin_lock(&clockman->regs_lock);
  538. ph_reg = clockman_read(clockman, data->ph_reg);
  539. ph_reg |= data->phase << PLL_PH_PHASE_SHIFT;
  540. ph_reg |= PLL_PH_EN;
  541. clockman_write(clockman, data->ph_reg, ph_reg);
  542. spin_unlock(&clockman->regs_lock);
  543. return 0;
  544. }
  545. static void rp1_pll_ph_off(struct clk_hw *hw)
  546. {
  547. struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw);
  548. struct rp1_clockman *clockman = pll_ph->clockman;
  549. const struct rp1_pll_ph_data *data = pll_ph->data;
  550. spin_lock(&clockman->regs_lock);
  551. clockman_write(clockman, data->ph_reg,
  552. clockman_read(clockman, data->ph_reg) & ~PLL_PH_EN);
  553. spin_unlock(&clockman->regs_lock);
  554. }
  555. static unsigned long rp1_pll_ph_recalc_rate(struct clk_hw *hw,
  556. unsigned long parent_rate)
  557. {
  558. struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw);
  559. const struct rp1_pll_ph_data *data = pll_ph->data;
  560. return parent_rate / data->fixed_divider;
  561. }
  562. static int rp1_pll_ph_determine_rate(struct clk_hw *hw,
  563. struct clk_rate_request *req)
  564. {
  565. struct rp1_clk_desc *pll_ph = container_of(hw, struct rp1_clk_desc, hw);
  566. const struct rp1_pll_ph_data *data = pll_ph->data;
  567. req->rate = req->best_parent_rate / data->fixed_divider;
  568. return 0;
  569. }
  570. static int rp1_pll_divider_is_on(struct clk_hw *hw)
  571. {
  572. struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
  573. struct rp1_clockman *clockman = divider->clockman;
  574. const struct rp1_pll_data *data = divider->data;
  575. return !(clockman_read(clockman, data->ctrl_reg) & PLL_SEC_RST);
  576. }
  577. static int rp1_pll_divider_on(struct clk_hw *hw)
  578. {
  579. struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
  580. struct rp1_clockman *clockman = divider->clockman;
  581. const struct rp1_pll_data *data = divider->data;
  582. spin_lock(&clockman->regs_lock);
  583. /* Check the implementation bit is set! */
  584. WARN_ON(!(clockman_read(clockman, data->ctrl_reg) & PLL_SEC_IMPL));
  585. clockman_write(clockman, data->ctrl_reg,
  586. clockman_read(clockman, data->ctrl_reg) & ~PLL_SEC_RST);
  587. spin_unlock(&clockman->regs_lock);
  588. return 0;
  589. }
  590. static void rp1_pll_divider_off(struct clk_hw *hw)
  591. {
  592. struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
  593. struct rp1_clockman *clockman = divider->clockman;
  594. const struct rp1_pll_data *data = divider->data;
  595. spin_lock(&clockman->regs_lock);
  596. clockman_write(clockman, data->ctrl_reg,
  597. clockman_read(clockman, data->ctrl_reg) | PLL_SEC_RST);
  598. spin_unlock(&clockman->regs_lock);
  599. }
  600. static int rp1_pll_divider_set_rate(struct clk_hw *hw,
  601. unsigned long rate,
  602. unsigned long parent_rate)
  603. {
  604. struct rp1_clk_desc *divider = container_of(hw, struct rp1_clk_desc, div.hw);
  605. struct rp1_clockman *clockman = divider->clockman;
  606. const struct rp1_pll_data *data = divider->data;
  607. u32 div, sec;
  608. div = DIV_ROUND_UP_ULL(parent_rate, rate);
  609. div = clamp(div, 8u, 19u);
  610. spin_lock(&clockman->regs_lock);
  611. sec = clockman_read(clockman, data->ctrl_reg);
  612. sec &= ~PLL_SEC_DIV_MASK;
  613. sec |= FIELD_PREP(PLL_SEC_DIV_MASK, div);
  614. /* Must keep the divider in reset to change the value. */
  615. sec |= PLL_SEC_RST;
  616. clockman_write(clockman, data->ctrl_reg, sec);
  617. /* must sleep 10 pll vco cycles */
  618. ndelay(div64_ul(10ULL * div * NSEC_PER_SEC, parent_rate));
  619. sec &= ~PLL_SEC_RST;
  620. clockman_write(clockman, data->ctrl_reg, sec);
  621. spin_unlock(&clockman->regs_lock);
  622. return 0;
  623. }
  624. static unsigned long rp1_pll_divider_recalc_rate(struct clk_hw *hw,
  625. unsigned long parent_rate)
  626. {
  627. return clk_divider_ops.recalc_rate(hw, parent_rate);
  628. }
  629. static int rp1_pll_divider_determine_rate(struct clk_hw *hw,
  630. struct clk_rate_request *req)
  631. {
  632. req->rate = clk_divider_ops.determine_rate(hw, req);
  633. return 0;
  634. }
  635. static int rp1_clock_is_on(struct clk_hw *hw)
  636. {
  637. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  638. struct rp1_clockman *clockman = clock->clockman;
  639. const struct rp1_clock_data *data = clock->data;
  640. return !!(clockman_read(clockman, data->ctrl_reg) & CLK_CTRL_ENABLE);
  641. }
  642. static unsigned long rp1_clock_recalc_rate(struct clk_hw *hw,
  643. unsigned long parent_rate)
  644. {
  645. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  646. struct rp1_clockman *clockman = clock->clockman;
  647. const struct rp1_clock_data *data = clock->data;
  648. u64 calc_rate;
  649. u64 div;
  650. u32 frac;
  651. div = clockman_read(clockman, data->div_int_reg);
  652. frac = (data->div_frac_reg != 0) ?
  653. clockman_read(clockman, data->div_frac_reg) : 0;
  654. /* If the integer portion of the divider is 0, treat it as 2^16 */
  655. if (!div)
  656. div = 1 << 16;
  657. div = (div << CLK_DIV_FRAC_BITS) | (frac >> (32 - CLK_DIV_FRAC_BITS));
  658. calc_rate = (u64)parent_rate << CLK_DIV_FRAC_BITS;
  659. calc_rate = div64_u64(calc_rate, div);
  660. return calc_rate;
  661. }
  662. static int rp1_clock_on(struct clk_hw *hw)
  663. {
  664. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  665. struct rp1_clockman *clockman = clock->clockman;
  666. const struct rp1_clock_data *data = clock->data;
  667. spin_lock(&clockman->regs_lock);
  668. clockman_write(clockman, data->ctrl_reg,
  669. clockman_read(clockman, data->ctrl_reg) | CLK_CTRL_ENABLE);
  670. /* If this is a GPCLK, turn on the output-enable */
  671. if (data->oe_mask)
  672. clockman_write(clockman, GPCLK_OE_CTRL,
  673. clockman_read(clockman, GPCLK_OE_CTRL) | data->oe_mask);
  674. spin_unlock(&clockman->regs_lock);
  675. return 0;
  676. }
  677. static void rp1_clock_off(struct clk_hw *hw)
  678. {
  679. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  680. struct rp1_clockman *clockman = clock->clockman;
  681. const struct rp1_clock_data *data = clock->data;
  682. spin_lock(&clockman->regs_lock);
  683. clockman_write(clockman, data->ctrl_reg,
  684. clockman_read(clockman, data->ctrl_reg) & ~CLK_CTRL_ENABLE);
  685. /* If this is a GPCLK, turn off the output-enable */
  686. if (data->oe_mask)
  687. clockman_write(clockman, GPCLK_OE_CTRL,
  688. clockman_read(clockman, GPCLK_OE_CTRL) & ~data->oe_mask);
  689. spin_unlock(&clockman->regs_lock);
  690. }
  691. static u32 rp1_clock_choose_div(unsigned long rate, unsigned long parent_rate,
  692. const struct rp1_clock_data *data)
  693. {
  694. u64 div;
  695. /*
  696. * Due to earlier rounding, calculated parent_rate may differ from
  697. * expected value. Don't fail on a small discrepancy near unity divide.
  698. */
  699. if (!rate || rate > parent_rate + (parent_rate >> CLK_DIV_FRAC_BITS))
  700. return 0;
  701. /*
  702. * Always express div in fixed-point format for fractional division;
  703. * If no fractional divider is present, the fraction part will be zero.
  704. */
  705. if (data->div_frac_reg) {
  706. div = (u64)parent_rate << CLK_DIV_FRAC_BITS;
  707. div = DIV_ROUND_CLOSEST_ULL(div, rate);
  708. } else {
  709. div = DIV_ROUND_CLOSEST_ULL(parent_rate, rate);
  710. div <<= CLK_DIV_FRAC_BITS;
  711. }
  712. div = clamp(div,
  713. 1ull << CLK_DIV_FRAC_BITS,
  714. (u64)data->div_int_max << CLK_DIV_FRAC_BITS);
  715. return div;
  716. }
  717. static u8 rp1_clock_get_parent(struct clk_hw *hw)
  718. {
  719. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  720. struct rp1_clockman *clockman = clock->clockman;
  721. const struct rp1_clock_data *data = clock->data;
  722. u32 sel, ctrl;
  723. u8 parent;
  724. /* Sel is one-hot, so find the first bit set */
  725. sel = clockman_read(clockman, data->sel_reg);
  726. parent = ffs(sel) - 1;
  727. /* sel == 0 implies the parent clock is not enabled yet. */
  728. if (!sel) {
  729. /* Read the clock src from the CTRL register instead */
  730. ctrl = clockman_read(clockman, data->ctrl_reg);
  731. parent = (ctrl & data->clk_src_mask) >> CLK_CTRL_SRC_SHIFT;
  732. }
  733. if (parent >= data->num_std_parents)
  734. parent = AUX_SEL;
  735. if (parent == AUX_SEL) {
  736. /*
  737. * Clock parent is an auxiliary source, so get the parent from
  738. * the AUXSRC register field.
  739. */
  740. ctrl = clockman_read(clockman, data->ctrl_reg);
  741. parent = FIELD_GET(CLK_CTRL_AUXSRC_MASK, ctrl);
  742. parent += data->num_std_parents;
  743. }
  744. return parent;
  745. }
  746. static int rp1_clock_set_parent(struct clk_hw *hw, u8 index)
  747. {
  748. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  749. struct rp1_clockman *clockman = clock->clockman;
  750. const struct rp1_clock_data *data = clock->data;
  751. u32 ctrl, sel;
  752. spin_lock(&clockman->regs_lock);
  753. ctrl = clockman_read(clockman, data->ctrl_reg);
  754. if (index >= data->num_std_parents) {
  755. /* This is an aux source request */
  756. if (index >= data->num_std_parents + data->num_aux_parents) {
  757. spin_unlock(&clockman->regs_lock);
  758. return -EINVAL;
  759. }
  760. /* Select parent from aux list */
  761. ctrl &= ~CLK_CTRL_AUXSRC_MASK;
  762. ctrl |= FIELD_PREP(CLK_CTRL_AUXSRC_MASK, index - data->num_std_parents);
  763. /* Set src to aux list */
  764. ctrl &= ~data->clk_src_mask;
  765. ctrl |= (AUX_SEL << CLK_CTRL_SRC_SHIFT) & data->clk_src_mask;
  766. } else {
  767. ctrl &= ~data->clk_src_mask;
  768. ctrl |= (index << CLK_CTRL_SRC_SHIFT) & data->clk_src_mask;
  769. }
  770. clockman_write(clockman, data->ctrl_reg, ctrl);
  771. spin_unlock(&clockman->regs_lock);
  772. sel = rp1_clock_get_parent(hw);
  773. if (sel != index)
  774. return -EINVAL;
  775. return 0;
  776. }
  777. static int rp1_clock_set_rate_and_parent(struct clk_hw *hw,
  778. unsigned long rate,
  779. unsigned long parent_rate,
  780. u8 parent)
  781. {
  782. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  783. struct rp1_clockman *clockman = clock->clockman;
  784. const struct rp1_clock_data *data = clock->data;
  785. u32 div = rp1_clock_choose_div(rate, parent_rate, data);
  786. spin_lock(&clockman->regs_lock);
  787. clockman_write(clockman, data->div_int_reg, div >> CLK_DIV_FRAC_BITS);
  788. if (data->div_frac_reg)
  789. clockman_write(clockman, data->div_frac_reg, div << (32 - CLK_DIV_FRAC_BITS));
  790. spin_unlock(&clockman->regs_lock);
  791. if (parent != 0xff)
  792. return rp1_clock_set_parent(hw, parent);
  793. return 0;
  794. }
  795. static int rp1_clock_set_rate(struct clk_hw *hw, unsigned long rate,
  796. unsigned long parent_rate)
  797. {
  798. return rp1_clock_set_rate_and_parent(hw, rate, parent_rate, 0xff);
  799. }
  800. static unsigned long calc_core_pll_rate(struct clk_hw *pll_hw,
  801. unsigned long target_rate,
  802. int *pdiv_prim, int *pdiv_clk)
  803. {
  804. static const int prim_divs[] = {
  805. 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16,
  806. 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49,
  807. };
  808. const unsigned long xosc_rate = clk_hw_get_rate(clk_xosc);
  809. const unsigned long core_min = xosc_rate * 16;
  810. const unsigned long core_max = 2400000000;
  811. int best_div_prim = 1, best_div_clk = 1;
  812. unsigned long best_rate = core_max + 1;
  813. unsigned long core_rate = 0;
  814. int div_int, div_frac;
  815. u64 div;
  816. int i;
  817. /* Given the target rate, choose a set of divisors/multipliers */
  818. for (i = 0; i < ARRAY_SIZE(prim_divs); i++) {
  819. int div_prim = prim_divs[i];
  820. int div_clk;
  821. for (div_clk = 1; div_clk <= 256; div_clk++) {
  822. core_rate = target_rate * div_clk * div_prim;
  823. if (core_rate >= core_min) {
  824. if (core_rate < best_rate) {
  825. best_rate = core_rate;
  826. best_div_prim = div_prim;
  827. best_div_clk = div_clk;
  828. }
  829. break;
  830. }
  831. }
  832. }
  833. if (best_rate < core_max) {
  834. div = ((best_rate << 24) + xosc_rate / 2) / xosc_rate;
  835. div_int = div >> 24;
  836. div_frac = div % (1 << 24);
  837. core_rate = (xosc_rate * ((div_int << 24) + div_frac) + (1 << 23)) >> 24;
  838. } else {
  839. core_rate = 0;
  840. }
  841. if (pdiv_prim)
  842. *pdiv_prim = best_div_prim;
  843. if (pdiv_clk)
  844. *pdiv_clk = best_div_clk;
  845. return core_rate;
  846. }
  847. static void rp1_clock_choose_div_and_prate(struct clk_hw *hw,
  848. int parent_idx,
  849. unsigned long rate,
  850. unsigned long *prate,
  851. unsigned long *calc_rate)
  852. {
  853. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  854. const struct rp1_clock_data *data = clock->data;
  855. struct clk_hw *clk_audio_hw = &clk_audio->hw;
  856. struct clk_hw *clk_i2s_hw = &clk_i2s->hw;
  857. struct clk_hw *parent;
  858. u32 div;
  859. u64 tmp;
  860. parent = clk_hw_get_parent_by_index(hw, parent_idx);
  861. if (hw == clk_i2s_hw && clk_i2s->cached_rate == rate && parent == clk_audio_hw) {
  862. *prate = clk_audio->cached_rate;
  863. *calc_rate = rate;
  864. return;
  865. }
  866. if (hw == clk_i2s_hw && parent == clk_audio_hw) {
  867. unsigned long core_rate, audio_rate, i2s_rate;
  868. int div_prim, div_clk;
  869. core_rate = calc_core_pll_rate(parent, rate, &div_prim, &div_clk);
  870. audio_rate = DIV_ROUND_CLOSEST(core_rate, div_prim);
  871. i2s_rate = DIV_ROUND_CLOSEST(audio_rate, div_clk);
  872. clk_audio_core->cached_rate = core_rate;
  873. clk_audio->cached_rate = audio_rate;
  874. clk_i2s->cached_rate = i2s_rate;
  875. *prate = audio_rate;
  876. *calc_rate = i2s_rate;
  877. return;
  878. }
  879. *prate = clk_hw_get_rate(parent);
  880. div = rp1_clock_choose_div(rate, *prate, data);
  881. if (!div) {
  882. *calc_rate = 0;
  883. return;
  884. }
  885. /* Recalculate to account for rounding errors */
  886. tmp = (u64)*prate << CLK_DIV_FRAC_BITS;
  887. tmp = div_u64(tmp, div);
  888. /*
  889. * Prevent overclocks - if all parent choices result in
  890. * a downstream clock in excess of the maximum, then the
  891. * call to set the clock will fail.
  892. */
  893. if (tmp > data->max_freq)
  894. *calc_rate = 0;
  895. else
  896. *calc_rate = tmp;
  897. }
  898. static int rp1_clock_determine_rate(struct clk_hw *hw,
  899. struct clk_rate_request *req)
  900. {
  901. struct clk_hw *parent, *best_parent = NULL;
  902. unsigned long best_rate = 0;
  903. unsigned long best_prate = 0;
  904. unsigned long best_rate_diff = ULONG_MAX;
  905. unsigned long prate, calc_rate;
  906. size_t i;
  907. /*
  908. * If the NO_REPARENT flag is set, try to use existing parent.
  909. */
  910. if ((clk_hw_get_flags(hw) & CLK_SET_RATE_NO_REPARENT)) {
  911. i = rp1_clock_get_parent(hw);
  912. parent = clk_hw_get_parent_by_index(hw, i);
  913. if (parent) {
  914. rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate,
  915. &calc_rate);
  916. if (calc_rate > 0) {
  917. req->best_parent_hw = parent;
  918. req->best_parent_rate = prate;
  919. req->rate = calc_rate;
  920. return 0;
  921. }
  922. }
  923. }
  924. /*
  925. * Select parent clock that results in the closest rate (lower or
  926. * higher)
  927. */
  928. for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
  929. parent = clk_hw_get_parent_by_index(hw, i);
  930. if (!parent)
  931. continue;
  932. rp1_clock_choose_div_and_prate(hw, i, req->rate, &prate,
  933. &calc_rate);
  934. if (abs_diff(calc_rate, req->rate) < best_rate_diff) {
  935. best_parent = parent;
  936. best_prate = prate;
  937. best_rate = calc_rate;
  938. best_rate_diff = abs_diff(calc_rate, req->rate);
  939. if (best_rate_diff == 0)
  940. break;
  941. }
  942. }
  943. if (best_rate == 0)
  944. return -EINVAL;
  945. req->best_parent_hw = best_parent;
  946. req->best_parent_rate = best_prate;
  947. req->rate = best_rate;
  948. return 0;
  949. }
  950. static int rp1_varsrc_set_rate(struct clk_hw *hw,
  951. unsigned long rate, unsigned long parent_rate)
  952. {
  953. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  954. /*
  955. * "varsrc" exists purely to let clock dividers know the frequency
  956. * of an externally-managed clock source (such as MIPI DSI byte-clock)
  957. * which may change at run-time as a side-effect of some other driver.
  958. */
  959. clock->cached_rate = rate;
  960. return 0;
  961. }
  962. static unsigned long rp1_varsrc_recalc_rate(struct clk_hw *hw,
  963. unsigned long parent_rate)
  964. {
  965. struct rp1_clk_desc *clock = container_of(hw, struct rp1_clk_desc, hw);
  966. return clock->cached_rate;
  967. }
  968. static int rp1_varsrc_determine_rate(struct clk_hw *hw,
  969. struct clk_rate_request *req)
  970. {
  971. return 0;
  972. }
  973. static const struct clk_ops rp1_pll_core_ops = {
  974. .is_prepared = rp1_pll_core_is_on,
  975. .prepare = rp1_pll_core_on,
  976. .unprepare = rp1_pll_core_off,
  977. .set_rate = rp1_pll_core_set_rate,
  978. .recalc_rate = rp1_pll_core_recalc_rate,
  979. .determine_rate = rp1_pll_core_determine_rate,
  980. };
  981. static const struct clk_ops rp1_pll_ops = {
  982. .set_rate = rp1_pll_set_rate,
  983. .recalc_rate = rp1_pll_recalc_rate,
  984. .determine_rate = rp1_pll_determine_rate,
  985. };
  986. static const struct clk_ops rp1_pll_ph_ops = {
  987. .is_prepared = rp1_pll_ph_is_on,
  988. .prepare = rp1_pll_ph_on,
  989. .unprepare = rp1_pll_ph_off,
  990. .recalc_rate = rp1_pll_ph_recalc_rate,
  991. .determine_rate = rp1_pll_ph_determine_rate,
  992. };
  993. static const struct clk_ops rp1_pll_divider_ops = {
  994. .is_prepared = rp1_pll_divider_is_on,
  995. .prepare = rp1_pll_divider_on,
  996. .unprepare = rp1_pll_divider_off,
  997. .set_rate = rp1_pll_divider_set_rate,
  998. .recalc_rate = rp1_pll_divider_recalc_rate,
  999. .determine_rate = rp1_pll_divider_determine_rate,
  1000. };
  1001. static const struct clk_ops rp1_clk_ops = {
  1002. .is_prepared = rp1_clock_is_on,
  1003. .prepare = rp1_clock_on,
  1004. .unprepare = rp1_clock_off,
  1005. .recalc_rate = rp1_clock_recalc_rate,
  1006. .get_parent = rp1_clock_get_parent,
  1007. .set_parent = rp1_clock_set_parent,
  1008. .set_rate_and_parent = rp1_clock_set_rate_and_parent,
  1009. .set_rate = rp1_clock_set_rate,
  1010. .determine_rate = rp1_clock_determine_rate,
  1011. };
  1012. static const struct clk_ops rp1_varsrc_ops = {
  1013. .set_rate = rp1_varsrc_set_rate,
  1014. .recalc_rate = rp1_varsrc_recalc_rate,
  1015. .determine_rate = rp1_varsrc_determine_rate,
  1016. };
  1017. static struct clk_hw *rp1_register_pll(struct rp1_clockman *clockman,
  1018. struct rp1_clk_desc *desc)
  1019. {
  1020. int ret;
  1021. desc->clockman = clockman;
  1022. ret = devm_clk_hw_register(clockman->dev, &desc->hw);
  1023. if (ret)
  1024. return ERR_PTR(ret);
  1025. return &desc->hw;
  1026. }
  1027. static struct clk_hw *rp1_register_pll_divider(struct rp1_clockman *clockman,
  1028. struct rp1_clk_desc *desc)
  1029. {
  1030. const struct rp1_pll_data *divider_data = desc->data;
  1031. int ret;
  1032. desc->div.reg = clockman->regs + divider_data->ctrl_reg;
  1033. desc->div.shift = __ffs(PLL_SEC_DIV_MASK);
  1034. desc->div.width = __ffs(~(PLL_SEC_DIV_MASK >> desc->div.shift));
  1035. desc->div.flags = CLK_DIVIDER_ROUND_CLOSEST;
  1036. desc->div.lock = &clockman->regs_lock;
  1037. desc->div.hw.init = desc->hw.init;
  1038. desc->div.table = pll_sec_div_table;
  1039. desc->clockman = clockman;
  1040. ret = devm_clk_hw_register(clockman->dev, &desc->div.hw);
  1041. if (ret)
  1042. return ERR_PTR(ret);
  1043. return &desc->div.hw;
  1044. }
  1045. static struct clk_hw *rp1_register_clock(struct rp1_clockman *clockman,
  1046. struct rp1_clk_desc *desc)
  1047. {
  1048. const struct rp1_clock_data *clock_data = desc->data;
  1049. int ret;
  1050. if (WARN_ON_ONCE(MAX_CLK_PARENTS <
  1051. clock_data->num_std_parents + clock_data->num_aux_parents))
  1052. return ERR_PTR(-EINVAL);
  1053. /* There must be a gap for the AUX selector */
  1054. if (WARN_ON_ONCE(clock_data->num_std_parents > AUX_SEL &&
  1055. desc->hw.init->parent_data[AUX_SEL].index != -1))
  1056. return ERR_PTR(-EINVAL);
  1057. desc->clockman = clockman;
  1058. ret = devm_clk_hw_register(clockman->dev, &desc->hw);
  1059. if (ret)
  1060. return ERR_PTR(ret);
  1061. return &desc->hw;
  1062. }
  1063. /* Assignment helper macros for different clock types. */
  1064. #define _REGISTER(f, ...) { .clk_register = f, __VA_ARGS__ }
  1065. #define CLK_DATA(type, ...) .data = &(struct type) { __VA_ARGS__ }
  1066. #define REGISTER_PLL(...) _REGISTER(&rp1_register_pll, \
  1067. __VA_ARGS__)
  1068. #define REGISTER_PLL_DIV(...) _REGISTER(&rp1_register_pll_divider, \
  1069. __VA_ARGS__)
  1070. #define REGISTER_CLK(...) _REGISTER(&rp1_register_clock, \
  1071. __VA_ARGS__)
  1072. static struct rp1_clk_desc pll_sys_core_desc = REGISTER_PLL(
  1073. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1074. "pll_sys_core",
  1075. (const struct clk_parent_data[]) { { .index = 0 } },
  1076. &rp1_pll_core_ops,
  1077. CLK_IS_CRITICAL
  1078. ),
  1079. CLK_DATA(rp1_pll_core_data,
  1080. .cs_reg = PLL_SYS_CS,
  1081. .pwr_reg = PLL_SYS_PWR,
  1082. .fbdiv_int_reg = PLL_SYS_FBDIV_INT,
  1083. .fbdiv_frac_reg = PLL_SYS_FBDIV_FRAC,
  1084. )
  1085. );
  1086. static struct rp1_clk_desc pll_audio_core_desc = REGISTER_PLL(
  1087. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1088. "pll_audio_core",
  1089. (const struct clk_parent_data[]) { { .index = 0 } },
  1090. &rp1_pll_core_ops,
  1091. CLK_IS_CRITICAL
  1092. ),
  1093. CLK_DATA(rp1_pll_core_data,
  1094. .cs_reg = PLL_AUDIO_CS,
  1095. .pwr_reg = PLL_AUDIO_PWR,
  1096. .fbdiv_int_reg = PLL_AUDIO_FBDIV_INT,
  1097. .fbdiv_frac_reg = PLL_AUDIO_FBDIV_FRAC,
  1098. )
  1099. );
  1100. static struct rp1_clk_desc pll_video_core_desc = REGISTER_PLL(
  1101. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1102. "pll_video_core",
  1103. (const struct clk_parent_data[]) { { .index = 0 } },
  1104. &rp1_pll_core_ops,
  1105. CLK_IS_CRITICAL
  1106. ),
  1107. CLK_DATA(rp1_pll_core_data,
  1108. .cs_reg = PLL_VIDEO_CS,
  1109. .pwr_reg = PLL_VIDEO_PWR,
  1110. .fbdiv_int_reg = PLL_VIDEO_FBDIV_INT,
  1111. .fbdiv_frac_reg = PLL_VIDEO_FBDIV_FRAC,
  1112. )
  1113. );
  1114. static struct rp1_clk_desc pll_sys_desc = REGISTER_PLL(
  1115. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1116. "pll_sys",
  1117. (const struct clk_parent_data[]) {
  1118. { .hw = &pll_sys_core_desc.hw }
  1119. },
  1120. &rp1_pll_ops,
  1121. 0
  1122. ),
  1123. CLK_DATA(rp1_pll_data,
  1124. .ctrl_reg = PLL_SYS_PRIM,
  1125. .fc0_src = FC_NUM(0, 2),
  1126. )
  1127. );
  1128. static struct rp1_clk_desc pll_audio_desc = REGISTER_PLL(
  1129. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1130. "pll_audio",
  1131. (const struct clk_parent_data[]) {
  1132. { .hw = &pll_audio_core_desc.hw }
  1133. },
  1134. &rp1_pll_ops,
  1135. CLK_SET_RATE_PARENT
  1136. ),
  1137. CLK_DATA(rp1_pll_data,
  1138. .ctrl_reg = PLL_AUDIO_PRIM,
  1139. .fc0_src = FC_NUM(4, 2),
  1140. )
  1141. );
  1142. static struct rp1_clk_desc pll_video_desc = REGISTER_PLL(
  1143. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1144. "pll_video",
  1145. (const struct clk_parent_data[]) {
  1146. { .hw = &pll_video_core_desc.hw }
  1147. },
  1148. &rp1_pll_ops,
  1149. 0
  1150. ),
  1151. CLK_DATA(rp1_pll_data,
  1152. .ctrl_reg = PLL_VIDEO_PRIM,
  1153. .fc0_src = FC_NUM(3, 2),
  1154. )
  1155. );
  1156. static struct rp1_clk_desc pll_sys_sec_desc = REGISTER_PLL_DIV(
  1157. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1158. "pll_sys_sec",
  1159. (const struct clk_parent_data[]) {
  1160. { .hw = &pll_sys_core_desc.hw }
  1161. },
  1162. &rp1_pll_divider_ops,
  1163. 0
  1164. ),
  1165. CLK_DATA(rp1_pll_data,
  1166. .ctrl_reg = PLL_SYS_SEC,
  1167. .fc0_src = FC_NUM(2, 2),
  1168. )
  1169. );
  1170. static struct rp1_clk_desc pll_video_sec_desc = REGISTER_PLL_DIV(
  1171. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1172. "pll_video_sec",
  1173. (const struct clk_parent_data[]) {
  1174. { .hw = &pll_video_core_desc.hw }
  1175. },
  1176. &rp1_pll_divider_ops,
  1177. 0
  1178. ),
  1179. CLK_DATA(rp1_pll_data,
  1180. .ctrl_reg = PLL_VIDEO_SEC,
  1181. .fc0_src = FC_NUM(5, 3),
  1182. )
  1183. );
  1184. static const struct clk_parent_data clk_eth_tsu_parents[] = {
  1185. { .index = 0 },
  1186. { .hw = &pll_video_sec_desc.hw },
  1187. { .index = -1 },
  1188. { .index = -1 },
  1189. { .index = -1 },
  1190. { .index = -1 },
  1191. { .index = -1 },
  1192. { .index = -1 },
  1193. };
  1194. static struct rp1_clk_desc clk_eth_tsu_desc = REGISTER_CLK(
  1195. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1196. "clk_eth_tsu",
  1197. clk_eth_tsu_parents,
  1198. &rp1_clk_ops,
  1199. 0
  1200. ),
  1201. CLK_DATA(rp1_clock_data,
  1202. .num_std_parents = 0,
  1203. .num_aux_parents = 8,
  1204. .ctrl_reg = CLK_ETH_TSU_CTRL,
  1205. .div_int_reg = CLK_ETH_TSU_DIV_INT,
  1206. .sel_reg = CLK_ETH_TSU_SEL,
  1207. .div_int_max = DIV_INT_8BIT_MAX,
  1208. .max_freq = 50 * HZ_PER_MHZ,
  1209. .fc0_src = FC_NUM(5, 7),
  1210. )
  1211. );
  1212. static const struct clk_parent_data clk_eth_parents[] = {
  1213. { .hw = &pll_sys_sec_desc.div.hw },
  1214. { .hw = &pll_sys_desc.hw },
  1215. { .hw = &pll_video_sec_desc.hw },
  1216. };
  1217. static struct rp1_clk_desc clk_eth_desc = REGISTER_CLK(
  1218. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1219. "clk_eth",
  1220. clk_eth_parents,
  1221. &rp1_clk_ops,
  1222. 0
  1223. ),
  1224. CLK_DATA(rp1_clock_data,
  1225. .num_std_parents = 0,
  1226. .num_aux_parents = 3,
  1227. .ctrl_reg = CLK_ETH_CTRL,
  1228. .div_int_reg = CLK_ETH_DIV_INT,
  1229. .sel_reg = CLK_ETH_SEL,
  1230. .div_int_max = DIV_INT_8BIT_MAX,
  1231. .max_freq = 125 * HZ_PER_MHZ,
  1232. .fc0_src = FC_NUM(4, 6),
  1233. )
  1234. );
  1235. static const struct clk_parent_data clk_sys_parents[] = {
  1236. { .index = 0 },
  1237. { .index = -1 },
  1238. { .hw = &pll_sys_desc.hw },
  1239. };
  1240. static struct rp1_clk_desc clk_sys_desc = REGISTER_CLK(
  1241. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1242. "clk_sys",
  1243. clk_sys_parents,
  1244. &rp1_clk_ops,
  1245. CLK_IS_CRITICAL
  1246. ),
  1247. CLK_DATA(rp1_clock_data,
  1248. .num_std_parents = 3,
  1249. .num_aux_parents = 0,
  1250. .ctrl_reg = CLK_SYS_CTRL,
  1251. .div_int_reg = CLK_SYS_DIV_INT,
  1252. .sel_reg = CLK_SYS_SEL,
  1253. .div_int_max = DIV_INT_24BIT_MAX,
  1254. .max_freq = 200 * HZ_PER_MHZ,
  1255. .fc0_src = FC_NUM(0, 4),
  1256. .clk_src_mask = 0x3,
  1257. )
  1258. );
  1259. static struct rp1_clk_desc pll_sys_pri_ph_desc = REGISTER_PLL(
  1260. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1261. "pll_sys_pri_ph",
  1262. (const struct clk_parent_data[]) {
  1263. { .hw = &pll_sys_desc.hw }
  1264. },
  1265. &rp1_pll_ph_ops,
  1266. 0
  1267. ),
  1268. CLK_DATA(rp1_pll_ph_data,
  1269. .ph_reg = PLL_SYS_PRIM,
  1270. .fixed_divider = 2,
  1271. .phase = RP1_PLL_PHASE_0,
  1272. .fc0_src = FC_NUM(1, 2),
  1273. )
  1274. );
  1275. static struct rp1_clk_desc pll_audio_pri_ph_desc = REGISTER_PLL(
  1276. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1277. "pll_audio_pri_ph",
  1278. (const struct clk_parent_data[]) {
  1279. { .hw = &pll_audio_desc.hw }
  1280. },
  1281. &rp1_pll_ph_ops,
  1282. 0
  1283. ),
  1284. CLK_DATA(rp1_pll_ph_data,
  1285. .ph_reg = PLL_AUDIO_PRIM,
  1286. .fixed_divider = 2,
  1287. .phase = RP1_PLL_PHASE_0,
  1288. .fc0_src = FC_NUM(5, 1),
  1289. )
  1290. );
  1291. static struct rp1_clk_desc pll_video_pri_ph_desc = REGISTER_PLL(
  1292. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1293. "pll_video_pri_ph",
  1294. (const struct clk_parent_data[]) {
  1295. { .hw = &pll_video_desc.hw }
  1296. },
  1297. &rp1_pll_ph_ops,
  1298. 0
  1299. ),
  1300. CLK_DATA(rp1_pll_ph_data,
  1301. .ph_reg = PLL_VIDEO_PRIM,
  1302. .fixed_divider = 2,
  1303. .phase = RP1_PLL_PHASE_0,
  1304. .fc0_src = FC_NUM(4, 3),
  1305. )
  1306. );
  1307. static struct rp1_clk_desc pll_audio_sec_desc = REGISTER_PLL_DIV(
  1308. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1309. "pll_audio_sec",
  1310. (const struct clk_parent_data[]) {
  1311. { .hw = &pll_audio_core_desc.hw }
  1312. },
  1313. &rp1_pll_divider_ops,
  1314. 0
  1315. ),
  1316. CLK_DATA(rp1_pll_data,
  1317. .ctrl_reg = PLL_AUDIO_SEC,
  1318. .fc0_src = FC_NUM(6, 2),
  1319. )
  1320. );
  1321. static struct rp1_clk_desc pll_audio_tern_desc = REGISTER_PLL_DIV(
  1322. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1323. "pll_audio_tern",
  1324. (const struct clk_parent_data[]) {
  1325. { .hw = &pll_audio_core_desc.hw }
  1326. },
  1327. &rp1_pll_divider_ops,
  1328. 0
  1329. ),
  1330. CLK_DATA(rp1_pll_data,
  1331. .ctrl_reg = PLL_AUDIO_TERN,
  1332. .fc0_src = FC_NUM(6, 2),
  1333. )
  1334. );
  1335. static struct rp1_clk_desc clk_slow_sys_desc = REGISTER_CLK(
  1336. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1337. "clk_slow_sys",
  1338. (const struct clk_parent_data[]) { { .index = 0 } },
  1339. &rp1_clk_ops,
  1340. CLK_IS_CRITICAL
  1341. ),
  1342. CLK_DATA(rp1_clock_data,
  1343. .num_std_parents = 1,
  1344. .num_aux_parents = 0,
  1345. .ctrl_reg = CLK_SLOW_SYS_CTRL,
  1346. .div_int_reg = CLK_SLOW_SYS_DIV_INT,
  1347. .sel_reg = CLK_SLOW_SYS_SEL,
  1348. .div_int_max = DIV_INT_8BIT_MAX,
  1349. .max_freq = 50 * HZ_PER_MHZ,
  1350. .fc0_src = FC_NUM(1, 4),
  1351. .clk_src_mask = 0x1,
  1352. )
  1353. );
  1354. static const struct clk_parent_data clk_dma_parents[] = {
  1355. { .hw = &pll_sys_pri_ph_desc.hw },
  1356. { .hw = &pll_video_desc.hw },
  1357. { .index = 0 },
  1358. };
  1359. static struct rp1_clk_desc clk_dma_desc = REGISTER_CLK(
  1360. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1361. "clk_dma",
  1362. clk_dma_parents,
  1363. &rp1_clk_ops,
  1364. 0
  1365. ),
  1366. CLK_DATA(rp1_clock_data,
  1367. .num_std_parents = 0,
  1368. .num_aux_parents = 3,
  1369. .ctrl_reg = CLK_DMA_CTRL,
  1370. .div_int_reg = CLK_DMA_DIV_INT,
  1371. .sel_reg = CLK_DMA_SEL,
  1372. .div_int_max = DIV_INT_8BIT_MAX,
  1373. .max_freq = 100 * HZ_PER_MHZ,
  1374. .fc0_src = FC_NUM(2, 2),
  1375. )
  1376. );
  1377. static const struct clk_parent_data clk_uart_parents[] = {
  1378. { .hw = &pll_sys_pri_ph_desc.hw },
  1379. { .hw = &pll_video_desc.hw },
  1380. { .index = 0 },
  1381. };
  1382. static struct rp1_clk_desc clk_uart_desc = REGISTER_CLK(
  1383. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1384. "clk_uart",
  1385. clk_uart_parents,
  1386. &rp1_clk_ops,
  1387. 0
  1388. ),
  1389. CLK_DATA(rp1_clock_data,
  1390. .num_std_parents = 0,
  1391. .num_aux_parents = 3,
  1392. .ctrl_reg = CLK_UART_CTRL,
  1393. .div_int_reg = CLK_UART_DIV_INT,
  1394. .sel_reg = CLK_UART_SEL,
  1395. .div_int_max = DIV_INT_8BIT_MAX,
  1396. .max_freq = 100 * HZ_PER_MHZ,
  1397. .fc0_src = FC_NUM(6, 7),
  1398. )
  1399. );
  1400. static const struct clk_parent_data clk_pwm0_parents[] = {
  1401. { .index = -1 },
  1402. { .hw = &pll_video_sec_desc.hw },
  1403. { .index = 0 },
  1404. };
  1405. static struct rp1_clk_desc clk_pwm0_desc = REGISTER_CLK(
  1406. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1407. "clk_pwm0",
  1408. clk_pwm0_parents,
  1409. &rp1_clk_ops,
  1410. 0
  1411. ),
  1412. CLK_DATA(rp1_clock_data,
  1413. .num_std_parents = 0,
  1414. .num_aux_parents = 3,
  1415. .ctrl_reg = CLK_PWM0_CTRL,
  1416. .div_int_reg = CLK_PWM0_DIV_INT,
  1417. .div_frac_reg = CLK_PWM0_DIV_FRAC,
  1418. .sel_reg = CLK_PWM0_SEL,
  1419. .div_int_max = DIV_INT_16BIT_MAX,
  1420. .max_freq = 76800 * HZ_PER_KHZ,
  1421. .fc0_src = FC_NUM(0, 5),
  1422. )
  1423. );
  1424. static const struct clk_parent_data clk_pwm1_parents[] = {
  1425. { .index = -1 },
  1426. { .hw = &pll_video_sec_desc.hw },
  1427. { .index = 0 },
  1428. };
  1429. static struct rp1_clk_desc clk_pwm1_desc = REGISTER_CLK(
  1430. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1431. "clk_pwm1",
  1432. clk_pwm1_parents,
  1433. &rp1_clk_ops,
  1434. 0
  1435. ),
  1436. CLK_DATA(rp1_clock_data,
  1437. .num_std_parents = 0,
  1438. .num_aux_parents = 3,
  1439. .ctrl_reg = CLK_PWM1_CTRL,
  1440. .div_int_reg = CLK_PWM1_DIV_INT,
  1441. .div_frac_reg = CLK_PWM1_DIV_FRAC,
  1442. .sel_reg = CLK_PWM1_SEL,
  1443. .div_int_max = DIV_INT_16BIT_MAX,
  1444. .max_freq = 76800 * HZ_PER_KHZ,
  1445. .fc0_src = FC_NUM(1, 5),
  1446. )
  1447. );
  1448. static const struct clk_parent_data clk_audio_in_parents[] = {
  1449. { .index = -1 },
  1450. { .index = -1 },
  1451. { .index = -1 },
  1452. { .hw = &pll_video_sec_desc.hw },
  1453. { .index = 0 },
  1454. };
  1455. static struct rp1_clk_desc clk_audio_in_desc = REGISTER_CLK(
  1456. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1457. "clk_audio_in",
  1458. clk_audio_in_parents,
  1459. &rp1_clk_ops,
  1460. 0
  1461. ),
  1462. CLK_DATA(rp1_clock_data,
  1463. .num_std_parents = 0,
  1464. .num_aux_parents = 5,
  1465. .ctrl_reg = CLK_AUDIO_IN_CTRL,
  1466. .div_int_reg = CLK_AUDIO_IN_DIV_INT,
  1467. .sel_reg = CLK_AUDIO_IN_SEL,
  1468. .div_int_max = DIV_INT_8BIT_MAX,
  1469. .max_freq = 76800 * HZ_PER_KHZ,
  1470. .fc0_src = FC_NUM(2, 5),
  1471. )
  1472. );
  1473. static const struct clk_parent_data clk_audio_out_parents[] = {
  1474. { .index = -1 },
  1475. { .index = -1 },
  1476. { .hw = &pll_video_sec_desc.hw },
  1477. { .index = 0 },
  1478. };
  1479. static struct rp1_clk_desc clk_audio_out_desc = REGISTER_CLK(
  1480. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1481. "clk_audio_out",
  1482. clk_audio_out_parents,
  1483. &rp1_clk_ops,
  1484. 0
  1485. ),
  1486. CLK_DATA(rp1_clock_data,
  1487. .num_std_parents = 0,
  1488. .num_aux_parents = 4,
  1489. .ctrl_reg = CLK_AUDIO_OUT_CTRL,
  1490. .div_int_reg = CLK_AUDIO_OUT_DIV_INT,
  1491. .sel_reg = CLK_AUDIO_OUT_SEL,
  1492. .div_int_max = DIV_INT_8BIT_MAX,
  1493. .max_freq = 153600 * HZ_PER_KHZ,
  1494. .fc0_src = FC_NUM(3, 5),
  1495. )
  1496. );
  1497. static const struct clk_parent_data clk_i2s_parents[] = {
  1498. { .index = 0 },
  1499. { .hw = &pll_audio_desc.hw },
  1500. { .hw = &pll_audio_sec_desc.hw },
  1501. };
  1502. static struct rp1_clk_desc clk_i2s_desc = REGISTER_CLK(
  1503. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1504. "clk_i2s",
  1505. clk_i2s_parents,
  1506. &rp1_clk_ops,
  1507. CLK_SET_RATE_PARENT
  1508. ),
  1509. CLK_DATA(rp1_clock_data,
  1510. .num_std_parents = 0,
  1511. .num_aux_parents = 3,
  1512. .ctrl_reg = CLK_I2S_CTRL,
  1513. .div_int_reg = CLK_I2S_DIV_INT,
  1514. .sel_reg = CLK_I2S_SEL,
  1515. .div_int_max = DIV_INT_8BIT_MAX,
  1516. .max_freq = 50 * HZ_PER_MHZ,
  1517. .fc0_src = FC_NUM(4, 4),
  1518. )
  1519. );
  1520. static struct rp1_clk_desc clk_mipi0_cfg_desc = REGISTER_CLK(
  1521. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1522. "clk_mipi0_cfg",
  1523. (const struct clk_parent_data[]) { { .index = 0 } },
  1524. &rp1_clk_ops,
  1525. 0
  1526. ),
  1527. CLK_DATA(rp1_clock_data,
  1528. .num_std_parents = 0,
  1529. .num_aux_parents = 1,
  1530. .ctrl_reg = CLK_MIPI0_CFG_CTRL,
  1531. .div_int_reg = CLK_MIPI0_CFG_DIV_INT,
  1532. .sel_reg = CLK_MIPI0_CFG_SEL,
  1533. .div_int_max = DIV_INT_8BIT_MAX,
  1534. .max_freq = 50 * HZ_PER_MHZ,
  1535. .fc0_src = FC_NUM(4, 5),
  1536. )
  1537. );
  1538. static struct rp1_clk_desc clk_mipi1_cfg_desc = REGISTER_CLK(
  1539. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1540. "clk_mipi1_cfg",
  1541. (const struct clk_parent_data[]) { { .index = 0 } },
  1542. &rp1_clk_ops,
  1543. 0
  1544. ),
  1545. CLK_DATA(rp1_clock_data,
  1546. .num_std_parents = 0,
  1547. .num_aux_parents = 1,
  1548. .ctrl_reg = CLK_MIPI1_CFG_CTRL,
  1549. .div_int_reg = CLK_MIPI1_CFG_DIV_INT,
  1550. .sel_reg = CLK_MIPI1_CFG_SEL,
  1551. .div_int_max = DIV_INT_8BIT_MAX,
  1552. .max_freq = 50 * HZ_PER_MHZ,
  1553. .fc0_src = FC_NUM(5, 6),
  1554. .clk_src_mask = 0x1,
  1555. )
  1556. );
  1557. static struct rp1_clk_desc clk_adc_desc = REGISTER_CLK(
  1558. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1559. "clk_adc",
  1560. (const struct clk_parent_data[]) { { .index = 0 } },
  1561. &rp1_clk_ops,
  1562. 0
  1563. ),
  1564. CLK_DATA(rp1_clock_data,
  1565. .num_std_parents = 0,
  1566. .num_aux_parents = 1,
  1567. .ctrl_reg = CLK_ADC_CTRL,
  1568. .div_int_reg = CLK_ADC_DIV_INT,
  1569. .sel_reg = CLK_ADC_SEL,
  1570. .div_int_max = DIV_INT_8BIT_MAX,
  1571. .max_freq = 50 * HZ_PER_MHZ,
  1572. .fc0_src = FC_NUM(5, 5),
  1573. )
  1574. );
  1575. static struct rp1_clk_desc clk_sdio_timer_desc = REGISTER_CLK(
  1576. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1577. "clk_sdio_timer",
  1578. (const struct clk_parent_data[]) { { .index = 0 } },
  1579. &rp1_clk_ops,
  1580. 0
  1581. ),
  1582. CLK_DATA(rp1_clock_data,
  1583. .num_std_parents = 0,
  1584. .num_aux_parents = 1,
  1585. .ctrl_reg = CLK_SDIO_TIMER_CTRL,
  1586. .div_int_reg = CLK_SDIO_TIMER_DIV_INT,
  1587. .sel_reg = CLK_SDIO_TIMER_SEL,
  1588. .div_int_max = DIV_INT_8BIT_MAX,
  1589. .max_freq = 50 * HZ_PER_MHZ,
  1590. .fc0_src = FC_NUM(3, 4),
  1591. )
  1592. );
  1593. static struct rp1_clk_desc clk_sdio_alt_src_desc = REGISTER_CLK(
  1594. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1595. "clk_sdio_alt_src",
  1596. (const struct clk_parent_data[]) {
  1597. { .hw = &pll_sys_desc.hw }
  1598. },
  1599. &rp1_clk_ops,
  1600. 0
  1601. ),
  1602. CLK_DATA(rp1_clock_data,
  1603. .num_std_parents = 0,
  1604. .num_aux_parents = 1,
  1605. .ctrl_reg = CLK_SDIO_ALT_SRC_CTRL,
  1606. .div_int_reg = CLK_SDIO_ALT_SRC_DIV_INT,
  1607. .sel_reg = CLK_SDIO_ALT_SRC_SEL,
  1608. .div_int_max = DIV_INT_8BIT_MAX,
  1609. .max_freq = 200 * HZ_PER_MHZ,
  1610. .fc0_src = FC_NUM(5, 4),
  1611. )
  1612. );
  1613. static const struct clk_parent_data clk_dpi_parents[] = {
  1614. { .hw = &pll_sys_desc.hw },
  1615. { .hw = &pll_video_sec_desc.hw },
  1616. { .hw = &pll_video_desc.hw },
  1617. { .index = -1 },
  1618. { .index = -1 },
  1619. { .index = -1 },
  1620. { .index = -1 },
  1621. { .index = -1 },
  1622. };
  1623. static struct rp1_clk_desc clk_dpi_desc = REGISTER_CLK(
  1624. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1625. "clk_dpi",
  1626. clk_dpi_parents,
  1627. &rp1_clk_ops,
  1628. CLK_SET_RATE_NO_REPARENT /* Let DPI driver set parent */
  1629. ),
  1630. CLK_DATA(rp1_clock_data,
  1631. .num_std_parents = 0,
  1632. .num_aux_parents = 8,
  1633. .ctrl_reg = VIDEO_CLK_DPI_CTRL,
  1634. .div_int_reg = VIDEO_CLK_DPI_DIV_INT,
  1635. .sel_reg = VIDEO_CLK_DPI_SEL,
  1636. .div_int_max = DIV_INT_8BIT_MAX,
  1637. .max_freq = 200 * HZ_PER_MHZ,
  1638. .fc0_src = FC_NUM(1, 6),
  1639. )
  1640. );
  1641. static const struct clk_parent_data clk_gp0_parents[] = {
  1642. { .index = 0 },
  1643. { .index = -1 },
  1644. { .index = -1 },
  1645. { .index = -1 },
  1646. { .index = -1 },
  1647. { .index = -1 },
  1648. { .hw = &pll_sys_desc.hw },
  1649. { .index = -1 },
  1650. { .index = -1 },
  1651. { .index = -1 },
  1652. { .hw = &clk_i2s_desc.hw },
  1653. { .hw = &clk_adc_desc.hw },
  1654. { .index = -1 },
  1655. { .index = -1 },
  1656. { .index = -1 },
  1657. { .hw = &clk_sys_desc.hw },
  1658. };
  1659. static struct rp1_clk_desc clk_gp0_desc = REGISTER_CLK(
  1660. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1661. "clk_gp0",
  1662. clk_gp0_parents,
  1663. &rp1_clk_ops,
  1664. 0
  1665. ),
  1666. CLK_DATA(rp1_clock_data,
  1667. .num_std_parents = 0,
  1668. .num_aux_parents = 16,
  1669. .oe_mask = BIT(0),
  1670. .ctrl_reg = CLK_GP0_CTRL,
  1671. .div_int_reg = CLK_GP0_DIV_INT,
  1672. .div_frac_reg = CLK_GP0_DIV_FRAC,
  1673. .sel_reg = CLK_GP0_SEL,
  1674. .div_int_max = DIV_INT_16BIT_MAX,
  1675. .max_freq = 100 * HZ_PER_MHZ,
  1676. .fc0_src = FC_NUM(0, 1),
  1677. )
  1678. );
  1679. static const struct clk_parent_data clk_gp1_parents[] = {
  1680. { .hw = &clk_sdio_timer_desc.hw },
  1681. { .index = -1 },
  1682. { .index = -1 },
  1683. { .index = -1 },
  1684. { .index = -1 },
  1685. { .index = -1 },
  1686. { .hw = &pll_sys_pri_ph_desc.hw },
  1687. { .index = -1 },
  1688. { .index = -1 },
  1689. { .index = -1 },
  1690. { .hw = &clk_adc_desc.hw },
  1691. { .hw = &clk_dpi_desc.hw },
  1692. { .hw = &clk_pwm0_desc.hw },
  1693. { .index = -1 },
  1694. { .index = -1 },
  1695. { .index = -1 },
  1696. };
  1697. static struct rp1_clk_desc clk_gp1_desc = REGISTER_CLK(
  1698. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1699. "clk_gp1",
  1700. clk_gp1_parents,
  1701. &rp1_clk_ops,
  1702. 0
  1703. ),
  1704. CLK_DATA(rp1_clock_data,
  1705. .num_std_parents = 0,
  1706. .num_aux_parents = 16,
  1707. .oe_mask = BIT(1),
  1708. .ctrl_reg = CLK_GP1_CTRL,
  1709. .div_int_reg = CLK_GP1_DIV_INT,
  1710. .div_frac_reg = CLK_GP1_DIV_FRAC,
  1711. .sel_reg = CLK_GP1_SEL,
  1712. .div_int_max = DIV_INT_16BIT_MAX,
  1713. .max_freq = 100 * HZ_PER_MHZ,
  1714. .fc0_src = FC_NUM(1, 1),
  1715. )
  1716. );
  1717. static struct rp1_clk_desc clksrc_mipi0_dsi_byteclk_desc = REGISTER_CLK(
  1718. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1719. "clksrc_mipi0_dsi_byteclk",
  1720. (const struct clk_parent_data[]) { { .index = 0 } },
  1721. &rp1_varsrc_ops,
  1722. 0
  1723. ),
  1724. CLK_DATA(rp1_clock_data,
  1725. .num_std_parents = 1,
  1726. .num_aux_parents = 0,
  1727. )
  1728. );
  1729. static struct rp1_clk_desc clksrc_mipi1_dsi_byteclk_desc = REGISTER_CLK(
  1730. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1731. "clksrc_mipi1_dsi_byteclk",
  1732. (const struct clk_parent_data[]) { { .index = 0 } },
  1733. &rp1_varsrc_ops,
  1734. 0
  1735. ),
  1736. CLK_DATA(rp1_clock_data,
  1737. .num_std_parents = 1,
  1738. .num_aux_parents = 0,
  1739. )
  1740. );
  1741. static const struct clk_parent_data clk_mipi0_dpi_parents[] = {
  1742. { .hw = &pll_sys_desc.hw },
  1743. { .hw = &pll_video_sec_desc.hw },
  1744. { .hw = &pll_video_desc.hw },
  1745. { .hw = &clksrc_mipi0_dsi_byteclk_desc.hw },
  1746. { .index = -1 },
  1747. { .index = -1 },
  1748. { .index = -1 },
  1749. { .index = -1 },
  1750. };
  1751. static struct rp1_clk_desc clk_mipi0_dpi_desc = REGISTER_CLK(
  1752. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1753. "clk_mipi0_dpi",
  1754. clk_mipi0_dpi_parents,
  1755. &rp1_clk_ops,
  1756. CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */
  1757. ),
  1758. CLK_DATA(rp1_clock_data,
  1759. .num_std_parents = 0,
  1760. .num_aux_parents = 8,
  1761. .ctrl_reg = VIDEO_CLK_MIPI0_DPI_CTRL,
  1762. .div_int_reg = VIDEO_CLK_MIPI0_DPI_DIV_INT,
  1763. .div_frac_reg = VIDEO_CLK_MIPI0_DPI_DIV_FRAC,
  1764. .sel_reg = VIDEO_CLK_MIPI0_DPI_SEL,
  1765. .div_int_max = DIV_INT_8BIT_MAX,
  1766. .max_freq = 200 * HZ_PER_MHZ,
  1767. .fc0_src = FC_NUM(2, 6),
  1768. )
  1769. );
  1770. static const struct clk_parent_data clk_mipi1_dpi_parents[] = {
  1771. { .hw = &pll_sys_desc.hw },
  1772. { .hw = &pll_video_sec_desc.hw },
  1773. { .hw = &pll_video_desc.hw },
  1774. { .hw = &clksrc_mipi1_dsi_byteclk_desc.hw },
  1775. { .index = -1 },
  1776. { .index = -1 },
  1777. { .index = -1 },
  1778. { .index = -1 },
  1779. };
  1780. static struct rp1_clk_desc clk_mipi1_dpi_desc = REGISTER_CLK(
  1781. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1782. "clk_mipi1_dpi",
  1783. clk_mipi1_dpi_parents,
  1784. &rp1_clk_ops,
  1785. CLK_SET_RATE_NO_REPARENT /* Let DSI driver set parent */
  1786. ),
  1787. CLK_DATA(rp1_clock_data,
  1788. .num_std_parents = 0,
  1789. .num_aux_parents = 8,
  1790. .ctrl_reg = VIDEO_CLK_MIPI1_DPI_CTRL,
  1791. .div_int_reg = VIDEO_CLK_MIPI1_DPI_DIV_INT,
  1792. .div_frac_reg = VIDEO_CLK_MIPI1_DPI_DIV_FRAC,
  1793. .sel_reg = VIDEO_CLK_MIPI1_DPI_SEL,
  1794. .div_int_max = DIV_INT_8BIT_MAX,
  1795. .max_freq = 200 * HZ_PER_MHZ,
  1796. .fc0_src = FC_NUM(3, 6),
  1797. )
  1798. );
  1799. static const struct clk_parent_data clk_gp2_parents[] = {
  1800. { .hw = &clk_sdio_alt_src_desc.hw },
  1801. { .index = -1 },
  1802. { .index = -1 },
  1803. { .index = -1 },
  1804. { .index = -1 },
  1805. { .index = -1 },
  1806. { .hw = &pll_sys_sec_desc.hw },
  1807. { .index = -1 },
  1808. { .hw = &pll_video_desc.hw },
  1809. { .hw = &clk_audio_in_desc.hw },
  1810. { .hw = &clk_dpi_desc.hw },
  1811. { .hw = &clk_pwm0_desc.hw },
  1812. { .hw = &clk_pwm1_desc.hw },
  1813. { .hw = &clk_mipi0_dpi_desc.hw },
  1814. { .hw = &clk_mipi1_cfg_desc.hw },
  1815. { .hw = &clk_sys_desc.hw },
  1816. };
  1817. static struct rp1_clk_desc clk_gp2_desc = REGISTER_CLK(
  1818. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1819. "clk_gp2",
  1820. clk_gp2_parents,
  1821. &rp1_clk_ops,
  1822. 0
  1823. ),
  1824. CLK_DATA(rp1_clock_data,
  1825. .num_std_parents = 0,
  1826. .num_aux_parents = 16,
  1827. .oe_mask = BIT(2),
  1828. .ctrl_reg = CLK_GP2_CTRL,
  1829. .div_int_reg = CLK_GP2_DIV_INT,
  1830. .div_frac_reg = CLK_GP2_DIV_FRAC,
  1831. .sel_reg = CLK_GP2_SEL,
  1832. .div_int_max = DIV_INT_16BIT_MAX,
  1833. .max_freq = 100 * HZ_PER_MHZ,
  1834. .fc0_src = FC_NUM(2, 1),
  1835. )
  1836. );
  1837. static const struct clk_parent_data clk_gp3_parents[] = {
  1838. { .index = 0 },
  1839. { .index = -1 },
  1840. { .index = -1 },
  1841. { .index = -1 },
  1842. { .index = -1 },
  1843. { .index = -1 },
  1844. { .index = -1 },
  1845. { .index = -1 },
  1846. { .hw = &pll_video_pri_ph_desc.hw },
  1847. { .hw = &clk_audio_out_desc.hw },
  1848. { .index = -1 },
  1849. { .index = -1 },
  1850. { .hw = &clk_mipi1_dpi_desc.hw },
  1851. { .index = -1 },
  1852. { .index = -1 },
  1853. { .index = -1 },
  1854. };
  1855. static struct rp1_clk_desc clk_gp3_desc = REGISTER_CLK(
  1856. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1857. "clk_gp3",
  1858. clk_gp3_parents,
  1859. &rp1_clk_ops,
  1860. 0
  1861. ),
  1862. CLK_DATA(rp1_clock_data,
  1863. .num_std_parents = 0,
  1864. .num_aux_parents = 16,
  1865. .oe_mask = BIT(3),
  1866. .ctrl_reg = CLK_GP3_CTRL,
  1867. .div_int_reg = CLK_GP3_DIV_INT,
  1868. .div_frac_reg = CLK_GP3_DIV_FRAC,
  1869. .sel_reg = CLK_GP3_SEL,
  1870. .div_int_max = DIV_INT_16BIT_MAX,
  1871. .max_freq = 100 * HZ_PER_MHZ,
  1872. .fc0_src = FC_NUM(3, 1),
  1873. )
  1874. );
  1875. static const struct clk_parent_data clk_gp4_parents[] = {
  1876. { .index = 0 },
  1877. { .index = -1 },
  1878. { .index = -1 },
  1879. { .index = -1 },
  1880. { .index = -1 },
  1881. { .index = -1 },
  1882. { .index = -1 },
  1883. { .hw = &pll_video_sec_desc.hw },
  1884. { .index = -1 },
  1885. { .index = -1 },
  1886. { .index = -1 },
  1887. { .hw = &clk_mipi0_cfg_desc.hw },
  1888. { .hw = &clk_uart_desc.hw },
  1889. { .index = -1 },
  1890. { .index = -1 },
  1891. { .hw = &clk_sys_desc.hw },
  1892. };
  1893. static struct rp1_clk_desc clk_gp4_desc = REGISTER_CLK(
  1894. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1895. "clk_gp4",
  1896. clk_gp4_parents,
  1897. &rp1_clk_ops,
  1898. 0
  1899. ),
  1900. CLK_DATA(rp1_clock_data,
  1901. .num_std_parents = 0,
  1902. .num_aux_parents = 16,
  1903. .oe_mask = BIT(4),
  1904. .ctrl_reg = CLK_GP4_CTRL,
  1905. .div_int_reg = CLK_GP4_DIV_INT,
  1906. .div_frac_reg = CLK_GP4_DIV_FRAC,
  1907. .sel_reg = CLK_GP4_SEL,
  1908. .div_int_max = DIV_INT_16BIT_MAX,
  1909. .max_freq = 100 * HZ_PER_MHZ,
  1910. .fc0_src = FC_NUM(4, 1),
  1911. )
  1912. );
  1913. static const struct clk_parent_data clk_vec_parents[] = {
  1914. { .hw = &pll_sys_pri_ph_desc.hw },
  1915. { .hw = &pll_video_sec_desc.hw },
  1916. { .hw = &pll_video_desc.hw },
  1917. { .index = -1 },
  1918. { .index = -1 },
  1919. { .index = -1 },
  1920. { .index = -1 },
  1921. { .index = -1 },
  1922. };
  1923. static struct rp1_clk_desc clk_vec_desc = REGISTER_CLK(
  1924. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1925. "clk_vec",
  1926. clk_vec_parents,
  1927. &rp1_clk_ops,
  1928. CLK_SET_RATE_NO_REPARENT /* Let VEC driver set parent */
  1929. ),
  1930. CLK_DATA(rp1_clock_data,
  1931. .num_std_parents = 0,
  1932. .num_aux_parents = 8,
  1933. .ctrl_reg = VIDEO_CLK_VEC_CTRL,
  1934. .div_int_reg = VIDEO_CLK_VEC_DIV_INT,
  1935. .sel_reg = VIDEO_CLK_VEC_SEL,
  1936. .div_int_max = DIV_INT_8BIT_MAX,
  1937. .max_freq = 108 * HZ_PER_MHZ,
  1938. .fc0_src = FC_NUM(0, 6),
  1939. )
  1940. );
  1941. static const struct clk_parent_data clk_gp5_parents[] = {
  1942. { .index = 0 },
  1943. { .index = -1 },
  1944. { .index = -1 },
  1945. { .index = -1 },
  1946. { .index = -1 },
  1947. { .index = -1 },
  1948. { .index = -1 },
  1949. { .hw = &pll_video_sec_desc.hw },
  1950. { .hw = &clk_eth_tsu_desc.hw },
  1951. { .index = -1 },
  1952. { .hw = &clk_vec_desc.hw },
  1953. { .index = -1 },
  1954. { .index = -1 },
  1955. { .index = -1 },
  1956. { .index = -1 },
  1957. { .index = -1 },
  1958. };
  1959. static struct rp1_clk_desc clk_gp5_desc = REGISTER_CLK(
  1960. .hw.init = CLK_HW_INIT_PARENTS_DATA(
  1961. "clk_gp5",
  1962. clk_gp5_parents,
  1963. &rp1_clk_ops,
  1964. 0
  1965. ),
  1966. CLK_DATA(rp1_clock_data,
  1967. .num_std_parents = 0,
  1968. .num_aux_parents = 16,
  1969. .oe_mask = BIT(5),
  1970. .ctrl_reg = CLK_GP5_CTRL,
  1971. .div_int_reg = CLK_GP5_DIV_INT,
  1972. .div_frac_reg = CLK_GP5_DIV_FRAC,
  1973. .sel_reg = CLK_GP5_SEL,
  1974. .div_int_max = DIV_INT_16BIT_MAX,
  1975. .max_freq = 100 * HZ_PER_MHZ,
  1976. .fc0_src = FC_NUM(5, 1),
  1977. )
  1978. );
  1979. static struct rp1_clk_desc *const clk_desc_array[] = {
  1980. [RP1_PLL_SYS_CORE] = &pll_sys_core_desc,
  1981. [RP1_PLL_AUDIO_CORE] = &pll_audio_core_desc,
  1982. [RP1_PLL_VIDEO_CORE] = &pll_video_core_desc,
  1983. [RP1_PLL_SYS] = &pll_sys_desc,
  1984. [RP1_CLK_ETH_TSU] = &clk_eth_tsu_desc,
  1985. [RP1_CLK_ETH] = &clk_eth_desc,
  1986. [RP1_CLK_SYS] = &clk_sys_desc,
  1987. [RP1_PLL_SYS_PRI_PH] = &pll_sys_pri_ph_desc,
  1988. [RP1_PLL_SYS_SEC] = &pll_sys_sec_desc,
  1989. [RP1_PLL_AUDIO] = &pll_audio_desc,
  1990. [RP1_PLL_VIDEO] = &pll_video_desc,
  1991. [RP1_PLL_AUDIO_PRI_PH] = &pll_audio_pri_ph_desc,
  1992. [RP1_PLL_VIDEO_PRI_PH] = &pll_video_pri_ph_desc,
  1993. [RP1_PLL_AUDIO_SEC] = &pll_audio_sec_desc,
  1994. [RP1_PLL_VIDEO_SEC] = &pll_video_sec_desc,
  1995. [RP1_PLL_AUDIO_TERN] = &pll_audio_tern_desc,
  1996. [RP1_CLK_SLOW_SYS] = &clk_slow_sys_desc,
  1997. [RP1_CLK_DMA] = &clk_dma_desc,
  1998. [RP1_CLK_UART] = &clk_uart_desc,
  1999. [RP1_CLK_PWM0] = &clk_pwm0_desc,
  2000. [RP1_CLK_PWM1] = &clk_pwm1_desc,
  2001. [RP1_CLK_AUDIO_IN] = &clk_audio_in_desc,
  2002. [RP1_CLK_AUDIO_OUT] = &clk_audio_out_desc,
  2003. [RP1_CLK_I2S] = &clk_i2s_desc,
  2004. [RP1_CLK_MIPI0_CFG] = &clk_mipi0_cfg_desc,
  2005. [RP1_CLK_MIPI1_CFG] = &clk_mipi1_cfg_desc,
  2006. [RP1_CLK_ADC] = &clk_adc_desc,
  2007. [RP1_CLK_SDIO_TIMER] = &clk_sdio_timer_desc,
  2008. [RP1_CLK_SDIO_ALT_SRC] = &clk_sdio_alt_src_desc,
  2009. [RP1_CLK_GP0] = &clk_gp0_desc,
  2010. [RP1_CLK_GP1] = &clk_gp1_desc,
  2011. [RP1_CLK_GP2] = &clk_gp2_desc,
  2012. [RP1_CLK_GP3] = &clk_gp3_desc,
  2013. [RP1_CLK_GP4] = &clk_gp4_desc,
  2014. [RP1_CLK_GP5] = &clk_gp5_desc,
  2015. [RP1_CLK_VEC] = &clk_vec_desc,
  2016. [RP1_CLK_DPI] = &clk_dpi_desc,
  2017. [RP1_CLK_MIPI0_DPI] = &clk_mipi0_dpi_desc,
  2018. [RP1_CLK_MIPI1_DPI] = &clk_mipi1_dpi_desc,
  2019. [RP1_CLK_MIPI0_DSI_BYTECLOCK] = &clksrc_mipi0_dsi_byteclk_desc,
  2020. [RP1_CLK_MIPI1_DSI_BYTECLOCK] = &clksrc_mipi1_dsi_byteclk_desc,
  2021. };
  2022. static const struct regmap_range rp1_reg_ranges[] = {
  2023. regmap_reg_range(PLL_SYS_CS, PLL_SYS_SEC),
  2024. regmap_reg_range(PLL_AUDIO_CS, PLL_AUDIO_TERN),
  2025. regmap_reg_range(PLL_VIDEO_CS, PLL_VIDEO_SEC),
  2026. regmap_reg_range(GPCLK_OE_CTRL, GPCLK_OE_CTRL),
  2027. regmap_reg_range(CLK_SYS_CTRL, CLK_SYS_DIV_INT),
  2028. regmap_reg_range(CLK_SYS_SEL, CLK_SYS_SEL),
  2029. regmap_reg_range(CLK_SLOW_SYS_CTRL, CLK_SLOW_SYS_DIV_INT),
  2030. regmap_reg_range(CLK_SLOW_SYS_SEL, CLK_SLOW_SYS_SEL),
  2031. regmap_reg_range(CLK_DMA_CTRL, CLK_DMA_DIV_INT),
  2032. regmap_reg_range(CLK_DMA_SEL, CLK_DMA_SEL),
  2033. regmap_reg_range(CLK_UART_CTRL, CLK_UART_DIV_INT),
  2034. regmap_reg_range(CLK_UART_SEL, CLK_UART_SEL),
  2035. regmap_reg_range(CLK_ETH_CTRL, CLK_ETH_DIV_INT),
  2036. regmap_reg_range(CLK_ETH_SEL, CLK_ETH_SEL),
  2037. regmap_reg_range(CLK_PWM0_CTRL, CLK_PWM0_SEL),
  2038. regmap_reg_range(CLK_PWM1_CTRL, CLK_PWM1_SEL),
  2039. regmap_reg_range(CLK_AUDIO_IN_CTRL, CLK_AUDIO_IN_DIV_INT),
  2040. regmap_reg_range(CLK_AUDIO_IN_SEL, CLK_AUDIO_IN_SEL),
  2041. regmap_reg_range(CLK_AUDIO_OUT_CTRL, CLK_AUDIO_OUT_DIV_INT),
  2042. regmap_reg_range(CLK_AUDIO_OUT_SEL, CLK_AUDIO_OUT_SEL),
  2043. regmap_reg_range(CLK_I2S_CTRL, CLK_I2S_DIV_INT),
  2044. regmap_reg_range(CLK_I2S_SEL, CLK_I2S_SEL),
  2045. regmap_reg_range(CLK_MIPI0_CFG_CTRL, CLK_MIPI0_CFG_DIV_INT),
  2046. regmap_reg_range(CLK_MIPI0_CFG_SEL, CLK_MIPI0_CFG_SEL),
  2047. regmap_reg_range(CLK_MIPI1_CFG_CTRL, CLK_MIPI1_CFG_DIV_INT),
  2048. regmap_reg_range(CLK_MIPI1_CFG_SEL, CLK_MIPI1_CFG_SEL),
  2049. regmap_reg_range(CLK_PCIE_AUX_CTRL, CLK_PCIE_AUX_DIV_INT),
  2050. regmap_reg_range(CLK_PCIE_AUX_SEL, CLK_PCIE_AUX_SEL),
  2051. regmap_reg_range(CLK_USBH0_MICROFRAME_CTRL, CLK_USBH0_MICROFRAME_DIV_INT),
  2052. regmap_reg_range(CLK_USBH0_MICROFRAME_SEL, CLK_USBH0_MICROFRAME_SEL),
  2053. regmap_reg_range(CLK_USBH1_MICROFRAME_CTRL, CLK_USBH1_MICROFRAME_DIV_INT),
  2054. regmap_reg_range(CLK_USBH1_MICROFRAME_SEL, CLK_USBH1_MICROFRAME_SEL),
  2055. regmap_reg_range(CLK_USBH0_SUSPEND_CTRL, CLK_USBH0_SUSPEND_DIV_INT),
  2056. regmap_reg_range(CLK_USBH0_SUSPEND_SEL, CLK_USBH0_SUSPEND_SEL),
  2057. regmap_reg_range(CLK_USBH1_SUSPEND_CTRL, CLK_USBH1_SUSPEND_DIV_INT),
  2058. regmap_reg_range(CLK_USBH1_SUSPEND_SEL, CLK_USBH1_SUSPEND_SEL),
  2059. regmap_reg_range(CLK_ETH_TSU_CTRL, CLK_ETH_TSU_DIV_INT),
  2060. regmap_reg_range(CLK_ETH_TSU_SEL, CLK_ETH_TSU_SEL),
  2061. regmap_reg_range(CLK_ADC_CTRL, CLK_ADC_DIV_INT),
  2062. regmap_reg_range(CLK_ADC_SEL, CLK_ADC_SEL),
  2063. regmap_reg_range(CLK_SDIO_TIMER_CTRL, CLK_SDIO_TIMER_DIV_INT),
  2064. regmap_reg_range(CLK_SDIO_TIMER_SEL, CLK_SDIO_TIMER_SEL),
  2065. regmap_reg_range(CLK_SDIO_ALT_SRC_CTRL, CLK_SDIO_ALT_SRC_DIV_INT),
  2066. regmap_reg_range(CLK_SDIO_ALT_SRC_SEL, CLK_SDIO_ALT_SRC_SEL),
  2067. regmap_reg_range(CLK_GP0_CTRL, CLK_GP0_SEL),
  2068. regmap_reg_range(CLK_GP1_CTRL, CLK_GP1_SEL),
  2069. regmap_reg_range(CLK_GP2_CTRL, CLK_GP2_SEL),
  2070. regmap_reg_range(CLK_GP3_CTRL, CLK_GP3_SEL),
  2071. regmap_reg_range(CLK_GP4_CTRL, CLK_GP4_SEL),
  2072. regmap_reg_range(CLK_GP5_CTRL, CLK_GP5_SEL),
  2073. regmap_reg_range(CLK_SYS_RESUS_CTRL, CLK_SYS_RESUS_CTRL),
  2074. regmap_reg_range(CLK_SLOW_SYS_RESUS_CTRL, CLK_SLOW_SYS_RESUS_CTRL),
  2075. regmap_reg_range(FC0_REF_KHZ, FC0_RESULT),
  2076. regmap_reg_range(VIDEO_CLK_VEC_CTRL, VIDEO_CLK_VEC_DIV_INT),
  2077. regmap_reg_range(VIDEO_CLK_VEC_SEL, VIDEO_CLK_DPI_DIV_INT),
  2078. regmap_reg_range(VIDEO_CLK_DPI_SEL, VIDEO_CLK_MIPI1_DPI_SEL),
  2079. };
  2080. static const struct regmap_access_table rp1_reg_table = {
  2081. .yes_ranges = rp1_reg_ranges,
  2082. .n_yes_ranges = ARRAY_SIZE(rp1_reg_ranges),
  2083. };
  2084. static const struct regmap_config rp1_clk_regmap_cfg = {
  2085. .reg_bits = 32,
  2086. .val_bits = 32,
  2087. .reg_stride = 4,
  2088. .max_register = PLL_VIDEO_SEC,
  2089. .name = "rp1-clk",
  2090. .rd_table = &rp1_reg_table,
  2091. .disable_locking = true,
  2092. };
  2093. static int rp1_clk_probe(struct platform_device *pdev)
  2094. {
  2095. const size_t asize = ARRAY_SIZE(clk_desc_array);
  2096. struct rp1_clk_desc *desc;
  2097. struct device *dev = &pdev->dev;
  2098. struct rp1_clockman *clockman;
  2099. struct clk_hw **hws;
  2100. unsigned int i;
  2101. clockman = devm_kzalloc(dev, struct_size(clockman, onecell.hws, asize),
  2102. GFP_KERNEL);
  2103. if (!clockman)
  2104. return -ENOMEM;
  2105. spin_lock_init(&clockman->regs_lock);
  2106. clockman->dev = dev;
  2107. clockman->regs = devm_platform_ioremap_resource(pdev, 0);
  2108. if (IS_ERR(clockman->regs))
  2109. return PTR_ERR(clockman->regs);
  2110. clockman->regmap = devm_regmap_init_mmio(dev, clockman->regs,
  2111. &rp1_clk_regmap_cfg);
  2112. if (IS_ERR(clockman->regmap)) {
  2113. dev_err_probe(dev, PTR_ERR(clockman->regmap),
  2114. "could not init clock regmap\n");
  2115. return PTR_ERR(clockman->regmap);
  2116. }
  2117. clockman->onecell.num = asize;
  2118. hws = clockman->onecell.hws;
  2119. for (i = 0; i < asize; i++) {
  2120. desc = clk_desc_array[i];
  2121. if (desc && desc->clk_register && desc->data)
  2122. hws[i] = desc->clk_register(clockman, desc);
  2123. }
  2124. clk_audio_core = &pll_audio_core_desc;
  2125. clk_audio = &pll_audio_desc;
  2126. clk_i2s = &clk_i2s_desc;
  2127. clk_xosc = clk_hw_get_parent_by_index(&clk_i2s->hw, 0);
  2128. platform_set_drvdata(pdev, clockman);
  2129. return devm_of_clk_add_hw_provider(dev, of_clk_hw_onecell_get,
  2130. &clockman->onecell);
  2131. }
  2132. static const struct of_device_id rp1_clk_of_match[] = {
  2133. { .compatible = "raspberrypi,rp1-clocks" },
  2134. {}
  2135. };
  2136. MODULE_DEVICE_TABLE(of, rp1_clk_of_match);
  2137. static struct platform_driver rp1_clk_driver = {
  2138. .driver = {
  2139. .name = "rp1-clk",
  2140. .of_match_table = rp1_clk_of_match,
  2141. },
  2142. .probe = rp1_clk_probe,
  2143. };
  2144. module_platform_driver(rp1_clk_driver);
  2145. MODULE_AUTHOR("Naushir Patuck <naush@raspberrypi.com>");
  2146. MODULE_AUTHOR("Andrea della Porta <andrea.porta@suse.com>");
  2147. MODULE_DESCRIPTION("RP1 clock driver");
  2148. MODULE_LICENSE("GPL");