clk-tegra210.c 123 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2020 NVIDIA CORPORATION. All rights reserved.
  4. */
  5. #include <linux/io.h>
  6. #include <linux/clk.h>
  7. #include <linux/clk-provider.h>
  8. #include <linux/clkdev.h>
  9. #include <linux/of.h>
  10. #include <linux/of_address.h>
  11. #include <linux/syscore_ops.h>
  12. #include <linux/delay.h>
  13. #include <linux/export.h>
  14. #include <linux/mutex.h>
  15. #include <linux/clk/tegra.h>
  16. #include <dt-bindings/clock/tegra210-car.h>
  17. #include <dt-bindings/reset/tegra210-car.h>
  18. #include <linux/sizes.h>
  19. #include <soc/tegra/pmc.h>
  20. #include "clk.h"
  21. #include "clk-id.h"
  22. /*
  23. * TEGRA210_CAR_BANK_COUNT: the number of peripheral clock register
  24. * banks present in the Tegra210 CAR IP block. The banks are
  25. * identified by single letters, e.g.: L, H, U, V, W, X, Y. See
  26. * periph_regs[] in drivers/clk/tegra/clk.c
  27. */
  28. #define TEGRA210_CAR_BANK_COUNT 7
  29. #define CLK_SOURCE_CSITE 0x1d4
  30. #define CLK_SOURCE_EMC 0x19c
  31. #define CLK_SOURCE_SOR1 0x410
  32. #define CLK_SOURCE_SOR0 0x414
  33. #define CLK_SOURCE_LA 0x1f8
  34. #define CLK_SOURCE_SDMMC2 0x154
  35. #define CLK_SOURCE_SDMMC4 0x164
  36. #define CLK_SOURCE_EMC_DLL 0x664
  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 0
  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 UTMIP_PLL_CFG2 0x488
  140. #define UTMIP_PLL_CFG2_STABLE_COUNT(x) (((x) & 0xfff) << 6)
  141. #define UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(x) (((x) & 0x3f) << 18)
  142. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN BIT(0)
  143. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP BIT(1)
  144. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN BIT(2)
  145. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP BIT(3)
  146. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERDOWN BIT(4)
  147. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_C_POWERUP BIT(5)
  148. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN BIT(24)
  149. #define UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP BIT(25)
  150. #define UTMIP_PLL_CFG1 0x484
  151. #define UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(x) (((x) & 0x1f) << 27)
  152. #define UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(x) (((x) & 0xfff) << 0)
  153. #define UTMIP_PLL_CFG1_FORCE_PLLU_POWERUP BIT(17)
  154. #define UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN BIT(16)
  155. #define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP BIT(15)
  156. #define UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN BIT(14)
  157. #define UTMIP_PLL_CFG1_FORCE_PLL_ACTIVE_POWERDOWN BIT(12)
  158. #define SATA_PLL_CFG0 0x490
  159. #define SATA_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0)
  160. #define SATA_PLL_CFG0_PADPLL_USE_LOCKDET BIT(2)
  161. #define SATA_PLL_CFG0_SATA_SEQ_IN_SWCTL BIT(4)
  162. #define SATA_PLL_CFG0_SATA_SEQ_RESET_INPUT_VALUE BIT(5)
  163. #define SATA_PLL_CFG0_SATA_SEQ_LANE_PD_INPUT_VALUE BIT(6)
  164. #define SATA_PLL_CFG0_SATA_SEQ_PADPLL_PD_INPUT_VALUE BIT(7)
  165. #define SATA_PLL_CFG0_PADPLL_SLEEP_IDDQ BIT(13)
  166. #define SATA_PLL_CFG0_SEQ_ENABLE BIT(24)
  167. #define XUSBIO_PLL_CFG0 0x51c
  168. #define XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL BIT(0)
  169. #define XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL BIT(2)
  170. #define XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET BIT(6)
  171. #define XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ BIT(13)
  172. #define XUSBIO_PLL_CFG0_SEQ_ENABLE BIT(24)
  173. #define UTMIPLL_HW_PWRDN_CFG0 0x52c
  174. #define UTMIPLL_HW_PWRDN_CFG0_UTMIPLL_LOCK BIT(31)
  175. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_START_STATE BIT(25)
  176. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
  177. #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(7)
  178. #define UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
  179. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_RESET_INPUT_VALUE BIT(5)
  180. #define UTMIPLL_HW_PWRDN_CFG0_SEQ_IN_SWCTL BIT(4)
  181. #define UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
  182. #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE BIT(1)
  183. #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0)
  184. #define PLLU_HW_PWRDN_CFG0 0x530
  185. #define PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE BIT(28)
  186. #define PLLU_HW_PWRDN_CFG0_SEQ_ENABLE BIT(24)
  187. #define PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT BIT(7)
  188. #define PLLU_HW_PWRDN_CFG0_USE_LOCKDET BIT(6)
  189. #define PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL BIT(2)
  190. #define PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL BIT(0)
  191. #define XUSB_PLL_CFG0 0x534
  192. #define XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY 0x3ff
  193. #define XUSB_PLL_CFG0_PLLU_LOCK_DLY_MASK (0x3ff << 14)
  194. #define SPARE_REG0 0x55c
  195. #define CLK_M_DIVISOR_SHIFT 2
  196. #define CLK_M_DIVISOR_MASK 0x3
  197. #define CLK_MASK_ARM 0x44
  198. #define MISC_CLK_ENB 0x48
  199. #define RST_DFLL_DVCO 0x2f4
  200. #define DVFS_DFLL_RESET_SHIFT 0
  201. #define CLK_RST_CONTROLLER_CLK_OUT_ENB_X_SET 0x284
  202. #define CLK_RST_CONTROLLER_CLK_OUT_ENB_X_CLR 0x288
  203. #define CLK_OUT_ENB_X_CLK_ENB_EMC_DLL BIT(14)
  204. #define CLK_RST_CONTROLLER_RST_DEV_Y_SET 0x2a8
  205. #define CLK_RST_CONTROLLER_RST_DEV_Y_CLR 0x2ac
  206. #define CPU_SOFTRST_CTRL 0x380
  207. #define LVL2_CLK_GATE_OVRA 0xf8
  208. #define LVL2_CLK_GATE_OVRC 0x3a0
  209. #define LVL2_CLK_GATE_OVRD 0x3a4
  210. #define LVL2_CLK_GATE_OVRE 0x554
  211. /* I2S registers to handle during APE MBIST WAR */
  212. #define TEGRA210_I2S_BASE 0x1000
  213. #define TEGRA210_I2S_SIZE 0x100
  214. #define TEGRA210_I2S_CTRLS 5
  215. #define TEGRA210_I2S_CG 0x88
  216. #define TEGRA210_I2S_CTRL 0xa0
  217. /* DISPA registers to handle during MBIST WAR */
  218. #define DC_CMD_DISPLAY_COMMAND 0xc8
  219. #define DC_COM_DSC_TOP_CTL 0xcf8
  220. /* VIC register to handle during MBIST WAR */
  221. #define NV_PVIC_THI_SLCG_OVERRIDE_LOW 0x8c
  222. /* APE, DISPA and VIC base addesses needed for MBIST WAR */
  223. #define TEGRA210_AHUB_BASE 0x702d0000
  224. #define TEGRA210_DISPA_BASE 0x54200000
  225. #define TEGRA210_VIC_BASE 0x54340000
  226. /*
  227. * SDM fractional divisor is 16-bit 2's complement signed number within
  228. * (-2^12 ... 2^12-1) range. Represented in PLL data structure as unsigned
  229. * 16-bit value, with "0" divisor mapped to 0xFFFF. Data "0" is used to
  230. * indicate that SDM is disabled.
  231. *
  232. * Effective ndiv value when SDM is enabled: ndiv + 1/2 + sdm_din/2^13
  233. */
  234. #define PLL_SDM_COEFF BIT(13)
  235. #define sdin_din_to_data(din) ((u16)((din) ? : 0xFFFFU))
  236. #define sdin_data_to_din(dat) (((dat) == 0xFFFFU) ? 0 : (s16)dat)
  237. /* This macro returns ndiv effective scaled to SDM range */
  238. #define sdin_get_n_eff(cfg) ((cfg)->n * PLL_SDM_COEFF + ((cfg)->sdm_data ? \
  239. (PLL_SDM_COEFF/2 + sdin_data_to_din((cfg)->sdm_data)) : 0))
  240. /* Tegra CPU clock and reset control regs */
  241. #define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS 0x470
  242. #ifdef CONFIG_PM_SLEEP
  243. static struct cpu_clk_suspend_context {
  244. u32 clk_csite_src;
  245. } tegra210_cpu_clk_sctx;
  246. #endif
  247. struct tegra210_domain_mbist_war {
  248. void (*handle_lvl2_ovr)(struct tegra210_domain_mbist_war *mbist);
  249. const u32 lvl2_offset;
  250. const u32 lvl2_mask;
  251. const unsigned int num_clks;
  252. const unsigned int *clk_init_data;
  253. struct clk_bulk_data *clks;
  254. };
  255. static struct clk **clks;
  256. static void __iomem *clk_base;
  257. static void __iomem *pmc_base;
  258. static void __iomem *ahub_base;
  259. static void __iomem *dispa_base;
  260. static void __iomem *vic_base;
  261. static unsigned long osc_freq;
  262. static unsigned long pll_ref_freq;
  263. static DEFINE_SPINLOCK(pll_d_lock);
  264. static DEFINE_SPINLOCK(pll_e_lock);
  265. static DEFINE_SPINLOCK(pll_re_lock);
  266. static DEFINE_SPINLOCK(pll_u_lock);
  267. static DEFINE_SPINLOCK(sor0_lock);
  268. static DEFINE_SPINLOCK(sor1_lock);
  269. static DEFINE_SPINLOCK(emc_lock);
  270. static DEFINE_MUTEX(lvl2_ovr_lock);
  271. /* possible OSC frequencies in Hz */
  272. static unsigned long tegra210_input_freq[] = {
  273. [5] = 38400000,
  274. [8] = 12000000,
  275. };
  276. #define PLL_ENABLE (1 << 30)
  277. #define PLLCX_MISC1_IDDQ (1 << 27)
  278. #define PLLCX_MISC0_RESET (1 << 30)
  279. #define PLLCX_MISC0_DEFAULT_VALUE 0x40080000
  280. #define PLLCX_MISC0_WRITE_MASK 0x400ffffb
  281. #define PLLCX_MISC1_DEFAULT_VALUE 0x08000000
  282. #define PLLCX_MISC1_WRITE_MASK 0x08003cff
  283. #define PLLCX_MISC2_DEFAULT_VALUE 0x1f720f05
  284. #define PLLCX_MISC2_WRITE_MASK 0xffffff17
  285. #define PLLCX_MISC3_DEFAULT_VALUE 0x000000c4
  286. #define PLLCX_MISC3_WRITE_MASK 0x00ffffff
  287. /* PLLA */
  288. #define PLLA_BASE_IDDQ (1 << 25)
  289. #define PLLA_BASE_LOCK (1 << 27)
  290. #define PLLA_MISC0_LOCK_ENABLE (1 << 28)
  291. #define PLLA_MISC0_LOCK_OVERRIDE (1 << 27)
  292. #define PLLA_MISC2_EN_SDM (1 << 26)
  293. #define PLLA_MISC2_EN_DYNRAMP (1 << 25)
  294. #define PLLA_MISC0_DEFAULT_VALUE 0x12000020
  295. #define PLLA_MISC0_WRITE_MASK 0x7fffffff
  296. #define PLLA_MISC2_DEFAULT_VALUE 0x0
  297. #define PLLA_MISC2_WRITE_MASK 0x06ffffff
  298. /* PLLD */
  299. #define PLLD_BASE_CSI_CLKSOURCE (1 << 23)
  300. #define PLLD_MISC0_EN_SDM (1 << 16)
  301. #define PLLD_MISC0_LOCK_OVERRIDE (1 << 17)
  302. #define PLLD_MISC0_LOCK_ENABLE (1 << 18)
  303. #define PLLD_MISC0_IDDQ (1 << 20)
  304. #define PLLD_MISC0_DSI_CLKENABLE (1 << 21)
  305. #define PLLD_MISC0_DEFAULT_VALUE 0x00140000
  306. #define PLLD_MISC0_WRITE_MASK 0x3ff7ffff
  307. #define PLLD_MISC1_DEFAULT_VALUE 0x20
  308. #define PLLD_MISC1_WRITE_MASK 0x00ffffff
  309. /* PLLD2 and PLLDP and PLLC4 */
  310. #define PLLDSS_BASE_LOCK (1 << 27)
  311. #define PLLDSS_BASE_LOCK_OVERRIDE (1 << 24)
  312. #define PLLDSS_BASE_IDDQ (1 << 18)
  313. #define PLLDSS_BASE_REF_SEL_SHIFT 25
  314. #define PLLDSS_BASE_REF_SEL_MASK (0x3 << PLLDSS_BASE_REF_SEL_SHIFT)
  315. #define PLLDSS_MISC0_LOCK_ENABLE (1 << 30)
  316. #define PLLDSS_MISC1_CFG_EN_SDM (1 << 31)
  317. #define PLLDSS_MISC1_CFG_EN_SSC (1 << 30)
  318. #define PLLD2_MISC0_DEFAULT_VALUE 0x40000020
  319. #define PLLD2_MISC1_CFG_DEFAULT_VALUE 0x10000000
  320. #define PLLD2_MISC2_CTRL1_DEFAULT_VALUE 0x0
  321. #define PLLD2_MISC3_CTRL2_DEFAULT_VALUE 0x0
  322. #define PLLDP_MISC0_DEFAULT_VALUE 0x40000020
  323. #define PLLDP_MISC1_CFG_DEFAULT_VALUE 0xc0000000
  324. #define PLLDP_MISC2_CTRL1_DEFAULT_VALUE 0xf400f0da
  325. #define PLLDP_MISC3_CTRL2_DEFAULT_VALUE 0x2004f400
  326. #define PLLDSS_MISC0_WRITE_MASK 0x47ffffff
  327. #define PLLDSS_MISC1_CFG_WRITE_MASK 0xf8000000
  328. #define PLLDSS_MISC2_CTRL1_WRITE_MASK 0xffffffff
  329. #define PLLDSS_MISC3_CTRL2_WRITE_MASK 0xffffffff
  330. #define PLLC4_MISC0_DEFAULT_VALUE 0x40000000
  331. /* PLLRE */
  332. #define PLLRE_MISC0_LOCK_ENABLE (1 << 30)
  333. #define PLLRE_MISC0_LOCK_OVERRIDE (1 << 29)
  334. #define PLLRE_MISC0_LOCK (1 << 27)
  335. #define PLLRE_MISC0_IDDQ (1 << 24)
  336. #define PLLRE_BASE_DEFAULT_VALUE 0x0
  337. #define PLLRE_MISC0_DEFAULT_VALUE 0x41000000
  338. #define PLLRE_BASE_DEFAULT_MASK 0x1c000000
  339. #define PLLRE_MISC0_WRITE_MASK 0x67ffffff
  340. /* PLLE */
  341. #define PLLE_MISC_IDDQ_SW_CTRL (1 << 14)
  342. #define PLLE_AUX_USE_LOCKDET (1 << 3)
  343. #define PLLE_AUX_SS_SEQ_INCLUDE (1 << 31)
  344. #define PLLE_AUX_ENABLE_SWCTL (1 << 4)
  345. #define PLLE_AUX_SS_SWCTL (1 << 6)
  346. #define PLLE_AUX_SEQ_ENABLE (1 << 24)
  347. /* PLLX */
  348. #define PLLX_USE_DYN_RAMP 1
  349. #define PLLX_BASE_LOCK (1 << 27)
  350. #define PLLX_MISC0_FO_G_DISABLE (0x1 << 28)
  351. #define PLLX_MISC0_LOCK_ENABLE (0x1 << 18)
  352. #define PLLX_MISC2_DYNRAMP_STEPB_SHIFT 24
  353. #define PLLX_MISC2_DYNRAMP_STEPB_MASK (0xFF << PLLX_MISC2_DYNRAMP_STEPB_SHIFT)
  354. #define PLLX_MISC2_DYNRAMP_STEPA_SHIFT 16
  355. #define PLLX_MISC2_DYNRAMP_STEPA_MASK (0xFF << PLLX_MISC2_DYNRAMP_STEPA_SHIFT)
  356. #define PLLX_MISC2_NDIV_NEW_SHIFT 8
  357. #define PLLX_MISC2_NDIV_NEW_MASK (0xFF << PLLX_MISC2_NDIV_NEW_SHIFT)
  358. #define PLLX_MISC2_LOCK_OVERRIDE (0x1 << 4)
  359. #define PLLX_MISC2_DYNRAMP_DONE (0x1 << 2)
  360. #define PLLX_MISC2_EN_DYNRAMP (0x1 << 0)
  361. #define PLLX_MISC3_IDDQ (0x1 << 3)
  362. #define PLLX_MISC0_DEFAULT_VALUE PLLX_MISC0_LOCK_ENABLE
  363. #define PLLX_MISC0_WRITE_MASK 0x10c40000
  364. #define PLLX_MISC1_DEFAULT_VALUE 0x20
  365. #define PLLX_MISC1_WRITE_MASK 0x00ffffff
  366. #define PLLX_MISC2_DEFAULT_VALUE 0x0
  367. #define PLLX_MISC2_WRITE_MASK 0xffffff11
  368. #define PLLX_MISC3_DEFAULT_VALUE PLLX_MISC3_IDDQ
  369. #define PLLX_MISC3_WRITE_MASK 0x01ff0f0f
  370. #define PLLX_MISC4_DEFAULT_VALUE 0x0
  371. #define PLLX_MISC4_WRITE_MASK 0x8000ffff
  372. #define PLLX_MISC5_DEFAULT_VALUE 0x0
  373. #define PLLX_MISC5_WRITE_MASK 0x0000ffff
  374. #define PLLX_HW_CTRL_CFG 0x548
  375. #define PLLX_HW_CTRL_CFG_SWCTRL (0x1 << 0)
  376. /* PLLMB */
  377. #define PLLMB_BASE_LOCK (1 << 27)
  378. #define PLLMB_MISC1_LOCK_OVERRIDE (1 << 18)
  379. #define PLLMB_MISC1_IDDQ (1 << 17)
  380. #define PLLMB_MISC1_LOCK_ENABLE (1 << 16)
  381. #define PLLMB_MISC1_DEFAULT_VALUE 0x00030000
  382. #define PLLMB_MISC1_WRITE_MASK 0x0007ffff
  383. /* PLLP */
  384. #define PLLP_BASE_OVERRIDE (1 << 28)
  385. #define PLLP_BASE_LOCK (1 << 27)
  386. #define PLLP_MISC0_LOCK_ENABLE (1 << 18)
  387. #define PLLP_MISC0_LOCK_OVERRIDE (1 << 17)
  388. #define PLLP_MISC0_IDDQ (1 << 3)
  389. #define PLLP_MISC1_HSIO_EN_SHIFT 29
  390. #define PLLP_MISC1_HSIO_EN (1 << PLLP_MISC1_HSIO_EN_SHIFT)
  391. #define PLLP_MISC1_XUSB_EN_SHIFT 28
  392. #define PLLP_MISC1_XUSB_EN (1 << PLLP_MISC1_XUSB_EN_SHIFT)
  393. #define PLLP_MISC0_DEFAULT_VALUE 0x00040008
  394. #define PLLP_MISC1_DEFAULT_VALUE 0x0
  395. #define PLLP_MISC0_WRITE_MASK 0xdc6000f
  396. #define PLLP_MISC1_WRITE_MASK 0x70ffffff
  397. /* PLLU */
  398. #define PLLU_BASE_LOCK (1 << 27)
  399. #define PLLU_BASE_OVERRIDE (1 << 24)
  400. #define PLLU_BASE_CLKENABLE_USB (1 << 21)
  401. #define PLLU_BASE_CLKENABLE_HSIC (1 << 22)
  402. #define PLLU_BASE_CLKENABLE_ICUSB (1 << 23)
  403. #define PLLU_BASE_CLKENABLE_48M (1 << 25)
  404. #define PLLU_BASE_CLKENABLE_ALL (PLLU_BASE_CLKENABLE_USB |\
  405. PLLU_BASE_CLKENABLE_HSIC |\
  406. PLLU_BASE_CLKENABLE_ICUSB |\
  407. PLLU_BASE_CLKENABLE_48M)
  408. #define PLLU_MISC0_IDDQ (1 << 31)
  409. #define PLLU_MISC0_LOCK_ENABLE (1 << 29)
  410. #define PLLU_MISC1_LOCK_OVERRIDE (1 << 0)
  411. #define PLLU_MISC0_DEFAULT_VALUE 0xa0000000
  412. #define PLLU_MISC1_DEFAULT_VALUE 0x0
  413. #define PLLU_MISC0_WRITE_MASK 0xbfffffff
  414. #define PLLU_MISC1_WRITE_MASK 0x00000007
  415. bool tegra210_plle_hw_sequence_is_enabled(void)
  416. {
  417. u32 value;
  418. value = readl_relaxed(clk_base + PLLE_AUX);
  419. if (value & PLLE_AUX_SEQ_ENABLE)
  420. return true;
  421. return false;
  422. }
  423. EXPORT_SYMBOL_GPL(tegra210_plle_hw_sequence_is_enabled);
  424. int tegra210_plle_hw_sequence_start(void)
  425. {
  426. u32 value;
  427. if (tegra210_plle_hw_sequence_is_enabled())
  428. return 0;
  429. /* skip if PLLE is not enabled yet */
  430. value = readl_relaxed(clk_base + PLLE_MISC0);
  431. if (!(value & PLLE_MISC_LOCK))
  432. return -EIO;
  433. value &= ~PLLE_MISC_IDDQ_SW_CTRL;
  434. writel_relaxed(value, clk_base + PLLE_MISC0);
  435. value = readl_relaxed(clk_base + PLLE_AUX);
  436. value |= (PLLE_AUX_USE_LOCKDET | PLLE_AUX_SS_SEQ_INCLUDE);
  437. value &= ~(PLLE_AUX_ENABLE_SWCTL | PLLE_AUX_SS_SWCTL);
  438. writel_relaxed(value, clk_base + PLLE_AUX);
  439. fence_udelay(1, clk_base);
  440. value |= PLLE_AUX_SEQ_ENABLE;
  441. writel_relaxed(value, clk_base + PLLE_AUX);
  442. fence_udelay(1, clk_base);
  443. return 0;
  444. }
  445. EXPORT_SYMBOL_GPL(tegra210_plle_hw_sequence_start);
  446. void tegra210_xusb_pll_hw_control_enable(void)
  447. {
  448. u32 val;
  449. val = readl_relaxed(clk_base + XUSBIO_PLL_CFG0);
  450. val &= ~(XUSBIO_PLL_CFG0_CLK_ENABLE_SWCTL |
  451. XUSBIO_PLL_CFG0_PADPLL_RESET_SWCTL);
  452. val |= XUSBIO_PLL_CFG0_PADPLL_USE_LOCKDET |
  453. XUSBIO_PLL_CFG0_PADPLL_SLEEP_IDDQ;
  454. writel_relaxed(val, clk_base + XUSBIO_PLL_CFG0);
  455. }
  456. EXPORT_SYMBOL_GPL(tegra210_xusb_pll_hw_control_enable);
  457. void tegra210_xusb_pll_hw_sequence_start(void)
  458. {
  459. u32 val;
  460. val = readl_relaxed(clk_base + XUSBIO_PLL_CFG0);
  461. val |= XUSBIO_PLL_CFG0_SEQ_ENABLE;
  462. writel_relaxed(val, clk_base + XUSBIO_PLL_CFG0);
  463. }
  464. EXPORT_SYMBOL_GPL(tegra210_xusb_pll_hw_sequence_start);
  465. void tegra210_sata_pll_hw_control_enable(void)
  466. {
  467. u32 val;
  468. val = readl_relaxed(clk_base + SATA_PLL_CFG0);
  469. val &= ~SATA_PLL_CFG0_PADPLL_RESET_SWCTL;
  470. val |= SATA_PLL_CFG0_PADPLL_USE_LOCKDET |
  471. SATA_PLL_CFG0_PADPLL_SLEEP_IDDQ;
  472. writel_relaxed(val, clk_base + SATA_PLL_CFG0);
  473. }
  474. EXPORT_SYMBOL_GPL(tegra210_sata_pll_hw_control_enable);
  475. void tegra210_sata_pll_hw_sequence_start(void)
  476. {
  477. u32 val;
  478. val = readl_relaxed(clk_base + SATA_PLL_CFG0);
  479. val |= SATA_PLL_CFG0_SEQ_ENABLE;
  480. writel_relaxed(val, clk_base + SATA_PLL_CFG0);
  481. }
  482. EXPORT_SYMBOL_GPL(tegra210_sata_pll_hw_sequence_start);
  483. void tegra210_set_sata_pll_seq_sw(bool state)
  484. {
  485. u32 val;
  486. val = readl_relaxed(clk_base + SATA_PLL_CFG0);
  487. if (state) {
  488. val |= SATA_PLL_CFG0_SATA_SEQ_IN_SWCTL;
  489. val |= SATA_PLL_CFG0_SATA_SEQ_RESET_INPUT_VALUE;
  490. val |= SATA_PLL_CFG0_SATA_SEQ_LANE_PD_INPUT_VALUE;
  491. val |= SATA_PLL_CFG0_SATA_SEQ_PADPLL_PD_INPUT_VALUE;
  492. } else {
  493. val &= ~SATA_PLL_CFG0_SATA_SEQ_IN_SWCTL;
  494. val &= ~SATA_PLL_CFG0_SATA_SEQ_RESET_INPUT_VALUE;
  495. val &= ~SATA_PLL_CFG0_SATA_SEQ_LANE_PD_INPUT_VALUE;
  496. val &= ~SATA_PLL_CFG0_SATA_SEQ_PADPLL_PD_INPUT_VALUE;
  497. }
  498. writel_relaxed(val, clk_base + SATA_PLL_CFG0);
  499. }
  500. EXPORT_SYMBOL_GPL(tegra210_set_sata_pll_seq_sw);
  501. void tegra210_clk_emc_dll_enable(bool flag)
  502. {
  503. u32 offset = flag ? CLK_RST_CONTROLLER_CLK_OUT_ENB_X_SET :
  504. CLK_RST_CONTROLLER_CLK_OUT_ENB_X_CLR;
  505. writel_relaxed(CLK_OUT_ENB_X_CLK_ENB_EMC_DLL, clk_base + offset);
  506. }
  507. EXPORT_SYMBOL_GPL(tegra210_clk_emc_dll_enable);
  508. void tegra210_clk_emc_dll_update_setting(u32 emc_dll_src_value)
  509. {
  510. writel_relaxed(emc_dll_src_value, clk_base + CLK_SOURCE_EMC_DLL);
  511. }
  512. EXPORT_SYMBOL_GPL(tegra210_clk_emc_dll_update_setting);
  513. void tegra210_clk_emc_update_setting(u32 emc_src_value)
  514. {
  515. writel_relaxed(emc_src_value, clk_base + CLK_SOURCE_EMC);
  516. }
  517. EXPORT_SYMBOL_GPL(tegra210_clk_emc_update_setting);
  518. static void tegra210_generic_mbist_war(struct tegra210_domain_mbist_war *mbist)
  519. {
  520. u32 val;
  521. val = readl_relaxed(clk_base + mbist->lvl2_offset);
  522. writel_relaxed(val | mbist->lvl2_mask, clk_base + mbist->lvl2_offset);
  523. fence_udelay(1, clk_base);
  524. writel_relaxed(val, clk_base + mbist->lvl2_offset);
  525. fence_udelay(1, clk_base);
  526. }
  527. static void tegra210_venc_mbist_war(struct tegra210_domain_mbist_war *mbist)
  528. {
  529. u32 csi_src, ovra, ovre;
  530. unsigned long flags = 0;
  531. spin_lock_irqsave(&pll_d_lock, flags);
  532. csi_src = readl_relaxed(clk_base + PLLD_BASE);
  533. writel_relaxed(csi_src | PLLD_BASE_CSI_CLKSOURCE, clk_base + PLLD_BASE);
  534. fence_udelay(1, clk_base);
  535. ovra = readl_relaxed(clk_base + LVL2_CLK_GATE_OVRA);
  536. writel_relaxed(ovra | BIT(15), clk_base + LVL2_CLK_GATE_OVRA);
  537. ovre = readl_relaxed(clk_base + LVL2_CLK_GATE_OVRE);
  538. writel_relaxed(ovre | BIT(3), clk_base + LVL2_CLK_GATE_OVRE);
  539. fence_udelay(1, clk_base);
  540. writel_relaxed(ovra, clk_base + LVL2_CLK_GATE_OVRA);
  541. writel_relaxed(ovre, clk_base + LVL2_CLK_GATE_OVRE);
  542. writel_relaxed(csi_src, clk_base + PLLD_BASE);
  543. fence_udelay(1, clk_base);
  544. spin_unlock_irqrestore(&pll_d_lock, flags);
  545. }
  546. static void tegra210_disp_mbist_war(struct tegra210_domain_mbist_war *mbist)
  547. {
  548. u32 ovra, dsc_top_ctrl;
  549. ovra = readl_relaxed(clk_base + LVL2_CLK_GATE_OVRA);
  550. writel_relaxed(ovra | BIT(1), clk_base + LVL2_CLK_GATE_OVRA);
  551. fence_udelay(1, clk_base);
  552. dsc_top_ctrl = readl_relaxed(dispa_base + DC_COM_DSC_TOP_CTL);
  553. writel_relaxed(dsc_top_ctrl | BIT(2), dispa_base + DC_COM_DSC_TOP_CTL);
  554. readl_relaxed(dispa_base + DC_CMD_DISPLAY_COMMAND);
  555. writel_relaxed(dsc_top_ctrl, dispa_base + DC_COM_DSC_TOP_CTL);
  556. readl_relaxed(dispa_base + DC_CMD_DISPLAY_COMMAND);
  557. writel_relaxed(ovra, clk_base + LVL2_CLK_GATE_OVRA);
  558. fence_udelay(1, clk_base);
  559. }
  560. static void tegra210_vic_mbist_war(struct tegra210_domain_mbist_war *mbist)
  561. {
  562. u32 ovre, val;
  563. ovre = readl_relaxed(clk_base + LVL2_CLK_GATE_OVRE);
  564. writel_relaxed(ovre | BIT(5), clk_base + LVL2_CLK_GATE_OVRE);
  565. fence_udelay(1, clk_base);
  566. val = readl_relaxed(vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW);
  567. writel_relaxed(val | BIT(0) | GENMASK(7, 2) | BIT(24),
  568. vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW);
  569. fence_udelay(1, vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW);
  570. writel_relaxed(val, vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW);
  571. readl(vic_base + NV_PVIC_THI_SLCG_OVERRIDE_LOW);
  572. writel_relaxed(ovre, clk_base + LVL2_CLK_GATE_OVRE);
  573. fence_udelay(1, clk_base);
  574. }
  575. static void tegra210_ape_mbist_war(struct tegra210_domain_mbist_war *mbist)
  576. {
  577. void __iomem *i2s_base;
  578. unsigned int i;
  579. u32 ovrc, ovre;
  580. ovrc = readl_relaxed(clk_base + LVL2_CLK_GATE_OVRC);
  581. ovre = readl_relaxed(clk_base + LVL2_CLK_GATE_OVRE);
  582. writel_relaxed(ovrc | BIT(1), clk_base + LVL2_CLK_GATE_OVRC);
  583. writel_relaxed(ovre | BIT(10) | BIT(11),
  584. clk_base + LVL2_CLK_GATE_OVRE);
  585. fence_udelay(1, clk_base);
  586. i2s_base = ahub_base + TEGRA210_I2S_BASE;
  587. for (i = 0; i < TEGRA210_I2S_CTRLS; i++) {
  588. u32 i2s_ctrl;
  589. i2s_ctrl = readl_relaxed(i2s_base + TEGRA210_I2S_CTRL);
  590. writel_relaxed(i2s_ctrl | BIT(10),
  591. i2s_base + TEGRA210_I2S_CTRL);
  592. writel_relaxed(0, i2s_base + TEGRA210_I2S_CG);
  593. readl(i2s_base + TEGRA210_I2S_CG);
  594. writel_relaxed(1, i2s_base + TEGRA210_I2S_CG);
  595. writel_relaxed(i2s_ctrl, i2s_base + TEGRA210_I2S_CTRL);
  596. readl(i2s_base + TEGRA210_I2S_CTRL);
  597. i2s_base += TEGRA210_I2S_SIZE;
  598. }
  599. writel_relaxed(ovrc, clk_base + LVL2_CLK_GATE_OVRC);
  600. writel_relaxed(ovre, clk_base + LVL2_CLK_GATE_OVRE);
  601. fence_udelay(1, clk_base);
  602. }
  603. static inline void _pll_misc_chk_default(void __iomem *base,
  604. struct tegra_clk_pll_params *params,
  605. u8 misc_num, u32 default_val, u32 mask)
  606. {
  607. u32 boot_val = readl_relaxed(base + params->ext_misc_reg[misc_num]);
  608. boot_val &= mask;
  609. default_val &= mask;
  610. if (boot_val != default_val) {
  611. pr_warn("boot misc%d 0x%x: expected 0x%x\n",
  612. misc_num, boot_val, default_val);
  613. pr_warn(" (comparison mask = 0x%x)\n", mask);
  614. params->defaults_set = false;
  615. }
  616. }
  617. /*
  618. * PLLCX: PLLC, PLLC2, PLLC3, PLLA1
  619. * Hybrid PLLs with dynamic ramp. Dynamic ramp is allowed for any transition
  620. * that changes NDIV only, while PLL is already locked.
  621. */
  622. static void pllcx_check_defaults(struct tegra_clk_pll_params *params)
  623. {
  624. u32 default_val;
  625. default_val = PLLCX_MISC0_DEFAULT_VALUE & (~PLLCX_MISC0_RESET);
  626. _pll_misc_chk_default(clk_base, params, 0, default_val,
  627. PLLCX_MISC0_WRITE_MASK);
  628. default_val = PLLCX_MISC1_DEFAULT_VALUE & (~PLLCX_MISC1_IDDQ);
  629. _pll_misc_chk_default(clk_base, params, 1, default_val,
  630. PLLCX_MISC1_WRITE_MASK);
  631. default_val = PLLCX_MISC2_DEFAULT_VALUE;
  632. _pll_misc_chk_default(clk_base, params, 2, default_val,
  633. PLLCX_MISC2_WRITE_MASK);
  634. default_val = PLLCX_MISC3_DEFAULT_VALUE;
  635. _pll_misc_chk_default(clk_base, params, 3, default_val,
  636. PLLCX_MISC3_WRITE_MASK);
  637. }
  638. static void tegra210_pllcx_set_defaults(const char *name,
  639. struct tegra_clk_pll *pllcx)
  640. {
  641. pllcx->params->defaults_set = true;
  642. if (readl_relaxed(clk_base + pllcx->params->base_reg) & PLL_ENABLE) {
  643. /* PLL is ON: only check if defaults already set */
  644. pllcx_check_defaults(pllcx->params);
  645. if (!pllcx->params->defaults_set)
  646. pr_warn("%s already enabled. Postponing set full defaults\n",
  647. name);
  648. return;
  649. }
  650. /* Defaults assert PLL reset, and set IDDQ */
  651. writel_relaxed(PLLCX_MISC0_DEFAULT_VALUE,
  652. clk_base + pllcx->params->ext_misc_reg[0]);
  653. writel_relaxed(PLLCX_MISC1_DEFAULT_VALUE,
  654. clk_base + pllcx->params->ext_misc_reg[1]);
  655. writel_relaxed(PLLCX_MISC2_DEFAULT_VALUE,
  656. clk_base + pllcx->params->ext_misc_reg[2]);
  657. writel_relaxed(PLLCX_MISC3_DEFAULT_VALUE,
  658. clk_base + pllcx->params->ext_misc_reg[3]);
  659. udelay(1);
  660. }
  661. static void _pllc_set_defaults(struct tegra_clk_pll *pllcx)
  662. {
  663. tegra210_pllcx_set_defaults("PLL_C", pllcx);
  664. }
  665. static void _pllc2_set_defaults(struct tegra_clk_pll *pllcx)
  666. {
  667. tegra210_pllcx_set_defaults("PLL_C2", pllcx);
  668. }
  669. static void _pllc3_set_defaults(struct tegra_clk_pll *pllcx)
  670. {
  671. tegra210_pllcx_set_defaults("PLL_C3", pllcx);
  672. }
  673. static void _plla1_set_defaults(struct tegra_clk_pll *pllcx)
  674. {
  675. tegra210_pllcx_set_defaults("PLL_A1", pllcx);
  676. }
  677. /*
  678. * PLLA
  679. * PLL with dynamic ramp and fractional SDM. Dynamic ramp is not used.
  680. * Fractional SDM is allowed to provide exact audio rates.
  681. */
  682. static void tegra210_plla_set_defaults(struct tegra_clk_pll *plla)
  683. {
  684. u32 mask;
  685. u32 val = readl_relaxed(clk_base + plla->params->base_reg);
  686. plla->params->defaults_set = true;
  687. if (val & PLL_ENABLE) {
  688. /*
  689. * PLL is ON: check if defaults already set, then set those
  690. * that can be updated in flight.
  691. */
  692. if (val & PLLA_BASE_IDDQ) {
  693. pr_warn("PLL_A boot enabled with IDDQ set\n");
  694. plla->params->defaults_set = false;
  695. }
  696. pr_warn("PLL_A already enabled. Postponing set full defaults\n");
  697. val = PLLA_MISC0_DEFAULT_VALUE; /* ignore lock enable */
  698. mask = PLLA_MISC0_LOCK_ENABLE | PLLA_MISC0_LOCK_OVERRIDE;
  699. _pll_misc_chk_default(clk_base, plla->params, 0, val,
  700. ~mask & PLLA_MISC0_WRITE_MASK);
  701. val = PLLA_MISC2_DEFAULT_VALUE; /* ignore all but control bit */
  702. _pll_misc_chk_default(clk_base, plla->params, 2, val,
  703. PLLA_MISC2_EN_DYNRAMP);
  704. /* Enable lock detect */
  705. val = readl_relaxed(clk_base + plla->params->ext_misc_reg[0]);
  706. val &= ~mask;
  707. val |= PLLA_MISC0_DEFAULT_VALUE & mask;
  708. writel_relaxed(val, clk_base + plla->params->ext_misc_reg[0]);
  709. udelay(1);
  710. return;
  711. }
  712. /* set IDDQ, enable lock detect, disable dynamic ramp and SDM */
  713. val |= PLLA_BASE_IDDQ;
  714. writel_relaxed(val, clk_base + plla->params->base_reg);
  715. writel_relaxed(PLLA_MISC0_DEFAULT_VALUE,
  716. clk_base + plla->params->ext_misc_reg[0]);
  717. writel_relaxed(PLLA_MISC2_DEFAULT_VALUE,
  718. clk_base + plla->params->ext_misc_reg[2]);
  719. udelay(1);
  720. }
  721. /*
  722. * PLLD
  723. * PLL with fractional SDM.
  724. */
  725. static void tegra210_plld_set_defaults(struct tegra_clk_pll *plld)
  726. {
  727. u32 val;
  728. u32 mask = 0xffff;
  729. plld->params->defaults_set = true;
  730. if (readl_relaxed(clk_base + plld->params->base_reg) &
  731. PLL_ENABLE) {
  732. /*
  733. * PLL is ON: check if defaults already set, then set those
  734. * that can be updated in flight.
  735. */
  736. val = PLLD_MISC1_DEFAULT_VALUE;
  737. _pll_misc_chk_default(clk_base, plld->params, 1,
  738. val, PLLD_MISC1_WRITE_MASK);
  739. /* ignore lock, DSI and SDM controls, make sure IDDQ not set */
  740. val = PLLD_MISC0_DEFAULT_VALUE & (~PLLD_MISC0_IDDQ);
  741. mask |= PLLD_MISC0_DSI_CLKENABLE | PLLD_MISC0_LOCK_ENABLE |
  742. PLLD_MISC0_LOCK_OVERRIDE | PLLD_MISC0_EN_SDM;
  743. _pll_misc_chk_default(clk_base, plld->params, 0, val,
  744. ~mask & PLLD_MISC0_WRITE_MASK);
  745. if (!plld->params->defaults_set)
  746. pr_warn("PLL_D already enabled. Postponing set full defaults\n");
  747. /* Enable lock detect */
  748. mask = PLLD_MISC0_LOCK_ENABLE | PLLD_MISC0_LOCK_OVERRIDE;
  749. val = readl_relaxed(clk_base + plld->params->ext_misc_reg[0]);
  750. val &= ~mask;
  751. val |= PLLD_MISC0_DEFAULT_VALUE & mask;
  752. writel_relaxed(val, clk_base + plld->params->ext_misc_reg[0]);
  753. udelay(1);
  754. return;
  755. }
  756. val = readl_relaxed(clk_base + plld->params->ext_misc_reg[0]);
  757. val &= PLLD_MISC0_DSI_CLKENABLE;
  758. val |= PLLD_MISC0_DEFAULT_VALUE;
  759. /* set IDDQ, enable lock detect, disable SDM */
  760. writel_relaxed(val, clk_base + plld->params->ext_misc_reg[0]);
  761. writel_relaxed(PLLD_MISC1_DEFAULT_VALUE, clk_base +
  762. plld->params->ext_misc_reg[1]);
  763. udelay(1);
  764. }
  765. /*
  766. * PLLD2, PLLDP
  767. * PLL with fractional SDM and Spread Spectrum (SDM is a must if SSC is used).
  768. */
  769. static void plldss_defaults(const char *pll_name, struct tegra_clk_pll *plldss,
  770. u32 misc0_val, u32 misc1_val, u32 misc2_val, u32 misc3_val)
  771. {
  772. u32 default_val;
  773. u32 val = readl_relaxed(clk_base + plldss->params->base_reg);
  774. plldss->params->defaults_set = true;
  775. if (val & PLL_ENABLE) {
  776. /*
  777. * PLL is ON: check if defaults already set, then set those
  778. * that can be updated in flight.
  779. */
  780. if (val & PLLDSS_BASE_IDDQ) {
  781. pr_warn("plldss boot enabled with IDDQ set\n");
  782. plldss->params->defaults_set = false;
  783. }
  784. /* ignore lock enable */
  785. default_val = misc0_val;
  786. _pll_misc_chk_default(clk_base, plldss->params, 0, default_val,
  787. PLLDSS_MISC0_WRITE_MASK &
  788. (~PLLDSS_MISC0_LOCK_ENABLE));
  789. /*
  790. * If SSC is used, check all settings, otherwise just confirm
  791. * that SSC is not used on boot as well. Do nothing when using
  792. * this function for PLLC4 that has only MISC0.
  793. */
  794. if (plldss->params->ssc_ctrl_en_mask) {
  795. default_val = misc1_val;
  796. _pll_misc_chk_default(clk_base, plldss->params, 1,
  797. default_val, PLLDSS_MISC1_CFG_WRITE_MASK);
  798. default_val = misc2_val;
  799. _pll_misc_chk_default(clk_base, plldss->params, 2,
  800. default_val, PLLDSS_MISC2_CTRL1_WRITE_MASK);
  801. default_val = misc3_val;
  802. _pll_misc_chk_default(clk_base, plldss->params, 3,
  803. default_val, PLLDSS_MISC3_CTRL2_WRITE_MASK);
  804. } else if (plldss->params->ext_misc_reg[1]) {
  805. default_val = misc1_val;
  806. _pll_misc_chk_default(clk_base, plldss->params, 1,
  807. default_val, PLLDSS_MISC1_CFG_WRITE_MASK &
  808. (~PLLDSS_MISC1_CFG_EN_SDM));
  809. }
  810. if (!plldss->params->defaults_set)
  811. pr_warn("%s already enabled. Postponing set full defaults\n",
  812. pll_name);
  813. /* Enable lock detect */
  814. if (val & PLLDSS_BASE_LOCK_OVERRIDE) {
  815. val &= ~PLLDSS_BASE_LOCK_OVERRIDE;
  816. writel_relaxed(val, clk_base +
  817. plldss->params->base_reg);
  818. }
  819. val = readl_relaxed(clk_base + plldss->params->ext_misc_reg[0]);
  820. val &= ~PLLDSS_MISC0_LOCK_ENABLE;
  821. val |= misc0_val & PLLDSS_MISC0_LOCK_ENABLE;
  822. writel_relaxed(val, clk_base + plldss->params->ext_misc_reg[0]);
  823. udelay(1);
  824. return;
  825. }
  826. /* set IDDQ, enable lock detect, configure SDM/SSC */
  827. val |= PLLDSS_BASE_IDDQ;
  828. val &= ~PLLDSS_BASE_LOCK_OVERRIDE;
  829. writel_relaxed(val, clk_base + plldss->params->base_reg);
  830. /* When using this function for PLLC4 exit here */
  831. if (!plldss->params->ext_misc_reg[1]) {
  832. writel_relaxed(misc0_val, clk_base +
  833. plldss->params->ext_misc_reg[0]);
  834. udelay(1);
  835. return;
  836. }
  837. writel_relaxed(misc0_val, clk_base +
  838. plldss->params->ext_misc_reg[0]);
  839. /* if SSC used set by 1st enable */
  840. writel_relaxed(misc1_val & (~PLLDSS_MISC1_CFG_EN_SSC),
  841. clk_base + plldss->params->ext_misc_reg[1]);
  842. writel_relaxed(misc2_val, clk_base + plldss->params->ext_misc_reg[2]);
  843. writel_relaxed(misc3_val, clk_base + plldss->params->ext_misc_reg[3]);
  844. udelay(1);
  845. }
  846. static void tegra210_plld2_set_defaults(struct tegra_clk_pll *plld2)
  847. {
  848. plldss_defaults("PLL_D2", plld2, PLLD2_MISC0_DEFAULT_VALUE,
  849. PLLD2_MISC1_CFG_DEFAULT_VALUE,
  850. PLLD2_MISC2_CTRL1_DEFAULT_VALUE,
  851. PLLD2_MISC3_CTRL2_DEFAULT_VALUE);
  852. }
  853. static void tegra210_plldp_set_defaults(struct tegra_clk_pll *plldp)
  854. {
  855. plldss_defaults("PLL_DP", plldp, PLLDP_MISC0_DEFAULT_VALUE,
  856. PLLDP_MISC1_CFG_DEFAULT_VALUE,
  857. PLLDP_MISC2_CTRL1_DEFAULT_VALUE,
  858. PLLDP_MISC3_CTRL2_DEFAULT_VALUE);
  859. }
  860. /*
  861. * PLLC4
  862. * Base and misc0 layout is the same as PLLD2/PLLDP, but no SDM/SSC support.
  863. * VCO is exposed to the clock tree via fixed 1/3 and 1/5 dividers.
  864. */
  865. static void tegra210_pllc4_set_defaults(struct tegra_clk_pll *pllc4)
  866. {
  867. plldss_defaults("PLL_C4", pllc4, PLLC4_MISC0_DEFAULT_VALUE, 0, 0, 0);
  868. }
  869. /*
  870. * PLLRE
  871. * VCO is exposed to the clock tree directly along with post-divider output
  872. */
  873. static void tegra210_pllre_set_defaults(struct tegra_clk_pll *pllre)
  874. {
  875. u32 mask;
  876. u32 val = readl_relaxed(clk_base + pllre->params->base_reg);
  877. pllre->params->defaults_set = true;
  878. if (val & PLL_ENABLE) {
  879. /*
  880. * PLL is ON: check if defaults already set, then set those
  881. * that can be updated in flight.
  882. */
  883. val &= PLLRE_BASE_DEFAULT_MASK;
  884. if (val != PLLRE_BASE_DEFAULT_VALUE) {
  885. pr_warn("pllre boot base 0x%x : expected 0x%x\n",
  886. val, PLLRE_BASE_DEFAULT_VALUE);
  887. pr_warn("(comparison mask = 0x%x)\n",
  888. PLLRE_BASE_DEFAULT_MASK);
  889. pllre->params->defaults_set = false;
  890. }
  891. /* Ignore lock enable */
  892. val = PLLRE_MISC0_DEFAULT_VALUE & (~PLLRE_MISC0_IDDQ);
  893. mask = PLLRE_MISC0_LOCK_ENABLE | PLLRE_MISC0_LOCK_OVERRIDE;
  894. _pll_misc_chk_default(clk_base, pllre->params, 0, val,
  895. ~mask & PLLRE_MISC0_WRITE_MASK);
  896. /* The PLL doesn't work if it's in IDDQ. */
  897. val = readl_relaxed(clk_base + pllre->params->ext_misc_reg[0]);
  898. if (val & PLLRE_MISC0_IDDQ)
  899. pr_warn("unexpected IDDQ bit set for enabled clock\n");
  900. /* Enable lock detect */
  901. val &= ~mask;
  902. val |= PLLRE_MISC0_DEFAULT_VALUE & mask;
  903. writel_relaxed(val, clk_base + pllre->params->ext_misc_reg[0]);
  904. udelay(1);
  905. if (!pllre->params->defaults_set)
  906. pr_warn("PLL_RE already enabled. Postponing set full defaults\n");
  907. return;
  908. }
  909. /* set IDDQ, enable lock detect */
  910. val &= ~PLLRE_BASE_DEFAULT_MASK;
  911. val |= PLLRE_BASE_DEFAULT_VALUE & PLLRE_BASE_DEFAULT_MASK;
  912. writel_relaxed(val, clk_base + pllre->params->base_reg);
  913. writel_relaxed(PLLRE_MISC0_DEFAULT_VALUE,
  914. clk_base + pllre->params->ext_misc_reg[0]);
  915. udelay(1);
  916. }
  917. static void pllx_get_dyn_steps(struct clk_hw *hw, u32 *step_a, u32 *step_b)
  918. {
  919. unsigned long input_rate;
  920. /* cf rate */
  921. if (!IS_ERR_OR_NULL(hw->clk))
  922. input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
  923. else
  924. input_rate = 38400000;
  925. input_rate /= tegra_pll_get_fixed_mdiv(hw, input_rate);
  926. switch (input_rate) {
  927. case 12000000:
  928. case 12800000:
  929. case 13000000:
  930. *step_a = 0x2B;
  931. *step_b = 0x0B;
  932. return;
  933. case 19200000:
  934. *step_a = 0x12;
  935. *step_b = 0x08;
  936. return;
  937. case 38400000:
  938. *step_a = 0x04;
  939. *step_b = 0x05;
  940. return;
  941. default:
  942. pr_err("%s: Unexpected reference rate %lu\n",
  943. __func__, input_rate);
  944. BUG();
  945. }
  946. }
  947. static void pllx_check_defaults(struct tegra_clk_pll *pll)
  948. {
  949. u32 default_val;
  950. default_val = PLLX_MISC0_DEFAULT_VALUE;
  951. /* ignore lock enable */
  952. _pll_misc_chk_default(clk_base, pll->params, 0, default_val,
  953. PLLX_MISC0_WRITE_MASK & (~PLLX_MISC0_LOCK_ENABLE));
  954. default_val = PLLX_MISC1_DEFAULT_VALUE;
  955. _pll_misc_chk_default(clk_base, pll->params, 1, default_val,
  956. PLLX_MISC1_WRITE_MASK);
  957. /* ignore all but control bit */
  958. default_val = PLLX_MISC2_DEFAULT_VALUE;
  959. _pll_misc_chk_default(clk_base, pll->params, 2,
  960. default_val, PLLX_MISC2_EN_DYNRAMP);
  961. default_val = PLLX_MISC3_DEFAULT_VALUE & (~PLLX_MISC3_IDDQ);
  962. _pll_misc_chk_default(clk_base, pll->params, 3, default_val,
  963. PLLX_MISC3_WRITE_MASK);
  964. default_val = PLLX_MISC4_DEFAULT_VALUE;
  965. _pll_misc_chk_default(clk_base, pll->params, 4, default_val,
  966. PLLX_MISC4_WRITE_MASK);
  967. default_val = PLLX_MISC5_DEFAULT_VALUE;
  968. _pll_misc_chk_default(clk_base, pll->params, 5, default_val,
  969. PLLX_MISC5_WRITE_MASK);
  970. }
  971. static void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx)
  972. {
  973. u32 val;
  974. u32 step_a, step_b;
  975. pllx->params->defaults_set = true;
  976. /* Get ready dyn ramp state machine settings */
  977. pllx_get_dyn_steps(&pllx->hw, &step_a, &step_b);
  978. val = PLLX_MISC2_DEFAULT_VALUE & (~PLLX_MISC2_DYNRAMP_STEPA_MASK) &
  979. (~PLLX_MISC2_DYNRAMP_STEPB_MASK);
  980. val |= step_a << PLLX_MISC2_DYNRAMP_STEPA_SHIFT;
  981. val |= step_b << PLLX_MISC2_DYNRAMP_STEPB_SHIFT;
  982. if (readl_relaxed(clk_base + pllx->params->base_reg) & PLL_ENABLE) {
  983. /*
  984. * PLL is ON: check if defaults already set, then set those
  985. * that can be updated in flight.
  986. */
  987. pllx_check_defaults(pllx);
  988. if (!pllx->params->defaults_set)
  989. pr_warn("PLL_X already enabled. Postponing set full defaults\n");
  990. /* Configure dyn ramp, disable lock override */
  991. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  992. /* Enable lock detect */
  993. val = readl_relaxed(clk_base + pllx->params->ext_misc_reg[0]);
  994. val &= ~PLLX_MISC0_LOCK_ENABLE;
  995. val |= PLLX_MISC0_DEFAULT_VALUE & PLLX_MISC0_LOCK_ENABLE;
  996. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[0]);
  997. udelay(1);
  998. return;
  999. }
  1000. /* Enable lock detect and CPU output */
  1001. writel_relaxed(PLLX_MISC0_DEFAULT_VALUE, clk_base +
  1002. pllx->params->ext_misc_reg[0]);
  1003. /* Setup */
  1004. writel_relaxed(PLLX_MISC1_DEFAULT_VALUE, clk_base +
  1005. pllx->params->ext_misc_reg[1]);
  1006. /* Configure dyn ramp state machine, disable lock override */
  1007. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  1008. /* Set IDDQ */
  1009. writel_relaxed(PLLX_MISC3_DEFAULT_VALUE, clk_base +
  1010. pllx->params->ext_misc_reg[3]);
  1011. /* Disable SDM */
  1012. writel_relaxed(PLLX_MISC4_DEFAULT_VALUE, clk_base +
  1013. pllx->params->ext_misc_reg[4]);
  1014. writel_relaxed(PLLX_MISC5_DEFAULT_VALUE, clk_base +
  1015. pllx->params->ext_misc_reg[5]);
  1016. udelay(1);
  1017. }
  1018. /* PLLMB */
  1019. static void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
  1020. {
  1021. u32 mask, val = readl_relaxed(clk_base + pllmb->params->base_reg);
  1022. pllmb->params->defaults_set = true;
  1023. if (val & PLL_ENABLE) {
  1024. /*
  1025. * PLL is ON: check if defaults already set, then set those
  1026. * that can be updated in flight.
  1027. */
  1028. val = PLLMB_MISC1_DEFAULT_VALUE & (~PLLMB_MISC1_IDDQ);
  1029. mask = PLLMB_MISC1_LOCK_ENABLE | PLLMB_MISC1_LOCK_OVERRIDE;
  1030. _pll_misc_chk_default(clk_base, pllmb->params, 0, val,
  1031. ~mask & PLLMB_MISC1_WRITE_MASK);
  1032. if (!pllmb->params->defaults_set)
  1033. pr_warn("PLL_MB already enabled. Postponing set full defaults\n");
  1034. /* Enable lock detect */
  1035. val = readl_relaxed(clk_base + pllmb->params->ext_misc_reg[0]);
  1036. val &= ~mask;
  1037. val |= PLLMB_MISC1_DEFAULT_VALUE & mask;
  1038. writel_relaxed(val, clk_base + pllmb->params->ext_misc_reg[0]);
  1039. udelay(1);
  1040. return;
  1041. }
  1042. /* set IDDQ, enable lock detect */
  1043. writel_relaxed(PLLMB_MISC1_DEFAULT_VALUE,
  1044. clk_base + pllmb->params->ext_misc_reg[0]);
  1045. udelay(1);
  1046. }
  1047. /*
  1048. * PLLP
  1049. * VCO is exposed to the clock tree directly along with post-divider output.
  1050. * Both VCO and post-divider output rates are fixed at 408MHz and 204MHz,
  1051. * respectively.
  1052. */
  1053. static void pllp_check_defaults(struct tegra_clk_pll *pll, bool enabled)
  1054. {
  1055. u32 val, mask;
  1056. /* Ignore lock enable (will be set), make sure not in IDDQ if enabled */
  1057. val = PLLP_MISC0_DEFAULT_VALUE & (~PLLP_MISC0_IDDQ);
  1058. mask = PLLP_MISC0_LOCK_ENABLE | PLLP_MISC0_LOCK_OVERRIDE;
  1059. if (!enabled)
  1060. mask |= PLLP_MISC0_IDDQ;
  1061. _pll_misc_chk_default(clk_base, pll->params, 0, val,
  1062. ~mask & PLLP_MISC0_WRITE_MASK);
  1063. /* Ignore branch controls */
  1064. val = PLLP_MISC1_DEFAULT_VALUE;
  1065. mask = PLLP_MISC1_HSIO_EN | PLLP_MISC1_XUSB_EN;
  1066. _pll_misc_chk_default(clk_base, pll->params, 1, val,
  1067. ~mask & PLLP_MISC1_WRITE_MASK);
  1068. }
  1069. static void tegra210_pllp_set_defaults(struct tegra_clk_pll *pllp)
  1070. {
  1071. u32 mask;
  1072. u32 val = readl_relaxed(clk_base + pllp->params->base_reg);
  1073. pllp->params->defaults_set = true;
  1074. if (val & PLL_ENABLE) {
  1075. /*
  1076. * PLL is ON: check if defaults already set, then set those
  1077. * that can be updated in flight.
  1078. */
  1079. pllp_check_defaults(pllp, true);
  1080. if (!pllp->params->defaults_set)
  1081. pr_warn("PLL_P already enabled. Postponing set full defaults\n");
  1082. /* Enable lock detect */
  1083. val = readl_relaxed(clk_base + pllp->params->ext_misc_reg[0]);
  1084. mask = PLLP_MISC0_LOCK_ENABLE | PLLP_MISC0_LOCK_OVERRIDE;
  1085. val &= ~mask;
  1086. val |= PLLP_MISC0_DEFAULT_VALUE & mask;
  1087. writel_relaxed(val, clk_base + pllp->params->ext_misc_reg[0]);
  1088. udelay(1);
  1089. return;
  1090. }
  1091. /* set IDDQ, enable lock detect */
  1092. writel_relaxed(PLLP_MISC0_DEFAULT_VALUE,
  1093. clk_base + pllp->params->ext_misc_reg[0]);
  1094. /* Preserve branch control */
  1095. val = readl_relaxed(clk_base + pllp->params->ext_misc_reg[1]);
  1096. mask = PLLP_MISC1_HSIO_EN | PLLP_MISC1_XUSB_EN;
  1097. val &= mask;
  1098. val |= ~mask & PLLP_MISC1_DEFAULT_VALUE;
  1099. writel_relaxed(val, clk_base + pllp->params->ext_misc_reg[1]);
  1100. udelay(1);
  1101. }
  1102. /*
  1103. * PLLU
  1104. * VCO is exposed to the clock tree directly along with post-divider output.
  1105. * Both VCO and post-divider output rates are fixed at 480MHz and 240MHz,
  1106. * respectively.
  1107. */
  1108. static void pllu_check_defaults(struct tegra_clk_pll_params *params,
  1109. bool hw_control)
  1110. {
  1111. u32 val, mask;
  1112. /* Ignore lock enable (will be set) and IDDQ if under h/w control */
  1113. val = PLLU_MISC0_DEFAULT_VALUE & (~PLLU_MISC0_IDDQ);
  1114. mask = PLLU_MISC0_LOCK_ENABLE | (hw_control ? PLLU_MISC0_IDDQ : 0);
  1115. _pll_misc_chk_default(clk_base, params, 0, val,
  1116. ~mask & PLLU_MISC0_WRITE_MASK);
  1117. val = PLLU_MISC1_DEFAULT_VALUE;
  1118. mask = PLLU_MISC1_LOCK_OVERRIDE;
  1119. _pll_misc_chk_default(clk_base, params, 1, val,
  1120. ~mask & PLLU_MISC1_WRITE_MASK);
  1121. }
  1122. static void tegra210_pllu_set_defaults(struct tegra_clk_pll_params *pllu)
  1123. {
  1124. u32 val = readl_relaxed(clk_base + pllu->base_reg);
  1125. pllu->defaults_set = true;
  1126. if (val & PLL_ENABLE) {
  1127. /*
  1128. * PLL is ON: check if defaults already set, then set those
  1129. * that can be updated in flight.
  1130. */
  1131. pllu_check_defaults(pllu, false);
  1132. if (!pllu->defaults_set)
  1133. pr_warn("PLL_U already enabled. Postponing set full defaults\n");
  1134. /* Enable lock detect */
  1135. val = readl_relaxed(clk_base + pllu->ext_misc_reg[0]);
  1136. val &= ~PLLU_MISC0_LOCK_ENABLE;
  1137. val |= PLLU_MISC0_DEFAULT_VALUE & PLLU_MISC0_LOCK_ENABLE;
  1138. writel_relaxed(val, clk_base + pllu->ext_misc_reg[0]);
  1139. val = readl_relaxed(clk_base + pllu->ext_misc_reg[1]);
  1140. val &= ~PLLU_MISC1_LOCK_OVERRIDE;
  1141. val |= PLLU_MISC1_DEFAULT_VALUE & PLLU_MISC1_LOCK_OVERRIDE;
  1142. writel_relaxed(val, clk_base + pllu->ext_misc_reg[1]);
  1143. udelay(1);
  1144. return;
  1145. }
  1146. /* set IDDQ, enable lock detect */
  1147. writel_relaxed(PLLU_MISC0_DEFAULT_VALUE,
  1148. clk_base + pllu->ext_misc_reg[0]);
  1149. writel_relaxed(PLLU_MISC1_DEFAULT_VALUE,
  1150. clk_base + pllu->ext_misc_reg[1]);
  1151. udelay(1);
  1152. }
  1153. #define mask(w) ((1 << (w)) - 1)
  1154. #define divm_mask(p) mask(p->params->div_nmp->divm_width)
  1155. #define divn_mask(p) mask(p->params->div_nmp->divn_width)
  1156. #define divp_mask(p) (p->params->flags & TEGRA_PLLU ? PLLU_POST_DIVP_MASK :\
  1157. mask(p->params->div_nmp->divp_width))
  1158. #define divm_shift(p) ((p)->params->div_nmp->divm_shift)
  1159. #define divn_shift(p) ((p)->params->div_nmp->divn_shift)
  1160. #define divp_shift(p) ((p)->params->div_nmp->divp_shift)
  1161. #define divm_mask_shifted(p) (divm_mask(p) << divm_shift(p))
  1162. #define divn_mask_shifted(p) (divn_mask(p) << divn_shift(p))
  1163. #define divp_mask_shifted(p) (divp_mask(p) << divp_shift(p))
  1164. #define PLL_LOCKDET_DELAY 2 /* Lock detection safety delays */
  1165. static int tegra210_wait_for_mask(struct tegra_clk_pll *pll,
  1166. u32 reg, u32 mask)
  1167. {
  1168. int i;
  1169. u32 val = 0;
  1170. for (i = 0; i < pll->params->lock_delay / PLL_LOCKDET_DELAY + 1; i++) {
  1171. udelay(PLL_LOCKDET_DELAY);
  1172. val = readl_relaxed(clk_base + reg);
  1173. if ((val & mask) == mask) {
  1174. udelay(PLL_LOCKDET_DELAY);
  1175. return 0;
  1176. }
  1177. }
  1178. return -ETIMEDOUT;
  1179. }
  1180. static int tegra210_pllx_dyn_ramp(struct tegra_clk_pll *pllx,
  1181. struct tegra_clk_pll_freq_table *cfg)
  1182. {
  1183. u32 val, base, ndiv_new_mask;
  1184. ndiv_new_mask = (divn_mask(pllx) >> pllx->params->div_nmp->divn_shift)
  1185. << PLLX_MISC2_NDIV_NEW_SHIFT;
  1186. val = readl_relaxed(clk_base + pllx->params->ext_misc_reg[2]);
  1187. val &= (~ndiv_new_mask);
  1188. val |= cfg->n << PLLX_MISC2_NDIV_NEW_SHIFT;
  1189. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  1190. udelay(1);
  1191. val = readl_relaxed(clk_base + pllx->params->ext_misc_reg[2]);
  1192. val |= PLLX_MISC2_EN_DYNRAMP;
  1193. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  1194. udelay(1);
  1195. tegra210_wait_for_mask(pllx, pllx->params->ext_misc_reg[2],
  1196. PLLX_MISC2_DYNRAMP_DONE);
  1197. base = readl_relaxed(clk_base + pllx->params->base_reg) &
  1198. (~divn_mask_shifted(pllx));
  1199. base |= cfg->n << pllx->params->div_nmp->divn_shift;
  1200. writel_relaxed(base, clk_base + pllx->params->base_reg);
  1201. udelay(1);
  1202. val &= ~PLLX_MISC2_EN_DYNRAMP;
  1203. writel_relaxed(val, clk_base + pllx->params->ext_misc_reg[2]);
  1204. udelay(1);
  1205. pr_debug("%s: dynamic ramp to m = %u n = %u p = %u, Fout = %lu kHz\n",
  1206. __clk_get_name(pllx->hw.clk), cfg->m, cfg->n, cfg->p,
  1207. cfg->input_rate / cfg->m * cfg->n /
  1208. pllx->params->pdiv_tohw[cfg->p].pdiv / 1000);
  1209. return 0;
  1210. }
  1211. /*
  1212. * Common configuration for PLLs with fixed input divider policy:
  1213. * - always set fixed M-value based on the reference rate
  1214. * - always set P-value value 1:1 for output rates above VCO minimum, and
  1215. * choose minimum necessary P-value for output rates below VCO maximum
  1216. * - calculate N-value based on selected M and P
  1217. * - calculate SDM_DIN fractional part
  1218. */
  1219. static int tegra210_pll_fixed_mdiv_cfg(struct clk_hw *hw,
  1220. struct tegra_clk_pll_freq_table *cfg,
  1221. unsigned long rate, unsigned long input_rate)
  1222. {
  1223. struct tegra_clk_pll *pll = to_clk_pll(hw);
  1224. struct tegra_clk_pll_params *params = pll->params;
  1225. int p;
  1226. unsigned long cf, p_rate;
  1227. u32 pdiv;
  1228. if (!rate)
  1229. return -EINVAL;
  1230. if (!(params->flags & TEGRA_PLL_VCO_OUT)) {
  1231. p = DIV_ROUND_UP(params->vco_min, rate);
  1232. p = params->round_p_to_pdiv(p, &pdiv);
  1233. } else {
  1234. p = rate >= params->vco_min ? 1 : -EINVAL;
  1235. }
  1236. if (p < 0)
  1237. return -EINVAL;
  1238. cfg->m = tegra_pll_get_fixed_mdiv(hw, input_rate);
  1239. cfg->p = p;
  1240. /* Store P as HW value, as that is what is expected */
  1241. cfg->p = tegra_pll_p_div_to_hw(pll, cfg->p);
  1242. p_rate = rate * p;
  1243. if (p_rate > params->vco_max)
  1244. p_rate = params->vco_max;
  1245. cf = input_rate / cfg->m;
  1246. cfg->n = p_rate / cf;
  1247. cfg->sdm_data = 0;
  1248. cfg->output_rate = input_rate;
  1249. if (params->sdm_ctrl_reg) {
  1250. unsigned long rem = p_rate - cf * cfg->n;
  1251. /* If ssc is enabled SDM enabled as well, even for integer n */
  1252. if (rem || params->ssc_ctrl_reg) {
  1253. u64 s = rem * PLL_SDM_COEFF;
  1254. do_div(s, cf);
  1255. s -= PLL_SDM_COEFF / 2;
  1256. cfg->sdm_data = sdin_din_to_data(s);
  1257. }
  1258. cfg->output_rate *= sdin_get_n_eff(cfg);
  1259. cfg->output_rate /= p * cfg->m * PLL_SDM_COEFF;
  1260. } else {
  1261. cfg->output_rate *= cfg->n;
  1262. cfg->output_rate /= p * cfg->m;
  1263. }
  1264. cfg->input_rate = input_rate;
  1265. return 0;
  1266. }
  1267. /*
  1268. * clk_pll_set_gain - set gain to m, n to calculate correct VCO rate
  1269. *
  1270. * @cfg: struct tegra_clk_pll_freq_table * cfg
  1271. *
  1272. * For Normal mode:
  1273. * Fvco = Fref * NDIV / MDIV
  1274. *
  1275. * For fractional mode:
  1276. * Fvco = Fref * (NDIV + 0.5 + SDM_DIN / PLL_SDM_COEFF) / MDIV
  1277. */
  1278. static void tegra210_clk_pll_set_gain(struct tegra_clk_pll_freq_table *cfg)
  1279. {
  1280. cfg->n = sdin_get_n_eff(cfg);
  1281. cfg->m *= PLL_SDM_COEFF;
  1282. }
  1283. static unsigned long
  1284. tegra210_clk_adjust_vco_min(struct tegra_clk_pll_params *params,
  1285. unsigned long parent_rate)
  1286. {
  1287. unsigned long vco_min = params->vco_min;
  1288. params->vco_min += DIV_ROUND_UP(parent_rate, PLL_SDM_COEFF);
  1289. vco_min = min(vco_min, params->vco_min);
  1290. return vco_min;
  1291. }
  1292. static struct div_nmp pllx_nmp = {
  1293. .divm_shift = 0,
  1294. .divm_width = 8,
  1295. .divn_shift = 8,
  1296. .divn_width = 8,
  1297. .divp_shift = 20,
  1298. .divp_width = 5,
  1299. };
  1300. /*
  1301. * PLL post divider maps - two types: quasi-linear and exponential
  1302. * post divider.
  1303. */
  1304. #define PLL_QLIN_PDIV_MAX 16
  1305. static const struct pdiv_map pll_qlin_pdiv_to_hw[] = {
  1306. { .pdiv = 1, .hw_val = 0 },
  1307. { .pdiv = 2, .hw_val = 1 },
  1308. { .pdiv = 3, .hw_val = 2 },
  1309. { .pdiv = 4, .hw_val = 3 },
  1310. { .pdiv = 5, .hw_val = 4 },
  1311. { .pdiv = 6, .hw_val = 5 },
  1312. { .pdiv = 8, .hw_val = 6 },
  1313. { .pdiv = 9, .hw_val = 7 },
  1314. { .pdiv = 10, .hw_val = 8 },
  1315. { .pdiv = 12, .hw_val = 9 },
  1316. { .pdiv = 15, .hw_val = 10 },
  1317. { .pdiv = 16, .hw_val = 11 },
  1318. { .pdiv = 18, .hw_val = 12 },
  1319. { .pdiv = 20, .hw_val = 13 },
  1320. { .pdiv = 24, .hw_val = 14 },
  1321. { .pdiv = 30, .hw_val = 15 },
  1322. { .pdiv = 32, .hw_val = 16 },
  1323. };
  1324. static u32 pll_qlin_p_to_pdiv(u32 p, u32 *pdiv)
  1325. {
  1326. int i;
  1327. if (p) {
  1328. for (i = 0; i <= PLL_QLIN_PDIV_MAX; i++) {
  1329. if (p <= pll_qlin_pdiv_to_hw[i].pdiv) {
  1330. if (pdiv)
  1331. *pdiv = i;
  1332. return pll_qlin_pdiv_to_hw[i].pdiv;
  1333. }
  1334. }
  1335. }
  1336. return -EINVAL;
  1337. }
  1338. #define PLL_EXPO_PDIV_MAX 7
  1339. static const struct pdiv_map pll_expo_pdiv_to_hw[] = {
  1340. { .pdiv = 1, .hw_val = 0 },
  1341. { .pdiv = 2, .hw_val = 1 },
  1342. { .pdiv = 4, .hw_val = 2 },
  1343. { .pdiv = 8, .hw_val = 3 },
  1344. { .pdiv = 16, .hw_val = 4 },
  1345. { .pdiv = 32, .hw_val = 5 },
  1346. { .pdiv = 64, .hw_val = 6 },
  1347. { .pdiv = 128, .hw_val = 7 },
  1348. };
  1349. static u32 pll_expo_p_to_pdiv(u32 p, u32 *pdiv)
  1350. {
  1351. if (p) {
  1352. u32 i = fls(p);
  1353. if (i == ffs(p))
  1354. i--;
  1355. if (i <= PLL_EXPO_PDIV_MAX) {
  1356. if (pdiv)
  1357. *pdiv = i;
  1358. return 1 << i;
  1359. }
  1360. }
  1361. return -EINVAL;
  1362. }
  1363. static struct tegra_clk_pll_freq_table pll_x_freq_table[] = {
  1364. /* 1 GHz */
  1365. { 12000000, 1000000000, 166, 1, 2, 0 }, /* actual: 996.0 MHz */
  1366. { 13000000, 1000000000, 153, 1, 2, 0 }, /* actual: 994.0 MHz */
  1367. { 38400000, 1000000000, 156, 3, 2, 0 }, /* actual: 998.4 MHz */
  1368. { 0, 0, 0, 0, 0, 0 },
  1369. };
  1370. static struct tegra_clk_pll_params pll_x_params = {
  1371. .input_min = 12000000,
  1372. .input_max = 800000000,
  1373. .cf_min = 12000000,
  1374. .cf_max = 38400000,
  1375. .vco_min = 1350000000,
  1376. .vco_max = 3000000000UL,
  1377. .base_reg = PLLX_BASE,
  1378. .misc_reg = PLLX_MISC0,
  1379. .lock_mask = PLL_BASE_LOCK,
  1380. .lock_enable_bit_idx = PLL_MISC_LOCK_ENABLE,
  1381. .lock_delay = 300,
  1382. .ext_misc_reg[0] = PLLX_MISC0,
  1383. .ext_misc_reg[1] = PLLX_MISC1,
  1384. .ext_misc_reg[2] = PLLX_MISC2,
  1385. .ext_misc_reg[3] = PLLX_MISC3,
  1386. .ext_misc_reg[4] = PLLX_MISC4,
  1387. .ext_misc_reg[5] = PLLX_MISC5,
  1388. .iddq_reg = PLLX_MISC3,
  1389. .iddq_bit_idx = PLLXP_IDDQ_BIT,
  1390. .max_p = PLL_QLIN_PDIV_MAX,
  1391. .mdiv_default = 2,
  1392. .dyn_ramp_reg = PLLX_MISC2,
  1393. .stepa_shift = 16,
  1394. .stepb_shift = 24,
  1395. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1396. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1397. .div_nmp = &pllx_nmp,
  1398. .freq_table = pll_x_freq_table,
  1399. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
  1400. .dyn_ramp = tegra210_pllx_dyn_ramp,
  1401. .set_defaults = tegra210_pllx_set_defaults,
  1402. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1403. };
  1404. static struct div_nmp pllc_nmp = {
  1405. .divm_shift = 0,
  1406. .divm_width = 8,
  1407. .divn_shift = 10,
  1408. .divn_width = 8,
  1409. .divp_shift = 20,
  1410. .divp_width = 5,
  1411. };
  1412. static struct tegra_clk_pll_freq_table pll_cx_freq_table[] = {
  1413. { 12000000, 510000000, 85, 1, 2, 0 },
  1414. { 13000000, 510000000, 78, 1, 2, 0 }, /* actual: 507.0 MHz */
  1415. { 38400000, 510000000, 79, 3, 2, 0 }, /* actual: 505.6 MHz */
  1416. { 0, 0, 0, 0, 0, 0 },
  1417. };
  1418. static struct tegra_clk_pll_params pll_c_params = {
  1419. .input_min = 12000000,
  1420. .input_max = 700000000,
  1421. .cf_min = 12000000,
  1422. .cf_max = 50000000,
  1423. .vco_min = 600000000,
  1424. .vco_max = 1200000000,
  1425. .base_reg = PLLC_BASE,
  1426. .misc_reg = PLLC_MISC0,
  1427. .lock_mask = PLL_BASE_LOCK,
  1428. .lock_delay = 300,
  1429. .iddq_reg = PLLC_MISC1,
  1430. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1431. .reset_reg = PLLC_MISC0,
  1432. .reset_bit_idx = PLLCX_RESET_BIT,
  1433. .max_p = PLL_QLIN_PDIV_MAX,
  1434. .ext_misc_reg[0] = PLLC_MISC0,
  1435. .ext_misc_reg[1] = PLLC_MISC1,
  1436. .ext_misc_reg[2] = PLLC_MISC2,
  1437. .ext_misc_reg[3] = PLLC_MISC3,
  1438. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1439. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1440. .mdiv_default = 3,
  1441. .div_nmp = &pllc_nmp,
  1442. .freq_table = pll_cx_freq_table,
  1443. .flags = TEGRA_PLL_USE_LOCK,
  1444. .set_defaults = _pllc_set_defaults,
  1445. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1446. };
  1447. static struct div_nmp pllcx_nmp = {
  1448. .divm_shift = 0,
  1449. .divm_width = 8,
  1450. .divn_shift = 10,
  1451. .divn_width = 8,
  1452. .divp_shift = 20,
  1453. .divp_width = 5,
  1454. };
  1455. static struct tegra_clk_pll_params pll_c2_params = {
  1456. .input_min = 12000000,
  1457. .input_max = 700000000,
  1458. .cf_min = 12000000,
  1459. .cf_max = 50000000,
  1460. .vco_min = 600000000,
  1461. .vco_max = 1200000000,
  1462. .base_reg = PLLC2_BASE,
  1463. .misc_reg = PLLC2_MISC0,
  1464. .iddq_reg = PLLC2_MISC1,
  1465. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1466. .reset_reg = PLLC2_MISC0,
  1467. .reset_bit_idx = PLLCX_RESET_BIT,
  1468. .lock_mask = PLLCX_BASE_LOCK,
  1469. .lock_delay = 300,
  1470. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1471. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1472. .mdiv_default = 3,
  1473. .div_nmp = &pllcx_nmp,
  1474. .max_p = PLL_QLIN_PDIV_MAX,
  1475. .ext_misc_reg[0] = PLLC2_MISC0,
  1476. .ext_misc_reg[1] = PLLC2_MISC1,
  1477. .ext_misc_reg[2] = PLLC2_MISC2,
  1478. .ext_misc_reg[3] = PLLC2_MISC3,
  1479. .freq_table = pll_cx_freq_table,
  1480. .flags = TEGRA_PLL_USE_LOCK,
  1481. .set_defaults = _pllc2_set_defaults,
  1482. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1483. };
  1484. static struct tegra_clk_pll_params pll_c3_params = {
  1485. .input_min = 12000000,
  1486. .input_max = 700000000,
  1487. .cf_min = 12000000,
  1488. .cf_max = 50000000,
  1489. .vco_min = 600000000,
  1490. .vco_max = 1200000000,
  1491. .base_reg = PLLC3_BASE,
  1492. .misc_reg = PLLC3_MISC0,
  1493. .lock_mask = PLLCX_BASE_LOCK,
  1494. .lock_delay = 300,
  1495. .iddq_reg = PLLC3_MISC1,
  1496. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1497. .reset_reg = PLLC3_MISC0,
  1498. .reset_bit_idx = PLLCX_RESET_BIT,
  1499. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1500. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1501. .mdiv_default = 3,
  1502. .div_nmp = &pllcx_nmp,
  1503. .max_p = PLL_QLIN_PDIV_MAX,
  1504. .ext_misc_reg[0] = PLLC3_MISC0,
  1505. .ext_misc_reg[1] = PLLC3_MISC1,
  1506. .ext_misc_reg[2] = PLLC3_MISC2,
  1507. .ext_misc_reg[3] = PLLC3_MISC3,
  1508. .freq_table = pll_cx_freq_table,
  1509. .flags = TEGRA_PLL_USE_LOCK,
  1510. .set_defaults = _pllc3_set_defaults,
  1511. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1512. };
  1513. static struct div_nmp pllss_nmp = {
  1514. .divm_shift = 0,
  1515. .divm_width = 8,
  1516. .divn_shift = 8,
  1517. .divn_width = 8,
  1518. .divp_shift = 19,
  1519. .divp_width = 5,
  1520. };
  1521. static struct tegra_clk_pll_freq_table pll_c4_vco_freq_table[] = {
  1522. { 12000000, 600000000, 50, 1, 1, 0 },
  1523. { 13000000, 600000000, 46, 1, 1, 0 }, /* actual: 598.0 MHz */
  1524. { 38400000, 600000000, 62, 4, 1, 0 }, /* actual: 595.2 MHz */
  1525. { 0, 0, 0, 0, 0, 0 },
  1526. };
  1527. static const struct clk_div_table pll_vco_post_div_table[] = {
  1528. { .val = 0, .div = 1 },
  1529. { .val = 1, .div = 2 },
  1530. { .val = 2, .div = 3 },
  1531. { .val = 3, .div = 4 },
  1532. { .val = 4, .div = 5 },
  1533. { .val = 5, .div = 6 },
  1534. { .val = 6, .div = 8 },
  1535. { .val = 7, .div = 10 },
  1536. { .val = 8, .div = 12 },
  1537. { .val = 9, .div = 16 },
  1538. { .val = 10, .div = 12 },
  1539. { .val = 11, .div = 16 },
  1540. { .val = 12, .div = 20 },
  1541. { .val = 13, .div = 24 },
  1542. { .val = 14, .div = 32 },
  1543. { .val = 0, .div = 0 },
  1544. };
  1545. static struct tegra_clk_pll_params pll_c4_vco_params = {
  1546. .input_min = 9600000,
  1547. .input_max = 800000000,
  1548. .cf_min = 9600000,
  1549. .cf_max = 19200000,
  1550. .vco_min = 500000000,
  1551. .vco_max = 1080000000,
  1552. .base_reg = PLLC4_BASE,
  1553. .misc_reg = PLLC4_MISC0,
  1554. .lock_mask = PLL_BASE_LOCK,
  1555. .lock_delay = 300,
  1556. .max_p = PLL_QLIN_PDIV_MAX,
  1557. .ext_misc_reg[0] = PLLC4_MISC0,
  1558. .iddq_reg = PLLC4_BASE,
  1559. .iddq_bit_idx = PLLSS_IDDQ_BIT,
  1560. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1561. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1562. .mdiv_default = 3,
  1563. .div_nmp = &pllss_nmp,
  1564. .freq_table = pll_c4_vco_freq_table,
  1565. .set_defaults = tegra210_pllc4_set_defaults,
  1566. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
  1567. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1568. };
  1569. static struct tegra_clk_pll_freq_table pll_m_freq_table[] = {
  1570. { 12000000, 800000000, 66, 1, 1, 0 }, /* actual: 792.0 MHz */
  1571. { 13000000, 800000000, 61, 1, 1, 0 }, /* actual: 793.0 MHz */
  1572. { 38400000, 297600000, 93, 4, 3, 0 },
  1573. { 38400000, 400000000, 125, 4, 3, 0 },
  1574. { 38400000, 532800000, 111, 4, 2, 0 },
  1575. { 38400000, 665600000, 104, 3, 2, 0 },
  1576. { 38400000, 800000000, 125, 3, 2, 0 },
  1577. { 38400000, 931200000, 97, 4, 1, 0 },
  1578. { 38400000, 1065600000, 111, 4, 1, 0 },
  1579. { 38400000, 1200000000, 125, 4, 1, 0 },
  1580. { 38400000, 1331200000, 104, 3, 1, 0 },
  1581. { 38400000, 1459200000, 76, 2, 1, 0 },
  1582. { 38400000, 1600000000, 125, 3, 1, 0 },
  1583. { 0, 0, 0, 0, 0, 0 },
  1584. };
  1585. static struct div_nmp pllm_nmp = {
  1586. .divm_shift = 0,
  1587. .divm_width = 8,
  1588. .override_divm_shift = 0,
  1589. .divn_shift = 8,
  1590. .divn_width = 8,
  1591. .override_divn_shift = 8,
  1592. .divp_shift = 20,
  1593. .divp_width = 5,
  1594. .override_divp_shift = 27,
  1595. };
  1596. static struct tegra_clk_pll_params pll_m_params = {
  1597. .input_min = 9600000,
  1598. .input_max = 500000000,
  1599. .cf_min = 9600000,
  1600. .cf_max = 19200000,
  1601. .vco_min = 800000000,
  1602. .vco_max = 1866000000,
  1603. .base_reg = PLLM_BASE,
  1604. .misc_reg = PLLM_MISC2,
  1605. .lock_mask = PLL_BASE_LOCK,
  1606. .lock_enable_bit_idx = PLLM_MISC_LOCK_ENABLE,
  1607. .lock_delay = 300,
  1608. .iddq_reg = PLLM_MISC2,
  1609. .iddq_bit_idx = PLLM_IDDQ_BIT,
  1610. .max_p = PLL_QLIN_PDIV_MAX,
  1611. .ext_misc_reg[0] = PLLM_MISC2,
  1612. .ext_misc_reg[1] = PLLM_MISC1,
  1613. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1614. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1615. .div_nmp = &pllm_nmp,
  1616. .pmc_divnm_reg = PMC_PLLM_WB0_OVERRIDE,
  1617. .pmc_divp_reg = PMC_PLLM_WB0_OVERRIDE_2,
  1618. .freq_table = pll_m_freq_table,
  1619. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
  1620. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1621. };
  1622. static struct tegra_clk_pll_params pll_mb_params = {
  1623. .input_min = 9600000,
  1624. .input_max = 500000000,
  1625. .cf_min = 9600000,
  1626. .cf_max = 19200000,
  1627. .vco_min = 800000000,
  1628. .vco_max = 1866000000,
  1629. .base_reg = PLLMB_BASE,
  1630. .misc_reg = PLLMB_MISC1,
  1631. .lock_mask = PLL_BASE_LOCK,
  1632. .lock_delay = 300,
  1633. .iddq_reg = PLLMB_MISC1,
  1634. .iddq_bit_idx = PLLMB_IDDQ_BIT,
  1635. .max_p = PLL_QLIN_PDIV_MAX,
  1636. .ext_misc_reg[0] = PLLMB_MISC1,
  1637. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1638. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1639. .div_nmp = &pllm_nmp,
  1640. .freq_table = pll_m_freq_table,
  1641. .flags = TEGRA_PLL_USE_LOCK,
  1642. .set_defaults = tegra210_pllmb_set_defaults,
  1643. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1644. };
  1645. static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
  1646. /* PLLE special case: use cpcon field to store cml divider value */
  1647. { 672000000, 100000000, 125, 42, 0, 13 },
  1648. { 624000000, 100000000, 125, 39, 0, 13 },
  1649. { 336000000, 100000000, 125, 21, 0, 13 },
  1650. { 312000000, 100000000, 200, 26, 0, 14 },
  1651. { 38400000, 100000000, 125, 2, 0, 14 },
  1652. { 12000000, 100000000, 200, 1, 0, 14 },
  1653. { 0, 0, 0, 0, 0, 0 },
  1654. };
  1655. static struct div_nmp plle_nmp = {
  1656. .divm_shift = 0,
  1657. .divm_width = 8,
  1658. .divn_shift = 8,
  1659. .divn_width = 8,
  1660. .divp_shift = 24,
  1661. .divp_width = 5,
  1662. };
  1663. static struct tegra_clk_pll_params pll_e_params = {
  1664. .input_min = 12000000,
  1665. .input_max = 800000000,
  1666. .cf_min = 12000000,
  1667. .cf_max = 38400000,
  1668. .vco_min = 1600000000,
  1669. .vco_max = 2500000000U,
  1670. .base_reg = PLLE_BASE,
  1671. .misc_reg = PLLE_MISC0,
  1672. .aux_reg = PLLE_AUX,
  1673. .lock_mask = PLLE_MISC_LOCK,
  1674. .lock_enable_bit_idx = PLLE_MISC_LOCK_ENABLE,
  1675. .lock_delay = 300,
  1676. .div_nmp = &plle_nmp,
  1677. .freq_table = pll_e_freq_table,
  1678. .flags = TEGRA_PLL_FIXED | TEGRA_PLL_LOCK_MISC | TEGRA_PLL_USE_LOCK |
  1679. TEGRA_PLL_HAS_LOCK_ENABLE,
  1680. .fixed_rate = 100000000,
  1681. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1682. };
  1683. static struct tegra_clk_pll_freq_table pll_re_vco_freq_table[] = {
  1684. { 12000000, 672000000, 56, 1, 1, 0 },
  1685. { 13000000, 672000000, 51, 1, 1, 0 }, /* actual: 663.0 MHz */
  1686. { 38400000, 672000000, 70, 4, 1, 0 },
  1687. { 0, 0, 0, 0, 0, 0 },
  1688. };
  1689. static struct div_nmp pllre_nmp = {
  1690. .divm_shift = 0,
  1691. .divm_width = 8,
  1692. .divn_shift = 8,
  1693. .divn_width = 8,
  1694. .divp_shift = 16,
  1695. .divp_width = 5,
  1696. };
  1697. static struct tegra_clk_pll_params pll_re_vco_params = {
  1698. .input_min = 9600000,
  1699. .input_max = 800000000,
  1700. .cf_min = 9600000,
  1701. .cf_max = 19200000,
  1702. .vco_min = 350000000,
  1703. .vco_max = 700000000,
  1704. .base_reg = PLLRE_BASE,
  1705. .misc_reg = PLLRE_MISC0,
  1706. .lock_mask = PLLRE_MISC_LOCK,
  1707. .lock_delay = 300,
  1708. .max_p = PLL_QLIN_PDIV_MAX,
  1709. .ext_misc_reg[0] = PLLRE_MISC0,
  1710. .iddq_reg = PLLRE_MISC0,
  1711. .iddq_bit_idx = PLLRE_IDDQ_BIT,
  1712. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1713. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1714. .div_nmp = &pllre_nmp,
  1715. .freq_table = pll_re_vco_freq_table,
  1716. .flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_LOCK_MISC | TEGRA_PLL_VCO_OUT,
  1717. .set_defaults = tegra210_pllre_set_defaults,
  1718. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1719. };
  1720. static struct div_nmp pllp_nmp = {
  1721. .divm_shift = 0,
  1722. .divm_width = 8,
  1723. .divn_shift = 10,
  1724. .divn_width = 8,
  1725. .divp_shift = 20,
  1726. .divp_width = 5,
  1727. };
  1728. static struct tegra_clk_pll_freq_table pll_p_freq_table[] = {
  1729. { 12000000, 408000000, 34, 1, 1, 0 },
  1730. { 38400000, 408000000, 85, 8, 1, 0 }, /* cf = 4.8MHz, allowed exception */
  1731. { 0, 0, 0, 0, 0, 0 },
  1732. };
  1733. static struct tegra_clk_pll_params pll_p_params = {
  1734. .input_min = 9600000,
  1735. .input_max = 800000000,
  1736. .cf_min = 9600000,
  1737. .cf_max = 19200000,
  1738. .vco_min = 350000000,
  1739. .vco_max = 700000000,
  1740. .base_reg = PLLP_BASE,
  1741. .misc_reg = PLLP_MISC0,
  1742. .lock_mask = PLL_BASE_LOCK,
  1743. .lock_delay = 300,
  1744. .iddq_reg = PLLP_MISC0,
  1745. .iddq_bit_idx = PLLXP_IDDQ_BIT,
  1746. .ext_misc_reg[0] = PLLP_MISC0,
  1747. .ext_misc_reg[1] = PLLP_MISC1,
  1748. .div_nmp = &pllp_nmp,
  1749. .freq_table = pll_p_freq_table,
  1750. .fixed_rate = 408000000,
  1751. .flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
  1752. .set_defaults = tegra210_pllp_set_defaults,
  1753. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1754. };
  1755. static struct tegra_clk_pll_params pll_a1_params = {
  1756. .input_min = 12000000,
  1757. .input_max = 700000000,
  1758. .cf_min = 12000000,
  1759. .cf_max = 50000000,
  1760. .vco_min = 600000000,
  1761. .vco_max = 1200000000,
  1762. .base_reg = PLLA1_BASE,
  1763. .misc_reg = PLLA1_MISC0,
  1764. .lock_mask = PLLCX_BASE_LOCK,
  1765. .lock_delay = 300,
  1766. .iddq_reg = PLLA1_MISC1,
  1767. .iddq_bit_idx = PLLCX_IDDQ_BIT,
  1768. .reset_reg = PLLA1_MISC0,
  1769. .reset_bit_idx = PLLCX_RESET_BIT,
  1770. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1771. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1772. .div_nmp = &pllc_nmp,
  1773. .ext_misc_reg[0] = PLLA1_MISC0,
  1774. .ext_misc_reg[1] = PLLA1_MISC1,
  1775. .ext_misc_reg[2] = PLLA1_MISC2,
  1776. .ext_misc_reg[3] = PLLA1_MISC3,
  1777. .freq_table = pll_cx_freq_table,
  1778. .flags = TEGRA_PLL_USE_LOCK,
  1779. .set_defaults = _plla1_set_defaults,
  1780. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1781. };
  1782. static struct div_nmp plla_nmp = {
  1783. .divm_shift = 0,
  1784. .divm_width = 8,
  1785. .divn_shift = 8,
  1786. .divn_width = 8,
  1787. .divp_shift = 20,
  1788. .divp_width = 5,
  1789. };
  1790. static struct tegra_clk_pll_freq_table pll_a_freq_table[] = {
  1791. { 12000000, 282240000, 47, 1, 2, 1, 0xf148 }, /* actual: 282240234 */
  1792. { 12000000, 368640000, 61, 1, 2, 1, 0xfe15 }, /* actual: 368640381 */
  1793. { 12000000, 240000000, 60, 1, 3, 1, 0 },
  1794. { 13000000, 282240000, 43, 1, 2, 1, 0xfd7d }, /* actual: 282239807 */
  1795. { 13000000, 368640000, 56, 1, 2, 1, 0x06d8 }, /* actual: 368640137 */
  1796. { 13000000, 240000000, 55, 1, 3, 1, 0 }, /* actual: 238.3 MHz */
  1797. { 38400000, 282240000, 44, 3, 2, 1, 0xf333 }, /* actual: 282239844 */
  1798. { 38400000, 368640000, 57, 3, 2, 1, 0x0333 }, /* actual: 368639844 */
  1799. { 38400000, 240000000, 75, 3, 3, 1, 0 },
  1800. { 0, 0, 0, 0, 0, 0, 0 },
  1801. };
  1802. static struct tegra_clk_pll_params pll_a_params = {
  1803. .input_min = 12000000,
  1804. .input_max = 800000000,
  1805. .cf_min = 12000000,
  1806. .cf_max = 19200000,
  1807. .vco_min = 500000000,
  1808. .vco_max = 1000000000,
  1809. .base_reg = PLLA_BASE,
  1810. .misc_reg = PLLA_MISC0,
  1811. .lock_mask = PLL_BASE_LOCK,
  1812. .lock_delay = 300,
  1813. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1814. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1815. .iddq_reg = PLLA_BASE,
  1816. .iddq_bit_idx = PLLA_IDDQ_BIT,
  1817. .div_nmp = &plla_nmp,
  1818. .sdm_din_reg = PLLA_MISC1,
  1819. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1820. .sdm_ctrl_reg = PLLA_MISC2,
  1821. .sdm_ctrl_en_mask = PLLA_SDM_EN_MASK,
  1822. .ext_misc_reg[0] = PLLA_MISC0,
  1823. .ext_misc_reg[1] = PLLA_MISC1,
  1824. .ext_misc_reg[2] = PLLA_MISC2,
  1825. .freq_table = pll_a_freq_table,
  1826. .flags = TEGRA_PLL_USE_LOCK | TEGRA_MDIV_NEW,
  1827. .set_defaults = tegra210_plla_set_defaults,
  1828. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1829. .set_gain = tegra210_clk_pll_set_gain,
  1830. .adjust_vco = tegra210_clk_adjust_vco_min,
  1831. };
  1832. static struct div_nmp plld_nmp = {
  1833. .divm_shift = 0,
  1834. .divm_width = 8,
  1835. .divn_shift = 11,
  1836. .divn_width = 8,
  1837. .divp_shift = 20,
  1838. .divp_width = 3,
  1839. };
  1840. static struct tegra_clk_pll_freq_table pll_d_freq_table[] = {
  1841. { 12000000, 594000000, 99, 1, 2, 0, 0 },
  1842. { 13000000, 594000000, 91, 1, 2, 0, 0xfc4f }, /* actual: 594000183 */
  1843. { 38400000, 594000000, 30, 1, 2, 0, 0x0e00 },
  1844. { 0, 0, 0, 0, 0, 0, 0 },
  1845. };
  1846. static struct tegra_clk_pll_params pll_d_params = {
  1847. .input_min = 12000000,
  1848. .input_max = 800000000,
  1849. .cf_min = 12000000,
  1850. .cf_max = 38400000,
  1851. .vco_min = 750000000,
  1852. .vco_max = 1500000000,
  1853. .base_reg = PLLD_BASE,
  1854. .misc_reg = PLLD_MISC0,
  1855. .lock_mask = PLL_BASE_LOCK,
  1856. .lock_delay = 1000,
  1857. .iddq_reg = PLLD_MISC0,
  1858. .iddq_bit_idx = PLLD_IDDQ_BIT,
  1859. .round_p_to_pdiv = pll_expo_p_to_pdiv,
  1860. .pdiv_tohw = pll_expo_pdiv_to_hw,
  1861. .div_nmp = &plld_nmp,
  1862. .sdm_din_reg = PLLD_MISC0,
  1863. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1864. .sdm_ctrl_reg = PLLD_MISC0,
  1865. .sdm_ctrl_en_mask = PLLD_SDM_EN_MASK,
  1866. .ext_misc_reg[0] = PLLD_MISC0,
  1867. .ext_misc_reg[1] = PLLD_MISC1,
  1868. .freq_table = pll_d_freq_table,
  1869. .flags = TEGRA_PLL_USE_LOCK,
  1870. .mdiv_default = 1,
  1871. .set_defaults = tegra210_plld_set_defaults,
  1872. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1873. .set_gain = tegra210_clk_pll_set_gain,
  1874. .adjust_vco = tegra210_clk_adjust_vco_min,
  1875. };
  1876. static struct tegra_clk_pll_freq_table tegra210_pll_d2_freq_table[] = {
  1877. { 12000000, 594000000, 99, 1, 2, 0, 0xf000 },
  1878. { 13000000, 594000000, 91, 1, 2, 0, 0xfc4f }, /* actual: 594000183 */
  1879. { 38400000, 594000000, 30, 1, 2, 0, 0x0e00 },
  1880. { 0, 0, 0, 0, 0, 0, 0 },
  1881. };
  1882. /* s/w policy, always tegra_pll_ref */
  1883. static struct tegra_clk_pll_params pll_d2_params = {
  1884. .input_min = 12000000,
  1885. .input_max = 800000000,
  1886. .cf_min = 12000000,
  1887. .cf_max = 38400000,
  1888. .vco_min = 750000000,
  1889. .vco_max = 1500000000,
  1890. .base_reg = PLLD2_BASE,
  1891. .misc_reg = PLLD2_MISC0,
  1892. .lock_mask = PLL_BASE_LOCK,
  1893. .lock_delay = 300,
  1894. .iddq_reg = PLLD2_BASE,
  1895. .iddq_bit_idx = PLLSS_IDDQ_BIT,
  1896. .sdm_din_reg = PLLD2_MISC3,
  1897. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1898. .sdm_ctrl_reg = PLLD2_MISC1,
  1899. .sdm_ctrl_en_mask = PLLD2_SDM_EN_MASK,
  1900. /* disable spread-spectrum for pll_d2 */
  1901. .ssc_ctrl_reg = 0,
  1902. .ssc_ctrl_en_mask = 0,
  1903. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1904. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1905. .div_nmp = &pllss_nmp,
  1906. .ext_misc_reg[0] = PLLD2_MISC0,
  1907. .ext_misc_reg[1] = PLLD2_MISC1,
  1908. .ext_misc_reg[2] = PLLD2_MISC2,
  1909. .ext_misc_reg[3] = PLLD2_MISC3,
  1910. .max_p = PLL_QLIN_PDIV_MAX,
  1911. .mdiv_default = 1,
  1912. .freq_table = tegra210_pll_d2_freq_table,
  1913. .set_defaults = tegra210_plld2_set_defaults,
  1914. .flags = TEGRA_PLL_USE_LOCK,
  1915. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1916. .set_gain = tegra210_clk_pll_set_gain,
  1917. .adjust_vco = tegra210_clk_adjust_vco_min,
  1918. };
  1919. static struct tegra_clk_pll_freq_table pll_dp_freq_table[] = {
  1920. { 12000000, 270000000, 90, 1, 4, 0, 0xf000 },
  1921. { 13000000, 270000000, 83, 1, 4, 0, 0xf000 }, /* actual: 269.8 MHz */
  1922. { 38400000, 270000000, 28, 1, 4, 0, 0xf400 },
  1923. { 0, 0, 0, 0, 0, 0, 0 },
  1924. };
  1925. static struct tegra_clk_pll_params pll_dp_params = {
  1926. .input_min = 12000000,
  1927. .input_max = 800000000,
  1928. .cf_min = 12000000,
  1929. .cf_max = 38400000,
  1930. .vco_min = 750000000,
  1931. .vco_max = 1500000000,
  1932. .base_reg = PLLDP_BASE,
  1933. .misc_reg = PLLDP_MISC,
  1934. .lock_mask = PLL_BASE_LOCK,
  1935. .lock_delay = 300,
  1936. .iddq_reg = PLLDP_BASE,
  1937. .iddq_bit_idx = PLLSS_IDDQ_BIT,
  1938. .sdm_din_reg = PLLDP_SS_CTRL2,
  1939. .sdm_din_mask = PLLA_SDM_DIN_MASK,
  1940. .sdm_ctrl_reg = PLLDP_SS_CFG,
  1941. .sdm_ctrl_en_mask = PLLDP_SDM_EN_MASK,
  1942. .ssc_ctrl_reg = PLLDP_SS_CFG,
  1943. .ssc_ctrl_en_mask = PLLDP_SSC_EN_MASK,
  1944. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1945. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1946. .div_nmp = &pllss_nmp,
  1947. .ext_misc_reg[0] = PLLDP_MISC,
  1948. .ext_misc_reg[1] = PLLDP_SS_CFG,
  1949. .ext_misc_reg[2] = PLLDP_SS_CTRL1,
  1950. .ext_misc_reg[3] = PLLDP_SS_CTRL2,
  1951. .max_p = PLL_QLIN_PDIV_MAX,
  1952. .mdiv_default = 1,
  1953. .freq_table = pll_dp_freq_table,
  1954. .set_defaults = tegra210_plldp_set_defaults,
  1955. .flags = TEGRA_PLL_USE_LOCK,
  1956. .calc_rate = tegra210_pll_fixed_mdiv_cfg,
  1957. .set_gain = tegra210_clk_pll_set_gain,
  1958. .adjust_vco = tegra210_clk_adjust_vco_min,
  1959. };
  1960. static struct div_nmp pllu_nmp = {
  1961. .divm_shift = 0,
  1962. .divm_width = 8,
  1963. .divn_shift = 8,
  1964. .divn_width = 8,
  1965. .divp_shift = 16,
  1966. .divp_width = 5,
  1967. };
  1968. static struct tegra_clk_pll_freq_table pll_u_freq_table[] = {
  1969. { 12000000, 480000000, 40, 1, 1, 0 },
  1970. { 13000000, 480000000, 36, 1, 1, 0 }, /* actual: 468.0 MHz */
  1971. { 38400000, 480000000, 25, 2, 1, 0 },
  1972. { 0, 0, 0, 0, 0, 0 },
  1973. };
  1974. static struct tegra_clk_pll_params pll_u_vco_params = {
  1975. .input_min = 9600000,
  1976. .input_max = 800000000,
  1977. .cf_min = 9600000,
  1978. .cf_max = 19200000,
  1979. .vco_min = 350000000,
  1980. .vco_max = 700000000,
  1981. .base_reg = PLLU_BASE,
  1982. .misc_reg = PLLU_MISC0,
  1983. .lock_mask = PLL_BASE_LOCK,
  1984. .lock_delay = 1000,
  1985. .iddq_reg = PLLU_MISC0,
  1986. .iddq_bit_idx = PLLU_IDDQ_BIT,
  1987. .ext_misc_reg[0] = PLLU_MISC0,
  1988. .ext_misc_reg[1] = PLLU_MISC1,
  1989. .round_p_to_pdiv = pll_qlin_p_to_pdiv,
  1990. .pdiv_tohw = pll_qlin_pdiv_to_hw,
  1991. .div_nmp = &pllu_nmp,
  1992. .freq_table = pll_u_freq_table,
  1993. .flags = TEGRA_PLLU | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
  1994. };
  1995. struct utmi_clk_param {
  1996. /* Oscillator Frequency in KHz */
  1997. u32 osc_frequency;
  1998. /* UTMIP PLL Enable Delay Count */
  1999. u8 enable_delay_count;
  2000. /* UTMIP PLL Stable count */
  2001. u16 stable_count;
  2002. /* UTMIP PLL Active delay count */
  2003. u8 active_delay_count;
  2004. /* UTMIP PLL Xtal frequency count */
  2005. u16 xtal_freq_count;
  2006. };
  2007. static const struct utmi_clk_param utmi_parameters[] = {
  2008. {
  2009. .osc_frequency = 38400000, .enable_delay_count = 0x0,
  2010. .stable_count = 0x0, .active_delay_count = 0x6,
  2011. .xtal_freq_count = 0x80
  2012. }, {
  2013. .osc_frequency = 13000000, .enable_delay_count = 0x02,
  2014. .stable_count = 0x33, .active_delay_count = 0x05,
  2015. .xtal_freq_count = 0x7f
  2016. }, {
  2017. .osc_frequency = 19200000, .enable_delay_count = 0x03,
  2018. .stable_count = 0x4b, .active_delay_count = 0x06,
  2019. .xtal_freq_count = 0xbb
  2020. }, {
  2021. .osc_frequency = 12000000, .enable_delay_count = 0x02,
  2022. .stable_count = 0x2f, .active_delay_count = 0x08,
  2023. .xtal_freq_count = 0x76
  2024. }, {
  2025. .osc_frequency = 26000000, .enable_delay_count = 0x04,
  2026. .stable_count = 0x66, .active_delay_count = 0x09,
  2027. .xtal_freq_count = 0xfe
  2028. }, {
  2029. .osc_frequency = 16800000, .enable_delay_count = 0x03,
  2030. .stable_count = 0x41, .active_delay_count = 0x0a,
  2031. .xtal_freq_count = 0xa4
  2032. },
  2033. };
  2034. static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
  2035. [tegra_clk_ispb] = { .dt_id = TEGRA210_CLK_ISPB, .present = true },
  2036. [tegra_clk_rtc] = { .dt_id = TEGRA210_CLK_RTC, .present = true },
  2037. [tegra_clk_timer] = { .dt_id = TEGRA210_CLK_TIMER, .present = true },
  2038. [tegra_clk_uarta_8] = { .dt_id = TEGRA210_CLK_UARTA, .present = true },
  2039. [tegra_clk_i2s1] = { .dt_id = TEGRA210_CLK_I2S1, .present = true },
  2040. [tegra_clk_i2c1] = { .dt_id = TEGRA210_CLK_I2C1, .present = true },
  2041. [tegra_clk_sdmmc1_9] = { .dt_id = TEGRA210_CLK_SDMMC1, .present = true },
  2042. [tegra_clk_pwm] = { .dt_id = TEGRA210_CLK_PWM, .present = true },
  2043. [tegra_clk_i2s2] = { .dt_id = TEGRA210_CLK_I2S2, .present = true },
  2044. [tegra_clk_usbd] = { .dt_id = TEGRA210_CLK_USBD, .present = true },
  2045. [tegra_clk_isp_9] = { .dt_id = TEGRA210_CLK_ISP, .present = true },
  2046. [tegra_clk_disp2_8] = { .dt_id = TEGRA210_CLK_DISP2, .present = true },
  2047. [tegra_clk_disp1_8] = { .dt_id = TEGRA210_CLK_DISP1, .present = true },
  2048. [tegra_clk_host1x_9] = { .dt_id = TEGRA210_CLK_HOST1X, .present = true },
  2049. [tegra_clk_i2s0] = { .dt_id = TEGRA210_CLK_I2S0, .present = true },
  2050. [tegra_clk_apbdma] = { .dt_id = TEGRA210_CLK_APBDMA, .present = true },
  2051. [tegra_clk_kfuse] = { .dt_id = TEGRA210_CLK_KFUSE, .present = true },
  2052. [tegra_clk_sbc1_9] = { .dt_id = TEGRA210_CLK_SBC1, .present = true },
  2053. [tegra_clk_sbc2_9] = { .dt_id = TEGRA210_CLK_SBC2, .present = true },
  2054. [tegra_clk_sbc3_9] = { .dt_id = TEGRA210_CLK_SBC3, .present = true },
  2055. [tegra_clk_i2c5] = { .dt_id = TEGRA210_CLK_I2C5, .present = true },
  2056. [tegra_clk_csi] = { .dt_id = TEGRA210_CLK_CSI, .present = true },
  2057. [tegra_clk_i2c2] = { .dt_id = TEGRA210_CLK_I2C2, .present = true },
  2058. [tegra_clk_uartc_8] = { .dt_id = TEGRA210_CLK_UARTC, .present = true },
  2059. [tegra_clk_mipi_cal] = { .dt_id = TEGRA210_CLK_MIPI_CAL, .present = true },
  2060. [tegra_clk_usb2] = { .dt_id = TEGRA210_CLK_USB2, .present = true },
  2061. [tegra_clk_bsev] = { .dt_id = TEGRA210_CLK_BSEV, .present = true },
  2062. [tegra_clk_uartd_8] = { .dt_id = TEGRA210_CLK_UARTD, .present = true },
  2063. [tegra_clk_i2c3] = { .dt_id = TEGRA210_CLK_I2C3, .present = true },
  2064. [tegra_clk_sbc4_9] = { .dt_id = TEGRA210_CLK_SBC4, .present = true },
  2065. [tegra_clk_sdmmc3_9] = { .dt_id = TEGRA210_CLK_SDMMC3, .present = true },
  2066. [tegra_clk_pcie] = { .dt_id = TEGRA210_CLK_PCIE, .present = true },
  2067. [tegra_clk_owr_8] = { .dt_id = TEGRA210_CLK_OWR, .present = true },
  2068. [tegra_clk_afi] = { .dt_id = TEGRA210_CLK_AFI, .present = true },
  2069. [tegra_clk_csite_8] = { .dt_id = TEGRA210_CLK_CSITE, .present = true },
  2070. [tegra_clk_soc_therm_8] = { .dt_id = TEGRA210_CLK_SOC_THERM, .present = true },
  2071. [tegra_clk_dtv] = { .dt_id = TEGRA210_CLK_DTV, .present = true },
  2072. [tegra_clk_i2cslow] = { .dt_id = TEGRA210_CLK_I2CSLOW, .present = true },
  2073. [tegra_clk_tsec_8] = { .dt_id = TEGRA210_CLK_TSEC, .present = true },
  2074. [tegra_clk_xusb_host] = { .dt_id = TEGRA210_CLK_XUSB_HOST, .present = true },
  2075. [tegra_clk_csus] = { .dt_id = TEGRA210_CLK_CSUS, .present = true },
  2076. [tegra_clk_mselect] = { .dt_id = TEGRA210_CLK_MSELECT, .present = true },
  2077. [tegra_clk_tsensor] = { .dt_id = TEGRA210_CLK_TSENSOR, .present = true },
  2078. [tegra_clk_i2s3] = { .dt_id = TEGRA210_CLK_I2S3, .present = true },
  2079. [tegra_clk_i2s4] = { .dt_id = TEGRA210_CLK_I2S4, .present = true },
  2080. [tegra_clk_i2c4] = { .dt_id = TEGRA210_CLK_I2C4, .present = true },
  2081. [tegra_clk_d_audio] = { .dt_id = TEGRA210_CLK_D_AUDIO, .present = true },
  2082. [tegra_clk_hda2codec_2x_8] = { .dt_id = TEGRA210_CLK_HDA2CODEC_2X, .present = true },
  2083. [tegra_clk_spdif_2x] = { .dt_id = TEGRA210_CLK_SPDIF_2X, .present = true },
  2084. [tegra_clk_actmon] = { .dt_id = TEGRA210_CLK_ACTMON, .present = true },
  2085. [tegra_clk_extern1] = { .dt_id = TEGRA210_CLK_EXTERN1, .present = true },
  2086. [tegra_clk_extern2] = { .dt_id = TEGRA210_CLK_EXTERN2, .present = true },
  2087. [tegra_clk_extern3] = { .dt_id = TEGRA210_CLK_EXTERN3, .present = true },
  2088. [tegra_clk_sata_oob_8] = { .dt_id = TEGRA210_CLK_SATA_OOB, .present = true },
  2089. [tegra_clk_sata_8] = { .dt_id = TEGRA210_CLK_SATA, .present = true },
  2090. [tegra_clk_hda_8] = { .dt_id = TEGRA210_CLK_HDA, .present = true },
  2091. [tegra_clk_hda2hdmi] = { .dt_id = TEGRA210_CLK_HDA2HDMI, .present = true },
  2092. [tegra_clk_cilab] = { .dt_id = TEGRA210_CLK_CILAB, .present = true },
  2093. [tegra_clk_cilcd] = { .dt_id = TEGRA210_CLK_CILCD, .present = true },
  2094. [tegra_clk_cile] = { .dt_id = TEGRA210_CLK_CILE, .present = true },
  2095. [tegra_clk_dsialp] = { .dt_id = TEGRA210_CLK_DSIALP, .present = true },
  2096. [tegra_clk_dsiblp] = { .dt_id = TEGRA210_CLK_DSIBLP, .present = true },
  2097. [tegra_clk_entropy_8] = { .dt_id = TEGRA210_CLK_ENTROPY, .present = true },
  2098. [tegra_clk_xusb_ss] = { .dt_id = TEGRA210_CLK_XUSB_SS, .present = true },
  2099. [tegra_clk_i2c6] = { .dt_id = TEGRA210_CLK_I2C6, .present = true },
  2100. [tegra_clk_vim2_clk] = { .dt_id = TEGRA210_CLK_VIM2_CLK, .present = true },
  2101. [tegra_clk_clk72Mhz_8] = { .dt_id = TEGRA210_CLK_CLK72MHZ, .present = true },
  2102. [tegra_clk_vic03_8] = { .dt_id = TEGRA210_CLK_VIC03, .present = true },
  2103. [tegra_clk_dpaux] = { .dt_id = TEGRA210_CLK_DPAUX, .present = true },
  2104. [tegra_clk_dpaux1] = { .dt_id = TEGRA210_CLK_DPAUX1, .present = true },
  2105. [tegra_clk_sor0] = { .dt_id = TEGRA210_CLK_SOR0, .present = true },
  2106. [tegra_clk_sor0_out] = { .dt_id = TEGRA210_CLK_SOR0_OUT, .present = true },
  2107. [tegra_clk_sor1] = { .dt_id = TEGRA210_CLK_SOR1, .present = true },
  2108. [tegra_clk_sor1_out] = { .dt_id = TEGRA210_CLK_SOR1_OUT, .present = true },
  2109. [tegra_clk_gpu] = { .dt_id = TEGRA210_CLK_GPU, .present = true },
  2110. [tegra_clk_pll_g_ref] = { .dt_id = TEGRA210_CLK_PLL_G_REF, .present = true, },
  2111. [tegra_clk_uartb_8] = { .dt_id = TEGRA210_CLK_UARTB, .present = true },
  2112. [tegra_clk_spdif_in_8] = { .dt_id = TEGRA210_CLK_SPDIF_IN, .present = true },
  2113. [tegra_clk_spdif_out] = { .dt_id = TEGRA210_CLK_SPDIF_OUT, .present = true },
  2114. [tegra_clk_vi_10] = { .dt_id = TEGRA210_CLK_VI, .present = true },
  2115. [tegra_clk_vi_sensor_8] = { .dt_id = TEGRA210_CLK_VI_SENSOR, .present = true },
  2116. [tegra_clk_fuse] = { .dt_id = TEGRA210_CLK_FUSE, .present = true },
  2117. [tegra_clk_fuse_burn] = { .dt_id = TEGRA210_CLK_FUSE_BURN, .present = true },
  2118. [tegra_clk_clk_32k] = { .dt_id = TEGRA210_CLK_CLK_32K, .present = true },
  2119. [tegra_clk_clk_m] = { .dt_id = TEGRA210_CLK_CLK_M, .present = true },
  2120. [tegra_clk_osc] = { .dt_id = TEGRA210_CLK_OSC, .present = true },
  2121. [tegra_clk_osc_div2] = { .dt_id = TEGRA210_CLK_OSC_DIV2, .present = true },
  2122. [tegra_clk_osc_div4] = { .dt_id = TEGRA210_CLK_OSC_DIV4, .present = true },
  2123. [tegra_clk_pll_ref] = { .dt_id = TEGRA210_CLK_PLL_REF, .present = true },
  2124. [tegra_clk_pll_c] = { .dt_id = TEGRA210_CLK_PLL_C, .present = true },
  2125. [tegra_clk_pll_c_out1] = { .dt_id = TEGRA210_CLK_PLL_C_OUT1, .present = true },
  2126. [tegra_clk_pll_c2] = { .dt_id = TEGRA210_CLK_PLL_C2, .present = true },
  2127. [tegra_clk_pll_c3] = { .dt_id = TEGRA210_CLK_PLL_C3, .present = true },
  2128. [tegra_clk_pll_m] = { .dt_id = TEGRA210_CLK_PLL_M, .present = true },
  2129. [tegra_clk_pll_p] = { .dt_id = TEGRA210_CLK_PLL_P, .present = true },
  2130. [tegra_clk_pll_p_out1] = { .dt_id = TEGRA210_CLK_PLL_P_OUT1, .present = true },
  2131. [tegra_clk_pll_p_out3] = { .dt_id = TEGRA210_CLK_PLL_P_OUT3, .present = true },
  2132. [tegra_clk_pll_p_out4_cpu] = { .dt_id = TEGRA210_CLK_PLL_P_OUT4, .present = true },
  2133. [tegra_clk_pll_p_out_hsio] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_HSIO, .present = true },
  2134. [tegra_clk_pll_p_out_xusb] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_XUSB, .present = true },
  2135. [tegra_clk_pll_p_out_cpu] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_CPU, .present = true },
  2136. [tegra_clk_pll_p_out_adsp] = { .dt_id = TEGRA210_CLK_PLL_P_OUT_ADSP, .present = true },
  2137. [tegra_clk_pll_a] = { .dt_id = TEGRA210_CLK_PLL_A, .present = true },
  2138. [tegra_clk_pll_a_out0] = { .dt_id = TEGRA210_CLK_PLL_A_OUT0, .present = true },
  2139. [tegra_clk_pll_d] = { .dt_id = TEGRA210_CLK_PLL_D, .present = true },
  2140. [tegra_clk_pll_d_out0] = { .dt_id = TEGRA210_CLK_PLL_D_OUT0, .present = true },
  2141. [tegra_clk_pll_d2] = { .dt_id = TEGRA210_CLK_PLL_D2, .present = true },
  2142. [tegra_clk_pll_d2_out0] = { .dt_id = TEGRA210_CLK_PLL_D2_OUT0, .present = true },
  2143. [tegra_clk_pll_u] = { .dt_id = TEGRA210_CLK_PLL_U, .present = true },
  2144. [tegra_clk_pll_u_out] = { .dt_id = TEGRA210_CLK_PLL_U_OUT, .present = true },
  2145. [tegra_clk_pll_u_out1] = { .dt_id = TEGRA210_CLK_PLL_U_OUT1, .present = true },
  2146. [tegra_clk_pll_u_out2] = { .dt_id = TEGRA210_CLK_PLL_U_OUT2, .present = true },
  2147. [tegra_clk_pll_u_480m] = { .dt_id = TEGRA210_CLK_PLL_U_480M, .present = true },
  2148. [tegra_clk_pll_u_60m] = { .dt_id = TEGRA210_CLK_PLL_U_60M, .present = true },
  2149. [tegra_clk_pll_u_48m] = { .dt_id = TEGRA210_CLK_PLL_U_48M, .present = true },
  2150. [tegra_clk_pll_x] = { .dt_id = TEGRA210_CLK_PLL_X, .present = true },
  2151. [tegra_clk_pll_x_out0] = { .dt_id = TEGRA210_CLK_PLL_X_OUT0, .present = true },
  2152. [tegra_clk_pll_re_vco] = { .dt_id = TEGRA210_CLK_PLL_RE_VCO, .present = true },
  2153. [tegra_clk_pll_re_out] = { .dt_id = TEGRA210_CLK_PLL_RE_OUT, .present = true },
  2154. [tegra_clk_spdif_in_sync] = { .dt_id = TEGRA210_CLK_SPDIF_IN_SYNC, .present = true },
  2155. [tegra_clk_i2s0_sync] = { .dt_id = TEGRA210_CLK_I2S0_SYNC, .present = true },
  2156. [tegra_clk_i2s1_sync] = { .dt_id = TEGRA210_CLK_I2S1_SYNC, .present = true },
  2157. [tegra_clk_i2s2_sync] = { .dt_id = TEGRA210_CLK_I2S2_SYNC, .present = true },
  2158. [tegra_clk_i2s3_sync] = { .dt_id = TEGRA210_CLK_I2S3_SYNC, .present = true },
  2159. [tegra_clk_i2s4_sync] = { .dt_id = TEGRA210_CLK_I2S4_SYNC, .present = true },
  2160. [tegra_clk_vimclk_sync] = { .dt_id = TEGRA210_CLK_VIMCLK_SYNC, .present = true },
  2161. [tegra_clk_audio0] = { .dt_id = TEGRA210_CLK_AUDIO0, .present = true },
  2162. [tegra_clk_audio1] = { .dt_id = TEGRA210_CLK_AUDIO1, .present = true },
  2163. [tegra_clk_audio2] = { .dt_id = TEGRA210_CLK_AUDIO2, .present = true },
  2164. [tegra_clk_audio3] = { .dt_id = TEGRA210_CLK_AUDIO3, .present = true },
  2165. [tegra_clk_audio4] = { .dt_id = TEGRA210_CLK_AUDIO4, .present = true },
  2166. [tegra_clk_spdif] = { .dt_id = TEGRA210_CLK_SPDIF, .present = true },
  2167. [tegra_clk_xusb_gate] = { .dt_id = TEGRA210_CLK_XUSB_GATE, .present = true },
  2168. [tegra_clk_xusb_host_src_8] = { .dt_id = TEGRA210_CLK_XUSB_HOST_SRC, .present = true },
  2169. [tegra_clk_xusb_falcon_src_8] = { .dt_id = TEGRA210_CLK_XUSB_FALCON_SRC, .present = true },
  2170. [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA210_CLK_XUSB_FS_SRC, .present = true },
  2171. [tegra_clk_xusb_ss_src_8] = { .dt_id = TEGRA210_CLK_XUSB_SS_SRC, .present = true },
  2172. [tegra_clk_xusb_ss_div2] = { .dt_id = TEGRA210_CLK_XUSB_SS_DIV2, .present = true },
  2173. [tegra_clk_xusb_dev_src_8] = { .dt_id = TEGRA210_CLK_XUSB_DEV_SRC, .present = true },
  2174. [tegra_clk_xusb_dev] = { .dt_id = TEGRA210_CLK_XUSB_DEV, .present = true },
  2175. [tegra_clk_xusb_hs_src_4] = { .dt_id = TEGRA210_CLK_XUSB_HS_SRC, .present = true },
  2176. [tegra_clk_xusb_ssp_src] = { .dt_id = TEGRA210_CLK_XUSB_SSP_SRC, .present = true },
  2177. [tegra_clk_usb2_hsic_trk] = { .dt_id = TEGRA210_CLK_USB2_HSIC_TRK, .present = true },
  2178. [tegra_clk_hsic_trk] = { .dt_id = TEGRA210_CLK_HSIC_TRK, .present = true },
  2179. [tegra_clk_usb2_trk] = { .dt_id = TEGRA210_CLK_USB2_TRK, .present = true },
  2180. [tegra_clk_sclk] = { .dt_id = TEGRA210_CLK_SCLK, .present = true },
  2181. [tegra_clk_sclk_mux] = { .dt_id = TEGRA210_CLK_SCLK_MUX, .present = true },
  2182. [tegra_clk_hclk] = { .dt_id = TEGRA210_CLK_HCLK, .present = true },
  2183. [tegra_clk_pclk] = { .dt_id = TEGRA210_CLK_PCLK, .present = true },
  2184. [tegra_clk_cclk_g] = { .dt_id = TEGRA210_CLK_CCLK_G, .present = true },
  2185. [tegra_clk_cclk_lp] = { .dt_id = TEGRA210_CLK_CCLK_LP, .present = true },
  2186. [tegra_clk_dfll_ref] = { .dt_id = TEGRA210_CLK_DFLL_REF, .present = true },
  2187. [tegra_clk_dfll_soc] = { .dt_id = TEGRA210_CLK_DFLL_SOC, .present = true },
  2188. [tegra_clk_vi_sensor2_8] = { .dt_id = TEGRA210_CLK_VI_SENSOR2, .present = true },
  2189. [tegra_clk_pll_p_out5] = { .dt_id = TEGRA210_CLK_PLL_P_OUT5, .present = true },
  2190. [tegra_clk_pll_c4] = { .dt_id = TEGRA210_CLK_PLL_C4, .present = true },
  2191. [tegra_clk_pll_dp] = { .dt_id = TEGRA210_CLK_PLL_DP, .present = true },
  2192. [tegra_clk_audio0_mux] = { .dt_id = TEGRA210_CLK_AUDIO0_MUX, .present = true },
  2193. [tegra_clk_audio1_mux] = { .dt_id = TEGRA210_CLK_AUDIO1_MUX, .present = true },
  2194. [tegra_clk_audio2_mux] = { .dt_id = TEGRA210_CLK_AUDIO2_MUX, .present = true },
  2195. [tegra_clk_audio3_mux] = { .dt_id = TEGRA210_CLK_AUDIO3_MUX, .present = true },
  2196. [tegra_clk_audio4_mux] = { .dt_id = TEGRA210_CLK_AUDIO4_MUX, .present = true },
  2197. [tegra_clk_spdif_mux] = { .dt_id = TEGRA210_CLK_SPDIF_MUX, .present = true },
  2198. [tegra_clk_maud] = { .dt_id = TEGRA210_CLK_MAUD, .present = true },
  2199. [tegra_clk_mipibif] = { .dt_id = TEGRA210_CLK_MIPIBIF, .present = true },
  2200. [tegra_clk_qspi] = { .dt_id = TEGRA210_CLK_QSPI, .present = true },
  2201. [tegra_clk_sdmmc_legacy] = { .dt_id = TEGRA210_CLK_SDMMC_LEGACY, .present = true },
  2202. [tegra_clk_tsecb] = { .dt_id = TEGRA210_CLK_TSECB, .present = true },
  2203. [tegra_clk_uartape] = { .dt_id = TEGRA210_CLK_UARTAPE, .present = true },
  2204. [tegra_clk_vi_i2c] = { .dt_id = TEGRA210_CLK_VI_I2C, .present = true },
  2205. [tegra_clk_ape] = { .dt_id = TEGRA210_CLK_APE, .present = true },
  2206. [tegra_clk_dbgapb] = { .dt_id = TEGRA210_CLK_DBGAPB, .present = true },
  2207. [tegra_clk_nvdec] = { .dt_id = TEGRA210_CLK_NVDEC, .present = true },
  2208. [tegra_clk_nvenc] = { .dt_id = TEGRA210_CLK_NVENC, .present = true },
  2209. [tegra_clk_nvjpg] = { .dt_id = TEGRA210_CLK_NVJPG, .present = true },
  2210. [tegra_clk_pll_c4_out0] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT0, .present = true },
  2211. [tegra_clk_pll_c4_out1] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT1, .present = true },
  2212. [tegra_clk_pll_c4_out2] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT2, .present = true },
  2213. [tegra_clk_pll_c4_out3] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT3, .present = true },
  2214. [tegra_clk_apb2ape] = { .dt_id = TEGRA210_CLK_APB2APE, .present = true },
  2215. [tegra_clk_pll_a1] = { .dt_id = TEGRA210_CLK_PLL_A1, .present = true },
  2216. [tegra_clk_ispa] = { .dt_id = TEGRA210_CLK_ISPA, .present = true },
  2217. [tegra_clk_cec] = { .dt_id = TEGRA210_CLK_CEC, .present = true },
  2218. [tegra_clk_dmic1] = { .dt_id = TEGRA210_CLK_DMIC1, .present = true },
  2219. [tegra_clk_dmic2] = { .dt_id = TEGRA210_CLK_DMIC2, .present = true },
  2220. [tegra_clk_dmic3] = { .dt_id = TEGRA210_CLK_DMIC3, .present = true },
  2221. [tegra_clk_dmic1_sync_clk] = { .dt_id = TEGRA210_CLK_DMIC1_SYNC_CLK, .present = true },
  2222. [tegra_clk_dmic2_sync_clk] = { .dt_id = TEGRA210_CLK_DMIC2_SYNC_CLK, .present = true },
  2223. [tegra_clk_dmic3_sync_clk] = { .dt_id = TEGRA210_CLK_DMIC3_SYNC_CLK, .present = true },
  2224. [tegra_clk_dmic1_sync_clk_mux] = { .dt_id = TEGRA210_CLK_DMIC1_SYNC_CLK_MUX, .present = true },
  2225. [tegra_clk_dmic2_sync_clk_mux] = { .dt_id = TEGRA210_CLK_DMIC2_SYNC_CLK_MUX, .present = true },
  2226. [tegra_clk_dmic3_sync_clk_mux] = { .dt_id = TEGRA210_CLK_DMIC3_SYNC_CLK_MUX, .present = true },
  2227. [tegra_clk_dp2] = { .dt_id = TEGRA210_CLK_DP2, .present = true },
  2228. [tegra_clk_iqc1] = { .dt_id = TEGRA210_CLK_IQC1, .present = true },
  2229. [tegra_clk_iqc2] = { .dt_id = TEGRA210_CLK_IQC2, .present = true },
  2230. [tegra_clk_pll_a_out_adsp] = { .dt_id = TEGRA210_CLK_PLL_A_OUT_ADSP, .present = true },
  2231. [tegra_clk_pll_a_out0_out_adsp] = { .dt_id = TEGRA210_CLK_PLL_A_OUT0_OUT_ADSP, .present = true },
  2232. [tegra_clk_adsp] = { .dt_id = TEGRA210_CLK_ADSP, .present = true },
  2233. [tegra_clk_adsp_neon] = { .dt_id = TEGRA210_CLK_ADSP_NEON, .present = true },
  2234. };
  2235. static struct tegra_devclk devclks[] __initdata = {
  2236. { .con_id = "clk_m", .dt_id = TEGRA210_CLK_CLK_M },
  2237. { .con_id = "pll_ref", .dt_id = TEGRA210_CLK_PLL_REF },
  2238. { .con_id = "clk_32k", .dt_id = TEGRA210_CLK_CLK_32K },
  2239. { .con_id = "osc", .dt_id = TEGRA210_CLK_OSC },
  2240. { .con_id = "osc_div2", .dt_id = TEGRA210_CLK_OSC_DIV2 },
  2241. { .con_id = "osc_div4", .dt_id = TEGRA210_CLK_OSC_DIV4 },
  2242. { .con_id = "pll_c", .dt_id = TEGRA210_CLK_PLL_C },
  2243. { .con_id = "pll_c_out1", .dt_id = TEGRA210_CLK_PLL_C_OUT1 },
  2244. { .con_id = "pll_c2", .dt_id = TEGRA210_CLK_PLL_C2 },
  2245. { .con_id = "pll_c3", .dt_id = TEGRA210_CLK_PLL_C3 },
  2246. { .con_id = "pll_p", .dt_id = TEGRA210_CLK_PLL_P },
  2247. { .con_id = "pll_p_out1", .dt_id = TEGRA210_CLK_PLL_P_OUT1 },
  2248. { .con_id = "pll_p_out2", .dt_id = TEGRA210_CLK_PLL_P_OUT2 },
  2249. { .con_id = "pll_p_out3", .dt_id = TEGRA210_CLK_PLL_P_OUT3 },
  2250. { .con_id = "pll_p_out4", .dt_id = TEGRA210_CLK_PLL_P_OUT4 },
  2251. { .con_id = "pll_m", .dt_id = TEGRA210_CLK_PLL_M },
  2252. { .con_id = "pll_x", .dt_id = TEGRA210_CLK_PLL_X },
  2253. { .con_id = "pll_x_out0", .dt_id = TEGRA210_CLK_PLL_X_OUT0 },
  2254. { .con_id = "pll_u", .dt_id = TEGRA210_CLK_PLL_U },
  2255. { .con_id = "pll_u_out", .dt_id = TEGRA210_CLK_PLL_U_OUT },
  2256. { .con_id = "pll_u_out1", .dt_id = TEGRA210_CLK_PLL_U_OUT1 },
  2257. { .con_id = "pll_u_out2", .dt_id = TEGRA210_CLK_PLL_U_OUT2 },
  2258. { .con_id = "pll_u_480M", .dt_id = TEGRA210_CLK_PLL_U_480M },
  2259. { .con_id = "pll_u_60M", .dt_id = TEGRA210_CLK_PLL_U_60M },
  2260. { .con_id = "pll_u_48M", .dt_id = TEGRA210_CLK_PLL_U_48M },
  2261. { .con_id = "pll_d", .dt_id = TEGRA210_CLK_PLL_D },
  2262. { .con_id = "pll_d_out0", .dt_id = TEGRA210_CLK_PLL_D_OUT0 },
  2263. { .con_id = "pll_d2", .dt_id = TEGRA210_CLK_PLL_D2 },
  2264. { .con_id = "pll_d2_out0", .dt_id = TEGRA210_CLK_PLL_D2_OUT0 },
  2265. { .con_id = "pll_a", .dt_id = TEGRA210_CLK_PLL_A },
  2266. { .con_id = "pll_a_out0", .dt_id = TEGRA210_CLK_PLL_A_OUT0 },
  2267. { .con_id = "pll_re_vco", .dt_id = TEGRA210_CLK_PLL_RE_VCO },
  2268. { .con_id = "pll_re_out", .dt_id = TEGRA210_CLK_PLL_RE_OUT },
  2269. { .con_id = "spdif_in_sync", .dt_id = TEGRA210_CLK_SPDIF_IN_SYNC },
  2270. { .con_id = "i2s0_sync", .dt_id = TEGRA210_CLK_I2S0_SYNC },
  2271. { .con_id = "i2s1_sync", .dt_id = TEGRA210_CLK_I2S1_SYNC },
  2272. { .con_id = "i2s2_sync", .dt_id = TEGRA210_CLK_I2S2_SYNC },
  2273. { .con_id = "i2s3_sync", .dt_id = TEGRA210_CLK_I2S3_SYNC },
  2274. { .con_id = "i2s4_sync", .dt_id = TEGRA210_CLK_I2S4_SYNC },
  2275. { .con_id = "vimclk_sync", .dt_id = TEGRA210_CLK_VIMCLK_SYNC },
  2276. { .con_id = "audio0", .dt_id = TEGRA210_CLK_AUDIO0 },
  2277. { .con_id = "audio1", .dt_id = TEGRA210_CLK_AUDIO1 },
  2278. { .con_id = "audio2", .dt_id = TEGRA210_CLK_AUDIO2 },
  2279. { .con_id = "audio3", .dt_id = TEGRA210_CLK_AUDIO3 },
  2280. { .con_id = "audio4", .dt_id = TEGRA210_CLK_AUDIO4 },
  2281. { .con_id = "spdif", .dt_id = TEGRA210_CLK_SPDIF },
  2282. { .con_id = "spdif_2x", .dt_id = TEGRA210_CLK_SPDIF_2X },
  2283. { .con_id = "extern1", .dt_id = TEGRA210_CLK_EXTERN1 },
  2284. { .con_id = "extern2", .dt_id = TEGRA210_CLK_EXTERN2 },
  2285. { .con_id = "extern3", .dt_id = TEGRA210_CLK_EXTERN3 },
  2286. { .con_id = "cclk_g", .dt_id = TEGRA210_CLK_CCLK_G },
  2287. { .con_id = "cclk_lp", .dt_id = TEGRA210_CLK_CCLK_LP },
  2288. { .con_id = "sclk", .dt_id = TEGRA210_CLK_SCLK },
  2289. { .con_id = "hclk", .dt_id = TEGRA210_CLK_HCLK },
  2290. { .con_id = "pclk", .dt_id = TEGRA210_CLK_PCLK },
  2291. { .con_id = "fuse", .dt_id = TEGRA210_CLK_FUSE },
  2292. { .dev_id = "rtc-tegra", .dt_id = TEGRA210_CLK_RTC },
  2293. { .dev_id = "timer", .dt_id = TEGRA210_CLK_TIMER },
  2294. { .con_id = "pll_c4_out0", .dt_id = TEGRA210_CLK_PLL_C4_OUT0 },
  2295. { .con_id = "pll_c4_out1", .dt_id = TEGRA210_CLK_PLL_C4_OUT1 },
  2296. { .con_id = "pll_c4_out2", .dt_id = TEGRA210_CLK_PLL_C4_OUT2 },
  2297. { .con_id = "pll_c4_out3", .dt_id = TEGRA210_CLK_PLL_C4_OUT3 },
  2298. { .con_id = "dpaux", .dt_id = TEGRA210_CLK_DPAUX },
  2299. };
  2300. static struct tegra_audio_clk_info tegra210_audio_plls[] = {
  2301. { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_ref" },
  2302. { "pll_a1", &pll_a1_params, tegra_clk_pll_a1, "pll_ref" },
  2303. };
  2304. static const char * const aclk_parents[] = {
  2305. "pll_a1", "pll_c", "pll_p", "pll_a_out0", "pll_c2", "pll_c3",
  2306. "clk_m"
  2307. };
  2308. static const unsigned int nvjpg_slcg_clkids[] = { TEGRA210_CLK_NVDEC };
  2309. static const unsigned int nvdec_slcg_clkids[] = { TEGRA210_CLK_NVJPG };
  2310. static const unsigned int sor_slcg_clkids[] = { TEGRA210_CLK_HDA2CODEC_2X,
  2311. TEGRA210_CLK_HDA2HDMI, TEGRA210_CLK_DISP1, TEGRA210_CLK_DISP2 };
  2312. static const unsigned int disp_slcg_clkids[] = { TEGRA210_CLK_LA,
  2313. TEGRA210_CLK_HOST1X};
  2314. static const unsigned int xusba_slcg_clkids[] = { TEGRA210_CLK_XUSB_HOST,
  2315. TEGRA210_CLK_XUSB_DEV };
  2316. static const unsigned int xusbb_slcg_clkids[] = { TEGRA210_CLK_XUSB_HOST,
  2317. TEGRA210_CLK_XUSB_SS };
  2318. static const unsigned int xusbc_slcg_clkids[] = { TEGRA210_CLK_XUSB_DEV,
  2319. TEGRA210_CLK_XUSB_SS };
  2320. static const unsigned int venc_slcg_clkids[] = { TEGRA210_CLK_HOST1X,
  2321. TEGRA210_CLK_PLL_D };
  2322. static const unsigned int ape_slcg_clkids[] = { TEGRA210_CLK_ACLK,
  2323. TEGRA210_CLK_I2S0, TEGRA210_CLK_I2S1, TEGRA210_CLK_I2S2,
  2324. TEGRA210_CLK_I2S3, TEGRA210_CLK_I2S4, TEGRA210_CLK_SPDIF_OUT,
  2325. TEGRA210_CLK_D_AUDIO };
  2326. static const unsigned int vic_slcg_clkids[] = { TEGRA210_CLK_HOST1X };
  2327. static struct tegra210_domain_mbist_war tegra210_pg_mbist_war[] = {
  2328. [TEGRA_POWERGATE_VENC] = {
  2329. .handle_lvl2_ovr = tegra210_venc_mbist_war,
  2330. .num_clks = ARRAY_SIZE(venc_slcg_clkids),
  2331. .clk_init_data = venc_slcg_clkids,
  2332. },
  2333. [TEGRA_POWERGATE_SATA] = {
  2334. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2335. .lvl2_offset = LVL2_CLK_GATE_OVRC,
  2336. .lvl2_mask = BIT(0) | BIT(17) | BIT(19),
  2337. },
  2338. [TEGRA_POWERGATE_MPE] = {
  2339. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2340. .lvl2_offset = LVL2_CLK_GATE_OVRE,
  2341. .lvl2_mask = BIT(29),
  2342. },
  2343. [TEGRA_POWERGATE_SOR] = {
  2344. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2345. .num_clks = ARRAY_SIZE(sor_slcg_clkids),
  2346. .clk_init_data = sor_slcg_clkids,
  2347. .lvl2_offset = LVL2_CLK_GATE_OVRA,
  2348. .lvl2_mask = BIT(1) | BIT(2),
  2349. },
  2350. [TEGRA_POWERGATE_DIS] = {
  2351. .handle_lvl2_ovr = tegra210_disp_mbist_war,
  2352. .num_clks = ARRAY_SIZE(disp_slcg_clkids),
  2353. .clk_init_data = disp_slcg_clkids,
  2354. },
  2355. [TEGRA_POWERGATE_DISB] = {
  2356. .num_clks = ARRAY_SIZE(disp_slcg_clkids),
  2357. .clk_init_data = disp_slcg_clkids,
  2358. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2359. .lvl2_offset = LVL2_CLK_GATE_OVRA,
  2360. .lvl2_mask = BIT(2),
  2361. },
  2362. [TEGRA_POWERGATE_XUSBA] = {
  2363. .num_clks = ARRAY_SIZE(xusba_slcg_clkids),
  2364. .clk_init_data = xusba_slcg_clkids,
  2365. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2366. .lvl2_offset = LVL2_CLK_GATE_OVRC,
  2367. .lvl2_mask = BIT(30) | BIT(31),
  2368. },
  2369. [TEGRA_POWERGATE_XUSBB] = {
  2370. .num_clks = ARRAY_SIZE(xusbb_slcg_clkids),
  2371. .clk_init_data = xusbb_slcg_clkids,
  2372. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2373. .lvl2_offset = LVL2_CLK_GATE_OVRC,
  2374. .lvl2_mask = BIT(30) | BIT(31),
  2375. },
  2376. [TEGRA_POWERGATE_XUSBC] = {
  2377. .num_clks = ARRAY_SIZE(xusbc_slcg_clkids),
  2378. .clk_init_data = xusbc_slcg_clkids,
  2379. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2380. .lvl2_offset = LVL2_CLK_GATE_OVRC,
  2381. .lvl2_mask = BIT(30) | BIT(31),
  2382. },
  2383. [TEGRA_POWERGATE_VIC] = {
  2384. .num_clks = ARRAY_SIZE(vic_slcg_clkids),
  2385. .clk_init_data = vic_slcg_clkids,
  2386. .handle_lvl2_ovr = tegra210_vic_mbist_war,
  2387. },
  2388. [TEGRA_POWERGATE_NVDEC] = {
  2389. .num_clks = ARRAY_SIZE(nvdec_slcg_clkids),
  2390. .clk_init_data = nvdec_slcg_clkids,
  2391. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2392. .lvl2_offset = LVL2_CLK_GATE_OVRE,
  2393. .lvl2_mask = BIT(9) | BIT(31),
  2394. },
  2395. [TEGRA_POWERGATE_NVJPG] = {
  2396. .num_clks = ARRAY_SIZE(nvjpg_slcg_clkids),
  2397. .clk_init_data = nvjpg_slcg_clkids,
  2398. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2399. .lvl2_offset = LVL2_CLK_GATE_OVRE,
  2400. .lvl2_mask = BIT(9) | BIT(31),
  2401. },
  2402. [TEGRA_POWERGATE_AUD] = {
  2403. .num_clks = ARRAY_SIZE(ape_slcg_clkids),
  2404. .clk_init_data = ape_slcg_clkids,
  2405. .handle_lvl2_ovr = tegra210_ape_mbist_war,
  2406. },
  2407. [TEGRA_POWERGATE_VE2] = {
  2408. .handle_lvl2_ovr = tegra210_generic_mbist_war,
  2409. .lvl2_offset = LVL2_CLK_GATE_OVRD,
  2410. .lvl2_mask = BIT(22),
  2411. },
  2412. };
  2413. int tegra210_clk_handle_mbist_war(unsigned int id)
  2414. {
  2415. int err;
  2416. struct tegra210_domain_mbist_war *mbist_war;
  2417. if (id >= ARRAY_SIZE(tegra210_pg_mbist_war)) {
  2418. WARN(1, "unknown domain id in MBIST WAR handler\n");
  2419. return -EINVAL;
  2420. }
  2421. mbist_war = &tegra210_pg_mbist_war[id];
  2422. if (!mbist_war->handle_lvl2_ovr)
  2423. return 0;
  2424. if (mbist_war->num_clks && !mbist_war->clks)
  2425. return -ENODEV;
  2426. err = clk_bulk_prepare_enable(mbist_war->num_clks, mbist_war->clks);
  2427. if (err < 0)
  2428. return err;
  2429. mutex_lock(&lvl2_ovr_lock);
  2430. mbist_war->handle_lvl2_ovr(mbist_war);
  2431. mutex_unlock(&lvl2_ovr_lock);
  2432. clk_bulk_disable_unprepare(mbist_war->num_clks, mbist_war->clks);
  2433. return 0;
  2434. }
  2435. void tegra210_put_utmipll_in_iddq(void)
  2436. {
  2437. u32 reg;
  2438. reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2439. if (reg & UTMIPLL_HW_PWRDN_CFG0_UTMIPLL_LOCK) {
  2440. pr_err("trying to assert IDDQ while UTMIPLL is locked\n");
  2441. return;
  2442. }
  2443. reg |= UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
  2444. writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2445. }
  2446. EXPORT_SYMBOL_GPL(tegra210_put_utmipll_in_iddq);
  2447. void tegra210_put_utmipll_out_iddq(void)
  2448. {
  2449. u32 reg;
  2450. reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2451. reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
  2452. writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2453. }
  2454. EXPORT_SYMBOL_GPL(tegra210_put_utmipll_out_iddq);
  2455. static void tegra210_utmi_param_configure(void)
  2456. {
  2457. u32 reg;
  2458. int i;
  2459. for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
  2460. if (osc_freq == utmi_parameters[i].osc_frequency)
  2461. break;
  2462. }
  2463. if (i >= ARRAY_SIZE(utmi_parameters)) {
  2464. pr_err("%s: Unexpected oscillator freq %lu\n", __func__,
  2465. osc_freq);
  2466. return;
  2467. }
  2468. reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2469. reg &= ~UTMIPLL_HW_PWRDN_CFG0_IDDQ_OVERRIDE;
  2470. writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2471. udelay(10);
  2472. reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
  2473. /* Program UTMIP PLL stable and active counts */
  2474. /* [FIXME] arclk_rst.h says WRONG! This should be 1ms -> 0x50 Check! */
  2475. reg &= ~UTMIP_PLL_CFG2_STABLE_COUNT(~0);
  2476. reg |= UTMIP_PLL_CFG2_STABLE_COUNT(utmi_parameters[i].stable_count);
  2477. reg &= ~UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(~0);
  2478. reg |=
  2479. UTMIP_PLL_CFG2_ACTIVE_DLY_COUNT(utmi_parameters[i].active_delay_count);
  2480. writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2);
  2481. /* Program UTMIP PLL delay and oscillator frequency counts */
  2482. reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
  2483. reg &= ~UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(~0);
  2484. reg |=
  2485. UTMIP_PLL_CFG1_ENABLE_DLY_COUNT(utmi_parameters[i].enable_delay_count);
  2486. reg &= ~UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(~0);
  2487. reg |=
  2488. UTMIP_PLL_CFG1_XTAL_FREQ_COUNT(utmi_parameters[i].xtal_freq_count);
  2489. reg |= UTMIP_PLL_CFG1_FORCE_PLLU_POWERDOWN;
  2490. writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
  2491. /* Remove power downs from UTMIP PLL control bits */
  2492. reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
  2493. reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
  2494. reg |= UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
  2495. writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
  2496. udelay(20);
  2497. /* Enable samplers for SNPS, XUSB_HOST, XUSB_DEV */
  2498. reg = readl_relaxed(clk_base + UTMIP_PLL_CFG2);
  2499. reg |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERUP;
  2500. reg |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERUP;
  2501. reg |= UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERUP;
  2502. reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_A_POWERDOWN;
  2503. reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_B_POWERDOWN;
  2504. reg &= ~UTMIP_PLL_CFG2_FORCE_PD_SAMP_D_POWERDOWN;
  2505. writel_relaxed(reg, clk_base + UTMIP_PLL_CFG2);
  2506. /* Setup HW control of UTMIPLL */
  2507. reg = readl_relaxed(clk_base + UTMIP_PLL_CFG1);
  2508. reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERDOWN;
  2509. reg &= ~UTMIP_PLL_CFG1_FORCE_PLL_ENABLE_POWERUP;
  2510. writel_relaxed(reg, clk_base + UTMIP_PLL_CFG1);
  2511. reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2512. reg |= UTMIPLL_HW_PWRDN_CFG0_USE_LOCKDET;
  2513. reg &= ~UTMIPLL_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL;
  2514. writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2515. udelay(1);
  2516. reg = readl_relaxed(clk_base + XUSB_PLL_CFG0);
  2517. reg &= ~XUSB_PLL_CFG0_UTMIPLL_LOCK_DLY;
  2518. writel_relaxed(reg, clk_base + XUSB_PLL_CFG0);
  2519. udelay(1);
  2520. /* Enable HW control UTMIPLL */
  2521. reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2522. reg |= UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE;
  2523. writel_relaxed(reg, clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2524. }
  2525. static int tegra210_enable_pllu(void)
  2526. {
  2527. struct tegra_clk_pll_freq_table *fentry;
  2528. struct tegra_clk_pll pllu;
  2529. u32 reg;
  2530. int ret;
  2531. for (fentry = pll_u_freq_table; fentry->input_rate; fentry++) {
  2532. if (fentry->input_rate == pll_ref_freq)
  2533. break;
  2534. }
  2535. if (!fentry->input_rate) {
  2536. pr_err("Unknown PLL_U reference frequency %lu\n", pll_ref_freq);
  2537. return -EINVAL;
  2538. }
  2539. /* clear IDDQ bit */
  2540. pllu.params = &pll_u_vco_params;
  2541. reg = readl_relaxed(clk_base + pllu.params->ext_misc_reg[0]);
  2542. reg &= ~BIT(pllu.params->iddq_bit_idx);
  2543. writel_relaxed(reg, clk_base + pllu.params->ext_misc_reg[0]);
  2544. fence_udelay(5, clk_base);
  2545. reg = readl_relaxed(clk_base + PLLU_BASE);
  2546. reg &= ~GENMASK(20, 0);
  2547. reg |= fentry->m;
  2548. reg |= fentry->n << 8;
  2549. reg |= fentry->p << 16;
  2550. writel(reg, clk_base + PLLU_BASE);
  2551. fence_udelay(1, clk_base);
  2552. reg |= PLL_ENABLE;
  2553. writel(reg, clk_base + PLLU_BASE);
  2554. /*
  2555. * During clocks resume, same PLLU init and enable sequence get
  2556. * executed. So, readx_poll_timeout_atomic can't be used here as it
  2557. * uses ktime_get() and timekeeping resume doesn't happen by that
  2558. * time. So, using tegra210_wait_for_mask for PLL LOCK.
  2559. */
  2560. ret = tegra210_wait_for_mask(&pllu, PLLU_BASE, PLL_BASE_LOCK);
  2561. if (ret) {
  2562. pr_err("Timed out waiting for PLL_U to lock\n");
  2563. return -ETIMEDOUT;
  2564. }
  2565. return 0;
  2566. }
  2567. static int tegra210_init_pllu(void)
  2568. {
  2569. u32 reg;
  2570. int err;
  2571. tegra210_pllu_set_defaults(&pll_u_vco_params);
  2572. /* skip initialization when pllu is in hw controlled mode */
  2573. reg = readl_relaxed(clk_base + PLLU_BASE);
  2574. if (reg & PLLU_BASE_OVERRIDE) {
  2575. if (!(reg & PLL_ENABLE)) {
  2576. err = tegra210_enable_pllu();
  2577. if (err < 0) {
  2578. WARN_ON(1);
  2579. return err;
  2580. }
  2581. }
  2582. /* enable hw controlled mode */
  2583. reg = readl_relaxed(clk_base + PLLU_BASE);
  2584. reg &= ~PLLU_BASE_OVERRIDE;
  2585. writel(reg, clk_base + PLLU_BASE);
  2586. reg = readl_relaxed(clk_base + PLLU_HW_PWRDN_CFG0);
  2587. reg |= PLLU_HW_PWRDN_CFG0_IDDQ_PD_INCLUDE |
  2588. PLLU_HW_PWRDN_CFG0_USE_SWITCH_DETECT |
  2589. PLLU_HW_PWRDN_CFG0_USE_LOCKDET;
  2590. reg &= ~(PLLU_HW_PWRDN_CFG0_CLK_ENABLE_SWCTL |
  2591. PLLU_HW_PWRDN_CFG0_CLK_SWITCH_SWCTL);
  2592. writel_relaxed(reg, clk_base + PLLU_HW_PWRDN_CFG0);
  2593. reg = readl_relaxed(clk_base + XUSB_PLL_CFG0);
  2594. reg &= ~XUSB_PLL_CFG0_PLLU_LOCK_DLY_MASK;
  2595. writel_relaxed(reg, clk_base + XUSB_PLL_CFG0);
  2596. fence_udelay(1, clk_base);
  2597. reg = readl_relaxed(clk_base + PLLU_HW_PWRDN_CFG0);
  2598. reg |= PLLU_HW_PWRDN_CFG0_SEQ_ENABLE;
  2599. writel_relaxed(reg, clk_base + PLLU_HW_PWRDN_CFG0);
  2600. fence_udelay(1, clk_base);
  2601. reg = readl_relaxed(clk_base + PLLU_BASE);
  2602. reg &= ~PLLU_BASE_CLKENABLE_USB;
  2603. writel_relaxed(reg, clk_base + PLLU_BASE);
  2604. }
  2605. /* enable UTMIPLL hw control if not yet done by the bootloader */
  2606. reg = readl_relaxed(clk_base + UTMIPLL_HW_PWRDN_CFG0);
  2607. if (!(reg & UTMIPLL_HW_PWRDN_CFG0_SEQ_ENABLE))
  2608. tegra210_utmi_param_configure();
  2609. return 0;
  2610. }
  2611. /*
  2612. * The SOR hardware blocks are driven by two clocks: a module clock that is
  2613. * used to access registers and a pixel clock that is sourced from the same
  2614. * pixel clock that also drives the head attached to the SOR. The module
  2615. * clock is typically called sorX (with X being the SOR instance) and the
  2616. * pixel clock is called sorX_out. The source for the SOR pixel clock is
  2617. * referred to as the "parent" clock.
  2618. *
  2619. * On Tegra186 and newer, clocks are provided by the BPMP. Unfortunately the
  2620. * BPMP implementation for the SOR clocks doesn't exactly match the above in
  2621. * some aspects. For example, the SOR module is really clocked by the pad or
  2622. * sor_safe clocks, but BPMP models the sorX clock as being sourced by the
  2623. * pixel clocks. Conversely the sorX_out clock is sourced by the sor_safe or
  2624. * pad clocks on BPMP.
  2625. *
  2626. * In order to allow the display driver to deal with all SoC generations in
  2627. * a unified way, implement the BPMP semantics in this driver.
  2628. */
  2629. static const char * const sor0_parents[] = {
  2630. "pll_d_out0",
  2631. };
  2632. static const char * const sor0_out_parents[] = {
  2633. "sor_safe", "sor0_pad_clkout",
  2634. };
  2635. static const char * const sor1_parents[] = {
  2636. "pll_p", "pll_d_out0", "pll_d2_out0", "clk_m",
  2637. };
  2638. static u32 sor1_parents_idx[] = { 0, 2, 5, 6 };
  2639. static const struct clk_div_table mc_div_table_tegra210[] = {
  2640. { .val = 0, .div = 2 },
  2641. { .val = 1, .div = 4 },
  2642. { .val = 2, .div = 1 },
  2643. { .val = 3, .div = 2 },
  2644. { .val = 0, .div = 0 },
  2645. };
  2646. static void tegra210_clk_register_mc(const char *name,
  2647. const char *parent_name)
  2648. {
  2649. struct clk *clk;
  2650. clk = clk_register_divider_table(NULL, name, parent_name,
  2651. CLK_IS_CRITICAL,
  2652. clk_base + CLK_SOURCE_EMC,
  2653. 15, 2, CLK_DIVIDER_READ_ONLY,
  2654. mc_div_table_tegra210, &emc_lock);
  2655. clks[TEGRA210_CLK_MC] = clk;
  2656. }
  2657. static const char * const sor1_out_parents[] = {
  2658. /*
  2659. * Bit 0 of the mux selects sor1_pad_clkout, irrespective of bit 1, so
  2660. * the sor1_pad_clkout parent appears twice in the list below. This is
  2661. * merely to support clk_get_parent() if firmware happened to set
  2662. * these bits to 0b11. While not an invalid setting, code should
  2663. * always set the bits to 0b01 to select sor1_pad_clkout.
  2664. */
  2665. "sor_safe", "sor1_pad_clkout", "sor1_out", "sor1_pad_clkout",
  2666. };
  2667. static struct tegra_periph_init_data tegra210_periph[] = {
  2668. /*
  2669. * On Tegra210, the sor0 clock doesn't have a mux it bitfield 31:29,
  2670. * but it is hardwired to the pll_d_out0 clock.
  2671. */
  2672. TEGRA_INIT_DATA_TABLE("sor0", NULL, NULL, sor0_parents,
  2673. CLK_SOURCE_SOR0, 29, 0x0, 0, 0, 0, 0,
  2674. 0, 182, 0, tegra_clk_sor0, NULL, 0,
  2675. &sor0_lock),
  2676. TEGRA_INIT_DATA_TABLE("sor0_out", NULL, NULL, sor0_out_parents,
  2677. CLK_SOURCE_SOR0, 14, 0x1, 0, 0, 0, 0,
  2678. 0, 0, TEGRA_PERIPH_NO_GATE, tegra_clk_sor0_out,
  2679. NULL, 0, &sor0_lock),
  2680. TEGRA_INIT_DATA_TABLE("sor1", NULL, NULL, sor1_parents,
  2681. CLK_SOURCE_SOR1, 29, 0x7, 0, 0, 8, 1,
  2682. TEGRA_DIVIDER_ROUND_UP, 183, 0,
  2683. tegra_clk_sor1, sor1_parents_idx, 0,
  2684. &sor1_lock),
  2685. TEGRA_INIT_DATA_TABLE("sor1_out", NULL, NULL, sor1_out_parents,
  2686. CLK_SOURCE_SOR1, 14, 0x3, 0, 0, 0, 0,
  2687. 0, 0, TEGRA_PERIPH_NO_GATE,
  2688. tegra_clk_sor1_out, NULL, 0, &sor1_lock),
  2689. };
  2690. static const char * const la_parents[] = {
  2691. "pll_p", "pll_c2", "pll_c", "pll_c3", "pll_re_out1", "pll_a1", "clk_m", "pll_c4_out0"
  2692. };
  2693. static struct tegra_clk_periph tegra210_la =
  2694. TEGRA_CLK_PERIPH(29, 7, 9, 0, 8, 1, TEGRA_DIVIDER_ROUND_UP, 76, 0, NULL, NULL);
  2695. static __init void tegra210_periph_clk_init(struct device_node *np,
  2696. void __iomem *clk_base,
  2697. void __iomem *pmc_base)
  2698. {
  2699. struct clk *clk;
  2700. unsigned int i;
  2701. /* xusb_ss_div2 */
  2702. clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0,
  2703. 1, 2);
  2704. clks[TEGRA210_CLK_XUSB_SS_DIV2] = clk;
  2705. clk = tegra_clk_register_periph_fixed("sor_safe", "pll_p", 0, clk_base,
  2706. 1, 17, 222);
  2707. clks[TEGRA210_CLK_SOR_SAFE] = clk;
  2708. clk = tegra_clk_register_periph_fixed("dpaux", "sor_safe", 0, clk_base,
  2709. 1, 17, 181);
  2710. clks[TEGRA210_CLK_DPAUX] = clk;
  2711. clk = tegra_clk_register_periph_fixed("dpaux1", "sor_safe", 0, clk_base,
  2712. 1, 17, 207);
  2713. clks[TEGRA210_CLK_DPAUX1] = clk;
  2714. /* pll_d_dsi_out */
  2715. clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0,
  2716. clk_base + PLLD_MISC0, 21, 0, &pll_d_lock);
  2717. clks[TEGRA210_CLK_PLL_D_DSI_OUT] = clk;
  2718. /* dsia */
  2719. clk = tegra_clk_register_periph_gate("dsia", "pll_d_dsi_out", 0,
  2720. clk_base, 0, 48,
  2721. periph_clk_enb_refcnt);
  2722. clks[TEGRA210_CLK_DSIA] = clk;
  2723. /* dsib */
  2724. clk = tegra_clk_register_periph_gate("dsib", "pll_d_dsi_out", 0,
  2725. clk_base, 0, 82,
  2726. periph_clk_enb_refcnt);
  2727. clks[TEGRA210_CLK_DSIB] = clk;
  2728. /* csi_tpg */
  2729. clk = clk_register_gate(NULL, "csi_tpg", "pll_d",
  2730. CLK_SET_RATE_PARENT, clk_base + PLLD_BASE,
  2731. 23, 0, &pll_d_lock);
  2732. clk_register_clkdev(clk, "csi_tpg", NULL);
  2733. clks[TEGRA210_CLK_CSI_TPG] = clk;
  2734. /* la */
  2735. clk = tegra_clk_register_periph("la", la_parents,
  2736. ARRAY_SIZE(la_parents), &tegra210_la, clk_base,
  2737. CLK_SOURCE_LA, 0);
  2738. clks[TEGRA210_CLK_LA] = clk;
  2739. /* cml0 */
  2740. clk = clk_register_gate(NULL, "cml0", "pll_e", 0, clk_base + PLLE_AUX,
  2741. 0, 0, &pll_e_lock);
  2742. clk_register_clkdev(clk, "cml0", NULL);
  2743. clks[TEGRA210_CLK_CML0] = clk;
  2744. /* cml1 */
  2745. clk = clk_register_gate(NULL, "cml1", "pll_e", 0, clk_base + PLLE_AUX,
  2746. 1, 0, &pll_e_lock);
  2747. clk_register_clkdev(clk, "cml1", NULL);
  2748. clks[TEGRA210_CLK_CML1] = clk;
  2749. clk = tegra_clk_register_super_clk("aclk", aclk_parents,
  2750. ARRAY_SIZE(aclk_parents), 0, clk_base + 0x6e0,
  2751. 0, NULL);
  2752. clks[TEGRA210_CLK_ACLK] = clk;
  2753. clk = tegra_clk_register_sdmmc_mux_div("sdmmc2", clk_base,
  2754. CLK_SOURCE_SDMMC2, 9,
  2755. TEGRA_DIVIDER_ROUND_UP, 0, NULL);
  2756. clks[TEGRA210_CLK_SDMMC2] = clk;
  2757. clk = tegra_clk_register_sdmmc_mux_div("sdmmc4", clk_base,
  2758. CLK_SOURCE_SDMMC4, 15,
  2759. TEGRA_DIVIDER_ROUND_UP, 0, NULL);
  2760. clks[TEGRA210_CLK_SDMMC4] = clk;
  2761. for (i = 0; i < ARRAY_SIZE(tegra210_periph); i++) {
  2762. struct tegra_periph_init_data *init = &tegra210_periph[i];
  2763. struct clk **clkp;
  2764. clkp = tegra_lookup_dt_id(init->clk_id, tegra210_clks);
  2765. if (!clkp) {
  2766. pr_warn("clock %u not found\n", init->clk_id);
  2767. continue;
  2768. }
  2769. clk = tegra_clk_register_periph_data(clk_base, init);
  2770. *clkp = clk;
  2771. }
  2772. tegra_periph_clk_init(clk_base, pmc_base, tegra210_clks, &pll_p_params);
  2773. /* emc */
  2774. clk = tegra210_clk_register_emc(np, clk_base);
  2775. clks[TEGRA210_CLK_EMC] = clk;
  2776. /* mc */
  2777. tegra210_clk_register_mc("mc", "emc");
  2778. }
  2779. static void __init tegra210_pll_init(void __iomem *clk_base,
  2780. void __iomem *pmc)
  2781. {
  2782. struct clk *clk;
  2783. /* PLLC */
  2784. clk = tegra_clk_register_pllc_tegra210("pll_c", "pll_ref", clk_base,
  2785. pmc, 0, &pll_c_params, NULL);
  2786. if (!WARN_ON(IS_ERR(clk)))
  2787. clk_register_clkdev(clk, "pll_c", NULL);
  2788. clks[TEGRA210_CLK_PLL_C] = clk;
  2789. /* PLLC_OUT1 */
  2790. clk = tegra_clk_register_divider("pll_c_out1_div", "pll_c",
  2791. clk_base + PLLC_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
  2792. 8, 8, 1, NULL);
  2793. clk = tegra_clk_register_pll_out("pll_c_out1", "pll_c_out1_div",
  2794. clk_base + PLLC_OUT, 1, 0,
  2795. CLK_SET_RATE_PARENT, 0, NULL);
  2796. clk_register_clkdev(clk, "pll_c_out1", NULL);
  2797. clks[TEGRA210_CLK_PLL_C_OUT1] = clk;
  2798. /* PLLC_UD */
  2799. clk = clk_register_fixed_factor(NULL, "pll_c_ud", "pll_c",
  2800. CLK_SET_RATE_PARENT, 1, 1);
  2801. clk_register_clkdev(clk, "pll_c_ud", NULL);
  2802. clks[TEGRA210_CLK_PLL_C_UD] = clk;
  2803. /* PLLC2 */
  2804. clk = tegra_clk_register_pllc_tegra210("pll_c2", "pll_ref", clk_base,
  2805. pmc, 0, &pll_c2_params, NULL);
  2806. clk_register_clkdev(clk, "pll_c2", NULL);
  2807. clks[TEGRA210_CLK_PLL_C2] = clk;
  2808. /* PLLC3 */
  2809. clk = tegra_clk_register_pllc_tegra210("pll_c3", "pll_ref", clk_base,
  2810. pmc, 0, &pll_c3_params, NULL);
  2811. clk_register_clkdev(clk, "pll_c3", NULL);
  2812. clks[TEGRA210_CLK_PLL_C3] = clk;
  2813. /* PLLM */
  2814. clk = tegra_clk_register_pllm("pll_m", "osc", clk_base, pmc,
  2815. CLK_SET_RATE_GATE, &pll_m_params, NULL);
  2816. clk_register_clkdev(clk, "pll_m", NULL);
  2817. clks[TEGRA210_CLK_PLL_M] = clk;
  2818. /* PLLMB */
  2819. clk = tegra_clk_register_pllmb("pll_mb", "osc", clk_base, pmc,
  2820. CLK_SET_RATE_GATE, &pll_mb_params, NULL);
  2821. clk_register_clkdev(clk, "pll_mb", NULL);
  2822. clks[TEGRA210_CLK_PLL_MB] = clk;
  2823. /* PLLM_UD */
  2824. clk = clk_register_fixed_factor(NULL, "pll_m_ud", "pll_m",
  2825. CLK_SET_RATE_PARENT, 1, 1);
  2826. clk_register_clkdev(clk, "pll_m_ud", NULL);
  2827. clks[TEGRA210_CLK_PLL_M_UD] = clk;
  2828. /* PLLMB_UD */
  2829. clk = clk_register_fixed_factor(NULL, "pll_mb_ud", "pll_mb",
  2830. CLK_SET_RATE_PARENT, 1, 1);
  2831. clk_register_clkdev(clk, "pll_mb_ud", NULL);
  2832. clks[TEGRA210_CLK_PLL_MB_UD] = clk;
  2833. /* PLLP_UD */
  2834. clk = clk_register_fixed_factor(NULL, "pll_p_ud", "pll_p",
  2835. 0, 1, 1);
  2836. clks[TEGRA210_CLK_PLL_P_UD] = clk;
  2837. /* PLLU_VCO */
  2838. if (!tegra210_init_pllu()) {
  2839. clk = clk_register_fixed_rate(NULL, "pll_u_vco", "pll_ref", 0,
  2840. 480*1000*1000);
  2841. clk_register_clkdev(clk, "pll_u_vco", NULL);
  2842. clks[TEGRA210_CLK_PLL_U] = clk;
  2843. }
  2844. /* PLLU_OUT */
  2845. clk = clk_register_divider_table(NULL, "pll_u_out", "pll_u_vco", 0,
  2846. clk_base + PLLU_BASE, 16, 4, 0,
  2847. pll_vco_post_div_table, NULL);
  2848. clk_register_clkdev(clk, "pll_u_out", NULL);
  2849. clks[TEGRA210_CLK_PLL_U_OUT] = clk;
  2850. /* PLLU_OUT1 */
  2851. clk = tegra_clk_register_divider("pll_u_out1_div", "pll_u_out",
  2852. clk_base + PLLU_OUTA, 0,
  2853. TEGRA_DIVIDER_ROUND_UP,
  2854. 8, 8, 1, &pll_u_lock);
  2855. clk = tegra_clk_register_pll_out("pll_u_out1", "pll_u_out1_div",
  2856. clk_base + PLLU_OUTA, 1, 0,
  2857. CLK_SET_RATE_PARENT, 0, &pll_u_lock);
  2858. clk_register_clkdev(clk, "pll_u_out1", NULL);
  2859. clks[TEGRA210_CLK_PLL_U_OUT1] = clk;
  2860. /* PLLU_OUT2 */
  2861. clk = tegra_clk_register_divider("pll_u_out2_div", "pll_u_out",
  2862. clk_base + PLLU_OUTA, 0,
  2863. TEGRA_DIVIDER_ROUND_UP,
  2864. 24, 8, 1, &pll_u_lock);
  2865. clk = tegra_clk_register_pll_out("pll_u_out2", "pll_u_out2_div",
  2866. clk_base + PLLU_OUTA, 17, 16,
  2867. CLK_SET_RATE_PARENT, 0, &pll_u_lock);
  2868. clk_register_clkdev(clk, "pll_u_out2", NULL);
  2869. clks[TEGRA210_CLK_PLL_U_OUT2] = clk;
  2870. /* PLLU_480M */
  2871. clk = clk_register_gate(NULL, "pll_u_480M", "pll_u_vco",
  2872. CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
  2873. 22, 0, &pll_u_lock);
  2874. clk_register_clkdev(clk, "pll_u_480M", NULL);
  2875. clks[TEGRA210_CLK_PLL_U_480M] = clk;
  2876. /* PLLU_60M */
  2877. clk = clk_register_gate(NULL, "pll_u_60M", "pll_u_out2",
  2878. CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
  2879. 23, 0, &pll_u_lock);
  2880. clk_register_clkdev(clk, "pll_u_60M", NULL);
  2881. clks[TEGRA210_CLK_PLL_U_60M] = clk;
  2882. /* PLLU_48M */
  2883. clk = clk_register_gate(NULL, "pll_u_48M", "pll_u_out1",
  2884. CLK_SET_RATE_PARENT, clk_base + PLLU_BASE,
  2885. 25, 0, &pll_u_lock);
  2886. clk_register_clkdev(clk, "pll_u_48M", NULL);
  2887. clks[TEGRA210_CLK_PLL_U_48M] = clk;
  2888. /* PLLD */
  2889. clk = tegra_clk_register_pll("pll_d", "pll_ref", clk_base, pmc, 0,
  2890. &pll_d_params, &pll_d_lock);
  2891. clk_register_clkdev(clk, "pll_d", NULL);
  2892. clks[TEGRA210_CLK_PLL_D] = clk;
  2893. /* PLLD_OUT0 */
  2894. clk = clk_register_fixed_factor(NULL, "pll_d_out0", "pll_d",
  2895. CLK_SET_RATE_PARENT, 1, 2);
  2896. clk_register_clkdev(clk, "pll_d_out0", NULL);
  2897. clks[TEGRA210_CLK_PLL_D_OUT0] = clk;
  2898. /* PLLRE */
  2899. clk = tegra_clk_register_pllre_tegra210("pll_re_vco", "pll_ref",
  2900. clk_base, pmc, 0,
  2901. &pll_re_vco_params,
  2902. &pll_re_lock, pll_ref_freq);
  2903. clk_register_clkdev(clk, "pll_re_vco", NULL);
  2904. clks[TEGRA210_CLK_PLL_RE_VCO] = clk;
  2905. clk = clk_register_divider_table(NULL, "pll_re_out", "pll_re_vco", 0,
  2906. clk_base + PLLRE_BASE, 16, 5, 0,
  2907. pll_vco_post_div_table, &pll_re_lock);
  2908. clk_register_clkdev(clk, "pll_re_out", NULL);
  2909. clks[TEGRA210_CLK_PLL_RE_OUT] = clk;
  2910. clk = tegra_clk_register_divider("pll_re_out1_div", "pll_re_vco",
  2911. clk_base + PLLRE_OUT1, 0,
  2912. TEGRA_DIVIDER_ROUND_UP,
  2913. 8, 8, 1, NULL);
  2914. clk = tegra_clk_register_pll_out("pll_re_out1", "pll_re_out1_div",
  2915. clk_base + PLLRE_OUT1, 1, 0,
  2916. CLK_SET_RATE_PARENT, 0, NULL);
  2917. clks[TEGRA210_CLK_PLL_RE_OUT1] = clk;
  2918. /* PLLE */
  2919. clk = tegra_clk_register_plle_tegra210("pll_e", "pll_ref",
  2920. clk_base, 0, &pll_e_params, NULL);
  2921. clk_register_clkdev(clk, "pll_e", NULL);
  2922. clks[TEGRA210_CLK_PLL_E] = clk;
  2923. /* PLLC4 */
  2924. clk = tegra_clk_register_pllre("pll_c4_vco", "pll_ref", clk_base, pmc,
  2925. 0, &pll_c4_vco_params, NULL, pll_ref_freq);
  2926. clk_register_clkdev(clk, "pll_c4_vco", NULL);
  2927. clks[TEGRA210_CLK_PLL_C4] = clk;
  2928. /* PLLC4_OUT0 */
  2929. clk = clk_register_divider_table(NULL, "pll_c4_out0", "pll_c4_vco", 0,
  2930. clk_base + PLLC4_BASE, 19, 4, 0,
  2931. pll_vco_post_div_table, NULL);
  2932. clk_register_clkdev(clk, "pll_c4_out0", NULL);
  2933. clks[TEGRA210_CLK_PLL_C4_OUT0] = clk;
  2934. /* PLLC4_OUT1 */
  2935. clk = clk_register_fixed_factor(NULL, "pll_c4_out1", "pll_c4_vco",
  2936. CLK_SET_RATE_PARENT, 1, 3);
  2937. clk_register_clkdev(clk, "pll_c4_out1", NULL);
  2938. clks[TEGRA210_CLK_PLL_C4_OUT1] = clk;
  2939. /* PLLC4_OUT2 */
  2940. clk = clk_register_fixed_factor(NULL, "pll_c4_out2", "pll_c4_vco",
  2941. CLK_SET_RATE_PARENT, 1, 5);
  2942. clk_register_clkdev(clk, "pll_c4_out2", NULL);
  2943. clks[TEGRA210_CLK_PLL_C4_OUT2] = clk;
  2944. /* PLLC4_OUT3 */
  2945. clk = tegra_clk_register_divider("pll_c4_out3_div", "pll_c4_out0",
  2946. clk_base + PLLC4_OUT, 0, TEGRA_DIVIDER_ROUND_UP,
  2947. 8, 8, 1, NULL);
  2948. clk = tegra_clk_register_pll_out("pll_c4_out3", "pll_c4_out3_div",
  2949. clk_base + PLLC4_OUT, 1, 0,
  2950. CLK_SET_RATE_PARENT, 0, NULL);
  2951. clk_register_clkdev(clk, "pll_c4_out3", NULL);
  2952. clks[TEGRA210_CLK_PLL_C4_OUT3] = clk;
  2953. /* PLLDP */
  2954. clk = tegra_clk_register_pllss_tegra210("pll_dp", "pll_ref", clk_base,
  2955. 0, &pll_dp_params, NULL);
  2956. clk_register_clkdev(clk, "pll_dp", NULL);
  2957. clks[TEGRA210_CLK_PLL_DP] = clk;
  2958. /* PLLD2 */
  2959. clk = tegra_clk_register_pllss_tegra210("pll_d2", "pll_ref", clk_base,
  2960. 0, &pll_d2_params, NULL);
  2961. clk_register_clkdev(clk, "pll_d2", NULL);
  2962. clks[TEGRA210_CLK_PLL_D2] = clk;
  2963. /* PLLD2_OUT0 */
  2964. clk = clk_register_fixed_factor(NULL, "pll_d2_out0", "pll_d2",
  2965. CLK_SET_RATE_PARENT, 1, 1);
  2966. clk_register_clkdev(clk, "pll_d2_out0", NULL);
  2967. clks[TEGRA210_CLK_PLL_D2_OUT0] = clk;
  2968. /* PLLP_OUT2 */
  2969. clk = clk_register_fixed_factor(NULL, "pll_p_out2", "pll_p",
  2970. CLK_SET_RATE_PARENT, 1, 2);
  2971. clk_register_clkdev(clk, "pll_p_out2", NULL);
  2972. clks[TEGRA210_CLK_PLL_P_OUT2] = clk;
  2973. }
  2974. /* Tegra210 CPU clock and reset control functions */
  2975. static void tegra210_wait_cpu_in_reset(u32 cpu)
  2976. {
  2977. unsigned int reg;
  2978. do {
  2979. reg = readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
  2980. cpu_relax();
  2981. } while (!(reg & (1 << cpu))); /* check CPU been reset or not */
  2982. }
  2983. static void tegra210_disable_cpu_clock(u32 cpu)
  2984. {
  2985. /* flow controller would take care in the power sequence. */
  2986. }
  2987. #ifdef CONFIG_PM_SLEEP
  2988. #define car_readl(_base, _off) readl_relaxed(clk_base + (_base) + ((_off) * 4))
  2989. #define car_writel(_val, _base, _off) \
  2990. writel_relaxed(_val, clk_base + (_base) + ((_off) * 4))
  2991. static u32 spare_reg_ctx, misc_clk_enb_ctx, clk_msk_arm_ctx;
  2992. static u32 cpu_softrst_ctx[3];
  2993. static int tegra210_clk_suspend(void)
  2994. {
  2995. unsigned int i;
  2996. clk_save_context();
  2997. /*
  2998. * Save the bootloader configured clock registers SPARE_REG0,
  2999. * MISC_CLK_ENB, CLK_MASK_ARM, CPU_SOFTRST_CTRL.
  3000. */
  3001. spare_reg_ctx = readl_relaxed(clk_base + SPARE_REG0);
  3002. misc_clk_enb_ctx = readl_relaxed(clk_base + MISC_CLK_ENB);
  3003. clk_msk_arm_ctx = readl_relaxed(clk_base + CLK_MASK_ARM);
  3004. for (i = 0; i < ARRAY_SIZE(cpu_softrst_ctx); i++)
  3005. cpu_softrst_ctx[i] = car_readl(CPU_SOFTRST_CTRL, i);
  3006. tegra_clk_periph_suspend();
  3007. return 0;
  3008. }
  3009. static void tegra210_clk_resume(void)
  3010. {
  3011. unsigned int i;
  3012. tegra_clk_osc_resume(clk_base);
  3013. /*
  3014. * Restore the bootloader configured clock registers SPARE_REG0,
  3015. * MISC_CLK_ENB, CLK_MASK_ARM, CPU_SOFTRST_CTRL from saved context.
  3016. */
  3017. writel_relaxed(spare_reg_ctx, clk_base + SPARE_REG0);
  3018. writel_relaxed(misc_clk_enb_ctx, clk_base + MISC_CLK_ENB);
  3019. writel_relaxed(clk_msk_arm_ctx, clk_base + CLK_MASK_ARM);
  3020. for (i = 0; i < ARRAY_SIZE(cpu_softrst_ctx); i++)
  3021. car_writel(cpu_softrst_ctx[i], CPU_SOFTRST_CTRL, i);
  3022. /*
  3023. * Tegra clock programming sequence recommends peripheral clock to
  3024. * be enabled prior to changing its clock source and divider to
  3025. * prevent glitchless frequency switch.
  3026. * So, enable all peripheral clocks before restoring their source
  3027. * and dividers.
  3028. */
  3029. writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_L, clk_base + CLK_OUT_ENB_L);
  3030. writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_H, clk_base + CLK_OUT_ENB_H);
  3031. writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_U, clk_base + CLK_OUT_ENB_U);
  3032. writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_V, clk_base + CLK_OUT_ENB_V);
  3033. writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_W, clk_base + CLK_OUT_ENB_W);
  3034. writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_X, clk_base + CLK_OUT_ENB_X);
  3035. writel_relaxed(TEGRA210_CLK_ENB_VLD_MSK_Y, clk_base + CLK_OUT_ENB_Y);
  3036. /* wait for all writes to happen to have all the clocks enabled */
  3037. fence_udelay(2, clk_base);
  3038. /* restore PLLs and all peripheral clock rates */
  3039. tegra210_init_pllu();
  3040. clk_restore_context();
  3041. /* restore saved context of peripheral clocks and reset state */
  3042. tegra_clk_periph_resume();
  3043. }
  3044. static void tegra210_cpu_clock_suspend(void)
  3045. {
  3046. /* switch coresite to clk_m, save off original source */
  3047. tegra210_cpu_clk_sctx.clk_csite_src =
  3048. readl(clk_base + CLK_SOURCE_CSITE);
  3049. writel(3 << 30, clk_base + CLK_SOURCE_CSITE);
  3050. }
  3051. static void tegra210_cpu_clock_resume(void)
  3052. {
  3053. writel(tegra210_cpu_clk_sctx.clk_csite_src,
  3054. clk_base + CLK_SOURCE_CSITE);
  3055. }
  3056. #endif
  3057. static struct syscore_ops tegra_clk_syscore_ops = {
  3058. #ifdef CONFIG_PM_SLEEP
  3059. .suspend = tegra210_clk_suspend,
  3060. .resume = tegra210_clk_resume,
  3061. #endif
  3062. };
  3063. static struct tegra_cpu_car_ops tegra210_cpu_car_ops = {
  3064. .wait_for_reset = tegra210_wait_cpu_in_reset,
  3065. .disable_clock = tegra210_disable_cpu_clock,
  3066. #ifdef CONFIG_PM_SLEEP
  3067. .suspend = tegra210_cpu_clock_suspend,
  3068. .resume = tegra210_cpu_clock_resume,
  3069. #endif
  3070. };
  3071. static const struct of_device_id pmc_match[] __initconst = {
  3072. { .compatible = "nvidia,tegra210-pmc" },
  3073. { },
  3074. };
  3075. static struct tegra_clk_init_table init_table[] __initdata = {
  3076. { TEGRA210_CLK_UARTA, TEGRA210_CLK_PLL_P, 408000000, 0 },
  3077. { TEGRA210_CLK_UARTB, TEGRA210_CLK_PLL_P, 408000000, 0 },
  3078. { TEGRA210_CLK_UARTC, TEGRA210_CLK_PLL_P, 408000000, 0 },
  3079. { TEGRA210_CLK_UARTD, TEGRA210_CLK_PLL_P, 408000000, 0 },
  3080. { TEGRA210_CLK_PLL_A, TEGRA210_CLK_CLK_MAX, 564480000, 0 },
  3081. { TEGRA210_CLK_PLL_A_OUT0, TEGRA210_CLK_CLK_MAX, 11289600, 0 },
  3082. { TEGRA210_CLK_I2S0, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  3083. { TEGRA210_CLK_I2S1, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  3084. { TEGRA210_CLK_I2S2, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  3085. { TEGRA210_CLK_I2S3, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  3086. { TEGRA210_CLK_I2S4, TEGRA210_CLK_PLL_A_OUT0, 11289600, 0 },
  3087. { TEGRA210_CLK_HOST1X, TEGRA210_CLK_PLL_P, 136000000, 1 },
  3088. { TEGRA210_CLK_SCLK_MUX, TEGRA210_CLK_PLL_P, 0, 1 },
  3089. { TEGRA210_CLK_SCLK, TEGRA210_CLK_CLK_MAX, 102000000, 0 },
  3090. { TEGRA210_CLK_DFLL_SOC, TEGRA210_CLK_PLL_P, 51000000, 1 },
  3091. { TEGRA210_CLK_DFLL_REF, TEGRA210_CLK_PLL_P, 51000000, 1 },
  3092. { TEGRA210_CLK_SBC4, TEGRA210_CLK_PLL_P, 12000000, 1 },
  3093. { TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 },
  3094. { TEGRA210_CLK_XUSB_GATE, TEGRA210_CLK_CLK_MAX, 0, 1 },
  3095. { TEGRA210_CLK_XUSB_SS_SRC, TEGRA210_CLK_PLL_U_480M, 120000000, 0 },
  3096. { TEGRA210_CLK_XUSB_FS_SRC, TEGRA210_CLK_PLL_U_48M, 48000000, 0 },
  3097. { TEGRA210_CLK_XUSB_HS_SRC, TEGRA210_CLK_XUSB_SS_SRC, 120000000, 0 },
  3098. { TEGRA210_CLK_XUSB_SSP_SRC, TEGRA210_CLK_XUSB_SS_SRC, 120000000, 0 },
  3099. { TEGRA210_CLK_XUSB_FALCON_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 204000000, 0 },
  3100. { TEGRA210_CLK_XUSB_HOST_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 102000000, 0 },
  3101. { TEGRA210_CLK_XUSB_DEV_SRC, TEGRA210_CLK_PLL_P_OUT_XUSB, 102000000, 0 },
  3102. { TEGRA210_CLK_SATA, TEGRA210_CLK_PLL_P, 104000000, 0 },
  3103. { TEGRA210_CLK_SATA_OOB, TEGRA210_CLK_PLL_P, 204000000, 0 },
  3104. { TEGRA210_CLK_MSELECT, TEGRA210_CLK_CLK_MAX, 0, 1 },
  3105. { TEGRA210_CLK_CSITE, TEGRA210_CLK_CLK_MAX, 0, 1 },
  3106. /* TODO find a way to enable this on-demand */
  3107. { TEGRA210_CLK_DBGAPB, TEGRA210_CLK_CLK_MAX, 0, 1 },
  3108. { TEGRA210_CLK_TSENSOR, TEGRA210_CLK_CLK_M, 400000, 0 },
  3109. { TEGRA210_CLK_I2C1, TEGRA210_CLK_PLL_P, 0, 0 },
  3110. { TEGRA210_CLK_I2C2, TEGRA210_CLK_PLL_P, 0, 0 },
  3111. { TEGRA210_CLK_I2C3, TEGRA210_CLK_PLL_P, 0, 0 },
  3112. { TEGRA210_CLK_I2C4, TEGRA210_CLK_PLL_P, 0, 0 },
  3113. { TEGRA210_CLK_I2C5, TEGRA210_CLK_PLL_P, 0, 0 },
  3114. { TEGRA210_CLK_I2C6, TEGRA210_CLK_PLL_P, 0, 0 },
  3115. { TEGRA210_CLK_PLL_DP, TEGRA210_CLK_CLK_MAX, 270000000, 0 },
  3116. { TEGRA210_CLK_SOC_THERM, TEGRA210_CLK_PLL_P, 51000000, 0 },
  3117. { TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 },
  3118. { TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 },
  3119. { TEGRA210_CLK_SPDIF_IN_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
  3120. { TEGRA210_CLK_I2S0_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
  3121. { TEGRA210_CLK_I2S1_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
  3122. { TEGRA210_CLK_I2S2_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
  3123. { TEGRA210_CLK_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
  3124. { TEGRA210_CLK_I2S4_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
  3125. { TEGRA210_CLK_VIMCLK_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
  3126. { TEGRA210_CLK_HDA, TEGRA210_CLK_PLL_P, 51000000, 0 },
  3127. { TEGRA210_CLK_HDA2CODEC_2X, TEGRA210_CLK_PLL_P, 48000000, 0 },
  3128. { TEGRA210_CLK_PWM, TEGRA210_CLK_PLL_P, 48000000, 0 },
  3129. /* This MUST be the last entry. */
  3130. { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 },
  3131. };
  3132. /**
  3133. * tegra210_clock_apply_init_table - initialize clocks on Tegra210 SoCs
  3134. *
  3135. * Program an initial clock rate and enable or disable clocks needed
  3136. * by the rest of the kernel, for Tegra210 SoCs. It is intended to be
  3137. * called by assigning a pointer to it to tegra_clk_apply_init_table -
  3138. * this will be called as an arch_initcall. No return value.
  3139. */
  3140. static void __init tegra210_clock_apply_init_table(void)
  3141. {
  3142. tegra_init_from_table(init_table, clks, TEGRA210_CLK_CLK_MAX);
  3143. }
  3144. /**
  3145. * tegra210_car_barrier - wait for pending writes to the CAR to complete
  3146. *
  3147. * Wait for any outstanding writes to the CAR MMIO space from this CPU
  3148. * to complete before continuing execution. No return value.
  3149. */
  3150. static void tegra210_car_barrier(void)
  3151. {
  3152. readl_relaxed(clk_base + RST_DFLL_DVCO);
  3153. }
  3154. /**
  3155. * tegra210_clock_assert_dfll_dvco_reset - assert the DFLL's DVCO reset
  3156. *
  3157. * Assert the reset line of the DFLL's DVCO. No return value.
  3158. */
  3159. static void tegra210_clock_assert_dfll_dvco_reset(void)
  3160. {
  3161. u32 v;
  3162. v = readl_relaxed(clk_base + RST_DFLL_DVCO);
  3163. v |= (1 << DVFS_DFLL_RESET_SHIFT);
  3164. writel_relaxed(v, clk_base + RST_DFLL_DVCO);
  3165. tegra210_car_barrier();
  3166. }
  3167. /**
  3168. * tegra210_clock_deassert_dfll_dvco_reset - deassert the DFLL's DVCO reset
  3169. *
  3170. * Deassert the reset line of the DFLL's DVCO, allowing the DVCO to
  3171. * operate. No return value.
  3172. */
  3173. static void tegra210_clock_deassert_dfll_dvco_reset(void)
  3174. {
  3175. u32 v;
  3176. v = readl_relaxed(clk_base + RST_DFLL_DVCO);
  3177. v &= ~(1 << DVFS_DFLL_RESET_SHIFT);
  3178. writel_relaxed(v, clk_base + RST_DFLL_DVCO);
  3179. tegra210_car_barrier();
  3180. }
  3181. static int tegra210_reset_assert(unsigned long id)
  3182. {
  3183. if (id == TEGRA210_RST_DFLL_DVCO)
  3184. tegra210_clock_assert_dfll_dvco_reset();
  3185. else if (id == TEGRA210_RST_ADSP)
  3186. writel(GENMASK(26, 21) | BIT(7),
  3187. clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_SET);
  3188. else
  3189. return -EINVAL;
  3190. return 0;
  3191. }
  3192. static int tegra210_reset_deassert(unsigned long id)
  3193. {
  3194. if (id == TEGRA210_RST_DFLL_DVCO)
  3195. tegra210_clock_deassert_dfll_dvco_reset();
  3196. else if (id == TEGRA210_RST_ADSP) {
  3197. writel(BIT(21), clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_CLR);
  3198. /*
  3199. * Considering adsp cpu clock (min: 12.5MHZ, max: 1GHz)
  3200. * a delay of 5us ensures that it's at least
  3201. * 6 * adsp_cpu_cycle_period long.
  3202. */
  3203. udelay(5);
  3204. writel(GENMASK(26, 22) | BIT(7),
  3205. clk_base + CLK_RST_CONTROLLER_RST_DEV_Y_CLR);
  3206. } else
  3207. return -EINVAL;
  3208. return 0;
  3209. }
  3210. static void tegra210_mbist_clk_init(void)
  3211. {
  3212. unsigned int i, j;
  3213. for (i = 0; i < ARRAY_SIZE(tegra210_pg_mbist_war); i++) {
  3214. unsigned int num_clks = tegra210_pg_mbist_war[i].num_clks;
  3215. struct clk_bulk_data *clk_data;
  3216. if (!num_clks)
  3217. continue;
  3218. clk_data = kmalloc_array(num_clks, sizeof(*clk_data),
  3219. GFP_KERNEL);
  3220. if (WARN_ON(!clk_data))
  3221. return;
  3222. tegra210_pg_mbist_war[i].clks = clk_data;
  3223. for (j = 0; j < num_clks; j++) {
  3224. int clk_id = tegra210_pg_mbist_war[i].clk_init_data[j];
  3225. struct clk *clk = clks[clk_id];
  3226. if (WARN(IS_ERR(clk), "clk_id: %d\n", clk_id)) {
  3227. kfree(clk_data);
  3228. tegra210_pg_mbist_war[i].clks = NULL;
  3229. break;
  3230. }
  3231. clk_data[j].clk = clk;
  3232. }
  3233. }
  3234. }
  3235. /**
  3236. * tegra210_clock_init - Tegra210-specific clock initialization
  3237. * @np: struct device_node * of the DT node for the SoC CAR IP block
  3238. *
  3239. * Register most SoC clocks for the Tegra210 system-on-chip. Intended
  3240. * to be called by the OF init code when a DT node with the
  3241. * "nvidia,tegra210-car" string is encountered, and declared with
  3242. * CLK_OF_DECLARE. No return value.
  3243. */
  3244. static void __init tegra210_clock_init(struct device_node *np)
  3245. {
  3246. struct device_node *node;
  3247. u32 value, clk_m_div;
  3248. clk_base = of_iomap(np, 0);
  3249. if (!clk_base) {
  3250. pr_err("ioremap tegra210 CAR failed\n");
  3251. return;
  3252. }
  3253. node = of_find_matching_node(NULL, pmc_match);
  3254. if (!node) {
  3255. pr_err("Failed to find pmc node\n");
  3256. WARN_ON(1);
  3257. return;
  3258. }
  3259. pmc_base = of_iomap(node, 0);
  3260. of_node_put(node);
  3261. if (!pmc_base) {
  3262. pr_err("Can't map pmc registers\n");
  3263. WARN_ON(1);
  3264. return;
  3265. }
  3266. ahub_base = ioremap(TEGRA210_AHUB_BASE, SZ_64K);
  3267. if (!ahub_base) {
  3268. pr_err("ioremap tegra210 APE failed\n");
  3269. return;
  3270. }
  3271. dispa_base = ioremap(TEGRA210_DISPA_BASE, SZ_256K);
  3272. if (!dispa_base) {
  3273. pr_err("ioremap tegra210 DISPA failed\n");
  3274. return;
  3275. }
  3276. vic_base = ioremap(TEGRA210_VIC_BASE, SZ_256K);
  3277. if (!vic_base) {
  3278. pr_err("ioremap tegra210 VIC failed\n");
  3279. return;
  3280. }
  3281. clks = tegra_clk_init(clk_base, TEGRA210_CLK_CLK_MAX,
  3282. TEGRA210_CAR_BANK_COUNT);
  3283. if (!clks)
  3284. return;
  3285. value = readl(clk_base + SPARE_REG0) >> CLK_M_DIVISOR_SHIFT;
  3286. clk_m_div = (value & CLK_M_DIVISOR_MASK) + 1;
  3287. if (tegra_osc_clk_init(clk_base, tegra210_clks, tegra210_input_freq,
  3288. ARRAY_SIZE(tegra210_input_freq), clk_m_div,
  3289. &osc_freq, &pll_ref_freq) < 0)
  3290. return;
  3291. tegra_fixed_clk_init(tegra210_clks);
  3292. tegra210_pll_init(clk_base, pmc_base);
  3293. tegra210_periph_clk_init(np, clk_base, pmc_base);
  3294. tegra_audio_clk_init(clk_base, pmc_base, tegra210_clks,
  3295. tegra210_audio_plls,
  3296. ARRAY_SIZE(tegra210_audio_plls), 24576000);
  3297. /* For Tegra210, PLLD is the only source for DSIA & DSIB */
  3298. value = readl(clk_base + PLLD_BASE);
  3299. value &= ~BIT(25);
  3300. writel(value, clk_base + PLLD_BASE);
  3301. tegra_clk_apply_init_table = tegra210_clock_apply_init_table;
  3302. tegra_super_clk_gen5_init(clk_base, pmc_base, tegra210_clks,
  3303. &pll_x_params);
  3304. tegra_init_special_resets(2, tegra210_reset_assert,
  3305. tegra210_reset_deassert);
  3306. tegra_add_of_provider(np, of_clk_src_onecell_get);
  3307. tegra_register_devclks(devclks, ARRAY_SIZE(devclks));
  3308. tegra210_mbist_clk_init();
  3309. tegra_cpu_car_ops = &tegra210_cpu_car_ops;
  3310. register_syscore_ops(&tegra_clk_syscore_ops);
  3311. }
  3312. CLK_OF_DECLARE(tegra210, "nvidia,tegra210-car", tegra210_clock_init);