clk-tegra210.c 91 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750
  1. /*
  2. * Copyright (c) 2012-2014 NVIDIA CORPORATION. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify it
  5. * under the terms and conditions of the GNU General Public License,
  6. * version 2, as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope it will be useful, but WITHOUT
  9. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11. * more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include <linux/io.h>
  17. #include <linux/clk.h>
  18. #include <linux/clk-provider.h>
  19. #include <linux/clkdev.h>
  20. #include <linux/of.h>
  21. #include <linux/of_address.h>
  22. #include <linux/delay.h>
  23. #include <linux/export.h>
  24. #include <linux/clk/tegra.h>
  25. #include <dt-bindings/clock/tegra210-car.h>
  26. #include "clk.h"
  27. #include "clk-id.h"
  28. /*
  29. * TEGRA210_CAR_BANK_COUNT: the number of peripheral clock register
  30. * banks present in the Tegra210 CAR IP block. The banks are
  31. * identified by single letters, e.g.: L, H, U, V, W, X, Y. See
  32. * periph_regs[] in drivers/clk/tegra/clk.c
  33. */
  34. #define TEGRA210_CAR_BANK_COUNT 7
  35. #define CLK_SOURCE_CSITE 0x1d4
  36. #define CLK_SOURCE_EMC 0x19c
  37. #define PLLC_BASE 0x80
  38. #define PLLC_OUT 0x84
  39. #define PLLC_MISC0 0x88
  40. #define PLLC_MISC1 0x8c
  41. #define PLLC_MISC2 0x5d0
  42. #define PLLC_MISC3 0x5d4
  43. #define PLLC2_BASE 0x4e8
  44. #define PLLC2_MISC0 0x4ec
  45. #define PLLC2_MISC1 0x4f0
  46. #define PLLC2_MISC2 0x4f4
  47. #define PLLC2_MISC3 0x4f8
  48. #define PLLC3_BASE 0x4fc
  49. #define PLLC3_MISC0 0x500
  50. #define PLLC3_MISC1 0x504
  51. #define PLLC3_MISC2 0x508
  52. #define PLLC3_MISC3 0x50c
  53. #define PLLM_BASE 0x90
  54. #define PLLM_MISC1 0x98
  55. #define PLLM_MISC2 0x9c
  56. #define PLLP_BASE 0xa0
  57. #define PLLP_MISC0 0xac
  58. #define PLLP_MISC1 0x680
  59. #define PLLA_BASE 0xb0
  60. #define PLLA_MISC0 0xbc
  61. #define PLLA_MISC1 0xb8
  62. #define PLLA_MISC2 0x5d8
  63. #define PLLD_BASE 0xd0
  64. #define PLLD_MISC0 0xdc
  65. #define PLLD_MISC1 0xd8
  66. #define PLLU_BASE 0xc0
  67. #define PLLU_OUTA 0xc4
  68. #define PLLU_MISC0 0xcc
  69. #define PLLU_MISC1 0xc8
  70. #define PLLX_BASE 0xe0
  71. #define PLLX_MISC0 0xe4
  72. #define PLLX_MISC1 0x510
  73. #define PLLX_MISC2 0x514
  74. #define PLLX_MISC3 0x518
  75. #define PLLX_MISC4 0x5f0
  76. #define PLLX_MISC5 0x5f4
  77. #define PLLE_BASE 0xe8
  78. #define PLLE_MISC0 0xec
  79. #define PLLD2_BASE 0x4b8
  80. #define PLLD2_MISC0 0x4bc
  81. #define PLLD2_MISC1 0x570
  82. #define PLLD2_MISC2 0x574
  83. #define PLLD2_MISC3 0x578
  84. #define PLLE_AUX 0x48c
  85. #define PLLRE_BASE 0x4c4
  86. #define PLLRE_MISC0 0x4c8
  87. #define PLLRE_OUT1 0x4cc
  88. #define PLLDP_BASE 0x590
  89. #define PLLDP_MISC 0x594
  90. #define PLLC4_BASE 0x5a4
  91. #define PLLC4_MISC0 0x5a8
  92. #define PLLC4_OUT 0x5e4
  93. #define PLLMB_BASE 0x5e8
  94. #define PLLMB_MISC1 0x5ec
  95. #define PLLA1_BASE 0x6a4
  96. #define PLLA1_MISC0 0x6a8
  97. #define PLLA1_MISC1 0x6ac
  98. #define PLLA1_MISC2 0x6b0
  99. #define PLLA1_MISC3 0x6b4
  100. #define PLLU_IDDQ_BIT 31
  101. #define PLLCX_IDDQ_BIT 27
  102. #define PLLRE_IDDQ_BIT 24
  103. #define PLLA_IDDQ_BIT 25
  104. #define PLLD_IDDQ_BIT 20
  105. #define PLLSS_IDDQ_BIT 18
  106. #define PLLM_IDDQ_BIT 5
  107. #define PLLMB_IDDQ_BIT 17
  108. #define PLLXP_IDDQ_BIT 3
  109. #define PLLCX_RESET_BIT 30
  110. #define PLL_BASE_LOCK BIT(27)
  111. #define PLLCX_BASE_LOCK BIT(26)
  112. #define PLLE_MISC_LOCK BIT(11)
  113. #define PLLRE_MISC_LOCK BIT(27)
  114. #define PLL_MISC_LOCK_ENABLE 18
  115. #define PLLC_MISC_LOCK_ENABLE 24
  116. #define PLLDU_MISC_LOCK_ENABLE 22
  117. #define PLLU_MISC_LOCK_ENABLE 29
  118. #define PLLE_MISC_LOCK_ENABLE 9
  119. #define PLLRE_MISC_LOCK_ENABLE 30
  120. #define PLLSS_MISC_LOCK_ENABLE 30
  121. #define PLLP_MISC_LOCK_ENABLE 18
  122. #define PLLM_MISC_LOCK_ENABLE 4
  123. #define PLLMB_MISC_LOCK_ENABLE 16
  124. #define PLLA_MISC_LOCK_ENABLE 28
  125. #define PLLU_MISC_LOCK_ENABLE 29
  126. #define PLLD_MISC_LOCK_ENABLE 18
  127. #define PLLA_SDM_DIN_MASK 0xffff
  128. #define PLLA_SDM_EN_MASK BIT(26)
  129. #define PLLD_SDM_EN_MASK BIT(16)
  130. #define PLLD2_SDM_EN_MASK BIT(31)
  131. #define PLLD2_SSC_EN_MASK BIT(30)
  132. #define PLLDP_SS_CFG 0x598
  133. #define PLLDP_SDM_EN_MASK BIT(31)
  134. #define PLLDP_SSC_EN_MASK BIT(30)
  135. #define PLLDP_SS_CTRL1 0x59c
  136. #define PLLDP_SS_CTRL2 0x5a0
  137. #define PMC_PLLM_WB0_OVERRIDE 0x1dc
  138. #define PMC_PLLM_WB0_OVERRIDE_2 0x2b0
  139. #define SATA_PLL_CFG0 0x490
  140. #define SATA_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0)
  141. #define SATA_PLL_CFG0_PADPLL_USE_LOCKDET BIT(2)
  142. #define SATA_PLL_CFG0_PADPLL_SLEEP_IDDQ BIT(13)
  143. #define SATA_PLL_CFG0_SEQ_ENABLE BIT(24)
  144. #define XUSBIO_PLL_CFG0 0x51c
  145. #define XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0)
  146. #define XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL BIT(2)
  147. #define XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET BIT(6)
  148. #define XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ BIT(13)
  149. #define XUSBIO_PLL_CFG0_SEQ_ENABLE BIT(24)
  150. #define UTMIPLL_HW_PWRDN_CFG0 0x52c
  151. #define UTMIPLL_HW_PWRDN_CFG0_UTMIPLL_LOCK BIT(31)
  152. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
  153. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
  154. #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(7)
  155. #define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
  156. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
  157. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
  158. #define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
  159. #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
  160. #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
  161. #define PLLU_HW_PWRDN_CFG0 0x530
  162. #define PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(28)
  163. #define PLLU_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
  164. #define PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT BIT(7)
  165. #define PLLU_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
  166. #define PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
  167. #define PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL BIT(0)
  168. #define XUSB_PLL_CFG0 0x534
  169. #define XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY 0x3ff
  170. #define XUSB_PLL_CFG0_PLLU_LOCK_DLY_MASK (0x3ff << 14)
  171. #define SPARE_REG0 0x55c
  172. #define CLK_M_DIVISOR_SHIFT 2
  173. #define CLK_M_DIVISOR_MASK 0x3
  174. /*
  175. * SDM fractional divisor is 16-bit 2's complement signed number within
  176. * (-2^12 ... 2^12-1) range. Represented in PLL data structure as unsigned
  177. * 16-bit value, with "0" divisor mapped to 0xFFFF. Data "0" is used to
  178. * indicate that SDM is disabled.
  179. *
  180. * Effective ndiv value when SDM is enabled: ndiv + 1/2 + sdm_din/2^13
  181. */
  182. #define PLL_SDM_COEFF BIT(13)
  183. #define sdin_din_to_data(din) ((u16)((din) ? : 0xFFFFU))
  184. #define sdin_data_to_din(dat) (((dat) == 0xFFFFU) ? 0 : (s16)dat)
  185. /* Tegra CPU clock and reset control regs */
  186. #define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
  187. #ifdef CONFIG_PM_SLEEP
  188. static struct cpu_clk_suspend_context {
  189. u32 clk_csite_src;
  190. } tegra210_cpu_clk_sctx;
  191. #endif
  192. static void __iomem *clk_base;
  193. static void __iomem *pmc_base;
  194. static unsigned long osc_freq;
  195. static unsigned long pll_ref_freq;
  196. static DEFINE_SPINLOCK(pll_d_lock);
  197. static DEFINE_SPINLOCK(pll_e_lock);
  198. static DEFINE_SPINLOCK(pll_re_lock);
  199. static DEFINE_SPINLOCK(pll_u_lock);
  200. static DEFINE_SPINLOCK(emc_lock);
  201. /* possible OSC frequencies in Hz */
  202. static unsigned long tegra210_input_freq[] = {
  203. [5] = 38400000,
  204. [8] = 12000000,
  205. };
  206. static const char *mux_pllmcp_clkm[] = {
  207. "pll_m", "pll_c", "pll_p", "clk_m", "pll_m_ud", "pll_mb", "pll_mb",
  208. "pll_p",
  209. };
  210. #define mux_pllmcp_clkm_idx NULL
  211. #define PLL_ENABLE (1 << 30)
  212. #define PLLCX_MISC1_IDDQ (1 << 27)
  213. #define PLLCX_MISC0_RESET (1 << 30)
  214. #define PLLCX_MISC0_DEFAULT_VALUE 0x40080000
  215. #define PLLCX_MISC0_WRITE_MASK 0x400ffffb
  216. #define PLLCX_MISC1_DEFAULT_VALUE 0x08000000
  217. #define PLLCX_MISC1_WRITE_MASK 0x08003cff
  218. #define PLLCX_MISC2_DEFAULT_VALUE 0x1f720f05
  219. #define PLLCX_MISC2_WRITE_MASK 0xffffff17
  220. #define PLLCX_MISC3_DEFAULT_VALUE 0x000000c4
  221. #define PLLCX_MISC3_WRITE_MASK 0x00ffffff
  222. /* PLLA */
  223. #define PLLA_BASE_IDDQ (1 << 25)
  224. #define PLLA_BASE_LOCK (1 << 27)
  225. #define PLLA_MISC0_LOCK_ENABLE (1 << 28)
  226. #define PLLA_MISC0_LOCK_OVERRIDE (1 << 27)
  227. #define PLLA_MISC2_EN_SDM (1 << 26)
  228. #define PLLA_MISC2_EN_DYNRAMP (1 << 25)
  229. #define PLLA_MISC0_DEFAULT_VALUE 0x12000020
  230. #define PLLA_MISC0_WRITE_MASK 0x7fffffff
  231. #define PLLA_MISC2_DEFAULT_VALUE 0x0
  232. #define PLLA_MISC2_WRITE_MASK 0x06ffffff
  233. /* PLLD */
  234. #define PLLD_MISC0_EN_SDM (1 << 16)
  235. #define PLLD_MISC0_LOCK_OVERRIDE (1 << 17)
  236. #define PLLD_MISC0_LOCK_ENABLE (1 << 18)
  237. #define PLLD_MISC0_IDDQ (1 << 20)
  238. #define PLLD_MISC0_DSI_CLKENABLE (1 << 21)
  239. #define PLLD_MISC0_DEFAULT_VALUE 0x00140000
  240. #define PLLD_MISC0_WRITE_MASK 0x3ff7ffff
  241. #define PLLD_MISC1_DEFAULT_VALUE 0x20
  242. #define PLLD_MISC1_WRITE_MASK 0x00ffffff
  243. /* PLLD2 and PLLDP and PLLC4 */
  244. #define PLLDSS_BASE_LOCK (1 << 27)
  245. #define PLLDSS_BASE_LOCK_OVERRIDE (1 << 24)
  246. #define PLLDSS_BASE_IDDQ (1 << 18)
  247. #define PLLDSS_BASE_REF_SEL_SHIFT 25
  248. #define PLLDSS_BASE_REF_SEL_MASK (0x3 << PLLDSS_BASE_REF_SEL_SHIFT)
  249. #define PLLDSS_MISC0_LOCK_ENABLE (1 << 30)
  250. #define PLLDSS_MISC1_CFG_EN_SDM (1 << 31)
  251. #define PLLDSS_MISC1_CFG_EN_SSC (1 << 30)
  252. #define PLLD2_MISC0_DEFAULT_VALUE 0x40000020
  253. #define PLLD2_MISC1_CFG_DEFAULT_VALUE 0x10000000
  254. #define PLLD2_MISC2_CTRL1_DEFAULT_VALUE 0x0
  255. #define PLLD2_MISC3_CTRL2_DEFAULT_VALUE 0x0
  256. #define PLLDP_MISC0_DEFAULT_VALUE 0x40000020
  257. #define PLLDP_MISC1_CFG_DEFAULT_VALUE 0xc0000000
  258. #define PLLDP_MISC2_CTRL1_DEFAULT_VALUE 0xf400f0da
  259. #define PLLDP_MISC3_CTRL2_DEFAULT_VALUE 0x2004f400
  260. #define PLLDSS_MISC0_WRITE_MASK 0x47ffffff
  261. #define PLLDSS_MISC1_CFG_WRITE_MASK 0xf8000000
  262. #define PLLDSS_MISC2_CTRL1_WRITE_MASK 0xffffffff
  263. #define PLLDSS_MISC3_CTRL2_WRITE_MASK 0xffffffff
  264. #define PLLC4_MISC0_DEFAULT_VALUE 0x40000000
  265. /* PLLRE */
  266. #define PLLRE_MISC0_LOCK_ENABLE (1 << 30)
  267. #define PLLRE_MISC0_LOCK_OVERRIDE (1 << 29)
  268. #define PLLRE_MISC0_LOCK (1 << 27)
  269. #define PLLRE_MISC0_IDDQ (1 << 24)
  270. #define PLLRE_BASE_DEFAULT_VALUE 0x0
  271. #define PLLRE_MISC0_DEFAULT_VALUE 0x41000000
  272. #define PLLRE_BASE_DEFAULT_MASK 0x1c000000
  273. #define PLLRE_MISC0_WRITE_MASK 0x67ffffff
  274. /* PLLX */
  275. #define PLLX_USE_DYN_RAMP 1
  276. #define PLLX_BASE_LOCK (1 << 27)
  277. #define PLLX_MISC0_FO_G_DISABLE (0x1 << 28)
  278. #define PLLX_MISC0_LOCK_ENABLE (0x1 << 18)
  279. #define PLLX_MISC2_DYNRAMP_STEPB_SHIFT 24
  280. #define PLLX_MISC2_DYNRAMP_STEPB_MASK (0xFF << PLLX_MISC2_DYNRAMP_STEPB_SHIFT)
  281. #define PLLX_MISC2_DYNRAMP_STEPA_SHIFT 16
  282. #define PLLX_MISC2_DYNRAMP_STEPA_MASK (0xFF << PLLX_MISC2_DYNRAMP_STEPA_SHIFT)
  283. #define PLLX_MISC2_NDIV_NEW_SHIFT 8
  284. #define PLLX_MISC2_NDIV_NEW_MASK (0xFF << PLLX_MISC2_NDIV_NEW_SHIFT)
  285. #define PLLX_MISC2_LOCK_OVERRIDE (0x1 << 4)
  286. #define PLLX_MISC2_DYNRAMP_DONE (0x1 << 2)
  287. #define PLLX_MISC2_EN_DYNRAMP (0x1 << 0)
  288. #define PLLX_MISC3_IDDQ (0x1 << 3)
  289. #define PLLX_MISC0_DEFAULT_VALUE PLLX_MISC0_LOCK_ENABLE
  290. #define PLLX_MISC0_WRITE_MASK 0x10c40000
  291. #define PLLX_MISC1_DEFAULT_VALUE 0x20
  292. #define PLLX_MISC1_WRITE_MASK 0x00ffffff
  293. #define PLLX_MISC2_DEFAULT_VALUE 0x0
  294. #define PLLX_MISC2_WRITE_MASK 0xffffff11
  295. #define PLLX_MISC3_DEFAULT_VALUE PLLX_MISC3_IDDQ
  296. #define PLLX_MISC3_WRITE_MASK 0x01ff0f0f
  297. #define PLLX_MISC4_DEFAULT_VALUE 0x0
  298. #define PLLX_MISC4_WRITE_MASK 0x8000ffff
  299. #define PLLX_MISC5_DEFAULT_VALUE 0x0
  300. #define PLLX_MISC5_WRITE_MASK 0x0000ffff
  301. #define PLLX_HW_CTRL_CFG 0x548
  302. #define PLLX_HW_CTRL_CFG_SWCTRL (0x1 << 0)
  303. /* PLLMB */
  304. #define PLLMB_BASE_LOCK (1 << 27)
  305. #define PLLMB_MISC1_LOCK_OVERRIDE (1 << 18)
  306. #define PLLMB_MISC1_IDDQ (1 << 17)
  307. #define PLLMB_MISC1_LOCK_ENABLE (1 << 16)
  308. #define PLLMB_MISC1_DEFAULT_VALUE 0x00030000
  309. #define PLLMB_MISC1_WRITE_MASK 0x0007ffff
  310. /* PLLP */
  311. #define PLLP_BASE_OVERRIDE (1 << 28)
  312. #define PLLP_BASE_LOCK (1 << 27)
  313. #define PLLP_MISC0_LOCK_ENABLE (1 << 18)
  314. #define PLLP_MISC0_LOCK_OVERRIDE (1 << 17)
  315. #define PLLP_MISC0_IDDQ (1 << 3)
  316. #define PLLP_MISC1_HSIO_EN_SHIFT 29
  317. #define PLLP_MISC1_HSIO_EN (1 << PLLP_MISC1_HSIO_EN_SHIFT)
  318. #define PLLP_MISC1_XUSB_EN_SHIFT 28
  319. #define PLLP_MISC1_XUSB_EN (1 << PLLP_MISC1_XUSB_EN_SHIFT)
  320. #define PLLP_MISC0_DEFAULT_VALUE 0x00040008
  321. #define PLLP_MISC1_DEFAULT_VALUE 0x0
  322. #define PLLP_MISC0_WRITE_MASK 0xdc6000f
  323. #define PLLP_MISC1_WRITE_MASK 0x70ffffff
  324. /* PLLU */
  325. #define PLLU_BASE_LOCK (1 << 27)
  326. #define PLLU_BASE_OVERRIDE (1 << 24)
  327. #define PLLU_BASE_CLKENABLE_USB (1 << 21)
  328. #define PLLU_BASE_CLKENABLE_HSIC (1 << 22)
  329. #define PLLU_BASE_CLKENABLE_ICUSB (1 << 23)
  330. #define PLLU_BASE_CLKENABLE_48M (1 << 25)
  331. #define PLLU_BASE_CLKENABLE_ALL (PLLU_BASE_CLKENABLE_USB |\
  332. PLLU_BASE_CLKENABLE_HSIC |\
  333. PLLU_BASE_CLKENABLE_ICUSB |\
  334. PLLU_BASE_CLKENABLE_48M)
  335. #define PLLU_MISC0_IDDQ (1 << 31)
  336. #define PLLU_MISC0_LOCK_ENABLE (1 << 29)
  337. #define PLLU_MISC1_LOCK_OVERRIDE (1 << 0)
  338. #define PLLU_MISC0_DEFAULT_VALUE 0xa0000000
  339. #define PLLU_MISC1_DEFAULT_VALUE 0x0
  340. #define PLLU_MISC0_WRITE_MASK 0xbfffffff
  341. #define PLLU_MISC1_WRITE_MASK 0x00000007
  342. void tegra210_xusb_pll_hw_control_enable(void)
  343. {
  344. u32 val;
  345. val = readl_relaxed(clk_base + XUSBIO_PLL_CFG0);
  346. val &= ~(XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL |
  347. XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL);
  348. val |= XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET |
  349. XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ;
  350. writel_relaxed(val, clk_base + XUSBIO_PLL_CFG0);
  351. }
  352. EXPORT_SYMBOL_GPL(tegra210_xusb_pll_hw_control_enable);
  353. void tegra210_xusb_pll_hw_sequence_start(void)
  354. {
  355. u32 val;
  356. val = readl_relaxed(clk_base + XUSBIO_PLL_CFG0);
  357. val |= XUSBIO_PLL_CFG0_SEQ_ENABLE;
  358. writel_relaxed(val, clk_base + XUSBIO_PLL_CFG0);
  359. }
  360. EXPORT_SYMBOL_GPL(tegra210_xusb_pll_hw_sequence_start);
  361. void tegra210_sata_pll_hw_control_enable(void)
  362. {
  363. u32 val;
  364. val = readl_relaxed(clk_base + SATA_PLL_CFG0);
  365. val &= ~SATA_PLL_CFG0_PADPLL_RESET_SWCTL;
  366. val |= SATA_PLL_CFG0_PADPLL_USE_LOCKDET |
  367. SATA_PLL_CFG0_PADPLL_SLEEP_IDDQ;
  368. writel_relaxed(val, clk_base + SATA_PLL_CFG0);
  369. }
  370. EXPORT_SYMBOL_GPL(tegra210_sata_pll_hw_control_enable);
  371. void tegra210_sata_pll_hw_sequence_start(void)
  372. {
  373. u32 val;
  374. val = readl_relaxed(clk_base + SATA_PLL_CFG0);
  375. val |= SATA_PLL_CFG0_SEQ_ENABLE;
  376. writel_relaxed(val, clk_base + SATA_PLL_CFG0);
  377. }
  378. EXPORT_SYMBOL_GPL(tegra210_sata_pll_hw_sequence_start);
  379. static inline void _pll_misc_chk_default(void __iomem *base,
  380. struct tegra_clk_pll_params *params,
  381. u8 misc_num, u32 default_val, u32 mask)
  382. {
  383. u32 boot_val = readl_relaxed(base + params->ext_misc_reg[misc_num]);
  384. boot_val &= mask;
  385. default_val &= mask;
  386. if (boot_val != default_val) {
  387. pr_warn("boot misc%d 0x%x: expected 0x%x\n",
  388. misc_num, boot_val, default_val);
  389. pr_warn(" (comparison mask = 0x%x)\n", mask);
  390. params->defaults_set = false;
  391. }
  392. }
  393. /*
  394. * PLLCX: PLLC, PLLC2, PLLC3, PLLA1
  395. * Hybrid PLLs with dynamic ramp. Dynamic ramp is allowed for any transition
  396. * that changes NDIV only, while PLL is already locked.
  397. */
  398. static void pllcx_check_defaults(struct tegra_clk_pll_params *params)
  399. {
  400. u32 default_val;
  401. default_val = PLLCX_MISC0_DEFAULT_VALUE & (~PLLCX_MISC0_RESET);
  402. _pll_misc_chk_default(clk_base, params, 0, default_val,
  403. PLLCX_MISC0_WRITE_MASK);
  404. default_val = PLLCX_MISC1_DEFAULT_VALUE & (~PLLCX_MISC1_IDDQ);
  405. _pll_misc_chk_default(clk_base, params, 1, default_val,
  406. PLLCX_MISC1_WRITE_MASK);
  407. default_val = PLLCX_MISC2_DEFAULT_VALUE;
  408. _pll_misc_chk_default(clk_base, params, 2, default_val,
  409. PLLCX_MISC2_WRITE_MASK);
  410. default_val = PLLCX_MISC3_DEFAULT_VALUE;
  411. _pll_misc_chk_default(clk_base, params, 3, default_val,
  412. PLLCX_MISC3_WRITE_MASK);
  413. }
  414. static void tegra210_pllcx_set_defaults(const char *name,
  415. struct tegra_clk_pll *pllcx)
  416. {
  417. pllcx->params->defaults_set = true;
  418. if (readl_relaxed(clk_base + pllcx->params->base_reg) &
  419. PLL_ENABLE) {
  420. /* PLL is ON: only check if defaults already set */
  421. pllcx_check_defaults(pllcx->params);
  422. pr_warn("%s already enabled. Postponing set full defaults\n",
  423. name);
  424. return;
  425. }
  426. /* Defaults assert PLL reset, and set IDDQ */
  427. writel_relaxed(PLLCX_MISC0_DEFAULT_VALUE,
  428. clk_base + pllcx->params->ext_misc_reg[0]);
  429. writel_relaxed(PLLCX_MISC1_DEFAULT_VALUE,
  430. clk_base + pllcx->params->ext_misc_reg[1]);
  431. writel_relaxed(PLLCX_MISC2_DEFAULT_VALUE,
  432. clk_base + pllcx->params->ext_misc_reg[2]);
  433. writel_relaxed(PLLCX_MISC3_DEFAULT_VALUE,
  434. clk_base + pllcx->params->ext_misc_reg[3]);
  435. udelay(1);
  436. }
  437. static void _pllc_set_defaults(struct tegra_clk_pll *pllcx)
  438. {
  439. tegra210_pllcx_set_defaults("PLL_C", pllcx);
  440. }
  441. static void _pllc2_set_defaults(struct tegra_clk_pll *pllcx)
  442. {
  443. tegra210_pllcx_set_defaults("PLL_C2", pllcx);
  444. }
  445. static void _pllc3_set_defaults(struct tegra_clk_pll *pllcx)
  446. {
  447. tegra210_pllcx_set_defaults("PLL_C3", pllcx);
  448. }
  449. static void _plla1_set_defaults(struct tegra_clk_pll *pllcx)
  450. {
  451. tegra210_pllcx_set_defaults("PLL_A1", pllcx);
  452. }
  453. /*
  454. * PLLA
  455. * PLL with dynamic ramp and fractional SDM. Dynamic ramp is not used.
  456. * Fractional SDM is allowed to provide exact audio rates.
  457. */
  458. static void tegra210_plla_set_defaults(struct tegra_clk_pll *plla)
  459. {
  460. u32 mask;
  461. u32 val = readl_relaxed(clk_base + plla->params->base_reg);
  462. plla->params->defaults_set = true;
  463. if (val & PLL_ENABLE) {
  464. /*
  465. * PLL is ON: check if defaults already set, then set those
  466. * that can be updated in flight.
  467. */
  468. if (val & PLLA_BASE_IDDQ) {
  469. pr_warn("PLL_A boot enabled with IDDQ set\n");
  470. plla->params->defaults_set = false;
  471. }
  472. pr_warn("PLL_A already enabled. Postponing set full defaults\n");
  473. val = PLLA_MISC0_DEFAULT_VALUE; /* ignore lock enable */
  474. mask = PLLA_MISC0_LOCK_ENABLE | PLLA_MISC0_LOCK_OVERRIDE;
  475. _pll_misc_chk_default(clk_base, plla->params, 0, val,
  476. ~mask & PLLA_MISC0_WRITE_MASK);
  477. val = PLLA_MISC2_DEFAULT_VALUE; /* ignore all but control bit */
  478. _pll_misc_chk_default(clk_base, plla->params, 2, val,
  479. PLLA_MISC2_EN_DYNRAMP);
  480. /* Enable lock detect */
  481. val = readl_relaxed(clk_base + plla->params->ext_misc_reg[0]);
  482. val &= ~mask;
  483. val |= PLLA_MISC0_DEFAULT_VALUE & mask;
  484. writel_relaxed(val, clk_base + plla->params->ext_misc_reg[0]);
  485. udelay(1);
  486. return;
  487. }
  488. /* set IDDQ, enable lock detect, disable dynamic ramp and SDM */
  489. val |= PLLA_BASE_IDDQ;
  490. writel_relaxed(val, clk_base + plla->params->base_reg);
  491. writel_relaxed(PLLA_MISC0_DEFAULT_VALUE,
  492. clk_base + plla->params->ext_misc_reg[0]);
  493. writel_relaxed(PLLA_MISC2_DEFAULT_VALUE,
  494. clk_base + plla->params->ext_misc_reg[2]);
  495. udelay(1);
  496. }
  497. /*
  498. * PLLD
  499. * PLL with fractional SDM.
  500. */
  501. static void tegra210_plld_set_defaults(struct tegra_clk_pll *plld)
  502. {
  503. u32 val;
  504. u32 mask = 0xffff;
  505. plld->params->defaults_set = true;
  506. if (readl_relaxed(clk_base + plld->params->base_reg) &
  507. PLL_ENABLE) {
  508. pr_warn("PLL_D already enabled. Postponing set full defaults\n");
  509. /*
  510. * PLL is ON: check if defaults already set, then set those
  511. * that can be updated in flight.
  512. */
  513. val = PLLD_MISC1_DEFAULT_VALUE;
  514. _pll_misc_chk_default(clk_base, plld->params, 1,
  515. val, PLLD_MISC1_WRITE_MASK);
  516. /* ignore lock, DSI and SDM controls, make sure IDDQ not set */
  517. val = PLLD_MISC0_DEFAULT_VALUE & (~PLLD_MISC0_IDDQ);
  518. mask |= PLLD_MISC0_DSI_CLKENABLE | PLLD_MISC0_LOCK_ENABLE |
  519. PLLD_MISC0_LOCK_OVERRIDE | PLLD_MISC0_EN_SDM;
  520. _pll_misc_chk_default(clk_base, plld->params, 0, val,
  521. ~mask & PLLD_MISC0_WRITE_MASK);
  522. /* Enable lock detect */
  523. mask = PLLD_MISC0_LOCK_ENABLE | PLLD_MISC0_LOCK_OVERRIDE;
  524. val = readl_relaxed(clk_base + plld->params->ext_misc_reg[0]);
  525. val &= ~mask;
  526. val |= PLLD_MISC0_DEFAULT_VALUE & mask;
  527. writel_relaxed(val, clk_base + plld->params->ext_misc_reg[0]);
  528. udelay(1);
  529. return;
  530. }
  531. val = readl_relaxed(clk_base + plld->params->ext_misc_reg[0]);
  532. val &= PLLD_MISC0_DSI_CLKENABLE;
  533. val |= PLLD_MISC0_DEFAULT_VALUE;
  534. /* set IDDQ, enable lock detect, disable SDM */
  535. writel_relaxed(val, clk_base + plld->params->ext_misc_reg[0]);
  536. writel_relaxed(PLLD_MISC1_DEFAULT_VALUE, clk_base +
  537. plld->params->ext_misc_reg[1]);
  538. udelay(1);
  539. }
  540. /*
  541. * PLLD2, PLLDP
  542. * PLL with fractional SDM and Spread Spectrum (SDM is a must if SSC is used).
  543. */
  544. static void plldss_defaults(const char *pll_name, struct tegra_clk_pll *plldss,
  545. u32 misc0_val, u32 misc1_val, u32 misc2_val, u32 misc3_val)
  546. {
  547. u32 default_val;
  548. u32 val = readl_relaxed(clk_base + plldss->params->base_reg);
  549. plldss->params->defaults_set = true;
  550. if (val & PLL_ENABLE) {
  551. pr_warn("%s already enabled. Postponing set full defaults\n",
  552. pll_name);
  553. /*
  554. * PLL is ON: check if defaults already set, then set those
  555. * that can be updated in flight.
  556. */
  557. if (val & PLLDSS_BASE_IDDQ) {
  558. pr_warn("plldss boot enabled with IDDQ set\n");
  559. plldss->params->defaults_set = false;
  560. }
  561. /* ignore lock enable */
  562. default_val = misc0_val;
  563. _pll_misc_chk_default(clk_base, plldss->params, 0, default_val,
  564. PLLDSS_MISC0_WRITE_MASK &
  565. (~PLLDSS_MISC0_LOCK_ENABLE));
  566. /*
  567. * If SSC is used, check all settings, otherwise just confirm
  568. * that SSC is not used on boot as well. Do nothing when using
  569. * this function for PLLC4 that has only MISC0.
  570. */
  571. if (plldss->params->ssc_ctrl_en_mask) {
  572. default_val = misc1_val;
  573. _pll_misc_chk_default(clk_base, plldss->params, 1,
  574. default_val, PLLDSS_MISC1_CFG_WRITE_MASK);
  575. default_val = misc2_val;
  576. _pll_misc_chk_default(clk_base, plldss->params, 2,
  577. default_val, PLLDSS_MISC2_CTRL1_WRITE_MASK);
  578. default_val = misc3_val;
  579. _pll_misc_chk_default(clk_base, plldss->params, 3,
  580. default_val, PLLDSS_MISC3_CTRL2_WRITE_MASK);
  581. } else if (plldss->params->ext_misc_reg[1]) {
  582. default_val = misc1_val;
  583. _pll_misc_chk_default(clk_base, plldss->params, 1,
  584. default_val, PLLDSS_MISC1_CFG_WRITE_MASK &
  585. (~PLLDSS_MISC1_CFG_EN_SDM));
  586. }
  587. /* Enable lock detect */
  588. if (val & PLLDSS_BASE_LOCK_OVERRIDE) {
  589. val &= ~PLLDSS_BASE_LOCK_OVERRIDE;
  590. writel_relaxed(val, clk_base +
  591. plldss->params->base_reg);
  592. }
  593. val = readl_relaxed(clk_base + plldss->params->ext_misc_reg[0]);
  594. val &= ~PLLDSS_MISC0_LOCK_ENABLE;
  595. val |= misc0_val & PLLDSS_MISC0_LOCK_ENABLE;
  596. writel_relaxed(val, clk_base + plldss->params->ext_misc_reg[0]);
  597. udelay(1);
  598. return;
  599. }
  600. /* set IDDQ, enable lock detect, configure SDM/SSC */
  601. val |= PLLDSS_BASE_IDDQ;
  602. val &= ~PLLDSS_BASE_LOCK_OVERRIDE;
  603. writel_relaxed(val, clk_base + plldss->params->base_reg);
  604. /* When using this function for PLLC4 exit here */
  605. if (!plldss->params->ext_misc_reg[1]) {
  606. writel_relaxed(misc0_val, clk_base +
  607. plldss->params->ext_misc_reg[0]);
  608. udelay(1);
  609. return;
  610. }
  611. writel_relaxed(misc0_val, clk_base +
  612. plldss->params->ext_misc_reg[0]);
  613. /* if SSC used set by 1st enable */
  614. writel_relaxed(misc1_val & (~PLLDSS_MISC1_CFG_EN_SSC),
  615. clk_base + plldss->params->ext_misc_reg[1]);
  616. writel_relaxed(misc2_val, clk_base + plldss->params->ext_misc_reg[2]);
  617. writel_relaxed(misc3_val, clk_base + plldss->params->ext_misc_reg[3]);
  618. udelay(1);
  619. }
  620. static void tegra210_plld2_set_defaults(struct tegra_clk_pll *plld2)
  621. {
  622. plldss_defaults("PLL_D2", plld2, PLLD2_MISC0_DEFAULT_VALUE,
  623. PLLD2_MISC1_CFG_DEFAULT_VALUE,
  624. PLLD2_MISC2_CTRL1_DEFAULT_VALUE,
  625. PLLD2_MISC3_CTRL2_DEFAULT_VALUE);
  626. }
  627. static void tegra210_plldp_set_defaults(struct tegra_clk_pll *plldp)
  628. {
  629. plldss_defaults("PLL_DP", plldp, PLLDP_MISC0_DEFAULT_VALUE,
  630. PLLDP_MISC1_CFG_DEFAULT_VALUE,
  631. PLLDP_MISC2_CTRL1_DEFAULT_VALUE,
  632. PLLDP_MISC3_CTRL2_DEFAULT_VALUE);
  633. }
  634. /*
  635. * PLLC4
  636. * Base and misc0 layout is the same as PLLD2/PLLDP, but no SDM/SSC support.
  637. * VCO is exposed to the clock tree via fixed 1/3 and 1/5 dividers.
  638. */
  639. static void tegra210_pllc4_set_defaults(struct tegra_clk_pll *pllc4)
  640. {
  641. plldss_defaults("PLL_C4", pllc4, PLLC4_MISC0_DEFAULT_VALUE, 0, 0, 0);
  642. }
  643. /*
  644. * PLLRE
  645. * VCO is exposed to the clock tree directly along with post-divider output
  646. */
  647. static void tegra210_pllre_set_defaults(struct tegra_clk_pll *pllre)
  648. {
  649. u32 mask;
  650. u32 val = readl_relaxed(clk_base + pllre->params->base_reg);
  651. pllre->params->defaults_set = true;
  652. if (val & PLL_ENABLE) {
  653. pr_warn("PLL_RE already enabled. Postponing set full defaults\n");
  654. /*
  655. * PLL is ON: check if defaults already set, then set those
  656. * that can be updated in flight.
  657. */
  658. val &= PLLRE_BASE_DEFAULT_MASK;
  659. if (val != PLLRE_BASE_DEFAULT_VALUE) {
  660. pr_warn("pllre boot base 0x%x : expected 0x%x\n",
  661. val, PLLRE_BASE_DEFAULT_VALUE);
  662. pr_warn("(comparison mask = 0x%x)\n",
  663. PLLRE_BASE_DEFAULT_MASK);
  664. pllre->params->defaults_set = false;
  665. }
  666. /* Ignore lock enable */
  667. val = PLLRE_MISC0_DEFAULT_VALUE & (~PLLRE_MISC0_IDDQ);
  668. mask = PLLRE_MISC0_LOCK_ENABLE | PLLRE_MISC0_LOCK_OVERRIDE;
  669. _pll_misc_chk_default(clk_base, pllre->params, 0, val,
  670. ~mask & PLLRE_MISC0_WRITE_MASK);
  671. /* Enable lock detect */
  672. val = readl_relaxed(clk_base + pllre->params->ext_misc_reg[0]);
  673. val &= ~mask;
  674. val |= PLLRE_MISC0_DEFAULT_VALUE & mask;
  675. writel_relaxed(val, clk_base + pllre->params->ext_misc_reg[0]);
  676. udelay(1);
  677. return;
  678. }
  679. /* set IDDQ, enable lock detect */
  680. val &= ~PLLRE_BASE_DEFAULT_MASK;
  681. val |= PLLRE_BASE_DEFAULT_VALUE & PLLRE_BASE_DEFAULT_MASK;
  682. writel_relaxed(val, clk_base + pllre->params->base_reg);
  683. writel_relaxed(PLLRE_MISC0_DEFAULT_VALUE,
  684. clk_base + pllre->params->ext_misc_reg[0]);
  685. udelay(1);
  686. }
  687. static void pllx_get_dyn_steps(struct clk_hw *hw, u32 *step_a, u32 *step_b)
  688. {
  689. unsigned long input_rate;
  690. /* cf rate */
  691. if (!IS_ERR_OR_NULL(hw->clk))
  692. input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
  693. else
  694. input_rate = 38400000;
  695. input_rate /= tegra_pll_get_fixed_mdiv(hw, input_rate);
  696. switch (input_rate) {
  697. case 12000000:
  698. case 12800000:
  699. case 13000000:
  700. *step_a = 0x2B;
  701. *step_b = 0x0B;
  702. return;
  703. case 19200000:
  704. *step_a = 0x12;
  705. *step_b = 0x08;
  706. return;
  707. case 38400000:
  708. *step_a = 0x04;
  709. *step_b = 0x05;
  710. return;
  711. default:
  712. pr_err("%s: Unexpected reference rate %lu\n",
  713. __func__, input_rate);
  714. BUG();
  715. }
  716. }
  717. static void pllx_check_defaults(struct tegra_clk_pll *pll)
  718. {
  719. u32 default_val;
  720. default_val = PLLX_MISC0_DEFAULT_VALUE;
  721. /* ignore lock enable */
  722. _pll_misc_chk_default(clk_base, pll->params, 0, default_val,
  723. PLLX_MISC0_WRITE_MASK & (~PLLX_MISC0_LOCK_ENABLE));
  724. default_val = PLLX_MISC1_DEFAULT_VALUE;
  725. _pll_misc_chk_default(clk_base, pll->params, 1, default_val,
  726. PLLX_MISC1_WRITE_MASK);
  727. /* ignore all but control bit */
  728. default_val = PLLX_MISC2_DEFAULT_VALUE;
  729. _pll_misc_chk_default(clk_base, pll->params, 2,
  730. default_val, PLLX_MISC2_EN_DYNRAMP);
  731. default_val = PLLX_MISC3_DEFAULT_VALUE & (~PLLX_MISC3_IDDQ);
  732. _pll_misc_chk_default(clk_base, pll->params, 3, default_val,
  733. PLLX_MISC3_WRITE_MASK);
  734. default_val = PLLX_MISC4_DEFAULT_VALUE;
  735. _pll_misc_chk_default(clk_base, pll->params, 4, default_val,
  736. PLLX_MISC4_WRITE_MASK);
  737. default_val = PLLX_MISC5_DEFAULT_VALUE;
  738. _pll_misc_chk_default(clk_base, pll->params, 5, default_val,
  739. PLLX_MISC5_WRITE_MASK);
  740. }
  741. static void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx)
  742. {
  743. u32 val;
  744. u32 step_a, step_b;
  745. pllx->params->defaults_set = true;
  746. /* Get ready dyn ramp state machine settings */
  747. pllx_get_dyn_steps(&pllx->hw, &step_a, &step_b);
  748. val = PLLX_MISC2_DEFAULT_VALUE & (~PLLX_MISC2_DYNRAMP_STEPA_MASK) &
  749. (~PLLX_MISC2_DYNRAMP_STEPB_MASK);
  750. val |= step_a << PLLX_MISC2_DYNRAMP_STEPA_SHIFT;
  751. val |= step_b << PLLX_MISC2_DYNRAMP_STEPB_SHIFT;
  752. if (readl_relaxed(clk_base + pllx->params->base_reg) & PLL_ENABLE) {
  753. pr_warn("PLL_X already enabled. Postponing set full defaults\n");
  754. /*
  755. * PLL is ON: check if defaults already set, then set those
  756. * that can be updated in flight.
  757. */
  758. pllx_check_defaults(pllx);
  759. /* Configure dyn ramp, disable lock override */
  760. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  761. /* Enable lock detect */
  762. val = readl_relaxed(clk_base + pllx->params->ext_misc_reg[0]);
  763. val &= ~PLLX_MISC0_LOCK_ENABLE;
  764. val |= PLLX_MISC0_DEFAULT_VALUE & PLLX_MISC0_LOCK_ENABLE;
  765. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[0]);
  766. udelay(1);
  767. return;
  768. }
  769. /* Enable lock detect and CPU output */
  770. writel_relaxed(PLLX_MISC0_DEFAULT_VALUE, clk_base +
  771. pllx->params->ext_misc_reg[0]);
  772. /* Setup */
  773. writel_relaxed(PLLX_MISC1_DEFAULT_VALUE, clk_base +
  774. pllx->params->ext_misc_reg[1]);
  775. /* Configure dyn ramp state machine, disable lock override */
  776. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  777. /* Set IDDQ */
  778. writel_relaxed(PLLX_MISC3_DEFAULT_VALUE, clk_base +
  779. pllx->params->ext_misc_reg[3]);
  780. /* Disable SDM */
  781. writel_relaxed(PLLX_MISC4_DEFAULT_VALUE, clk_base +
  782. pllx->params->ext_misc_reg[4]);
  783. writel_relaxed(PLLX_MISC5_DEFAULT_VALUE, clk_base +
  784. pllx->params->ext_misc_reg[5]);
  785. udelay(1);
  786. }
  787. /* PLLMB */
  788. static void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
  789. {
  790. u32 mask, val = readl_relaxed(clk_base + pllmb->params->base_reg);
  791. pllmb->params->defaults_set = true;
  792. if (val & PLL_ENABLE) {
  793. pr_warn("PLL_MB already enabled. Postponing set full defaults\n");
  794. /*
  795. * PLL is ON: check if defaults already set, then set those
  796. * that can be updated in flight.
  797. */
  798. val = PLLMB_MISC1_DEFAULT_VALUE & (~PLLMB_MISC1_IDDQ);
  799. mask = PLLMB_MISC1_LOCK_ENABLE | PLLMB_MISC1_LOCK_OVERRIDE;
  800. _pll_misc_chk_default(clk_base, pllmb->params, 0, val,
  801. ~mask & PLLMB_MISC1_WRITE_MASK);
  802. /* Enable lock detect */
  803. val = readl_relaxed(clk_base + pllmb->params->ext_misc_reg[0]);
  804. val &= ~mask;
  805. val |= PLLMB_MISC1_DEFAULT_VALUE & mask;
  806. writel_relaxed(val, clk_base + pllmb->params->ext_misc_reg[0]);
  807. udelay(1);
  808. return;
  809. }
  810. /* set IDDQ, enable lock detect */
  811. writel_relaxed(PLLMB_MISC1_DEFAULT_VALUE,
  812. clk_base + pllmb->params->ext_misc_reg[0]);
  813. udelay(1);
  814. }
  815. /*
  816. * PLLP
  817. * VCO is exposed to the clock tree directly along with post-divider output.
  818. * Both VCO and post-divider output rates are fixed at 408MHz and 204MHz,
  819. * respectively.
  820. */
  821. static void pllp_check_defaults(struct tegra_clk_pll *pll, bool enabled)
  822. {
  823. u32 val, mask;
  824. /* Ignore lock enable (will be set), make sure not in IDDQ if enabled */
  825. val = PLLP_MISC0_DEFAULT_VALUE & (~PLLP_MISC0_IDDQ);
  826. mask = PLLP_MISC0_LOCK_ENABLE | PLLP_MISC0_LOCK_OVERRIDE;
  827. if (!enabled)
  828. mask |= PLLP_MISC0_IDDQ;
  829. _pll_misc_chk_default(clk_base, pll->params, 0, val,
  830. ~mask & PLLP_MISC0_WRITE_MASK);
  831. /* Ignore branch controls */
  832. val = PLLP_MISC1_DEFAULT_VALUE;
  833. mask = PLLP_MISC1_HSIO_EN | PLLP_MISC1_XUSB_EN;
  834. _pll_misc_chk_default(clk_base, pll->params, 1, val,
  835. ~mask & PLLP_MISC1_WRITE_MASK);
  836. }
  837. static void tegra210_pllp_set_defaults(struct tegra_clk_pll *pllp)
  838. {
  839. u32 mask;
  840. u32 val = readl_relaxed(clk_base + pllp->params->base_reg);
  841. pllp->params->defaults_set = true;
  842. if (val & PLL_ENABLE) {
  843. pr_warn("PLL_P already enabled. Postponing set full defaults\n");
  844. /*
  845. * PLL is ON: check if defaults already set, then set those
  846. * that can be updated in flight.
  847. */
  848. pllp_check_defaults(pllp, true);
  849. /* Enable lock detect */
  850. val = readl_relaxed(clk_base + pllp->params->ext_misc_reg[0]);
  851. mask = PLLP_MISC0_LOCK_ENABLE | PLLP_MISC0_LOCK_OVERRIDE;
  852. val &= ~mask;
  853. val |= PLLP_MISC0_DEFAULT_VALUE & mask;
  854. writel_relaxed(val, clk_base + pllp->params->ext_misc_reg[0]);
  855. udelay(1);
  856. return;
  857. }
  858. /* set IDDQ, enable lock detect */
  859. writel_relaxed(PLLP_MISC0_DEFAULT_VALUE,
  860. clk_base + pllp->params->ext_misc_reg[0]);
  861. /* Preserve branch control */
  862. val = readl_relaxed(clk_base + pllp->params->ext_misc_reg[1]);
  863. mask = PLLP_MISC1_HSIO_EN | PLLP_MISC1_XUSB_EN;
  864. val &= mask;
  865. val |= ~mask & PLLP_MISC1_DEFAULT_VALUE;
  866. writel_relaxed(val, clk_base + pllp->params->ext_misc_reg[1]);
  867. udelay(1);
  868. }
  869. /*
  870. * PLLU
  871. * VCO is exposed to the clock tree directly along with post-divider output.
  872. * Both VCO and post-divider output rates are fixed at 480MHz and 240MHz,
  873. * respectively.
  874. */
  875. static void pllu_check_defaults(struct tegra_clk_pll *pll, bool hw_control)
  876. {
  877. u32 val, mask;
  878. /* Ignore lock enable (will be set) and IDDQ if under h/w control */
  879. val = PLLU_MISC0_DEFAULT_VALUE & (~PLLU_MISC0_IDDQ);
  880. mask = PLLU_MISC0_LOCK_ENABLE | (hw_control ? PLLU_MISC0_IDDQ : 0);
  881. _pll_misc_chk_default(clk_base, pll->params, 0, val,
  882. ~mask & PLLU_MISC0_WRITE_MASK);
  883. val = PLLU_MISC1_DEFAULT_VALUE;
  884. mask = PLLU_MISC1_LOCK_OVERRIDE;
  885. _pll_misc_chk_default(clk_base, pll->params, 1, val,
  886. ~mask & PLLU_MISC1_WRITE_MASK);
  887. }
  888. static void tegra210_pllu_set_defaults(struct tegra_clk_pll *pllu)
  889. {
  890. u32 val = readl_relaxed(clk_base + pllu->params->base_reg);
  891. pllu->params->defaults_set = true;
  892. if (val & PLL_ENABLE) {
  893. pr_warn("PLL_U already enabled. Postponing set full defaults\n");
  894. /*
  895. * PLL is ON: check if defaults already set, then set those
  896. * that can be updated in flight.
  897. */
  898. pllu_check_defaults(pllu, false);
  899. /* Enable lock detect */
  900. val = readl_relaxed(clk_base + pllu->params->ext_misc_reg[0]);
  901. val &= ~PLLU_MISC0_LOCK_ENABLE;
  902. val |= PLLU_MISC0_DEFAULT_VALUE & PLLU_MISC0_LOCK_ENABLE;
  903. writel_relaxed(val, clk_base + pllu->params->ext_misc_reg[0]);
  904. val = readl_relaxed(clk_base + pllu->params->ext_misc_reg[1]);
  905. val &= ~PLLU_MISC1_LOCK_OVERRIDE;
  906. val |= PLLU_MISC1_DEFAULT_VALUE & PLLU_MISC1_LOCK_OVERRIDE;
  907. writel_relaxed(val, clk_base + pllu->params->ext_misc_reg[1]);
  908. udelay(1);
  909. return;
  910. }
  911. /* set IDDQ, enable lock detect */
  912. writel_relaxed(PLLU_MISC0_DEFAULT_VALUE,
  913. clk_base + pllu->params->ext_misc_reg[0]);
  914. writel_relaxed(PLLU_MISC1_DEFAULT_VALUE,
  915. clk_base + pllu->params->ext_misc_reg[1]);
  916. udelay(1);
  917. }
  918. #define mask(w) ((1 << (w)) - 1)
  919. #define divm_mask(p) mask(p->params->div_nmp->divm_width)
  920. #define divn_mask(p) mask(p->params->div_nmp->divn_width)
  921. #define divp_mask(p) (p->params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :\
  922. mask(p->params->div_nmp->divp_width))
  923. #define divm_shift(p) ((p)->params->div_nmp->divm_shift)
  924. #define divn_shift(p) ((p)->params->div_nmp->divn_shift)
  925. #define divp_shift(p) ((p)->params->div_nmp->divp_shift)
  926. #define divm_mask_shifted(p) (divm_mask(p) << divm_shift(p))
  927. #define divn_mask_shifted(p) (divn_mask(p) << divn_shift(p))
  928. #define divp_mask_shifted(p) (divp_mask(p) << divp_shift(p))
  929. #define PLL_LOCKDET_DELAY 2 /* Lock detection safety delays */
  930. static int tegra210_wait_for_mask(struct tegra_clk_pll *pll,
  931. u32 reg, u32 mask)
  932. {
  933. int i;
  934. u32 val = 0;
  935. for (i = 0; i < pll->params->lock_delay / PLL_LOCKDET_DELAY + 1; i++) {
  936. udelay(PLL_LOCKDET_DELAY);
  937. val = readl_relaxed(clk_base + reg);
  938. if ((val & mask) == mask) {
  939. udelay(PLL_LOCKDET_DELAY);
  940. return 0;
  941. }
  942. }
  943. return -ETIMEDOUT;
  944. }
  945. static int tegra210_pllx_dyn_ramp(struct tegra_clk_pll *pllx,
  946. struct tegra_clk_pll_freq_table *cfg)
  947. {
  948. u32 val, base, ndiv_new_mask;
  949. ndiv_new_mask = (divn_mask(pllx) >> pllx->params->div_nmp->divn_shift)
  950. << PLLX_MISC2_NDIV_NEW_SHIFT;
  951. val = readl_relaxed(clk_base + pllx->params->ext_misc_reg[2]);
  952. val &= (~ndiv_new_mask);
  953. val |= cfg->n << PLLX_MISC2_NDIV_NEW_SHIFT;
  954. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  955. udelay(1);
  956. val = readl_relaxed(clk_base + pllx->params->ext_misc_reg[2]);
  957. val |= PLLX_MISC2_EN_DYNRAMP;
  958. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  959. udelay(1);
  960. tegra210_wait_for_mask(pllx, pllx->params->ext_misc_reg[2],
  961. PLLX_MISC2_DYNRAMP_DONE);
  962. base = readl_relaxed(clk_base + pllx->params->base_reg) &
  963. (~divn_mask_shifted(pllx));
  964. base |= cfg->n << pllx->params->div_nmp->divn_shift;
  965. writel_relaxed(base, clk_base + pllx->params->base_reg);
  966. udelay(1);
  967. val &= ~PLLX_MISC2_EN_DYNRAMP;
  968. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  969. udelay(1);
  970. pr_debug("%s: dynamic ramp to m = %u n = %u p = %u, Fout = %lu kHz\n",
  971. __clk_get_name(pllx->hw.clk), cfg->m, cfg->n, cfg->p,
  972. cfg->input_rate / cfg->m * cfg->n /
  973. pllx->params->pdiv_tohw[cfg->p].pdiv / 1000);
  974. return 0;
  975. }
  976. /*
  977. * Common configuration for PLLs with fixed input divider policy:
  978. * - always set fixed M-value based on the reference rate
  979. * - always set P-value value 1:1 for output rates above VCO minimum, and
  980. * choose minimum necessary P-value for output rates below VCO maximum
  981. * - calculate N-value based on selected M and P
  982. * - calculate SDM_DIN fractional part
  983. */
  984. static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
  985. struct tegra_clk_pll_freq_table *cfg,
  986. unsigned long rate, unsigned long input_rate)
  987. {
  988. struct tegra_clk_pll *pll = to_clk_pll(hw);
  989. struct tegra_clk_pll_params *params = pll->params;
  990. int p;
  991. unsigned long cf, p_rate;
  992. u32 pdiv;
  993. if (!rate)
  994. return -EINVAL;
  995. if (!(params->flags & TEGRA_PLL_VCO_OUT)) {
  996. p = DIV_ROUND_UP(params->vco_min, rate);
  997. p = params->round_p_to_pdiv(p, &pdiv);
  998. } else {
  999. p = rate >= params->vco_min ? 1 : -EINVAL;
  1000. }
  1001. if (p < 0)
  1002. return -EINVAL;
  1003. cfg->m = tegra_pll_get_fixed_mdiv(hw, input_rate);
  1004. cfg->p = p;
  1005. /* Store P as HW value, as that is what is expected */
  1006. cfg->p = tegra_pll_p_div_to_hw(pll, cfg->p);
  1007. p_rate = rate * p;
  1008. if (p_rate > params->vco_max)
  1009. p_rate = params->vco_max;
  1010. cf = input_rate / cfg->m;
  1011. cfg->n = p_rate / cf;
  1012. cfg->sdm_data = 0;
  1013. if (params->sdm_ctrl_reg) {
  1014. unsigned long rem = p_rate - cf * cfg->n;
  1015. /* If ssc is enabled SDM enabled as well, even for integer n */
  1016. if (rem || params->ssc_ctrl_reg) {
  1017. u64 s = rem * PLL_SDM_COEFF;
  1018. do_div(s, cf);
  1019. s -= PLL_SDM_COEFF / 2;
  1020. cfg->sdm_data = sdin_din_to_data(s);
  1021. }
  1022. }
  1023. cfg->input_rate = input_rate;
  1024. cfg->output_rate = rate;
  1025. return 0;
  1026. }
  1027. /*
  1028. * clk_pll_set_gain - set gain to m, n to calculate correct VCO rate
  1029. *
  1030. * @cfg: struct tegra_clk_pll_freq_table * cfg
  1031. *
  1032. * For Normal mode:
  1033. * Fvco = Fref * NDIV / MDIV
  1034. *
  1035. * For fractional mode:
  1036. * Fvco = Fref * (NDIV + 0.5 + SDM_DIN / PLL_SDM_COEFF) / MDIV
  1037. */
  1038. static void tegra210_clk_pll_set_gain(struct tegra_clk_pll_freq_table *cfg)
  1039. {
  1040. cfg->n = cfg->n * PLL_SDM_COEFF + PLL_SDM_COEFF/2 +
  1041. sdin_data_to_din(cfg->sdm_data);
  1042. cfg->m *= PLL_SDM_COEFF;
  1043. }
  1044. static unsigned long
  1045. tegra210_clk_adjust_vco_min(struct tegra_clk_pll_params *params,
  1046. unsigned long parent_rate)
  1047. {
  1048. unsigned long vco_min = params->vco_min;
  1049. params->vco_min += DIV_ROUND_UP(parent_rate, PLL_SDM_COEFF);
  1050. vco_min = min(vco_min, params->vco_min);
  1051. return vco_min;
  1052. }
  1053. static struct div_nmp pllx_nmp = {
  1054. .divm_shift = 0,
  1055. .divm_width = 8,
  1056. .divn_shift = 8,
  1057. .divn_width = 8,
  1058. .divp_shift = 20,
  1059. .divp_width = 5,
  1060. };
  1061. /*
  1062. * PLL post divider maps - two types: quasi-linear and exponential
  1063. * post divider.
  1064. */
  1065. #define PLL_QLIN_PDIV_MAX 16
  1066. static const struct pdiv_map pll_qlin_pdiv_to_hw[] = {
  1067. { .pdiv = 1, .hw_val = 0 },
  1068. { .pdiv = 2, .hw_val = 1 },
  1069. { .pdiv = 3, .hw_val = 2 },
  1070. { .pdiv = 4, .hw_val = 3 },
  1071. { .pdiv = 5, .hw_val = 4 },
  1072. { .pdiv = 6, .hw_val = 5 },
  1073. { .pdiv = 8, .hw_val = 6 },
  1074. { .pdiv = 9, .hw_val = 7 },
  1075. { .pdiv = 10, .hw_val = 8 },
  1076. { .pdiv = 12, .hw_val = 9 },
  1077. { .pdiv = 15, .hw_val = 10 },
  1078. { .pdiv = 16, .hw_val = 11 },
  1079. { .pdiv = 18, .hw_val = 12 },
  1080. { .pdiv = 20, .hw_val = 13 },
  1081. { .pdiv = 24, .hw_val = 14 },
  1082. { .pdiv = 30, .hw_val = 15 },
  1083. { .pdiv = 32, .hw_val = 16 },
  1084. };
  1085. static u32 pll_qlin_p_to_pdiv(u32 p, u32 *pdiv)
  1086. {
  1087. int i;
  1088. if (p) {
  1089. for (i = 0; i <= PLL_QLIN_PDIV_MAX; i++) {
  1090. if (p <= pll_qlin_pdiv_to_hw[i].pdiv) {
  1091. if (pdiv)
  1092. *pdiv = i;
  1093. return pll_qlin_pdiv_to_hw[i].pdiv;
  1094. }
  1095. }
  1096. }
  1097. return -EINVAL;
  1098. }
  1099. #define PLL_EXPO_PDIV_MAX 7
  1100. static const struct pdiv_map pll_expo_pdiv_to_hw[] = {
  1101. { .pdiv = 1, .hw_val = 0 },
  1102. { .pdiv = 2, .hw_val = 1 },
  1103. { .pdiv = 4, .hw_val = 2 },
  1104. { .pdiv = 8, .hw_val = 3 },
  1105. { .pdiv = 16, .hw_val = 4 },
  1106. { .pdiv = 32, .hw_val = 5 },
  1107. { .pdiv = 64, .hw_val = 6 },
  1108. { .pdiv = 128, .hw_val = 7 },
  1109. };
  1110. static u32 pll_expo_p_to_pdiv(u32 p, u32 *pdiv)
  1111. {
  1112. if (p) {
  1113. u32 i = fls(p);
  1114. if (i == ffs(p))
  1115. i--;
  1116. if (i <= PLL_EXPO_PDIV_MAX) {
  1117. if (pdiv)
  1118. *pdiv = i;
  1119. return 1 << i;
  1120. }
  1121. }
  1122. return -EINVAL;
  1123. }
  1124. static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
  1125. /* 1 GHz */
  1126. { 12000000, 1000000000, 166, 1, 2, 0 }, /* actual: 996.0 MHz */
  1127. { 13000000, 1000000000, 153, 1, 2, 0 }, /* actual: 994.0 MHz */
  1128. { 38400000, 1000000000, 156, 3, 2, 0 }, /* actual: 998.4 MHz */
  1129. { 0, 0, 0, 0, 0, 0 },
  1130. };
  1131. static struct tegra_clk_pll_params pll_x_params = {
  1132. .input_min = 12000000,
  1133. .input_max = 800000000,
  1134. .cf_min = 12000000,
  1135. .cf_max = 38400000,
  1136. .vco_min = 1350000000,
  1137. .vco_max = 3000000000UL,
  1138. .base_reg = PLLX_BASE,
  1139. .misc_reg = PLLX_MISC0,
  1140. .lock_mask = PLL_BASE_LOCK,
  1141. .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
  1142. .lock_delay = 300,
  1143. .ext_misc_reg[0] = PLLX_MISC0,
  1144. .ext_misc_reg[1] = PLLX_MISC1,
  1145. .ext_misc_reg[2] = PLLX_MISC2,
  1146. .ext_misc_reg[3] = PLLX_MISC3,
  1147. .ext_misc_reg[4] = PLLX_MISC4,
  1148. .ext_misc_reg[5] = PLLX_MISC5,
  1149. .iddq_reg = PLLX_MISC3,
  1150. .iddq_bit_idx = PLLXP_IDDQ_BIT,
  1151. .max_p = PLL_QLIN_PDIV_MAX,
  1152. .mdiv_default = 2,
  1153. .dyn_ramp_reg = PLLX_MISC2,
  1154. .stepa_shift = 16,
  1155. .stepb_shift = 24,
  1156. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1157. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1158. .div_nmp = &pllx_nmp,
  1159. .freq_table = pll_x_freq_table,
  1160. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
  1161. .dyn_ramp = tegra210_pllx_dyn_ramp,
  1162. .set_defaults = tegra210_pllx_set_defaults,
  1163. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1164. };
  1165. static struct div_nmp pllc_nmp = {
  1166. .divm_shift = 0,
  1167. .divm_width = 8,
  1168. .divn_shift = 10,
  1169. .divn_width = 8,
  1170. .divp_shift = 20,
  1171. .divp_width = 5,
  1172. };
  1173. static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = {
  1174. { 12000000, 510000000, 85, 1, 2, 0 },
  1175. { 13000000, 510000000, 78, 1, 2, 0 }, /* actual: 507.0 MHz */
  1176. { 38400000, 510000000, 79, 3, 2, 0 }, /* actual: 505.6 MHz */
  1177. { 0, 0, 0, 0, 0, 0 },
  1178. };
  1179. static struct tegra_clk_pll_params pll_c_params = {
  1180. .input_min = 12000000,
  1181. .input_max = 700000000,
  1182. .cf_min = 12000000,
  1183. .cf_max = 50000000,
  1184. .vco_min = 600000000,
  1185. .vco_max = 1200000000,
  1186. .base_reg = PLLC_BASE,
  1187. .misc_reg = PLLC_MISC0,
  1188. .lock_mask = PLL_BASE_LOCK,
  1189. .lock_delay = 300,
  1190. .iddq_reg = PLLC_MISC1,
  1191. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1192. .reset_reg = PLLC_MISC0,
  1193. .reset_bit_idx = PLLCX_RESET_BIT,
  1194. .max_p = PLL_QLIN_PDIV_MAX,
  1195. .ext_misc_reg[0] = PLLC_MISC0,
  1196. .ext_misc_reg[1] = PLLC_MISC1,
  1197. .ext_misc_reg[2] = PLLC_MISC2,
  1198. .ext_misc_reg[3] = PLLC_MISC3,
  1199. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1200. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1201. .mdiv_default = 3,
  1202. .div_nmp = &pllc_nmp,
  1203. .freq_table = pll_cx_freq_table,
  1204. .flags = TEGRA_PLL_USE_LOCK,
  1205. .set_defaults = _pllc_set_defaults,
  1206. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1207. };
  1208. static struct div_nmp pllcx_nmp = {
  1209. .divm_shift = 0,
  1210. .divm_width = 8,
  1211. .divn_shift = 10,
  1212. .divn_width = 8,
  1213. .divp_shift = 20,
  1214. .divp_width = 5,
  1215. };
  1216. static struct tegra_clk_pll_params pll_c2_params = {
  1217. .input_min = 12000000,
  1218. .input_max = 700000000,
  1219. .cf_min = 12000000,
  1220. .cf_max = 50000000,
  1221. .vco_min = 600000000,
  1222. .vco_max = 1200000000,
  1223. .base_reg = PLLC2_BASE,
  1224. .misc_reg = PLLC2_MISC0,
  1225. .iddq_reg = PLLC2_MISC1,
  1226. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1227. .reset_reg = PLLC2_MISC0,
  1228. .reset_bit_idx = PLLCX_RESET_BIT,
  1229. .lock_mask = PLLCX_BASE_LOCK,
  1230. .lock_delay = 300,
  1231. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1232. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1233. .mdiv_default = 3,
  1234. .div_nmp = &pllcx_nmp,
  1235. .max_p = PLL_QLIN_PDIV_MAX,
  1236. .ext_misc_reg[0] = PLLC2_MISC0,
  1237. .ext_misc_reg[1] = PLLC2_MISC1,
  1238. .ext_misc_reg[2] = PLLC2_MISC2,
  1239. .ext_misc_reg[3] = PLLC2_MISC3,
  1240. .freq_table = pll_cx_freq_table,
  1241. .flags = TEGRA_PLL_USE_LOCK,
  1242. .set_defaults = _pllc2_set_defaults,
  1243. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1244. };
  1245. static struct tegra_clk_pll_params pll_c3_params = {
  1246. .input_min = 12000000,
  1247. .input_max = 700000000,
  1248. .cf_min = 12000000,
  1249. .cf_max = 50000000,
  1250. .vco_min = 600000000,
  1251. .vco_max = 1200000000,
  1252. .base_reg = PLLC3_BASE,
  1253. .misc_reg = PLLC3_MISC0,
  1254. .lock_mask = PLLCX_BASE_LOCK,
  1255. .lock_delay = 300,
  1256. .iddq_reg = PLLC3_MISC1,
  1257. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1258. .reset_reg = PLLC3_MISC0,
  1259. .reset_bit_idx = PLLCX_RESET_BIT,
  1260. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1261. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1262. .mdiv_default = 3,
  1263. .div_nmp = &pllcx_nmp,
  1264. .max_p = PLL_QLIN_PDIV_MAX,
  1265. .ext_misc_reg[0] = PLLC3_MISC0,
  1266. .ext_misc_reg[1] = PLLC3_MISC1,
  1267. .ext_misc_reg[2] = PLLC3_MISC2,
  1268. .ext_misc_reg[3] = PLLC3_MISC3,
  1269. .freq_table = pll_cx_freq_table,
  1270. .flags = TEGRA_PLL_USE_LOCK,
  1271. .set_defaults = _pllc3_set_defaults,
  1272. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1273. };
  1274. static struct div_nmp pllss_nmp = {
  1275. .divm_shift = 0,
  1276. .divm_width = 8,
  1277. .divn_shift = 8,
  1278. .divn_width = 8,
  1279. .divp_shift = 19,
  1280. .divp_width = 5,
  1281. };
  1282. static struct tegra_clk_pll_freq_table pll_c4_vco_freq_table[] = {
  1283. { 12000000, 600000000, 50, 1, 1, 0 },
  1284. { 13000000, 600000000, 46, 1, 1, 0 }, /* actual: 598.0 MHz */
  1285. { 38400000, 600000000, 62, 4, 1, 0 }, /* actual: 595.2 MHz */
  1286. { 0, 0, 0, 0, 0, 0 },
  1287. };
  1288. static const struct clk_div_table pll_vco_post_div_table[] = {
  1289. { .val = 0, .div = 1 },
  1290. { .val = 1, .div = 2 },
  1291. { .val = 2, .div = 3 },
  1292. { .val = 3, .div = 4 },
  1293. { .val = 4, .div = 5 },
  1294. { .val = 5, .div = 6 },
  1295. { .val = 6, .div = 8 },
  1296. { .val = 7, .div = 10 },
  1297. { .val = 8, .div = 12 },
  1298. { .val = 9, .div = 16 },
  1299. { .val = 10, .div = 12 },
  1300. { .val = 11, .div = 16 },
  1301. { .val = 12, .div = 20 },
  1302. { .val = 13, .div = 24 },
  1303. { .val = 14, .div = 32 },
  1304. { .val = 0, .div = 0 },
  1305. };
  1306. static struct tegra_clk_pll_params pll_c4_vco_params = {
  1307. .input_min = 9600000,
  1308. .input_max = 800000000,
  1309. .cf_min = 9600000,
  1310. .cf_max = 19200000,
  1311. .vco_min = 500000000,
  1312. .vco_max = 1080000000,
  1313. .base_reg = PLLC4_BASE,
  1314. .misc_reg = PLLC4_MISC0,
  1315. .lock_mask = PLL_BASE_LOCK,
  1316. .lock_delay = 300,
  1317. .max_p = PLL_QLIN_PDIV_MAX,
  1318. .ext_misc_reg[0] = PLLC4_MISC0,
  1319. .iddq_reg = PLLC4_BASE,
  1320. .iddq_bit_idx = PLLSS_IDDQ_BIT,
  1321. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1322. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1323. .mdiv_default = 3,
  1324. .div_nmp = &pllss_nmp,
  1325. .freq_table = pll_c4_vco_freq_table,
  1326. .set_defaults = tegra210_pllc4_set_defaults,
  1327. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
  1328. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1329. };
  1330. static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
  1331. { 12000000, 800000000, 66, 1, 1, 0 }, /* actual: 792.0 MHz */
  1332. { 13000000, 800000000, 61, 1, 1, 0 }, /* actual: 793.0 MHz */
  1333. { 38400000, 297600000, 93, 4, 3, 0 },
  1334. { 38400000, 400000000, 125, 4, 3, 0 },
  1335. { 38400000, 532800000, 111, 4, 2, 0 },
  1336. { 38400000, 665600000, 104, 3, 2, 0 },
  1337. { 38400000, 800000000, 125, 3, 2, 0 },
  1338. { 38400000, 931200000, 97, 4, 1, 0 },
  1339. { 38400000, 1065600000, 111, 4, 1, 0 },
  1340. { 38400000, 1200000000, 125, 4, 1, 0 },
  1341. { 38400000, 1331200000, 104, 3, 1, 0 },
  1342. { 38400000, 1459200000, 76, 2, 1, 0 },
  1343. { 38400000, 1600000000, 125, 3, 1, 0 },
  1344. { 0, 0, 0, 0, 0, 0 },
  1345. };
  1346. static struct div_nmp pllm_nmp = {
  1347. .divm_shift = 0,
  1348. .divm_width = 8,
  1349. .override_divm_shift = 0,
  1350. .divn_shift = 8,
  1351. .divn_width = 8,
  1352. .override_divn_shift = 8,
  1353. .divp_shift = 20,
  1354. .divp_width = 5,
  1355. .override_divp_shift = 27,
  1356. };
  1357. static struct tegra_clk_pll_params pll_m_params = {
  1358. .input_min = 9600000,
  1359. .input_max = 500000000,
  1360. .cf_min = 9600000,
  1361. .cf_max = 19200000,
  1362. .vco_min = 800000000,
  1363. .vco_max = 1866000000,
  1364. .base_reg = PLLM_BASE,
  1365. .misc_reg = PLLM_MISC2,
  1366. .lock_mask = PLL_BASE_LOCK,
  1367. .lock_enable_bit_idx = PLLM_MISC_LOCK_ENABLE,
  1368. .lock_delay = 300,
  1369. .iddq_reg = PLLM_MISC2,
  1370. .iddq_bit_idx = PLLM_IDDQ_BIT,
  1371. .max_p = PLL_QLIN_PDIV_MAX,
  1372. .ext_misc_reg[0] = PLLM_MISC2,
  1373. .ext_misc_reg[1] = PLLM_MISC1,
  1374. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1375. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1376. .div_nmp = &pllm_nmp,
  1377. .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE,
  1378. .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2,
  1379. .freq_table = pll_m_freq_table,
  1380. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
  1381. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1382. };
  1383. static struct tegra_clk_pll_params pll_mb_params = {
  1384. .input_min = 9600000,
  1385. .input_max = 500000000,
  1386. .cf_min = 9600000,
  1387. .cf_max = 19200000,
  1388. .vco_min = 800000000,
  1389. .vco_max = 1866000000,
  1390. .base_reg = PLLMB_BASE,
  1391. .misc_reg = PLLMB_MISC1,
  1392. .lock_mask = PLL_BASE_LOCK,
  1393. .lock_delay = 300,
  1394. .iddq_reg = PLLMB_MISC1,
  1395. .iddq_bit_idx = PLLMB_IDDQ_BIT,
  1396. .max_p = PLL_QLIN_PDIV_MAX,
  1397. .ext_misc_reg[0] = PLLMB_MISC1,
  1398. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1399. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1400. .div_nmp = &pllm_nmp,
  1401. .freq_table = pll_m_freq_table,
  1402. .flags = TEGRA_PLL_USE_LOCK,
  1403. .set_defaults = tegra210_pllmb_set_defaults,
  1404. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1405. };
  1406. static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
  1407. /* PLLE special case: use cpcon field to store cml divider value */
  1408. { 672000000, 100000000, 125, 42, 0, 13 },
  1409. { 624000000, 100000000, 125, 39, 0, 13 },
  1410. { 336000000, 100000000, 125, 21, 0, 13 },
  1411. { 312000000, 100000000, 200, 26, 0, 14 },
  1412. { 38400000, 100000000, 125, 2, 0, 14 },
  1413. { 12000000, 100000000, 200, 1, 0, 14 },
  1414. { 0, 0, 0, 0, 0, 0 },
  1415. };
  1416. static struct div_nmp plle_nmp = {
  1417. .divm_shift = 0,
  1418. .divm_width = 8,
  1419. .divn_shift = 8,
  1420. .divn_width = 8,
  1421. .divp_shift = 24,
  1422. .divp_width = 5,
  1423. };
  1424. static struct tegra_clk_pll_params pll_e_params = {
  1425. .input_min = 12000000,
  1426. .input_max = 800000000,
  1427. .cf_min = 12000000,
  1428. .cf_max = 38400000,
  1429. .vco_min = 1600000000,
  1430. .vco_max = 2500000000U,
  1431. .base_reg = PLLE_BASE,
  1432. .misc_reg = PLLE_MISC0,
  1433. .aux_reg = PLLE_AUX,
  1434. .lock_mask = PLLE_MISC_LOCK,
  1435. .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
  1436. .lock_delay = 300,
  1437. .div_nmp = &plle_nmp,
  1438. .freq_table = pll_e_freq_table,
  1439. .flags = TEGRA_PLL_FIXED | TEGRA_PLL_LOCK_MISC | TEGRA_PLL_USE_LOCK |
  1440. TEGRA_PLL_HAS_LOCK_ENABLE,
  1441. .fixed_rate = 100000000,
  1442. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1443. };
  1444. static struct tegra_clk_pll_freq_table pll_re_vco_freq_table[] = {
  1445. { 12000000, 672000000, 56, 1, 1, 0 },
  1446. { 13000000, 672000000, 51, 1, 1, 0 }, /* actual: 663.0 MHz */
  1447. { 38400000, 672000000, 70, 4, 1, 0 },
  1448. { 0, 0, 0, 0, 0, 0 },
  1449. };
  1450. static struct div_nmp pllre_nmp = {
  1451. .divm_shift = 0,
  1452. .divm_width = 8,
  1453. .divn_shift = 8,
  1454. .divn_width = 8,
  1455. .divp_shift = 16,
  1456. .divp_width = 5,
  1457. };
  1458. static struct tegra_clk_pll_params pll_re_vco_params = {
  1459. .input_min = 9600000,
  1460. .input_max = 800000000,
  1461. .cf_min = 9600000,
  1462. .cf_max = 19200000,
  1463. .vco_min = 350000000,
  1464. .vco_max = 700000000,
  1465. .base_reg = PLLRE_BASE,
  1466. .misc_reg = PLLRE_MISC0,
  1467. .lock_mask = PLLRE_MISC_LOCK,
  1468. .lock_delay = 300,
  1469. .max_p = PLL_QLIN_PDIV_MAX,
  1470. .ext_misc_reg[0] = PLLRE_MISC0,
  1471. .iddq_reg = PLLRE_MISC0,
  1472. .iddq_bit_idx = PLLRE_IDDQ_BIT,
  1473. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1474. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1475. .div_nmp = &pllre_nmp,
  1476. .freq_table = pll_re_vco_freq_table,
  1477. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_LOCK_MISC | TEGRA_PLL_VCO_OUT,
  1478. .set_defaults = tegra210_pllre_set_defaults,
  1479. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1480. };
  1481. static struct div_nmp pllp_nmp = {
  1482. .divm_shift = 0,
  1483. .divm_width = 8,
  1484. .divn_shift = 10,
  1485. .divn_width = 8,
  1486. .divp_shift = 20,
  1487. .divp_width = 5,
  1488. };
  1489. static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
  1490. { 12000000, 408000000, 34, 1, 1, 0 },
  1491. { 38400000, 408000000, 85, 8, 1, 0 }, /* cf = 4.8MHz, allowed exception */
  1492. { 0, 0, 0, 0, 0, 0 },
  1493. };
  1494. static struct tegra_clk_pll_params pll_p_params = {
  1495. .input_min = 9600000,
  1496. .input_max = 800000000,
  1497. .cf_min = 9600000,
  1498. .cf_max = 19200000,
  1499. .vco_min = 350000000,
  1500. .vco_max = 700000000,
  1501. .base_reg = PLLP_BASE,
  1502. .misc_reg = PLLP_MISC0,
  1503. .lock_mask = PLL_BASE_LOCK,
  1504. .lock_delay = 300,
  1505. .iddq_reg = PLLP_MISC0,
  1506. .iddq_bit_idx = PLLXP_IDDQ_BIT,
  1507. .ext_misc_reg[0] = PLLP_MISC0,
  1508. .ext_misc_reg[1] = PLLP_MISC1,
  1509. .div_nmp = &pllp_nmp,
  1510. .freq_table = pll_p_freq_table,
  1511. .fixed_rate = 408000000,
  1512. .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
  1513. .set_defaults = tegra210_pllp_set_defaults,
  1514. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1515. };
  1516. static struct tegra_clk_pll_params pll_a1_params = {
  1517. .input_min = 12000000,
  1518. .input_max = 700000000,
  1519. .cf_min = 12000000,
  1520. .cf_max = 50000000,
  1521. .vco_min = 600000000,
  1522. .vco_max = 1200000000,
  1523. .base_reg = PLLA1_BASE,
  1524. .misc_reg = PLLA1_MISC0,
  1525. .lock_mask = PLLCX_BASE_LOCK,
  1526. .lock_delay = 300,
  1527. .iddq_reg = PLLA1_MISC0,
  1528. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1529. .reset_reg = PLLA1_MISC0,
  1530. .reset_bit_idx = PLLCX_RESET_BIT,
  1531. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1532. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1533. .div_nmp = &pllc_nmp,
  1534. .ext_misc_reg[0] = PLLA1_MISC0,
  1535. .ext_misc_reg[1] = PLLA1_MISC1,
  1536. .ext_misc_reg[2] = PLLA1_MISC2,
  1537. .ext_misc_reg[3] = PLLA1_MISC3,
  1538. .freq_table = pll_cx_freq_table,
  1539. .flags = TEGRA_PLL_USE_LOCK,
  1540. .set_defaults = _plla1_set_defaults,
  1541. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1542. };
  1543. static struct div_nmp plla_nmp = {
  1544. .divm_shift = 0,
  1545. .divm_width = 8,
  1546. .divn_shift = 8,
  1547. .divn_width = 8,
  1548. .divp_shift = 20,
  1549. .divp_width = 5,
  1550. };
  1551. static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
  1552. { 12000000, 282240000, 47, 1, 2, 1, 0xf148 }, /* actual: 282240234 */
  1553. { 12000000, 368640000, 61, 1, 2, 1, 0xfe15 }, /* actual: 368640381 */
  1554. { 12000000, 240000000, 60, 1, 3, 1, 0 },
  1555. { 13000000, 282240000, 43, 1, 2, 1, 0xfd7d }, /* actual: 282239807 */
  1556. { 13000000, 368640000, 56, 1, 2, 1, 0x06d8 }, /* actual: 368640137 */
  1557. { 13000000, 240000000, 55, 1, 3, 1, 0 }, /* actual: 238.3 MHz */
  1558. { 38400000, 282240000, 44, 3, 2, 1, 0xf333 }, /* actual: 282239844 */
  1559. { 38400000, 368640000, 57, 3, 2, 1, 0x0333 }, /* actual: 368639844 */
  1560. { 38400000, 240000000, 75, 3, 3, 1, 0 },
  1561. { 0, 0, 0, 0, 0, 0, 0 },
  1562. };
  1563. static struct tegra_clk_pll_params pll_a_params = {
  1564. .input_min = 12000000,
  1565. .input_max = 800000000,
  1566. .cf_min = 12000000,
  1567. .cf_max = 19200000,
  1568. .vco_min = 500000000,
  1569. .vco_max = 1000000000,
  1570. .base_reg = PLLA_BASE,
  1571. .misc_reg = PLLA_MISC0,
  1572. .lock_mask = PLL_BASE_LOCK,
  1573. .lock_delay = 300,
  1574. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1575. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1576. .iddq_reg = PLLA_BASE,
  1577. .iddq_bit_idx = PLLA_IDDQ_BIT,
  1578. .div_nmp = &plla_nmp,
  1579. .sdm_din_reg = PLLA_MISC1,
  1580. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1581. .sdm_ctrl_reg = PLLA_MISC2,
  1582. .sdm_ctrl_en_mask = PLLA_SDM_EN_MASK,
  1583. .ext_misc_reg[0] = PLLA_MISC0,
  1584. .ext_misc_reg[1] = PLLA_MISC1,
  1585. .ext_misc_reg[2] = PLLA_MISC2,
  1586. .freq_table = pll_a_freq_table,
  1587. .flags = TEGRA_PLL_USE_LOCK | TEGRA_MDIV_NEW,
  1588. .set_defaults = tegra210_plla_set_defaults,
  1589. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1590. .set_gain = tegra210_clk_pll_set_gain,
  1591. .adjust_vco = tegra210_clk_adjust_vco_min,
  1592. };
  1593. static struct div_nmp plld_nmp = {
  1594. .divm_shift = 0,
  1595. .divm_width = 8,
  1596. .divn_shift = 11,
  1597. .divn_width = 8,
  1598. .divp_shift = 20,
  1599. .divp_width = 3,
  1600. };
  1601. static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
  1602. { 12000000, 594000000, 99, 1, 2, 0, 0 },
  1603. { 13000000, 594000000, 91, 1, 2, 0, 0xfc4f }, /* actual: 594000183 */
  1604. { 38400000, 594000000, 30, 1, 2, 0, 0x0e00 },
  1605. { 0, 0, 0, 0, 0, 0, 0 },
  1606. };
  1607. static struct tegra_clk_pll_params pll_d_params = {
  1608. .input_min = 12000000,
  1609. .input_max = 800000000,
  1610. .cf_min = 12000000,
  1611. .cf_max = 38400000,
  1612. .vco_min = 750000000,
  1613. .vco_max = 1500000000,
  1614. .base_reg = PLLD_BASE,
  1615. .misc_reg = PLLD_MISC0,
  1616. .lock_mask = PLL_BASE_LOCK,
  1617. .lock_delay = 1000,
  1618. .iddq_reg = PLLD_MISC0,
  1619. .iddq_bit_idx = PLLD_IDDQ_BIT,
  1620. .round_p_to_pdiv = pll_expo_p_to_pdiv,
  1621. .pdiv_tohw = pll_expo_pdiv_to_hw,
  1622. .div_nmp = &plld_nmp,
  1623. .sdm_din_reg = PLLD_MISC0,
  1624. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1625. .sdm_ctrl_reg = PLLD_MISC0,
  1626. .sdm_ctrl_en_mask = PLLD_SDM_EN_MASK,
  1627. .ext_misc_reg[0] = PLLD_MISC0,
  1628. .ext_misc_reg[1] = PLLD_MISC1,
  1629. .freq_table = pll_d_freq_table,
  1630. .flags = TEGRA_PLL_USE_LOCK,
  1631. .mdiv_default = 1,
  1632. .set_defaults = tegra210_plld_set_defaults,
  1633. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1634. .set_gain = tegra210_clk_pll_set_gain,
  1635. .adjust_vco = tegra210_clk_adjust_vco_min,
  1636. };
  1637. static struct tegra_clk_pll_freq_table tegra210_pll_d2_freq_table[] = {
  1638. { 12000000, 594000000, 99, 1, 2, 0, 0xf000 },
  1639. { 13000000, 594000000, 91, 1, 2, 0, 0xfc4f }, /* actual: 594000183 */
  1640. { 38400000, 594000000, 30, 1, 2, 0, 0x0e00 },
  1641. { 0, 0, 0, 0, 0, 0, 0 },
  1642. };
  1643. /* s/w policy, always tegra_pll_ref */
  1644. static struct tegra_clk_pll_params pll_d2_params = {
  1645. .input_min = 12000000,
  1646. .input_max = 800000000,
  1647. .cf_min = 12000000,
  1648. .cf_max = 38400000,
  1649. .vco_min = 750000000,
  1650. .vco_max = 1500000000,
  1651. .base_reg = PLLD2_BASE,
  1652. .misc_reg = PLLD2_MISC0,
  1653. .lock_mask = PLL_BASE_LOCK,
  1654. .lock_delay = 300,
  1655. .iddq_reg = PLLD2_BASE,
  1656. .iddq_bit_idx = PLLSS_IDDQ_BIT,
  1657. .sdm_din_reg = PLLD2_MISC3,
  1658. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1659. .sdm_ctrl_reg = PLLD2_MISC1,
  1660. .sdm_ctrl_en_mask = PLLD2_SDM_EN_MASK,
  1661. /* disable spread-spectrum for pll_d2 */
  1662. .ssc_ctrl_reg = 0,
  1663. .ssc_ctrl_en_mask = 0,
  1664. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1665. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1666. .div_nmp = &pllss_nmp,
  1667. .ext_misc_reg[0] = PLLD2_MISC0,
  1668. .ext_misc_reg[1] = PLLD2_MISC1,
  1669. .ext_misc_reg[2] = PLLD2_MISC2,
  1670. .ext_misc_reg[3] = PLLD2_MISC3,
  1671. .max_p = PLL_QLIN_PDIV_MAX,
  1672. .mdiv_default = 1,
  1673. .freq_table = tegra210_pll_d2_freq_table,
  1674. .set_defaults = tegra210_plld2_set_defaults,
  1675. .flags = TEGRA_PLL_USE_LOCK,
  1676. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1677. .set_gain = tegra210_clk_pll_set_gain,
  1678. .adjust_vco = tegra210_clk_adjust_vco_min,
  1679. };
  1680. static struct tegra_clk_pll_freq_table pll_dp_freq_table[] = {
  1681. { 12000000, 270000000, 90, 1, 4, 0, 0xf000 },
  1682. { 13000000, 270000000, 83, 1, 4, 0, 0xf000 }, /* actual: 269.8 MHz */
  1683. { 38400000, 270000000, 28, 1, 4, 0, 0xf400 },
  1684. { 0, 0, 0, 0, 0, 0, 0 },
  1685. };
  1686. static struct tegra_clk_pll_params pll_dp_params = {
  1687. .input_min = 12000000,
  1688. .input_max = 800000000,
  1689. .cf_min = 12000000,
  1690. .cf_max = 38400000,
  1691. .vco_min = 750000000,
  1692. .vco_max = 1500000000,
  1693. .base_reg = PLLDP_BASE,
  1694. .misc_reg = PLLDP_MISC,
  1695. .lock_mask = PLL_BASE_LOCK,
  1696. .lock_delay = 300,
  1697. .iddq_reg = PLLDP_BASE,
  1698. .iddq_bit_idx = PLLSS_IDDQ_BIT,
  1699. .sdm_din_reg = PLLDP_SS_CTRL2,
  1700. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1701. .sdm_ctrl_reg = PLLDP_SS_CFG,
  1702. .sdm_ctrl_en_mask = PLLDP_SDM_EN_MASK,
  1703. .ssc_ctrl_reg = PLLDP_SS_CFG,
  1704. .ssc_ctrl_en_mask = PLLDP_SSC_EN_MASK,
  1705. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1706. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1707. .div_nmp = &pllss_nmp,
  1708. .ext_misc_reg[0] = PLLDP_MISC,
  1709. .ext_misc_reg[1] = PLLDP_SS_CFG,
  1710. .ext_misc_reg[2] = PLLDP_SS_CTRL1,
  1711. .ext_misc_reg[3] = PLLDP_SS_CTRL2,
  1712. .max_p = PLL_QLIN_PDIV_MAX,
  1713. .mdiv_default = 1,
  1714. .freq_table = pll_dp_freq_table,
  1715. .set_defaults = tegra210_plldp_set_defaults,
  1716. .flags = TEGRA_PLL_USE_LOCK,
  1717. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1718. .set_gain = tegra210_clk_pll_set_gain,
  1719. .adjust_vco = tegra210_clk_adjust_vco_min,
  1720. };
  1721. static struct div_nmp pllu_nmp = {
  1722. .divm_shift = 0,
  1723. .divm_width = 8,
  1724. .divn_shift = 8,
  1725. .divn_width = 8,
  1726. .divp_shift = 16,
  1727. .divp_width = 5,
  1728. };
  1729. static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
  1730. { 12000000, 480000000, 40, 1, 1, 0 },
  1731. { 13000000, 480000000, 36, 1, 1, 0 }, /* actual: 468.0 MHz */
  1732. { 38400000, 480000000, 25, 2, 1, 0 },
  1733. { 0, 0, 0, 0, 0, 0 },
  1734. };
  1735. static struct tegra_clk_pll_params pll_u_vco_params = {
  1736. .input_min = 9600000,
  1737. .input_max = 800000000,
  1738. .cf_min = 9600000,
  1739. .cf_max = 19200000,
  1740. .vco_min = 350000000,
  1741. .vco_max = 700000000,
  1742. .base_reg = PLLU_BASE,
  1743. .misc_reg = PLLU_MISC0,
  1744. .lock_mask = PLL_BASE_LOCK,
  1745. .lock_delay = 1000,
  1746. .iddq_reg = PLLU_MISC0,
  1747. .iddq_bit_idx = PLLU_IDDQ_BIT,
  1748. .ext_misc_reg[0] = PLLU_MISC0,
  1749. .ext_misc_reg[1] = PLLU_MISC1,
  1750. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1751. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1752. .div_nmp = &pllu_nmp,
  1753. .freq_table = pll_u_freq_table,
  1754. .flags = TEGRA_PLLU | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
  1755. .set_defaults = tegra210_pllu_set_defaults,
  1756. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1757. };
  1758. static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
  1759. [tegra_clk_ispb] = { .dt_id = TEGRA210_CLK_ISPB, .present = true },
  1760. [tegra_clk_rtc] = { .dt_id = TEGRA210_CLK_RTC, .present = true },
  1761. [tegra_clk_timer] = { .dt_id = TEGRA210_CLK_TIMER, .present = true },
  1762. [tegra_clk_uarta_8] = { .dt_id = TEGRA210_CLK_UARTA, .present = true },
  1763. [tegra_clk_sdmmc2_9] = { .dt_id = TEGRA210_CLK_SDMMC2, .present = true },
  1764. [tegra_clk_i2s1] = { .dt_id = TEGRA210_CLK_I2S1, .present = true },
  1765. [tegra_clk_i2c1] = { .dt_id = TEGRA210_CLK_I2C1, .present = true },
  1766. [tegra_clk_sdmmc1_9] = { .dt_id = TEGRA210_CLK_SDMMC1, .present = true },
  1767. [tegra_clk_sdmmc4_9] = { .dt_id = TEGRA210_CLK_SDMMC4, .present = true },
  1768. [tegra_clk_pwm] = { .dt_id = TEGRA210_CLK_PWM, .present = true },
  1769. [tegra_clk_i2s2] = { .dt_id = TEGRA210_CLK_I2S2, .present = true },
  1770. [tegra_clk_usbd] = { .dt_id = TEGRA210_CLK_USBD, .present = true },
  1771. [tegra_clk_isp_9] = { .dt_id = TEGRA210_CLK_ISP, .present = true },
  1772. [tegra_clk_disp2_8] = { .dt_id = TEGRA210_CLK_DISP2, .present = true },
  1773. [tegra_clk_disp1_8] = { .dt_id = TEGRA210_CLK_DISP1, .present = true },
  1774. [tegra_clk_host1x_9] = { .dt_id = TEGRA210_CLK_HOST1X, .present = true },
  1775. [tegra_clk_i2s0] = { .dt_id = TEGRA210_CLK_I2S0, .present = true },
  1776. [tegra_clk_apbdma] = { .dt_id = TEGRA210_CLK_APBDMA, .present = true },
  1777. [tegra_clk_kfuse] = { .dt_id = TEGRA210_CLK_KFUSE, .present = true },
  1778. [tegra_clk_sbc1_9] = { .dt_id = TEGRA210_CLK_SBC1, .present = true },
  1779. [tegra_clk_sbc2_9] = { .dt_id = TEGRA210_CLK_SBC2, .present = true },
  1780. [tegra_clk_sbc3_9] = { .dt_id = TEGRA210_CLK_SBC3, .present = true },
  1781. [tegra_clk_i2c5] = { .dt_id = TEGRA210_CLK_I2C5, .present = true },
  1782. [tegra_clk_csi] = { .dt_id = TEGRA210_CLK_CSI, .present = true },
  1783. [tegra_clk_i2c2] = { .dt_id = TEGRA210_CLK_I2C2, .present = true },
  1784. [tegra_clk_uartc_8] = { .dt_id = TEGRA210_CLK_UARTC, .present = true },
  1785. [tegra_clk_mipi_cal] = { .dt_id = TEGRA210_CLK_MIPI_CAL, .present = true },
  1786. [tegra_clk_emc] = { .dt_id = TEGRA210_CLK_EMC, .present = true },
  1787. [tegra_clk_usb2] = { .dt_id = TEGRA210_CLK_USB2, .present = true },
  1788. [tegra_clk_bsev] = { .dt_id = TEGRA210_CLK_BSEV, .present = true },
  1789. [tegra_clk_uartd_8] = { .dt_id = TEGRA210_CLK_UARTD, .present = true },
  1790. [tegra_clk_i2c3] = { .dt_id = TEGRA210_CLK_I2C3, .present = true },
  1791. [tegra_clk_sbc4_9] = { .dt_id = TEGRA210_CLK_SBC4, .present = true },
  1792. [tegra_clk_sdmmc3_9] = { .dt_id = TEGRA210_CLK_SDMMC3, .present = true },
  1793. [tegra_clk_pcie] = { .dt_id = TEGRA210_CLK_PCIE, .present = true },
  1794. [tegra_clk_owr_8] = { .dt_id = TEGRA210_CLK_OWR, .present = true },
  1795. [tegra_clk_afi] = { .dt_id = TEGRA210_CLK_AFI, .present = true },
  1796. [tegra_clk_csite_8] = { .dt_id = TEGRA210_CLK_CSITE, .present = true },
  1797. [tegra_clk_soc_therm_8] = { .dt_id = TEGRA210_CLK_SOC_THERM, .present = true },
  1798. [tegra_clk_dtv] = { .dt_id = TEGRA210_CLK_DTV, .present = true },
  1799. [tegra_clk_i2cslow] = { .dt_id = TEGRA210_CLK_I2CSLOW, .present = true },
  1800. [tegra_clk_tsec_8] = { .dt_id = TEGRA210_CLK_TSEC, .present = true },
  1801. [tegra_clk_xusb_host] = { .dt_id = TEGRA210_CLK_XUSB_HOST, .present = true },
  1802. [tegra_clk_csus] = { .dt_id = TEGRA210_CLK_CSUS, .present = true },
  1803. [tegra_clk_mselect] = { .dt_id = TEGRA210_CLK_MSELECT, .present = true },
  1804. [tegra_clk_tsensor] = { .dt_id = TEGRA210_CLK_TSENSOR, .present = true },
  1805. [tegra_clk_i2s3] = { .dt_id = TEGRA210_CLK_I2S3, .present = true },
  1806. [tegra_clk_i2s4] = { .dt_id = TEGRA210_CLK_I2S4, .present = true },
  1807. [tegra_clk_i2c4] = { .dt_id = TEGRA210_CLK_I2C4, .present = true },
  1808. [tegra_clk_d_audio] = { .dt_id = TEGRA210_CLK_D_AUDIO, .present = true },
  1809. [tegra_clk_hda2codec_2x_8] = { .dt_id = TEGRA210_CLK_HDA2CODEC_2X, .present = true },
  1810. [tegra_clk_spdif_2x] = { .dt_id = TEGRA210_CLK_SPDIF_2X, .present = true },
  1811. [tegra_clk_actmon] = { .dt_id = TEGRA210_CLK_ACTMON, .present = true },
  1812. [tegra_clk_extern1] = { .dt_id = TEGRA210_CLK_EXTERN1, .present = true },
  1813. [tegra_clk_extern2] = { .dt_id = TEGRA210_CLK_EXTERN2, .present = true },
  1814. [tegra_clk_extern3] = { .dt_id = TEGRA210_CLK_EXTERN3, .present = true },
  1815. [tegra_clk_sata_oob_8] = { .dt_id = TEGRA210_CLK_SATA_OOB, .present = true },
  1816. [tegra_clk_sata_8] = { .dt_id = TEGRA210_CLK_SATA, .present = true },
  1817. [tegra_clk_hda_8] = { .dt_id = TEGRA210_CLK_HDA, .present = true },
  1818. [tegra_clk_hda2hdmi] = { .dt_id = TEGRA210_CLK_HDA2HDMI, .present = true },
  1819. [tegra_clk_cilab] = { .dt_id = TEGRA210_CLK_CILAB, .present = true },
  1820. [tegra_clk_cilcd] = { .dt_id = TEGRA210_CLK_CILCD, .present = true },
  1821. [tegra_clk_cile] = { .dt_id = TEGRA210_CLK_CILE, .present = true },
  1822. [tegra_clk_dsialp] = { .dt_id = TEGRA210_CLK_DSIALP, .present = true },
  1823. [tegra_clk_dsiblp] = { .dt_id = TEGRA210_CLK_DSIBLP, .present = true },
  1824. [tegra_clk_entropy_8] = { .dt_id = TEGRA210_CLK_ENTROPY, .present = true },
  1825. [tegra_clk_xusb_ss] = { .dt_id = TEGRA210_CLK_XUSB_SS, .present = true },
  1826. [tegra_clk_i2c6] = { .dt_id = TEGRA210_CLK_I2C6, .present = true },
  1827. [tegra_clk_vim2_clk] = { .dt_id = TEGRA210_CLK_VIM2_CLK, .present = true },
  1828. [tegra_clk_clk72Mhz_8] = { .dt_id = TEGRA210_CLK_CLK72MHZ, .present = true },
  1829. [tegra_clk_vic03_8] = { .dt_id = TEGRA210_CLK_VIC03, .present = true },
  1830. [tegra_clk_dpaux] = { .dt_id = TEGRA210_CLK_DPAUX, .present = true },
  1831. [tegra_clk_dpaux1] = { .dt_id = TEGRA210_CLK_DPAUX1, .present = true },
  1832. [tegra_clk_sor0] = { .dt_id = TEGRA210_CLK_SOR0, .present = true },
  1833. [tegra_clk_sor0_lvds] = { .dt_id = TEGRA210_CLK_SOR0_LVDS, .present = true },
  1834. [tegra_clk_sor1] = { .dt_id = TEGRA210_CLK_SOR1, .present = true },
  1835. [tegra_clk_sor1_src] = { .dt_id = TEGRA210_CLK_SOR1_SRC, .present = true },
  1836. [tegra_clk_gpu] = { .dt_id = TEGRA210_CLK_GPU, .present = true },
  1837. [tegra_clk_pll_g_ref] = { .dt_id = TEGRA210_CLK_PLL_G_REF, .present = true, },
  1838. [tegra_clk_uartb_8] = { .dt_id = TEGRA210_CLK_UARTB, .present = true },
  1839. [tegra_clk_vfir] = { .dt_id = TEGRA210_CLK_VFIR, .present = true },
  1840. [tegra_clk_spdif_in_8] = { .dt_id = TEGRA210_CLK_SPDIF_IN, .present = true },
  1841. [tegra_clk_spdif_out] = { .dt_id = TEGRA210_CLK_SPDIF_OUT, .present = true },
  1842. [tegra_clk_vi_10] = { .dt_id = TEGRA210_CLK_VI, .present = true },
  1843. [tegra_clk_vi_sensor_8] = { .dt_id = TEGRA210_CLK_VI_SENSOR, .present = true },
  1844. [tegra_clk_fuse] = { .dt_id = TEGRA210_CLK_FUSE, .present = true },
  1845. [tegra_clk_fuse_burn] = { .dt_id = TEGRA210_CLK_FUSE_BURN, .present = true },
  1846. [tegra_clk_clk_32k] = { .dt_id = TEGRA210_CLK_CLK_32K, .present = true },
  1847. [tegra_clk_clk_m] = { .dt_id = TEGRA210_CLK_CLK_M, .present = true },
  1848. [tegra_clk_clk_m_div2] = { .dt_id = TEGRA210_CLK_CLK_M_DIV2, .present = true },
  1849. [tegra_clk_clk_m_div4] = { .dt_id = TEGRA210_CLK_CLK_M_DIV4, .present = true },
  1850. [tegra_clk_pll_ref] = { .dt_id = TEGRA210_CLK_PLL_REF, .present = true },
  1851. [tegra_clk_pll_c] = { .dt_id = TEGRA210_CLK_PLL_C, .present = true },
  1852. [tegra_clk_pll_c_out1] = { .dt_id = TEGRA210_CLK_PLL_C_OUT1, .present = true },
  1853. [tegra_clk_pll_c2] = { .dt_id = TEGRA210_CLK_PLL_C2, .present = true },
  1854. [tegra_clk_pll_c3] = { .dt_id = TEGRA210_CLK_PLL_C3, .present = true },
  1855. [tegra_clk_pll_m] = { .dt_id = TEGRA210_CLK_PLL_M, .present = true },
  1856. [tegra_clk_pll_m_out1] = { .dt_id = TEGRA210_CLK_PLL_M_OUT1, .present = true },
  1857. [tegra_clk_pll_p] = { .dt_id = TEGRA210_CLK_PLL_P, .present = true },
  1858. [tegra_clk_pll_p_out1] = { .dt_id = TEGRA210_CLK_PLL_P_OUT1, .present = true },
  1859. [tegra_clk_pll_p_out3] = { .dt_id = TEGRA210_CLK_PLL_P_OUT3, .present = true },
  1860. [tegra_clk_pll_p_out4_cpu] = { .dt_id = TEGRA210_CLK_PLL_P_OUT4, .present = true },
  1861. [tegra_clk_pll_p_out_hsio] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_HSIO, .present = true },
  1862. [tegra_clk_pll_p_out_xusb] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_XUSB, .present = true },
  1863. [tegra_clk_pll_p_out_cpu] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_CPU, .present = true },
  1864. [tegra_clk_pll_p_out_adsp] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_ADSP, .present = true },
  1865. [tegra_clk_pll_a] = { .dt_id = TEGRA210_CLK_PLL_A, .present = true },
  1866. [tegra_clk_pll_a_out0] = { .dt_id = TEGRA210_CLK_PLL_A_OUT0, .present = true },
  1867. [tegra_clk_pll_d] = { .dt_id = TEGRA210_CLK_PLL_D, .present = true },
  1868. [tegra_clk_pll_d_out0] = { .dt_id = TEGRA210_CLK_PLL_D_OUT0, .present = true },
  1869. [tegra_clk_pll_d2] = { .dt_id = TEGRA210_CLK_PLL_D2, .present = true },
  1870. [tegra_clk_pll_d2_out0] = { .dt_id = TEGRA210_CLK_PLL_D2_OUT0, .present = true },
  1871. [tegra_clk_pll_u] = { .dt_id = TEGRA210_CLK_PLL_U, .present = true },
  1872. [tegra_clk_pll_u_out] = { .dt_id = TEGRA210_CLK_PLL_U_OUT, .present = true },
  1873. [tegra_clk_pll_u_out1] = { .dt_id = TEGRA210_CLK_PLL_U_OUT1, .present = true },
  1874. [tegra_clk_pll_u_out2] = { .dt_id = TEGRA210_CLK_PLL_U_OUT2, .present = true },
  1875. [tegra_clk_pll_u_480m] = { .dt_id = TEGRA210_CLK_PLL_U_480M, .present = true },
  1876. [tegra_clk_pll_u_60m] = { .dt_id = TEGRA210_CLK_PLL_U_60M, .present = true },
  1877. [tegra_clk_pll_u_48m] = { .dt_id = TEGRA210_CLK_PLL_U_48M, .present = true },
  1878. [tegra_clk_pll_x] = { .dt_id = TEGRA210_CLK_PLL_X, .present = true },
  1879. [tegra_clk_pll_x_out0] = { .dt_id = TEGRA210_CLK_PLL_X_OUT0, .present = true },
  1880. [tegra_clk_pll_re_vco] = { .dt_id = TEGRA210_CLK_PLL_RE_VCO, .present = true },
  1881. [tegra_clk_pll_re_out] = { .dt_id = TEGRA210_CLK_PLL_RE_OUT, .present = true },
  1882. [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA210_CLK_SPDIF_IN_SYNC, .present = true },
  1883. [tegra_clk_i2s0_sync] = { .dt_id = TEGRA210_CLK_I2S0_SYNC, .present = true },
  1884. [tegra_clk_i2s1_sync] = { .dt_id = TEGRA210_CLK_I2S1_SYNC, .present = true },
  1885. [tegra_clk_i2s2_sync] = { .dt_id = TEGRA210_CLK_I2S2_SYNC, .present = true },
  1886. [tegra_clk_i2s3_sync] = { .dt_id = TEGRA210_CLK_I2S3_SYNC, .present = true },
  1887. [tegra_clk_i2s4_sync] = { .dt_id = TEGRA210_CLK_I2S4_SYNC, .present = true },
  1888. [tegra_clk_vimclk_sync] = { .dt_id = TEGRA210_CLK_VIMCLK_SYNC, .present = true },
  1889. [tegra_clk_audio0] = { .dt_id = TEGRA210_CLK_AUDIO0, .present = true },
  1890. [tegra_clk_audio1] = { .dt_id = TEGRA210_CLK_AUDIO1, .present = true },
  1891. [tegra_clk_audio2] = { .dt_id = TEGRA210_CLK_AUDIO2, .present = true },
  1892. [tegra_clk_audio3] = { .dt_id = TEGRA210_CLK_AUDIO3, .present = true },
  1893. [tegra_clk_audio4] = { .dt_id = TEGRA210_CLK_AUDIO4, .present = true },
  1894. [tegra_clk_spdif] = { .dt_id = TEGRA210_CLK_SPDIF, .present = true },
  1895. [tegra_clk_clk_out_1] = { .dt_id = TEGRA210_CLK_CLK_OUT_1, .present = true },
  1896. [tegra_clk_clk_out_2] = { .dt_id = TEGRA210_CLK_CLK_OUT_2, .present = true },
  1897. [tegra_clk_clk_out_3] = { .dt_id = TEGRA210_CLK_CLK_OUT_3, .present = true },
  1898. [tegra_clk_blink] = { .dt_id = TEGRA210_CLK_BLINK, .present = true },
  1899. [tegra_clk_xusb_gate] = { .dt_id = TEGRA210_CLK_XUSB_GATE, .present = true },
  1900. [tegra_clk_xusb_host_src_8] = { .dt_id = TEGRA210_CLK_XUSB_HOST_SRC, .present = true },
  1901. [tegra_clk_xusb_falcon_src_8] = { .dt_id = TEGRA210_CLK_XUSB_FALCON_SRC, .present = true },
  1902. [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA210_CLK_XUSB_FS_SRC, .present = true },
  1903. [tegra_clk_xusb_ss_src_8] = { .dt_id = TEGRA210_CLK_XUSB_SS_SRC, .present = true },
  1904. [tegra_clk_xusb_ss_div2] = { .dt_id = TEGRA210_CLK_XUSB_SS_DIV2, .present = true },
  1905. [tegra_clk_xusb_dev_src_8] = { .dt_id = TEGRA210_CLK_XUSB_DEV_SRC, .present = true },
  1906. [tegra_clk_xusb_dev] = { .dt_id = TEGRA210_CLK_XUSB_DEV, .present = true },
  1907. [tegra_clk_xusb_hs_src_4] = { .dt_id = TEGRA210_CLK_XUSB_HS_SRC, .present = true },
  1908. [tegra_clk_xusb_ssp_src] = { .dt_id = TEGRA210_CLK_XUSB_SSP_SRC, .present = true },
  1909. [tegra_clk_usb2_hsic_trk] = { .dt_id = TEGRA210_CLK_USB2_HSIC_TRK, .present = true },
  1910. [tegra_clk_hsic_trk] = { .dt_id = TEGRA210_CLK_HSIC_TRK, .present = true },
  1911. [tegra_clk_usb2_trk] = { .dt_id = TEGRA210_CLK_USB2_TRK, .present = true },
  1912. [tegra_clk_sclk] = { .dt_id = TEGRA210_CLK_SCLK, .present = true },
  1913. [tegra_clk_sclk_mux] = { .dt_id = TEGRA210_CLK_SCLK_MUX, .present = true },
  1914. [tegra_clk_hclk] = { .dt_id = TEGRA210_CLK_HCLK, .present = true },
  1915. [tegra_clk_pclk] = { .dt_id = TEGRA210_CLK_PCLK, .present = true },
  1916. [tegra_clk_cclk_g] = { .dt_id = TEGRA210_CLK_CCLK_G, .present = true },
  1917. [tegra_clk_cclk_lp] = { .dt_id = TEGRA210_CLK_CCLK_LP, .present = true },
  1918. [tegra_clk_dfll_ref] = { .dt_id = TEGRA210_CLK_DFLL_REF, .present = true },
  1919. [tegra_clk_dfll_soc] = { .dt_id = TEGRA210_CLK_DFLL_SOC, .present = true },
  1920. [tegra_clk_vi_sensor2_8] = { .dt_id = TEGRA210_CLK_VI_SENSOR2, .present = true },
  1921. [tegra_clk_pll_p_out5] = { .dt_id = TEGRA210_CLK_PLL_P_OUT5, .present = true },
  1922. [tegra_clk_pll_c4] = { .dt_id = TEGRA210_CLK_PLL_C4, .present = true },
  1923. [tegra_clk_pll_dp] = { .dt_id = TEGRA210_CLK_PLL_DP, .present = true },
  1924. [tegra_clk_audio0_mux] = { .dt_id = TEGRA210_CLK_AUDIO0_MUX, .present = true },
  1925. [tegra_clk_audio1_mux] = { .dt_id = TEGRA210_CLK_AUDIO1_MUX, .present = true },
  1926. [tegra_clk_audio2_mux] = { .dt_id = TEGRA210_CLK_AUDIO2_MUX, .present = true },
  1927. [tegra_clk_audio3_mux] = { .dt_id = TEGRA210_CLK_AUDIO3_MUX, .present = true },
  1928. [tegra_clk_audio4_mux] = { .dt_id = TEGRA210_CLK_AUDIO4_MUX, .present = true },
  1929. [tegra_clk_spdif_mux] = { .dt_id = TEGRA210_CLK_SPDIF_MUX, .present = true },
  1930. [tegra_clk_clk_out_1_mux] = { .dt_id = TEGRA210_CLK_CLK_OUT_1_MUX, .present = true },
  1931. [tegra_clk_clk_out_2_mux] = { .dt_id = TEGRA210_CLK_CLK_OUT_2_MUX, .present = true },
  1932. [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA210_CLK_CLK_OUT_3_MUX, .present = true },
  1933. [tegra_clk_maud] = { .dt_id = TEGRA210_CLK_MAUD, .present = true },
  1934. [tegra_clk_mipibif] = { .dt_id = TEGRA210_CLK_MIPIBIF, .present = true },
  1935. [tegra_clk_qspi] = { .dt_id = TEGRA210_CLK_QSPI, .present = true },
  1936. [tegra_clk_sdmmc_legacy] = { .dt_id = TEGRA210_CLK_SDMMC_LEGACY, .present = true },
  1937. [tegra_clk_tsecb] = { .dt_id = TEGRA210_CLK_TSECB, .present = true },
  1938. [tegra_clk_uartape] = { .dt_id = TEGRA210_CLK_UARTAPE, .present = true },
  1939. [tegra_clk_vi_i2c] = { .dt_id = TEGRA210_CLK_VI_I2C, .present = true },
  1940. [tegra_clk_ape] = { .dt_id = TEGRA210_CLK_APE, .present = true },
  1941. [tegra_clk_dbgapb] = { .dt_id = TEGRA210_CLK_DBGAPB, .present = true },
  1942. [tegra_clk_nvdec] = { .dt_id = TEGRA210_CLK_NVDEC, .present = true },
  1943. [tegra_clk_nvenc] = { .dt_id = TEGRA210_CLK_NVENC, .present = true },
  1944. [tegra_clk_nvjpg] = { .dt_id = TEGRA210_CLK_NVJPG, .present = true },
  1945. [tegra_clk_pll_c4_out0] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT0, .present = true },
  1946. [tegra_clk_pll_c4_out1] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT1, .present = true },
  1947. [tegra_clk_pll_c4_out2] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT2, .present = true },
  1948. [tegra_clk_pll_c4_out3] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT3, .present = true },
  1949. [tegra_clk_apb2ape] = { .dt_id = TEGRA210_CLK_APB2APE, .present = true },
  1950. };
  1951. static struct tegra_devclk devclks[] __initdata = {
  1952. { .con_id = "clk_m", .dt_id = TEGRA210_CLK_CLK_M },
  1953. { .con_id = "pll_ref", .dt_id = TEGRA210_CLK_PLL_REF },
  1954. { .con_id = "clk_32k", .dt_id = TEGRA210_CLK_CLK_32K },
  1955. { .con_id = "clk_m_div2", .dt_id = TEGRA210_CLK_CLK_M_DIV2 },
  1956. { .con_id = "clk_m_div4", .dt_id = TEGRA210_CLK_CLK_M_DIV4 },
  1957. { .con_id = "pll_c", .dt_id = TEGRA210_CLK_PLL_C },
  1958. { .con_id = "pll_c_out1", .dt_id = TEGRA210_CLK_PLL_C_OUT1 },
  1959. { .con_id = "pll_c2", .dt_id = TEGRA210_CLK_PLL_C2 },
  1960. { .con_id = "pll_c3", .dt_id = TEGRA210_CLK_PLL_C3 },
  1961. { .con_id = "pll_p", .dt_id = TEGRA210_CLK_PLL_P },
  1962. { .con_id = "pll_p_out1", .dt_id = TEGRA210_CLK_PLL_P_OUT1 },
  1963. { .con_id = "pll_p_out2", .dt_id = TEGRA210_CLK_PLL_P_OUT2 },
  1964. { .con_id = "pll_p_out3", .dt_id = TEGRA210_CLK_PLL_P_OUT3 },
  1965. { .con_id = "pll_p_out4", .dt_id = TEGRA210_CLK_PLL_P_OUT4 },
  1966. { .con_id = "pll_m", .dt_id = TEGRA210_CLK_PLL_M },
  1967. { .con_id = "pll_m_out1", .dt_id = TEGRA210_CLK_PLL_M_OUT1 },
  1968. { .con_id = "pll_x", .dt_id = TEGRA210_CLK_PLL_X },
  1969. { .con_id = "pll_x_out0", .dt_id = TEGRA210_CLK_PLL_X_OUT0 },
  1970. { .con_id = "pll_u", .dt_id = TEGRA210_CLK_PLL_U },
  1971. { .con_id = "pll_u_out", .dt_id = TEGRA210_CLK_PLL_U_OUT },
  1972. { .con_id = "pll_u_out1", .dt_id = TEGRA210_CLK_PLL_U_OUT1 },
  1973. { .con_id = "pll_u_out2", .dt_id = TEGRA210_CLK_PLL_U_OUT2 },
  1974. { .con_id = "pll_u_480M", .dt_id = TEGRA210_CLK_PLL_U_480M },
  1975. { .con_id = "pll_u_60M", .dt_id = TEGRA210_CLK_PLL_U_60M },
  1976. { .con_id = "pll_u_48M", .dt_id = TEGRA210_CLK_PLL_U_48M },
  1977. { .con_id = "pll_d", .dt_id = TEGRA210_CLK_PLL_D },
  1978. { .con_id = "pll_d_out0", .dt_id = TEGRA210_CLK_PLL_D_OUT0 },
  1979. { .con_id = "pll_d2", .dt_id = TEGRA210_CLK_PLL_D2 },
  1980. { .con_id = "pll_d2_out0", .dt_id = TEGRA210_CLK_PLL_D2_OUT0 },
  1981. { .con_id = "pll_a", .dt_id = TEGRA210_CLK_PLL_A },
  1982. { .con_id = "pll_a_out0", .dt_id = TEGRA210_CLK_PLL_A_OUT0 },
  1983. { .con_id = "pll_re_vco", .dt_id = TEGRA210_CLK_PLL_RE_VCO },
  1984. { .con_id = "pll_re_out", .dt_id = TEGRA210_CLK_PLL_RE_OUT },
  1985. { .con_id = "spdif_in_sync", .dt_id = TEGRA210_CLK_SPDIF_IN_SYNC },
  1986. { .con_id = "i2s0_sync", .dt_id = TEGRA210_CLK_I2S0_SYNC },
  1987. { .con_id = "i2s1_sync", .dt_id = TEGRA210_CLK_I2S1_SYNC },
  1988. { .con_id = "i2s2_sync", .dt_id = TEGRA210_CLK_I2S2_SYNC },
  1989. { .con_id = "i2s3_sync", .dt_id = TEGRA210_CLK_I2S3_SYNC },
  1990. { .con_id = "i2s4_sync", .dt_id = TEGRA210_CLK_I2S4_SYNC },
  1991. { .con_id = "vimclk_sync", .dt_id = TEGRA210_CLK_VIMCLK_SYNC },
  1992. { .con_id = "audio0", .dt_id = TEGRA210_CLK_AUDIO0 },
  1993. { .con_id = "audio1", .dt_id = TEGRA210_CLK_AUDIO1 },
  1994. { .con_id = "audio2", .dt_id = TEGRA210_CLK_AUDIO2 },
  1995. { .con_id = "audio3", .dt_id = TEGRA210_CLK_AUDIO3 },
  1996. { .con_id = "audio4", .dt_id = TEGRA210_CLK_AUDIO4 },
  1997. { .con_id = "spdif", .dt_id = TEGRA210_CLK_SPDIF },
  1998. { .con_id = "spdif_2x", .dt_id = TEGRA210_CLK_SPDIF_2X },
  1999. { .con_id = "extern1", .dev_id = "clk_out_1", .dt_id = TEGRA210_CLK_EXTERN1 },
  2000. { .con_id = "extern2", .dev_id = "clk_out_2", .dt_id = TEGRA210_CLK_EXTERN2 },
  2001. { .con_id = "extern3", .dev_id = "clk_out_3", .dt_id = TEGRA210_CLK_EXTERN3 },
  2002. { .con_id = "blink", .dt_id = TEGRA210_CLK_BLINK },
  2003. { .con_id = "cclk_g", .dt_id = TEGRA210_CLK_CCLK_G },
  2004. { .con_id = "cclk_lp", .dt_id = TEGRA210_CLK_CCLK_LP },
  2005. { .con_id = "sclk", .dt_id = TEGRA210_CLK_SCLK },
  2006. { .con_id = "hclk", .dt_id = TEGRA210_CLK_HCLK },
  2007. { .con_id = "pclk", .dt_id = TEGRA210_CLK_PCLK },
  2008. { .con_id = "fuse", .dt_id = TEGRA210_CLK_FUSE },
  2009. { .dev_id = "rtc-tegra", .dt_id = TEGRA210_CLK_RTC },
  2010. { .dev_id = "timer", .dt_id = TEGRA210_CLK_TIMER },
  2011. { .con_id = "pll_c4_out0", .dt_id = TEGRA210_CLK_PLL_C4_OUT0 },
  2012. { .con_id = "pll_c4_out1", .dt_id = TEGRA210_CLK_PLL_C4_OUT1 },
  2013. { .con_id = "pll_c4_out2", .dt_id = TEGRA210_CLK_PLL_C4_OUT2 },
  2014. { .con_id = "pll_c4_out3", .dt_id = TEGRA210_CLK_PLL_C4_OUT3 },
  2015. { .con_id = "dpaux", .dt_id = TEGRA210_CLK_DPAUX },
  2016. { .con_id = "sor0", .dt_id = TEGRA210_CLK_SOR0 },
  2017. };
  2018. static struct tegra_audio_clk_info tegra210_audio_plls[] = {
  2019. { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_ref" },
  2020. { "pll_a1", &pll_a1_params, tegra_clk_pll_a1, "pll_ref" },
  2021. };
  2022. static struct clk **clks;
  2023. static __init void tegra210_periph_clk_init(void __iomem *clk_base,
  2024. void __iomem *pmc_base)
  2025. {
  2026. struct clk *clk;
  2027. /* xusb_ss_div2 */
  2028. clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0,
  2029. 1, 2);
  2030. clks[TEGRA210_CLK_XUSB_SS_DIV2] = clk;
  2031. clk = tegra_clk_register_periph_fixed("sor_safe", "pll_p", 0, clk_base,
  2032. 1, 17, 222);
  2033. clks[TEGRA210_CLK_SOR_SAFE] = clk;
  2034. clk = tegra_clk_register_periph_fixed("dpaux", "sor_safe", 0, clk_base,
  2035. 1, 17, 181);
  2036. clks[TEGRA210_CLK_DPAUX] = clk;
  2037. clk = tegra_clk_register_periph_fixed("dpaux1", "sor_safe", 0, clk_base,
  2038. 1, 17, 207);
  2039. clks[TEGRA210_CLK_DPAUX1] = clk;
  2040. /* pll_d_dsi_out */
  2041. clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0,
  2042. clk_base + PLLD_MISC0, 21, 0, &pll_d_lock);
  2043. clks[TEGRA210_CLK_PLL_D_DSI_OUT] = clk;
  2044. /* dsia */
  2045. clk = tegra_clk_register_periph_gate("dsia", "pll_d_dsi_out", 0,
  2046. clk_base, 0, 48,
  2047. periph_clk_enb_refcnt);
  2048. clks[TEGRA210_CLK_DSIA] = clk;
  2049. /* dsib */
  2050. clk = tegra_clk_register_periph_gate("dsib", "pll_d_dsi_out", 0,
  2051. clk_base, 0, 82,
  2052. periph_clk_enb_refcnt);
  2053. clks[TEGRA210_CLK_DSIB] = clk;
  2054. /* emc mux */
  2055. clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm,
  2056. ARRAY_SIZE(mux_pllmcp_clkm), 0,
  2057. clk_base + CLK_SOURCE_EMC,
  2058. 29, 3, 0, &emc_lock);
  2059. clk = tegra_clk_register_mc("mc", "emc_mux", clk_base + CLK_SOURCE_EMC,
  2060. &emc_lock);
  2061. clks[TEGRA210_CLK_MC] = clk;
  2062. /* cml0 */
  2063. clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX,
  2064. 0, 0, &pll_e_lock);
  2065. clk_register_clkdev(clk, "cml0", NULL);
  2066. clks[TEGRA210_CLK_CML0] = clk;
  2067. /* cml1 */
  2068. clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX,
  2069. 1, 0, &pll_e_lock);
  2070. clk_register_clkdev(clk, "cml1", NULL);
  2071. clks[TEGRA210_CLK_CML1] = clk;
  2072. tegra_periph_clk_init(clk_base, pmc_base, tegra210_clks, &pll_p_params);
  2073. }
  2074. static void __init tegra210_pll_init(void __iomem *clk_base,
  2075. void __iomem *pmc)
  2076. {
  2077. struct clk *clk;
  2078. /* PLLC */
  2079. clk = tegra_clk_register_pllxc_tegra210("pll_c", "pll_ref", clk_base,
  2080. pmc, 0, &pll_c_params, NULL);
  2081. if (!WARN_ON(IS_ERR(clk)))
  2082. clk_register_clkdev(clk, "pll_c", NULL);
  2083. clks[TEGRA210_CLK_PLL_C] = clk;
  2084. /* PLLC_OUT1 */
  2085. clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
  2086. clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
  2087. 8, 8, 1, NULL);
  2088. clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
  2089. clk_base + PLLC_OUT, 1, 0,
  2090. CLK_SET_RATE_PARENT, 0, NULL);
  2091. clk_register_clkdev(clk, "pll_c_out1", NULL);
  2092. clks[TEGRA210_CLK_PLL_C_OUT1] = clk;
  2093. /* PLLC_UD */
  2094. clk = clk_register_fixed_factor(NULL, "pll_c_ud", "pll_c",
  2095. CLK_SET_RATE_PARENT, 1, 1);
  2096. clk_register_clkdev(clk, "pll_c_ud", NULL);
  2097. clks[TEGRA210_CLK_PLL_C_UD] = clk;
  2098. /* PLLC2 */
  2099. clk = tegra_clk_register_pllc_tegra210("pll_c2", "pll_ref", clk_base,
  2100. pmc, 0, &pll_c2_params, NULL);
  2101. clk_register_clkdev(clk, "pll_c2", NULL);
  2102. clks[TEGRA210_CLK_PLL_C2] = clk;
  2103. /* PLLC3 */
  2104. clk = tegra_clk_register_pllc_tegra210("pll_c3", "pll_ref", clk_base,
  2105. pmc, 0, &pll_c3_params, NULL);
  2106. clk_register_clkdev(clk, "pll_c3", NULL);
  2107. clks[TEGRA210_CLK_PLL_C3] = clk;
  2108. /* PLLM */
  2109. clk = tegra_clk_register_pllm("pll_m", "osc", clk_base, pmc,
  2110. CLK_SET_RATE_GATE, &pll_m_params, NULL);
  2111. clk_register_clkdev(clk, "pll_m", NULL);
  2112. clks[TEGRA210_CLK_PLL_M] = clk;
  2113. /* PLLMB */
  2114. clk = tegra_clk_register_pllmb("pll_mb", "osc", clk_base, pmc,
  2115. CLK_SET_RATE_GATE, &pll_mb_params, NULL);
  2116. clk_register_clkdev(clk, "pll_mb", NULL);
  2117. clks[TEGRA210_CLK_PLL_MB] = clk;
  2118. clk_register_clkdev(clk, "pll_m_out1", NULL);
  2119. clks[TEGRA210_CLK_PLL_M_OUT1] = clk;
  2120. /* PLLM_UD */
  2121. clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m",
  2122. CLK_SET_RATE_PARENT, 1, 1);
  2123. clk_register_clkdev(clk, "pll_m_ud", NULL);
  2124. clks[TEGRA210_CLK_PLL_M_UD] = clk;
  2125. /* PLLU_VCO */
  2126. clk = tegra_clk_register_pllu_tegra210("pll_u_vco", "pll_ref",
  2127. clk_base, 0, &pll_u_vco_params,
  2128. &pll_u_lock);
  2129. clk_register_clkdev(clk, "pll_u_vco", NULL);
  2130. clks[TEGRA210_CLK_PLL_U] = clk;
  2131. /* PLLU_OUT */
  2132. clk = clk_register_divider_table(NULL, "pll_u_out", "pll_u_vco", 0,
  2133. clk_base + PLLU_BASE, 16, 4, 0,
  2134. pll_vco_post_div_table, NULL);
  2135. clk_register_clkdev(clk, "pll_u_out", NULL);
  2136. clks[TEGRA210_CLK_PLL_U_OUT] = clk;
  2137. /* PLLU_OUT1 */
  2138. clk = tegra_clk_register_divider("pll_u_out1_div", "pll_u_out",
  2139. clk_base + PLLU_OUTA, 0,
  2140. TEGRA_DIVIDER_ROUND_UP,
  2141. 8, 8, 1, &pll_u_lock);
  2142. clk = tegra_clk_register_pll_out("pll_u_out1", "pll_u_out1_div",
  2143. clk_base + PLLU_OUTA, 1, 0,
  2144. CLK_SET_RATE_PARENT, 0, &pll_u_lock);
  2145. clk_register_clkdev(clk, "pll_u_out1", NULL);
  2146. clks[TEGRA210_CLK_PLL_U_OUT1] = clk;
  2147. /* PLLU_OUT2 */
  2148. clk = tegra_clk_register_divider("pll_u_out2_div", "pll_u_out",
  2149. clk_base + PLLU_OUTA, 0,
  2150. TEGRA_DIVIDER_ROUND_UP,
  2151. 24, 8, 1, &pll_u_lock);
  2152. clk = tegra_clk_register_pll_out("pll_u_out2", "pll_u_out2_div",
  2153. clk_base + PLLU_OUTA, 17, 16,
  2154. CLK_SET_RATE_PARENT, 0, &pll_u_lock);
  2155. clk_register_clkdev(clk, "pll_u_out2", NULL);
  2156. clks[TEGRA210_CLK_PLL_U_OUT2] = clk;
  2157. /* PLLU_480M */
  2158. clk = clk_register_gate(NULL, "pll_u_480M", "pll_u_vco",
  2159. CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
  2160. 22, 0, &pll_u_lock);
  2161. clk_register_clkdev(clk, "pll_u_480M", NULL);
  2162. clks[TEGRA210_CLK_PLL_U_480M] = clk;
  2163. /* PLLU_60M */
  2164. clk = clk_register_gate(NULL, "pll_u_60M", "pll_u_out2",
  2165. CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
  2166. 23, 0, NULL);
  2167. clk_register_clkdev(clk, "pll_u_60M", NULL);
  2168. clks[TEGRA210_CLK_PLL_U_60M] = clk;
  2169. /* PLLU_48M */
  2170. clk = clk_register_gate(NULL, "pll_u_48M", "pll_u_out1",
  2171. CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
  2172. 25, 0, NULL);
  2173. clk_register_clkdev(clk, "pll_u_48M", NULL);
  2174. clks[TEGRA210_CLK_PLL_U_48M] = clk;
  2175. /* PLLD */
  2176. clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0,
  2177. &pll_d_params, &pll_d_lock);
  2178. clk_register_clkdev(clk, "pll_d", NULL);
  2179. clks[TEGRA210_CLK_PLL_D] = clk;
  2180. /* PLLD_OUT0 */
  2181. clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
  2182. CLK_SET_RATE_PARENT, 1, 2);
  2183. clk_register_clkdev(clk, "pll_d_out0", NULL);
  2184. clks[TEGRA210_CLK_PLL_D_OUT0] = clk;
  2185. /* PLLRE */
  2186. clk = tegra_clk_register_pllre_tegra210("pll_re_vco", "pll_ref",
  2187. clk_base, pmc, 0,
  2188. &pll_re_vco_params,
  2189. &pll_re_lock, pll_ref_freq);
  2190. clk_register_clkdev(clk, "pll_re_vco", NULL);
  2191. clks[TEGRA210_CLK_PLL_RE_VCO] = clk;
  2192. clk = clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0,
  2193. clk_base + PLLRE_BASE, 16, 5, 0,
  2194. pll_vco_post_div_table, &pll_re_lock);
  2195. clk_register_clkdev(clk, "pll_re_out", NULL);
  2196. clks[TEGRA210_CLK_PLL_RE_OUT] = clk;
  2197. clk = tegra_clk_register_divider("pll_re_out1_div", "pll_re_vco",
  2198. clk_base + PLLRE_OUT1, 0,
  2199. TEGRA_DIVIDER_ROUND_UP,
  2200. 8, 8, 1, NULL);
  2201. clk = tegra_clk_register_pll_out("pll_re_out1", "pll_re_out1_div",
  2202. clk_base + PLLRE_OUT1, 1, 0,
  2203. CLK_SET_RATE_PARENT, 0, NULL);
  2204. clks[TEGRA210_CLK_PLL_RE_OUT1] = clk;
  2205. /* PLLE */
  2206. clk = tegra_clk_register_plle_tegra210("pll_e", "pll_ref",
  2207. clk_base, 0, &pll_e_params, NULL);
  2208. clk_register_clkdev(clk, "pll_e", NULL);
  2209. clks[TEGRA210_CLK_PLL_E] = clk;
  2210. /* PLLC4 */
  2211. clk = tegra_clk_register_pllre("pll_c4_vco", "pll_ref", clk_base, pmc,
  2212. 0, &pll_c4_vco_params, NULL, pll_ref_freq);
  2213. clk_register_clkdev(clk, "pll_c4_vco", NULL);
  2214. clks[TEGRA210_CLK_PLL_C4] = clk;
  2215. /* PLLC4_OUT0 */
  2216. clk = clk_register_divider_table(NULL, "pll_c4_out0", "pll_c4_vco", 0,
  2217. clk_base + PLLC4_BASE, 19, 4, 0,
  2218. pll_vco_post_div_table, NULL);
  2219. clk_register_clkdev(clk, "pll_c4_out0", NULL);
  2220. clks[TEGRA210_CLK_PLL_C4_OUT0] = clk;
  2221. /* PLLC4_OUT1 */
  2222. clk = clk_register_fixed_factor(NULL, "pll_c4_out1", "pll_c4_vco",
  2223. CLK_SET_RATE_PARENT, 1, 3);
  2224. clk_register_clkdev(clk, "pll_c4_out1", NULL);
  2225. clks[TEGRA210_CLK_PLL_C4_OUT1] = clk;
  2226. /* PLLC4_OUT2 */
  2227. clk = clk_register_fixed_factor(NULL, "pll_c4_out2", "pll_c4_vco",
  2228. CLK_SET_RATE_PARENT, 1, 5);
  2229. clk_register_clkdev(clk, "pll_c4_out2", NULL);
  2230. clks[TEGRA210_CLK_PLL_C4_OUT2] = clk;
  2231. /* PLLC4_OUT3 */
  2232. clk = tegra_clk_register_divider("pll_c4_out3_div", "pll_c4_out0",
  2233. clk_base + PLLC4_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
  2234. 8, 8, 1, NULL);
  2235. clk = tegra_clk_register_pll_out("pll_c4_out3", "pll_c4_out3_div",
  2236. clk_base + PLLC4_OUT, 1, 0,
  2237. CLK_SET_RATE_PARENT, 0, NULL);
  2238. clk_register_clkdev(clk, "pll_c4_out3", NULL);
  2239. clks[TEGRA210_CLK_PLL_C4_OUT3] = clk;
  2240. /* PLLDP */
  2241. clk = tegra_clk_register_pllss_tegra210("pll_dp", "pll_ref", clk_base,
  2242. 0, &pll_dp_params, NULL);
  2243. clk_register_clkdev(clk, "pll_dp", NULL);
  2244. clks[TEGRA210_CLK_PLL_DP] = clk;
  2245. /* PLLD2 */
  2246. clk = tegra_clk_register_pllss_tegra210("pll_d2", "pll_ref", clk_base,
  2247. 0, &pll_d2_params, NULL);
  2248. clk_register_clkdev(clk, "pll_d2", NULL);
  2249. clks[TEGRA210_CLK_PLL_D2] = clk;
  2250. /* PLLD2_OUT0 */
  2251. clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2",
  2252. CLK_SET_RATE_PARENT, 1, 1);
  2253. clk_register_clkdev(clk, "pll_d2_out0", NULL);
  2254. clks[TEGRA210_CLK_PLL_D2_OUT0] = clk;
  2255. /* PLLP_OUT2 */
  2256. clk = clk_register_fixed_factor(NULL, "pll_p_out2", "pll_p",
  2257. CLK_SET_RATE_PARENT, 1, 2);
  2258. clk_register_clkdev(clk, "pll_p_out2", NULL);
  2259. clks[TEGRA210_CLK_PLL_P_OUT2] = clk;
  2260. }
  2261. /* Tegra210 CPU clock and reset control functions */
  2262. static void tegra210_wait_cpu_in_reset(u32 cpu)
  2263. {
  2264. unsigned int reg;
  2265. do {
  2266. reg = readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
  2267. cpu_relax();
  2268. } while (!(reg & (1 << cpu))); /* check CPU been reset or not */
  2269. }
  2270. static void tegra210_disable_cpu_clock(u32 cpu)
  2271. {
  2272. /* flow controller would take care in the power sequence. */
  2273. }
  2274. #ifdef CONFIG_PM_SLEEP
  2275. static void tegra210_cpu_clock_suspend(void)
  2276. {
  2277. /* switch coresite to clk_m, save off original source */
  2278. tegra210_cpu_clk_sctx.clk_csite_src =
  2279. readl(clk_base + CLK_SOURCE_CSITE);
  2280. writel(3 << 30, clk_base + CLK_SOURCE_CSITE);
  2281. }
  2282. static void tegra210_cpu_clock_resume(void)
  2283. {
  2284. writel(tegra210_cpu_clk_sctx.clk_csite_src,
  2285. clk_base + CLK_SOURCE_CSITE);
  2286. }
  2287. #endif
  2288. static struct tegra_cpu_car_ops tegra210_cpu_car_ops = {
  2289. .wait_for_reset = tegra210_wait_cpu_in_reset,
  2290. .disable_clock = tegra210_disable_cpu_clock,
  2291. #ifdef CONFIG_PM_SLEEP
  2292. .suspend = tegra210_cpu_clock_suspend,
  2293. .resume = tegra210_cpu_clock_resume,
  2294. #endif
  2295. };
  2296. static const struct of_device_id pmc_match[] __initconst = {
  2297. { .compatible = "nvidia,tegra210-pmc" },
  2298. { },
  2299. };
  2300. static struct tegra_clk_init_table init_table[] __initdata = {
  2301. { TEGRA210_CLK_UARTA, TEGRA210_CLK_PLL_P, 408000000, 0 },
  2302. { TEGRA210_CLK_UARTB, TEGRA210_CLK_PLL_P, 408000000, 0 },
  2303. { TEGRA210_CLK_UARTC, TEGRA210_CLK_PLL_P, 408000000, 0 },
  2304. { TEGRA210_CLK_UARTD, TEGRA210_CLK_PLL_P, 408000000, 0 },
  2305. { TEGRA210_CLK_PLL_A, TEGRA210_CLK_CLK_MAX, 564480000, 1 },
  2306. { TEGRA210_CLK_PLL_A_OUT0, TEGRA210_CLK_CLK_MAX, 11289600, 1 },
  2307. { TEGRA210_CLK_EXTERN1, TEGRA210_CLK_PLL_A_OUT0, 0, 1 },
  2308. { TEGRA210_CLK_CLK_OUT_1_MUX, TEGRA210_CLK_EXTERN1, 0, 1 },
  2309. { TEGRA210_CLK_CLK_OUT_1, TEGRA210_CLK_CLK_MAX, 0, 1 },
  2310. { TEGRA210_CLK_I2S0, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  2311. { TEGRA210_CLK_I2S1, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  2312. { TEGRA210_CLK_I2S2, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  2313. { TEGRA210_CLK_I2S3, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  2314. { TEGRA210_CLK_I2S4, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  2315. { TEGRA210_CLK_HOST1X, TEGRA210_CLK_PLL_P, 136000000, 1 },
  2316. { TEGRA210_CLK_SCLK_MUX, TEGRA210_CLK_PLL_P, 0, 1 },
  2317. { TEGRA210_CLK_SCLK, TEGRA210_CLK_CLK_MAX, 102000000, 1 },
  2318. { TEGRA210_CLK_DFLL_SOC, TEGRA210_CLK_PLL_P, 51000000, 1 },
  2319. { TEGRA210_CLK_DFLL_REF, TEGRA210_CLK_PLL_P, 51000000, 1 },
  2320. { TEGRA210_CLK_SBC4, TEGRA210_CLK_PLL_P, 12000000, 1 },
  2321. { TEGRA210_CLK_PLL_RE_VCO, TEGRA210_CLK_CLK_MAX, 672000000, 1 },
  2322. { TEGRA210_CLK_XUSB_GATE, TEGRA210_CLK_CLK_MAX, 0, 1 },
  2323. { TEGRA210_CLK_XUSB_SS_SRC, TEGRA210_CLK_PLL_U_480M, 120000000, 0 },
  2324. { TEGRA210_CLK_XUSB_FS_SRC, TEGRA210_CLK_PLL_U_48M, 48000000, 0 },
  2325. { TEGRA210_CLK_XUSB_HS_SRC, TEGRA210_CLK_XUSB_SS_SRC, 120000000, 0 },
  2326. { TEGRA210_CLK_XUSB_SSP_SRC, TEGRA210_CLK_XUSB_SS_SRC, 120000000, 0 },
  2327. { TEGRA210_CLK_XUSB_FALCON_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 204000000, 0 },
  2328. { TEGRA210_CLK_XUSB_HOST_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 102000000, 0 },
  2329. { TEGRA210_CLK_XUSB_DEV_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 102000000, 0 },
  2330. { TEGRA210_CLK_SATA, TEGRA210_CLK_PLL_P, 104000000, 0 },
  2331. { TEGRA210_CLK_SATA_OOB, TEGRA210_CLK_PLL_P, 204000000, 0 },
  2332. { TEGRA210_CLK_EMC, TEGRA210_CLK_CLK_MAX, 0, 1 },
  2333. { TEGRA210_CLK_MSELECT, TEGRA210_CLK_CLK_MAX, 0, 1 },
  2334. { TEGRA210_CLK_CSITE, TEGRA210_CLK_CLK_MAX, 0, 1 },
  2335. { TEGRA210_CLK_TSENSOR, TEGRA210_CLK_CLK_M, 400000, 0 },
  2336. { TEGRA210_CLK_I2C1, TEGRA210_CLK_PLL_P, 0, 0 },
  2337. { TEGRA210_CLK_I2C2, TEGRA210_CLK_PLL_P, 0, 0 },
  2338. { TEGRA210_CLK_I2C3, TEGRA210_CLK_PLL_P, 0, 0 },
  2339. { TEGRA210_CLK_I2C4, TEGRA210_CLK_PLL_P, 0, 0 },
  2340. { TEGRA210_CLK_I2C5, TEGRA210_CLK_PLL_P, 0, 0 },
  2341. { TEGRA210_CLK_I2C6, TEGRA210_CLK_PLL_P, 0, 0 },
  2342. { TEGRA210_CLK_PLL_DP, TEGRA210_CLK_CLK_MAX, 270000000, 0 },
  2343. { TEGRA210_CLK_SOC_THERM, TEGRA210_CLK_PLL_P, 51000000, 0 },
  2344. { TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 },
  2345. /* This MUST be the last entry. */
  2346. { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 },
  2347. };
  2348. /**
  2349. * tegra210_clock_apply_init_table - initialize clocks on Tegra210 SoCs
  2350. *
  2351. * Program an initial clock rate and enable or disable clocks needed
  2352. * by the rest of the kernel, for Tegra210 SoCs. It is intended to be
  2353. * called by assigning a pointer to it to tegra_clk_apply_init_table -
  2354. * this will be called as an arch_initcall. No return value.
  2355. */
  2356. static void __init tegra210_clock_apply_init_table(void)
  2357. {
  2358. tegra_init_from_table(init_table, clks, TEGRA210_CLK_CLK_MAX);
  2359. }
  2360. /**
  2361. * tegra210_clock_init - Tegra210-specific clock initialization
  2362. * @np: struct device_node * of the DT node for the SoC CAR IP block
  2363. *
  2364. * Register most SoC clocks for the Tegra210 system-on-chip. Intended
  2365. * to be called by the OF init code when a DT node with the
  2366. * "nvidia,tegra210-car" string is encountered, and declared with
  2367. * CLK_OF_DECLARE. No return value.
  2368. */
  2369. static void __init tegra210_clock_init(struct device_node *np)
  2370. {
  2371. struct device_node *node;
  2372. u32 value, clk_m_div;
  2373. clk_base = of_iomap(np, 0);
  2374. if (!clk_base) {
  2375. pr_err("ioremap tegra210 CAR failed\n");
  2376. return;
  2377. }
  2378. node = of_find_matching_node(NULL, pmc_match);
  2379. if (!node) {
  2380. pr_err("Failed to find pmc node\n");
  2381. WARN_ON(1);
  2382. return;
  2383. }
  2384. pmc_base = of_iomap(node, 0);
  2385. if (!pmc_base) {
  2386. pr_err("Can't map pmc registers\n");
  2387. WARN_ON(1);
  2388. return;
  2389. }
  2390. clks = tegra_clk_init(clk_base, TEGRA210_CLK_CLK_MAX,
  2391. TEGRA210_CAR_BANK_COUNT);
  2392. if (!clks)
  2393. return;
  2394. value = clk_readl(clk_base + SPARE_REG0) >> CLK_M_DIVISOR_SHIFT;
  2395. clk_m_div = (value & CLK_M_DIVISOR_MASK) + 1;
  2396. if (tegra_osc_clk_init(clk_base, tegra210_clks, tegra210_input_freq,
  2397. ARRAY_SIZE(tegra210_input_freq), clk_m_div,
  2398. &osc_freq, &pll_ref_freq) < 0)
  2399. return;
  2400. tegra_fixed_clk_init(tegra210_clks);
  2401. tegra210_pll_init(clk_base, pmc_base);
  2402. tegra210_periph_clk_init(clk_base, pmc_base);
  2403. tegra_audio_clk_init(clk_base, pmc_base, tegra210_clks,
  2404. tegra210_audio_plls,
  2405. ARRAY_SIZE(tegra210_audio_plls));
  2406. tegra_pmc_clk_init(pmc_base, tegra210_clks);
  2407. /* For Tegra210, PLLD is the only source for DSIA & DSIB */
  2408. value = clk_readl(clk_base + PLLD_BASE);
  2409. value &= ~BIT(25);
  2410. clk_writel(value, clk_base + PLLD_BASE);
  2411. tegra_clk_apply_init_table = tegra210_clock_apply_init_table;
  2412. tegra_super_clk_gen5_init(clk_base, pmc_base, tegra210_clks,
  2413. &pll_x_params);
  2414. tegra_add_of_provider(np);
  2415. tegra_register_devclks(devclks, ARRAY_SIZE(devclks));
  2416. tegra_cpu_car_ops = &tegra210_cpu_car_ops;
  2417. }
  2418. CLK_OF_DECLARE(tegra210, "nvidia,tegra210-car", tegra210_clock_init);