clk-exynos5433.c 217 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682
  1. /*
  2. * Copyright (c) 2014 Samsung Electronics Co., Ltd.
  3. * Author: Chanwoo Choi <cw00.choi@samsung.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Common Clock Framework support for Exynos5433 SoC.
  10. */
  11. #include <linux/clk.h>
  12. #include <linux/clk-provider.h>
  13. #include <linux/of.h>
  14. #include <linux/of_address.h>
  15. #include <linux/of_device.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/pm_runtime.h>
  18. #include <dt-bindings/clock/exynos5433.h>
  19. #include "clk.h"
  20. #include "clk-cpu.h"
  21. #include "clk-pll.h"
  22. /*
  23. * Register offset definitions for CMU_TOP
  24. */
  25. #define ISP_PLL_LOCK 0x0000
  26. #define AUD_PLL_LOCK 0x0004
  27. #define ISP_PLL_CON0 0x0100
  28. #define ISP_PLL_CON1 0x0104
  29. #define ISP_PLL_FREQ_DET 0x0108
  30. #define AUD_PLL_CON0 0x0110
  31. #define AUD_PLL_CON1 0x0114
  32. #define AUD_PLL_CON2 0x0118
  33. #define AUD_PLL_FREQ_DET 0x011c
  34. #define MUX_SEL_TOP0 0x0200
  35. #define MUX_SEL_TOP1 0x0204
  36. #define MUX_SEL_TOP2 0x0208
  37. #define MUX_SEL_TOP3 0x020c
  38. #define MUX_SEL_TOP4 0x0210
  39. #define MUX_SEL_TOP_MSCL 0x0220
  40. #define MUX_SEL_TOP_CAM1 0x0224
  41. #define MUX_SEL_TOP_DISP 0x0228
  42. #define MUX_SEL_TOP_FSYS0 0x0230
  43. #define MUX_SEL_TOP_FSYS1 0x0234
  44. #define MUX_SEL_TOP_PERIC0 0x0238
  45. #define MUX_SEL_TOP_PERIC1 0x023c
  46. #define MUX_ENABLE_TOP0 0x0300
  47. #define MUX_ENABLE_TOP1 0x0304
  48. #define MUX_ENABLE_TOP2 0x0308
  49. #define MUX_ENABLE_TOP3 0x030c
  50. #define MUX_ENABLE_TOP4 0x0310
  51. #define MUX_ENABLE_TOP_MSCL 0x0320
  52. #define MUX_ENABLE_TOP_CAM1 0x0324
  53. #define MUX_ENABLE_TOP_DISP 0x0328
  54. #define MUX_ENABLE_TOP_FSYS0 0x0330
  55. #define MUX_ENABLE_TOP_FSYS1 0x0334
  56. #define MUX_ENABLE_TOP_PERIC0 0x0338
  57. #define MUX_ENABLE_TOP_PERIC1 0x033c
  58. #define MUX_STAT_TOP0 0x0400
  59. #define MUX_STAT_TOP1 0x0404
  60. #define MUX_STAT_TOP2 0x0408
  61. #define MUX_STAT_TOP3 0x040c
  62. #define MUX_STAT_TOP4 0x0410
  63. #define MUX_STAT_TOP_MSCL 0x0420
  64. #define MUX_STAT_TOP_CAM1 0x0424
  65. #define MUX_STAT_TOP_FSYS0 0x0430
  66. #define MUX_STAT_TOP_FSYS1 0x0434
  67. #define MUX_STAT_TOP_PERIC0 0x0438
  68. #define MUX_STAT_TOP_PERIC1 0x043c
  69. #define DIV_TOP0 0x0600
  70. #define DIV_TOP1 0x0604
  71. #define DIV_TOP2 0x0608
  72. #define DIV_TOP3 0x060c
  73. #define DIV_TOP4 0x0610
  74. #define DIV_TOP_MSCL 0x0618
  75. #define DIV_TOP_CAM10 0x061c
  76. #define DIV_TOP_CAM11 0x0620
  77. #define DIV_TOP_FSYS0 0x062c
  78. #define DIV_TOP_FSYS1 0x0630
  79. #define DIV_TOP_FSYS2 0x0634
  80. #define DIV_TOP_PERIC0 0x0638
  81. #define DIV_TOP_PERIC1 0x063c
  82. #define DIV_TOP_PERIC2 0x0640
  83. #define DIV_TOP_PERIC3 0x0644
  84. #define DIV_TOP_PERIC4 0x0648
  85. #define DIV_TOP_PLL_FREQ_DET 0x064c
  86. #define DIV_STAT_TOP0 0x0700
  87. #define DIV_STAT_TOP1 0x0704
  88. #define DIV_STAT_TOP2 0x0708
  89. #define DIV_STAT_TOP3 0x070c
  90. #define DIV_STAT_TOP4 0x0710
  91. #define DIV_STAT_TOP_MSCL 0x0718
  92. #define DIV_STAT_TOP_CAM10 0x071c
  93. #define DIV_STAT_TOP_CAM11 0x0720
  94. #define DIV_STAT_TOP_FSYS0 0x072c
  95. #define DIV_STAT_TOP_FSYS1 0x0730
  96. #define DIV_STAT_TOP_FSYS2 0x0734
  97. #define DIV_STAT_TOP_PERIC0 0x0738
  98. #define DIV_STAT_TOP_PERIC1 0x073c
  99. #define DIV_STAT_TOP_PERIC2 0x0740
  100. #define DIV_STAT_TOP_PERIC3 0x0744
  101. #define DIV_STAT_TOP_PLL_FREQ_DET 0x074c
  102. #define ENABLE_ACLK_TOP 0x0800
  103. #define ENABLE_SCLK_TOP 0x0a00
  104. #define ENABLE_SCLK_TOP_MSCL 0x0a04
  105. #define ENABLE_SCLK_TOP_CAM1 0x0a08
  106. #define ENABLE_SCLK_TOP_DISP 0x0a0c
  107. #define ENABLE_SCLK_TOP_FSYS 0x0a10
  108. #define ENABLE_SCLK_TOP_PERIC 0x0a14
  109. #define ENABLE_IP_TOP 0x0b00
  110. #define ENABLE_CMU_TOP 0x0c00
  111. #define ENABLE_CMU_TOP_DIV_STAT 0x0c04
  112. static const unsigned long top_clk_regs[] __initconst = {
  113. ISP_PLL_LOCK,
  114. AUD_PLL_LOCK,
  115. ISP_PLL_CON0,
  116. ISP_PLL_CON1,
  117. ISP_PLL_FREQ_DET,
  118. AUD_PLL_CON0,
  119. AUD_PLL_CON1,
  120. AUD_PLL_CON2,
  121. AUD_PLL_FREQ_DET,
  122. MUX_SEL_TOP0,
  123. MUX_SEL_TOP1,
  124. MUX_SEL_TOP2,
  125. MUX_SEL_TOP3,
  126. MUX_SEL_TOP4,
  127. MUX_SEL_TOP_MSCL,
  128. MUX_SEL_TOP_CAM1,
  129. MUX_SEL_TOP_DISP,
  130. MUX_SEL_TOP_FSYS0,
  131. MUX_SEL_TOP_FSYS1,
  132. MUX_SEL_TOP_PERIC0,
  133. MUX_SEL_TOP_PERIC1,
  134. MUX_ENABLE_TOP0,
  135. MUX_ENABLE_TOP1,
  136. MUX_ENABLE_TOP2,
  137. MUX_ENABLE_TOP3,
  138. MUX_ENABLE_TOP4,
  139. MUX_ENABLE_TOP_MSCL,
  140. MUX_ENABLE_TOP_CAM1,
  141. MUX_ENABLE_TOP_DISP,
  142. MUX_ENABLE_TOP_FSYS0,
  143. MUX_ENABLE_TOP_FSYS1,
  144. MUX_ENABLE_TOP_PERIC0,
  145. MUX_ENABLE_TOP_PERIC1,
  146. DIV_TOP0,
  147. DIV_TOP1,
  148. DIV_TOP2,
  149. DIV_TOP3,
  150. DIV_TOP4,
  151. DIV_TOP_MSCL,
  152. DIV_TOP_CAM10,
  153. DIV_TOP_CAM11,
  154. DIV_TOP_FSYS0,
  155. DIV_TOP_FSYS1,
  156. DIV_TOP_FSYS2,
  157. DIV_TOP_PERIC0,
  158. DIV_TOP_PERIC1,
  159. DIV_TOP_PERIC2,
  160. DIV_TOP_PERIC3,
  161. DIV_TOP_PERIC4,
  162. DIV_TOP_PLL_FREQ_DET,
  163. ENABLE_ACLK_TOP,
  164. ENABLE_SCLK_TOP,
  165. ENABLE_SCLK_TOP_MSCL,
  166. ENABLE_SCLK_TOP_CAM1,
  167. ENABLE_SCLK_TOP_DISP,
  168. ENABLE_SCLK_TOP_FSYS,
  169. ENABLE_SCLK_TOP_PERIC,
  170. ENABLE_IP_TOP,
  171. ENABLE_CMU_TOP,
  172. ENABLE_CMU_TOP_DIV_STAT,
  173. };
  174. static const struct samsung_clk_reg_dump top_suspend_regs[] = {
  175. /* force all aclk clocks enabled */
  176. { ENABLE_ACLK_TOP, 0x67ecffed },
  177. /* force all sclk_uart clocks enabled */
  178. { ENABLE_SCLK_TOP_PERIC, 0x38 },
  179. /* ISP PLL has to be enabled for suspend: reset value + ENABLE bit */
  180. { ISP_PLL_CON0, 0x85cc0502 },
  181. /* ISP PLL has to be enabled for suspend: reset value + ENABLE bit */
  182. { AUD_PLL_CON0, 0x84830202 },
  183. };
  184. /* list of all parent clock list */
  185. PNAME(mout_aud_pll_p) = { "oscclk", "fout_aud_pll", };
  186. PNAME(mout_isp_pll_p) = { "oscclk", "fout_isp_pll", };
  187. PNAME(mout_aud_pll_user_p) = { "oscclk", "mout_aud_pll", };
  188. PNAME(mout_mphy_pll_user_p) = { "oscclk", "sclk_mphy_pll", };
  189. PNAME(mout_mfc_pll_user_p) = { "oscclk", "sclk_mfc_pll", };
  190. PNAME(mout_bus_pll_user_p) = { "oscclk", "sclk_bus_pll", };
  191. PNAME(mout_bus_pll_user_t_p) = { "oscclk", "mout_bus_pll_user", };
  192. PNAME(mout_mphy_pll_user_t_p) = { "oscclk", "mout_mphy_pll_user", };
  193. PNAME(mout_bus_mfc_pll_user_p) = { "mout_bus_pll_user", "mout_mfc_pll_user",};
  194. PNAME(mout_mfc_bus_pll_user_p) = { "mout_mfc_pll_user", "mout_bus_pll_user",};
  195. PNAME(mout_aclk_cam1_552_b_p) = { "mout_aclk_cam1_552_a",
  196. "mout_mfc_pll_user", };
  197. PNAME(mout_aclk_cam1_552_a_p) = { "mout_isp_pll", "mout_bus_pll_user", };
  198. PNAME(mout_aclk_mfc_400_c_p) = { "mout_aclk_mfc_400_b",
  199. "mout_mphy_pll_user", };
  200. PNAME(mout_aclk_mfc_400_b_p) = { "mout_aclk_mfc_400_a",
  201. "mout_bus_pll_user", };
  202. PNAME(mout_aclk_mfc_400_a_p) = { "mout_mfc_pll_user", "mout_isp_pll", };
  203. PNAME(mout_bus_mphy_pll_user_p) = { "mout_bus_pll_user",
  204. "mout_mphy_pll_user", };
  205. PNAME(mout_aclk_mscl_b_p) = { "mout_aclk_mscl_400_a",
  206. "mout_mphy_pll_user", };
  207. PNAME(mout_aclk_g2d_400_b_p) = { "mout_aclk_g2d_400_a",
  208. "mout_mphy_pll_user", };
  209. PNAME(mout_sclk_jpeg_c_p) = { "mout_sclk_jpeg_b", "mout_mphy_pll_user",};
  210. PNAME(mout_sclk_jpeg_b_p) = { "mout_sclk_jpeg_a", "mout_mfc_pll_user", };
  211. PNAME(mout_sclk_mmc2_b_p) = { "mout_sclk_mmc2_a", "mout_mfc_pll_user",};
  212. PNAME(mout_sclk_mmc1_b_p) = { "mout_sclk_mmc1_a", "mout_mfc_pll_user",};
  213. PNAME(mout_sclk_mmc0_d_p) = { "mout_sclk_mmc0_c", "mout_isp_pll", };
  214. PNAME(mout_sclk_mmc0_c_p) = { "mout_sclk_mmc0_b", "mout_mphy_pll_user",};
  215. PNAME(mout_sclk_mmc0_b_p) = { "mout_sclk_mmc0_a", "mout_mfc_pll_user", };
  216. PNAME(mout_sclk_spdif_p) = { "sclk_audio0", "sclk_audio1",
  217. "oscclk", "ioclk_spdif_extclk", };
  218. PNAME(mout_sclk_audio1_p) = { "ioclk_audiocdclk1", "oscclk",
  219. "mout_aud_pll_user_t",};
  220. PNAME(mout_sclk_audio0_p) = { "ioclk_audiocdclk0", "oscclk",
  221. "mout_aud_pll_user_t",};
  222. PNAME(mout_sclk_hdmi_spdif_p) = { "sclk_audio1", "ioclk_spdif_extclk", };
  223. static const struct samsung_fixed_factor_clock top_fixed_factor_clks[] __initconst = {
  224. FFACTOR(0, "oscclk_efuse_common", "oscclk", 1, 1, 0),
  225. };
  226. static const struct samsung_fixed_rate_clock top_fixed_clks[] __initconst = {
  227. /* Xi2s{0|1}CDCLK input clock for I2S/PCM */
  228. FRATE(0, "ioclk_audiocdclk1", NULL, 0, 100000000),
  229. FRATE(0, "ioclk_audiocdclk0", NULL, 0, 100000000),
  230. /* Xi2s1SDI input clock for SPDIF */
  231. FRATE(0, "ioclk_spdif_extclk", NULL, 0, 100000000),
  232. /* XspiCLK[4:0] input clock for SPI */
  233. FRATE(0, "ioclk_spi4_clk_in", NULL, 0, 50000000),
  234. FRATE(0, "ioclk_spi3_clk_in", NULL, 0, 50000000),
  235. FRATE(0, "ioclk_spi2_clk_in", NULL, 0, 50000000),
  236. FRATE(0, "ioclk_spi1_clk_in", NULL, 0, 50000000),
  237. FRATE(0, "ioclk_spi0_clk_in", NULL, 0, 50000000),
  238. /* Xi2s1SCLK input clock for I2S1_BCLK */
  239. FRATE(0, "ioclk_i2s1_bclk_in", NULL, 0, 12288000),
  240. };
  241. static const struct samsung_mux_clock top_mux_clks[] __initconst = {
  242. /* MUX_SEL_TOP0 */
  243. MUX(CLK_MOUT_AUD_PLL, "mout_aud_pll", mout_aud_pll_p, MUX_SEL_TOP0,
  244. 4, 1),
  245. MUX(CLK_MOUT_ISP_PLL, "mout_isp_pll", mout_isp_pll_p, MUX_SEL_TOP0,
  246. 0, 1),
  247. /* MUX_SEL_TOP1 */
  248. MUX(CLK_MOUT_AUD_PLL_USER_T, "mout_aud_pll_user_t",
  249. mout_aud_pll_user_p, MUX_SEL_TOP1, 12, 1),
  250. MUX(CLK_MOUT_MPHY_PLL_USER, "mout_mphy_pll_user", mout_mphy_pll_user_p,
  251. MUX_SEL_TOP1, 8, 1),
  252. MUX(CLK_MOUT_MFC_PLL_USER, "mout_mfc_pll_user", mout_mfc_pll_user_p,
  253. MUX_SEL_TOP1, 4, 1),
  254. MUX(CLK_MOUT_BUS_PLL_USER, "mout_bus_pll_user", mout_bus_pll_user_p,
  255. MUX_SEL_TOP1, 0, 1),
  256. /* MUX_SEL_TOP2 */
  257. MUX(CLK_MOUT_ACLK_HEVC_400, "mout_aclk_hevc_400",
  258. mout_bus_mfc_pll_user_p, MUX_SEL_TOP2, 28, 1),
  259. MUX(CLK_MOUT_ACLK_CAM1_333, "mout_aclk_cam1_333",
  260. mout_mfc_bus_pll_user_p, MUX_SEL_TOP2, 16, 1),
  261. MUX(CLK_MOUT_ACLK_CAM1_552_B, "mout_aclk_cam1_552_b",
  262. mout_aclk_cam1_552_b_p, MUX_SEL_TOP2, 12, 1),
  263. MUX(CLK_MOUT_ACLK_CAM1_552_A, "mout_aclk_cam1_552_a",
  264. mout_aclk_cam1_552_a_p, MUX_SEL_TOP2, 8, 1),
  265. MUX(CLK_MOUT_ACLK_ISP_DIS_400, "mout_aclk_isp_dis_400",
  266. mout_bus_mfc_pll_user_p, MUX_SEL_TOP2, 4, 1),
  267. MUX(CLK_MOUT_ACLK_ISP_400, "mout_aclk_isp_400",
  268. mout_bus_mfc_pll_user_p, MUX_SEL_TOP2, 0, 1),
  269. /* MUX_SEL_TOP3 */
  270. MUX(CLK_MOUT_ACLK_BUS0_400, "mout_aclk_bus0_400",
  271. mout_bus_mphy_pll_user_p, MUX_SEL_TOP3, 20, 1),
  272. MUX(CLK_MOUT_ACLK_MSCL_400_B, "mout_aclk_mscl_400_b",
  273. mout_aclk_mscl_b_p, MUX_SEL_TOP3, 16, 1),
  274. MUX(CLK_MOUT_ACLK_MSCL_400_A, "mout_aclk_mscl_400_a",
  275. mout_bus_mfc_pll_user_p, MUX_SEL_TOP3, 12, 1),
  276. MUX(CLK_MOUT_ACLK_GSCL_333, "mout_aclk_gscl_333",
  277. mout_mfc_bus_pll_user_p, MUX_SEL_TOP3, 8, 1),
  278. MUX(CLK_MOUT_ACLK_G2D_400_B, "mout_aclk_g2d_400_b",
  279. mout_aclk_g2d_400_b_p, MUX_SEL_TOP3, 4, 1),
  280. MUX(CLK_MOUT_ACLK_G2D_400_A, "mout_aclk_g2d_400_a",
  281. mout_bus_mfc_pll_user_p, MUX_SEL_TOP3, 0, 1),
  282. /* MUX_SEL_TOP4 */
  283. MUX(CLK_MOUT_ACLK_MFC_400_C, "mout_aclk_mfc_400_c",
  284. mout_aclk_mfc_400_c_p, MUX_SEL_TOP4, 8, 1),
  285. MUX(CLK_MOUT_ACLK_MFC_400_B, "mout_aclk_mfc_400_b",
  286. mout_aclk_mfc_400_b_p, MUX_SEL_TOP4, 4, 1),
  287. MUX(CLK_MOUT_ACLK_MFC_400_A, "mout_aclk_mfc_400_a",
  288. mout_aclk_mfc_400_a_p, MUX_SEL_TOP4, 0, 1),
  289. /* MUX_SEL_TOP_MSCL */
  290. MUX(CLK_MOUT_SCLK_JPEG_C, "mout_sclk_jpeg_c", mout_sclk_jpeg_c_p,
  291. MUX_SEL_TOP_MSCL, 8, 1),
  292. MUX(CLK_MOUT_SCLK_JPEG_B, "mout_sclk_jpeg_b", mout_sclk_jpeg_b_p,
  293. MUX_SEL_TOP_MSCL, 4, 1),
  294. MUX(CLK_MOUT_SCLK_JPEG_A, "mout_sclk_jpeg_a", mout_bus_pll_user_t_p,
  295. MUX_SEL_TOP_MSCL, 0, 1),
  296. /* MUX_SEL_TOP_CAM1 */
  297. MUX(CLK_MOUT_SCLK_ISP_SENSOR2, "mout_sclk_isp_sensor2",
  298. mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 24, 1),
  299. MUX(CLK_MOUT_SCLK_ISP_SENSOR1, "mout_sclk_isp_sensor1",
  300. mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 20, 1),
  301. MUX(CLK_MOUT_SCLK_ISP_SENSOR0, "mout_sclk_isp_sensor0",
  302. mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 16, 1),
  303. MUX(CLK_MOUT_SCLK_ISP_UART, "mout_sclk_isp_uart",
  304. mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 8, 1),
  305. MUX(CLK_MOUT_SCLK_ISP_SPI1, "mout_sclk_isp_spi1",
  306. mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 4, 1),
  307. MUX(CLK_MOUT_SCLK_ISP_SPI0, "mout_sclk_isp_spi0",
  308. mout_bus_pll_user_t_p, MUX_SEL_TOP_CAM1, 0, 1),
  309. /* MUX_SEL_TOP_FSYS0 */
  310. MUX(CLK_MOUT_SCLK_MMC2_B, "mout_sclk_mmc2_b", mout_sclk_mmc2_b_p,
  311. MUX_SEL_TOP_FSYS0, 28, 1),
  312. MUX(CLK_MOUT_SCLK_MMC2_A, "mout_sclk_mmc2_a", mout_bus_pll_user_t_p,
  313. MUX_SEL_TOP_FSYS0, 24, 1),
  314. MUX(CLK_MOUT_SCLK_MMC1_B, "mout_sclk_mmc1_b", mout_sclk_mmc1_b_p,
  315. MUX_SEL_TOP_FSYS0, 20, 1),
  316. MUX(CLK_MOUT_SCLK_MMC1_A, "mout_sclk_mmc1_a", mout_bus_pll_user_t_p,
  317. MUX_SEL_TOP_FSYS0, 16, 1),
  318. MUX(CLK_MOUT_SCLK_MMC0_D, "mout_sclk_mmc0_d", mout_sclk_mmc0_d_p,
  319. MUX_SEL_TOP_FSYS0, 12, 1),
  320. MUX(CLK_MOUT_SCLK_MMC0_C, "mout_sclk_mmc0_c", mout_sclk_mmc0_c_p,
  321. MUX_SEL_TOP_FSYS0, 8, 1),
  322. MUX(CLK_MOUT_SCLK_MMC0_B, "mout_sclk_mmc0_b", mout_sclk_mmc0_b_p,
  323. MUX_SEL_TOP_FSYS0, 4, 1),
  324. MUX(CLK_MOUT_SCLK_MMC0_A, "mout_sclk_mmc0_a", mout_bus_pll_user_t_p,
  325. MUX_SEL_TOP_FSYS0, 0, 1),
  326. /* MUX_SEL_TOP_FSYS1 */
  327. MUX(CLK_MOUT_SCLK_PCIE_100, "mout_sclk_pcie_100", mout_bus_pll_user_t_p,
  328. MUX_SEL_TOP_FSYS1, 12, 1),
  329. MUX(CLK_MOUT_SCLK_UFSUNIPRO, "mout_sclk_ufsunipro",
  330. mout_mphy_pll_user_t_p, MUX_SEL_TOP_FSYS1, 8, 1),
  331. MUX(CLK_MOUT_SCLK_USBHOST30, "mout_sclk_usbhost30",
  332. mout_bus_pll_user_t_p, MUX_SEL_TOP_FSYS1, 4, 1),
  333. MUX(CLK_MOUT_SCLK_USBDRD30, "mout_sclk_usbdrd30",
  334. mout_bus_pll_user_t_p, MUX_SEL_TOP_FSYS1, 0, 1),
  335. /* MUX_SEL_TOP_PERIC0 */
  336. MUX(CLK_MOUT_SCLK_SPI4, "mout_sclk_spi4", mout_bus_pll_user_t_p,
  337. MUX_SEL_TOP_PERIC0, 28, 1),
  338. MUX(CLK_MOUT_SCLK_SPI3, "mout_sclk_spi3", mout_bus_pll_user_t_p,
  339. MUX_SEL_TOP_PERIC0, 24, 1),
  340. MUX(CLK_MOUT_SCLK_UART2, "mout_sclk_uart2", mout_bus_pll_user_t_p,
  341. MUX_SEL_TOP_PERIC0, 20, 1),
  342. MUX(CLK_MOUT_SCLK_UART1, "mout_sclk_uart1", mout_bus_pll_user_t_p,
  343. MUX_SEL_TOP_PERIC0, 16, 1),
  344. MUX(CLK_MOUT_SCLK_UART0, "mout_sclk_uart0", mout_bus_pll_user_t_p,
  345. MUX_SEL_TOP_PERIC0, 12, 1),
  346. MUX(CLK_MOUT_SCLK_SPI2, "mout_sclk_spi2", mout_bus_pll_user_t_p,
  347. MUX_SEL_TOP_PERIC0, 8, 1),
  348. MUX(CLK_MOUT_SCLK_SPI1, "mout_sclk_spi1", mout_bus_pll_user_t_p,
  349. MUX_SEL_TOP_PERIC0, 4, 1),
  350. MUX(CLK_MOUT_SCLK_SPI0, "mout_sclk_spi0", mout_bus_pll_user_t_p,
  351. MUX_SEL_TOP_PERIC0, 0, 1),
  352. /* MUX_SEL_TOP_PERIC1 */
  353. MUX(CLK_MOUT_SCLK_SLIMBUS, "mout_sclk_slimbus", mout_aud_pll_user_p,
  354. MUX_SEL_TOP_PERIC1, 16, 1),
  355. MUX(CLK_MOUT_SCLK_SPDIF, "mout_sclk_spdif", mout_sclk_spdif_p,
  356. MUX_SEL_TOP_PERIC1, 12, 2),
  357. MUX(CLK_MOUT_SCLK_AUDIO1, "mout_sclk_audio1", mout_sclk_audio1_p,
  358. MUX_SEL_TOP_PERIC1, 4, 2),
  359. MUX(CLK_MOUT_SCLK_AUDIO0, "mout_sclk_audio0", mout_sclk_audio0_p,
  360. MUX_SEL_TOP_PERIC1, 0, 2),
  361. /* MUX_SEL_TOP_DISP */
  362. MUX(CLK_MOUT_SCLK_HDMI_SPDIF, "mout_sclk_hdmi_spdif",
  363. mout_sclk_hdmi_spdif_p, MUX_SEL_TOP_DISP, 0, 1),
  364. };
  365. static const struct samsung_div_clock top_div_clks[] __initconst = {
  366. /* DIV_TOP0 */
  367. DIV(CLK_DIV_ACLK_CAM1_333, "div_aclk_cam1_333", "mout_aclk_cam1_333",
  368. DIV_TOP0, 28, 3),
  369. DIV(CLK_DIV_ACLK_CAM1_400, "div_aclk_cam1_400", "mout_bus_pll_user",
  370. DIV_TOP0, 24, 3),
  371. DIV(CLK_DIV_ACLK_CAM1_552, "div_aclk_cam1_552", "mout_aclk_cam1_552_b",
  372. DIV_TOP0, 20, 3),
  373. DIV(CLK_DIV_ACLK_CAM0_333, "div_aclk_cam0_333", "mout_mfc_pll_user",
  374. DIV_TOP0, 16, 3),
  375. DIV(CLK_DIV_ACLK_CAM0_400, "div_aclk_cam0_400", "mout_bus_pll_user",
  376. DIV_TOP0, 12, 3),
  377. DIV(CLK_DIV_ACLK_CAM0_552, "div_aclk_cam0_552", "mout_isp_pll",
  378. DIV_TOP0, 8, 3),
  379. DIV(CLK_DIV_ACLK_ISP_DIS_400, "div_aclk_isp_dis_400",
  380. "mout_aclk_isp_dis_400", DIV_TOP0, 4, 4),
  381. DIV(CLK_DIV_ACLK_ISP_400, "div_aclk_isp_400",
  382. "mout_aclk_isp_400", DIV_TOP0, 0, 4),
  383. /* DIV_TOP1 */
  384. DIV(CLK_DIV_ACLK_GSCL_111, "div_aclk_gscl_111", "mout_aclk_gscl_333",
  385. DIV_TOP1, 28, 3),
  386. DIV(CLK_DIV_ACLK_GSCL_333, "div_aclk_gscl_333", "mout_aclk_gscl_333",
  387. DIV_TOP1, 24, 3),
  388. DIV(CLK_DIV_ACLK_HEVC_400, "div_aclk_hevc_400", "mout_aclk_hevc_400",
  389. DIV_TOP1, 20, 3),
  390. DIV(CLK_DIV_ACLK_MFC_400, "div_aclk_mfc_400", "mout_aclk_mfc_400_c",
  391. DIV_TOP1, 12, 3),
  392. DIV(CLK_DIV_ACLK_G2D_266, "div_aclk_g2d_266", "mout_bus_pll_user",
  393. DIV_TOP1, 8, 3),
  394. DIV(CLK_DIV_ACLK_G2D_400, "div_aclk_g2d_400", "mout_aclk_g2d_400_b",
  395. DIV_TOP1, 0, 3),
  396. /* DIV_TOP2 */
  397. DIV(CLK_DIV_ACLK_MSCL_400, "div_aclk_mscl_400", "mout_aclk_mscl_400_b",
  398. DIV_TOP2, 4, 3),
  399. DIV(CLK_DIV_ACLK_FSYS_200, "div_aclk_fsys_200", "mout_bus_pll_user",
  400. DIV_TOP2, 0, 3),
  401. /* DIV_TOP3 */
  402. DIV(CLK_DIV_ACLK_IMEM_SSSX_266, "div_aclk_imem_sssx_266",
  403. "mout_bus_pll_user", DIV_TOP3, 24, 3),
  404. DIV(CLK_DIV_ACLK_IMEM_200, "div_aclk_imem_200",
  405. "mout_bus_pll_user", DIV_TOP3, 20, 3),
  406. DIV(CLK_DIV_ACLK_IMEM_266, "div_aclk_imem_266",
  407. "mout_bus_pll_user", DIV_TOP3, 16, 3),
  408. DIV(CLK_DIV_ACLK_PERIC_66_B, "div_aclk_peric_66_b",
  409. "div_aclk_peric_66_a", DIV_TOP3, 12, 3),
  410. DIV(CLK_DIV_ACLK_PERIC_66_A, "div_aclk_peric_66_a",
  411. "mout_bus_pll_user", DIV_TOP3, 8, 3),
  412. DIV(CLK_DIV_ACLK_PERIS_66_B, "div_aclk_peris_66_b",
  413. "div_aclk_peris_66_a", DIV_TOP3, 4, 3),
  414. DIV(CLK_DIV_ACLK_PERIS_66_A, "div_aclk_peris_66_a",
  415. "mout_bus_pll_user", DIV_TOP3, 0, 3),
  416. /* DIV_TOP4 */
  417. DIV(CLK_DIV_ACLK_G3D_400, "div_aclk_g3d_400", "mout_bus_pll_user",
  418. DIV_TOP4, 8, 3),
  419. DIV(CLK_DIV_ACLK_BUS0_400, "div_aclk_bus0_400", "mout_aclk_bus0_400",
  420. DIV_TOP4, 4, 3),
  421. DIV(CLK_DIV_ACLK_BUS1_400, "div_aclk_bus1_400", "mout_bus_pll_user",
  422. DIV_TOP4, 0, 3),
  423. /* DIV_TOP_MSCL */
  424. DIV(CLK_DIV_SCLK_JPEG, "div_sclk_jpeg", "mout_sclk_jpeg_c",
  425. DIV_TOP_MSCL, 0, 4),
  426. /* DIV_TOP_CAM10 */
  427. DIV(CLK_DIV_SCLK_ISP_UART, "div_sclk_isp_uart", "mout_sclk_isp_uart",
  428. DIV_TOP_CAM10, 24, 5),
  429. DIV(CLK_DIV_SCLK_ISP_SPI1_B, "div_sclk_isp_spi1_b",
  430. "div_sclk_isp_spi1_a", DIV_TOP_CAM10, 16, 8),
  431. DIV(CLK_DIV_SCLK_ISP_SPI1_A, "div_sclk_isp_spi1_a",
  432. "mout_sclk_isp_spi1", DIV_TOP_CAM10, 12, 4),
  433. DIV(CLK_DIV_SCLK_ISP_SPI0_B, "div_sclk_isp_spi0_b",
  434. "div_sclk_isp_spi0_a", DIV_TOP_CAM10, 4, 8),
  435. DIV(CLK_DIV_SCLK_ISP_SPI0_A, "div_sclk_isp_spi0_a",
  436. "mout_sclk_isp_spi0", DIV_TOP_CAM10, 0, 4),
  437. /* DIV_TOP_CAM11 */
  438. DIV(CLK_DIV_SCLK_ISP_SENSOR2_B, "div_sclk_isp_sensor2_b",
  439. "div_sclk_isp_sensor2_a", DIV_TOP_CAM11, 20, 4),
  440. DIV(CLK_DIV_SCLK_ISP_SENSOR2_A, "div_sclk_isp_sensor2_a",
  441. "mout_sclk_isp_sensor2", DIV_TOP_CAM11, 16, 4),
  442. DIV(CLK_DIV_SCLK_ISP_SENSOR1_B, "div_sclk_isp_sensor1_b",
  443. "div_sclk_isp_sensor1_a", DIV_TOP_CAM11, 12, 4),
  444. DIV(CLK_DIV_SCLK_ISP_SENSOR1_A, "div_sclk_isp_sensor1_a",
  445. "mout_sclk_isp_sensor1", DIV_TOP_CAM11, 8, 4),
  446. DIV(CLK_DIV_SCLK_ISP_SENSOR0_B, "div_sclk_isp_sensor0_b",
  447. "div_sclk_isp_sensor0_a", DIV_TOP_CAM11, 4, 4),
  448. DIV(CLK_DIV_SCLK_ISP_SENSOR0_A, "div_sclk_isp_sensor0_a",
  449. "mout_sclk_isp_sensor0", DIV_TOP_CAM11, 0, 4),
  450. /* DIV_TOP_FSYS0 */
  451. DIV(CLK_DIV_SCLK_MMC1_B, "div_sclk_mmc1_b", "div_sclk_mmc1_a",
  452. DIV_TOP_FSYS0, 16, 8),
  453. DIV(CLK_DIV_SCLK_MMC1_A, "div_sclk_mmc1_a", "mout_sclk_mmc1_b",
  454. DIV_TOP_FSYS0, 12, 4),
  455. DIV_F(CLK_DIV_SCLK_MMC0_B, "div_sclk_mmc0_b", "div_sclk_mmc0_a",
  456. DIV_TOP_FSYS0, 4, 8, CLK_SET_RATE_PARENT, 0),
  457. DIV_F(CLK_DIV_SCLK_MMC0_A, "div_sclk_mmc0_a", "mout_sclk_mmc0_d",
  458. DIV_TOP_FSYS0, 0, 4, CLK_SET_RATE_PARENT, 0),
  459. /* DIV_TOP_FSYS1 */
  460. DIV(CLK_DIV_SCLK_MMC2_B, "div_sclk_mmc2_b", "div_sclk_mmc2_a",
  461. DIV_TOP_FSYS1, 4, 8),
  462. DIV(CLK_DIV_SCLK_MMC2_A, "div_sclk_mmc2_a", "mout_sclk_mmc2_b",
  463. DIV_TOP_FSYS1, 0, 4),
  464. /* DIV_TOP_FSYS2 */
  465. DIV(CLK_DIV_SCLK_PCIE_100, "div_sclk_pcie_100", "mout_sclk_pcie_100",
  466. DIV_TOP_FSYS2, 12, 3),
  467. DIV(CLK_DIV_SCLK_USBHOST30, "div_sclk_usbhost30",
  468. "mout_sclk_usbhost30", DIV_TOP_FSYS2, 8, 4),
  469. DIV(CLK_DIV_SCLK_UFSUNIPRO, "div_sclk_ufsunipro",
  470. "mout_sclk_ufsunipro", DIV_TOP_FSYS2, 4, 4),
  471. DIV(CLK_DIV_SCLK_USBDRD30, "div_sclk_usbdrd30", "mout_sclk_usbdrd30",
  472. DIV_TOP_FSYS2, 0, 4),
  473. /* DIV_TOP_PERIC0 */
  474. DIV(CLK_DIV_SCLK_SPI1_B, "div_sclk_spi1_b", "div_sclk_spi1_a",
  475. DIV_TOP_PERIC0, 16, 8),
  476. DIV(CLK_DIV_SCLK_SPI1_A, "div_sclk_spi1_a", "mout_sclk_spi1",
  477. DIV_TOP_PERIC0, 12, 4),
  478. DIV(CLK_DIV_SCLK_SPI0_B, "div_sclk_spi0_b", "div_sclk_spi0_a",
  479. DIV_TOP_PERIC0, 4, 8),
  480. DIV(CLK_DIV_SCLK_SPI0_A, "div_sclk_spi0_a", "mout_sclk_spi0",
  481. DIV_TOP_PERIC0, 0, 4),
  482. /* DIV_TOP_PERIC1 */
  483. DIV(CLK_DIV_SCLK_SPI2_B, "div_sclk_spi2_b", "div_sclk_spi2_a",
  484. DIV_TOP_PERIC1, 4, 8),
  485. DIV(CLK_DIV_SCLK_SPI2_A, "div_sclk_spi2_a", "mout_sclk_spi2",
  486. DIV_TOP_PERIC1, 0, 4),
  487. /* DIV_TOP_PERIC2 */
  488. DIV(CLK_DIV_SCLK_UART2, "div_sclk_uart2", "mout_sclk_uart2",
  489. DIV_TOP_PERIC2, 8, 4),
  490. DIV(CLK_DIV_SCLK_UART1, "div_sclk_uart1", "mout_sclk_uart0",
  491. DIV_TOP_PERIC2, 4, 4),
  492. DIV(CLK_DIV_SCLK_UART0, "div_sclk_uart0", "mout_sclk_uart1",
  493. DIV_TOP_PERIC2, 0, 4),
  494. /* DIV_TOP_PERIC3 */
  495. DIV(CLK_DIV_SCLK_I2S1, "div_sclk_i2s1", "sclk_audio1",
  496. DIV_TOP_PERIC3, 16, 6),
  497. DIV(CLK_DIV_SCLK_PCM1, "div_sclk_pcm1", "sclk_audio1",
  498. DIV_TOP_PERIC3, 8, 8),
  499. DIV(CLK_DIV_SCLK_AUDIO1, "div_sclk_audio1", "mout_sclk_audio1",
  500. DIV_TOP_PERIC3, 4, 4),
  501. DIV(CLK_DIV_SCLK_AUDIO0, "div_sclk_audio0", "mout_sclk_audio0",
  502. DIV_TOP_PERIC3, 0, 4),
  503. /* DIV_TOP_PERIC4 */
  504. DIV(CLK_DIV_SCLK_SPI4_B, "div_sclk_spi4_b", "div_sclk_spi4_a",
  505. DIV_TOP_PERIC4, 16, 8),
  506. DIV(CLK_DIV_SCLK_SPI4_A, "div_sclk_spi4_a", "mout_sclk_spi4",
  507. DIV_TOP_PERIC4, 12, 4),
  508. DIV(CLK_DIV_SCLK_SPI3_B, "div_sclk_spi3_b", "div_sclk_spi3_a",
  509. DIV_TOP_PERIC4, 4, 8),
  510. DIV(CLK_DIV_SCLK_SPI3_A, "div_sclk_spi3_a", "mout_sclk_spi3",
  511. DIV_TOP_PERIC4, 0, 4),
  512. };
  513. static const struct samsung_gate_clock top_gate_clks[] __initconst = {
  514. /* ENABLE_ACLK_TOP */
  515. GATE(CLK_ACLK_G3D_400, "aclk_g3d_400", "div_aclk_g3d_400",
  516. ENABLE_ACLK_TOP, 30, CLK_IS_CRITICAL, 0),
  517. GATE(CLK_ACLK_IMEM_SSX_266, "aclk_imem_ssx_266",
  518. "div_aclk_imem_sssx_266", ENABLE_ACLK_TOP,
  519. 29, CLK_IGNORE_UNUSED, 0),
  520. GATE(CLK_ACLK_BUS0_400, "aclk_bus0_400", "div_aclk_bus0_400",
  521. ENABLE_ACLK_TOP, 26,
  522. CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 0),
  523. GATE(CLK_ACLK_BUS1_400, "aclk_bus1_400", "div_aclk_bus1_400",
  524. ENABLE_ACLK_TOP, 25,
  525. CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 0),
  526. GATE(CLK_ACLK_IMEM_200, "aclk_imem_200", "div_aclk_imem_266",
  527. ENABLE_ACLK_TOP, 24,
  528. CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 0),
  529. GATE(CLK_ACLK_IMEM_266, "aclk_imem_266", "div_aclk_imem_200",
  530. ENABLE_ACLK_TOP, 23,
  531. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
  532. GATE(CLK_ACLK_PERIC_66, "aclk_peric_66", "div_aclk_peric_66_b",
  533. ENABLE_ACLK_TOP, 22,
  534. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  535. GATE(CLK_ACLK_PERIS_66, "aclk_peris_66", "div_aclk_peris_66_b",
  536. ENABLE_ACLK_TOP, 21,
  537. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  538. GATE(CLK_ACLK_MSCL_400, "aclk_mscl_400", "div_aclk_mscl_400",
  539. ENABLE_ACLK_TOP, 19,
  540. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  541. GATE(CLK_ACLK_FSYS_200, "aclk_fsys_200", "div_aclk_fsys_200",
  542. ENABLE_ACLK_TOP, 18,
  543. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  544. GATE(CLK_ACLK_GSCL_111, "aclk_gscl_111", "div_aclk_gscl_111",
  545. ENABLE_ACLK_TOP, 15,
  546. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  547. GATE(CLK_ACLK_GSCL_333, "aclk_gscl_333", "div_aclk_gscl_333",
  548. ENABLE_ACLK_TOP, 14,
  549. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  550. GATE(CLK_ACLK_CAM1_333, "aclk_cam1_333", "div_aclk_cam1_333",
  551. ENABLE_ACLK_TOP, 13,
  552. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  553. GATE(CLK_ACLK_CAM1_400, "aclk_cam1_400", "div_aclk_cam1_400",
  554. ENABLE_ACLK_TOP, 12,
  555. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  556. GATE(CLK_ACLK_CAM1_552, "aclk_cam1_552", "div_aclk_cam1_552",
  557. ENABLE_ACLK_TOP, 11,
  558. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  559. GATE(CLK_ACLK_CAM0_333, "aclk_cam0_333", "div_aclk_cam0_333",
  560. ENABLE_ACLK_TOP, 10,
  561. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  562. GATE(CLK_ACLK_CAM0_400, "aclk_cam0_400", "div_aclk_cam0_400",
  563. ENABLE_ACLK_TOP, 9,
  564. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  565. GATE(CLK_ACLK_CAM0_552, "aclk_cam0_552", "div_aclk_cam0_552",
  566. ENABLE_ACLK_TOP, 8,
  567. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  568. GATE(CLK_ACLK_ISP_DIS_400, "aclk_isp_dis_400", "div_aclk_isp_dis_400",
  569. ENABLE_ACLK_TOP, 7,
  570. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  571. GATE(CLK_ACLK_ISP_400, "aclk_isp_400", "div_aclk_isp_400",
  572. ENABLE_ACLK_TOP, 6,
  573. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  574. GATE(CLK_ACLK_HEVC_400, "aclk_hevc_400", "div_aclk_hevc_400",
  575. ENABLE_ACLK_TOP, 5,
  576. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  577. GATE(CLK_ACLK_MFC_400, "aclk_mfc_400", "div_aclk_mfc_400",
  578. ENABLE_ACLK_TOP, 3,
  579. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  580. GATE(CLK_ACLK_G2D_266, "aclk_g2d_266", "div_aclk_g2d_266",
  581. ENABLE_ACLK_TOP, 2,
  582. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  583. GATE(CLK_ACLK_G2D_400, "aclk_g2d_400", "div_aclk_g2d_400",
  584. ENABLE_ACLK_TOP, 0,
  585. CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, 0),
  586. /* ENABLE_SCLK_TOP_MSCL */
  587. GATE(CLK_SCLK_JPEG_MSCL, "sclk_jpeg_mscl", "div_sclk_jpeg",
  588. ENABLE_SCLK_TOP_MSCL, 0, CLK_SET_RATE_PARENT, 0),
  589. /* ENABLE_SCLK_TOP_CAM1 */
  590. GATE(CLK_SCLK_ISP_SENSOR2, "sclk_isp_sensor2", "div_sclk_isp_sensor2_b",
  591. ENABLE_SCLK_TOP_CAM1, 7, 0, 0),
  592. GATE(CLK_SCLK_ISP_SENSOR1, "sclk_isp_sensor1", "div_sclk_isp_sensor1_b",
  593. ENABLE_SCLK_TOP_CAM1, 6, 0, 0),
  594. GATE(CLK_SCLK_ISP_SENSOR0, "sclk_isp_sensor0", "div_sclk_isp_sensor0_b",
  595. ENABLE_SCLK_TOP_CAM1, 5, 0, 0),
  596. GATE(CLK_SCLK_ISP_MCTADC_CAM1, "sclk_isp_mctadc_cam1", "oscclk",
  597. ENABLE_SCLK_TOP_CAM1, 4, 0, 0),
  598. GATE(CLK_SCLK_ISP_UART_CAM1, "sclk_isp_uart_cam1", "div_sclk_isp_uart",
  599. ENABLE_SCLK_TOP_CAM1, 2, 0, 0),
  600. GATE(CLK_SCLK_ISP_SPI1_CAM1, "sclk_isp_spi1_cam1", "div_sclk_isp_spi1_b",
  601. ENABLE_SCLK_TOP_CAM1, 1, 0, 0),
  602. GATE(CLK_SCLK_ISP_SPI0_CAM1, "sclk_isp_spi0_cam1", "div_sclk_isp_spi0_b",
  603. ENABLE_SCLK_TOP_CAM1, 0, 0, 0),
  604. /* ENABLE_SCLK_TOP_DISP */
  605. GATE(CLK_SCLK_HDMI_SPDIF_DISP, "sclk_hdmi_spdif_disp",
  606. "mout_sclk_hdmi_spdif", ENABLE_SCLK_TOP_DISP, 0,
  607. CLK_IGNORE_UNUSED, 0),
  608. /* ENABLE_SCLK_TOP_FSYS */
  609. GATE(CLK_SCLK_PCIE_100_FSYS, "sclk_pcie_100_fsys", "div_sclk_pcie_100",
  610. ENABLE_SCLK_TOP_FSYS, 7, CLK_IGNORE_UNUSED, 0),
  611. GATE(CLK_SCLK_MMC2_FSYS, "sclk_mmc2_fsys", "div_sclk_mmc2_b",
  612. ENABLE_SCLK_TOP_FSYS, 6, CLK_SET_RATE_PARENT, 0),
  613. GATE(CLK_SCLK_MMC1_FSYS, "sclk_mmc1_fsys", "div_sclk_mmc1_b",
  614. ENABLE_SCLK_TOP_FSYS, 5, CLK_SET_RATE_PARENT, 0),
  615. GATE(CLK_SCLK_MMC0_FSYS, "sclk_mmc0_fsys", "div_sclk_mmc0_b",
  616. ENABLE_SCLK_TOP_FSYS, 4, CLK_SET_RATE_PARENT, 0),
  617. GATE(CLK_SCLK_UFSUNIPRO_FSYS, "sclk_ufsunipro_fsys",
  618. "div_sclk_ufsunipro", ENABLE_SCLK_TOP_FSYS,
  619. 3, CLK_SET_RATE_PARENT, 0),
  620. GATE(CLK_SCLK_USBHOST30_FSYS, "sclk_usbhost30_fsys",
  621. "div_sclk_usbhost30", ENABLE_SCLK_TOP_FSYS,
  622. 1, CLK_SET_RATE_PARENT, 0),
  623. GATE(CLK_SCLK_USBDRD30_FSYS, "sclk_usbdrd30_fsys",
  624. "div_sclk_usbdrd30", ENABLE_SCLK_TOP_FSYS,
  625. 0, CLK_SET_RATE_PARENT, 0),
  626. /* ENABLE_SCLK_TOP_PERIC */
  627. GATE(CLK_SCLK_SPI4_PERIC, "sclk_spi4_peric", "div_sclk_spi4_b",
  628. ENABLE_SCLK_TOP_PERIC, 12, CLK_SET_RATE_PARENT, 0),
  629. GATE(CLK_SCLK_SPI3_PERIC, "sclk_spi3_peric", "div_sclk_spi3_b",
  630. ENABLE_SCLK_TOP_PERIC, 11, CLK_SET_RATE_PARENT, 0),
  631. GATE(CLK_SCLK_SPDIF_PERIC, "sclk_spdif_peric", "mout_sclk_spdif",
  632. ENABLE_SCLK_TOP_PERIC, 9, CLK_SET_RATE_PARENT, 0),
  633. GATE(CLK_SCLK_I2S1_PERIC, "sclk_i2s1_peric", "div_sclk_i2s1",
  634. ENABLE_SCLK_TOP_PERIC, 8, CLK_SET_RATE_PARENT, 0),
  635. GATE(CLK_SCLK_PCM1_PERIC, "sclk_pcm1_peric", "div_sclk_pcm1",
  636. ENABLE_SCLK_TOP_PERIC, 7, CLK_SET_RATE_PARENT, 0),
  637. GATE(CLK_SCLK_UART2_PERIC, "sclk_uart2_peric", "div_sclk_uart2",
  638. ENABLE_SCLK_TOP_PERIC, 5, CLK_SET_RATE_PARENT |
  639. CLK_IGNORE_UNUSED, 0),
  640. GATE(CLK_SCLK_UART1_PERIC, "sclk_uart1_peric", "div_sclk_uart1",
  641. ENABLE_SCLK_TOP_PERIC, 4, CLK_SET_RATE_PARENT |
  642. CLK_IGNORE_UNUSED, 0),
  643. GATE(CLK_SCLK_UART0_PERIC, "sclk_uart0_peric", "div_sclk_uart0",
  644. ENABLE_SCLK_TOP_PERIC, 3, CLK_SET_RATE_PARENT |
  645. CLK_IGNORE_UNUSED, 0),
  646. GATE(CLK_SCLK_SPI2_PERIC, "sclk_spi2_peric", "div_sclk_spi2_b",
  647. ENABLE_SCLK_TOP_PERIC, 2, CLK_SET_RATE_PARENT, 0),
  648. GATE(CLK_SCLK_SPI1_PERIC, "sclk_spi1_peric", "div_sclk_spi1_b",
  649. ENABLE_SCLK_TOP_PERIC, 1, CLK_SET_RATE_PARENT, 0),
  650. GATE(CLK_SCLK_SPI0_PERIC, "sclk_spi0_peric", "div_sclk_spi0_b",
  651. ENABLE_SCLK_TOP_PERIC, 0, CLK_SET_RATE_PARENT, 0),
  652. /* MUX_ENABLE_TOP_PERIC1 */
  653. GATE(CLK_SCLK_SLIMBUS, "sclk_slimbus", "mout_sclk_slimbus",
  654. MUX_ENABLE_TOP_PERIC1, 16, 0, 0),
  655. GATE(CLK_SCLK_AUDIO1, "sclk_audio1", "div_sclk_audio1",
  656. MUX_ENABLE_TOP_PERIC1, 4, 0, 0),
  657. GATE(CLK_SCLK_AUDIO0, "sclk_audio0", "div_sclk_audio0",
  658. MUX_ENABLE_TOP_PERIC1, 0, 0, 0),
  659. };
  660. /*
  661. * ATLAS_PLL & APOLLO_PLL & MEM0_PLL & MEM1_PLL & BUS_PLL & MFC_PLL
  662. * & MPHY_PLL & G3D_PLL & DISP_PLL & ISP_PLL
  663. */
  664. static const struct samsung_pll_rate_table exynos5433_pll_rates[] __initconst = {
  665. PLL_35XX_RATE(24 * MHZ, 2500000000U, 625, 6, 0),
  666. PLL_35XX_RATE(24 * MHZ, 2400000000U, 500, 5, 0),
  667. PLL_35XX_RATE(24 * MHZ, 2300000000U, 575, 6, 0),
  668. PLL_35XX_RATE(24 * MHZ, 2200000000U, 550, 6, 0),
  669. PLL_35XX_RATE(24 * MHZ, 2100000000U, 350, 4, 0),
  670. PLL_35XX_RATE(24 * MHZ, 2000000000U, 500, 6, 0),
  671. PLL_35XX_RATE(24 * MHZ, 1900000000U, 475, 6, 0),
  672. PLL_35XX_RATE(24 * MHZ, 1800000000U, 375, 5, 0),
  673. PLL_35XX_RATE(24 * MHZ, 1700000000U, 425, 6, 0),
  674. PLL_35XX_RATE(24 * MHZ, 1600000000U, 400, 6, 0),
  675. PLL_35XX_RATE(24 * MHZ, 1500000000U, 250, 4, 0),
  676. PLL_35XX_RATE(24 * MHZ, 1400000000U, 350, 6, 0),
  677. PLL_35XX_RATE(24 * MHZ, 1332000000U, 222, 4, 0),
  678. PLL_35XX_RATE(24 * MHZ, 1300000000U, 325, 6, 0),
  679. PLL_35XX_RATE(24 * MHZ, 1200000000U, 500, 5, 1),
  680. PLL_35XX_RATE(24 * MHZ, 1100000000U, 550, 6, 1),
  681. PLL_35XX_RATE(24 * MHZ, 1086000000U, 362, 4, 1),
  682. PLL_35XX_RATE(24 * MHZ, 1066000000U, 533, 6, 1),
  683. PLL_35XX_RATE(24 * MHZ, 1000000000U, 500, 6, 1),
  684. PLL_35XX_RATE(24 * MHZ, 933000000U, 311, 4, 1),
  685. PLL_35XX_RATE(24 * MHZ, 921000000U, 307, 4, 1),
  686. PLL_35XX_RATE(24 * MHZ, 900000000U, 375, 5, 1),
  687. PLL_35XX_RATE(24 * MHZ, 825000000U, 275, 4, 1),
  688. PLL_35XX_RATE(24 * MHZ, 800000000U, 400, 6, 1),
  689. PLL_35XX_RATE(24 * MHZ, 733000000U, 733, 12, 1),
  690. PLL_35XX_RATE(24 * MHZ, 700000000U, 175, 3, 1),
  691. PLL_35XX_RATE(24 * MHZ, 666000000U, 222, 4, 1),
  692. PLL_35XX_RATE(24 * MHZ, 633000000U, 211, 4, 1),
  693. PLL_35XX_RATE(24 * MHZ, 600000000U, 500, 5, 2),
  694. PLL_35XX_RATE(24 * MHZ, 552000000U, 460, 5, 2),
  695. PLL_35XX_RATE(24 * MHZ, 550000000U, 550, 6, 2),
  696. PLL_35XX_RATE(24 * MHZ, 543000000U, 362, 4, 2),
  697. PLL_35XX_RATE(24 * MHZ, 533000000U, 533, 6, 2),
  698. PLL_35XX_RATE(24 * MHZ, 500000000U, 500, 6, 2),
  699. PLL_35XX_RATE(24 * MHZ, 444000000U, 370, 5, 2),
  700. PLL_35XX_RATE(24 * MHZ, 420000000U, 350, 5, 2),
  701. PLL_35XX_RATE(24 * MHZ, 400000000U, 400, 6, 2),
  702. PLL_35XX_RATE(24 * MHZ, 350000000U, 350, 6, 2),
  703. PLL_35XX_RATE(24 * MHZ, 333000000U, 222, 4, 2),
  704. PLL_35XX_RATE(24 * MHZ, 300000000U, 500, 5, 3),
  705. PLL_35XX_RATE(24 * MHZ, 278000000U, 556, 6, 3),
  706. PLL_35XX_RATE(24 * MHZ, 266000000U, 532, 6, 3),
  707. PLL_35XX_RATE(24 * MHZ, 250000000U, 500, 6, 3),
  708. PLL_35XX_RATE(24 * MHZ, 200000000U, 400, 6, 3),
  709. PLL_35XX_RATE(24 * MHZ, 166000000U, 332, 6, 3),
  710. PLL_35XX_RATE(24 * MHZ, 160000000U, 320, 6, 3),
  711. PLL_35XX_RATE(24 * MHZ, 133000000U, 532, 6, 4),
  712. PLL_35XX_RATE(24 * MHZ, 100000000U, 400, 6, 4),
  713. { /* sentinel */ }
  714. };
  715. /* AUD_PLL */
  716. static const struct samsung_pll_rate_table exynos5433_aud_pll_rates[] __initconst = {
  717. PLL_36XX_RATE(24 * MHZ, 400000000U, 200, 3, 2, 0),
  718. PLL_36XX_RATE(24 * MHZ, 393216003U, 197, 3, 2, -25690),
  719. PLL_36XX_RATE(24 * MHZ, 384000000U, 128, 2, 2, 0),
  720. PLL_36XX_RATE(24 * MHZ, 368639991U, 246, 4, 2, -15729),
  721. PLL_36XX_RATE(24 * MHZ, 361507202U, 181, 3, 2, -16148),
  722. PLL_36XX_RATE(24 * MHZ, 338687988U, 113, 2, 2, -6816),
  723. PLL_36XX_RATE(24 * MHZ, 294912002U, 98, 1, 3, 19923),
  724. PLL_36XX_RATE(24 * MHZ, 288000000U, 96, 1, 3, 0),
  725. PLL_36XX_RATE(24 * MHZ, 252000000U, 84, 1, 3, 0),
  726. PLL_36XX_RATE(24 * MHZ, 196608001U, 197, 3, 3, -25690),
  727. { /* sentinel */ }
  728. };
  729. static const struct samsung_pll_clock top_pll_clks[] __initconst = {
  730. PLL(pll_35xx, CLK_FOUT_ISP_PLL, "fout_isp_pll", "oscclk",
  731. ISP_PLL_LOCK, ISP_PLL_CON0, exynos5433_pll_rates),
  732. PLL(pll_36xx, CLK_FOUT_AUD_PLL, "fout_aud_pll", "oscclk",
  733. AUD_PLL_LOCK, AUD_PLL_CON0, exynos5433_aud_pll_rates),
  734. };
  735. static const struct samsung_cmu_info top_cmu_info __initconst = {
  736. .pll_clks = top_pll_clks,
  737. .nr_pll_clks = ARRAY_SIZE(top_pll_clks),
  738. .mux_clks = top_mux_clks,
  739. .nr_mux_clks = ARRAY_SIZE(top_mux_clks),
  740. .div_clks = top_div_clks,
  741. .nr_div_clks = ARRAY_SIZE(top_div_clks),
  742. .gate_clks = top_gate_clks,
  743. .nr_gate_clks = ARRAY_SIZE(top_gate_clks),
  744. .fixed_clks = top_fixed_clks,
  745. .nr_fixed_clks = ARRAY_SIZE(top_fixed_clks),
  746. .fixed_factor_clks = top_fixed_factor_clks,
  747. .nr_fixed_factor_clks = ARRAY_SIZE(top_fixed_factor_clks),
  748. .nr_clk_ids = TOP_NR_CLK,
  749. .clk_regs = top_clk_regs,
  750. .nr_clk_regs = ARRAY_SIZE(top_clk_regs),
  751. .suspend_regs = top_suspend_regs,
  752. .nr_suspend_regs = ARRAY_SIZE(top_suspend_regs),
  753. };
  754. static void __init exynos5433_cmu_top_init(struct device_node *np)
  755. {
  756. samsung_cmu_register_one(np, &top_cmu_info);
  757. }
  758. CLK_OF_DECLARE(exynos5433_cmu_top, "samsung,exynos5433-cmu-top",
  759. exynos5433_cmu_top_init);
  760. /*
  761. * Register offset definitions for CMU_CPIF
  762. */
  763. #define MPHY_PLL_LOCK 0x0000
  764. #define MPHY_PLL_CON0 0x0100
  765. #define MPHY_PLL_CON1 0x0104
  766. #define MPHY_PLL_FREQ_DET 0x010c
  767. #define MUX_SEL_CPIF0 0x0200
  768. #define DIV_CPIF 0x0600
  769. #define ENABLE_SCLK_CPIF 0x0a00
  770. static const unsigned long cpif_clk_regs[] __initconst = {
  771. MPHY_PLL_LOCK,
  772. MPHY_PLL_CON0,
  773. MPHY_PLL_CON1,
  774. MPHY_PLL_FREQ_DET,
  775. MUX_SEL_CPIF0,
  776. DIV_CPIF,
  777. ENABLE_SCLK_CPIF,
  778. };
  779. static const struct samsung_clk_reg_dump cpif_suspend_regs[] = {
  780. /* force all sclk clocks enabled */
  781. { ENABLE_SCLK_CPIF, 0x3ff },
  782. /* MPHY PLL has to be enabled for suspend: reset value + ENABLE bit */
  783. { MPHY_PLL_CON0, 0x81c70601 },
  784. };
  785. /* list of all parent clock list */
  786. PNAME(mout_mphy_pll_p) = { "oscclk", "fout_mphy_pll", };
  787. static const struct samsung_pll_clock cpif_pll_clks[] __initconst = {
  788. PLL(pll_35xx, CLK_FOUT_MPHY_PLL, "fout_mphy_pll", "oscclk",
  789. MPHY_PLL_LOCK, MPHY_PLL_CON0, exynos5433_pll_rates),
  790. };
  791. static const struct samsung_mux_clock cpif_mux_clks[] __initconst = {
  792. /* MUX_SEL_CPIF0 */
  793. MUX(CLK_MOUT_MPHY_PLL, "mout_mphy_pll", mout_mphy_pll_p, MUX_SEL_CPIF0,
  794. 0, 1),
  795. };
  796. static const struct samsung_div_clock cpif_div_clks[] __initconst = {
  797. /* DIV_CPIF */
  798. DIV(CLK_DIV_SCLK_MPHY, "div_sclk_mphy", "mout_mphy_pll", DIV_CPIF,
  799. 0, 6),
  800. };
  801. static const struct samsung_gate_clock cpif_gate_clks[] __initconst = {
  802. /* ENABLE_SCLK_CPIF */
  803. GATE(CLK_SCLK_MPHY_PLL, "sclk_mphy_pll", "mout_mphy_pll",
  804. ENABLE_SCLK_CPIF, 9, CLK_IGNORE_UNUSED, 0),
  805. GATE(CLK_SCLK_UFS_MPHY, "sclk_ufs_mphy", "div_sclk_mphy",
  806. ENABLE_SCLK_CPIF, 4, 0, 0),
  807. };
  808. static const struct samsung_cmu_info cpif_cmu_info __initconst = {
  809. .pll_clks = cpif_pll_clks,
  810. .nr_pll_clks = ARRAY_SIZE(cpif_pll_clks),
  811. .mux_clks = cpif_mux_clks,
  812. .nr_mux_clks = ARRAY_SIZE(cpif_mux_clks),
  813. .div_clks = cpif_div_clks,
  814. .nr_div_clks = ARRAY_SIZE(cpif_div_clks),
  815. .gate_clks = cpif_gate_clks,
  816. .nr_gate_clks = ARRAY_SIZE(cpif_gate_clks),
  817. .nr_clk_ids = CPIF_NR_CLK,
  818. .clk_regs = cpif_clk_regs,
  819. .nr_clk_regs = ARRAY_SIZE(cpif_clk_regs),
  820. .suspend_regs = cpif_suspend_regs,
  821. .nr_suspend_regs = ARRAY_SIZE(cpif_suspend_regs),
  822. };
  823. static void __init exynos5433_cmu_cpif_init(struct device_node *np)
  824. {
  825. samsung_cmu_register_one(np, &cpif_cmu_info);
  826. }
  827. CLK_OF_DECLARE(exynos5433_cmu_cpif, "samsung,exynos5433-cmu-cpif",
  828. exynos5433_cmu_cpif_init);
  829. /*
  830. * Register offset definitions for CMU_MIF
  831. */
  832. #define MEM0_PLL_LOCK 0x0000
  833. #define MEM1_PLL_LOCK 0x0004
  834. #define BUS_PLL_LOCK 0x0008
  835. #define MFC_PLL_LOCK 0x000c
  836. #define MEM0_PLL_CON0 0x0100
  837. #define MEM0_PLL_CON1 0x0104
  838. #define MEM0_PLL_FREQ_DET 0x010c
  839. #define MEM1_PLL_CON0 0x0110
  840. #define MEM1_PLL_CON1 0x0114
  841. #define MEM1_PLL_FREQ_DET 0x011c
  842. #define BUS_PLL_CON0 0x0120
  843. #define BUS_PLL_CON1 0x0124
  844. #define BUS_PLL_FREQ_DET 0x012c
  845. #define MFC_PLL_CON0 0x0130
  846. #define MFC_PLL_CON1 0x0134
  847. #define MFC_PLL_FREQ_DET 0x013c
  848. #define MUX_SEL_MIF0 0x0200
  849. #define MUX_SEL_MIF1 0x0204
  850. #define MUX_SEL_MIF2 0x0208
  851. #define MUX_SEL_MIF3 0x020c
  852. #define MUX_SEL_MIF4 0x0210
  853. #define MUX_SEL_MIF5 0x0214
  854. #define MUX_SEL_MIF6 0x0218
  855. #define MUX_SEL_MIF7 0x021c
  856. #define MUX_ENABLE_MIF0 0x0300
  857. #define MUX_ENABLE_MIF1 0x0304
  858. #define MUX_ENABLE_MIF2 0x0308
  859. #define MUX_ENABLE_MIF3 0x030c
  860. #define MUX_ENABLE_MIF4 0x0310
  861. #define MUX_ENABLE_MIF5 0x0314
  862. #define MUX_ENABLE_MIF6 0x0318
  863. #define MUX_ENABLE_MIF7 0x031c
  864. #define MUX_STAT_MIF0 0x0400
  865. #define MUX_STAT_MIF1 0x0404
  866. #define MUX_STAT_MIF2 0x0408
  867. #define MUX_STAT_MIF3 0x040c
  868. #define MUX_STAT_MIF4 0x0410
  869. #define MUX_STAT_MIF5 0x0414
  870. #define MUX_STAT_MIF6 0x0418
  871. #define MUX_STAT_MIF7 0x041c
  872. #define DIV_MIF1 0x0604
  873. #define DIV_MIF2 0x0608
  874. #define DIV_MIF3 0x060c
  875. #define DIV_MIF4 0x0610
  876. #define DIV_MIF5 0x0614
  877. #define DIV_MIF_PLL_FREQ_DET 0x0618
  878. #define DIV_STAT_MIF1 0x0704
  879. #define DIV_STAT_MIF2 0x0708
  880. #define DIV_STAT_MIF3 0x070c
  881. #define DIV_STAT_MIF4 0x0710
  882. #define DIV_STAT_MIF5 0x0714
  883. #define DIV_STAT_MIF_PLL_FREQ_DET 0x0718
  884. #define ENABLE_ACLK_MIF0 0x0800
  885. #define ENABLE_ACLK_MIF1 0x0804
  886. #define ENABLE_ACLK_MIF2 0x0808
  887. #define ENABLE_ACLK_MIF3 0x080c
  888. #define ENABLE_PCLK_MIF 0x0900
  889. #define ENABLE_PCLK_MIF_SECURE_DREX0_TZ 0x0904
  890. #define ENABLE_PCLK_MIF_SECURE_DREX1_TZ 0x0908
  891. #define ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT 0x090c
  892. #define ENABLE_PCLK_MIF_SECURE_RTC 0x0910
  893. #define ENABLE_SCLK_MIF 0x0a00
  894. #define ENABLE_IP_MIF0 0x0b00
  895. #define ENABLE_IP_MIF1 0x0b04
  896. #define ENABLE_IP_MIF2 0x0b08
  897. #define ENABLE_IP_MIF3 0x0b0c
  898. #define ENABLE_IP_MIF_SECURE_DREX0_TZ 0x0b10
  899. #define ENABLE_IP_MIF_SECURE_DREX1_TZ 0x0b14
  900. #define ENABLE_IP_MIF_SECURE_MONOTONIC_CNT 0x0b18
  901. #define ENABLE_IP_MIF_SECURE_RTC 0x0b1c
  902. #define CLKOUT_CMU_MIF 0x0c00
  903. #define CLKOUT_CMU_MIF_DIV_STAT 0x0c04
  904. #define DREX_FREQ_CTRL0 0x1000
  905. #define DREX_FREQ_CTRL1 0x1004
  906. #define PAUSE 0x1008
  907. #define DDRPHY_LOCK_CTRL 0x100c
  908. static const unsigned long mif_clk_regs[] __initconst = {
  909. MEM0_PLL_LOCK,
  910. MEM1_PLL_LOCK,
  911. BUS_PLL_LOCK,
  912. MFC_PLL_LOCK,
  913. MEM0_PLL_CON0,
  914. MEM0_PLL_CON1,
  915. MEM0_PLL_FREQ_DET,
  916. MEM1_PLL_CON0,
  917. MEM1_PLL_CON1,
  918. MEM1_PLL_FREQ_DET,
  919. BUS_PLL_CON0,
  920. BUS_PLL_CON1,
  921. BUS_PLL_FREQ_DET,
  922. MFC_PLL_CON0,
  923. MFC_PLL_CON1,
  924. MFC_PLL_FREQ_DET,
  925. MUX_SEL_MIF0,
  926. MUX_SEL_MIF1,
  927. MUX_SEL_MIF2,
  928. MUX_SEL_MIF3,
  929. MUX_SEL_MIF4,
  930. MUX_SEL_MIF5,
  931. MUX_SEL_MIF6,
  932. MUX_SEL_MIF7,
  933. MUX_ENABLE_MIF0,
  934. MUX_ENABLE_MIF1,
  935. MUX_ENABLE_MIF2,
  936. MUX_ENABLE_MIF3,
  937. MUX_ENABLE_MIF4,
  938. MUX_ENABLE_MIF5,
  939. MUX_ENABLE_MIF6,
  940. MUX_ENABLE_MIF7,
  941. DIV_MIF1,
  942. DIV_MIF2,
  943. DIV_MIF3,
  944. DIV_MIF4,
  945. DIV_MIF5,
  946. DIV_MIF_PLL_FREQ_DET,
  947. ENABLE_ACLK_MIF0,
  948. ENABLE_ACLK_MIF1,
  949. ENABLE_ACLK_MIF2,
  950. ENABLE_ACLK_MIF3,
  951. ENABLE_PCLK_MIF,
  952. ENABLE_PCLK_MIF_SECURE_DREX0_TZ,
  953. ENABLE_PCLK_MIF_SECURE_DREX1_TZ,
  954. ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT,
  955. ENABLE_PCLK_MIF_SECURE_RTC,
  956. ENABLE_SCLK_MIF,
  957. ENABLE_IP_MIF0,
  958. ENABLE_IP_MIF1,
  959. ENABLE_IP_MIF2,
  960. ENABLE_IP_MIF3,
  961. ENABLE_IP_MIF_SECURE_DREX0_TZ,
  962. ENABLE_IP_MIF_SECURE_DREX1_TZ,
  963. ENABLE_IP_MIF_SECURE_MONOTONIC_CNT,
  964. ENABLE_IP_MIF_SECURE_RTC,
  965. CLKOUT_CMU_MIF,
  966. CLKOUT_CMU_MIF_DIV_STAT,
  967. DREX_FREQ_CTRL0,
  968. DREX_FREQ_CTRL1,
  969. PAUSE,
  970. DDRPHY_LOCK_CTRL,
  971. };
  972. static const struct samsung_pll_clock mif_pll_clks[] __initconst = {
  973. PLL(pll_35xx, CLK_FOUT_MEM0_PLL, "fout_mem0_pll", "oscclk",
  974. MEM0_PLL_LOCK, MEM0_PLL_CON0, exynos5433_pll_rates),
  975. PLL(pll_35xx, CLK_FOUT_MEM1_PLL, "fout_mem1_pll", "oscclk",
  976. MEM1_PLL_LOCK, MEM1_PLL_CON0, exynos5433_pll_rates),
  977. PLL(pll_35xx, CLK_FOUT_BUS_PLL, "fout_bus_pll", "oscclk",
  978. BUS_PLL_LOCK, BUS_PLL_CON0, exynos5433_pll_rates),
  979. PLL(pll_35xx, CLK_FOUT_MFC_PLL, "fout_mfc_pll", "oscclk",
  980. MFC_PLL_LOCK, MFC_PLL_CON0, exynos5433_pll_rates),
  981. };
  982. /* list of all parent clock list */
  983. PNAME(mout_mfc_pll_div2_p) = { "mout_mfc_pll", "dout_mfc_pll", };
  984. PNAME(mout_bus_pll_div2_p) = { "mout_bus_pll", "dout_bus_pll", };
  985. PNAME(mout_mem1_pll_div2_p) = { "mout_mem1_pll", "dout_mem1_pll", };
  986. PNAME(mout_mem0_pll_div2_p) = { "mout_mem0_pll", "dout_mem0_pll", };
  987. PNAME(mout_mfc_pll_p) = { "oscclk", "fout_mfc_pll", };
  988. PNAME(mout_bus_pll_p) = { "oscclk", "fout_bus_pll", };
  989. PNAME(mout_mem1_pll_p) = { "oscclk", "fout_mem1_pll", };
  990. PNAME(mout_mem0_pll_p) = { "oscclk", "fout_mem0_pll", };
  991. PNAME(mout_clk2x_phy_c_p) = { "mout_mem0_pll_div2", "mout_clkm_phy_b", };
  992. PNAME(mout_clk2x_phy_b_p) = { "mout_bus_pll_div2", "mout_clkm_phy_a", };
  993. PNAME(mout_clk2x_phy_a_p) = { "mout_bus_pll_div2", "mout_mfc_pll_div2", };
  994. PNAME(mout_clkm_phy_b_p) = { "mout_mem1_pll_div2", "mout_clkm_phy_a", };
  995. PNAME(mout_aclk_mifnm_200_p) = { "mout_mem0_pll_div2", "div_mif_pre", };
  996. PNAME(mout_aclk_mifnm_400_p) = { "mout_mem1_pll_div2", "mout_bus_pll_div2",};
  997. PNAME(mout_aclk_disp_333_b_p) = { "mout_aclk_disp_333_a",
  998. "mout_bus_pll_div2", };
  999. PNAME(mout_aclk_disp_333_a_p) = { "mout_mfc_pll_div2", "sclk_mphy_pll", };
  1000. PNAME(mout_sclk_decon_vclk_c_p) = { "mout_sclk_decon_vclk_b",
  1001. "sclk_mphy_pll", };
  1002. PNAME(mout_sclk_decon_vclk_b_p) = { "mout_sclk_decon_vclk_a",
  1003. "mout_mfc_pll_div2", };
  1004. PNAME(mout_sclk_decon_p) = { "oscclk", "mout_bus_pll_div2", };
  1005. PNAME(mout_sclk_decon_eclk_c_p) = { "mout_sclk_decon_eclk_b",
  1006. "sclk_mphy_pll", };
  1007. PNAME(mout_sclk_decon_eclk_b_p) = { "mout_sclk_decon_eclk_a",
  1008. "mout_mfc_pll_div2", };
  1009. PNAME(mout_sclk_decon_tv_eclk_c_p) = { "mout_sclk_decon_tv_eclk_b",
  1010. "sclk_mphy_pll", };
  1011. PNAME(mout_sclk_decon_tv_eclk_b_p) = { "mout_sclk_decon_tv_eclk_a",
  1012. "mout_mfc_pll_div2", };
  1013. PNAME(mout_sclk_dsd_c_p) = { "mout_sclk_dsd_b", "mout_bus_pll_div2", };
  1014. PNAME(mout_sclk_dsd_b_p) = { "mout_sclk_dsd_a", "sclk_mphy_pll", };
  1015. PNAME(mout_sclk_dsd_a_p) = { "oscclk", "mout_mfc_pll_div2", };
  1016. PNAME(mout_sclk_dsim0_c_p) = { "mout_sclk_dsim0_b", "sclk_mphy_pll", };
  1017. PNAME(mout_sclk_dsim0_b_p) = { "mout_sclk_dsim0_a", "mout_mfc_pll_div2" };
  1018. PNAME(mout_sclk_decon_tv_vclk_c_p) = { "mout_sclk_decon_tv_vclk_b",
  1019. "sclk_mphy_pll", };
  1020. PNAME(mout_sclk_decon_tv_vclk_b_p) = { "mout_sclk_decon_tv_vclk_a",
  1021. "mout_mfc_pll_div2", };
  1022. PNAME(mout_sclk_dsim1_c_p) = { "mout_sclk_dsim1_b", "sclk_mphy_pll", };
  1023. PNAME(mout_sclk_dsim1_b_p) = { "mout_sclk_dsim1_a", "mout_mfc_pll_div2",};
  1024. static const struct samsung_fixed_factor_clock mif_fixed_factor_clks[] __initconst = {
  1025. /* dout_{mfc|bus|mem1|mem0}_pll is half fixed rate from parent mux */
  1026. FFACTOR(CLK_DOUT_MFC_PLL, "dout_mfc_pll", "mout_mfc_pll", 1, 1, 0),
  1027. FFACTOR(CLK_DOUT_BUS_PLL, "dout_bus_pll", "mout_bus_pll", 1, 1, 0),
  1028. FFACTOR(CLK_DOUT_MEM1_PLL, "dout_mem1_pll", "mout_mem1_pll", 1, 1, 0),
  1029. FFACTOR(CLK_DOUT_MEM0_PLL, "dout_mem0_pll", "mout_mem0_pll", 1, 1, 0),
  1030. };
  1031. static const struct samsung_mux_clock mif_mux_clks[] __initconst = {
  1032. /* MUX_SEL_MIF0 */
  1033. MUX(CLK_MOUT_MFC_PLL_DIV2, "mout_mfc_pll_div2", mout_mfc_pll_div2_p,
  1034. MUX_SEL_MIF0, 28, 1),
  1035. MUX(CLK_MOUT_BUS_PLL_DIV2, "mout_bus_pll_div2", mout_bus_pll_div2_p,
  1036. MUX_SEL_MIF0, 24, 1),
  1037. MUX(CLK_MOUT_MEM1_PLL_DIV2, "mout_mem1_pll_div2", mout_mem1_pll_div2_p,
  1038. MUX_SEL_MIF0, 20, 1),
  1039. MUX(CLK_MOUT_MEM0_PLL_DIV2, "mout_mem0_pll_div2", mout_mem0_pll_div2_p,
  1040. MUX_SEL_MIF0, 16, 1),
  1041. MUX(CLK_MOUT_MFC_PLL, "mout_mfc_pll", mout_mfc_pll_p, MUX_SEL_MIF0,
  1042. 12, 1),
  1043. MUX(CLK_MOUT_BUS_PLL, "mout_bus_pll", mout_bus_pll_p, MUX_SEL_MIF0,
  1044. 8, 1),
  1045. MUX(CLK_MOUT_MEM1_PLL, "mout_mem1_pll", mout_mem1_pll_p, MUX_SEL_MIF0,
  1046. 4, 1),
  1047. MUX(CLK_MOUT_MEM0_PLL, "mout_mem0_pll", mout_mem0_pll_p, MUX_SEL_MIF0,
  1048. 0, 1),
  1049. /* MUX_SEL_MIF1 */
  1050. MUX(CLK_MOUT_CLK2X_PHY_C, "mout_clk2x_phy_c", mout_clk2x_phy_c_p,
  1051. MUX_SEL_MIF1, 24, 1),
  1052. MUX(CLK_MOUT_CLK2X_PHY_B, "mout_clk2x_phy_b", mout_clk2x_phy_b_p,
  1053. MUX_SEL_MIF1, 20, 1),
  1054. MUX(CLK_MOUT_CLK2X_PHY_A, "mout_clk2x_phy_a", mout_clk2x_phy_a_p,
  1055. MUX_SEL_MIF1, 16, 1),
  1056. MUX(CLK_MOUT_CLKM_PHY_C, "mout_clkm_phy_c", mout_clk2x_phy_c_p,
  1057. MUX_SEL_MIF1, 12, 1),
  1058. MUX(CLK_MOUT_CLKM_PHY_B, "mout_clkm_phy_b", mout_clkm_phy_b_p,
  1059. MUX_SEL_MIF1, 8, 1),
  1060. MUX(CLK_MOUT_CLKM_PHY_A, "mout_clkm_phy_a", mout_clk2x_phy_a_p,
  1061. MUX_SEL_MIF1, 4, 1),
  1062. /* MUX_SEL_MIF2 */
  1063. MUX(CLK_MOUT_ACLK_MIFNM_200, "mout_aclk_mifnm_200",
  1064. mout_aclk_mifnm_200_p, MUX_SEL_MIF2, 8, 1),
  1065. MUX(CLK_MOUT_ACLK_MIFNM_400, "mout_aclk_mifnm_400",
  1066. mout_aclk_mifnm_400_p, MUX_SEL_MIF2, 0, 1),
  1067. /* MUX_SEL_MIF3 */
  1068. MUX(CLK_MOUT_ACLK_DISP_333_B, "mout_aclk_disp_333_b",
  1069. mout_aclk_disp_333_b_p, MUX_SEL_MIF3, 4, 1),
  1070. MUX(CLK_MOUT_ACLK_DISP_333_A, "mout_aclk_disp_333_a",
  1071. mout_aclk_disp_333_a_p, MUX_SEL_MIF3, 0, 1),
  1072. /* MUX_SEL_MIF4 */
  1073. MUX(CLK_MOUT_SCLK_DECON_VCLK_C, "mout_sclk_decon_vclk_c",
  1074. mout_sclk_decon_vclk_c_p, MUX_SEL_MIF4, 24, 1),
  1075. MUX(CLK_MOUT_SCLK_DECON_VCLK_B, "mout_sclk_decon_vclk_b",
  1076. mout_sclk_decon_vclk_b_p, MUX_SEL_MIF4, 20, 1),
  1077. MUX(CLK_MOUT_SCLK_DECON_VCLK_A, "mout_sclk_decon_vclk_a",
  1078. mout_sclk_decon_p, MUX_SEL_MIF4, 16, 1),
  1079. MUX(CLK_MOUT_SCLK_DECON_ECLK_C, "mout_sclk_decon_eclk_c",
  1080. mout_sclk_decon_eclk_c_p, MUX_SEL_MIF4, 8, 1),
  1081. MUX(CLK_MOUT_SCLK_DECON_ECLK_B, "mout_sclk_decon_eclk_b",
  1082. mout_sclk_decon_eclk_b_p, MUX_SEL_MIF4, 4, 1),
  1083. MUX(CLK_MOUT_SCLK_DECON_ECLK_A, "mout_sclk_decon_eclk_a",
  1084. mout_sclk_decon_p, MUX_SEL_MIF4, 0, 1),
  1085. /* MUX_SEL_MIF5 */
  1086. MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_C, "mout_sclk_decon_tv_eclk_c",
  1087. mout_sclk_decon_tv_eclk_c_p, MUX_SEL_MIF5, 24, 1),
  1088. MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_B, "mout_sclk_decon_tv_eclk_b",
  1089. mout_sclk_decon_tv_eclk_b_p, MUX_SEL_MIF5, 20, 1),
  1090. MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_A, "mout_sclk_decon_tv_eclk_a",
  1091. mout_sclk_decon_p, MUX_SEL_MIF5, 16, 1),
  1092. MUX(CLK_MOUT_SCLK_DSD_C, "mout_sclk_dsd_c", mout_sclk_dsd_c_p,
  1093. MUX_SEL_MIF5, 8, 1),
  1094. MUX(CLK_MOUT_SCLK_DSD_B, "mout_sclk_dsd_b", mout_sclk_dsd_b_p,
  1095. MUX_SEL_MIF5, 4, 1),
  1096. MUX(CLK_MOUT_SCLK_DSD_A, "mout_sclk_dsd_a", mout_sclk_dsd_a_p,
  1097. MUX_SEL_MIF5, 0, 1),
  1098. /* MUX_SEL_MIF6 */
  1099. MUX(CLK_MOUT_SCLK_DSIM0_C, "mout_sclk_dsim0_c", mout_sclk_dsim0_c_p,
  1100. MUX_SEL_MIF6, 8, 1),
  1101. MUX(CLK_MOUT_SCLK_DSIM0_B, "mout_sclk_dsim0_b", mout_sclk_dsim0_b_p,
  1102. MUX_SEL_MIF6, 4, 1),
  1103. MUX(CLK_MOUT_SCLK_DSIM0_A, "mout_sclk_dsim0_a", mout_sclk_decon_p,
  1104. MUX_SEL_MIF6, 0, 1),
  1105. /* MUX_SEL_MIF7 */
  1106. MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_C, "mout_sclk_decon_tv_vclk_c",
  1107. mout_sclk_decon_tv_vclk_c_p, MUX_SEL_MIF7, 24, 1),
  1108. MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_B, "mout_sclk_decon_tv_vclk_b",
  1109. mout_sclk_decon_tv_vclk_b_p, MUX_SEL_MIF7, 20, 1),
  1110. MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_A, "mout_sclk_decon_tv_vclk_a",
  1111. mout_sclk_decon_p, MUX_SEL_MIF7, 16, 1),
  1112. MUX(CLK_MOUT_SCLK_DSIM1_C, "mout_sclk_dsim1_c", mout_sclk_dsim1_c_p,
  1113. MUX_SEL_MIF7, 8, 1),
  1114. MUX(CLK_MOUT_SCLK_DSIM1_B, "mout_sclk_dsim1_b", mout_sclk_dsim1_b_p,
  1115. MUX_SEL_MIF7, 4, 1),
  1116. MUX(CLK_MOUT_SCLK_DSIM1_A, "mout_sclk_dsim1_a", mout_sclk_decon_p,
  1117. MUX_SEL_MIF7, 0, 1),
  1118. };
  1119. static const struct samsung_div_clock mif_div_clks[] __initconst = {
  1120. /* DIV_MIF1 */
  1121. DIV(CLK_DIV_SCLK_HPM_MIF, "div_sclk_hpm_mif", "div_clk2x_phy",
  1122. DIV_MIF1, 16, 2),
  1123. DIV(CLK_DIV_ACLK_DREX1, "div_aclk_drex1", "div_clk2x_phy", DIV_MIF1,
  1124. 12, 2),
  1125. DIV(CLK_DIV_ACLK_DREX0, "div_aclk_drex0", "div_clk2x_phy", DIV_MIF1,
  1126. 8, 2),
  1127. DIV(CLK_DIV_CLK2XPHY, "div_clk2x_phy", "mout_clk2x_phy_c", DIV_MIF1,
  1128. 4, 4),
  1129. /* DIV_MIF2 */
  1130. DIV(CLK_DIV_ACLK_MIF_266, "div_aclk_mif_266", "mout_bus_pll_div2",
  1131. DIV_MIF2, 20, 3),
  1132. DIV(CLK_DIV_ACLK_MIFND_133, "div_aclk_mifnd_133", "div_mif_pre",
  1133. DIV_MIF2, 16, 4),
  1134. DIV(CLK_DIV_ACLK_MIF_133, "div_aclk_mif_133", "div_mif_pre",
  1135. DIV_MIF2, 12, 4),
  1136. DIV(CLK_DIV_ACLK_MIFNM_200, "div_aclk_mifnm_200",
  1137. "mout_aclk_mifnm_200", DIV_MIF2, 8, 3),
  1138. DIV(CLK_DIV_ACLK_MIF_200, "div_aclk_mif_200", "div_aclk_mif_400",
  1139. DIV_MIF2, 4, 2),
  1140. DIV(CLK_DIV_ACLK_MIF_400, "div_aclk_mif_400", "mout_aclk_mifnm_400",
  1141. DIV_MIF2, 0, 3),
  1142. /* DIV_MIF3 */
  1143. DIV(CLK_DIV_ACLK_BUS2_400, "div_aclk_bus2_400", "div_mif_pre",
  1144. DIV_MIF3, 16, 4),
  1145. DIV(CLK_DIV_ACLK_DISP_333, "div_aclk_disp_333", "mout_aclk_disp_333_b",
  1146. DIV_MIF3, 4, 3),
  1147. DIV(CLK_DIV_ACLK_CPIF_200, "div_aclk_cpif_200", "mout_aclk_mifnm_200",
  1148. DIV_MIF3, 0, 3),
  1149. /* DIV_MIF4 */
  1150. DIV(CLK_DIV_SCLK_DSIM1, "div_sclk_dsim1", "mout_sclk_dsim1_c",
  1151. DIV_MIF4, 24, 4),
  1152. DIV(CLK_DIV_SCLK_DECON_TV_VCLK, "div_sclk_decon_tv_vclk",
  1153. "mout_sclk_decon_tv_vclk_c", DIV_MIF4, 20, 4),
  1154. DIV(CLK_DIV_SCLK_DSIM0, "div_sclk_dsim0", "mout_sclk_dsim0_c",
  1155. DIV_MIF4, 16, 4),
  1156. DIV(CLK_DIV_SCLK_DSD, "div_sclk_dsd", "mout_sclk_dsd_c",
  1157. DIV_MIF4, 12, 4),
  1158. DIV(CLK_DIV_SCLK_DECON_TV_ECLK, "div_sclk_decon_tv_eclk",
  1159. "mout_sclk_decon_tv_eclk_c", DIV_MIF4, 8, 4),
  1160. DIV(CLK_DIV_SCLK_DECON_VCLK, "div_sclk_decon_vclk",
  1161. "mout_sclk_decon_vclk_c", DIV_MIF4, 4, 4),
  1162. DIV(CLK_DIV_SCLK_DECON_ECLK, "div_sclk_decon_eclk",
  1163. "mout_sclk_decon_eclk_c", DIV_MIF4, 0, 4),
  1164. /* DIV_MIF5 */
  1165. DIV(CLK_DIV_MIF_PRE, "div_mif_pre", "mout_bus_pll_div2", DIV_MIF5,
  1166. 0, 3),
  1167. };
  1168. static const struct samsung_gate_clock mif_gate_clks[] __initconst = {
  1169. /* ENABLE_ACLK_MIF0 */
  1170. GATE(CLK_CLK2X_PHY1, "clk2k_phy1", "div_clk2x_phy", ENABLE_ACLK_MIF0,
  1171. 19, CLK_IGNORE_UNUSED, 0),
  1172. GATE(CLK_CLK2X_PHY0, "clk2x_phy0", "div_clk2x_phy", ENABLE_ACLK_MIF0,
  1173. 18, CLK_IGNORE_UNUSED, 0),
  1174. GATE(CLK_CLKM_PHY1, "clkm_phy1", "mout_clkm_phy_c", ENABLE_ACLK_MIF0,
  1175. 17, CLK_IGNORE_UNUSED, 0),
  1176. GATE(CLK_CLKM_PHY0, "clkm_phy0", "mout_clkm_phy_c", ENABLE_ACLK_MIF0,
  1177. 16, CLK_IGNORE_UNUSED, 0),
  1178. GATE(CLK_RCLK_DREX1, "rclk_drex1", "oscclk", ENABLE_ACLK_MIF0,
  1179. 15, CLK_IGNORE_UNUSED, 0),
  1180. GATE(CLK_RCLK_DREX0, "rclk_drex0", "oscclk", ENABLE_ACLK_MIF0,
  1181. 14, CLK_IGNORE_UNUSED, 0),
  1182. GATE(CLK_ACLK_DREX1_TZ, "aclk_drex1_tz", "div_aclk_drex1",
  1183. ENABLE_ACLK_MIF0, 13, CLK_IGNORE_UNUSED, 0),
  1184. GATE(CLK_ACLK_DREX0_TZ, "aclk_drex0_tz", "div_aclk_drex0",
  1185. ENABLE_ACLK_MIF0, 12, CLK_IGNORE_UNUSED, 0),
  1186. GATE(CLK_ACLK_DREX1_PEREV, "aclk_drex1_perev", "div_aclk_drex1",
  1187. ENABLE_ACLK_MIF0, 11, CLK_IGNORE_UNUSED, 0),
  1188. GATE(CLK_ACLK_DREX0_PEREV, "aclk_drex0_perev", "div_aclk_drex0",
  1189. ENABLE_ACLK_MIF0, 10, CLK_IGNORE_UNUSED, 0),
  1190. GATE(CLK_ACLK_DREX1_MEMIF, "aclk_drex1_memif", "div_aclk_drex1",
  1191. ENABLE_ACLK_MIF0, 9, CLK_IGNORE_UNUSED, 0),
  1192. GATE(CLK_ACLK_DREX0_MEMIF, "aclk_drex0_memif", "div_aclk_drex0",
  1193. ENABLE_ACLK_MIF0, 8, CLK_IGNORE_UNUSED, 0),
  1194. GATE(CLK_ACLK_DREX1_SCH, "aclk_drex1_sch", "div_aclk_drex1",
  1195. ENABLE_ACLK_MIF0, 7, CLK_IGNORE_UNUSED, 0),
  1196. GATE(CLK_ACLK_DREX0_SCH, "aclk_drex0_sch", "div_aclk_drex0",
  1197. ENABLE_ACLK_MIF0, 6, CLK_IGNORE_UNUSED, 0),
  1198. GATE(CLK_ACLK_DREX1_BUSIF, "aclk_drex1_busif", "div_aclk_drex1",
  1199. ENABLE_ACLK_MIF0, 5, CLK_IGNORE_UNUSED, 0),
  1200. GATE(CLK_ACLK_DREX0_BUSIF, "aclk_drex0_busif", "div_aclk_drex0",
  1201. ENABLE_ACLK_MIF0, 4, CLK_IGNORE_UNUSED, 0),
  1202. GATE(CLK_ACLK_DREX1_BUSIF_RD, "aclk_drex1_busif_rd", "div_aclk_drex1",
  1203. ENABLE_ACLK_MIF0, 3, CLK_IGNORE_UNUSED, 0),
  1204. GATE(CLK_ACLK_DREX0_BUSIF_RD, "aclk_drex0_busif_rd", "div_aclk_drex0",
  1205. ENABLE_ACLK_MIF0, 2, CLK_IGNORE_UNUSED, 0),
  1206. GATE(CLK_ACLK_DREX1, "aclk_drex1", "div_aclk_drex1",
  1207. ENABLE_ACLK_MIF0, 2, CLK_IGNORE_UNUSED, 0),
  1208. GATE(CLK_ACLK_DREX0, "aclk_drex0", "div_aclk_drex0",
  1209. ENABLE_ACLK_MIF0, 1, CLK_IGNORE_UNUSED, 0),
  1210. /* ENABLE_ACLK_MIF1 */
  1211. GATE(CLK_ACLK_ASYNCAXIS_MIF_IMEM, "aclk_asyncaxis_mif_imem",
  1212. "div_aclk_mif_200", ENABLE_ACLK_MIF1, 28,
  1213. CLK_IGNORE_UNUSED, 0),
  1214. GATE(CLK_ACLK_ASYNCAXIS_NOC_P_CCI, "aclk_asyncaxis_noc_p_cci",
  1215. "div_aclk_mif_200", ENABLE_ACLK_MIF1,
  1216. 27, CLK_IGNORE_UNUSED, 0),
  1217. GATE(CLK_ACLK_ASYNCAXIM_NOC_P_CCI, "aclk_asyncaxim_noc_p_cci",
  1218. "div_aclk_mif_133", ENABLE_ACLK_MIF1,
  1219. 26, CLK_IGNORE_UNUSED, 0),
  1220. GATE(CLK_ACLK_ASYNCAXIS_CP1, "aclk_asyncaxis_cp1",
  1221. "div_aclk_mifnm_200", ENABLE_ACLK_MIF1,
  1222. 25, CLK_IGNORE_UNUSED, 0),
  1223. GATE(CLK_ACLK_ASYNCAXIM_CP1, "aclk_asyncaxim_cp1",
  1224. "div_aclk_drex1", ENABLE_ACLK_MIF1,
  1225. 24, CLK_IGNORE_UNUSED, 0),
  1226. GATE(CLK_ACLK_ASYNCAXIS_CP0, "aclk_asyncaxis_cp0",
  1227. "div_aclk_mifnm_200", ENABLE_ACLK_MIF1,
  1228. 23, CLK_IGNORE_UNUSED, 0),
  1229. GATE(CLK_ACLK_ASYNCAXIM_CP0, "aclk_asyncaxim_cp0",
  1230. "div_aclk_drex0", ENABLE_ACLK_MIF1,
  1231. 22, CLK_IGNORE_UNUSED, 0),
  1232. GATE(CLK_ACLK_ASYNCAXIS_DREX1_3, "aclk_asyncaxis_drex1_3",
  1233. "div_aclk_mif_133", ENABLE_ACLK_MIF1,
  1234. 21, CLK_IGNORE_UNUSED, 0),
  1235. GATE(CLK_ACLK_ASYNCAXIM_DREX1_3, "aclk_asyncaxim_drex1_3",
  1236. "div_aclk_drex1", ENABLE_ACLK_MIF1,
  1237. 20, CLK_IGNORE_UNUSED, 0),
  1238. GATE(CLK_ACLK_ASYNCAXIS_DREX1_1, "aclk_asyncaxis_drex1_1",
  1239. "div_aclk_mif_133", ENABLE_ACLK_MIF1,
  1240. 19, CLK_IGNORE_UNUSED, 0),
  1241. GATE(CLK_ACLK_ASYNCAXIM_DREX1_1, "aclk_asyncaxim_drex1_1",
  1242. "div_aclk_drex1", ENABLE_ACLK_MIF1,
  1243. 18, CLK_IGNORE_UNUSED, 0),
  1244. GATE(CLK_ACLK_ASYNCAXIS_DREX1_0, "aclk_asyncaxis_drex1_0",
  1245. "div_aclk_mif_133", ENABLE_ACLK_MIF1,
  1246. 17, CLK_IGNORE_UNUSED, 0),
  1247. GATE(CLK_ACLK_ASYNCAXIM_DREX1_0, "aclk_asyncaxim_drex1_0",
  1248. "div_aclk_drex1", ENABLE_ACLK_MIF1,
  1249. 16, CLK_IGNORE_UNUSED, 0),
  1250. GATE(CLK_ACLK_ASYNCAXIS_DREX0_3, "aclk_asyncaxis_drex0_3",
  1251. "div_aclk_mif_133", ENABLE_ACLK_MIF1,
  1252. 15, CLK_IGNORE_UNUSED, 0),
  1253. GATE(CLK_ACLK_ASYNCAXIM_DREX0_3, "aclk_asyncaxim_drex0_3",
  1254. "div_aclk_drex0", ENABLE_ACLK_MIF1,
  1255. 14, CLK_IGNORE_UNUSED, 0),
  1256. GATE(CLK_ACLK_ASYNCAXIS_DREX0_1, "aclk_asyncaxis_drex0_1",
  1257. "div_aclk_mif_133", ENABLE_ACLK_MIF1,
  1258. 13, CLK_IGNORE_UNUSED, 0),
  1259. GATE(CLK_ACLK_ASYNCAXIM_DREX0_1, "aclk_asyncaxim_drex0_1",
  1260. "div_aclk_drex0", ENABLE_ACLK_MIF1,
  1261. 12, CLK_IGNORE_UNUSED, 0),
  1262. GATE(CLK_ACLK_ASYNCAXIS_DREX0_0, "aclk_asyncaxis_drex0_0",
  1263. "div_aclk_mif_133", ENABLE_ACLK_MIF1,
  1264. 11, CLK_IGNORE_UNUSED, 0),
  1265. GATE(CLK_ACLK_ASYNCAXIM_DREX0_0, "aclk_asyncaxim_drex0_0",
  1266. "div_aclk_drex0", ENABLE_ACLK_MIF1,
  1267. 10, CLK_IGNORE_UNUSED, 0),
  1268. GATE(CLK_ACLK_AHB2APB_MIF2P, "aclk_ahb2apb_mif2p", "div_aclk_mif_133",
  1269. ENABLE_ACLK_MIF1, 9, CLK_IGNORE_UNUSED, 0),
  1270. GATE(CLK_ACLK_AHB2APB_MIF1P, "aclk_ahb2apb_mif1p", "div_aclk_mif_133",
  1271. ENABLE_ACLK_MIF1, 8, CLK_IGNORE_UNUSED, 0),
  1272. GATE(CLK_ACLK_AHB2APB_MIF0P, "aclk_ahb2apb_mif0p", "div_aclk_mif_133",
  1273. ENABLE_ACLK_MIF1, 7, CLK_IGNORE_UNUSED, 0),
  1274. GATE(CLK_ACLK_IXIU_CCI, "aclk_ixiu_cci", "div_aclk_mif_400",
  1275. ENABLE_ACLK_MIF1, 6, CLK_IGNORE_UNUSED, 0),
  1276. GATE(CLK_ACLK_XIU_MIFSFRX, "aclk_xiu_mifsfrx", "div_aclk_mif_200",
  1277. ENABLE_ACLK_MIF1, 5, CLK_IGNORE_UNUSED, 0),
  1278. GATE(CLK_ACLK_MIFNP_133, "aclk_mifnp_133", "div_aclk_mif_133",
  1279. ENABLE_ACLK_MIF1, 4, CLK_IGNORE_UNUSED, 0),
  1280. GATE(CLK_ACLK_MIFNM_200, "aclk_mifnm_200", "div_aclk_mifnm_200",
  1281. ENABLE_ACLK_MIF1, 3, CLK_IGNORE_UNUSED, 0),
  1282. GATE(CLK_ACLK_MIFND_133, "aclk_mifnd_133", "div_aclk_mifnd_133",
  1283. ENABLE_ACLK_MIF1, 2, CLK_IGNORE_UNUSED, 0),
  1284. GATE(CLK_ACLK_MIFND_400, "aclk_mifnd_400", "div_aclk_mif_400",
  1285. ENABLE_ACLK_MIF1, 1, CLK_IGNORE_UNUSED, 0),
  1286. GATE(CLK_ACLK_CCI, "aclk_cci", "div_aclk_mif_400", ENABLE_ACLK_MIF1,
  1287. 0, CLK_IGNORE_UNUSED, 0),
  1288. /* ENABLE_ACLK_MIF2 */
  1289. GATE(CLK_ACLK_MIFND_266, "aclk_mifnd_266", "div_aclk_mif_266",
  1290. ENABLE_ACLK_MIF2, 20, CLK_IGNORE_UNUSED, 0),
  1291. GATE(CLK_ACLK_PPMU_DREX1S3, "aclk_ppmu_drex1s3", "div_aclk_drex1",
  1292. ENABLE_ACLK_MIF2, 17, CLK_IGNORE_UNUSED, 0),
  1293. GATE(CLK_ACLK_PPMU_DREX1S1, "aclk_ppmu_drex1s1", "div_aclk_drex1",
  1294. ENABLE_ACLK_MIF2, 16, CLK_IGNORE_UNUSED, 0),
  1295. GATE(CLK_ACLK_PPMU_DREX1S0, "aclk_ppmu_drex1s0", "div_aclk_drex1",
  1296. ENABLE_ACLK_MIF2, 15, CLK_IGNORE_UNUSED, 0),
  1297. GATE(CLK_ACLK_PPMU_DREX0S3, "aclk_ppmu_drex0s3", "div_aclk_drex0",
  1298. ENABLE_ACLK_MIF2, 14, CLK_IGNORE_UNUSED, 0),
  1299. GATE(CLK_ACLK_PPMU_DREX0S1, "aclk_ppmu_drex0s1", "div_aclk_drex0",
  1300. ENABLE_ACLK_MIF2, 13, CLK_IGNORE_UNUSED, 0),
  1301. GATE(CLK_ACLK_PPMU_DREX0S0, "aclk_ppmu_drex0s0", "div_aclk_drex0",
  1302. ENABLE_ACLK_MIF2, 12, CLK_IGNORE_UNUSED, 0),
  1303. GATE(CLK_ACLK_AXIDS_CCI_MIFSFRX, "aclk_axids_cci_mifsfrx",
  1304. "div_aclk_mif_200", ENABLE_ACLK_MIF2, 7,
  1305. CLK_IGNORE_UNUSED, 0),
  1306. GATE(CLK_ACLK_AXISYNCDNS_CCI, "aclk_axisyncdns_cci",
  1307. "div_aclk_mif_400", ENABLE_ACLK_MIF2,
  1308. 5, CLK_IGNORE_UNUSED, 0),
  1309. GATE(CLK_ACLK_AXISYNCDN_CCI, "aclk_axisyncdn_cci", "div_aclk_mif_400",
  1310. ENABLE_ACLK_MIF2, 4, CLK_IGNORE_UNUSED, 0),
  1311. GATE(CLK_ACLK_AXISYNCDN_NOC_D, "aclk_axisyncdn_noc_d",
  1312. "div_aclk_mif_200", ENABLE_ACLK_MIF2,
  1313. 3, CLK_IGNORE_UNUSED, 0),
  1314. GATE(CLK_ACLK_ASYNCAPBS_MIF_CSSYS, "aclk_asyncapbs_mif_cssys",
  1315. "div_aclk_mifnd_133", ENABLE_ACLK_MIF2, 0, 0, 0),
  1316. /* ENABLE_ACLK_MIF3 */
  1317. GATE(CLK_ACLK_BUS2_400, "aclk_bus2_400", "div_aclk_bus2_400",
  1318. ENABLE_ACLK_MIF3, 4,
  1319. CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 0),
  1320. GATE(CLK_ACLK_DISP_333, "aclk_disp_333", "div_aclk_disp_333",
  1321. ENABLE_ACLK_MIF3, 1,
  1322. CLK_IS_CRITICAL | CLK_SET_RATE_PARENT, 0),
  1323. GATE(CLK_ACLK_CPIF_200, "aclk_cpif_200", "div_aclk_cpif_200",
  1324. ENABLE_ACLK_MIF3, 0,
  1325. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
  1326. /* ENABLE_PCLK_MIF */
  1327. GATE(CLK_PCLK_PPMU_DREX1S3, "pclk_ppmu_drex1s3", "div_aclk_drex1",
  1328. ENABLE_PCLK_MIF, 29, CLK_IGNORE_UNUSED, 0),
  1329. GATE(CLK_PCLK_PPMU_DREX1S1, "pclk_ppmu_drex1s1", "div_aclk_drex1",
  1330. ENABLE_PCLK_MIF, 28, CLK_IGNORE_UNUSED, 0),
  1331. GATE(CLK_PCLK_PPMU_DREX1S0, "pclk_ppmu_drex1s0", "div_aclk_drex1",
  1332. ENABLE_PCLK_MIF, 27, CLK_IGNORE_UNUSED, 0),
  1333. GATE(CLK_PCLK_PPMU_DREX0S3, "pclk_ppmu_drex0s3", "div_aclk_drex0",
  1334. ENABLE_PCLK_MIF, 26, CLK_IGNORE_UNUSED, 0),
  1335. GATE(CLK_PCLK_PPMU_DREX0S1, "pclk_ppmu_drex0s1", "div_aclk_drex0",
  1336. ENABLE_PCLK_MIF, 25, CLK_IGNORE_UNUSED, 0),
  1337. GATE(CLK_PCLK_PPMU_DREX0S0, "pclk_ppmu_drex0s0", "div_aclk_drex0",
  1338. ENABLE_PCLK_MIF, 24, CLK_IGNORE_UNUSED, 0),
  1339. GATE(CLK_PCLK_ASYNCAXI_NOC_P_CCI, "pclk_asyncaxi_noc_p_cci",
  1340. "div_aclk_mif_133", ENABLE_PCLK_MIF, 21,
  1341. CLK_IGNORE_UNUSED, 0),
  1342. GATE(CLK_PCLK_ASYNCAXI_CP1, "pclk_asyncaxi_cp1", "div_aclk_mif_133",
  1343. ENABLE_PCLK_MIF, 19, 0, 0),
  1344. GATE(CLK_PCLK_ASYNCAXI_CP0, "pclk_asyncaxi_cp0", "div_aclk_mif_133",
  1345. ENABLE_PCLK_MIF, 18, 0, 0),
  1346. GATE(CLK_PCLK_ASYNCAXI_DREX1_3, "pclk_asyncaxi_drex1_3",
  1347. "div_aclk_mif_133", ENABLE_PCLK_MIF, 17, 0, 0),
  1348. GATE(CLK_PCLK_ASYNCAXI_DREX1_1, "pclk_asyncaxi_drex1_1",
  1349. "div_aclk_mif_133", ENABLE_PCLK_MIF, 16, 0, 0),
  1350. GATE(CLK_PCLK_ASYNCAXI_DREX1_0, "pclk_asyncaxi_drex1_0",
  1351. "div_aclk_mif_133", ENABLE_PCLK_MIF, 15, 0, 0),
  1352. GATE(CLK_PCLK_ASYNCAXI_DREX0_3, "pclk_asyncaxi_drex0_3",
  1353. "div_aclk_mif_133", ENABLE_PCLK_MIF, 14, 0, 0),
  1354. GATE(CLK_PCLK_ASYNCAXI_DREX0_1, "pclk_asyncaxi_drex0_1",
  1355. "div_aclk_mif_133", ENABLE_PCLK_MIF, 13, 0, 0),
  1356. GATE(CLK_PCLK_ASYNCAXI_DREX0_0, "pclk_asyncaxi_drex0_0",
  1357. "div_aclk_mif_133", ENABLE_PCLK_MIF, 12, 0, 0),
  1358. GATE(CLK_PCLK_MIFSRVND_133, "pclk_mifsrvnd_133", "div_aclk_mif_133",
  1359. ENABLE_PCLK_MIF, 11, 0, 0),
  1360. GATE(CLK_PCLK_PMU_MIF, "pclk_pmu_mif", "div_aclk_mif_133",
  1361. ENABLE_PCLK_MIF, 10, CLK_IGNORE_UNUSED, 0),
  1362. GATE(CLK_PCLK_SYSREG_MIF, "pclk_sysreg_mif", "div_aclk_mif_133",
  1363. ENABLE_PCLK_MIF, 9, CLK_IGNORE_UNUSED, 0),
  1364. GATE(CLK_PCLK_GPIO_ALIVE, "pclk_gpio_alive", "div_aclk_mif_133",
  1365. ENABLE_PCLK_MIF, 8, CLK_IGNORE_UNUSED, 0),
  1366. GATE(CLK_PCLK_ABB, "pclk_abb", "div_aclk_mif_133",
  1367. ENABLE_PCLK_MIF, 7, 0, 0),
  1368. GATE(CLK_PCLK_PMU_APBIF, "pclk_pmu_apbif", "div_aclk_mif_133",
  1369. ENABLE_PCLK_MIF, 6, CLK_IGNORE_UNUSED, 0),
  1370. GATE(CLK_PCLK_DDR_PHY1, "pclk_ddr_phy1", "div_aclk_mif_133",
  1371. ENABLE_PCLK_MIF, 5, 0, 0),
  1372. GATE(CLK_PCLK_DREX1, "pclk_drex1", "div_aclk_mif_133",
  1373. ENABLE_PCLK_MIF, 3, CLK_IGNORE_UNUSED, 0),
  1374. GATE(CLK_PCLK_DDR_PHY0, "pclk_ddr_phy0", "div_aclk_mif_133",
  1375. ENABLE_PCLK_MIF, 2, 0, 0),
  1376. GATE(CLK_PCLK_DREX0, "pclk_drex0", "div_aclk_mif_133",
  1377. ENABLE_PCLK_MIF, 0, CLK_IGNORE_UNUSED, 0),
  1378. /* ENABLE_PCLK_MIF_SECURE_DREX0_TZ */
  1379. GATE(CLK_PCLK_DREX0_TZ, "pclk_drex0_tz", "div_aclk_mif_133",
  1380. ENABLE_PCLK_MIF_SECURE_DREX0_TZ, 0,
  1381. CLK_IGNORE_UNUSED, 0),
  1382. /* ENABLE_PCLK_MIF_SECURE_DREX1_TZ */
  1383. GATE(CLK_PCLK_DREX1_TZ, "pclk_drex1_tz", "div_aclk_mif_133",
  1384. ENABLE_PCLK_MIF_SECURE_DREX1_TZ, 0,
  1385. CLK_IGNORE_UNUSED, 0),
  1386. /* ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT */
  1387. GATE(CLK_PCLK_MONOTONIC_CNT, "pclk_monotonic_cnt", "div_aclk_mif_133",
  1388. ENABLE_PCLK_MIF_SECURE_MONOTONIC_CNT, 0, 0, 0),
  1389. /* ENABLE_PCLK_MIF_SECURE_RTC */
  1390. GATE(CLK_PCLK_RTC, "pclk_rtc", "div_aclk_mif_133",
  1391. ENABLE_PCLK_MIF_SECURE_RTC, 0, 0, 0),
  1392. /* ENABLE_SCLK_MIF */
  1393. GATE(CLK_SCLK_DSIM1_DISP, "sclk_dsim1_disp", "div_sclk_dsim1",
  1394. ENABLE_SCLK_MIF, 15, CLK_IGNORE_UNUSED, 0),
  1395. GATE(CLK_SCLK_DECON_TV_VCLK_DISP, "sclk_decon_tv_vclk_disp",
  1396. "div_sclk_decon_tv_vclk", ENABLE_SCLK_MIF,
  1397. 14, CLK_IGNORE_UNUSED, 0),
  1398. GATE(CLK_SCLK_DSIM0_DISP, "sclk_dsim0_disp", "div_sclk_dsim0",
  1399. ENABLE_SCLK_MIF, 9, CLK_IGNORE_UNUSED, 0),
  1400. GATE(CLK_SCLK_DSD_DISP, "sclk_dsd_disp", "div_sclk_dsd",
  1401. ENABLE_SCLK_MIF, 8, CLK_IGNORE_UNUSED, 0),
  1402. GATE(CLK_SCLK_DECON_TV_ECLK_DISP, "sclk_decon_tv_eclk_disp",
  1403. "div_sclk_decon_tv_eclk", ENABLE_SCLK_MIF,
  1404. 7, CLK_IGNORE_UNUSED, 0),
  1405. GATE(CLK_SCLK_DECON_VCLK_DISP, "sclk_decon_vclk_disp",
  1406. "div_sclk_decon_vclk", ENABLE_SCLK_MIF,
  1407. 6, CLK_IGNORE_UNUSED, 0),
  1408. GATE(CLK_SCLK_DECON_ECLK_DISP, "sclk_decon_eclk_disp",
  1409. "div_sclk_decon_eclk", ENABLE_SCLK_MIF,
  1410. 5, CLK_IGNORE_UNUSED, 0),
  1411. GATE(CLK_SCLK_HPM_MIF, "sclk_hpm_mif", "div_sclk_hpm_mif",
  1412. ENABLE_SCLK_MIF, 4,
  1413. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
  1414. GATE(CLK_SCLK_MFC_PLL, "sclk_mfc_pll", "mout_mfc_pll_div2",
  1415. ENABLE_SCLK_MIF, 3, CLK_IGNORE_UNUSED, 0),
  1416. GATE(CLK_SCLK_BUS_PLL, "sclk_bus_pll", "mout_bus_pll_div2",
  1417. ENABLE_SCLK_MIF, 2, CLK_IGNORE_UNUSED, 0),
  1418. GATE(CLK_SCLK_BUS_PLL_APOLLO, "sclk_bus_pll_apollo", "sclk_bus_pll",
  1419. ENABLE_SCLK_MIF, 1, CLK_IGNORE_UNUSED, 0),
  1420. GATE(CLK_SCLK_BUS_PLL_ATLAS, "sclk_bus_pll_atlas", "sclk_bus_pll",
  1421. ENABLE_SCLK_MIF, 0, CLK_IGNORE_UNUSED, 0),
  1422. };
  1423. static const struct samsung_cmu_info mif_cmu_info __initconst = {
  1424. .pll_clks = mif_pll_clks,
  1425. .nr_pll_clks = ARRAY_SIZE(mif_pll_clks),
  1426. .mux_clks = mif_mux_clks,
  1427. .nr_mux_clks = ARRAY_SIZE(mif_mux_clks),
  1428. .div_clks = mif_div_clks,
  1429. .nr_div_clks = ARRAY_SIZE(mif_div_clks),
  1430. .gate_clks = mif_gate_clks,
  1431. .nr_gate_clks = ARRAY_SIZE(mif_gate_clks),
  1432. .fixed_factor_clks = mif_fixed_factor_clks,
  1433. .nr_fixed_factor_clks = ARRAY_SIZE(mif_fixed_factor_clks),
  1434. .nr_clk_ids = MIF_NR_CLK,
  1435. .clk_regs = mif_clk_regs,
  1436. .nr_clk_regs = ARRAY_SIZE(mif_clk_regs),
  1437. };
  1438. static void __init exynos5433_cmu_mif_init(struct device_node *np)
  1439. {
  1440. samsung_cmu_register_one(np, &mif_cmu_info);
  1441. }
  1442. CLK_OF_DECLARE(exynos5433_cmu_mif, "samsung,exynos5433-cmu-mif",
  1443. exynos5433_cmu_mif_init);
  1444. /*
  1445. * Register offset definitions for CMU_PERIC
  1446. */
  1447. #define DIV_PERIC 0x0600
  1448. #define DIV_STAT_PERIC 0x0700
  1449. #define ENABLE_ACLK_PERIC 0x0800
  1450. #define ENABLE_PCLK_PERIC0 0x0900
  1451. #define ENABLE_PCLK_PERIC1 0x0904
  1452. #define ENABLE_SCLK_PERIC 0x0A00
  1453. #define ENABLE_IP_PERIC0 0x0B00
  1454. #define ENABLE_IP_PERIC1 0x0B04
  1455. #define ENABLE_IP_PERIC2 0x0B08
  1456. static const unsigned long peric_clk_regs[] __initconst = {
  1457. DIV_PERIC,
  1458. ENABLE_ACLK_PERIC,
  1459. ENABLE_PCLK_PERIC0,
  1460. ENABLE_PCLK_PERIC1,
  1461. ENABLE_SCLK_PERIC,
  1462. ENABLE_IP_PERIC0,
  1463. ENABLE_IP_PERIC1,
  1464. ENABLE_IP_PERIC2,
  1465. };
  1466. static const struct samsung_clk_reg_dump peric_suspend_regs[] = {
  1467. /* pclk: sci, pmu, sysreg, gpio_{finger, ese, touch, nfc}, uart2-0 */
  1468. { ENABLE_PCLK_PERIC0, 0xe00ff000 },
  1469. /* sclk: uart2-0 */
  1470. { ENABLE_SCLK_PERIC, 0x7 },
  1471. };
  1472. static const struct samsung_div_clock peric_div_clks[] __initconst = {
  1473. /* DIV_PERIC */
  1474. DIV(CLK_DIV_SCLK_SCI, "div_sclk_sci", "oscclk", DIV_PERIC, 4, 4),
  1475. DIV(CLK_DIV_SCLK_SC_IN, "div_sclk_sc_in", "oscclk", DIV_PERIC, 0, 4),
  1476. };
  1477. static const struct samsung_gate_clock peric_gate_clks[] __initconst = {
  1478. /* ENABLE_ACLK_PERIC */
  1479. GATE(CLK_ACLK_AHB2APB_PERIC2P, "aclk_ahb2apb_peric2p", "aclk_peric_66",
  1480. ENABLE_ACLK_PERIC, 3, CLK_IGNORE_UNUSED, 0),
  1481. GATE(CLK_ACLK_AHB2APB_PERIC1P, "aclk_ahb2apb_peric1p", "aclk_peric_66",
  1482. ENABLE_ACLK_PERIC, 2, CLK_IGNORE_UNUSED, 0),
  1483. GATE(CLK_ACLK_AHB2APB_PERIC0P, "aclk_ahb2apb_peric0p", "aclk_peric_66",
  1484. ENABLE_ACLK_PERIC, 1, CLK_IGNORE_UNUSED, 0),
  1485. GATE(CLK_ACLK_PERICNP_66, "aclk_pericnp_66", "aclk_peric_66",
  1486. ENABLE_ACLK_PERIC, 0, CLK_IGNORE_UNUSED, 0),
  1487. /* ENABLE_PCLK_PERIC0 */
  1488. GATE(CLK_PCLK_SCI, "pclk_sci", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1489. 31, CLK_SET_RATE_PARENT, 0),
  1490. GATE(CLK_PCLK_GPIO_FINGER, "pclk_gpio_finger", "aclk_peric_66",
  1491. ENABLE_PCLK_PERIC0, 30, CLK_IGNORE_UNUSED, 0),
  1492. GATE(CLK_PCLK_GPIO_ESE, "pclk_gpio_ese", "aclk_peric_66",
  1493. ENABLE_PCLK_PERIC0, 29, CLK_IGNORE_UNUSED, 0),
  1494. GATE(CLK_PCLK_PWM, "pclk_pwm", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1495. 28, CLK_SET_RATE_PARENT, 0),
  1496. GATE(CLK_PCLK_SPDIF, "pclk_spdif", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1497. 26, CLK_SET_RATE_PARENT, 0),
  1498. GATE(CLK_PCLK_PCM1, "pclk_pcm1", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1499. 25, CLK_SET_RATE_PARENT, 0),
  1500. GATE(CLK_PCLK_I2S1, "pclk_i2s", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1501. 24, CLK_SET_RATE_PARENT, 0),
  1502. GATE(CLK_PCLK_SPI2, "pclk_spi2", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1503. 23, CLK_SET_RATE_PARENT, 0),
  1504. GATE(CLK_PCLK_SPI1, "pclk_spi1", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1505. 22, CLK_SET_RATE_PARENT, 0),
  1506. GATE(CLK_PCLK_SPI0, "pclk_spi0", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1507. 21, CLK_SET_RATE_PARENT, 0),
  1508. GATE(CLK_PCLK_ADCIF, "pclk_adcif", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1509. 20, CLK_SET_RATE_PARENT, 0),
  1510. GATE(CLK_PCLK_GPIO_TOUCH, "pclk_gpio_touch", "aclk_peric_66",
  1511. ENABLE_PCLK_PERIC0, 19, CLK_IGNORE_UNUSED, 0),
  1512. GATE(CLK_PCLK_GPIO_NFC, "pclk_gpio_nfc", "aclk_peric_66",
  1513. ENABLE_PCLK_PERIC0, 18, CLK_IGNORE_UNUSED, 0),
  1514. GATE(CLK_PCLK_GPIO_PERIC, "pclk_gpio_peric", "aclk_peric_66",
  1515. ENABLE_PCLK_PERIC0, 17, CLK_IGNORE_UNUSED, 0),
  1516. GATE(CLK_PCLK_PMU_PERIC, "pclk_pmu_peric", "aclk_peric_66",
  1517. ENABLE_PCLK_PERIC0, 16, CLK_SET_RATE_PARENT, 0),
  1518. GATE(CLK_PCLK_SYSREG_PERIC, "pclk_sysreg_peric", "aclk_peric_66",
  1519. ENABLE_PCLK_PERIC0, 15,
  1520. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  1521. GATE(CLK_PCLK_UART2, "pclk_uart2", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1522. 14, CLK_SET_RATE_PARENT, 0),
  1523. GATE(CLK_PCLK_UART1, "pclk_uart1", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1524. 13, CLK_SET_RATE_PARENT, 0),
  1525. GATE(CLK_PCLK_UART0, "pclk_uart0", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1526. 12, CLK_SET_RATE_PARENT, 0),
  1527. GATE(CLK_PCLK_HSI2C3, "pclk_hsi2c3", "aclk_peric_66",
  1528. ENABLE_PCLK_PERIC0, 11, CLK_SET_RATE_PARENT, 0),
  1529. GATE(CLK_PCLK_HSI2C2, "pclk_hsi2c2", "aclk_peric_66",
  1530. ENABLE_PCLK_PERIC0, 10, CLK_SET_RATE_PARENT, 0),
  1531. GATE(CLK_PCLK_HSI2C1, "pclk_hsi2c1", "aclk_peric_66",
  1532. ENABLE_PCLK_PERIC0, 9, CLK_SET_RATE_PARENT, 0),
  1533. GATE(CLK_PCLK_HSI2C0, "pclk_hsi2c0", "aclk_peric_66",
  1534. ENABLE_PCLK_PERIC0, 8, CLK_SET_RATE_PARENT, 0),
  1535. GATE(CLK_PCLK_I2C7, "pclk_i2c7", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1536. 7, CLK_SET_RATE_PARENT, 0),
  1537. GATE(CLK_PCLK_I2C6, "pclk_i2c6", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1538. 6, CLK_SET_RATE_PARENT, 0),
  1539. GATE(CLK_PCLK_I2C5, "pclk_i2c5", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1540. 5, CLK_SET_RATE_PARENT, 0),
  1541. GATE(CLK_PCLK_I2C4, "pclk_i2c4", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1542. 4, CLK_SET_RATE_PARENT, 0),
  1543. GATE(CLK_PCLK_I2C3, "pclk_i2c3", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1544. 3, CLK_SET_RATE_PARENT, 0),
  1545. GATE(CLK_PCLK_I2C2, "pclk_i2c2", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1546. 2, CLK_SET_RATE_PARENT, 0),
  1547. GATE(CLK_PCLK_I2C1, "pclk_i2c1", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1548. 1, CLK_SET_RATE_PARENT, 0),
  1549. GATE(CLK_PCLK_I2C0, "pclk_i2c0", "aclk_peric_66", ENABLE_PCLK_PERIC0,
  1550. 0, CLK_SET_RATE_PARENT, 0),
  1551. /* ENABLE_PCLK_PERIC1 */
  1552. GATE(CLK_PCLK_SPI4, "pclk_spi4", "aclk_peric_66", ENABLE_PCLK_PERIC1,
  1553. 9, CLK_SET_RATE_PARENT, 0),
  1554. GATE(CLK_PCLK_SPI3, "pclk_spi3", "aclk_peric_66", ENABLE_PCLK_PERIC1,
  1555. 8, CLK_SET_RATE_PARENT, 0),
  1556. GATE(CLK_PCLK_HSI2C11, "pclk_hsi2c11", "aclk_peric_66",
  1557. ENABLE_PCLK_PERIC1, 7, CLK_SET_RATE_PARENT, 0),
  1558. GATE(CLK_PCLK_HSI2C10, "pclk_hsi2c10", "aclk_peric_66",
  1559. ENABLE_PCLK_PERIC1, 6, CLK_SET_RATE_PARENT, 0),
  1560. GATE(CLK_PCLK_HSI2C9, "pclk_hsi2c9", "aclk_peric_66",
  1561. ENABLE_PCLK_PERIC1, 5, CLK_SET_RATE_PARENT, 0),
  1562. GATE(CLK_PCLK_HSI2C8, "pclk_hsi2c8", "aclk_peric_66",
  1563. ENABLE_PCLK_PERIC1, 4, CLK_SET_RATE_PARENT, 0),
  1564. GATE(CLK_PCLK_HSI2C7, "pclk_hsi2c7", "aclk_peric_66",
  1565. ENABLE_PCLK_PERIC1, 3, CLK_SET_RATE_PARENT, 0),
  1566. GATE(CLK_PCLK_HSI2C6, "pclk_hsi2c6", "aclk_peric_66",
  1567. ENABLE_PCLK_PERIC1, 2, CLK_SET_RATE_PARENT, 0),
  1568. GATE(CLK_PCLK_HSI2C5, "pclk_hsi2c5", "aclk_peric_66",
  1569. ENABLE_PCLK_PERIC1, 1, CLK_SET_RATE_PARENT, 0),
  1570. GATE(CLK_PCLK_HSI2C4, "pclk_hsi2c4", "aclk_peric_66",
  1571. ENABLE_PCLK_PERIC1, 0, CLK_SET_RATE_PARENT, 0),
  1572. /* ENABLE_SCLK_PERIC */
  1573. GATE(CLK_SCLK_IOCLK_SPI4, "sclk_ioclk_spi4", "ioclk_spi4_clk_in",
  1574. ENABLE_SCLK_PERIC, 21, CLK_SET_RATE_PARENT, 0),
  1575. GATE(CLK_SCLK_IOCLK_SPI3, "sclk_ioclk_spi3", "ioclk_spi3_clk_in",
  1576. ENABLE_SCLK_PERIC, 20, CLK_SET_RATE_PARENT, 0),
  1577. GATE(CLK_SCLK_SPI4, "sclk_spi4", "sclk_spi4_peric", ENABLE_SCLK_PERIC,
  1578. 19, CLK_SET_RATE_PARENT, 0),
  1579. GATE(CLK_SCLK_SPI3, "sclk_spi3", "sclk_spi3_peric", ENABLE_SCLK_PERIC,
  1580. 18, CLK_SET_RATE_PARENT, 0),
  1581. GATE(CLK_SCLK_SCI, "sclk_sci", "div_sclk_sci", ENABLE_SCLK_PERIC,
  1582. 17, 0, 0),
  1583. GATE(CLK_SCLK_SC_IN, "sclk_sc_in", "div_sclk_sc_in", ENABLE_SCLK_PERIC,
  1584. 16, 0, 0),
  1585. GATE(CLK_SCLK_PWM, "sclk_pwm", "oscclk", ENABLE_SCLK_PERIC, 15, 0, 0),
  1586. GATE(CLK_SCLK_IOCLK_SPI2, "sclk_ioclk_spi2", "ioclk_spi2_clk_in",
  1587. ENABLE_SCLK_PERIC, 13, CLK_SET_RATE_PARENT, 0),
  1588. GATE(CLK_SCLK_IOCLK_SPI1, "sclk_ioclk_spi1", "ioclk_spi1_clk_in",
  1589. ENABLE_SCLK_PERIC, 12, CLK_SET_RATE_PARENT, 0),
  1590. GATE(CLK_SCLK_IOCLK_SPI0, "sclk_ioclk_spi0", "ioclk_spi0_clk_in",
  1591. ENABLE_SCLK_PERIC, 11, CLK_SET_RATE_PARENT, 0),
  1592. GATE(CLK_SCLK_IOCLK_I2S1_BCLK, "sclk_ioclk_i2s1_bclk",
  1593. "ioclk_i2s1_bclk_in", ENABLE_SCLK_PERIC, 10,
  1594. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  1595. GATE(CLK_SCLK_SPDIF, "sclk_spdif", "sclk_spdif_peric",
  1596. ENABLE_SCLK_PERIC, 8, CLK_SET_RATE_PARENT, 0),
  1597. GATE(CLK_SCLK_PCM1, "sclk_pcm1", "sclk_pcm1_peric",
  1598. ENABLE_SCLK_PERIC, 7, CLK_SET_RATE_PARENT, 0),
  1599. GATE(CLK_SCLK_I2S1, "sclk_i2s1", "sclk_i2s1_peric",
  1600. ENABLE_SCLK_PERIC, 6, CLK_SET_RATE_PARENT, 0),
  1601. GATE(CLK_SCLK_SPI2, "sclk_spi2", "sclk_spi2_peric", ENABLE_SCLK_PERIC,
  1602. 5, CLK_SET_RATE_PARENT, 0),
  1603. GATE(CLK_SCLK_SPI1, "sclk_spi1", "sclk_spi1_peric", ENABLE_SCLK_PERIC,
  1604. 4, CLK_SET_RATE_PARENT, 0),
  1605. GATE(CLK_SCLK_SPI0, "sclk_spi0", "sclk_spi0_peric", ENABLE_SCLK_PERIC,
  1606. 3, CLK_SET_RATE_PARENT, 0),
  1607. GATE(CLK_SCLK_UART2, "sclk_uart2", "sclk_uart2_peric",
  1608. ENABLE_SCLK_PERIC, 2,
  1609. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  1610. GATE(CLK_SCLK_UART1, "sclk_uart1", "sclk_uart1_peric",
  1611. ENABLE_SCLK_PERIC, 1,
  1612. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  1613. GATE(CLK_SCLK_UART0, "sclk_uart0", "sclk_uart0_peric",
  1614. ENABLE_SCLK_PERIC, 0,
  1615. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED, 0),
  1616. };
  1617. static const struct samsung_cmu_info peric_cmu_info __initconst = {
  1618. .div_clks = peric_div_clks,
  1619. .nr_div_clks = ARRAY_SIZE(peric_div_clks),
  1620. .gate_clks = peric_gate_clks,
  1621. .nr_gate_clks = ARRAY_SIZE(peric_gate_clks),
  1622. .nr_clk_ids = PERIC_NR_CLK,
  1623. .clk_regs = peric_clk_regs,
  1624. .nr_clk_regs = ARRAY_SIZE(peric_clk_regs),
  1625. .suspend_regs = peric_suspend_regs,
  1626. .nr_suspend_regs = ARRAY_SIZE(peric_suspend_regs),
  1627. };
  1628. static void __init exynos5433_cmu_peric_init(struct device_node *np)
  1629. {
  1630. samsung_cmu_register_one(np, &peric_cmu_info);
  1631. }
  1632. CLK_OF_DECLARE(exynos5433_cmu_peric, "samsung,exynos5433-cmu-peric",
  1633. exynos5433_cmu_peric_init);
  1634. /*
  1635. * Register offset definitions for CMU_PERIS
  1636. */
  1637. #define ENABLE_ACLK_PERIS 0x0800
  1638. #define ENABLE_PCLK_PERIS 0x0900
  1639. #define ENABLE_PCLK_PERIS_SECURE_TZPC 0x0904
  1640. #define ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF 0x0908
  1641. #define ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF 0x090c
  1642. #define ENABLE_PCLK_PERIS_SECURE_TOPRTC 0x0910
  1643. #define ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF 0x0914
  1644. #define ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF 0x0918
  1645. #define ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF 0x091c
  1646. #define ENABLE_SCLK_PERIS 0x0a00
  1647. #define ENABLE_SCLK_PERIS_SECURE_SECKEY 0x0a04
  1648. #define ENABLE_SCLK_PERIS_SECURE_CHIPID 0x0a08
  1649. #define ENABLE_SCLK_PERIS_SECURE_TOPRTC 0x0a0c
  1650. #define ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE 0x0a10
  1651. #define ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT 0x0a14
  1652. #define ENABLE_SCLK_PERIS_SECURE_OTP_CON 0x0a18
  1653. #define ENABLE_IP_PERIS0 0x0b00
  1654. #define ENABLE_IP_PERIS1 0x0b04
  1655. #define ENABLE_IP_PERIS_SECURE_TZPC 0x0b08
  1656. #define ENABLE_IP_PERIS_SECURE_SECKEY 0x0b0c
  1657. #define ENABLE_IP_PERIS_SECURE_CHIPID 0x0b10
  1658. #define ENABLE_IP_PERIS_SECURE_TOPRTC 0x0b14
  1659. #define ENABLE_IP_PERIS_SECURE_CUSTOM_EFUSE 0x0b18
  1660. #define ENABLE_IP_PERIS_SECURE_ANTIBRK_CNT 0x0b1c
  1661. #define ENABLE_IP_PERIS_SECURE_OTP_CON 0x0b20
  1662. static const unsigned long peris_clk_regs[] __initconst = {
  1663. ENABLE_ACLK_PERIS,
  1664. ENABLE_PCLK_PERIS,
  1665. ENABLE_PCLK_PERIS_SECURE_TZPC,
  1666. ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF,
  1667. ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF,
  1668. ENABLE_PCLK_PERIS_SECURE_TOPRTC,
  1669. ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF,
  1670. ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF,
  1671. ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF,
  1672. ENABLE_SCLK_PERIS,
  1673. ENABLE_SCLK_PERIS_SECURE_SECKEY,
  1674. ENABLE_SCLK_PERIS_SECURE_CHIPID,
  1675. ENABLE_SCLK_PERIS_SECURE_TOPRTC,
  1676. ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE,
  1677. ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT,
  1678. ENABLE_SCLK_PERIS_SECURE_OTP_CON,
  1679. ENABLE_IP_PERIS0,
  1680. ENABLE_IP_PERIS1,
  1681. ENABLE_IP_PERIS_SECURE_TZPC,
  1682. ENABLE_IP_PERIS_SECURE_SECKEY,
  1683. ENABLE_IP_PERIS_SECURE_CHIPID,
  1684. ENABLE_IP_PERIS_SECURE_TOPRTC,
  1685. ENABLE_IP_PERIS_SECURE_CUSTOM_EFUSE,
  1686. ENABLE_IP_PERIS_SECURE_ANTIBRK_CNT,
  1687. ENABLE_IP_PERIS_SECURE_OTP_CON,
  1688. };
  1689. static const struct samsung_gate_clock peris_gate_clks[] __initconst = {
  1690. /* ENABLE_ACLK_PERIS */
  1691. GATE(CLK_ACLK_AHB2APB_PERIS1P, "aclk_ahb2apb_peris1p", "aclk_peris_66",
  1692. ENABLE_ACLK_PERIS, 2, CLK_IGNORE_UNUSED, 0),
  1693. GATE(CLK_ACLK_AHB2APB_PERIS0P, "aclk_ahb2apb_peris0p", "aclk_peris_66",
  1694. ENABLE_ACLK_PERIS, 1, CLK_IGNORE_UNUSED, 0),
  1695. GATE(CLK_ACLK_PERISNP_66, "aclk_perisnp_66", "aclk_peris_66",
  1696. ENABLE_ACLK_PERIS, 0, CLK_IGNORE_UNUSED, 0),
  1697. /* ENABLE_PCLK_PERIS */
  1698. GATE(CLK_PCLK_HPM_APBIF, "pclk_hpm_apbif", "aclk_peris_66",
  1699. ENABLE_PCLK_PERIS, 30, CLK_IGNORE_UNUSED, 0),
  1700. GATE(CLK_PCLK_TMU1_APBIF, "pclk_tmu1_apbif", "aclk_peris_66",
  1701. ENABLE_PCLK_PERIS, 24, CLK_IGNORE_UNUSED, 0),
  1702. GATE(CLK_PCLK_TMU0_APBIF, "pclk_tmu0_apbif", "aclk_peris_66",
  1703. ENABLE_PCLK_PERIS, 23, CLK_IGNORE_UNUSED, 0),
  1704. GATE(CLK_PCLK_PMU_PERIS, "pclk_pmu_peris", "aclk_peris_66",
  1705. ENABLE_PCLK_PERIS, 22, CLK_IGNORE_UNUSED, 0),
  1706. GATE(CLK_PCLK_SYSREG_PERIS, "pclk_sysreg_peris", "aclk_peris_66",
  1707. ENABLE_PCLK_PERIS, 21, CLK_IGNORE_UNUSED, 0),
  1708. GATE(CLK_PCLK_CMU_TOP_APBIF, "pclk_cmu_top_apbif", "aclk_peris_66",
  1709. ENABLE_PCLK_PERIS, 20, CLK_IGNORE_UNUSED, 0),
  1710. GATE(CLK_PCLK_WDT_APOLLO, "pclk_wdt_apollo", "aclk_peris_66",
  1711. ENABLE_PCLK_PERIS, 17, CLK_IGNORE_UNUSED, 0),
  1712. GATE(CLK_PCLK_WDT_ATLAS, "pclk_wdt_atlas", "aclk_peris_66",
  1713. ENABLE_PCLK_PERIS, 16, CLK_IGNORE_UNUSED, 0),
  1714. GATE(CLK_PCLK_MCT, "pclk_mct", "aclk_peris_66",
  1715. ENABLE_PCLK_PERIS, 15, CLK_IGNORE_UNUSED, 0),
  1716. GATE(CLK_PCLK_HDMI_CEC, "pclk_hdmi_cec", "aclk_peris_66",
  1717. ENABLE_PCLK_PERIS, 14, CLK_IGNORE_UNUSED, 0),
  1718. /* ENABLE_PCLK_PERIS_SECURE_TZPC */
  1719. GATE(CLK_PCLK_TZPC12, "pclk_tzpc12", "aclk_peris_66",
  1720. ENABLE_PCLK_PERIS_SECURE_TZPC, 12, CLK_IGNORE_UNUSED, 0),
  1721. GATE(CLK_PCLK_TZPC11, "pclk_tzpc11", "aclk_peris_66",
  1722. ENABLE_PCLK_PERIS_SECURE_TZPC, 11, CLK_IGNORE_UNUSED, 0),
  1723. GATE(CLK_PCLK_TZPC10, "pclk_tzpc10", "aclk_peris_66",
  1724. ENABLE_PCLK_PERIS_SECURE_TZPC, 10, CLK_IGNORE_UNUSED, 0),
  1725. GATE(CLK_PCLK_TZPC9, "pclk_tzpc9", "aclk_peris_66",
  1726. ENABLE_PCLK_PERIS_SECURE_TZPC, 9, CLK_IGNORE_UNUSED, 0),
  1727. GATE(CLK_PCLK_TZPC8, "pclk_tzpc8", "aclk_peris_66",
  1728. ENABLE_PCLK_PERIS_SECURE_TZPC, 8, CLK_IGNORE_UNUSED, 0),
  1729. GATE(CLK_PCLK_TZPC7, "pclk_tzpc7", "aclk_peris_66",
  1730. ENABLE_PCLK_PERIS_SECURE_TZPC, 7, CLK_IGNORE_UNUSED, 0),
  1731. GATE(CLK_PCLK_TZPC6, "pclk_tzpc6", "aclk_peris_66",
  1732. ENABLE_PCLK_PERIS_SECURE_TZPC, 6, CLK_IGNORE_UNUSED, 0),
  1733. GATE(CLK_PCLK_TZPC5, "pclk_tzpc5", "aclk_peris_66",
  1734. ENABLE_PCLK_PERIS_SECURE_TZPC, 5, CLK_IGNORE_UNUSED, 0),
  1735. GATE(CLK_PCLK_TZPC4, "pclk_tzpc4", "aclk_peris_66",
  1736. ENABLE_PCLK_PERIS_SECURE_TZPC, 4, CLK_IGNORE_UNUSED, 0),
  1737. GATE(CLK_PCLK_TZPC3, "pclk_tzpc3", "aclk_peris_66",
  1738. ENABLE_PCLK_PERIS_SECURE_TZPC, 3, CLK_IGNORE_UNUSED, 0),
  1739. GATE(CLK_PCLK_TZPC2, "pclk_tzpc2", "aclk_peris_66",
  1740. ENABLE_PCLK_PERIS_SECURE_TZPC, 2, CLK_IGNORE_UNUSED, 0),
  1741. GATE(CLK_PCLK_TZPC1, "pclk_tzpc1", "aclk_peris_66",
  1742. ENABLE_PCLK_PERIS_SECURE_TZPC, 1, CLK_IGNORE_UNUSED, 0),
  1743. GATE(CLK_PCLK_TZPC0, "pclk_tzpc0", "aclk_peris_66",
  1744. ENABLE_PCLK_PERIS_SECURE_TZPC, 0, CLK_IGNORE_UNUSED, 0),
  1745. /* ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF */
  1746. GATE(CLK_PCLK_SECKEY_APBIF, "pclk_seckey_apbif", "aclk_peris_66",
  1747. ENABLE_PCLK_PERIS_SECURE_SECKEY_APBIF, 0, CLK_IGNORE_UNUSED, 0),
  1748. /* ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF */
  1749. GATE(CLK_PCLK_CHIPID_APBIF, "pclk_chipid_apbif", "aclk_peris_66",
  1750. ENABLE_PCLK_PERIS_SECURE_CHIPID_APBIF, 0, CLK_IGNORE_UNUSED, 0),
  1751. /* ENABLE_PCLK_PERIS_SECURE_TOPRTC */
  1752. GATE(CLK_PCLK_TOPRTC, "pclk_toprtc", "aclk_peris_66",
  1753. ENABLE_PCLK_PERIS_SECURE_TOPRTC, 0, 0, 0),
  1754. /* ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF */
  1755. GATE(CLK_PCLK_CUSTOM_EFUSE_APBIF, "pclk_custom_efuse_apbif",
  1756. "aclk_peris_66",
  1757. ENABLE_PCLK_PERIS_SECURE_CUSTOM_EFUSE_APBIF, 0, 0, 0),
  1758. /* ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF */
  1759. GATE(CLK_PCLK_ANTIRBK_CNT_APBIF, "pclk_antirbk_cnt_apbif",
  1760. "aclk_peris_66",
  1761. ENABLE_PCLK_PERIS_SECURE_ANTIRBK_CNT_APBIF, 0, 0, 0),
  1762. /* ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF */
  1763. GATE(CLK_PCLK_OTP_CON_APBIF, "pclk_otp_con_apbif",
  1764. "aclk_peris_66",
  1765. ENABLE_PCLK_PERIS_SECURE_OTP_CON_APBIF, 0, 0, 0),
  1766. /* ENABLE_SCLK_PERIS */
  1767. GATE(CLK_SCLK_ASV_TB, "sclk_asv_tb", "oscclk_efuse_common",
  1768. ENABLE_SCLK_PERIS, 10, 0, 0),
  1769. GATE(CLK_SCLK_TMU1, "sclk_tmu1", "oscclk_efuse_common",
  1770. ENABLE_SCLK_PERIS, 4, 0, 0),
  1771. GATE(CLK_SCLK_TMU0, "sclk_tmu0", "oscclk_efuse_common",
  1772. ENABLE_SCLK_PERIS, 3, 0, 0),
  1773. /* ENABLE_SCLK_PERIS_SECURE_SECKEY */
  1774. GATE(CLK_SCLK_SECKEY, "sclk_seckey", "oscclk_efuse_common",
  1775. ENABLE_SCLK_PERIS_SECURE_SECKEY, 0, CLK_IGNORE_UNUSED, 0),
  1776. /* ENABLE_SCLK_PERIS_SECURE_CHIPID */
  1777. GATE(CLK_SCLK_CHIPID, "sclk_chipid", "oscclk_efuse_common",
  1778. ENABLE_SCLK_PERIS_SECURE_CHIPID, 0, CLK_IGNORE_UNUSED, 0),
  1779. /* ENABLE_SCLK_PERIS_SECURE_TOPRTC */
  1780. GATE(CLK_SCLK_TOPRTC, "sclk_toprtc", "oscclk_efuse_common",
  1781. ENABLE_SCLK_PERIS_SECURE_TOPRTC, 0, 0, 0),
  1782. /* ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE */
  1783. GATE(CLK_SCLK_CUSTOM_EFUSE, "sclk_custom_efuse", "oscclk_efuse_common",
  1784. ENABLE_SCLK_PERIS_SECURE_CUSTOM_EFUSE, 0, 0, 0),
  1785. /* ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT */
  1786. GATE(CLK_SCLK_ANTIRBK_CNT, "sclk_antirbk_cnt", "oscclk_efuse_common",
  1787. ENABLE_SCLK_PERIS_SECURE_ANTIRBK_CNT, 0, 0, 0),
  1788. /* ENABLE_SCLK_PERIS_SECURE_OTP_CON */
  1789. GATE(CLK_SCLK_OTP_CON, "sclk_otp_con", "oscclk_efuse_common",
  1790. ENABLE_SCLK_PERIS_SECURE_OTP_CON, 0, 0, 0),
  1791. };
  1792. static const struct samsung_cmu_info peris_cmu_info __initconst = {
  1793. .gate_clks = peris_gate_clks,
  1794. .nr_gate_clks = ARRAY_SIZE(peris_gate_clks),
  1795. .nr_clk_ids = PERIS_NR_CLK,
  1796. .clk_regs = peris_clk_regs,
  1797. .nr_clk_regs = ARRAY_SIZE(peris_clk_regs),
  1798. };
  1799. static void __init exynos5433_cmu_peris_init(struct device_node *np)
  1800. {
  1801. samsung_cmu_register_one(np, &peris_cmu_info);
  1802. }
  1803. CLK_OF_DECLARE(exynos5433_cmu_peris, "samsung,exynos5433-cmu-peris",
  1804. exynos5433_cmu_peris_init);
  1805. /*
  1806. * Register offset definitions for CMU_FSYS
  1807. */
  1808. #define MUX_SEL_FSYS0 0x0200
  1809. #define MUX_SEL_FSYS1 0x0204
  1810. #define MUX_SEL_FSYS2 0x0208
  1811. #define MUX_SEL_FSYS3 0x020c
  1812. #define MUX_SEL_FSYS4 0x0210
  1813. #define MUX_ENABLE_FSYS0 0x0300
  1814. #define MUX_ENABLE_FSYS1 0x0304
  1815. #define MUX_ENABLE_FSYS2 0x0308
  1816. #define MUX_ENABLE_FSYS3 0x030c
  1817. #define MUX_ENABLE_FSYS4 0x0310
  1818. #define MUX_STAT_FSYS0 0x0400
  1819. #define MUX_STAT_FSYS1 0x0404
  1820. #define MUX_STAT_FSYS2 0x0408
  1821. #define MUX_STAT_FSYS3 0x040c
  1822. #define MUX_STAT_FSYS4 0x0410
  1823. #define MUX_IGNORE_FSYS2 0x0508
  1824. #define MUX_IGNORE_FSYS3 0x050c
  1825. #define ENABLE_ACLK_FSYS0 0x0800
  1826. #define ENABLE_ACLK_FSYS1 0x0804
  1827. #define ENABLE_PCLK_FSYS 0x0900
  1828. #define ENABLE_SCLK_FSYS 0x0a00
  1829. #define ENABLE_IP_FSYS0 0x0b00
  1830. #define ENABLE_IP_FSYS1 0x0b04
  1831. /* list of all parent clock list */
  1832. PNAME(mout_sclk_ufs_mphy_user_p) = { "oscclk", "sclk_ufs_mphy", };
  1833. PNAME(mout_aclk_fsys_200_user_p) = { "oscclk", "aclk_fsys_200", };
  1834. PNAME(mout_sclk_pcie_100_user_p) = { "oscclk", "sclk_pcie_100_fsys",};
  1835. PNAME(mout_sclk_ufsunipro_user_p) = { "oscclk", "sclk_ufsunipro_fsys",};
  1836. PNAME(mout_sclk_mmc2_user_p) = { "oscclk", "sclk_mmc2_fsys", };
  1837. PNAME(mout_sclk_mmc1_user_p) = { "oscclk", "sclk_mmc1_fsys", };
  1838. PNAME(mout_sclk_mmc0_user_p) = { "oscclk", "sclk_mmc0_fsys", };
  1839. PNAME(mout_sclk_usbhost30_user_p) = { "oscclk", "sclk_usbhost30_fsys",};
  1840. PNAME(mout_sclk_usbdrd30_user_p) = { "oscclk", "sclk_usbdrd30_fsys", };
  1841. PNAME(mout_phyclk_usbhost30_uhost30_pipe_pclk_user_p)
  1842. = { "oscclk", "phyclk_usbhost30_uhost30_pipe_pclk_phy", };
  1843. PNAME(mout_phyclk_usbhost30_uhost30_phyclock_user_p)
  1844. = { "oscclk", "phyclk_usbhost30_uhost30_phyclock_phy", };
  1845. PNAME(mout_phyclk_usbhost20_phy_hsic1_p)
  1846. = { "oscclk", "phyclk_usbhost20_phy_hsic1_phy", };
  1847. PNAME(mout_phyclk_usbhost20_phy_clk48mohci_user_p)
  1848. = { "oscclk", "phyclk_usbhost20_phy_clk48mohci_phy", };
  1849. PNAME(mout_phyclk_usbhost20_phy_phyclock_user_p)
  1850. = { "oscclk", "phyclk_usbhost20_phy_phyclock_phy", };
  1851. PNAME(mout_phyclk_usbhost20_phy_freeclk_user_p)
  1852. = { "oscclk", "phyclk_usbhost20_phy_freeclk_phy", };
  1853. PNAME(mout_phyclk_usbdrd30_udrd30_pipe_pclk_p)
  1854. = { "oscclk", "phyclk_usbdrd30_udrd30_pipe_pclk_phy", };
  1855. PNAME(mout_phyclk_usbdrd30_udrd30_phyclock_user_p)
  1856. = { "oscclk", "phyclk_usbdrd30_udrd30_phyclock_phy", };
  1857. PNAME(mout_phyclk_ufs_rx1_symbol_user_p)
  1858. = { "oscclk", "phyclk_ufs_rx1_symbol_phy", };
  1859. PNAME(mout_phyclk_ufs_rx0_symbol_user_p)
  1860. = { "oscclk", "phyclk_ufs_rx0_symbol_phy", };
  1861. PNAME(mout_phyclk_ufs_tx1_symbol_user_p)
  1862. = { "oscclk", "phyclk_ufs_tx1_symbol_phy", };
  1863. PNAME(mout_phyclk_ufs_tx0_symbol_user_p)
  1864. = { "oscclk", "phyclk_ufs_tx0_symbol_phy", };
  1865. PNAME(mout_phyclk_lli_mphy_to_ufs_user_p)
  1866. = { "oscclk", "phyclk_lli_mphy_to_ufs_phy", };
  1867. PNAME(mout_sclk_mphy_p)
  1868. = { "mout_sclk_ufs_mphy_user",
  1869. "mout_phyclk_lli_mphy_to_ufs_user", };
  1870. static const unsigned long fsys_clk_regs[] __initconst = {
  1871. MUX_SEL_FSYS0,
  1872. MUX_SEL_FSYS1,
  1873. MUX_SEL_FSYS2,
  1874. MUX_SEL_FSYS3,
  1875. MUX_SEL_FSYS4,
  1876. MUX_ENABLE_FSYS0,
  1877. MUX_ENABLE_FSYS1,
  1878. MUX_ENABLE_FSYS2,
  1879. MUX_ENABLE_FSYS3,
  1880. MUX_ENABLE_FSYS4,
  1881. MUX_IGNORE_FSYS2,
  1882. MUX_IGNORE_FSYS3,
  1883. ENABLE_ACLK_FSYS0,
  1884. ENABLE_ACLK_FSYS1,
  1885. ENABLE_PCLK_FSYS,
  1886. ENABLE_SCLK_FSYS,
  1887. ENABLE_IP_FSYS0,
  1888. ENABLE_IP_FSYS1,
  1889. };
  1890. static const struct samsung_clk_reg_dump fsys_suspend_regs[] = {
  1891. { MUX_SEL_FSYS0, 0 },
  1892. { MUX_SEL_FSYS1, 0 },
  1893. { MUX_SEL_FSYS2, 0 },
  1894. { MUX_SEL_FSYS3, 0 },
  1895. { MUX_SEL_FSYS4, 0 },
  1896. };
  1897. static const struct samsung_fixed_rate_clock fsys_fixed_clks[] __initconst = {
  1898. /* PHY clocks from USBDRD30_PHY */
  1899. FRATE(CLK_PHYCLK_USBDRD30_UDRD30_PHYCLOCK_PHY,
  1900. "phyclk_usbdrd30_udrd30_phyclock_phy", NULL,
  1901. 0, 60000000),
  1902. FRATE(CLK_PHYCLK_USBDRD30_UDRD30_PIPE_PCLK_PHY,
  1903. "phyclk_usbdrd30_udrd30_pipe_pclk_phy", NULL,
  1904. 0, 125000000),
  1905. /* PHY clocks from USBHOST30_PHY */
  1906. FRATE(CLK_PHYCLK_USBHOST30_UHOST30_PHYCLOCK_PHY,
  1907. "phyclk_usbhost30_uhost30_phyclock_phy", NULL,
  1908. 0, 60000000),
  1909. FRATE(CLK_PHYCLK_USBHOST30_UHOST30_PIPE_PCLK_PHY,
  1910. "phyclk_usbhost30_uhost30_pipe_pclk_phy", NULL,
  1911. 0, 125000000),
  1912. /* PHY clocks from USBHOST20_PHY */
  1913. FRATE(CLK_PHYCLK_USBHOST20_PHY_FREECLK_PHY,
  1914. "phyclk_usbhost20_phy_freeclk_phy", NULL, 0, 60000000),
  1915. FRATE(CLK_PHYCLK_USBHOST20_PHY_PHYCLOCK_PHY,
  1916. "phyclk_usbhost20_phy_phyclock_phy", NULL, 0, 60000000),
  1917. FRATE(CLK_PHYCLK_USBHOST20_PHY_CLK48MOHCI_PHY,
  1918. "phyclk_usbhost20_phy_clk48mohci_phy", NULL,
  1919. 0, 48000000),
  1920. FRATE(CLK_PHYCLK_USBHOST20_PHY_HSIC1_PHY,
  1921. "phyclk_usbhost20_phy_hsic1_phy", NULL, 0,
  1922. 60000000),
  1923. /* PHY clocks from UFS_PHY */
  1924. FRATE(CLK_PHYCLK_UFS_TX0_SYMBOL_PHY, "phyclk_ufs_tx0_symbol_phy",
  1925. NULL, 0, 300000000),
  1926. FRATE(CLK_PHYCLK_UFS_RX0_SYMBOL_PHY, "phyclk_ufs_rx0_symbol_phy",
  1927. NULL, 0, 300000000),
  1928. FRATE(CLK_PHYCLK_UFS_TX1_SYMBOL_PHY, "phyclk_ufs_tx1_symbol_phy",
  1929. NULL, 0, 300000000),
  1930. FRATE(CLK_PHYCLK_UFS_RX1_SYMBOL_PHY, "phyclk_ufs_rx1_symbol_phy",
  1931. NULL, 0, 300000000),
  1932. /* PHY clocks from LLI_PHY */
  1933. FRATE(CLK_PHYCLK_LLI_MPHY_TO_UFS_PHY, "phyclk_lli_mphy_to_ufs_phy",
  1934. NULL, 0, 26000000),
  1935. };
  1936. static const struct samsung_mux_clock fsys_mux_clks[] __initconst = {
  1937. /* MUX_SEL_FSYS0 */
  1938. MUX(CLK_MOUT_SCLK_UFS_MPHY_USER, "mout_sclk_ufs_mphy_user",
  1939. mout_sclk_ufs_mphy_user_p, MUX_SEL_FSYS0, 4, 1),
  1940. MUX(CLK_MOUT_ACLK_FSYS_200_USER, "mout_aclk_fsys_200_user",
  1941. mout_aclk_fsys_200_user_p, MUX_SEL_FSYS0, 0, 1),
  1942. /* MUX_SEL_FSYS1 */
  1943. MUX(CLK_MOUT_SCLK_PCIE_100_USER, "mout_sclk_pcie_100_user",
  1944. mout_sclk_pcie_100_user_p, MUX_SEL_FSYS1, 28, 1),
  1945. MUX(CLK_MOUT_SCLK_UFSUNIPRO_USER, "mout_sclk_ufsunipro_user",
  1946. mout_sclk_ufsunipro_user_p, MUX_SEL_FSYS1, 24, 1),
  1947. MUX(CLK_MOUT_SCLK_MMC2_USER, "mout_sclk_mmc2_user",
  1948. mout_sclk_mmc2_user_p, MUX_SEL_FSYS1, 20, 1),
  1949. MUX(CLK_MOUT_SCLK_MMC1_USER, "mout_sclk_mmc1_user",
  1950. mout_sclk_mmc1_user_p, MUX_SEL_FSYS1, 16, 1),
  1951. MUX(CLK_MOUT_SCLK_MMC0_USER, "mout_sclk_mmc0_user",
  1952. mout_sclk_mmc0_user_p, MUX_SEL_FSYS1, 12, 1),
  1953. MUX(CLK_MOUT_SCLK_USBHOST30_USER, "mout_sclk_usbhost30_user",
  1954. mout_sclk_usbhost30_user_p, MUX_SEL_FSYS1, 4, 1),
  1955. MUX(CLK_MOUT_SCLK_USBDRD30_USER, "mout_sclk_usbdrd30_user",
  1956. mout_sclk_usbdrd30_user_p, MUX_SEL_FSYS1, 0, 1),
  1957. /* MUX_SEL_FSYS2 */
  1958. MUX(CLK_MOUT_PHYCLK_USBHOST30_UHOST30_PIPE_PCLK_USER,
  1959. "mout_phyclk_usbhost30_uhost30_pipe_pclk_user",
  1960. mout_phyclk_usbhost30_uhost30_pipe_pclk_user_p,
  1961. MUX_SEL_FSYS2, 28, 1),
  1962. MUX(CLK_MOUT_PHYCLK_USBHOST30_UHOST30_PHYCLOCK_USER,
  1963. "mout_phyclk_usbhost30_uhost30_phyclock_user",
  1964. mout_phyclk_usbhost30_uhost30_phyclock_user_p,
  1965. MUX_SEL_FSYS2, 24, 1),
  1966. MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_HSIC1_USER,
  1967. "mout_phyclk_usbhost20_phy_hsic1",
  1968. mout_phyclk_usbhost20_phy_hsic1_p,
  1969. MUX_SEL_FSYS2, 20, 1),
  1970. MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_CLK48MOHCI_USER,
  1971. "mout_phyclk_usbhost20_phy_clk48mohci_user",
  1972. mout_phyclk_usbhost20_phy_clk48mohci_user_p,
  1973. MUX_SEL_FSYS2, 16, 1),
  1974. MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_PHYCLOCK_USER,
  1975. "mout_phyclk_usbhost20_phy_phyclock_user",
  1976. mout_phyclk_usbhost20_phy_phyclock_user_p,
  1977. MUX_SEL_FSYS2, 12, 1),
  1978. MUX(CLK_MOUT_PHYCLK_USBHOST20_PHY_PHY_FREECLK_USER,
  1979. "mout_phyclk_usbhost20_phy_freeclk_user",
  1980. mout_phyclk_usbhost20_phy_freeclk_user_p,
  1981. MUX_SEL_FSYS2, 8, 1),
  1982. MUX(CLK_MOUT_PHYCLK_USBDRD30_UDRD30_PIPE_PCLK_USER,
  1983. "mout_phyclk_usbdrd30_udrd30_pipe_pclk_user",
  1984. mout_phyclk_usbdrd30_udrd30_pipe_pclk_p,
  1985. MUX_SEL_FSYS2, 4, 1),
  1986. MUX(CLK_MOUT_PHYCLK_USBDRD30_UDRD30_PHYCLOCK_USER,
  1987. "mout_phyclk_usbdrd30_udrd30_phyclock_user",
  1988. mout_phyclk_usbdrd30_udrd30_phyclock_user_p,
  1989. MUX_SEL_FSYS2, 0, 1),
  1990. /* MUX_SEL_FSYS3 */
  1991. MUX(CLK_MOUT_PHYCLK_UFS_RX1_SYMBOL_USER,
  1992. "mout_phyclk_ufs_rx1_symbol_user",
  1993. mout_phyclk_ufs_rx1_symbol_user_p,
  1994. MUX_SEL_FSYS3, 16, 1),
  1995. MUX(CLK_MOUT_PHYCLK_UFS_RX0_SYMBOL_USER,
  1996. "mout_phyclk_ufs_rx0_symbol_user",
  1997. mout_phyclk_ufs_rx0_symbol_user_p,
  1998. MUX_SEL_FSYS3, 12, 1),
  1999. MUX(CLK_MOUT_PHYCLK_UFS_TX1_SYMBOL_USER,
  2000. "mout_phyclk_ufs_tx1_symbol_user",
  2001. mout_phyclk_ufs_tx1_symbol_user_p,
  2002. MUX_SEL_FSYS3, 8, 1),
  2003. MUX(CLK_MOUT_PHYCLK_UFS_TX0_SYMBOL_USER,
  2004. "mout_phyclk_ufs_tx0_symbol_user",
  2005. mout_phyclk_ufs_tx0_symbol_user_p,
  2006. MUX_SEL_FSYS3, 4, 1),
  2007. MUX(CLK_MOUT_PHYCLK_LLI_MPHY_TO_UFS_USER,
  2008. "mout_phyclk_lli_mphy_to_ufs_user",
  2009. mout_phyclk_lli_mphy_to_ufs_user_p,
  2010. MUX_SEL_FSYS3, 0, 1),
  2011. /* MUX_SEL_FSYS4 */
  2012. MUX(CLK_MOUT_SCLK_MPHY, "mout_sclk_mphy", mout_sclk_mphy_p,
  2013. MUX_SEL_FSYS4, 0, 1),
  2014. };
  2015. static const struct samsung_gate_clock fsys_gate_clks[] __initconst = {
  2016. /* ENABLE_ACLK_FSYS0 */
  2017. GATE(CLK_ACLK_PCIE, "aclk_pcie", "mout_aclk_fsys_200_user",
  2018. ENABLE_ACLK_FSYS0, 13, CLK_IGNORE_UNUSED, 0),
  2019. GATE(CLK_ACLK_PDMA1, "aclk_pdma1", "mout_aclk_fsys_200_user",
  2020. ENABLE_ACLK_FSYS0, 11, CLK_IGNORE_UNUSED, 0),
  2021. GATE(CLK_ACLK_TSI, "aclk_tsi", "mout_aclk_fsys_200_user",
  2022. ENABLE_ACLK_FSYS0, 10, CLK_IGNORE_UNUSED, 0),
  2023. GATE(CLK_ACLK_MMC2, "aclk_mmc2", "mout_aclk_fsys_200_user",
  2024. ENABLE_ACLK_FSYS0, 8, CLK_IGNORE_UNUSED, 0),
  2025. GATE(CLK_ACLK_MMC1, "aclk_mmc1", "mout_aclk_fsys_200_user",
  2026. ENABLE_ACLK_FSYS0, 7, CLK_IGNORE_UNUSED, 0),
  2027. GATE(CLK_ACLK_MMC0, "aclk_mmc0", "mout_aclk_fsys_200_user",
  2028. ENABLE_ACLK_FSYS0, 6, CLK_IGNORE_UNUSED, 0),
  2029. GATE(CLK_ACLK_UFS, "aclk_ufs", "mout_aclk_fsys_200_user",
  2030. ENABLE_ACLK_FSYS0, 5, CLK_IGNORE_UNUSED, 0),
  2031. GATE(CLK_ACLK_USBHOST20, "aclk_usbhost20", "mout_aclk_fsys_200_user",
  2032. ENABLE_ACLK_FSYS0, 3, CLK_IGNORE_UNUSED, 0),
  2033. GATE(CLK_ACLK_USBHOST30, "aclk_usbhost30", "mout_aclk_fsys_200_user",
  2034. ENABLE_ACLK_FSYS0, 2, CLK_IGNORE_UNUSED, 0),
  2035. GATE(CLK_ACLK_USBDRD30, "aclk_usbdrd30", "mout_aclk_fsys_200_user",
  2036. ENABLE_ACLK_FSYS0, 1, CLK_IGNORE_UNUSED, 0),
  2037. GATE(CLK_ACLK_PDMA0, "aclk_pdma0", "mout_aclk_fsys_200_user",
  2038. ENABLE_ACLK_FSYS0, 0, CLK_IGNORE_UNUSED, 0),
  2039. /* ENABLE_ACLK_FSYS1 */
  2040. GATE(CLK_ACLK_XIU_FSYSPX, "aclk_xiu_fsyspx", "mout_aclk_fsys_200_user",
  2041. ENABLE_ACLK_FSYS1, 27, CLK_IGNORE_UNUSED, 0),
  2042. GATE(CLK_ACLK_AHB_USBLINKH1, "aclk_ahb_usblinkh1",
  2043. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2044. 26, CLK_IGNORE_UNUSED, 0),
  2045. GATE(CLK_ACLK_SMMU_PDMA1, "aclk_smmu_pdma1", "mout_aclk_fsys_200_user",
  2046. ENABLE_ACLK_FSYS1, 25, CLK_IGNORE_UNUSED, 0),
  2047. GATE(CLK_ACLK_BTS_PCIE, "aclk_bts_pcie", "mout_aclk_fsys_200_user",
  2048. ENABLE_ACLK_FSYS1, 24, CLK_IGNORE_UNUSED, 0),
  2049. GATE(CLK_ACLK_AXIUS_PDMA1, "aclk_axius_pdma1",
  2050. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2051. 22, CLK_IGNORE_UNUSED, 0),
  2052. GATE(CLK_ACLK_SMMU_PDMA0, "aclk_smmu_pdma0", "mout_aclk_fsys_200_user",
  2053. ENABLE_ACLK_FSYS1, 17, CLK_IGNORE_UNUSED, 0),
  2054. GATE(CLK_ACLK_BTS_UFS, "aclk_bts_ufs", "mout_aclk_fsys_200_user",
  2055. ENABLE_ACLK_FSYS1, 14, CLK_IGNORE_UNUSED, 0),
  2056. GATE(CLK_ACLK_BTS_USBHOST30, "aclk_bts_usbhost30",
  2057. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2058. 13, 0, 0),
  2059. GATE(CLK_ACLK_BTS_USBDRD30, "aclk_bts_usbdrd30",
  2060. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2061. 12, 0, 0),
  2062. GATE(CLK_ACLK_AXIUS_PDMA0, "aclk_axius_pdma0",
  2063. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2064. 11, CLK_IGNORE_UNUSED, 0),
  2065. GATE(CLK_ACLK_AXIUS_USBHS, "aclk_axius_usbhs",
  2066. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2067. 10, CLK_IGNORE_UNUSED, 0),
  2068. GATE(CLK_ACLK_AXIUS_FSYSSX, "aclk_axius_fsyssx",
  2069. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2070. 9, CLK_IGNORE_UNUSED, 0),
  2071. GATE(CLK_ACLK_AHB2APB_FSYSP, "aclk_ahb2apb_fsysp",
  2072. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2073. 8, CLK_IGNORE_UNUSED, 0),
  2074. GATE(CLK_ACLK_AHB2AXI_USBHS, "aclk_ahb2axi_usbhs",
  2075. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2076. 7, CLK_IGNORE_UNUSED, 0),
  2077. GATE(CLK_ACLK_AHB_USBLINKH0, "aclk_ahb_usblinkh0",
  2078. "mout_aclk_fsys_200_user", ENABLE_ACLK_FSYS1,
  2079. 6, CLK_IGNORE_UNUSED, 0),
  2080. GATE(CLK_ACLK_AHB_USBHS, "aclk_ahb_usbhs", "mout_aclk_fsys_200_user",
  2081. ENABLE_ACLK_FSYS1, 5, CLK_IGNORE_UNUSED, 0),
  2082. GATE(CLK_ACLK_AHB_FSYSH, "aclk_ahb_fsysh", "mout_aclk_fsys_200_user",
  2083. ENABLE_ACLK_FSYS1, 4, CLK_IGNORE_UNUSED, 0),
  2084. GATE(CLK_ACLK_XIU_FSYSX, "aclk_xiu_fsysx", "mout_aclk_fsys_200_user",
  2085. ENABLE_ACLK_FSYS1, 3, CLK_IGNORE_UNUSED, 0),
  2086. GATE(CLK_ACLK_XIU_FSYSSX, "aclk_xiu_fsyssx", "mout_aclk_fsys_200_user",
  2087. ENABLE_ACLK_FSYS1, 2, CLK_IGNORE_UNUSED, 0),
  2088. GATE(CLK_ACLK_FSYSNP_200, "aclk_fsysnp_200", "mout_aclk_fsys_200_user",
  2089. ENABLE_ACLK_FSYS1, 1, CLK_IGNORE_UNUSED, 0),
  2090. GATE(CLK_ACLK_FSYSND_200, "aclk_fsysnd_200", "mout_aclk_fsys_200_user",
  2091. ENABLE_ACLK_FSYS1, 0, CLK_IGNORE_UNUSED, 0),
  2092. /* ENABLE_PCLK_FSYS */
  2093. GATE(CLK_PCLK_PCIE_CTRL, "pclk_pcie_ctrl", "mout_aclk_fsys_200_user",
  2094. ENABLE_PCLK_FSYS, 17, CLK_IGNORE_UNUSED, 0),
  2095. GATE(CLK_PCLK_SMMU_PDMA1, "pclk_smmu_pdma1", "mout_aclk_fsys_200_user",
  2096. ENABLE_PCLK_FSYS, 16, CLK_IGNORE_UNUSED, 0),
  2097. GATE(CLK_PCLK_PCIE_PHY, "pclk_pcie_phy", "mout_aclk_fsys_200_user",
  2098. ENABLE_PCLK_FSYS, 14, CLK_IGNORE_UNUSED, 0),
  2099. GATE(CLK_PCLK_BTS_PCIE, "pclk_bts_pcie", "mout_aclk_fsys_200_user",
  2100. ENABLE_PCLK_FSYS, 13, CLK_IGNORE_UNUSED, 0),
  2101. GATE(CLK_PCLK_SMMU_PDMA0, "pclk_smmu_pdma0", "mout_aclk_fsys_200_user",
  2102. ENABLE_PCLK_FSYS, 8, CLK_IGNORE_UNUSED, 0),
  2103. GATE(CLK_PCLK_BTS_UFS, "pclk_bts_ufs", "mout_aclk_fsys_200_user",
  2104. ENABLE_PCLK_FSYS, 5, 0, 0),
  2105. GATE(CLK_PCLK_BTS_USBHOST30, "pclk_bts_usbhost30",
  2106. "mout_aclk_fsys_200_user", ENABLE_PCLK_FSYS, 4, 0, 0),
  2107. GATE(CLK_PCLK_BTS_USBDRD30, "pclk_bts_usbdrd30",
  2108. "mout_aclk_fsys_200_user", ENABLE_PCLK_FSYS, 3, 0, 0),
  2109. GATE(CLK_PCLK_GPIO_FSYS, "pclk_gpio_fsys", "mout_aclk_fsys_200_user",
  2110. ENABLE_PCLK_FSYS, 2, CLK_IGNORE_UNUSED, 0),
  2111. GATE(CLK_PCLK_PMU_FSYS, "pclk_pmu_fsys", "mout_aclk_fsys_200_user",
  2112. ENABLE_PCLK_FSYS, 1, CLK_IGNORE_UNUSED, 0),
  2113. GATE(CLK_PCLK_SYSREG_FSYS, "pclk_sysreg_fsys",
  2114. "mout_aclk_fsys_200_user", ENABLE_PCLK_FSYS,
  2115. 0, CLK_IGNORE_UNUSED, 0),
  2116. /* ENABLE_SCLK_FSYS */
  2117. GATE(CLK_SCLK_PCIE_100, "sclk_pcie_100", "mout_sclk_pcie_100_user",
  2118. ENABLE_SCLK_FSYS, 21, 0, 0),
  2119. GATE(CLK_PHYCLK_USBHOST30_UHOST30_PIPE_PCLK,
  2120. "phyclk_usbhost30_uhost30_pipe_pclk",
  2121. "mout_phyclk_usbhost30_uhost30_pipe_pclk_user",
  2122. ENABLE_SCLK_FSYS, 18, 0, 0),
  2123. GATE(CLK_PHYCLK_USBHOST30_UHOST30_PHYCLOCK,
  2124. "phyclk_usbhost30_uhost30_phyclock",
  2125. "mout_phyclk_usbhost30_uhost30_phyclock_user",
  2126. ENABLE_SCLK_FSYS, 17, 0, 0),
  2127. GATE(CLK_PHYCLK_UFS_RX1_SYMBOL, "phyclk_ufs_rx1_symbol",
  2128. "mout_phyclk_ufs_rx1_symbol_user", ENABLE_SCLK_FSYS,
  2129. 16, 0, 0),
  2130. GATE(CLK_PHYCLK_UFS_RX0_SYMBOL, "phyclk_ufs_rx0_symbol",
  2131. "mout_phyclk_ufs_rx0_symbol_user", ENABLE_SCLK_FSYS,
  2132. 15, 0, 0),
  2133. GATE(CLK_PHYCLK_UFS_TX1_SYMBOL, "phyclk_ufs_tx1_symbol",
  2134. "mout_phyclk_ufs_tx1_symbol_user", ENABLE_SCLK_FSYS,
  2135. 14, 0, 0),
  2136. GATE(CLK_PHYCLK_UFS_TX0_SYMBOL, "phyclk_ufs_tx0_symbol",
  2137. "mout_phyclk_ufs_tx0_symbol_user", ENABLE_SCLK_FSYS,
  2138. 13, 0, 0),
  2139. GATE(CLK_PHYCLK_USBHOST20_PHY_HSIC1, "phyclk_usbhost20_phy_hsic1",
  2140. "mout_phyclk_usbhost20_phy_hsic1", ENABLE_SCLK_FSYS,
  2141. 12, 0, 0),
  2142. GATE(CLK_PHYCLK_USBHOST20_PHY_CLK48MOHCI,
  2143. "phyclk_usbhost20_phy_clk48mohci",
  2144. "mout_phyclk_usbhost20_phy_clk48mohci_user",
  2145. ENABLE_SCLK_FSYS, 11, 0, 0),
  2146. GATE(CLK_PHYCLK_USBHOST20_PHY_PHYCLOCK,
  2147. "phyclk_usbhost20_phy_phyclock",
  2148. "mout_phyclk_usbhost20_phy_phyclock_user",
  2149. ENABLE_SCLK_FSYS, 10, 0, 0),
  2150. GATE(CLK_PHYCLK_USBHOST20_PHY_FREECLK,
  2151. "phyclk_usbhost20_phy_freeclk",
  2152. "mout_phyclk_usbhost20_phy_freeclk_user",
  2153. ENABLE_SCLK_FSYS, 9, 0, 0),
  2154. GATE(CLK_PHYCLK_USBDRD30_UDRD30_PIPE_PCLK,
  2155. "phyclk_usbdrd30_udrd30_pipe_pclk",
  2156. "mout_phyclk_usbdrd30_udrd30_pipe_pclk_user",
  2157. ENABLE_SCLK_FSYS, 8, 0, 0),
  2158. GATE(CLK_PHYCLK_USBDRD30_UDRD30_PHYCLOCK,
  2159. "phyclk_usbdrd30_udrd30_phyclock",
  2160. "mout_phyclk_usbdrd30_udrd30_phyclock_user",
  2161. ENABLE_SCLK_FSYS, 7, 0, 0),
  2162. GATE(CLK_SCLK_MPHY, "sclk_mphy", "mout_sclk_mphy",
  2163. ENABLE_SCLK_FSYS, 6, 0, 0),
  2164. GATE(CLK_SCLK_UFSUNIPRO, "sclk_ufsunipro", "mout_sclk_ufsunipro_user",
  2165. ENABLE_SCLK_FSYS, 5, 0, 0),
  2166. GATE(CLK_SCLK_MMC2, "sclk_mmc2", "mout_sclk_mmc2_user",
  2167. ENABLE_SCLK_FSYS, 4, CLK_SET_RATE_PARENT, 0),
  2168. GATE(CLK_SCLK_MMC1, "sclk_mmc1", "mout_sclk_mmc1_user",
  2169. ENABLE_SCLK_FSYS, 3, CLK_SET_RATE_PARENT, 0),
  2170. GATE(CLK_SCLK_MMC0, "sclk_mmc0", "mout_sclk_mmc0_user",
  2171. ENABLE_SCLK_FSYS, 2, CLK_SET_RATE_PARENT, 0),
  2172. GATE(CLK_SCLK_USBHOST30, "sclk_usbhost30", "mout_sclk_usbhost30_user",
  2173. ENABLE_SCLK_FSYS, 1, 0, 0),
  2174. GATE(CLK_SCLK_USBDRD30, "sclk_usbdrd30", "mout_sclk_usbdrd30_user",
  2175. ENABLE_SCLK_FSYS, 0, 0, 0),
  2176. /* ENABLE_IP_FSYS0 */
  2177. GATE(CLK_PCIE, "pcie", "sclk_pcie_100", ENABLE_IP_FSYS0, 17, 0, 0),
  2178. GATE(CLK_PDMA1, "pdma1", "aclk_pdma1", ENABLE_IP_FSYS0, 15, 0, 0),
  2179. GATE(CLK_PDMA0, "pdma0", "aclk_pdma0", ENABLE_IP_FSYS0, 0, 0, 0),
  2180. };
  2181. static const struct samsung_cmu_info fsys_cmu_info __initconst = {
  2182. .mux_clks = fsys_mux_clks,
  2183. .nr_mux_clks = ARRAY_SIZE(fsys_mux_clks),
  2184. .gate_clks = fsys_gate_clks,
  2185. .nr_gate_clks = ARRAY_SIZE(fsys_gate_clks),
  2186. .fixed_clks = fsys_fixed_clks,
  2187. .nr_fixed_clks = ARRAY_SIZE(fsys_fixed_clks),
  2188. .nr_clk_ids = FSYS_NR_CLK,
  2189. .clk_regs = fsys_clk_regs,
  2190. .nr_clk_regs = ARRAY_SIZE(fsys_clk_regs),
  2191. .suspend_regs = fsys_suspend_regs,
  2192. .nr_suspend_regs = ARRAY_SIZE(fsys_suspend_regs),
  2193. .clk_name = "aclk_fsys_200",
  2194. };
  2195. /*
  2196. * Register offset definitions for CMU_G2D
  2197. */
  2198. #define MUX_SEL_G2D0 0x0200
  2199. #define MUX_SEL_ENABLE_G2D0 0x0300
  2200. #define MUX_SEL_STAT_G2D0 0x0400
  2201. #define DIV_G2D 0x0600
  2202. #define DIV_STAT_G2D 0x0700
  2203. #define DIV_ENABLE_ACLK_G2D 0x0800
  2204. #define DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D 0x0804
  2205. #define DIV_ENABLE_PCLK_G2D 0x0900
  2206. #define DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D 0x0904
  2207. #define DIV_ENABLE_IP_G2D0 0x0b00
  2208. #define DIV_ENABLE_IP_G2D1 0x0b04
  2209. #define DIV_ENABLE_IP_G2D_SECURE_SMMU_G2D 0x0b08
  2210. static const unsigned long g2d_clk_regs[] __initconst = {
  2211. MUX_SEL_G2D0,
  2212. MUX_SEL_ENABLE_G2D0,
  2213. DIV_G2D,
  2214. DIV_ENABLE_ACLK_G2D,
  2215. DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D,
  2216. DIV_ENABLE_PCLK_G2D,
  2217. DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D,
  2218. DIV_ENABLE_IP_G2D0,
  2219. DIV_ENABLE_IP_G2D1,
  2220. DIV_ENABLE_IP_G2D_SECURE_SMMU_G2D,
  2221. };
  2222. static const struct samsung_clk_reg_dump g2d_suspend_regs[] = {
  2223. { MUX_SEL_G2D0, 0 },
  2224. };
  2225. /* list of all parent clock list */
  2226. PNAME(mout_aclk_g2d_266_user_p) = { "oscclk", "aclk_g2d_266", };
  2227. PNAME(mout_aclk_g2d_400_user_p) = { "oscclk", "aclk_g2d_400", };
  2228. static const struct samsung_mux_clock g2d_mux_clks[] __initconst = {
  2229. /* MUX_SEL_G2D0 */
  2230. MUX(CLK_MUX_ACLK_G2D_266_USER, "mout_aclk_g2d_266_user",
  2231. mout_aclk_g2d_266_user_p, MUX_SEL_G2D0, 4, 1),
  2232. MUX(CLK_MUX_ACLK_G2D_400_USER, "mout_aclk_g2d_400_user",
  2233. mout_aclk_g2d_400_user_p, MUX_SEL_G2D0, 0, 1),
  2234. };
  2235. static const struct samsung_div_clock g2d_div_clks[] __initconst = {
  2236. /* DIV_G2D */
  2237. DIV(CLK_DIV_PCLK_G2D, "div_pclk_g2d", "mout_aclk_g2d_266_user",
  2238. DIV_G2D, 0, 2),
  2239. };
  2240. static const struct samsung_gate_clock g2d_gate_clks[] __initconst = {
  2241. /* DIV_ENABLE_ACLK_G2D */
  2242. GATE(CLK_ACLK_SMMU_MDMA1, "aclk_smmu_mdma1", "mout_aclk_g2d_266_user",
  2243. DIV_ENABLE_ACLK_G2D, 12, 0, 0),
  2244. GATE(CLK_ACLK_BTS_MDMA1, "aclk_bts_mdam1", "mout_aclk_g2d_266_user",
  2245. DIV_ENABLE_ACLK_G2D, 11, 0, 0),
  2246. GATE(CLK_ACLK_BTS_G2D, "aclk_bts_g2d", "mout_aclk_g2d_400_user",
  2247. DIV_ENABLE_ACLK_G2D, 10, 0, 0),
  2248. GATE(CLK_ACLK_ALB_G2D, "aclk_alb_g2d", "mout_aclk_g2d_400_user",
  2249. DIV_ENABLE_ACLK_G2D, 9, 0, 0),
  2250. GATE(CLK_ACLK_AXIUS_G2DX, "aclk_axius_g2dx", "mout_aclk_g2d_400_user",
  2251. DIV_ENABLE_ACLK_G2D, 8, 0, 0),
  2252. GATE(CLK_ACLK_ASYNCAXI_SYSX, "aclk_asyncaxi_sysx",
  2253. "mout_aclk_g2d_400_user", DIV_ENABLE_ACLK_G2D,
  2254. 7, 0, 0),
  2255. GATE(CLK_ACLK_AHB2APB_G2D1P, "aclk_ahb2apb_g2d1p", "div_pclk_g2d",
  2256. DIV_ENABLE_ACLK_G2D, 6, CLK_IGNORE_UNUSED, 0),
  2257. GATE(CLK_ACLK_AHB2APB_G2D0P, "aclk_ahb2apb_g2d0p", "div_pclk_g2d",
  2258. DIV_ENABLE_ACLK_G2D, 5, CLK_IGNORE_UNUSED, 0),
  2259. GATE(CLK_ACLK_XIU_G2DX, "aclk_xiu_g2dx", "mout_aclk_g2d_400_user",
  2260. DIV_ENABLE_ACLK_G2D, 4, CLK_IGNORE_UNUSED, 0),
  2261. GATE(CLK_ACLK_G2DNP_133, "aclk_g2dnp_133", "div_pclk_g2d",
  2262. DIV_ENABLE_ACLK_G2D, 3, CLK_IGNORE_UNUSED, 0),
  2263. GATE(CLK_ACLK_G2DND_400, "aclk_g2dnd_400", "mout_aclk_g2d_400_user",
  2264. DIV_ENABLE_ACLK_G2D, 2, CLK_IGNORE_UNUSED, 0),
  2265. GATE(CLK_ACLK_MDMA1, "aclk_mdma1", "mout_aclk_g2d_266_user",
  2266. DIV_ENABLE_ACLK_G2D, 1, 0, 0),
  2267. GATE(CLK_ACLK_G2D, "aclk_g2d", "mout_aclk_g2d_400_user",
  2268. DIV_ENABLE_ACLK_G2D, 0, 0, 0),
  2269. /* DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D */
  2270. GATE(CLK_ACLK_SMMU_G2D, "aclk_smmu_g2d", "mout_aclk_g2d_400_user",
  2271. DIV_ENABLE_ACLK_G2D_SECURE_SMMU_G2D, 0, 0, 0),
  2272. /* DIV_ENABLE_PCLK_G2D */
  2273. GATE(CLK_PCLK_SMMU_MDMA1, "pclk_smmu_mdma1", "div_pclk_g2d",
  2274. DIV_ENABLE_PCLK_G2D, 7, 0, 0),
  2275. GATE(CLK_PCLK_BTS_MDMA1, "pclk_bts_mdam1", "div_pclk_g2d",
  2276. DIV_ENABLE_PCLK_G2D, 6, 0, 0),
  2277. GATE(CLK_PCLK_BTS_G2D, "pclk_bts_g2d", "div_pclk_g2d",
  2278. DIV_ENABLE_PCLK_G2D, 5, 0, 0),
  2279. GATE(CLK_PCLK_ALB_G2D, "pclk_alb_g2d", "div_pclk_g2d",
  2280. DIV_ENABLE_PCLK_G2D, 4, 0, 0),
  2281. GATE(CLK_PCLK_ASYNCAXI_SYSX, "pclk_asyncaxi_sysx", "div_pclk_g2d",
  2282. DIV_ENABLE_PCLK_G2D, 3, 0, 0),
  2283. GATE(CLK_PCLK_PMU_G2D, "pclk_pmu_g2d", "div_pclk_g2d",
  2284. DIV_ENABLE_PCLK_G2D, 2, CLK_IGNORE_UNUSED, 0),
  2285. GATE(CLK_PCLK_SYSREG_G2D, "pclk_sysreg_g2d", "div_pclk_g2d",
  2286. DIV_ENABLE_PCLK_G2D, 1, CLK_IGNORE_UNUSED, 0),
  2287. GATE(CLK_PCLK_G2D, "pclk_g2d", "div_pclk_g2d", DIV_ENABLE_PCLK_G2D,
  2288. 0, 0, 0),
  2289. /* DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D */
  2290. GATE(CLK_PCLK_SMMU_G2D, "pclk_smmu_g2d", "div_pclk_g2d",
  2291. DIV_ENABLE_PCLK_G2D_SECURE_SMMU_G2D, 0, 0, 0),
  2292. };
  2293. static const struct samsung_cmu_info g2d_cmu_info __initconst = {
  2294. .mux_clks = g2d_mux_clks,
  2295. .nr_mux_clks = ARRAY_SIZE(g2d_mux_clks),
  2296. .div_clks = g2d_div_clks,
  2297. .nr_div_clks = ARRAY_SIZE(g2d_div_clks),
  2298. .gate_clks = g2d_gate_clks,
  2299. .nr_gate_clks = ARRAY_SIZE(g2d_gate_clks),
  2300. .nr_clk_ids = G2D_NR_CLK,
  2301. .clk_regs = g2d_clk_regs,
  2302. .nr_clk_regs = ARRAY_SIZE(g2d_clk_regs),
  2303. .suspend_regs = g2d_suspend_regs,
  2304. .nr_suspend_regs = ARRAY_SIZE(g2d_suspend_regs),
  2305. .clk_name = "aclk_g2d_400",
  2306. };
  2307. /*
  2308. * Register offset definitions for CMU_DISP
  2309. */
  2310. #define DISP_PLL_LOCK 0x0000
  2311. #define DISP_PLL_CON0 0x0100
  2312. #define DISP_PLL_CON1 0x0104
  2313. #define DISP_PLL_FREQ_DET 0x0108
  2314. #define MUX_SEL_DISP0 0x0200
  2315. #define MUX_SEL_DISP1 0x0204
  2316. #define MUX_SEL_DISP2 0x0208
  2317. #define MUX_SEL_DISP3 0x020c
  2318. #define MUX_SEL_DISP4 0x0210
  2319. #define MUX_ENABLE_DISP0 0x0300
  2320. #define MUX_ENABLE_DISP1 0x0304
  2321. #define MUX_ENABLE_DISP2 0x0308
  2322. #define MUX_ENABLE_DISP3 0x030c
  2323. #define MUX_ENABLE_DISP4 0x0310
  2324. #define MUX_STAT_DISP0 0x0400
  2325. #define MUX_STAT_DISP1 0x0404
  2326. #define MUX_STAT_DISP2 0x0408
  2327. #define MUX_STAT_DISP3 0x040c
  2328. #define MUX_STAT_DISP4 0x0410
  2329. #define MUX_IGNORE_DISP2 0x0508
  2330. #define DIV_DISP 0x0600
  2331. #define DIV_DISP_PLL_FREQ_DET 0x0604
  2332. #define DIV_STAT_DISP 0x0700
  2333. #define DIV_STAT_DISP_PLL_FREQ_DET 0x0704
  2334. #define ENABLE_ACLK_DISP0 0x0800
  2335. #define ENABLE_ACLK_DISP1 0x0804
  2336. #define ENABLE_PCLK_DISP 0x0900
  2337. #define ENABLE_SCLK_DISP 0x0a00
  2338. #define ENABLE_IP_DISP0 0x0b00
  2339. #define ENABLE_IP_DISP1 0x0b04
  2340. #define CLKOUT_CMU_DISP 0x0c00
  2341. #define CLKOUT_CMU_DISP_DIV_STAT 0x0c04
  2342. static const unsigned long disp_clk_regs[] __initconst = {
  2343. DISP_PLL_LOCK,
  2344. DISP_PLL_CON0,
  2345. DISP_PLL_CON1,
  2346. DISP_PLL_FREQ_DET,
  2347. MUX_SEL_DISP0,
  2348. MUX_SEL_DISP1,
  2349. MUX_SEL_DISP2,
  2350. MUX_SEL_DISP3,
  2351. MUX_SEL_DISP4,
  2352. MUX_ENABLE_DISP0,
  2353. MUX_ENABLE_DISP1,
  2354. MUX_ENABLE_DISP2,
  2355. MUX_ENABLE_DISP3,
  2356. MUX_ENABLE_DISP4,
  2357. MUX_IGNORE_DISP2,
  2358. DIV_DISP,
  2359. DIV_DISP_PLL_FREQ_DET,
  2360. ENABLE_ACLK_DISP0,
  2361. ENABLE_ACLK_DISP1,
  2362. ENABLE_PCLK_DISP,
  2363. ENABLE_SCLK_DISP,
  2364. ENABLE_IP_DISP0,
  2365. ENABLE_IP_DISP1,
  2366. CLKOUT_CMU_DISP,
  2367. CLKOUT_CMU_DISP_DIV_STAT,
  2368. };
  2369. static const struct samsung_clk_reg_dump disp_suspend_regs[] = {
  2370. /* PLL has to be enabled for suspend */
  2371. { DISP_PLL_CON0, 0x85f40502 },
  2372. /* ignore status of external PHY muxes during suspend to avoid hangs */
  2373. { MUX_IGNORE_DISP2, 0x00111111 },
  2374. { MUX_SEL_DISP0, 0 },
  2375. { MUX_SEL_DISP1, 0 },
  2376. { MUX_SEL_DISP2, 0 },
  2377. { MUX_SEL_DISP3, 0 },
  2378. { MUX_SEL_DISP4, 0 },
  2379. };
  2380. /* list of all parent clock list */
  2381. PNAME(mout_disp_pll_p) = { "oscclk", "fout_disp_pll", };
  2382. PNAME(mout_sclk_dsim1_user_p) = { "oscclk", "sclk_dsim1_disp", };
  2383. PNAME(mout_sclk_dsim0_user_p) = { "oscclk", "sclk_dsim0_disp", };
  2384. PNAME(mout_sclk_dsd_user_p) = { "oscclk", "sclk_dsd_disp", };
  2385. PNAME(mout_sclk_decon_tv_eclk_user_p) = { "oscclk",
  2386. "sclk_decon_tv_eclk_disp", };
  2387. PNAME(mout_sclk_decon_vclk_user_p) = { "oscclk",
  2388. "sclk_decon_vclk_disp", };
  2389. PNAME(mout_sclk_decon_eclk_user_p) = { "oscclk",
  2390. "sclk_decon_eclk_disp", };
  2391. PNAME(mout_sclk_decon_tv_vlkc_user_p) = { "oscclk",
  2392. "sclk_decon_tv_vclk_disp", };
  2393. PNAME(mout_aclk_disp_333_user_p) = { "oscclk", "aclk_disp_333", };
  2394. PNAME(mout_phyclk_mipidphy1_bitclkdiv8_user_p) = { "oscclk",
  2395. "phyclk_mipidphy1_bitclkdiv8_phy", };
  2396. PNAME(mout_phyclk_mipidphy1_rxclkesc0_user_p) = { "oscclk",
  2397. "phyclk_mipidphy1_rxclkesc0_phy", };
  2398. PNAME(mout_phyclk_mipidphy0_bitclkdiv8_user_p) = { "oscclk",
  2399. "phyclk_mipidphy0_bitclkdiv8_phy", };
  2400. PNAME(mout_phyclk_mipidphy0_rxclkesc0_user_p) = { "oscclk",
  2401. "phyclk_mipidphy0_rxclkesc0_phy", };
  2402. PNAME(mout_phyclk_hdmiphy_tmds_clko_user_p) = { "oscclk",
  2403. "phyclk_hdmiphy_tmds_clko_phy", };
  2404. PNAME(mout_phyclk_hdmiphy_pixel_clko_user_p) = { "oscclk",
  2405. "phyclk_hdmiphy_pixel_clko_phy", };
  2406. PNAME(mout_sclk_dsim0_p) = { "mout_disp_pll",
  2407. "mout_sclk_dsim0_user", };
  2408. PNAME(mout_sclk_decon_tv_eclk_p) = { "mout_disp_pll",
  2409. "mout_sclk_decon_tv_eclk_user", };
  2410. PNAME(mout_sclk_decon_vclk_p) = { "mout_disp_pll",
  2411. "mout_sclk_decon_vclk_user", };
  2412. PNAME(mout_sclk_decon_eclk_p) = { "mout_disp_pll",
  2413. "mout_sclk_decon_eclk_user", };
  2414. PNAME(mout_sclk_dsim1_b_disp_p) = { "mout_sclk_dsim1_a_disp",
  2415. "mout_sclk_dsim1_user", };
  2416. PNAME(mout_sclk_decon_tv_vclk_c_disp_p) = {
  2417. "mout_phyclk_hdmiphy_pixel_clko_user",
  2418. "mout_sclk_decon_tv_vclk_b_disp", };
  2419. PNAME(mout_sclk_decon_tv_vclk_b_disp_p) = { "mout_sclk_decon_tv_vclk_a_disp",
  2420. "mout_sclk_decon_tv_vclk_user", };
  2421. static const struct samsung_pll_clock disp_pll_clks[] __initconst = {
  2422. PLL(pll_35xx, CLK_FOUT_DISP_PLL, "fout_disp_pll", "oscclk",
  2423. DISP_PLL_LOCK, DISP_PLL_CON0, exynos5433_pll_rates),
  2424. };
  2425. static const struct samsung_fixed_factor_clock disp_fixed_factor_clks[] __initconst = {
  2426. /*
  2427. * sclk_rgb_{vclk|tv_vclk} is half clock of sclk_decon_{vclk|tv_vclk}.
  2428. * The divider has fixed value (2) between sclk_rgb_{vclk|tv_vclk}
  2429. * and sclk_decon_{vclk|tv_vclk}.
  2430. */
  2431. FFACTOR(CLK_SCLK_RGB_VCLK, "sclk_rgb_vclk", "sclk_decon_vclk",
  2432. 1, 2, 0),
  2433. FFACTOR(CLK_SCLK_RGB_TV_VCLK, "sclk_rgb_tv_vclk", "sclk_decon_tv_vclk",
  2434. 1, 2, 0),
  2435. };
  2436. static const struct samsung_fixed_rate_clock disp_fixed_clks[] __initconst = {
  2437. /* PHY clocks from MIPI_DPHY1 */
  2438. FRATE(0, "phyclk_mipidphy1_bitclkdiv8_phy", NULL, 0, 188000000),
  2439. FRATE(0, "phyclk_mipidphy1_rxclkesc0_phy", NULL, 0, 100000000),
  2440. /* PHY clocks from MIPI_DPHY0 */
  2441. FRATE(CLK_PHYCLK_MIPIDPHY0_BITCLKDIV8_PHY, "phyclk_mipidphy0_bitclkdiv8_phy",
  2442. NULL, 0, 188000000),
  2443. FRATE(CLK_PHYCLK_MIPIDPHY0_RXCLKESC0_PHY, "phyclk_mipidphy0_rxclkesc0_phy",
  2444. NULL, 0, 100000000),
  2445. /* PHY clocks from HDMI_PHY */
  2446. FRATE(CLK_PHYCLK_HDMIPHY_TMDS_CLKO_PHY, "phyclk_hdmiphy_tmds_clko_phy",
  2447. NULL, 0, 300000000),
  2448. FRATE(CLK_PHYCLK_HDMIPHY_PIXEL_CLKO_PHY, "phyclk_hdmiphy_pixel_clko_phy",
  2449. NULL, 0, 166000000),
  2450. };
  2451. static const struct samsung_mux_clock disp_mux_clks[] __initconst = {
  2452. /* MUX_SEL_DISP0 */
  2453. MUX(CLK_MOUT_DISP_PLL, "mout_disp_pll", mout_disp_pll_p, MUX_SEL_DISP0,
  2454. 0, 1),
  2455. /* MUX_SEL_DISP1 */
  2456. MUX(CLK_MOUT_SCLK_DSIM1_USER, "mout_sclk_dsim1_user",
  2457. mout_sclk_dsim1_user_p, MUX_SEL_DISP1, 28, 1),
  2458. MUX(CLK_MOUT_SCLK_DSIM0_USER, "mout_sclk_dsim0_user",
  2459. mout_sclk_dsim0_user_p, MUX_SEL_DISP1, 24, 1),
  2460. MUX(CLK_MOUT_SCLK_DSD_USER, "mout_sclk_dsd_user", mout_sclk_dsd_user_p,
  2461. MUX_SEL_DISP1, 20, 1),
  2462. MUX(CLK_MOUT_SCLK_DECON_TV_ECLK_USER, "mout_sclk_decon_tv_eclk_user",
  2463. mout_sclk_decon_tv_eclk_user_p, MUX_SEL_DISP1, 16, 1),
  2464. MUX(CLK_MOUT_SCLK_DECON_VCLK_USER, "mout_sclk_decon_vclk_user",
  2465. mout_sclk_decon_vclk_user_p, MUX_SEL_DISP1, 12, 1),
  2466. MUX(CLK_MOUT_SCLK_DECON_ECLK_USER, "mout_sclk_decon_eclk_user",
  2467. mout_sclk_decon_eclk_user_p, MUX_SEL_DISP1, 8, 1),
  2468. MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_USER, "mout_sclk_decon_tv_vclk_user",
  2469. mout_sclk_decon_tv_vlkc_user_p, MUX_SEL_DISP1, 4, 1),
  2470. MUX(CLK_MOUT_ACLK_DISP_333_USER, "mout_aclk_disp_333_user",
  2471. mout_aclk_disp_333_user_p, MUX_SEL_DISP1, 0, 1),
  2472. /* MUX_SEL_DISP2 */
  2473. MUX(CLK_MOUT_PHYCLK_MIPIDPHY1_BITCLKDIV8_USER,
  2474. "mout_phyclk_mipidphy1_bitclkdiv8_user",
  2475. mout_phyclk_mipidphy1_bitclkdiv8_user_p, MUX_SEL_DISP2,
  2476. 20, 1),
  2477. MUX(CLK_MOUT_PHYCLK_MIPIDPHY1_RXCLKESC0_USER,
  2478. "mout_phyclk_mipidphy1_rxclkesc0_user",
  2479. mout_phyclk_mipidphy1_rxclkesc0_user_p, MUX_SEL_DISP2,
  2480. 16, 1),
  2481. MUX(CLK_MOUT_PHYCLK_MIPIDPHY0_BITCLKDIV8_USER,
  2482. "mout_phyclk_mipidphy0_bitclkdiv8_user",
  2483. mout_phyclk_mipidphy0_bitclkdiv8_user_p, MUX_SEL_DISP2,
  2484. 12, 1),
  2485. MUX(CLK_MOUT_PHYCLK_MIPIDPHY0_RXCLKESC0_USER,
  2486. "mout_phyclk_mipidphy0_rxclkesc0_user",
  2487. mout_phyclk_mipidphy0_rxclkesc0_user_p, MUX_SEL_DISP2,
  2488. 8, 1),
  2489. MUX(CLK_MOUT_PHYCLK_HDMIPHY_TMDS_CLKO_USER,
  2490. "mout_phyclk_hdmiphy_tmds_clko_user",
  2491. mout_phyclk_hdmiphy_tmds_clko_user_p, MUX_SEL_DISP2,
  2492. 4, 1),
  2493. MUX(CLK_MOUT_PHYCLK_HDMIPHY_PIXEL_CLKO_USER,
  2494. "mout_phyclk_hdmiphy_pixel_clko_user",
  2495. mout_phyclk_hdmiphy_pixel_clko_user_p, MUX_SEL_DISP2,
  2496. 0, 1),
  2497. /* MUX_SEL_DISP3 */
  2498. MUX(CLK_MOUT_SCLK_DSIM0, "mout_sclk_dsim0", mout_sclk_dsim0_p,
  2499. MUX_SEL_DISP3, 12, 1),
  2500. MUX(CLK_MOUT_SCLK_DECON_TV_ECLK, "mout_sclk_decon_tv_eclk",
  2501. mout_sclk_decon_tv_eclk_p, MUX_SEL_DISP3, 8, 1),
  2502. MUX(CLK_MOUT_SCLK_DECON_VCLK, "mout_sclk_decon_vclk",
  2503. mout_sclk_decon_vclk_p, MUX_SEL_DISP3, 4, 1),
  2504. MUX(CLK_MOUT_SCLK_DECON_ECLK, "mout_sclk_decon_eclk",
  2505. mout_sclk_decon_eclk_p, MUX_SEL_DISP3, 0, 1),
  2506. /* MUX_SEL_DISP4 */
  2507. MUX(CLK_MOUT_SCLK_DSIM1_B_DISP, "mout_sclk_dsim1_b_disp",
  2508. mout_sclk_dsim1_b_disp_p, MUX_SEL_DISP4, 16, 1),
  2509. MUX(CLK_MOUT_SCLK_DSIM1_A_DISP, "mout_sclk_dsim1_a_disp",
  2510. mout_sclk_dsim0_p, MUX_SEL_DISP4, 12, 1),
  2511. MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_C_DISP,
  2512. "mout_sclk_decon_tv_vclk_c_disp",
  2513. mout_sclk_decon_tv_vclk_c_disp_p, MUX_SEL_DISP4, 8, 1),
  2514. MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_B_DISP,
  2515. "mout_sclk_decon_tv_vclk_b_disp",
  2516. mout_sclk_decon_tv_vclk_b_disp_p, MUX_SEL_DISP4, 4, 1),
  2517. MUX(CLK_MOUT_SCLK_DECON_TV_VCLK_A_DISP,
  2518. "mout_sclk_decon_tv_vclk_a_disp",
  2519. mout_sclk_decon_vclk_p, MUX_SEL_DISP4, 0, 1),
  2520. };
  2521. static const struct samsung_div_clock disp_div_clks[] __initconst = {
  2522. /* DIV_DISP */
  2523. DIV(CLK_DIV_SCLK_DSIM1_DISP, "div_sclk_dsim1_disp",
  2524. "mout_sclk_dsim1_b_disp", DIV_DISP, 24, 3),
  2525. DIV(CLK_DIV_SCLK_DECON_TV_VCLK_DISP, "div_sclk_decon_tv_vclk_disp",
  2526. "mout_sclk_decon_tv_vclk_c_disp", DIV_DISP, 20, 3),
  2527. DIV(CLK_DIV_SCLK_DSIM0_DISP, "div_sclk_dsim0_disp", "mout_sclk_dsim0",
  2528. DIV_DISP, 16, 3),
  2529. DIV(CLK_DIV_SCLK_DECON_TV_ECLK_DISP, "div_sclk_decon_tv_eclk_disp",
  2530. "mout_sclk_decon_tv_eclk", DIV_DISP, 12, 3),
  2531. DIV(CLK_DIV_SCLK_DECON_VCLK_DISP, "div_sclk_decon_vclk_disp",
  2532. "mout_sclk_decon_vclk", DIV_DISP, 8, 3),
  2533. DIV(CLK_DIV_SCLK_DECON_ECLK_DISP, "div_sclk_decon_eclk_disp",
  2534. "mout_sclk_decon_eclk", DIV_DISP, 4, 3),
  2535. DIV(CLK_DIV_PCLK_DISP, "div_pclk_disp", "mout_aclk_disp_333_user",
  2536. DIV_DISP, 0, 2),
  2537. };
  2538. static const struct samsung_gate_clock disp_gate_clks[] __initconst = {
  2539. /* ENABLE_ACLK_DISP0 */
  2540. GATE(CLK_ACLK_DECON_TV, "aclk_decon_tv", "mout_aclk_disp_333_user",
  2541. ENABLE_ACLK_DISP0, 2, 0, 0),
  2542. GATE(CLK_ACLK_DECON, "aclk_decon", "mout_aclk_disp_333_user",
  2543. ENABLE_ACLK_DISP0, 0, 0, 0),
  2544. /* ENABLE_ACLK_DISP1 */
  2545. GATE(CLK_ACLK_SMMU_TV1X, "aclk_smmu_tv1x", "mout_aclk_disp_333_user",
  2546. ENABLE_ACLK_DISP1, 25, 0, 0),
  2547. GATE(CLK_ACLK_SMMU_TV0X, "aclk_smmu_tv0x", "mout_aclk_disp_333_user",
  2548. ENABLE_ACLK_DISP1, 24, 0, 0),
  2549. GATE(CLK_ACLK_SMMU_DECON1X, "aclk_smmu_decon1x",
  2550. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 23, 0, 0),
  2551. GATE(CLK_ACLK_SMMU_DECON0X, "aclk_smmu_decon0x",
  2552. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 22, 0, 0),
  2553. GATE(CLK_ACLK_BTS_DECON_TV_M3, "aclk_bts_decon_tv_m3",
  2554. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 21, 0, 0),
  2555. GATE(CLK_ACLK_BTS_DECON_TV_M2, "aclk_bts_decon_tv_m2",
  2556. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 20, 0, 0),
  2557. GATE(CLK_ACLK_BTS_DECON_TV_M1, "aclk_bts_decon_tv_m1",
  2558. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 19, 0, 0),
  2559. GATE(CLK_ACLK_BTS_DECON_TV_M0, "aclk-bts_decon_tv_m0",
  2560. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 18, 0, 0),
  2561. GATE(CLK_ACLK_BTS_DECON_NM4, "aclk_bts_decon_nm4",
  2562. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 17, 0, 0),
  2563. GATE(CLK_ACLK_BTS_DECON_NM3, "aclk_bts_decon_nm3",
  2564. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 16, 0, 0),
  2565. GATE(CLK_ACLK_BTS_DECON_NM2, "aclk_bts_decon_nm2",
  2566. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 15, 0, 0),
  2567. GATE(CLK_ACLK_BTS_DECON_NM1, "aclk_bts_decon_nm1",
  2568. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 14, 0, 0),
  2569. GATE(CLK_ACLK_BTS_DECON_NM0, "aclk_bts_decon_nm0",
  2570. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 13, 0, 0),
  2571. GATE(CLK_ACLK_AHB2APB_DISPSFR2P, "aclk_ahb2apb_dispsfr2p",
  2572. "div_pclk_disp", ENABLE_ACLK_DISP1,
  2573. 12, CLK_IGNORE_UNUSED, 0),
  2574. GATE(CLK_ACLK_AHB2APB_DISPSFR1P, "aclk_ahb2apb_dispsfr1p",
  2575. "div_pclk_disp", ENABLE_ACLK_DISP1,
  2576. 11, CLK_IGNORE_UNUSED, 0),
  2577. GATE(CLK_ACLK_AHB2APB_DISPSFR0P, "aclk_ahb2apb_dispsfr0p",
  2578. "div_pclk_disp", ENABLE_ACLK_DISP1,
  2579. 10, CLK_IGNORE_UNUSED, 0),
  2580. GATE(CLK_ACLK_AHB_DISPH, "aclk_ahb_disph", "div_pclk_disp",
  2581. ENABLE_ACLK_DISP1, 8, CLK_IGNORE_UNUSED, 0),
  2582. GATE(CLK_ACLK_XIU_TV1X, "aclk_xiu_tv1x", "mout_aclk_disp_333_user",
  2583. ENABLE_ACLK_DISP1, 7, 0, 0),
  2584. GATE(CLK_ACLK_XIU_TV0X, "aclk_xiu_tv0x", "mout_aclk_disp_333_user",
  2585. ENABLE_ACLK_DISP1, 6, 0, 0),
  2586. GATE(CLK_ACLK_XIU_DECON1X, "aclk_xiu_decon1x",
  2587. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 5, 0, 0),
  2588. GATE(CLK_ACLK_XIU_DECON0X, "aclk_xiu_decon0x",
  2589. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 4, 0, 0),
  2590. GATE(CLK_ACLK_XIU_DISP1X, "aclk_xiu_disp1x", "mout_aclk_disp_333_user",
  2591. ENABLE_ACLK_DISP1, 3, CLK_IGNORE_UNUSED, 0),
  2592. GATE(CLK_ACLK_XIU_DISPNP_100, "aclk_xiu_dispnp_100", "div_pclk_disp",
  2593. ENABLE_ACLK_DISP1, 2, CLK_IGNORE_UNUSED, 0),
  2594. GATE(CLK_ACLK_DISP1ND_333, "aclk_disp1nd_333",
  2595. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1, 1,
  2596. CLK_IGNORE_UNUSED, 0),
  2597. GATE(CLK_ACLK_DISP0ND_333, "aclk_disp0nd_333",
  2598. "mout_aclk_disp_333_user", ENABLE_ACLK_DISP1,
  2599. 0, CLK_IGNORE_UNUSED, 0),
  2600. /* ENABLE_PCLK_DISP */
  2601. GATE(CLK_PCLK_SMMU_TV1X, "pclk_smmu_tv1x", "div_pclk_disp",
  2602. ENABLE_PCLK_DISP, 23, 0, 0),
  2603. GATE(CLK_PCLK_SMMU_TV0X, "pclk_smmu_tv0x", "div_pclk_disp",
  2604. ENABLE_PCLK_DISP, 22, 0, 0),
  2605. GATE(CLK_PCLK_SMMU_DECON1X, "pclk_smmu_decon1x", "div_pclk_disp",
  2606. ENABLE_PCLK_DISP, 21, 0, 0),
  2607. GATE(CLK_PCLK_SMMU_DECON0X, "pclk_smmu_decon0x", "div_pclk_disp",
  2608. ENABLE_PCLK_DISP, 20, 0, 0),
  2609. GATE(CLK_PCLK_BTS_DECON_TV_M3, "pclk_bts_decon_tv_m3", "div_pclk_disp",
  2610. ENABLE_PCLK_DISP, 19, 0, 0),
  2611. GATE(CLK_PCLK_BTS_DECON_TV_M2, "pclk_bts_decon_tv_m2", "div_pclk_disp",
  2612. ENABLE_PCLK_DISP, 18, 0, 0),
  2613. GATE(CLK_PCLK_BTS_DECON_TV_M1, "pclk_bts_decon_tv_m1", "div_pclk_disp",
  2614. ENABLE_PCLK_DISP, 17, 0, 0),
  2615. GATE(CLK_PCLK_BTS_DECON_TV_M0, "pclk_bts_decon_tv_m0", "div_pclk_disp",
  2616. ENABLE_PCLK_DISP, 16, 0, 0),
  2617. GATE(CLK_PCLK_BTS_DECONM4, "pclk_bts_deconm4", "div_pclk_disp",
  2618. ENABLE_PCLK_DISP, 15, 0, 0),
  2619. GATE(CLK_PCLK_BTS_DECONM3, "pclk_bts_deconm3", "div_pclk_disp",
  2620. ENABLE_PCLK_DISP, 14, 0, 0),
  2621. GATE(CLK_PCLK_BTS_DECONM2, "pclk_bts_deconm2", "div_pclk_disp",
  2622. ENABLE_PCLK_DISP, 13, 0, 0),
  2623. GATE(CLK_PCLK_BTS_DECONM1, "pclk_bts_deconm1", "div_pclk_disp",
  2624. ENABLE_PCLK_DISP, 12, 0, 0),
  2625. GATE(CLK_PCLK_BTS_DECONM0, "pclk_bts_deconm0", "div_pclk_disp",
  2626. ENABLE_PCLK_DISP, 11, 0, 0),
  2627. GATE(CLK_PCLK_MIC1, "pclk_mic1", "div_pclk_disp",
  2628. ENABLE_PCLK_DISP, 10, 0, 0),
  2629. GATE(CLK_PCLK_PMU_DISP, "pclk_pmu_disp", "div_pclk_disp",
  2630. ENABLE_PCLK_DISP, 9, CLK_IGNORE_UNUSED, 0),
  2631. GATE(CLK_PCLK_SYSREG_DISP, "pclk_sysreg_disp", "div_pclk_disp",
  2632. ENABLE_PCLK_DISP, 8, CLK_IGNORE_UNUSED, 0),
  2633. GATE(CLK_PCLK_HDMIPHY, "pclk_hdmiphy", "div_pclk_disp",
  2634. ENABLE_PCLK_DISP, 7, 0, 0),
  2635. GATE(CLK_PCLK_HDMI, "pclk_hdmi", "div_pclk_disp",
  2636. ENABLE_PCLK_DISP, 6, 0, 0),
  2637. GATE(CLK_PCLK_MIC0, "pclk_mic0", "div_pclk_disp",
  2638. ENABLE_PCLK_DISP, 5, 0, 0),
  2639. GATE(CLK_PCLK_DSIM1, "pclk_dsim1", "div_pclk_disp",
  2640. ENABLE_PCLK_DISP, 3, 0, 0),
  2641. GATE(CLK_PCLK_DSIM0, "pclk_dsim0", "div_pclk_disp",
  2642. ENABLE_PCLK_DISP, 2, 0, 0),
  2643. GATE(CLK_PCLK_DECON_TV, "pclk_decon_tv", "div_pclk_disp",
  2644. ENABLE_PCLK_DISP, 1, 0, 0),
  2645. GATE(CLK_PCLK_DECON, "pclk_decon", "div_pclk_disp",
  2646. ENABLE_PCLK_DISP, 0, 0, 0),
  2647. /* ENABLE_SCLK_DISP */
  2648. GATE(CLK_PHYCLK_MIPIDPHY1_BITCLKDIV8, "phyclk_mipidphy1_bitclkdiv8",
  2649. "mout_phyclk_mipidphy1_bitclkdiv8_user",
  2650. ENABLE_SCLK_DISP, 26, 0, 0),
  2651. GATE(CLK_PHYCLK_MIPIDPHY1_RXCLKESC0, "phyclk_mipidphy1_rxclkesc0",
  2652. "mout_phyclk_mipidphy1_rxclkesc0_user",
  2653. ENABLE_SCLK_DISP, 25, 0, 0),
  2654. GATE(CLK_SCLK_RGB_TV_VCLK_TO_DSIM1, "sclk_rgb_tv_vclk_to_dsim1",
  2655. "sclk_rgb_tv_vclk", ENABLE_SCLK_DISP, 24, 0, 0),
  2656. GATE(CLK_SCLK_RGB_TV_VCLK_TO_MIC1, "sclk_rgb_tv_vclk_to_mic1",
  2657. "sclk_rgb_tv_vclk", ENABLE_SCLK_DISP, 23, 0, 0),
  2658. GATE(CLK_SCLK_DSIM1, "sclk_dsim1", "div_sclk_dsim1_disp",
  2659. ENABLE_SCLK_DISP, 22, 0, 0),
  2660. GATE(CLK_SCLK_DECON_TV_VCLK, "sclk_decon_tv_vclk",
  2661. "div_sclk_decon_tv_vclk_disp",
  2662. ENABLE_SCLK_DISP, 21, 0, 0),
  2663. GATE(CLK_PHYCLK_MIPIDPHY0_BITCLKDIV8, "phyclk_mipidphy0_bitclkdiv8",
  2664. "mout_phyclk_mipidphy0_bitclkdiv8_user",
  2665. ENABLE_SCLK_DISP, 15, 0, 0),
  2666. GATE(CLK_PHYCLK_MIPIDPHY0_RXCLKESC0, "phyclk_mipidphy0_rxclkesc0",
  2667. "mout_phyclk_mipidphy0_rxclkesc0_user",
  2668. ENABLE_SCLK_DISP, 14, 0, 0),
  2669. GATE(CLK_PHYCLK_HDMIPHY_TMDS_CLKO, "phyclk_hdmiphy_tmds_clko",
  2670. "mout_phyclk_hdmiphy_tmds_clko_user",
  2671. ENABLE_SCLK_DISP, 13, 0, 0),
  2672. GATE(CLK_PHYCLK_HDMI_PIXEL, "phyclk_hdmi_pixel",
  2673. "sclk_rgb_tv_vclk", ENABLE_SCLK_DISP, 12, 0, 0),
  2674. GATE(CLK_SCLK_RGB_VCLK_TO_SMIES, "sclk_rgb_vclk_to_smies",
  2675. "sclk_rgb_vclk", ENABLE_SCLK_DISP, 11, 0, 0),
  2676. GATE(CLK_SCLK_RGB_VCLK_TO_DSIM0, "sclk_rgb_vclk_to_dsim0",
  2677. "sclk_rgb_vclk", ENABLE_SCLK_DISP, 9, 0, 0),
  2678. GATE(CLK_SCLK_RGB_VCLK_TO_MIC0, "sclk_rgb_vclk_to_mic0",
  2679. "sclk_rgb_vclk", ENABLE_SCLK_DISP, 8, 0, 0),
  2680. GATE(CLK_SCLK_DSD, "sclk_dsd", "mout_sclk_dsd_user",
  2681. ENABLE_SCLK_DISP, 7, 0, 0),
  2682. GATE(CLK_SCLK_HDMI_SPDIF, "sclk_hdmi_spdif", "sclk_hdmi_spdif_disp",
  2683. ENABLE_SCLK_DISP, 6, 0, 0),
  2684. GATE(CLK_SCLK_DSIM0, "sclk_dsim0", "div_sclk_dsim0_disp",
  2685. ENABLE_SCLK_DISP, 5, 0, 0),
  2686. GATE(CLK_SCLK_DECON_TV_ECLK, "sclk_decon_tv_eclk",
  2687. "div_sclk_decon_tv_eclk_disp",
  2688. ENABLE_SCLK_DISP, 4, 0, 0),
  2689. GATE(CLK_SCLK_DECON_VCLK, "sclk_decon_vclk",
  2690. "div_sclk_decon_vclk_disp", ENABLE_SCLK_DISP, 3, 0, 0),
  2691. GATE(CLK_SCLK_DECON_ECLK, "sclk_decon_eclk",
  2692. "div_sclk_decon_eclk_disp", ENABLE_SCLK_DISP, 2, 0, 0),
  2693. };
  2694. static const struct samsung_cmu_info disp_cmu_info __initconst = {
  2695. .pll_clks = disp_pll_clks,
  2696. .nr_pll_clks = ARRAY_SIZE(disp_pll_clks),
  2697. .mux_clks = disp_mux_clks,
  2698. .nr_mux_clks = ARRAY_SIZE(disp_mux_clks),
  2699. .div_clks = disp_div_clks,
  2700. .nr_div_clks = ARRAY_SIZE(disp_div_clks),
  2701. .gate_clks = disp_gate_clks,
  2702. .nr_gate_clks = ARRAY_SIZE(disp_gate_clks),
  2703. .fixed_clks = disp_fixed_clks,
  2704. .nr_fixed_clks = ARRAY_SIZE(disp_fixed_clks),
  2705. .fixed_factor_clks = disp_fixed_factor_clks,
  2706. .nr_fixed_factor_clks = ARRAY_SIZE(disp_fixed_factor_clks),
  2707. .nr_clk_ids = DISP_NR_CLK,
  2708. .clk_regs = disp_clk_regs,
  2709. .nr_clk_regs = ARRAY_SIZE(disp_clk_regs),
  2710. .suspend_regs = disp_suspend_regs,
  2711. .nr_suspend_regs = ARRAY_SIZE(disp_suspend_regs),
  2712. .clk_name = "aclk_disp_333",
  2713. };
  2714. /*
  2715. * Register offset definitions for CMU_AUD
  2716. */
  2717. #define MUX_SEL_AUD0 0x0200
  2718. #define MUX_SEL_AUD1 0x0204
  2719. #define MUX_ENABLE_AUD0 0x0300
  2720. #define MUX_ENABLE_AUD1 0x0304
  2721. #define MUX_STAT_AUD0 0x0400
  2722. #define DIV_AUD0 0x0600
  2723. #define DIV_AUD1 0x0604
  2724. #define DIV_STAT_AUD0 0x0700
  2725. #define DIV_STAT_AUD1 0x0704
  2726. #define ENABLE_ACLK_AUD 0x0800
  2727. #define ENABLE_PCLK_AUD 0x0900
  2728. #define ENABLE_SCLK_AUD0 0x0a00
  2729. #define ENABLE_SCLK_AUD1 0x0a04
  2730. #define ENABLE_IP_AUD0 0x0b00
  2731. #define ENABLE_IP_AUD1 0x0b04
  2732. static const unsigned long aud_clk_regs[] __initconst = {
  2733. MUX_SEL_AUD0,
  2734. MUX_SEL_AUD1,
  2735. MUX_ENABLE_AUD0,
  2736. MUX_ENABLE_AUD1,
  2737. DIV_AUD0,
  2738. DIV_AUD1,
  2739. ENABLE_ACLK_AUD,
  2740. ENABLE_PCLK_AUD,
  2741. ENABLE_SCLK_AUD0,
  2742. ENABLE_SCLK_AUD1,
  2743. ENABLE_IP_AUD0,
  2744. ENABLE_IP_AUD1,
  2745. };
  2746. static const struct samsung_clk_reg_dump aud_suspend_regs[] = {
  2747. { MUX_SEL_AUD0, 0 },
  2748. { MUX_SEL_AUD1, 0 },
  2749. };
  2750. /* list of all parent clock list */
  2751. PNAME(mout_aud_pll_user_aud_p) = { "oscclk", "fout_aud_pll", };
  2752. PNAME(mout_sclk_aud_pcm_p) = { "mout_aud_pll_user", "ioclk_audiocdclk0",};
  2753. static const struct samsung_fixed_rate_clock aud_fixed_clks[] __initconst = {
  2754. FRATE(0, "ioclk_jtag_tclk", NULL, 0, 33000000),
  2755. FRATE(0, "ioclk_slimbus_clk", NULL, 0, 25000000),
  2756. FRATE(0, "ioclk_i2s_bclk", NULL, 0, 50000000),
  2757. };
  2758. static const struct samsung_mux_clock aud_mux_clks[] __initconst = {
  2759. /* MUX_SEL_AUD0 */
  2760. MUX(CLK_MOUT_AUD_PLL_USER, "mout_aud_pll_user",
  2761. mout_aud_pll_user_aud_p, MUX_SEL_AUD0, 0, 1),
  2762. /* MUX_SEL_AUD1 */
  2763. MUX(CLK_MOUT_SCLK_AUD_PCM, "mout_sclk_aud_pcm", mout_sclk_aud_pcm_p,
  2764. MUX_SEL_AUD1, 8, 1),
  2765. MUX(CLK_MOUT_SCLK_AUD_I2S, "mout_sclk_aud_i2s", mout_sclk_aud_pcm_p,
  2766. MUX_SEL_AUD1, 0, 1),
  2767. };
  2768. static const struct samsung_div_clock aud_div_clks[] __initconst = {
  2769. /* DIV_AUD0 */
  2770. DIV(CLK_DIV_ATCLK_AUD, "div_atclk_aud", "div_aud_ca5", DIV_AUD0,
  2771. 12, 4),
  2772. DIV(CLK_DIV_PCLK_DBG_AUD, "div_pclk_dbg_aud", "div_aud_ca5", DIV_AUD0,
  2773. 8, 4),
  2774. DIV(CLK_DIV_ACLK_AUD, "div_aclk_aud", "div_aud_ca5", DIV_AUD0,
  2775. 4, 4),
  2776. DIV(CLK_DIV_AUD_CA5, "div_aud_ca5", "mout_aud_pll_user", DIV_AUD0,
  2777. 0, 4),
  2778. /* DIV_AUD1 */
  2779. DIV(CLK_DIV_SCLK_AUD_SLIMBUS, "div_sclk_aud_slimbus",
  2780. "mout_aud_pll_user", DIV_AUD1, 16, 5),
  2781. DIV(CLK_DIV_SCLK_AUD_UART, "div_sclk_aud_uart", "mout_aud_pll_user",
  2782. DIV_AUD1, 12, 4),
  2783. DIV(CLK_DIV_SCLK_AUD_PCM, "div_sclk_aud_pcm", "mout_sclk_aud_pcm",
  2784. DIV_AUD1, 4, 8),
  2785. DIV(CLK_DIV_SCLK_AUD_I2S, "div_sclk_aud_i2s", "mout_sclk_aud_i2s",
  2786. DIV_AUD1, 0, 4),
  2787. };
  2788. static const struct samsung_gate_clock aud_gate_clks[] __initconst = {
  2789. /* ENABLE_ACLK_AUD */
  2790. GATE(CLK_ACLK_INTR_CTRL, "aclk_intr_ctrl", "div_aclk_aud",
  2791. ENABLE_ACLK_AUD, 12, 0, 0),
  2792. GATE(CLK_ACLK_SMMU_LPASSX, "aclk_smmu_lpassx", "div_aclk_aud",
  2793. ENABLE_ACLK_AUD, 7, 0, 0),
  2794. GATE(CLK_ACLK_XIU_LPASSX, "aclk_xiu_lpassx", "div_aclk_aud",
  2795. ENABLE_ACLK_AUD, 0, 4, 0),
  2796. GATE(CLK_ACLK_AUDNP_133, "aclk_audnp_133", "div_aclk_aud",
  2797. ENABLE_ACLK_AUD, 0, 3, 0),
  2798. GATE(CLK_ACLK_AUDND_133, "aclk_audnd_133", "div_aclk_aud",
  2799. ENABLE_ACLK_AUD, 0, 2, 0),
  2800. GATE(CLK_ACLK_SRAMC, "aclk_sramc", "div_aclk_aud", ENABLE_ACLK_AUD,
  2801. 0, 1, 0),
  2802. GATE(CLK_ACLK_DMAC, "aclk_dmac", "div_aclk_aud", ENABLE_ACLK_AUD,
  2803. 0, CLK_IGNORE_UNUSED, 0),
  2804. /* ENABLE_PCLK_AUD */
  2805. GATE(CLK_PCLK_WDT1, "pclk_wdt1", "div_aclk_aud", ENABLE_PCLK_AUD,
  2806. 13, 0, 0),
  2807. GATE(CLK_PCLK_WDT0, "pclk_wdt0", "div_aclk_aud", ENABLE_PCLK_AUD,
  2808. 12, 0, 0),
  2809. GATE(CLK_PCLK_SFR1, "pclk_sfr1", "div_aclk_aud", ENABLE_PCLK_AUD,
  2810. 11, 0, 0),
  2811. GATE(CLK_PCLK_SMMU_LPASSX, "pclk_smmu_lpassx", "div_aclk_aud",
  2812. ENABLE_PCLK_AUD, 10, 0, 0),
  2813. GATE(CLK_PCLK_GPIO_AUD, "pclk_gpio_aud", "div_aclk_aud",
  2814. ENABLE_PCLK_AUD, 9, CLK_IGNORE_UNUSED, 0),
  2815. GATE(CLK_PCLK_PMU_AUD, "pclk_pmu_aud", "div_aclk_aud",
  2816. ENABLE_PCLK_AUD, 8, CLK_IGNORE_UNUSED, 0),
  2817. GATE(CLK_PCLK_SYSREG_AUD, "pclk_sysreg_aud", "div_aclk_aud",
  2818. ENABLE_PCLK_AUD, 7, CLK_IGNORE_UNUSED, 0),
  2819. GATE(CLK_PCLK_AUD_SLIMBUS, "pclk_aud_slimbus", "div_aclk_aud",
  2820. ENABLE_PCLK_AUD, 6, 0, 0),
  2821. GATE(CLK_PCLK_AUD_UART, "pclk_aud_uart", "div_aclk_aud",
  2822. ENABLE_PCLK_AUD, 5, 0, 0),
  2823. GATE(CLK_PCLK_AUD_PCM, "pclk_aud_pcm", "div_aclk_aud",
  2824. ENABLE_PCLK_AUD, 4, 0, 0),
  2825. GATE(CLK_PCLK_AUD_I2S, "pclk_aud_i2s", "div_aclk_aud",
  2826. ENABLE_PCLK_AUD, 3, 0, 0),
  2827. GATE(CLK_PCLK_TIMER, "pclk_timer", "div_aclk_aud", ENABLE_PCLK_AUD,
  2828. 2, 0, 0),
  2829. GATE(CLK_PCLK_SFR0_CTRL, "pclk_sfr0_ctrl", "div_aclk_aud",
  2830. ENABLE_PCLK_AUD, 0, 0, 0),
  2831. /* ENABLE_SCLK_AUD0 */
  2832. GATE(CLK_ATCLK_AUD, "atclk_aud", "div_atclk_aud", ENABLE_SCLK_AUD0,
  2833. 2, CLK_IGNORE_UNUSED, 0),
  2834. GATE(CLK_PCLK_DBG_AUD, "pclk_dbg_aud", "div_pclk_dbg_aud",
  2835. ENABLE_SCLK_AUD0, 1, 0, 0),
  2836. GATE(CLK_SCLK_AUD_CA5, "sclk_aud_ca5", "div_aud_ca5", ENABLE_SCLK_AUD0,
  2837. 0, 0, 0),
  2838. /* ENABLE_SCLK_AUD1 */
  2839. GATE(CLK_SCLK_JTAG_TCK, "sclk_jtag_tck", "ioclk_jtag_tclk",
  2840. ENABLE_SCLK_AUD1, 6, 0, 0),
  2841. GATE(CLK_SCLK_SLIMBUS_CLKIN, "sclk_slimbus_clkin", "ioclk_slimbus_clk",
  2842. ENABLE_SCLK_AUD1, 5, 0, 0),
  2843. GATE(CLK_SCLK_AUD_SLIMBUS, "sclk_aud_slimbus", "div_sclk_aud_slimbus",
  2844. ENABLE_SCLK_AUD1, 4, 0, 0),
  2845. GATE(CLK_SCLK_AUD_UART, "sclk_aud_uart", "div_sclk_aud_uart",
  2846. ENABLE_SCLK_AUD1, 3, CLK_IGNORE_UNUSED, 0),
  2847. GATE(CLK_SCLK_AUD_PCM, "sclk_aud_pcm", "div_sclk_aud_pcm",
  2848. ENABLE_SCLK_AUD1, 2, 0, 0),
  2849. GATE(CLK_SCLK_I2S_BCLK, "sclk_i2s_bclk", "ioclk_i2s_bclk",
  2850. ENABLE_SCLK_AUD1, 1, CLK_IGNORE_UNUSED, 0),
  2851. GATE(CLK_SCLK_AUD_I2S, "sclk_aud_i2s", "div_sclk_aud_i2s",
  2852. ENABLE_SCLK_AUD1, 0, CLK_IGNORE_UNUSED, 0),
  2853. };
  2854. static const struct samsung_cmu_info aud_cmu_info __initconst = {
  2855. .mux_clks = aud_mux_clks,
  2856. .nr_mux_clks = ARRAY_SIZE(aud_mux_clks),
  2857. .div_clks = aud_div_clks,
  2858. .nr_div_clks = ARRAY_SIZE(aud_div_clks),
  2859. .gate_clks = aud_gate_clks,
  2860. .nr_gate_clks = ARRAY_SIZE(aud_gate_clks),
  2861. .fixed_clks = aud_fixed_clks,
  2862. .nr_fixed_clks = ARRAY_SIZE(aud_fixed_clks),
  2863. .nr_clk_ids = AUD_NR_CLK,
  2864. .clk_regs = aud_clk_regs,
  2865. .nr_clk_regs = ARRAY_SIZE(aud_clk_regs),
  2866. .suspend_regs = aud_suspend_regs,
  2867. .nr_suspend_regs = ARRAY_SIZE(aud_suspend_regs),
  2868. .clk_name = "fout_aud_pll",
  2869. };
  2870. /*
  2871. * Register offset definitions for CMU_BUS{0|1|2}
  2872. */
  2873. #define DIV_BUS 0x0600
  2874. #define DIV_STAT_BUS 0x0700
  2875. #define ENABLE_ACLK_BUS 0x0800
  2876. #define ENABLE_PCLK_BUS 0x0900
  2877. #define ENABLE_IP_BUS0 0x0b00
  2878. #define ENABLE_IP_BUS1 0x0b04
  2879. #define MUX_SEL_BUS2 0x0200 /* Only for CMU_BUS2 */
  2880. #define MUX_ENABLE_BUS2 0x0300 /* Only for CMU_BUS2 */
  2881. #define MUX_STAT_BUS2 0x0400 /* Only for CMU_BUS2 */
  2882. /* list of all parent clock list */
  2883. PNAME(mout_aclk_bus2_400_p) = { "oscclk", "aclk_bus2_400", };
  2884. #define CMU_BUS_COMMON_CLK_REGS \
  2885. DIV_BUS, \
  2886. ENABLE_ACLK_BUS, \
  2887. ENABLE_PCLK_BUS, \
  2888. ENABLE_IP_BUS0, \
  2889. ENABLE_IP_BUS1
  2890. static const unsigned long bus01_clk_regs[] __initconst = {
  2891. CMU_BUS_COMMON_CLK_REGS,
  2892. };
  2893. static const unsigned long bus2_clk_regs[] __initconst = {
  2894. MUX_SEL_BUS2,
  2895. MUX_ENABLE_BUS2,
  2896. CMU_BUS_COMMON_CLK_REGS,
  2897. };
  2898. static const struct samsung_div_clock bus0_div_clks[] __initconst = {
  2899. /* DIV_BUS0 */
  2900. DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus0_133", "aclk_bus0_400",
  2901. DIV_BUS, 0, 3),
  2902. };
  2903. /* CMU_BUS0 clocks */
  2904. static const struct samsung_gate_clock bus0_gate_clks[] __initconst = {
  2905. /* ENABLE_ACLK_BUS0 */
  2906. GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus0p", "div_pclk_bus0_133",
  2907. ENABLE_ACLK_BUS, 4, CLK_IGNORE_UNUSED, 0),
  2908. GATE(CLK_ACLK_BUSNP_133, "aclk_bus0np_133", "div_pclk_bus0_133",
  2909. ENABLE_ACLK_BUS, 2, CLK_IGNORE_UNUSED, 0),
  2910. GATE(CLK_ACLK_BUSND_400, "aclk_bus0nd_400", "aclk_bus0_400",
  2911. ENABLE_ACLK_BUS, 0, CLK_IGNORE_UNUSED, 0),
  2912. /* ENABLE_PCLK_BUS0 */
  2913. GATE(CLK_PCLK_BUSSRVND_133, "pclk_bus0srvnd_133", "div_pclk_bus0_133",
  2914. ENABLE_PCLK_BUS, 2, 0, 0),
  2915. GATE(CLK_PCLK_PMU_BUS, "pclk_pmu_bus0", "div_pclk_bus0_133",
  2916. ENABLE_PCLK_BUS, 1, CLK_IGNORE_UNUSED, 0),
  2917. GATE(CLK_PCLK_SYSREG_BUS, "pclk_sysreg_bus0", "div_pclk_bus0_133",
  2918. ENABLE_PCLK_BUS, 0, CLK_IGNORE_UNUSED, 0),
  2919. };
  2920. /* CMU_BUS1 clocks */
  2921. static const struct samsung_div_clock bus1_div_clks[] __initconst = {
  2922. /* DIV_BUS1 */
  2923. DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus1_133", "aclk_bus1_400",
  2924. DIV_BUS, 0, 3),
  2925. };
  2926. static const struct samsung_gate_clock bus1_gate_clks[] __initconst = {
  2927. /* ENABLE_ACLK_BUS1 */
  2928. GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus1p", "div_pclk_bus1_133",
  2929. ENABLE_ACLK_BUS, 4, CLK_IGNORE_UNUSED, 0),
  2930. GATE(CLK_ACLK_BUSNP_133, "aclk_bus1np_133", "div_pclk_bus1_133",
  2931. ENABLE_ACLK_BUS, 2, CLK_IGNORE_UNUSED, 0),
  2932. GATE(CLK_ACLK_BUSND_400, "aclk_bus1nd_400", "aclk_bus1_400",
  2933. ENABLE_ACLK_BUS, 0, CLK_IGNORE_UNUSED, 0),
  2934. /* ENABLE_PCLK_BUS1 */
  2935. GATE(CLK_PCLK_BUSSRVND_133, "pclk_bus1srvnd_133", "div_pclk_bus1_133",
  2936. ENABLE_PCLK_BUS, 2, 0, 0),
  2937. GATE(CLK_PCLK_PMU_BUS, "pclk_pmu_bus1", "div_pclk_bus1_133",
  2938. ENABLE_PCLK_BUS, 1, CLK_IGNORE_UNUSED, 0),
  2939. GATE(CLK_PCLK_SYSREG_BUS, "pclk_sysreg_bus1", "div_pclk_bus1_133",
  2940. ENABLE_PCLK_BUS, 0, CLK_IGNORE_UNUSED, 0),
  2941. };
  2942. /* CMU_BUS2 clocks */
  2943. static const struct samsung_mux_clock bus2_mux_clks[] __initconst = {
  2944. /* MUX_SEL_BUS2 */
  2945. MUX(CLK_MOUT_ACLK_BUS2_400_USER, "mout_aclk_bus2_400_user",
  2946. mout_aclk_bus2_400_p, MUX_SEL_BUS2, 0, 1),
  2947. };
  2948. static const struct samsung_div_clock bus2_div_clks[] __initconst = {
  2949. /* DIV_BUS2 */
  2950. DIV(CLK_DIV_PCLK_BUS_133, "div_pclk_bus2_133",
  2951. "mout_aclk_bus2_400_user", DIV_BUS, 0, 3),
  2952. };
  2953. static const struct samsung_gate_clock bus2_gate_clks[] __initconst = {
  2954. /* ENABLE_ACLK_BUS2 */
  2955. GATE(CLK_ACLK_AHB2APB_BUSP, "aclk_ahb2apb_bus2p", "div_pclk_bus2_133",
  2956. ENABLE_ACLK_BUS, 3, CLK_IGNORE_UNUSED, 0),
  2957. GATE(CLK_ACLK_BUSNP_133, "aclk_bus2np_133", "div_pclk_bus2_133",
  2958. ENABLE_ACLK_BUS, 2, CLK_IGNORE_UNUSED, 0),
  2959. GATE(CLK_ACLK_BUS2BEND_400, "aclk_bus2bend_400",
  2960. "mout_aclk_bus2_400_user", ENABLE_ACLK_BUS,
  2961. 1, CLK_IGNORE_UNUSED, 0),
  2962. GATE(CLK_ACLK_BUS2RTND_400, "aclk_bus2rtnd_400",
  2963. "mout_aclk_bus2_400_user", ENABLE_ACLK_BUS,
  2964. 0, CLK_IGNORE_UNUSED, 0),
  2965. /* ENABLE_PCLK_BUS2 */
  2966. GATE(CLK_PCLK_BUSSRVND_133, "pclk_bus2srvnd_133", "div_pclk_bus2_133",
  2967. ENABLE_PCLK_BUS, 2, 0, 0),
  2968. GATE(CLK_PCLK_PMU_BUS, "pclk_pmu_bus2", "div_pclk_bus2_133",
  2969. ENABLE_PCLK_BUS, 1, CLK_IGNORE_UNUSED, 0),
  2970. GATE(CLK_PCLK_SYSREG_BUS, "pclk_sysreg_bus2", "div_pclk_bus2_133",
  2971. ENABLE_PCLK_BUS, 0, CLK_IGNORE_UNUSED, 0),
  2972. };
  2973. #define CMU_BUS_INFO_CLKS(id) \
  2974. .div_clks = bus##id##_div_clks, \
  2975. .nr_div_clks = ARRAY_SIZE(bus##id##_div_clks), \
  2976. .gate_clks = bus##id##_gate_clks, \
  2977. .nr_gate_clks = ARRAY_SIZE(bus##id##_gate_clks), \
  2978. .nr_clk_ids = BUSx_NR_CLK
  2979. static const struct samsung_cmu_info bus0_cmu_info __initconst = {
  2980. CMU_BUS_INFO_CLKS(0),
  2981. .clk_regs = bus01_clk_regs,
  2982. .nr_clk_regs = ARRAY_SIZE(bus01_clk_regs),
  2983. };
  2984. static const struct samsung_cmu_info bus1_cmu_info __initconst = {
  2985. CMU_BUS_INFO_CLKS(1),
  2986. .clk_regs = bus01_clk_regs,
  2987. .nr_clk_regs = ARRAY_SIZE(bus01_clk_regs),
  2988. };
  2989. static const struct samsung_cmu_info bus2_cmu_info __initconst = {
  2990. CMU_BUS_INFO_CLKS(2),
  2991. .mux_clks = bus2_mux_clks,
  2992. .nr_mux_clks = ARRAY_SIZE(bus2_mux_clks),
  2993. .clk_regs = bus2_clk_regs,
  2994. .nr_clk_regs = ARRAY_SIZE(bus2_clk_regs),
  2995. };
  2996. #define exynos5433_cmu_bus_init(id) \
  2997. static void __init exynos5433_cmu_bus##id##_init(struct device_node *np)\
  2998. { \
  2999. samsung_cmu_register_one(np, &bus##id##_cmu_info); \
  3000. } \
  3001. CLK_OF_DECLARE(exynos5433_cmu_bus##id, \
  3002. "samsung,exynos5433-cmu-bus"#id, \
  3003. exynos5433_cmu_bus##id##_init)
  3004. exynos5433_cmu_bus_init(0);
  3005. exynos5433_cmu_bus_init(1);
  3006. exynos5433_cmu_bus_init(2);
  3007. /*
  3008. * Register offset definitions for CMU_G3D
  3009. */
  3010. #define G3D_PLL_LOCK 0x0000
  3011. #define G3D_PLL_CON0 0x0100
  3012. #define G3D_PLL_CON1 0x0104
  3013. #define G3D_PLL_FREQ_DET 0x010c
  3014. #define MUX_SEL_G3D 0x0200
  3015. #define MUX_ENABLE_G3D 0x0300
  3016. #define MUX_STAT_G3D 0x0400
  3017. #define DIV_G3D 0x0600
  3018. #define DIV_G3D_PLL_FREQ_DET 0x0604
  3019. #define DIV_STAT_G3D 0x0700
  3020. #define DIV_STAT_G3D_PLL_FREQ_DET 0x0704
  3021. #define ENABLE_ACLK_G3D 0x0800
  3022. #define ENABLE_PCLK_G3D 0x0900
  3023. #define ENABLE_SCLK_G3D 0x0a00
  3024. #define ENABLE_IP_G3D0 0x0b00
  3025. #define ENABLE_IP_G3D1 0x0b04
  3026. #define CLKOUT_CMU_G3D 0x0c00
  3027. #define CLKOUT_CMU_G3D_DIV_STAT 0x0c04
  3028. #define CLK_STOPCTRL 0x1000
  3029. static const unsigned long g3d_clk_regs[] __initconst = {
  3030. G3D_PLL_LOCK,
  3031. G3D_PLL_CON0,
  3032. G3D_PLL_CON1,
  3033. G3D_PLL_FREQ_DET,
  3034. MUX_SEL_G3D,
  3035. MUX_ENABLE_G3D,
  3036. DIV_G3D,
  3037. DIV_G3D_PLL_FREQ_DET,
  3038. ENABLE_ACLK_G3D,
  3039. ENABLE_PCLK_G3D,
  3040. ENABLE_SCLK_G3D,
  3041. ENABLE_IP_G3D0,
  3042. ENABLE_IP_G3D1,
  3043. CLKOUT_CMU_G3D,
  3044. CLKOUT_CMU_G3D_DIV_STAT,
  3045. CLK_STOPCTRL,
  3046. };
  3047. static const struct samsung_clk_reg_dump g3d_suspend_regs[] = {
  3048. { MUX_SEL_G3D, 0 },
  3049. };
  3050. /* list of all parent clock list */
  3051. PNAME(mout_aclk_g3d_400_p) = { "mout_g3d_pll", "aclk_g3d_400", };
  3052. PNAME(mout_g3d_pll_p) = { "oscclk", "fout_g3d_pll", };
  3053. static const struct samsung_pll_clock g3d_pll_clks[] __initconst = {
  3054. PLL(pll_35xx, CLK_FOUT_G3D_PLL, "fout_g3d_pll", "oscclk",
  3055. G3D_PLL_LOCK, G3D_PLL_CON0, exynos5433_pll_rates),
  3056. };
  3057. static const struct samsung_mux_clock g3d_mux_clks[] __initconst = {
  3058. /* MUX_SEL_G3D */
  3059. MUX_F(CLK_MOUT_ACLK_G3D_400, "mout_aclk_g3d_400", mout_aclk_g3d_400_p,
  3060. MUX_SEL_G3D, 8, 1, CLK_SET_RATE_PARENT, 0),
  3061. MUX_F(CLK_MOUT_G3D_PLL, "mout_g3d_pll", mout_g3d_pll_p,
  3062. MUX_SEL_G3D, 0, 1, CLK_SET_RATE_PARENT, 0),
  3063. };
  3064. static const struct samsung_div_clock g3d_div_clks[] __initconst = {
  3065. /* DIV_G3D */
  3066. DIV(CLK_DIV_SCLK_HPM_G3D, "div_sclk_hpm_g3d", "mout_g3d_pll", DIV_G3D,
  3067. 8, 2),
  3068. DIV(CLK_DIV_PCLK_G3D, "div_pclk_g3d", "div_aclk_g3d", DIV_G3D,
  3069. 4, 3),
  3070. DIV_F(CLK_DIV_ACLK_G3D, "div_aclk_g3d", "mout_aclk_g3d_400", DIV_G3D,
  3071. 0, 3, CLK_SET_RATE_PARENT, 0),
  3072. };
  3073. static const struct samsung_gate_clock g3d_gate_clks[] __initconst = {
  3074. /* ENABLE_ACLK_G3D */
  3075. GATE(CLK_ACLK_BTS_G3D1, "aclk_bts_g3d1", "div_aclk_g3d",
  3076. ENABLE_ACLK_G3D, 7, 0, 0),
  3077. GATE(CLK_ACLK_BTS_G3D0, "aclk_bts_g3d0", "div_aclk_g3d",
  3078. ENABLE_ACLK_G3D, 6, 0, 0),
  3079. GATE(CLK_ACLK_ASYNCAPBS_G3D, "aclk_asyncapbs_g3d", "div_pclk_g3d",
  3080. ENABLE_ACLK_G3D, 5, CLK_IGNORE_UNUSED, 0),
  3081. GATE(CLK_ACLK_ASYNCAPBM_G3D, "aclk_asyncapbm_g3d", "div_aclk_g3d",
  3082. ENABLE_ACLK_G3D, 4, CLK_IGNORE_UNUSED, 0),
  3083. GATE(CLK_ACLK_AHB2APB_G3DP, "aclk_ahb2apb_g3dp", "div_pclk_g3d",
  3084. ENABLE_ACLK_G3D, 3, CLK_IGNORE_UNUSED, 0),
  3085. GATE(CLK_ACLK_G3DNP_150, "aclk_g3dnp_150", "div_pclk_g3d",
  3086. ENABLE_ACLK_G3D, 2, CLK_IGNORE_UNUSED, 0),
  3087. GATE(CLK_ACLK_G3DND_600, "aclk_g3dnd_600", "div_aclk_g3d",
  3088. ENABLE_ACLK_G3D, 1, CLK_IGNORE_UNUSED, 0),
  3089. GATE(CLK_ACLK_G3D, "aclk_g3d", "div_aclk_g3d",
  3090. ENABLE_ACLK_G3D, 0, CLK_SET_RATE_PARENT, 0),
  3091. /* ENABLE_PCLK_G3D */
  3092. GATE(CLK_PCLK_BTS_G3D1, "pclk_bts_g3d1", "div_pclk_g3d",
  3093. ENABLE_PCLK_G3D, 3, 0, 0),
  3094. GATE(CLK_PCLK_BTS_G3D0, "pclk_bts_g3d0", "div_pclk_g3d",
  3095. ENABLE_PCLK_G3D, 2, 0, 0),
  3096. GATE(CLK_PCLK_PMU_G3D, "pclk_pmu_g3d", "div_pclk_g3d",
  3097. ENABLE_PCLK_G3D, 1, CLK_IGNORE_UNUSED, 0),
  3098. GATE(CLK_PCLK_SYSREG_G3D, "pclk_sysreg_g3d", "div_pclk_g3d",
  3099. ENABLE_PCLK_G3D, 0, CLK_IGNORE_UNUSED, 0),
  3100. /* ENABLE_SCLK_G3D */
  3101. GATE(CLK_SCLK_HPM_G3D, "sclk_hpm_g3d", "div_sclk_hpm_g3d",
  3102. ENABLE_SCLK_G3D, 0, 0, 0),
  3103. };
  3104. static const struct samsung_cmu_info g3d_cmu_info __initconst = {
  3105. .pll_clks = g3d_pll_clks,
  3106. .nr_pll_clks = ARRAY_SIZE(g3d_pll_clks),
  3107. .mux_clks = g3d_mux_clks,
  3108. .nr_mux_clks = ARRAY_SIZE(g3d_mux_clks),
  3109. .div_clks = g3d_div_clks,
  3110. .nr_div_clks = ARRAY_SIZE(g3d_div_clks),
  3111. .gate_clks = g3d_gate_clks,
  3112. .nr_gate_clks = ARRAY_SIZE(g3d_gate_clks),
  3113. .nr_clk_ids = G3D_NR_CLK,
  3114. .clk_regs = g3d_clk_regs,
  3115. .nr_clk_regs = ARRAY_SIZE(g3d_clk_regs),
  3116. .suspend_regs = g3d_suspend_regs,
  3117. .nr_suspend_regs = ARRAY_SIZE(g3d_suspend_regs),
  3118. .clk_name = "aclk_g3d_400",
  3119. };
  3120. /*
  3121. * Register offset definitions for CMU_GSCL
  3122. */
  3123. #define MUX_SEL_GSCL 0x0200
  3124. #define MUX_ENABLE_GSCL 0x0300
  3125. #define MUX_STAT_GSCL 0x0400
  3126. #define ENABLE_ACLK_GSCL 0x0800
  3127. #define ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0 0x0804
  3128. #define ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1 0x0808
  3129. #define ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2 0x080c
  3130. #define ENABLE_PCLK_GSCL 0x0900
  3131. #define ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0 0x0904
  3132. #define ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1 0x0908
  3133. #define ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2 0x090c
  3134. #define ENABLE_IP_GSCL0 0x0b00
  3135. #define ENABLE_IP_GSCL1 0x0b04
  3136. #define ENABLE_IP_GSCL_SECURE_SMMU_GSCL0 0x0b08
  3137. #define ENABLE_IP_GSCL_SECURE_SMMU_GSCL1 0x0b0c
  3138. #define ENABLE_IP_GSCL_SECURE_SMMU_GSCL2 0x0b10
  3139. static const unsigned long gscl_clk_regs[] __initconst = {
  3140. MUX_SEL_GSCL,
  3141. MUX_ENABLE_GSCL,
  3142. ENABLE_ACLK_GSCL,
  3143. ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0,
  3144. ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1,
  3145. ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2,
  3146. ENABLE_PCLK_GSCL,
  3147. ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0,
  3148. ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1,
  3149. ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2,
  3150. ENABLE_IP_GSCL0,
  3151. ENABLE_IP_GSCL1,
  3152. ENABLE_IP_GSCL_SECURE_SMMU_GSCL0,
  3153. ENABLE_IP_GSCL_SECURE_SMMU_GSCL1,
  3154. ENABLE_IP_GSCL_SECURE_SMMU_GSCL2,
  3155. };
  3156. static const struct samsung_clk_reg_dump gscl_suspend_regs[] = {
  3157. { MUX_SEL_GSCL, 0 },
  3158. { ENABLE_ACLK_GSCL, 0xfff },
  3159. { ENABLE_PCLK_GSCL, 0xff },
  3160. };
  3161. /* list of all parent clock list */
  3162. PNAME(aclk_gscl_111_user_p) = { "oscclk", "aclk_gscl_111", };
  3163. PNAME(aclk_gscl_333_user_p) = { "oscclk", "aclk_gscl_333", };
  3164. static const struct samsung_mux_clock gscl_mux_clks[] __initconst = {
  3165. /* MUX_SEL_GSCL */
  3166. MUX(CLK_MOUT_ACLK_GSCL_111_USER, "mout_aclk_gscl_111_user",
  3167. aclk_gscl_111_user_p, MUX_SEL_GSCL, 4, 1),
  3168. MUX(CLK_MOUT_ACLK_GSCL_333_USER, "mout_aclk_gscl_333_user",
  3169. aclk_gscl_333_user_p, MUX_SEL_GSCL, 0, 1),
  3170. };
  3171. static const struct samsung_gate_clock gscl_gate_clks[] __initconst = {
  3172. /* ENABLE_ACLK_GSCL */
  3173. GATE(CLK_ACLK_BTS_GSCL2, "aclk_bts_gscl2", "mout_aclk_gscl_333_user",
  3174. ENABLE_ACLK_GSCL, 11, 0, 0),
  3175. GATE(CLK_ACLK_BTS_GSCL1, "aclk_bts_gscl1", "mout_aclk_gscl_333_user",
  3176. ENABLE_ACLK_GSCL, 10, 0, 0),
  3177. GATE(CLK_ACLK_BTS_GSCL0, "aclk_bts_gscl0", "mout_aclk_gscl_333_user",
  3178. ENABLE_ACLK_GSCL, 9, 0, 0),
  3179. GATE(CLK_ACLK_AHB2APB_GSCLP, "aclk_ahb2apb_gsclp",
  3180. "mout_aclk_gscl_111_user", ENABLE_ACLK_GSCL,
  3181. 8, CLK_IGNORE_UNUSED, 0),
  3182. GATE(CLK_ACLK_XIU_GSCLX, "aclk_xiu_gsclx", "mout_aclk_gscl_333_user",
  3183. ENABLE_ACLK_GSCL, 7, 0, 0),
  3184. GATE(CLK_ACLK_GSCLNP_111, "aclk_gsclnp_111", "mout_aclk_gscl_111_user",
  3185. ENABLE_ACLK_GSCL, 6, CLK_IGNORE_UNUSED, 0),
  3186. GATE(CLK_ACLK_GSCLRTND_333, "aclk_gsclrtnd_333",
  3187. "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 5,
  3188. CLK_IGNORE_UNUSED, 0),
  3189. GATE(CLK_ACLK_GSCLBEND_333, "aclk_gsclbend_333",
  3190. "mout_aclk_gscl_333_user", ENABLE_ACLK_GSCL, 4,
  3191. CLK_IGNORE_UNUSED, 0),
  3192. GATE(CLK_ACLK_GSD, "aclk_gsd", "mout_aclk_gscl_333_user",
  3193. ENABLE_ACLK_GSCL, 3, 0, 0),
  3194. GATE(CLK_ACLK_GSCL2, "aclk_gscl2", "mout_aclk_gscl_333_user",
  3195. ENABLE_ACLK_GSCL, 2, 0, 0),
  3196. GATE(CLK_ACLK_GSCL1, "aclk_gscl1", "mout_aclk_gscl_333_user",
  3197. ENABLE_ACLK_GSCL, 1, 0, 0),
  3198. GATE(CLK_ACLK_GSCL0, "aclk_gscl0", "mout_aclk_gscl_333_user",
  3199. ENABLE_ACLK_GSCL, 0, 0, 0),
  3200. /* ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0 */
  3201. GATE(CLK_ACLK_SMMU_GSCL0, "aclk_smmu_gscl0", "mout_aclk_gscl_333_user",
  3202. ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL0, 0, 0, 0),
  3203. /* ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1 */
  3204. GATE(CLK_ACLK_SMMU_GSCL1, "aclk_smmu_gscl1", "mout_aclk_gscl_333_user",
  3205. ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL1, 0, 0, 0),
  3206. /* ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2 */
  3207. GATE(CLK_ACLK_SMMU_GSCL2, "aclk_smmu_gscl2", "mout_aclk_gscl_333_user",
  3208. ENABLE_ACLK_GSCL_SECURE_SMMU_GSCL2, 0, 0, 0),
  3209. /* ENABLE_PCLK_GSCL */
  3210. GATE(CLK_PCLK_BTS_GSCL2, "pclk_bts_gscl2", "mout_aclk_gscl_111_user",
  3211. ENABLE_PCLK_GSCL, 7, 0, 0),
  3212. GATE(CLK_PCLK_BTS_GSCL1, "pclk_bts_gscl1", "mout_aclk_gscl_111_user",
  3213. ENABLE_PCLK_GSCL, 6, 0, 0),
  3214. GATE(CLK_PCLK_BTS_GSCL0, "pclk_bts_gscl0", "mout_aclk_gscl_111_user",
  3215. ENABLE_PCLK_GSCL, 5, 0, 0),
  3216. GATE(CLK_PCLK_PMU_GSCL, "pclk_pmu_gscl", "mout_aclk_gscl_111_user",
  3217. ENABLE_PCLK_GSCL, 4, CLK_IGNORE_UNUSED, 0),
  3218. GATE(CLK_PCLK_SYSREG_GSCL, "pclk_sysreg_gscl",
  3219. "mout_aclk_gscl_111_user", ENABLE_PCLK_GSCL,
  3220. 3, CLK_IGNORE_UNUSED, 0),
  3221. GATE(CLK_PCLK_GSCL2, "pclk_gscl2", "mout_aclk_gscl_111_user",
  3222. ENABLE_PCLK_GSCL, 2, 0, 0),
  3223. GATE(CLK_PCLK_GSCL1, "pclk_gscl1", "mout_aclk_gscl_111_user",
  3224. ENABLE_PCLK_GSCL, 1, 0, 0),
  3225. GATE(CLK_PCLK_GSCL0, "pclk_gscl0", "mout_aclk_gscl_111_user",
  3226. ENABLE_PCLK_GSCL, 0, 0, 0),
  3227. /* ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0 */
  3228. GATE(CLK_PCLK_SMMU_GSCL0, "pclk_smmu_gscl0", "mout_aclk_gscl_111_user",
  3229. ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL0, 0, 0, 0),
  3230. /* ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1 */
  3231. GATE(CLK_PCLK_SMMU_GSCL1, "pclk_smmu_gscl1", "mout_aclk_gscl_111_user",
  3232. ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL1, 0, 0, 0),
  3233. /* ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2 */
  3234. GATE(CLK_PCLK_SMMU_GSCL2, "pclk_smmu_gscl2", "mout_aclk_gscl_111_user",
  3235. ENABLE_PCLK_GSCL_SECURE_SMMU_GSCL2, 0, 0, 0),
  3236. };
  3237. static const struct samsung_cmu_info gscl_cmu_info __initconst = {
  3238. .mux_clks = gscl_mux_clks,
  3239. .nr_mux_clks = ARRAY_SIZE(gscl_mux_clks),
  3240. .gate_clks = gscl_gate_clks,
  3241. .nr_gate_clks = ARRAY_SIZE(gscl_gate_clks),
  3242. .nr_clk_ids = GSCL_NR_CLK,
  3243. .clk_regs = gscl_clk_regs,
  3244. .nr_clk_regs = ARRAY_SIZE(gscl_clk_regs),
  3245. .suspend_regs = gscl_suspend_regs,
  3246. .nr_suspend_regs = ARRAY_SIZE(gscl_suspend_regs),
  3247. .clk_name = "aclk_gscl_111",
  3248. };
  3249. /*
  3250. * Register offset definitions for CMU_APOLLO
  3251. */
  3252. #define APOLLO_PLL_LOCK 0x0000
  3253. #define APOLLO_PLL_CON0 0x0100
  3254. #define APOLLO_PLL_CON1 0x0104
  3255. #define APOLLO_PLL_FREQ_DET 0x010c
  3256. #define MUX_SEL_APOLLO0 0x0200
  3257. #define MUX_SEL_APOLLO1 0x0204
  3258. #define MUX_SEL_APOLLO2 0x0208
  3259. #define MUX_ENABLE_APOLLO0 0x0300
  3260. #define MUX_ENABLE_APOLLO1 0x0304
  3261. #define MUX_ENABLE_APOLLO2 0x0308
  3262. #define MUX_STAT_APOLLO0 0x0400
  3263. #define MUX_STAT_APOLLO1 0x0404
  3264. #define MUX_STAT_APOLLO2 0x0408
  3265. #define DIV_APOLLO0 0x0600
  3266. #define DIV_APOLLO1 0x0604
  3267. #define DIV_APOLLO_PLL_FREQ_DET 0x0608
  3268. #define DIV_STAT_APOLLO0 0x0700
  3269. #define DIV_STAT_APOLLO1 0x0704
  3270. #define DIV_STAT_APOLLO_PLL_FREQ_DET 0x0708
  3271. #define ENABLE_ACLK_APOLLO 0x0800
  3272. #define ENABLE_PCLK_APOLLO 0x0900
  3273. #define ENABLE_SCLK_APOLLO 0x0a00
  3274. #define ENABLE_IP_APOLLO0 0x0b00
  3275. #define ENABLE_IP_APOLLO1 0x0b04
  3276. #define CLKOUT_CMU_APOLLO 0x0c00
  3277. #define CLKOUT_CMU_APOLLO_DIV_STAT 0x0c04
  3278. #define ARMCLK_STOPCTRL 0x1000
  3279. #define APOLLO_PWR_CTRL 0x1020
  3280. #define APOLLO_PWR_CTRL2 0x1024
  3281. #define APOLLO_INTR_SPREAD_ENABLE 0x1080
  3282. #define APOLLO_INTR_SPREAD_USE_STANDBYWFI 0x1084
  3283. #define APOLLO_INTR_SPREAD_BLOCKING_DURATION 0x1088
  3284. static const unsigned long apollo_clk_regs[] __initconst = {
  3285. APOLLO_PLL_LOCK,
  3286. APOLLO_PLL_CON0,
  3287. APOLLO_PLL_CON1,
  3288. APOLLO_PLL_FREQ_DET,
  3289. MUX_SEL_APOLLO0,
  3290. MUX_SEL_APOLLO1,
  3291. MUX_SEL_APOLLO2,
  3292. MUX_ENABLE_APOLLO0,
  3293. MUX_ENABLE_APOLLO1,
  3294. MUX_ENABLE_APOLLO2,
  3295. DIV_APOLLO0,
  3296. DIV_APOLLO1,
  3297. DIV_APOLLO_PLL_FREQ_DET,
  3298. ENABLE_ACLK_APOLLO,
  3299. ENABLE_PCLK_APOLLO,
  3300. ENABLE_SCLK_APOLLO,
  3301. ENABLE_IP_APOLLO0,
  3302. ENABLE_IP_APOLLO1,
  3303. CLKOUT_CMU_APOLLO,
  3304. CLKOUT_CMU_APOLLO_DIV_STAT,
  3305. ARMCLK_STOPCTRL,
  3306. APOLLO_PWR_CTRL,
  3307. APOLLO_PWR_CTRL2,
  3308. APOLLO_INTR_SPREAD_ENABLE,
  3309. APOLLO_INTR_SPREAD_USE_STANDBYWFI,
  3310. APOLLO_INTR_SPREAD_BLOCKING_DURATION,
  3311. };
  3312. /* list of all parent clock list */
  3313. PNAME(mout_apollo_pll_p) = { "oscclk", "fout_apollo_pll", };
  3314. PNAME(mout_bus_pll_apollo_user_p) = { "oscclk", "sclk_bus_pll_apollo", };
  3315. PNAME(mout_apollo_p) = { "mout_apollo_pll",
  3316. "mout_bus_pll_apollo_user", };
  3317. static const struct samsung_pll_clock apollo_pll_clks[] __initconst = {
  3318. PLL(pll_35xx, CLK_FOUT_APOLLO_PLL, "fout_apollo_pll", "oscclk",
  3319. APOLLO_PLL_LOCK, APOLLO_PLL_CON0, exynos5433_pll_rates),
  3320. };
  3321. static const struct samsung_mux_clock apollo_mux_clks[] __initconst = {
  3322. /* MUX_SEL_APOLLO0 */
  3323. MUX_F(CLK_MOUT_APOLLO_PLL, "mout_apollo_pll", mout_apollo_pll_p,
  3324. MUX_SEL_APOLLO0, 0, 1, CLK_SET_RATE_PARENT |
  3325. CLK_RECALC_NEW_RATES, 0),
  3326. /* MUX_SEL_APOLLO1 */
  3327. MUX(CLK_MOUT_BUS_PLL_APOLLO_USER, "mout_bus_pll_apollo_user",
  3328. mout_bus_pll_apollo_user_p, MUX_SEL_APOLLO1, 0, 1),
  3329. /* MUX_SEL_APOLLO2 */
  3330. MUX_F(CLK_MOUT_APOLLO, "mout_apollo", mout_apollo_p, MUX_SEL_APOLLO2,
  3331. 0, 1, CLK_SET_RATE_PARENT, 0),
  3332. };
  3333. static const struct samsung_div_clock apollo_div_clks[] __initconst = {
  3334. /* DIV_APOLLO0 */
  3335. DIV_F(CLK_DIV_CNTCLK_APOLLO, "div_cntclk_apollo", "div_apollo2",
  3336. DIV_APOLLO0, 24, 3, CLK_GET_RATE_NOCACHE,
  3337. CLK_DIVIDER_READ_ONLY),
  3338. DIV_F(CLK_DIV_PCLK_DBG_APOLLO, "div_pclk_dbg_apollo", "div_apollo2",
  3339. DIV_APOLLO0, 20, 3, CLK_GET_RATE_NOCACHE,
  3340. CLK_DIVIDER_READ_ONLY),
  3341. DIV_F(CLK_DIV_ATCLK_APOLLO, "div_atclk_apollo", "div_apollo2",
  3342. DIV_APOLLO0, 16, 3, CLK_GET_RATE_NOCACHE,
  3343. CLK_DIVIDER_READ_ONLY),
  3344. DIV_F(CLK_DIV_PCLK_APOLLO, "div_pclk_apollo", "div_apollo2",
  3345. DIV_APOLLO0, 12, 3, CLK_GET_RATE_NOCACHE,
  3346. CLK_DIVIDER_READ_ONLY),
  3347. DIV_F(CLK_DIV_ACLK_APOLLO, "div_aclk_apollo", "div_apollo2",
  3348. DIV_APOLLO0, 8, 3, CLK_GET_RATE_NOCACHE,
  3349. CLK_DIVIDER_READ_ONLY),
  3350. DIV_F(CLK_DIV_APOLLO2, "div_apollo2", "div_apollo1",
  3351. DIV_APOLLO0, 4, 3, CLK_SET_RATE_PARENT, 0),
  3352. DIV_F(CLK_DIV_APOLLO1, "div_apollo1", "mout_apollo",
  3353. DIV_APOLLO0, 0, 3, CLK_SET_RATE_PARENT, 0),
  3354. /* DIV_APOLLO1 */
  3355. DIV_F(CLK_DIV_SCLK_HPM_APOLLO, "div_sclk_hpm_apollo", "mout_apollo",
  3356. DIV_APOLLO1, 4, 3, CLK_GET_RATE_NOCACHE,
  3357. CLK_DIVIDER_READ_ONLY),
  3358. DIV_F(CLK_DIV_APOLLO_PLL, "div_apollo_pll", "mout_apollo",
  3359. DIV_APOLLO1, 0, 3, CLK_GET_RATE_NOCACHE,
  3360. CLK_DIVIDER_READ_ONLY),
  3361. };
  3362. static const struct samsung_gate_clock apollo_gate_clks[] __initconst = {
  3363. /* ENABLE_ACLK_APOLLO */
  3364. GATE(CLK_ACLK_ASATBSLV_APOLLO_3_CSSYS, "aclk_asatbslv_apollo_3_cssys",
  3365. "div_atclk_apollo", ENABLE_ACLK_APOLLO,
  3366. 6, CLK_IGNORE_UNUSED, 0),
  3367. GATE(CLK_ACLK_ASATBSLV_APOLLO_2_CSSYS, "aclk_asatbslv_apollo_2_cssys",
  3368. "div_atclk_apollo", ENABLE_ACLK_APOLLO,
  3369. 5, CLK_IGNORE_UNUSED, 0),
  3370. GATE(CLK_ACLK_ASATBSLV_APOLLO_1_CSSYS, "aclk_asatbslv_apollo_1_cssys",
  3371. "div_atclk_apollo", ENABLE_ACLK_APOLLO,
  3372. 4, CLK_IGNORE_UNUSED, 0),
  3373. GATE(CLK_ACLK_ASATBSLV_APOLLO_0_CSSYS, "aclk_asatbslv_apollo_0_cssys",
  3374. "div_atclk_apollo", ENABLE_ACLK_APOLLO,
  3375. 3, CLK_IGNORE_UNUSED, 0),
  3376. GATE(CLK_ACLK_ASYNCACES_APOLLO_CCI, "aclk_asyncaces_apollo_cci",
  3377. "div_aclk_apollo", ENABLE_ACLK_APOLLO,
  3378. 2, CLK_IGNORE_UNUSED, 0),
  3379. GATE(CLK_ACLK_AHB2APB_APOLLOP, "aclk_ahb2apb_apollop",
  3380. "div_pclk_apollo", ENABLE_ACLK_APOLLO,
  3381. 1, CLK_IGNORE_UNUSED, 0),
  3382. GATE(CLK_ACLK_APOLLONP_200, "aclk_apollonp_200",
  3383. "div_pclk_apollo", ENABLE_ACLK_APOLLO,
  3384. 0, CLK_IGNORE_UNUSED, 0),
  3385. /* ENABLE_PCLK_APOLLO */
  3386. GATE(CLK_PCLK_ASAPBMST_CSSYS_APOLLO, "pclk_asapbmst_cssys_apollo",
  3387. "div_pclk_dbg_apollo", ENABLE_PCLK_APOLLO,
  3388. 2, CLK_IGNORE_UNUSED, 0),
  3389. GATE(CLK_PCLK_PMU_APOLLO, "pclk_pmu_apollo", "div_pclk_apollo",
  3390. ENABLE_PCLK_APOLLO, 1, CLK_IGNORE_UNUSED, 0),
  3391. GATE(CLK_PCLK_SYSREG_APOLLO, "pclk_sysreg_apollo",
  3392. "div_pclk_apollo", ENABLE_PCLK_APOLLO,
  3393. 0, CLK_IGNORE_UNUSED, 0),
  3394. /* ENABLE_SCLK_APOLLO */
  3395. GATE(CLK_CNTCLK_APOLLO, "cntclk_apollo", "div_cntclk_apollo",
  3396. ENABLE_SCLK_APOLLO, 3, CLK_IGNORE_UNUSED, 0),
  3397. GATE(CLK_SCLK_HPM_APOLLO, "sclk_hpm_apollo", "div_sclk_hpm_apollo",
  3398. ENABLE_SCLK_APOLLO, 1, CLK_IGNORE_UNUSED, 0),
  3399. };
  3400. #define E5433_APOLLO_DIV0(cntclk, pclk_dbg, atclk, pclk, aclk) \
  3401. (((cntclk) << 24) | ((pclk_dbg) << 20) | ((atclk) << 16) | \
  3402. ((pclk) << 12) | ((aclk) << 8))
  3403. #define E5433_APOLLO_DIV1(hpm, copy) \
  3404. (((hpm) << 4) | ((copy) << 0))
  3405. static const struct exynos_cpuclk_cfg_data exynos5433_apolloclk_d[] __initconst = {
  3406. { 1300000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
  3407. { 1200000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
  3408. { 1100000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
  3409. { 1000000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
  3410. { 900000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
  3411. { 800000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
  3412. { 700000, E5433_APOLLO_DIV0(3, 7, 7, 7, 2), E5433_APOLLO_DIV1(7, 1), },
  3413. { 600000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), },
  3414. { 500000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), },
  3415. { 400000, E5433_APOLLO_DIV0(3, 7, 7, 7, 1), E5433_APOLLO_DIV1(7, 1), },
  3416. { 0 },
  3417. };
  3418. static void __init exynos5433_cmu_apollo_init(struct device_node *np)
  3419. {
  3420. void __iomem *reg_base;
  3421. struct samsung_clk_provider *ctx;
  3422. reg_base = of_iomap(np, 0);
  3423. if (!reg_base) {
  3424. panic("%s: failed to map registers\n", __func__);
  3425. return;
  3426. }
  3427. ctx = samsung_clk_init(np, reg_base, APOLLO_NR_CLK);
  3428. if (!ctx) {
  3429. panic("%s: unable to allocate ctx\n", __func__);
  3430. return;
  3431. }
  3432. samsung_clk_register_pll(ctx, apollo_pll_clks,
  3433. ARRAY_SIZE(apollo_pll_clks), reg_base);
  3434. samsung_clk_register_mux(ctx, apollo_mux_clks,
  3435. ARRAY_SIZE(apollo_mux_clks));
  3436. samsung_clk_register_div(ctx, apollo_div_clks,
  3437. ARRAY_SIZE(apollo_div_clks));
  3438. samsung_clk_register_gate(ctx, apollo_gate_clks,
  3439. ARRAY_SIZE(apollo_gate_clks));
  3440. exynos_register_cpu_clock(ctx, CLK_SCLK_APOLLO, "apolloclk",
  3441. mout_apollo_p[0], mout_apollo_p[1], 0x200,
  3442. exynos5433_apolloclk_d, ARRAY_SIZE(exynos5433_apolloclk_d),
  3443. CLK_CPU_HAS_E5433_REGS_LAYOUT);
  3444. samsung_clk_sleep_init(reg_base, apollo_clk_regs,
  3445. ARRAY_SIZE(apollo_clk_regs));
  3446. samsung_clk_of_add_provider(np, ctx);
  3447. }
  3448. CLK_OF_DECLARE(exynos5433_cmu_apollo, "samsung,exynos5433-cmu-apollo",
  3449. exynos5433_cmu_apollo_init);
  3450. /*
  3451. * Register offset definitions for CMU_ATLAS
  3452. */
  3453. #define ATLAS_PLL_LOCK 0x0000
  3454. #define ATLAS_PLL_CON0 0x0100
  3455. #define ATLAS_PLL_CON1 0x0104
  3456. #define ATLAS_PLL_FREQ_DET 0x010c
  3457. #define MUX_SEL_ATLAS0 0x0200
  3458. #define MUX_SEL_ATLAS1 0x0204
  3459. #define MUX_SEL_ATLAS2 0x0208
  3460. #define MUX_ENABLE_ATLAS0 0x0300
  3461. #define MUX_ENABLE_ATLAS1 0x0304
  3462. #define MUX_ENABLE_ATLAS2 0x0308
  3463. #define MUX_STAT_ATLAS0 0x0400
  3464. #define MUX_STAT_ATLAS1 0x0404
  3465. #define MUX_STAT_ATLAS2 0x0408
  3466. #define DIV_ATLAS0 0x0600
  3467. #define DIV_ATLAS1 0x0604
  3468. #define DIV_ATLAS_PLL_FREQ_DET 0x0608
  3469. #define DIV_STAT_ATLAS0 0x0700
  3470. #define DIV_STAT_ATLAS1 0x0704
  3471. #define DIV_STAT_ATLAS_PLL_FREQ_DET 0x0708
  3472. #define ENABLE_ACLK_ATLAS 0x0800
  3473. #define ENABLE_PCLK_ATLAS 0x0900
  3474. #define ENABLE_SCLK_ATLAS 0x0a00
  3475. #define ENABLE_IP_ATLAS0 0x0b00
  3476. #define ENABLE_IP_ATLAS1 0x0b04
  3477. #define CLKOUT_CMU_ATLAS 0x0c00
  3478. #define CLKOUT_CMU_ATLAS_DIV_STAT 0x0c04
  3479. #define ARMCLK_STOPCTRL 0x1000
  3480. #define ATLAS_PWR_CTRL 0x1020
  3481. #define ATLAS_PWR_CTRL2 0x1024
  3482. #define ATLAS_INTR_SPREAD_ENABLE 0x1080
  3483. #define ATLAS_INTR_SPREAD_USE_STANDBYWFI 0x1084
  3484. #define ATLAS_INTR_SPREAD_BLOCKING_DURATION 0x1088
  3485. static const unsigned long atlas_clk_regs[] __initconst = {
  3486. ATLAS_PLL_LOCK,
  3487. ATLAS_PLL_CON0,
  3488. ATLAS_PLL_CON1,
  3489. ATLAS_PLL_FREQ_DET,
  3490. MUX_SEL_ATLAS0,
  3491. MUX_SEL_ATLAS1,
  3492. MUX_SEL_ATLAS2,
  3493. MUX_ENABLE_ATLAS0,
  3494. MUX_ENABLE_ATLAS1,
  3495. MUX_ENABLE_ATLAS2,
  3496. DIV_ATLAS0,
  3497. DIV_ATLAS1,
  3498. DIV_ATLAS_PLL_FREQ_DET,
  3499. ENABLE_ACLK_ATLAS,
  3500. ENABLE_PCLK_ATLAS,
  3501. ENABLE_SCLK_ATLAS,
  3502. ENABLE_IP_ATLAS0,
  3503. ENABLE_IP_ATLAS1,
  3504. CLKOUT_CMU_ATLAS,
  3505. CLKOUT_CMU_ATLAS_DIV_STAT,
  3506. ARMCLK_STOPCTRL,
  3507. ATLAS_PWR_CTRL,
  3508. ATLAS_PWR_CTRL2,
  3509. ATLAS_INTR_SPREAD_ENABLE,
  3510. ATLAS_INTR_SPREAD_USE_STANDBYWFI,
  3511. ATLAS_INTR_SPREAD_BLOCKING_DURATION,
  3512. };
  3513. /* list of all parent clock list */
  3514. PNAME(mout_atlas_pll_p) = { "oscclk", "fout_atlas_pll", };
  3515. PNAME(mout_bus_pll_atlas_user_p) = { "oscclk", "sclk_bus_pll_atlas", };
  3516. PNAME(mout_atlas_p) = { "mout_atlas_pll",
  3517. "mout_bus_pll_atlas_user", };
  3518. static const struct samsung_pll_clock atlas_pll_clks[] __initconst = {
  3519. PLL(pll_35xx, CLK_FOUT_ATLAS_PLL, "fout_atlas_pll", "oscclk",
  3520. ATLAS_PLL_LOCK, ATLAS_PLL_CON0, exynos5433_pll_rates),
  3521. };
  3522. static const struct samsung_mux_clock atlas_mux_clks[] __initconst = {
  3523. /* MUX_SEL_ATLAS0 */
  3524. MUX_F(CLK_MOUT_ATLAS_PLL, "mout_atlas_pll", mout_atlas_pll_p,
  3525. MUX_SEL_ATLAS0, 0, 1, CLK_SET_RATE_PARENT |
  3526. CLK_RECALC_NEW_RATES, 0),
  3527. /* MUX_SEL_ATLAS1 */
  3528. MUX(CLK_MOUT_BUS_PLL_ATLAS_USER, "mout_bus_pll_atlas_user",
  3529. mout_bus_pll_atlas_user_p, MUX_SEL_ATLAS1, 0, 1),
  3530. /* MUX_SEL_ATLAS2 */
  3531. MUX_F(CLK_MOUT_ATLAS, "mout_atlas", mout_atlas_p, MUX_SEL_ATLAS2,
  3532. 0, 1, CLK_SET_RATE_PARENT, 0),
  3533. };
  3534. static const struct samsung_div_clock atlas_div_clks[] __initconst = {
  3535. /* DIV_ATLAS0 */
  3536. DIV_F(CLK_DIV_CNTCLK_ATLAS, "div_cntclk_atlas", "div_atlas2",
  3537. DIV_ATLAS0, 24, 3, CLK_GET_RATE_NOCACHE,
  3538. CLK_DIVIDER_READ_ONLY),
  3539. DIV_F(CLK_DIV_PCLK_DBG_ATLAS, "div_pclk_dbg_atlas", "div_atclk_atlas",
  3540. DIV_ATLAS0, 20, 3, CLK_GET_RATE_NOCACHE,
  3541. CLK_DIVIDER_READ_ONLY),
  3542. DIV_F(CLK_DIV_ATCLK_ATLASO, "div_atclk_atlas", "div_atlas2",
  3543. DIV_ATLAS0, 16, 3, CLK_GET_RATE_NOCACHE,
  3544. CLK_DIVIDER_READ_ONLY),
  3545. DIV_F(CLK_DIV_PCLK_ATLAS, "div_pclk_atlas", "div_atlas2",
  3546. DIV_ATLAS0, 12, 3, CLK_GET_RATE_NOCACHE,
  3547. CLK_DIVIDER_READ_ONLY),
  3548. DIV_F(CLK_DIV_ACLK_ATLAS, "div_aclk_atlas", "div_atlas2",
  3549. DIV_ATLAS0, 8, 3, CLK_GET_RATE_NOCACHE,
  3550. CLK_DIVIDER_READ_ONLY),
  3551. DIV_F(CLK_DIV_ATLAS2, "div_atlas2", "div_atlas1",
  3552. DIV_ATLAS0, 4, 3, CLK_SET_RATE_PARENT, 0),
  3553. DIV_F(CLK_DIV_ATLAS1, "div_atlas1", "mout_atlas",
  3554. DIV_ATLAS0, 0, 3, CLK_SET_RATE_PARENT, 0),
  3555. /* DIV_ATLAS1 */
  3556. DIV_F(CLK_DIV_SCLK_HPM_ATLAS, "div_sclk_hpm_atlas", "mout_atlas",
  3557. DIV_ATLAS1, 4, 3, CLK_GET_RATE_NOCACHE,
  3558. CLK_DIVIDER_READ_ONLY),
  3559. DIV_F(CLK_DIV_ATLAS_PLL, "div_atlas_pll", "mout_atlas",
  3560. DIV_ATLAS1, 0, 3, CLK_GET_RATE_NOCACHE,
  3561. CLK_DIVIDER_READ_ONLY),
  3562. };
  3563. static const struct samsung_gate_clock atlas_gate_clks[] __initconst = {
  3564. /* ENABLE_ACLK_ATLAS */
  3565. GATE(CLK_ACLK_ATB_AUD_CSSYS, "aclk_atb_aud_cssys",
  3566. "div_atclk_atlas", ENABLE_ACLK_ATLAS,
  3567. 9, CLK_IGNORE_UNUSED, 0),
  3568. GATE(CLK_ACLK_ATB_APOLLO3_CSSYS, "aclk_atb_apollo3_cssys",
  3569. "div_atclk_atlas", ENABLE_ACLK_ATLAS,
  3570. 8, CLK_IGNORE_UNUSED, 0),
  3571. GATE(CLK_ACLK_ATB_APOLLO2_CSSYS, "aclk_atb_apollo2_cssys",
  3572. "div_atclk_atlas", ENABLE_ACLK_ATLAS,
  3573. 7, CLK_IGNORE_UNUSED, 0),
  3574. GATE(CLK_ACLK_ATB_APOLLO1_CSSYS, "aclk_atb_apollo1_cssys",
  3575. "div_atclk_atlas", ENABLE_ACLK_ATLAS,
  3576. 6, CLK_IGNORE_UNUSED, 0),
  3577. GATE(CLK_ACLK_ATB_APOLLO0_CSSYS, "aclk_atb_apollo0_cssys",
  3578. "div_atclk_atlas", ENABLE_ACLK_ATLAS,
  3579. 5, CLK_IGNORE_UNUSED, 0),
  3580. GATE(CLK_ACLK_ASYNCAHBS_CSSYS_SSS, "aclk_asyncahbs_cssys_sss",
  3581. "div_atclk_atlas", ENABLE_ACLK_ATLAS,
  3582. 4, CLK_IGNORE_UNUSED, 0),
  3583. GATE(CLK_ACLK_ASYNCAXIS_CSSYS_CCIX, "aclk_asyncaxis_cssys_ccix",
  3584. "div_pclk_dbg_atlas", ENABLE_ACLK_ATLAS,
  3585. 3, CLK_IGNORE_UNUSED, 0),
  3586. GATE(CLK_ACLK_ASYNCACES_ATLAS_CCI, "aclk_asyncaces_atlas_cci",
  3587. "div_aclk_atlas", ENABLE_ACLK_ATLAS,
  3588. 2, CLK_IGNORE_UNUSED, 0),
  3589. GATE(CLK_ACLK_AHB2APB_ATLASP, "aclk_ahb2apb_atlasp", "div_pclk_atlas",
  3590. ENABLE_ACLK_ATLAS, 1, CLK_IGNORE_UNUSED, 0),
  3591. GATE(CLK_ACLK_ATLASNP_200, "aclk_atlasnp_200", "div_pclk_atlas",
  3592. ENABLE_ACLK_ATLAS, 0, CLK_IGNORE_UNUSED, 0),
  3593. /* ENABLE_PCLK_ATLAS */
  3594. GATE(CLK_PCLK_ASYNCAPB_AUD_CSSYS, "pclk_asyncapb_aud_cssys",
  3595. "div_pclk_dbg_atlas", ENABLE_PCLK_ATLAS,
  3596. 5, CLK_IGNORE_UNUSED, 0),
  3597. GATE(CLK_PCLK_ASYNCAPB_ISP_CSSYS, "pclk_asyncapb_isp_cssys",
  3598. "div_pclk_dbg_atlas", ENABLE_PCLK_ATLAS,
  3599. 4, CLK_IGNORE_UNUSED, 0),
  3600. GATE(CLK_PCLK_ASYNCAPB_APOLLO_CSSYS, "pclk_asyncapb_apollo_cssys",
  3601. "div_pclk_dbg_atlas", ENABLE_PCLK_ATLAS,
  3602. 3, CLK_IGNORE_UNUSED, 0),
  3603. GATE(CLK_PCLK_PMU_ATLAS, "pclk_pmu_atlas", "div_pclk_atlas",
  3604. ENABLE_PCLK_ATLAS, 2, CLK_IGNORE_UNUSED, 0),
  3605. GATE(CLK_PCLK_SYSREG_ATLAS, "pclk_sysreg_atlas", "div_pclk_atlas",
  3606. ENABLE_PCLK_ATLAS, 1, CLK_IGNORE_UNUSED, 0),
  3607. GATE(CLK_PCLK_SECJTAG, "pclk_secjtag", "div_pclk_dbg_atlas",
  3608. ENABLE_PCLK_ATLAS, 0, CLK_IGNORE_UNUSED, 0),
  3609. /* ENABLE_SCLK_ATLAS */
  3610. GATE(CLK_CNTCLK_ATLAS, "cntclk_atlas", "div_cntclk_atlas",
  3611. ENABLE_SCLK_ATLAS, 10, CLK_IGNORE_UNUSED, 0),
  3612. GATE(CLK_SCLK_HPM_ATLAS, "sclk_hpm_atlas", "div_sclk_hpm_atlas",
  3613. ENABLE_SCLK_ATLAS, 7, CLK_IGNORE_UNUSED, 0),
  3614. GATE(CLK_TRACECLK, "traceclk", "div_atclk_atlas",
  3615. ENABLE_SCLK_ATLAS, 6, CLK_IGNORE_UNUSED, 0),
  3616. GATE(CLK_CTMCLK, "ctmclk", "div_atclk_atlas",
  3617. ENABLE_SCLK_ATLAS, 5, CLK_IGNORE_UNUSED, 0),
  3618. GATE(CLK_HCLK_CSSYS, "hclk_cssys", "div_atclk_atlas",
  3619. ENABLE_SCLK_ATLAS, 4, CLK_IGNORE_UNUSED, 0),
  3620. GATE(CLK_PCLK_DBG_CSSYS, "pclk_dbg_cssys", "div_pclk_dbg_atlas",
  3621. ENABLE_SCLK_ATLAS, 3, CLK_IGNORE_UNUSED, 0),
  3622. GATE(CLK_PCLK_DBG, "pclk_dbg", "div_pclk_dbg_atlas",
  3623. ENABLE_SCLK_ATLAS, 2, CLK_IGNORE_UNUSED, 0),
  3624. GATE(CLK_ATCLK, "atclk", "div_atclk_atlas",
  3625. ENABLE_SCLK_ATLAS, 1, CLK_IGNORE_UNUSED, 0),
  3626. };
  3627. #define E5433_ATLAS_DIV0(cntclk, pclk_dbg, atclk, pclk, aclk) \
  3628. (((cntclk) << 24) | ((pclk_dbg) << 20) | ((atclk) << 16) | \
  3629. ((pclk) << 12) | ((aclk) << 8))
  3630. #define E5433_ATLAS_DIV1(hpm, copy) \
  3631. (((hpm) << 4) | ((copy) << 0))
  3632. static const struct exynos_cpuclk_cfg_data exynos5433_atlasclk_d[] __initconst = {
  3633. { 1900000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
  3634. { 1800000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
  3635. { 1700000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
  3636. { 1600000, E5433_ATLAS_DIV0(7, 7, 7, 7, 4), E5433_ATLAS_DIV1(7, 1), },
  3637. { 1500000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
  3638. { 1400000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
  3639. { 1300000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
  3640. { 1200000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
  3641. { 1100000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
  3642. { 1000000, E5433_ATLAS_DIV0(7, 7, 7, 7, 3), E5433_ATLAS_DIV1(7, 1), },
  3643. { 900000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
  3644. { 800000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
  3645. { 700000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
  3646. { 600000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
  3647. { 500000, E5433_ATLAS_DIV0(7, 7, 7, 7, 2), E5433_ATLAS_DIV1(7, 1), },
  3648. { 0 },
  3649. };
  3650. static void __init exynos5433_cmu_atlas_init(struct device_node *np)
  3651. {
  3652. void __iomem *reg_base;
  3653. struct samsung_clk_provider *ctx;
  3654. reg_base = of_iomap(np, 0);
  3655. if (!reg_base) {
  3656. panic("%s: failed to map registers\n", __func__);
  3657. return;
  3658. }
  3659. ctx = samsung_clk_init(np, reg_base, ATLAS_NR_CLK);
  3660. if (!ctx) {
  3661. panic("%s: unable to allocate ctx\n", __func__);
  3662. return;
  3663. }
  3664. samsung_clk_register_pll(ctx, atlas_pll_clks,
  3665. ARRAY_SIZE(atlas_pll_clks), reg_base);
  3666. samsung_clk_register_mux(ctx, atlas_mux_clks,
  3667. ARRAY_SIZE(atlas_mux_clks));
  3668. samsung_clk_register_div(ctx, atlas_div_clks,
  3669. ARRAY_SIZE(atlas_div_clks));
  3670. samsung_clk_register_gate(ctx, atlas_gate_clks,
  3671. ARRAY_SIZE(atlas_gate_clks));
  3672. exynos_register_cpu_clock(ctx, CLK_SCLK_ATLAS, "atlasclk",
  3673. mout_atlas_p[0], mout_atlas_p[1], 0x200,
  3674. exynos5433_atlasclk_d, ARRAY_SIZE(exynos5433_atlasclk_d),
  3675. CLK_CPU_HAS_E5433_REGS_LAYOUT);
  3676. samsung_clk_sleep_init(reg_base, atlas_clk_regs,
  3677. ARRAY_SIZE(atlas_clk_regs));
  3678. samsung_clk_of_add_provider(np, ctx);
  3679. }
  3680. CLK_OF_DECLARE(exynos5433_cmu_atlas, "samsung,exynos5433-cmu-atlas",
  3681. exynos5433_cmu_atlas_init);
  3682. /*
  3683. * Register offset definitions for CMU_MSCL
  3684. */
  3685. #define MUX_SEL_MSCL0 0x0200
  3686. #define MUX_SEL_MSCL1 0x0204
  3687. #define MUX_ENABLE_MSCL0 0x0300
  3688. #define MUX_ENABLE_MSCL1 0x0304
  3689. #define MUX_STAT_MSCL0 0x0400
  3690. #define MUX_STAT_MSCL1 0x0404
  3691. #define DIV_MSCL 0x0600
  3692. #define DIV_STAT_MSCL 0x0700
  3693. #define ENABLE_ACLK_MSCL 0x0800
  3694. #define ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0 0x0804
  3695. #define ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1 0x0808
  3696. #define ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG 0x080c
  3697. #define ENABLE_PCLK_MSCL 0x0900
  3698. #define ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0 0x0904
  3699. #define ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1 0x0908
  3700. #define ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG 0x090c
  3701. #define ENABLE_SCLK_MSCL 0x0a00
  3702. #define ENABLE_IP_MSCL0 0x0b00
  3703. #define ENABLE_IP_MSCL1 0x0b04
  3704. #define ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER0 0x0b08
  3705. #define ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER1 0x0b0c
  3706. #define ENABLE_IP_MSCL_SECURE_SMMU_JPEG 0x0b10
  3707. static const unsigned long mscl_clk_regs[] __initconst = {
  3708. MUX_SEL_MSCL0,
  3709. MUX_SEL_MSCL1,
  3710. MUX_ENABLE_MSCL0,
  3711. MUX_ENABLE_MSCL1,
  3712. DIV_MSCL,
  3713. ENABLE_ACLK_MSCL,
  3714. ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0,
  3715. ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1,
  3716. ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG,
  3717. ENABLE_PCLK_MSCL,
  3718. ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0,
  3719. ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1,
  3720. ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG,
  3721. ENABLE_SCLK_MSCL,
  3722. ENABLE_IP_MSCL0,
  3723. ENABLE_IP_MSCL1,
  3724. ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER0,
  3725. ENABLE_IP_MSCL_SECURE_SMMU_M2MSCALER1,
  3726. ENABLE_IP_MSCL_SECURE_SMMU_JPEG,
  3727. };
  3728. static const struct samsung_clk_reg_dump mscl_suspend_regs[] = {
  3729. { MUX_SEL_MSCL0, 0 },
  3730. { MUX_SEL_MSCL1, 0 },
  3731. };
  3732. /* list of all parent clock list */
  3733. PNAME(mout_sclk_jpeg_user_p) = { "oscclk", "sclk_jpeg_mscl", };
  3734. PNAME(mout_aclk_mscl_400_user_p) = { "oscclk", "aclk_mscl_400", };
  3735. PNAME(mout_sclk_jpeg_p) = { "mout_sclk_jpeg_user",
  3736. "mout_aclk_mscl_400_user", };
  3737. static const struct samsung_mux_clock mscl_mux_clks[] __initconst = {
  3738. /* MUX_SEL_MSCL0 */
  3739. MUX(CLK_MOUT_SCLK_JPEG_USER, "mout_sclk_jpeg_user",
  3740. mout_sclk_jpeg_user_p, MUX_SEL_MSCL0, 4, 1),
  3741. MUX(CLK_MOUT_ACLK_MSCL_400_USER, "mout_aclk_mscl_400_user",
  3742. mout_aclk_mscl_400_user_p, MUX_SEL_MSCL0, 0, 1),
  3743. /* MUX_SEL_MSCL1 */
  3744. MUX(CLK_MOUT_SCLK_JPEG, "mout_sclk_jpeg", mout_sclk_jpeg_p,
  3745. MUX_SEL_MSCL1, 0, 1),
  3746. };
  3747. static const struct samsung_div_clock mscl_div_clks[] __initconst = {
  3748. /* DIV_MSCL */
  3749. DIV(CLK_DIV_PCLK_MSCL, "div_pclk_mscl", "mout_aclk_mscl_400_user",
  3750. DIV_MSCL, 0, 3),
  3751. };
  3752. static const struct samsung_gate_clock mscl_gate_clks[] __initconst = {
  3753. /* ENABLE_ACLK_MSCL */
  3754. GATE(CLK_ACLK_BTS_JPEG, "aclk_bts_jpeg", "mout_aclk_mscl_400_user",
  3755. ENABLE_ACLK_MSCL, 9, 0, 0),
  3756. GATE(CLK_ACLK_BTS_M2MSCALER1, "aclk_bts_m2mscaler1",
  3757. "mout_aclk_mscl_400_user", ENABLE_ACLK_MSCL, 8, 0, 0),
  3758. GATE(CLK_ACLK_BTS_M2MSCALER0, "aclk_bts_m2mscaler0",
  3759. "mout_aclk_mscl_400_user", ENABLE_ACLK_MSCL, 7, 0, 0),
  3760. GATE(CLK_ACLK_AHB2APB_MSCL0P, "aclk_abh2apb_mscl0p", "div_pclk_mscl",
  3761. ENABLE_ACLK_MSCL, 6, CLK_IGNORE_UNUSED, 0),
  3762. GATE(CLK_ACLK_XIU_MSCLX, "aclk_xiu_msclx", "mout_aclk_mscl_400_user",
  3763. ENABLE_ACLK_MSCL, 5, CLK_IGNORE_UNUSED, 0),
  3764. GATE(CLK_ACLK_MSCLNP_100, "aclk_msclnp_100", "div_pclk_mscl",
  3765. ENABLE_ACLK_MSCL, 4, CLK_IGNORE_UNUSED, 0),
  3766. GATE(CLK_ACLK_MSCLND_400, "aclk_msclnd_400", "mout_aclk_mscl_400_user",
  3767. ENABLE_ACLK_MSCL, 3, CLK_IGNORE_UNUSED, 0),
  3768. GATE(CLK_ACLK_JPEG, "aclk_jpeg", "mout_aclk_mscl_400_user",
  3769. ENABLE_ACLK_MSCL, 2, 0, 0),
  3770. GATE(CLK_ACLK_M2MSCALER1, "aclk_m2mscaler1", "mout_aclk_mscl_400_user",
  3771. ENABLE_ACLK_MSCL, 1, 0, 0),
  3772. GATE(CLK_ACLK_M2MSCALER0, "aclk_m2mscaler0", "mout_aclk_mscl_400_user",
  3773. ENABLE_ACLK_MSCL, 0, 0, 0),
  3774. /* ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0 */
  3775. GATE(CLK_ACLK_SMMU_M2MSCALER0, "aclk_smmu_m2mscaler0",
  3776. "mout_aclk_mscl_400_user",
  3777. ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER0,
  3778. 0, CLK_IGNORE_UNUSED, 0),
  3779. /* ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1 */
  3780. GATE(CLK_ACLK_SMMU_M2MSCALER1, "aclk_smmu_m2mscaler1",
  3781. "mout_aclk_mscl_400_user",
  3782. ENABLE_ACLK_MSCL_SECURE_SMMU_M2MSCALER1,
  3783. 0, CLK_IGNORE_UNUSED, 0),
  3784. /* ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG */
  3785. GATE(CLK_ACLK_SMMU_JPEG, "aclk_smmu_jpeg", "mout_aclk_mscl_400_user",
  3786. ENABLE_ACLK_MSCL_SECURE_SMMU_JPEG,
  3787. 0, CLK_IGNORE_UNUSED, 0),
  3788. /* ENABLE_PCLK_MSCL */
  3789. GATE(CLK_PCLK_BTS_JPEG, "pclk_bts_jpeg", "div_pclk_mscl",
  3790. ENABLE_PCLK_MSCL, 7, 0, 0),
  3791. GATE(CLK_PCLK_BTS_M2MSCALER1, "pclk_bts_m2mscaler1", "div_pclk_mscl",
  3792. ENABLE_PCLK_MSCL, 6, 0, 0),
  3793. GATE(CLK_PCLK_BTS_M2MSCALER0, "pclk_bts_m2mscaler0", "div_pclk_mscl",
  3794. ENABLE_PCLK_MSCL, 5, 0, 0),
  3795. GATE(CLK_PCLK_PMU_MSCL, "pclk_pmu_mscl", "div_pclk_mscl",
  3796. ENABLE_PCLK_MSCL, 4, CLK_IGNORE_UNUSED, 0),
  3797. GATE(CLK_PCLK_SYSREG_MSCL, "pclk_sysreg_mscl", "div_pclk_mscl",
  3798. ENABLE_PCLK_MSCL, 3, CLK_IGNORE_UNUSED, 0),
  3799. GATE(CLK_PCLK_JPEG, "pclk_jpeg", "div_pclk_mscl",
  3800. ENABLE_PCLK_MSCL, 2, 0, 0),
  3801. GATE(CLK_PCLK_M2MSCALER1, "pclk_m2mscaler1", "div_pclk_mscl",
  3802. ENABLE_PCLK_MSCL, 1, 0, 0),
  3803. GATE(CLK_PCLK_M2MSCALER0, "pclk_m2mscaler0", "div_pclk_mscl",
  3804. ENABLE_PCLK_MSCL, 0, 0, 0),
  3805. /* ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0 */
  3806. GATE(CLK_PCLK_SMMU_M2MSCALER0, "pclk_smmu_m2mscaler0", "div_pclk_mscl",
  3807. ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER0,
  3808. 0, CLK_IGNORE_UNUSED, 0),
  3809. /* ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1 */
  3810. GATE(CLK_PCLK_SMMU_M2MSCALER1, "pclk_smmu_m2mscaler1", "div_pclk_mscl",
  3811. ENABLE_PCLK_MSCL_SECURE_SMMU_M2MSCALER1,
  3812. 0, CLK_IGNORE_UNUSED, 0),
  3813. /* ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG */
  3814. GATE(CLK_PCLK_SMMU_JPEG, "pclk_smmu_jpeg", "div_pclk_mscl",
  3815. ENABLE_PCLK_MSCL_SECURE_SMMU_JPEG,
  3816. 0, CLK_IGNORE_UNUSED, 0),
  3817. /* ENABLE_SCLK_MSCL */
  3818. GATE(CLK_SCLK_JPEG, "sclk_jpeg", "mout_sclk_jpeg", ENABLE_SCLK_MSCL, 0,
  3819. CLK_IGNORE_UNUSED | CLK_SET_RATE_PARENT, 0),
  3820. };
  3821. static const struct samsung_cmu_info mscl_cmu_info __initconst = {
  3822. .mux_clks = mscl_mux_clks,
  3823. .nr_mux_clks = ARRAY_SIZE(mscl_mux_clks),
  3824. .div_clks = mscl_div_clks,
  3825. .nr_div_clks = ARRAY_SIZE(mscl_div_clks),
  3826. .gate_clks = mscl_gate_clks,
  3827. .nr_gate_clks = ARRAY_SIZE(mscl_gate_clks),
  3828. .nr_clk_ids = MSCL_NR_CLK,
  3829. .clk_regs = mscl_clk_regs,
  3830. .nr_clk_regs = ARRAY_SIZE(mscl_clk_regs),
  3831. .suspend_regs = mscl_suspend_regs,
  3832. .nr_suspend_regs = ARRAY_SIZE(mscl_suspend_regs),
  3833. .clk_name = "aclk_mscl_400",
  3834. };
  3835. /*
  3836. * Register offset definitions for CMU_MFC
  3837. */
  3838. #define MUX_SEL_MFC 0x0200
  3839. #define MUX_ENABLE_MFC 0x0300
  3840. #define MUX_STAT_MFC 0x0400
  3841. #define DIV_MFC 0x0600
  3842. #define DIV_STAT_MFC 0x0700
  3843. #define ENABLE_ACLK_MFC 0x0800
  3844. #define ENABLE_ACLK_MFC_SECURE_SMMU_MFC 0x0804
  3845. #define ENABLE_PCLK_MFC 0x0900
  3846. #define ENABLE_PCLK_MFC_SECURE_SMMU_MFC 0x0904
  3847. #define ENABLE_IP_MFC0 0x0b00
  3848. #define ENABLE_IP_MFC1 0x0b04
  3849. #define ENABLE_IP_MFC_SECURE_SMMU_MFC 0x0b08
  3850. static const unsigned long mfc_clk_regs[] __initconst = {
  3851. MUX_SEL_MFC,
  3852. MUX_ENABLE_MFC,
  3853. DIV_MFC,
  3854. ENABLE_ACLK_MFC,
  3855. ENABLE_ACLK_MFC_SECURE_SMMU_MFC,
  3856. ENABLE_PCLK_MFC,
  3857. ENABLE_PCLK_MFC_SECURE_SMMU_MFC,
  3858. ENABLE_IP_MFC0,
  3859. ENABLE_IP_MFC1,
  3860. ENABLE_IP_MFC_SECURE_SMMU_MFC,
  3861. };
  3862. static const struct samsung_clk_reg_dump mfc_suspend_regs[] = {
  3863. { MUX_SEL_MFC, 0 },
  3864. };
  3865. PNAME(mout_aclk_mfc_400_user_p) = { "oscclk", "aclk_mfc_400", };
  3866. static const struct samsung_mux_clock mfc_mux_clks[] __initconst = {
  3867. /* MUX_SEL_MFC */
  3868. MUX(CLK_MOUT_ACLK_MFC_400_USER, "mout_aclk_mfc_400_user",
  3869. mout_aclk_mfc_400_user_p, MUX_SEL_MFC, 0, 0),
  3870. };
  3871. static const struct samsung_div_clock mfc_div_clks[] __initconst = {
  3872. /* DIV_MFC */
  3873. DIV(CLK_DIV_PCLK_MFC, "div_pclk_mfc", "mout_aclk_mfc_400_user",
  3874. DIV_MFC, 0, 2),
  3875. };
  3876. static const struct samsung_gate_clock mfc_gate_clks[] __initconst = {
  3877. /* ENABLE_ACLK_MFC */
  3878. GATE(CLK_ACLK_BTS_MFC_1, "aclk_bts_mfc_1", "mout_aclk_mfc_400_user",
  3879. ENABLE_ACLK_MFC, 6, 0, 0),
  3880. GATE(CLK_ACLK_BTS_MFC_0, "aclk_bts_mfc_0", "mout_aclk_mfc_400_user",
  3881. ENABLE_ACLK_MFC, 5, 0, 0),
  3882. GATE(CLK_ACLK_AHB2APB_MFCP, "aclk_ahb2apb_mfcp", "div_pclk_mfc",
  3883. ENABLE_ACLK_MFC, 4, CLK_IGNORE_UNUSED, 0),
  3884. GATE(CLK_ACLK_XIU_MFCX, "aclk_xiu_mfcx", "mout_aclk_mfc_400_user",
  3885. ENABLE_ACLK_MFC, 3, CLK_IGNORE_UNUSED, 0),
  3886. GATE(CLK_ACLK_MFCNP_100, "aclk_mfcnp_100", "div_pclk_mfc",
  3887. ENABLE_ACLK_MFC, 2, CLK_IGNORE_UNUSED, 0),
  3888. GATE(CLK_ACLK_MFCND_400, "aclk_mfcnd_400", "mout_aclk_mfc_400_user",
  3889. ENABLE_ACLK_MFC, 1, CLK_IGNORE_UNUSED, 0),
  3890. GATE(CLK_ACLK_MFC, "aclk_mfc", "mout_aclk_mfc_400_user",
  3891. ENABLE_ACLK_MFC, 0, 0, 0),
  3892. /* ENABLE_ACLK_MFC_SECURE_SMMU_MFC */
  3893. GATE(CLK_ACLK_SMMU_MFC_1, "aclk_smmu_mfc_1", "mout_aclk_mfc_400_user",
  3894. ENABLE_ACLK_MFC_SECURE_SMMU_MFC,
  3895. 1, CLK_IGNORE_UNUSED, 0),
  3896. GATE(CLK_ACLK_SMMU_MFC_0, "aclk_smmu_mfc_0", "mout_aclk_mfc_400_user",
  3897. ENABLE_ACLK_MFC_SECURE_SMMU_MFC,
  3898. 0, CLK_IGNORE_UNUSED, 0),
  3899. /* ENABLE_PCLK_MFC */
  3900. GATE(CLK_PCLK_BTS_MFC_1, "pclk_bts_mfc_1", "div_pclk_mfc",
  3901. ENABLE_PCLK_MFC, 4, 0, 0),
  3902. GATE(CLK_PCLK_BTS_MFC_0, "pclk_bts_mfc_0", "div_pclk_mfc",
  3903. ENABLE_PCLK_MFC, 3, 0, 0),
  3904. GATE(CLK_PCLK_PMU_MFC, "pclk_pmu_mfc", "div_pclk_mfc",
  3905. ENABLE_PCLK_MFC, 2, CLK_IGNORE_UNUSED, 0),
  3906. GATE(CLK_PCLK_SYSREG_MFC, "pclk_sysreg_mfc", "div_pclk_mfc",
  3907. ENABLE_PCLK_MFC, 1, CLK_IGNORE_UNUSED, 0),
  3908. GATE(CLK_PCLK_MFC, "pclk_mfc", "div_pclk_mfc",
  3909. ENABLE_PCLK_MFC, 4, CLK_IGNORE_UNUSED, 0),
  3910. /* ENABLE_PCLK_MFC_SECURE_SMMU_MFC */
  3911. GATE(CLK_PCLK_SMMU_MFC_1, "pclk_smmu_mfc_1", "div_pclk_mfc",
  3912. ENABLE_PCLK_MFC_SECURE_SMMU_MFC,
  3913. 1, CLK_IGNORE_UNUSED, 0),
  3914. GATE(CLK_PCLK_SMMU_MFC_0, "pclk_smmu_mfc_0", "div_pclk_mfc",
  3915. ENABLE_PCLK_MFC_SECURE_SMMU_MFC,
  3916. 0, CLK_IGNORE_UNUSED, 0),
  3917. };
  3918. static const struct samsung_cmu_info mfc_cmu_info __initconst = {
  3919. .mux_clks = mfc_mux_clks,
  3920. .nr_mux_clks = ARRAY_SIZE(mfc_mux_clks),
  3921. .div_clks = mfc_div_clks,
  3922. .nr_div_clks = ARRAY_SIZE(mfc_div_clks),
  3923. .gate_clks = mfc_gate_clks,
  3924. .nr_gate_clks = ARRAY_SIZE(mfc_gate_clks),
  3925. .nr_clk_ids = MFC_NR_CLK,
  3926. .clk_regs = mfc_clk_regs,
  3927. .nr_clk_regs = ARRAY_SIZE(mfc_clk_regs),
  3928. .suspend_regs = mfc_suspend_regs,
  3929. .nr_suspend_regs = ARRAY_SIZE(mfc_suspend_regs),
  3930. .clk_name = "aclk_mfc_400",
  3931. };
  3932. /*
  3933. * Register offset definitions for CMU_HEVC
  3934. */
  3935. #define MUX_SEL_HEVC 0x0200
  3936. #define MUX_ENABLE_HEVC 0x0300
  3937. #define MUX_STAT_HEVC 0x0400
  3938. #define DIV_HEVC 0x0600
  3939. #define DIV_STAT_HEVC 0x0700
  3940. #define ENABLE_ACLK_HEVC 0x0800
  3941. #define ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC 0x0804
  3942. #define ENABLE_PCLK_HEVC 0x0900
  3943. #define ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC 0x0904
  3944. #define ENABLE_IP_HEVC0 0x0b00
  3945. #define ENABLE_IP_HEVC1 0x0b04
  3946. #define ENABLE_IP_HEVC_SECURE_SMMU_HEVC 0x0b08
  3947. static const unsigned long hevc_clk_regs[] __initconst = {
  3948. MUX_SEL_HEVC,
  3949. MUX_ENABLE_HEVC,
  3950. DIV_HEVC,
  3951. ENABLE_ACLK_HEVC,
  3952. ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC,
  3953. ENABLE_PCLK_HEVC,
  3954. ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC,
  3955. ENABLE_IP_HEVC0,
  3956. ENABLE_IP_HEVC1,
  3957. ENABLE_IP_HEVC_SECURE_SMMU_HEVC,
  3958. };
  3959. static const struct samsung_clk_reg_dump hevc_suspend_regs[] = {
  3960. { MUX_SEL_HEVC, 0 },
  3961. };
  3962. PNAME(mout_aclk_hevc_400_user_p) = { "oscclk", "aclk_hevc_400", };
  3963. static const struct samsung_mux_clock hevc_mux_clks[] __initconst = {
  3964. /* MUX_SEL_HEVC */
  3965. MUX(CLK_MOUT_ACLK_HEVC_400_USER, "mout_aclk_hevc_400_user",
  3966. mout_aclk_hevc_400_user_p, MUX_SEL_HEVC, 0, 0),
  3967. };
  3968. static const struct samsung_div_clock hevc_div_clks[] __initconst = {
  3969. /* DIV_HEVC */
  3970. DIV(CLK_DIV_PCLK_HEVC, "div_pclk_hevc", "mout_aclk_hevc_400_user",
  3971. DIV_HEVC, 0, 2),
  3972. };
  3973. static const struct samsung_gate_clock hevc_gate_clks[] __initconst = {
  3974. /* ENABLE_ACLK_HEVC */
  3975. GATE(CLK_ACLK_BTS_HEVC_1, "aclk_bts_hevc_1", "mout_aclk_hevc_400_user",
  3976. ENABLE_ACLK_HEVC, 6, 0, 0),
  3977. GATE(CLK_ACLK_BTS_HEVC_0, "aclk_bts_hevc_0", "mout_aclk_hevc_400_user",
  3978. ENABLE_ACLK_HEVC, 5, 0, 0),
  3979. GATE(CLK_ACLK_AHB2APB_HEVCP, "aclk_ahb2apb_hevcp", "div_pclk_hevc",
  3980. ENABLE_ACLK_HEVC, 4, CLK_IGNORE_UNUSED, 0),
  3981. GATE(CLK_ACLK_XIU_HEVCX, "aclk_xiu_hevcx", "mout_aclk_hevc_400_user",
  3982. ENABLE_ACLK_HEVC, 3, CLK_IGNORE_UNUSED, 0),
  3983. GATE(CLK_ACLK_HEVCNP_100, "aclk_hevcnp_100", "div_pclk_hevc",
  3984. ENABLE_ACLK_HEVC, 2, CLK_IGNORE_UNUSED, 0),
  3985. GATE(CLK_ACLK_HEVCND_400, "aclk_hevcnd_400", "mout_aclk_hevc_400_user",
  3986. ENABLE_ACLK_HEVC, 1, CLK_IGNORE_UNUSED, 0),
  3987. GATE(CLK_ACLK_HEVC, "aclk_hevc", "mout_aclk_hevc_400_user",
  3988. ENABLE_ACLK_HEVC, 0, 0, 0),
  3989. /* ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC */
  3990. GATE(CLK_ACLK_SMMU_HEVC_1, "aclk_smmu_hevc_1",
  3991. "mout_aclk_hevc_400_user",
  3992. ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC,
  3993. 1, CLK_IGNORE_UNUSED, 0),
  3994. GATE(CLK_ACLK_SMMU_HEVC_0, "aclk_smmu_hevc_0",
  3995. "mout_aclk_hevc_400_user",
  3996. ENABLE_ACLK_HEVC_SECURE_SMMU_HEVC,
  3997. 0, CLK_IGNORE_UNUSED, 0),
  3998. /* ENABLE_PCLK_HEVC */
  3999. GATE(CLK_PCLK_BTS_HEVC_1, "pclk_bts_hevc_1", "div_pclk_hevc",
  4000. ENABLE_PCLK_HEVC, 4, 0, 0),
  4001. GATE(CLK_PCLK_BTS_HEVC_0, "pclk_bts_hevc_0", "div_pclk_hevc",
  4002. ENABLE_PCLK_HEVC, 3, 0, 0),
  4003. GATE(CLK_PCLK_PMU_HEVC, "pclk_pmu_hevc", "div_pclk_hevc",
  4004. ENABLE_PCLK_HEVC, 2, CLK_IGNORE_UNUSED, 0),
  4005. GATE(CLK_PCLK_SYSREG_HEVC, "pclk_sysreg_hevc", "div_pclk_hevc",
  4006. ENABLE_PCLK_HEVC, 1, CLK_IGNORE_UNUSED, 0),
  4007. GATE(CLK_PCLK_HEVC, "pclk_hevc", "div_pclk_hevc",
  4008. ENABLE_PCLK_HEVC, 4, CLK_IGNORE_UNUSED, 0),
  4009. /* ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC */
  4010. GATE(CLK_PCLK_SMMU_HEVC_1, "pclk_smmu_hevc_1", "div_pclk_hevc",
  4011. ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC,
  4012. 1, CLK_IGNORE_UNUSED, 0),
  4013. GATE(CLK_PCLK_SMMU_HEVC_0, "pclk_smmu_hevc_0", "div_pclk_hevc",
  4014. ENABLE_PCLK_HEVC_SECURE_SMMU_HEVC,
  4015. 0, CLK_IGNORE_UNUSED, 0),
  4016. };
  4017. static const struct samsung_cmu_info hevc_cmu_info __initconst = {
  4018. .mux_clks = hevc_mux_clks,
  4019. .nr_mux_clks = ARRAY_SIZE(hevc_mux_clks),
  4020. .div_clks = hevc_div_clks,
  4021. .nr_div_clks = ARRAY_SIZE(hevc_div_clks),
  4022. .gate_clks = hevc_gate_clks,
  4023. .nr_gate_clks = ARRAY_SIZE(hevc_gate_clks),
  4024. .nr_clk_ids = HEVC_NR_CLK,
  4025. .clk_regs = hevc_clk_regs,
  4026. .nr_clk_regs = ARRAY_SIZE(hevc_clk_regs),
  4027. .suspend_regs = hevc_suspend_regs,
  4028. .nr_suspend_regs = ARRAY_SIZE(hevc_suspend_regs),
  4029. .clk_name = "aclk_hevc_400",
  4030. };
  4031. /*
  4032. * Register offset definitions for CMU_ISP
  4033. */
  4034. #define MUX_SEL_ISP 0x0200
  4035. #define MUX_ENABLE_ISP 0x0300
  4036. #define MUX_STAT_ISP 0x0400
  4037. #define DIV_ISP 0x0600
  4038. #define DIV_STAT_ISP 0x0700
  4039. #define ENABLE_ACLK_ISP0 0x0800
  4040. #define ENABLE_ACLK_ISP1 0x0804
  4041. #define ENABLE_ACLK_ISP2 0x0808
  4042. #define ENABLE_PCLK_ISP 0x0900
  4043. #define ENABLE_SCLK_ISP 0x0a00
  4044. #define ENABLE_IP_ISP0 0x0b00
  4045. #define ENABLE_IP_ISP1 0x0b04
  4046. #define ENABLE_IP_ISP2 0x0b08
  4047. #define ENABLE_IP_ISP3 0x0b0c
  4048. static const unsigned long isp_clk_regs[] __initconst = {
  4049. MUX_SEL_ISP,
  4050. MUX_ENABLE_ISP,
  4051. DIV_ISP,
  4052. ENABLE_ACLK_ISP0,
  4053. ENABLE_ACLK_ISP1,
  4054. ENABLE_ACLK_ISP2,
  4055. ENABLE_PCLK_ISP,
  4056. ENABLE_SCLK_ISP,
  4057. ENABLE_IP_ISP0,
  4058. ENABLE_IP_ISP1,
  4059. ENABLE_IP_ISP2,
  4060. ENABLE_IP_ISP3,
  4061. };
  4062. static const struct samsung_clk_reg_dump isp_suspend_regs[] = {
  4063. { MUX_SEL_ISP, 0 },
  4064. };
  4065. PNAME(mout_aclk_isp_dis_400_user_p) = { "oscclk", "aclk_isp_dis_400", };
  4066. PNAME(mout_aclk_isp_400_user_p) = { "oscclk", "aclk_isp_400", };
  4067. static const struct samsung_mux_clock isp_mux_clks[] __initconst = {
  4068. /* MUX_SEL_ISP */
  4069. MUX(CLK_MOUT_ACLK_ISP_DIS_400_USER, "mout_aclk_isp_dis_400_user",
  4070. mout_aclk_isp_dis_400_user_p, MUX_SEL_ISP, 4, 0),
  4071. MUX(CLK_MOUT_ACLK_ISP_400_USER, "mout_aclk_isp_400_user",
  4072. mout_aclk_isp_400_user_p, MUX_SEL_ISP, 0, 0),
  4073. };
  4074. static const struct samsung_div_clock isp_div_clks[] __initconst = {
  4075. /* DIV_ISP */
  4076. DIV(CLK_DIV_PCLK_ISP_DIS, "div_pclk_isp_dis",
  4077. "mout_aclk_isp_dis_400_user", DIV_ISP, 12, 3),
  4078. DIV(CLK_DIV_PCLK_ISP, "div_pclk_isp", "mout_aclk_isp_400_user",
  4079. DIV_ISP, 8, 3),
  4080. DIV(CLK_DIV_ACLK_ISP_D_200, "div_aclk_isp_d_200",
  4081. "mout_aclk_isp_400_user", DIV_ISP, 4, 3),
  4082. DIV(CLK_DIV_ACLK_ISP_C_200, "div_aclk_isp_c_200",
  4083. "mout_aclk_isp_400_user", DIV_ISP, 0, 3),
  4084. };
  4085. static const struct samsung_gate_clock isp_gate_clks[] __initconst = {
  4086. /* ENABLE_ACLK_ISP0 */
  4087. GATE(CLK_ACLK_ISP_D_GLUE, "aclk_isp_d_glue", "mout_aclk_isp_400_user",
  4088. ENABLE_ACLK_ISP0, 6, CLK_IGNORE_UNUSED, 0),
  4089. GATE(CLK_ACLK_SCALERP, "aclk_scalerp", "mout_aclk_isp_400_user",
  4090. ENABLE_ACLK_ISP0, 5, 0, 0),
  4091. GATE(CLK_ACLK_3DNR, "aclk_3dnr", "mout_aclk_isp_400_user",
  4092. ENABLE_ACLK_ISP0, 4, 0, 0),
  4093. GATE(CLK_ACLK_DIS, "aclk_dis", "mout_aclk_isp_dis_400_user",
  4094. ENABLE_ACLK_ISP0, 3, 0, 0),
  4095. GATE(CLK_ACLK_SCALERC, "aclk_scalerc", "mout_aclk_isp_400_user",
  4096. ENABLE_ACLK_ISP0, 2, 0, 0),
  4097. GATE(CLK_ACLK_DRC, "aclk_drc", "mout_aclk_isp_400_user",
  4098. ENABLE_ACLK_ISP0, 1, 0, 0),
  4099. GATE(CLK_ACLK_ISP, "aclk_isp", "mout_aclk_isp_400_user",
  4100. ENABLE_ACLK_ISP0, 0, 0, 0),
  4101. /* ENABLE_ACLK_ISP1 */
  4102. GATE(CLK_ACLK_AXIUS_SCALERP, "aclk_axius_scalerp",
  4103. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1,
  4104. 17, CLK_IGNORE_UNUSED, 0),
  4105. GATE(CLK_ACLK_AXIUS_SCALERC, "aclk_axius_scalerc",
  4106. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1,
  4107. 16, CLK_IGNORE_UNUSED, 0),
  4108. GATE(CLK_ACLK_AXIUS_DRC, "aclk_axius_drc",
  4109. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1,
  4110. 15, CLK_IGNORE_UNUSED, 0),
  4111. GATE(CLK_ACLK_ASYNCAHBM_ISP2P, "aclk_asyncahbm_isp2p",
  4112. "div_pclk_isp", ENABLE_ACLK_ISP1,
  4113. 14, CLK_IGNORE_UNUSED, 0),
  4114. GATE(CLK_ACLK_ASYNCAHBM_ISP1P, "aclk_asyncahbm_isp1p",
  4115. "div_pclk_isp", ENABLE_ACLK_ISP1,
  4116. 13, CLK_IGNORE_UNUSED, 0),
  4117. GATE(CLK_ACLK_ASYNCAXIS_DIS1, "aclk_asyncaxis_dis1",
  4118. "mout_aclk_isp_dis_400_user", ENABLE_ACLK_ISP1,
  4119. 12, CLK_IGNORE_UNUSED, 0),
  4120. GATE(CLK_ACLK_ASYNCAXIS_DIS0, "aclk_asyncaxis_dis0",
  4121. "mout_aclk_isp_dis_400_user", ENABLE_ACLK_ISP1,
  4122. 11, CLK_IGNORE_UNUSED, 0),
  4123. GATE(CLK_ACLK_ASYNCAXIM_DIS1, "aclk_asyncaxim_dis1",
  4124. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1,
  4125. 10, CLK_IGNORE_UNUSED, 0),
  4126. GATE(CLK_ACLK_ASYNCAXIM_DIS0, "aclk_asyncaxim_dis0",
  4127. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP1,
  4128. 9, CLK_IGNORE_UNUSED, 0),
  4129. GATE(CLK_ACLK_ASYNCAXIM_ISP2P, "aclk_asyncaxim_isp2p",
  4130. "div_aclk_isp_d_200", ENABLE_ACLK_ISP1,
  4131. 8, CLK_IGNORE_UNUSED, 0),
  4132. GATE(CLK_ACLK_ASYNCAXIM_ISP1P, "aclk_asyncaxim_isp1p",
  4133. "div_aclk_isp_c_200", ENABLE_ACLK_ISP1,
  4134. 7, CLK_IGNORE_UNUSED, 0),
  4135. GATE(CLK_ACLK_AHB2APB_ISP2P, "aclk_ahb2apb_isp2p", "div_pclk_isp",
  4136. ENABLE_ACLK_ISP1, 6, CLK_IGNORE_UNUSED, 0),
  4137. GATE(CLK_ACLK_AHB2APB_ISP1P, "aclk_ahb2apb_isp1p", "div_pclk_isp",
  4138. ENABLE_ACLK_ISP1, 5, CLK_IGNORE_UNUSED, 0),
  4139. GATE(CLK_ACLK_AXI2APB_ISP2P, "aclk_axi2apb_isp2p",
  4140. "div_aclk_isp_d_200", ENABLE_ACLK_ISP1,
  4141. 4, CLK_IGNORE_UNUSED, 0),
  4142. GATE(CLK_ACLK_AXI2APB_ISP1P, "aclk_axi2apb_isp1p",
  4143. "div_aclk_isp_c_200", ENABLE_ACLK_ISP1,
  4144. 3, CLK_IGNORE_UNUSED, 0),
  4145. GATE(CLK_ACLK_XIU_ISPEX1, "aclk_xiu_ispex1", "mout_aclk_isp_400_user",
  4146. ENABLE_ACLK_ISP1, 2, CLK_IGNORE_UNUSED, 0),
  4147. GATE(CLK_ACLK_XIU_ISPEX0, "aclk_xiu_ispex0", "mout_aclk_isp_400_user",
  4148. ENABLE_ACLK_ISP1, 1, CLK_IGNORE_UNUSED, 0),
  4149. GATE(CLK_ACLK_ISPND_400, "aclk_ispnd_400", "mout_aclk_isp_400_user",
  4150. ENABLE_ACLK_ISP1, 1, CLK_IGNORE_UNUSED, 0),
  4151. /* ENABLE_ACLK_ISP2 */
  4152. GATE(CLK_ACLK_SMMU_SCALERP, "aclk_smmu_scalerp",
  4153. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2,
  4154. 13, CLK_IGNORE_UNUSED, 0),
  4155. GATE(CLK_ACLK_SMMU_3DNR, "aclk_smmu_3dnr", "mout_aclk_isp_400_user",
  4156. ENABLE_ACLK_ISP2, 12, CLK_IGNORE_UNUSED, 0),
  4157. GATE(CLK_ACLK_SMMU_DIS1, "aclk_smmu_dis1", "mout_aclk_isp_400_user",
  4158. ENABLE_ACLK_ISP2, 11, CLK_IGNORE_UNUSED, 0),
  4159. GATE(CLK_ACLK_SMMU_DIS0, "aclk_smmu_dis0", "mout_aclk_isp_400_user",
  4160. ENABLE_ACLK_ISP2, 10, CLK_IGNORE_UNUSED, 0),
  4161. GATE(CLK_ACLK_SMMU_SCALERC, "aclk_smmu_scalerc",
  4162. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2,
  4163. 9, CLK_IGNORE_UNUSED, 0),
  4164. GATE(CLK_ACLK_SMMU_DRC, "aclk_smmu_drc", "mout_aclk_isp_400_user",
  4165. ENABLE_ACLK_ISP2, 8, CLK_IGNORE_UNUSED, 0),
  4166. GATE(CLK_ACLK_SMMU_ISP, "aclk_smmu_isp", "mout_aclk_isp_400_user",
  4167. ENABLE_ACLK_ISP2, 7, CLK_IGNORE_UNUSED, 0),
  4168. GATE(CLK_ACLK_BTS_SCALERP, "aclk_bts_scalerp",
  4169. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2,
  4170. 6, CLK_IGNORE_UNUSED, 0),
  4171. GATE(CLK_ACLK_BTS_3DR, "aclk_bts_3dnr", "mout_aclk_isp_400_user",
  4172. ENABLE_ACLK_ISP2, 5, CLK_IGNORE_UNUSED, 0),
  4173. GATE(CLK_ACLK_BTS_DIS1, "aclk_bts_dis1", "mout_aclk_isp_400_user",
  4174. ENABLE_ACLK_ISP2, 4, CLK_IGNORE_UNUSED, 0),
  4175. GATE(CLK_ACLK_BTS_DIS0, "aclk_bts_dis0", "mout_aclk_isp_400_user",
  4176. ENABLE_ACLK_ISP2, 3, CLK_IGNORE_UNUSED, 0),
  4177. GATE(CLK_ACLK_BTS_SCALERC, "aclk_bts_scalerc",
  4178. "mout_aclk_isp_400_user", ENABLE_ACLK_ISP2,
  4179. 2, CLK_IGNORE_UNUSED, 0),
  4180. GATE(CLK_ACLK_BTS_DRC, "aclk_bts_drc", "mout_aclk_isp_400_user",
  4181. ENABLE_ACLK_ISP2, 1, CLK_IGNORE_UNUSED, 0),
  4182. GATE(CLK_ACLK_BTS_ISP, "aclk_bts_isp", "mout_aclk_isp_400_user",
  4183. ENABLE_ACLK_ISP2, 0, CLK_IGNORE_UNUSED, 0),
  4184. /* ENABLE_PCLK_ISP */
  4185. GATE(CLK_PCLK_SMMU_SCALERP, "pclk_smmu_scalerp", "div_aclk_isp_d_200",
  4186. ENABLE_PCLK_ISP, 25, CLK_IGNORE_UNUSED, 0),
  4187. GATE(CLK_PCLK_SMMU_3DNR, "pclk_smmu_3dnr", "div_aclk_isp_d_200",
  4188. ENABLE_PCLK_ISP, 24, CLK_IGNORE_UNUSED, 0),
  4189. GATE(CLK_PCLK_SMMU_DIS1, "pclk_smmu_dis1", "div_aclk_isp_d_200",
  4190. ENABLE_PCLK_ISP, 23, CLK_IGNORE_UNUSED, 0),
  4191. GATE(CLK_PCLK_SMMU_DIS0, "pclk_smmu_dis0", "div_aclk_isp_d_200",
  4192. ENABLE_PCLK_ISP, 22, CLK_IGNORE_UNUSED, 0),
  4193. GATE(CLK_PCLK_SMMU_SCALERC, "pclk_smmu_scalerc", "div_aclk_isp_c_200",
  4194. ENABLE_PCLK_ISP, 21, CLK_IGNORE_UNUSED, 0),
  4195. GATE(CLK_PCLK_SMMU_DRC, "pclk_smmu_drc", "div_aclk_isp_c_200",
  4196. ENABLE_PCLK_ISP, 20, CLK_IGNORE_UNUSED, 0),
  4197. GATE(CLK_PCLK_SMMU_ISP, "pclk_smmu_isp", "div_aclk_isp_c_200",
  4198. ENABLE_PCLK_ISP, 19, CLK_IGNORE_UNUSED, 0),
  4199. GATE(CLK_PCLK_BTS_SCALERP, "pclk_bts_scalerp", "div_pclk_isp",
  4200. ENABLE_PCLK_ISP, 18, CLK_IGNORE_UNUSED, 0),
  4201. GATE(CLK_PCLK_BTS_3DNR, "pclk_bts_3dnr", "div_pclk_isp",
  4202. ENABLE_PCLK_ISP, 17, CLK_IGNORE_UNUSED, 0),
  4203. GATE(CLK_PCLK_BTS_DIS1, "pclk_bts_dis1", "div_pclk_isp",
  4204. ENABLE_PCLK_ISP, 16, CLK_IGNORE_UNUSED, 0),
  4205. GATE(CLK_PCLK_BTS_DIS0, "pclk_bts_dis0", "div_pclk_isp",
  4206. ENABLE_PCLK_ISP, 15, CLK_IGNORE_UNUSED, 0),
  4207. GATE(CLK_PCLK_BTS_SCALERC, "pclk_bts_scalerc", "div_pclk_isp",
  4208. ENABLE_PCLK_ISP, 14, CLK_IGNORE_UNUSED, 0),
  4209. GATE(CLK_PCLK_BTS_DRC, "pclk_bts_drc", "div_pclk_isp",
  4210. ENABLE_PCLK_ISP, 13, CLK_IGNORE_UNUSED, 0),
  4211. GATE(CLK_PCLK_BTS_ISP, "pclk_bts_isp", "div_pclk_isp",
  4212. ENABLE_PCLK_ISP, 12, CLK_IGNORE_UNUSED, 0),
  4213. GATE(CLK_PCLK_ASYNCAXI_DIS1, "pclk_asyncaxi_dis1", "div_pclk_isp",
  4214. ENABLE_PCLK_ISP, 11, CLK_IGNORE_UNUSED, 0),
  4215. GATE(CLK_PCLK_ASYNCAXI_DIS0, "pclk_asyncaxi_dis0", "div_pclk_isp",
  4216. ENABLE_PCLK_ISP, 10, CLK_IGNORE_UNUSED, 0),
  4217. GATE(CLK_PCLK_PMU_ISP, "pclk_pmu_isp", "div_pclk_isp",
  4218. ENABLE_PCLK_ISP, 9, CLK_IGNORE_UNUSED, 0),
  4219. GATE(CLK_PCLK_SYSREG_ISP, "pclk_sysreg_isp", "div_pclk_isp",
  4220. ENABLE_PCLK_ISP, 8, CLK_IGNORE_UNUSED, 0),
  4221. GATE(CLK_PCLK_CMU_ISP_LOCAL, "pclk_cmu_isp_local",
  4222. "div_aclk_isp_c_200", ENABLE_PCLK_ISP,
  4223. 7, CLK_IGNORE_UNUSED, 0),
  4224. GATE(CLK_PCLK_SCALERP, "pclk_scalerp", "div_aclk_isp_d_200",
  4225. ENABLE_PCLK_ISP, 6, CLK_IGNORE_UNUSED, 0),
  4226. GATE(CLK_PCLK_3DNR, "pclk_3dnr", "div_aclk_isp_d_200",
  4227. ENABLE_PCLK_ISP, 5, CLK_IGNORE_UNUSED, 0),
  4228. GATE(CLK_PCLK_DIS_CORE, "pclk_dis_core", "div_pclk_isp_dis",
  4229. ENABLE_PCLK_ISP, 4, CLK_IGNORE_UNUSED, 0),
  4230. GATE(CLK_PCLK_DIS, "pclk_dis", "div_aclk_isp_d_200",
  4231. ENABLE_PCLK_ISP, 3, CLK_IGNORE_UNUSED, 0),
  4232. GATE(CLK_PCLK_SCALERC, "pclk_scalerc", "div_aclk_isp_c_200",
  4233. ENABLE_PCLK_ISP, 2, CLK_IGNORE_UNUSED, 0),
  4234. GATE(CLK_PCLK_DRC, "pclk_drc", "div_aclk_isp_c_200",
  4235. ENABLE_PCLK_ISP, 1, CLK_IGNORE_UNUSED, 0),
  4236. GATE(CLK_PCLK_ISP, "pclk_isp", "div_aclk_isp_c_200",
  4237. ENABLE_PCLK_ISP, 0, CLK_IGNORE_UNUSED, 0),
  4238. /* ENABLE_SCLK_ISP */
  4239. GATE(CLK_SCLK_PIXELASYNCS_DIS, "sclk_pixelasyncs_dis",
  4240. "mout_aclk_isp_dis_400_user", ENABLE_SCLK_ISP,
  4241. 5, CLK_IGNORE_UNUSED, 0),
  4242. GATE(CLK_SCLK_PIXELASYNCM_DIS, "sclk_pixelasyncm_dis",
  4243. "mout_aclk_isp_dis_400_user", ENABLE_SCLK_ISP,
  4244. 4, CLK_IGNORE_UNUSED, 0),
  4245. GATE(CLK_SCLK_PIXELASYNCS_SCALERP, "sclk_pixelasyncs_scalerp",
  4246. "mout_aclk_isp_400_user", ENABLE_SCLK_ISP,
  4247. 3, CLK_IGNORE_UNUSED, 0),
  4248. GATE(CLK_SCLK_PIXELASYNCM_ISPD, "sclk_pixelasyncm_ispd",
  4249. "mout_aclk_isp_400_user", ENABLE_SCLK_ISP,
  4250. 2, CLK_IGNORE_UNUSED, 0),
  4251. GATE(CLK_SCLK_PIXELASYNCS_ISPC, "sclk_pixelasyncs_ispc",
  4252. "mout_aclk_isp_400_user", ENABLE_SCLK_ISP,
  4253. 1, CLK_IGNORE_UNUSED, 0),
  4254. GATE(CLK_SCLK_PIXELASYNCM_ISPC, "sclk_pixelasyncm_ispc",
  4255. "mout_aclk_isp_400_user", ENABLE_SCLK_ISP,
  4256. 0, CLK_IGNORE_UNUSED, 0),
  4257. };
  4258. static const struct samsung_cmu_info isp_cmu_info __initconst = {
  4259. .mux_clks = isp_mux_clks,
  4260. .nr_mux_clks = ARRAY_SIZE(isp_mux_clks),
  4261. .div_clks = isp_div_clks,
  4262. .nr_div_clks = ARRAY_SIZE(isp_div_clks),
  4263. .gate_clks = isp_gate_clks,
  4264. .nr_gate_clks = ARRAY_SIZE(isp_gate_clks),
  4265. .nr_clk_ids = ISP_NR_CLK,
  4266. .clk_regs = isp_clk_regs,
  4267. .nr_clk_regs = ARRAY_SIZE(isp_clk_regs),
  4268. .suspend_regs = isp_suspend_regs,
  4269. .nr_suspend_regs = ARRAY_SIZE(isp_suspend_regs),
  4270. .clk_name = "aclk_isp_400",
  4271. };
  4272. /*
  4273. * Register offset definitions for CMU_CAM0
  4274. */
  4275. #define MUX_SEL_CAM00 0x0200
  4276. #define MUX_SEL_CAM01 0x0204
  4277. #define MUX_SEL_CAM02 0x0208
  4278. #define MUX_SEL_CAM03 0x020c
  4279. #define MUX_SEL_CAM04 0x0210
  4280. #define MUX_ENABLE_CAM00 0x0300
  4281. #define MUX_ENABLE_CAM01 0x0304
  4282. #define MUX_ENABLE_CAM02 0x0308
  4283. #define MUX_ENABLE_CAM03 0x030c
  4284. #define MUX_ENABLE_CAM04 0x0310
  4285. #define MUX_STAT_CAM00 0x0400
  4286. #define MUX_STAT_CAM01 0x0404
  4287. #define MUX_STAT_CAM02 0x0408
  4288. #define MUX_STAT_CAM03 0x040c
  4289. #define MUX_STAT_CAM04 0x0410
  4290. #define MUX_IGNORE_CAM01 0x0504
  4291. #define DIV_CAM00 0x0600
  4292. #define DIV_CAM01 0x0604
  4293. #define DIV_CAM02 0x0608
  4294. #define DIV_CAM03 0x060c
  4295. #define DIV_STAT_CAM00 0x0700
  4296. #define DIV_STAT_CAM01 0x0704
  4297. #define DIV_STAT_CAM02 0x0708
  4298. #define DIV_STAT_CAM03 0x070c
  4299. #define ENABLE_ACLK_CAM00 0X0800
  4300. #define ENABLE_ACLK_CAM01 0X0804
  4301. #define ENABLE_ACLK_CAM02 0X0808
  4302. #define ENABLE_PCLK_CAM0 0X0900
  4303. #define ENABLE_SCLK_CAM0 0X0a00
  4304. #define ENABLE_IP_CAM00 0X0b00
  4305. #define ENABLE_IP_CAM01 0X0b04
  4306. #define ENABLE_IP_CAM02 0X0b08
  4307. #define ENABLE_IP_CAM03 0X0b0C
  4308. static const unsigned long cam0_clk_regs[] __initconst = {
  4309. MUX_SEL_CAM00,
  4310. MUX_SEL_CAM01,
  4311. MUX_SEL_CAM02,
  4312. MUX_SEL_CAM03,
  4313. MUX_SEL_CAM04,
  4314. MUX_ENABLE_CAM00,
  4315. MUX_ENABLE_CAM01,
  4316. MUX_ENABLE_CAM02,
  4317. MUX_ENABLE_CAM03,
  4318. MUX_ENABLE_CAM04,
  4319. MUX_IGNORE_CAM01,
  4320. DIV_CAM00,
  4321. DIV_CAM01,
  4322. DIV_CAM02,
  4323. DIV_CAM03,
  4324. ENABLE_ACLK_CAM00,
  4325. ENABLE_ACLK_CAM01,
  4326. ENABLE_ACLK_CAM02,
  4327. ENABLE_PCLK_CAM0,
  4328. ENABLE_SCLK_CAM0,
  4329. ENABLE_IP_CAM00,
  4330. ENABLE_IP_CAM01,
  4331. ENABLE_IP_CAM02,
  4332. ENABLE_IP_CAM03,
  4333. };
  4334. static const struct samsung_clk_reg_dump cam0_suspend_regs[] = {
  4335. { MUX_SEL_CAM00, 0 },
  4336. { MUX_SEL_CAM01, 0 },
  4337. { MUX_SEL_CAM02, 0 },
  4338. { MUX_SEL_CAM03, 0 },
  4339. { MUX_SEL_CAM04, 0 },
  4340. };
  4341. PNAME(mout_aclk_cam0_333_user_p) = { "oscclk", "aclk_cam0_333", };
  4342. PNAME(mout_aclk_cam0_400_user_p) = { "oscclk", "aclk_cam0_400", };
  4343. PNAME(mout_aclk_cam0_552_user_p) = { "oscclk", "aclk_cam0_552", };
  4344. PNAME(mout_phyclk_rxbyteclkhs0_s4_user_p) = { "oscclk",
  4345. "phyclk_rxbyteclkhs0_s4_phy", };
  4346. PNAME(mout_phyclk_rxbyteclkhs0_s2a_user_p) = { "oscclk",
  4347. "phyclk_rxbyteclkhs0_s2a_phy", };
  4348. PNAME(mout_aclk_lite_d_b_p) = { "mout_aclk_lite_d_a",
  4349. "mout_aclk_cam0_333_user", };
  4350. PNAME(mout_aclk_lite_d_a_p) = { "mout_aclk_cam0_552_user",
  4351. "mout_aclk_cam0_400_user", };
  4352. PNAME(mout_aclk_lite_b_b_p) = { "mout_aclk_lite_b_a",
  4353. "mout_aclk_cam0_333_user", };
  4354. PNAME(mout_aclk_lite_b_a_p) = { "mout_aclk_cam0_552_user",
  4355. "mout_aclk_cam0_400_user", };
  4356. PNAME(mout_aclk_lite_a_b_p) = { "mout_aclk_lite_a_a",
  4357. "mout_aclk_cam0_333_user", };
  4358. PNAME(mout_aclk_lite_a_a_p) = { "mout_aclk_cam0_552_user",
  4359. "mout_aclk_cam0_400_user", };
  4360. PNAME(mout_aclk_cam0_400_p) = { "mout_aclk_cam0_400_user",
  4361. "mout_aclk_cam0_333_user", };
  4362. PNAME(mout_aclk_csis1_b_p) = { "mout_aclk_csis1_a",
  4363. "mout_aclk_cam0_333_user" };
  4364. PNAME(mout_aclk_csis1_a_p) = { "mout_aclk_cam0_552_user",
  4365. "mout_aclk_cam0_400_user", };
  4366. PNAME(mout_aclk_csis0_b_p) = { "mout_aclk_csis0_a",
  4367. "mout_aclk_cam0_333_user", };
  4368. PNAME(mout_aclk_csis0_a_p) = { "mout_aclk_cam0_552_user",
  4369. "mout_aclk-cam0_400_user", };
  4370. PNAME(mout_aclk_3aa1_b_p) = { "mout_aclk_3aa1_a",
  4371. "mout_aclk_cam0_333_user", };
  4372. PNAME(mout_aclk_3aa1_a_p) = { "mout_aclk_cam0_552_user",
  4373. "mout_aclk_cam0_400_user", };
  4374. PNAME(mout_aclk_3aa0_b_p) = { "mout_aclk_3aa0_a",
  4375. "mout_aclk_cam0_333_user", };
  4376. PNAME(mout_aclk_3aa0_a_p) = { "mout_aclk_cam0_552_user",
  4377. "mout_aclk_cam0_400_user", };
  4378. PNAME(mout_sclk_lite_freecnt_c_p) = { "mout_sclk_lite_freecnt_b",
  4379. "div_pclk_lite_d", };
  4380. PNAME(mout_sclk_lite_freecnt_b_p) = { "mout_sclk_lite_freecnt_a",
  4381. "div_pclk_pixelasync_lite_c", };
  4382. PNAME(mout_sclk_lite_freecnt_a_p) = { "div_pclk_lite_a",
  4383. "div_pclk_lite_b", };
  4384. PNAME(mout_sclk_pixelasync_lite_c_b_p) = { "mout_sclk_pixelasync_lite_c_a",
  4385. "mout_aclk_cam0_333_user", };
  4386. PNAME(mout_sclk_pixelasync_lite_c_a_p) = { "mout_aclk_cam0_552_user",
  4387. "mout_aclk_cam0_400_user", };
  4388. PNAME(mout_sclk_pixelasync_lite_c_init_b_p) = {
  4389. "mout_sclk_pixelasync_lite_c_init_a",
  4390. "mout_aclk_cam0_400_user", };
  4391. PNAME(mout_sclk_pixelasync_lite_c_init_a_p) = {
  4392. "mout_aclk_cam0_552_user",
  4393. "mout_aclk_cam0_400_user", };
  4394. static const struct samsung_fixed_rate_clock cam0_fixed_clks[] __initconst = {
  4395. FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S4_PHY, "phyclk_rxbyteclkhs0_s4_phy",
  4396. NULL, 0, 100000000),
  4397. FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S2A_PHY, "phyclk_rxbyteclkhs0_s2a_phy",
  4398. NULL, 0, 100000000),
  4399. };
  4400. static const struct samsung_mux_clock cam0_mux_clks[] __initconst = {
  4401. /* MUX_SEL_CAM00 */
  4402. MUX(CLK_MOUT_ACLK_CAM0_333_USER, "mout_aclk_cam0_333_user",
  4403. mout_aclk_cam0_333_user_p, MUX_SEL_CAM00, 8, 1),
  4404. MUX(CLK_MOUT_ACLK_CAM0_400_USER, "mout_aclk_cam0_400_user",
  4405. mout_aclk_cam0_400_user_p, MUX_SEL_CAM00, 4, 1),
  4406. MUX(CLK_MOUT_ACLK_CAM0_552_USER, "mout_aclk_cam0_552_user",
  4407. mout_aclk_cam0_552_user_p, MUX_SEL_CAM00, 0, 1),
  4408. /* MUX_SEL_CAM01 */
  4409. MUX(CLK_MOUT_PHYCLK_RXBYTECLKHS0_S4_USER,
  4410. "mout_phyclk_rxbyteclkhs0_s4_user",
  4411. mout_phyclk_rxbyteclkhs0_s4_user_p,
  4412. MUX_SEL_CAM01, 4, 1),
  4413. MUX(CLK_MOUT_PHYCLK_RXBYTECLKHS0_S2A_USER,
  4414. "mout_phyclk_rxbyteclkhs0_s2a_user",
  4415. mout_phyclk_rxbyteclkhs0_s2a_user_p,
  4416. MUX_SEL_CAM01, 0, 1),
  4417. /* MUX_SEL_CAM02 */
  4418. MUX(CLK_MOUT_ACLK_LITE_D_B, "mout_aclk_lite_d_b", mout_aclk_lite_d_b_p,
  4419. MUX_SEL_CAM02, 24, 1),
  4420. MUX(CLK_MOUT_ACLK_LITE_D_A, "mout_aclk_lite_d_a", mout_aclk_lite_d_a_p,
  4421. MUX_SEL_CAM02, 20, 1),
  4422. MUX(CLK_MOUT_ACLK_LITE_B_B, "mout_aclk_lite_b_b", mout_aclk_lite_b_b_p,
  4423. MUX_SEL_CAM02, 16, 1),
  4424. MUX(CLK_MOUT_ACLK_LITE_B_A, "mout_aclk_lite_b_a", mout_aclk_lite_b_a_p,
  4425. MUX_SEL_CAM02, 12, 1),
  4426. MUX(CLK_MOUT_ACLK_LITE_A_B, "mout_aclk_lite_a_b", mout_aclk_lite_a_b_p,
  4427. MUX_SEL_CAM02, 8, 1),
  4428. MUX(CLK_MOUT_ACLK_LITE_A_A, "mout_aclk_lite_a_a", mout_aclk_lite_a_a_p,
  4429. MUX_SEL_CAM02, 4, 1),
  4430. MUX(CLK_MOUT_ACLK_CAM0_400, "mout_aclk_cam0_400", mout_aclk_cam0_400_p,
  4431. MUX_SEL_CAM02, 0, 1),
  4432. /* MUX_SEL_CAM03 */
  4433. MUX(CLK_MOUT_ACLK_CSIS1_B, "mout_aclk_csis1_b", mout_aclk_csis1_b_p,
  4434. MUX_SEL_CAM03, 28, 1),
  4435. MUX(CLK_MOUT_ACLK_CSIS1_A, "mout_aclk_csis1_a", mout_aclk_csis1_a_p,
  4436. MUX_SEL_CAM03, 24, 1),
  4437. MUX(CLK_MOUT_ACLK_CSIS0_B, "mout_aclk_csis0_b", mout_aclk_csis0_b_p,
  4438. MUX_SEL_CAM03, 20, 1),
  4439. MUX(CLK_MOUT_ACLK_CSIS0_A, "mout_aclk_csis0_a", mout_aclk_csis0_a_p,
  4440. MUX_SEL_CAM03, 16, 1),
  4441. MUX(CLK_MOUT_ACLK_3AA1_B, "mout_aclk_3aa1_b", mout_aclk_3aa1_b_p,
  4442. MUX_SEL_CAM03, 12, 1),
  4443. MUX(CLK_MOUT_ACLK_3AA1_A, "mout_aclk_3aa1_a", mout_aclk_3aa1_a_p,
  4444. MUX_SEL_CAM03, 8, 1),
  4445. MUX(CLK_MOUT_ACLK_3AA0_B, "mout_aclk_3aa0_b", mout_aclk_3aa0_b_p,
  4446. MUX_SEL_CAM03, 4, 1),
  4447. MUX(CLK_MOUT_ACLK_3AA0_A, "mout_aclk_3aa0_a", mout_aclk_3aa0_a_p,
  4448. MUX_SEL_CAM03, 0, 1),
  4449. /* MUX_SEL_CAM04 */
  4450. MUX(CLK_MOUT_SCLK_LITE_FREECNT_C, "mout_sclk_lite_freecnt_c",
  4451. mout_sclk_lite_freecnt_c_p, MUX_SEL_CAM04, 24, 1),
  4452. MUX(CLK_MOUT_SCLK_LITE_FREECNT_B, "mout_sclk_lite_freecnt_b",
  4453. mout_sclk_lite_freecnt_b_p, MUX_SEL_CAM04, 20, 1),
  4454. MUX(CLK_MOUT_SCLK_LITE_FREECNT_A, "mout_sclk_lite_freecnt_a",
  4455. mout_sclk_lite_freecnt_a_p, MUX_SEL_CAM04, 16, 1),
  4456. MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_B, "mout_sclk_pixelasync_lite_c_b",
  4457. mout_sclk_pixelasync_lite_c_b_p, MUX_SEL_CAM04, 12, 1),
  4458. MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_A, "mout_sclk_pixelasync_lite_c_a",
  4459. mout_sclk_pixelasync_lite_c_a_p, MUX_SEL_CAM04, 8, 1),
  4460. MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_INIT_B,
  4461. "mout_sclk_pixelasync_lite_c_init_b",
  4462. mout_sclk_pixelasync_lite_c_init_b_p,
  4463. MUX_SEL_CAM04, 4, 1),
  4464. MUX(CLK_MOUT_SCLK_PIXELASYNC_LITE_C_INIT_A,
  4465. "mout_sclk_pixelasync_lite_c_init_a",
  4466. mout_sclk_pixelasync_lite_c_init_a_p,
  4467. MUX_SEL_CAM04, 0, 1),
  4468. };
  4469. static const struct samsung_div_clock cam0_div_clks[] __initconst = {
  4470. /* DIV_CAM00 */
  4471. DIV(CLK_DIV_PCLK_CAM0_50, "div_pclk_cam0_50", "div_aclk_cam0_200",
  4472. DIV_CAM00, 8, 2),
  4473. DIV(CLK_DIV_ACLK_CAM0_200, "div_aclk_cam0_200", "mout_aclk_cam0_400",
  4474. DIV_CAM00, 4, 3),
  4475. DIV(CLK_DIV_ACLK_CAM0_BUS_400, "div_aclk_cam0_bus_400",
  4476. "mout_aclk_cam0_400", DIV_CAM00, 0, 3),
  4477. /* DIV_CAM01 */
  4478. DIV(CLK_DIV_PCLK_LITE_D, "div_pclk_lite_d", "div_aclk_lite_d",
  4479. DIV_CAM01, 20, 2),
  4480. DIV(CLK_DIV_ACLK_LITE_D, "div_aclk_lite_d", "mout_aclk_lite_d_b",
  4481. DIV_CAM01, 16, 3),
  4482. DIV(CLK_DIV_PCLK_LITE_B, "div_pclk_lite_b", "div_aclk_lite_b",
  4483. DIV_CAM01, 12, 2),
  4484. DIV(CLK_DIV_ACLK_LITE_B, "div_aclk_lite_b", "mout_aclk_lite_b_b",
  4485. DIV_CAM01, 8, 3),
  4486. DIV(CLK_DIV_PCLK_LITE_A, "div_pclk_lite_a", "div_aclk_lite_a",
  4487. DIV_CAM01, 4, 2),
  4488. DIV(CLK_DIV_ACLK_LITE_A, "div_aclk_lite_a", "mout_aclk_lite_a_b",
  4489. DIV_CAM01, 0, 3),
  4490. /* DIV_CAM02 */
  4491. DIV(CLK_DIV_ACLK_CSIS1, "div_aclk_csis1", "mout_aclk_csis1_b",
  4492. DIV_CAM02, 20, 3),
  4493. DIV(CLK_DIV_ACLK_CSIS0, "div_aclk_csis0", "mout_aclk_csis0_b",
  4494. DIV_CAM02, 16, 3),
  4495. DIV(CLK_DIV_PCLK_3AA1, "div_pclk_3aa1", "div_aclk_3aa1",
  4496. DIV_CAM02, 12, 2),
  4497. DIV(CLK_DIV_ACLK_3AA1, "div_aclk_3aa1", "mout_aclk_3aa1_b",
  4498. DIV_CAM02, 8, 3),
  4499. DIV(CLK_DIV_PCLK_3AA0, "div_pclk_3aa0", "div_aclk_3aa0",
  4500. DIV_CAM02, 4, 2),
  4501. DIV(CLK_DIV_ACLK_3AA0, "div_aclk_3aa0", "mout_aclk_3aa0_b",
  4502. DIV_CAM02, 0, 3),
  4503. /* DIV_CAM03 */
  4504. DIV(CLK_DIV_SCLK_PIXELASYNC_LITE_C, "div_sclk_pixelasync_lite_c",
  4505. "mout_sclk_pixelasync_lite_c_b", DIV_CAM03, 8, 3),
  4506. DIV(CLK_DIV_PCLK_PIXELASYNC_LITE_C, "div_pclk_pixelasync_lite_c",
  4507. "div_sclk_pixelasync_lite_c_init", DIV_CAM03, 4, 2),
  4508. DIV(CLK_DIV_SCLK_PIXELASYNC_LITE_C_INIT,
  4509. "div_sclk_pixelasync_lite_c_init",
  4510. "mout_sclk_pixelasync_lite_c_init_b", DIV_CAM03, 0, 3),
  4511. };
  4512. static const struct samsung_gate_clock cam0_gate_clks[] __initconst = {
  4513. /* ENABLE_ACLK_CAM00 */
  4514. GATE(CLK_ACLK_CSIS1, "aclk_csis1", "div_aclk_csis1", ENABLE_ACLK_CAM00,
  4515. 6, 0, 0),
  4516. GATE(CLK_ACLK_CSIS0, "aclk_csis0", "div_aclk_csis0", ENABLE_ACLK_CAM00,
  4517. 5, 0, 0),
  4518. GATE(CLK_ACLK_3AA1, "aclk_3aa1", "div_aclk_3aa1", ENABLE_ACLK_CAM00,
  4519. 4, 0, 0),
  4520. GATE(CLK_ACLK_3AA0, "aclk_3aa0", "div_aclk_3aa0", ENABLE_ACLK_CAM00,
  4521. 3, 0, 0),
  4522. GATE(CLK_ACLK_LITE_D, "aclk_lite_d", "div_aclk_lite_d",
  4523. ENABLE_ACLK_CAM00, 2, 0, 0),
  4524. GATE(CLK_ACLK_LITE_B, "aclk_lite_b", "div_aclk_lite_b",
  4525. ENABLE_ACLK_CAM00, 1, 0, 0),
  4526. GATE(CLK_ACLK_LITE_A, "aclk_lite_a", "div_aclk_lite_a",
  4527. ENABLE_ACLK_CAM00, 0, 0, 0),
  4528. /* ENABLE_ACLK_CAM01 */
  4529. GATE(CLK_ACLK_AHBSYNCDN, "aclk_ahbsyncdn", "div_aclk_cam0_200",
  4530. ENABLE_ACLK_CAM01, 31, CLK_IGNORE_UNUSED, 0),
  4531. GATE(CLK_ACLK_AXIUS_LITE_D, "aclk_axius_lite_d", "div_aclk_cam0_bus_400",
  4532. ENABLE_ACLK_CAM01, 30, CLK_IGNORE_UNUSED, 0),
  4533. GATE(CLK_ACLK_AXIUS_LITE_B, "aclk_axius_lite_b", "div_aclk_cam0_bus_400",
  4534. ENABLE_ACLK_CAM01, 29, CLK_IGNORE_UNUSED, 0),
  4535. GATE(CLK_ACLK_AXIUS_LITE_A, "aclk_axius_lite_a", "div_aclk_cam0_bus_400",
  4536. ENABLE_ACLK_CAM01, 28, CLK_IGNORE_UNUSED, 0),
  4537. GATE(CLK_ACLK_ASYNCAPBM_3AA1, "aclk_asyncapbm_3aa1", "div_pclk_3aa1",
  4538. ENABLE_ACLK_CAM01, 27, CLK_IGNORE_UNUSED, 0),
  4539. GATE(CLK_ACLK_ASYNCAPBS_3AA1, "aclk_asyncapbs_3aa1", "div_aclk_3aa1",
  4540. ENABLE_ACLK_CAM01, 26, CLK_IGNORE_UNUSED, 0),
  4541. GATE(CLK_ACLK_ASYNCAPBM_3AA0, "aclk_asyncapbm_3aa0", "div_pclk_3aa0",
  4542. ENABLE_ACLK_CAM01, 25, CLK_IGNORE_UNUSED, 0),
  4543. GATE(CLK_ACLK_ASYNCAPBS_3AA0, "aclk_asyncapbs_3aa0", "div_aclk_3aa0",
  4544. ENABLE_ACLK_CAM01, 24, CLK_IGNORE_UNUSED, 0),
  4545. GATE(CLK_ACLK_ASYNCAPBM_LITE_D, "aclk_asyncapbm_lite_d",
  4546. "div_pclk_lite_d", ENABLE_ACLK_CAM01,
  4547. 23, CLK_IGNORE_UNUSED, 0),
  4548. GATE(CLK_ACLK_ASYNCAPBS_LITE_D, "aclk_asyncapbs_lite_d",
  4549. "div_aclk_cam0_200", ENABLE_ACLK_CAM01,
  4550. 22, CLK_IGNORE_UNUSED, 0),
  4551. GATE(CLK_ACLK_ASYNCAPBM_LITE_B, "aclk_asyncapbm_lite_b",
  4552. "div_pclk_lite_b", ENABLE_ACLK_CAM01,
  4553. 21, CLK_IGNORE_UNUSED, 0),
  4554. GATE(CLK_ACLK_ASYNCAPBS_LITE_B, "aclk_asyncapbs_lite_b",
  4555. "div_aclk_cam0_200", ENABLE_ACLK_CAM01,
  4556. 20, CLK_IGNORE_UNUSED, 0),
  4557. GATE(CLK_ACLK_ASYNCAPBM_LITE_A, "aclk_asyncapbm_lite_a",
  4558. "div_pclk_lite_a", ENABLE_ACLK_CAM01,
  4559. 19, CLK_IGNORE_UNUSED, 0),
  4560. GATE(CLK_ACLK_ASYNCAPBS_LITE_A, "aclk_asyncapbs_lite_a",
  4561. "div_aclk_cam0_200", ENABLE_ACLK_CAM01,
  4562. 18, CLK_IGNORE_UNUSED, 0),
  4563. GATE(CLK_ACLK_ASYNCAXIM_ISP0P, "aclk_asyncaxim_isp0p",
  4564. "div_aclk_cam0_200", ENABLE_ACLK_CAM01,
  4565. 17, CLK_IGNORE_UNUSED, 0),
  4566. GATE(CLK_ACLK_ASYNCAXIM_3AA1, "aclk_asyncaxim_3aa1",
  4567. "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01,
  4568. 16, CLK_IGNORE_UNUSED, 0),
  4569. GATE(CLK_ACLK_ASYNCAXIS_3AA1, "aclk_asyncaxis_3aa1",
  4570. "div_aclk_3aa1", ENABLE_ACLK_CAM01,
  4571. 15, CLK_IGNORE_UNUSED, 0),
  4572. GATE(CLK_ACLK_ASYNCAXIM_3AA0, "aclk_asyncaxim_3aa0",
  4573. "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01,
  4574. 14, CLK_IGNORE_UNUSED, 0),
  4575. GATE(CLK_ACLK_ASYNCAXIS_3AA0, "aclk_asyncaxis_3aa0",
  4576. "div_aclk_3aa0", ENABLE_ACLK_CAM01,
  4577. 13, CLK_IGNORE_UNUSED, 0),
  4578. GATE(CLK_ACLK_ASYNCAXIM_LITE_D, "aclk_asyncaxim_lite_d",
  4579. "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01,
  4580. 12, CLK_IGNORE_UNUSED, 0),
  4581. GATE(CLK_ACLK_ASYNCAXIS_LITE_D, "aclk_asyncaxis_lite_d",
  4582. "div_aclk_lite_d", ENABLE_ACLK_CAM01,
  4583. 11, CLK_IGNORE_UNUSED, 0),
  4584. GATE(CLK_ACLK_ASYNCAXIM_LITE_B, "aclk_asyncaxim_lite_b",
  4585. "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01,
  4586. 10, CLK_IGNORE_UNUSED, 0),
  4587. GATE(CLK_ACLK_ASYNCAXIS_LITE_B, "aclk_asyncaxis_lite_b",
  4588. "div_aclk_lite_b", ENABLE_ACLK_CAM01,
  4589. 9, CLK_IGNORE_UNUSED, 0),
  4590. GATE(CLK_ACLK_ASYNCAXIM_LITE_A, "aclk_asyncaxim_lite_a",
  4591. "div_aclk_cam0_bus_400", ENABLE_ACLK_CAM01,
  4592. 8, CLK_IGNORE_UNUSED, 0),
  4593. GATE(CLK_ACLK_ASYNCAXIS_LITE_A, "aclk_asyncaxis_lite_a",
  4594. "div_aclk_lite_a", ENABLE_ACLK_CAM01,
  4595. 7, CLK_IGNORE_UNUSED, 0),
  4596. GATE(CLK_ACLK_AHB2APB_ISPSFRP, "aclk_ahb2apb_ispsfrp",
  4597. "div_pclk_cam0_50", ENABLE_ACLK_CAM01,
  4598. 6, CLK_IGNORE_UNUSED, 0),
  4599. GATE(CLK_ACLK_AXI2APB_ISP0P, "aclk_axi2apb_isp0p", "div_aclk_cam0_200",
  4600. ENABLE_ACLK_CAM01, 5, CLK_IGNORE_UNUSED, 0),
  4601. GATE(CLK_ACLK_AXI2AHB_ISP0P, "aclk_axi2ahb_isp0p", "div_aclk_cam0_200",
  4602. ENABLE_ACLK_CAM01, 4, CLK_IGNORE_UNUSED, 0),
  4603. GATE(CLK_ACLK_XIU_IS0X, "aclk_xiu_is0x", "div_aclk_cam0_200",
  4604. ENABLE_ACLK_CAM01, 3, CLK_IGNORE_UNUSED, 0),
  4605. GATE(CLK_ACLK_XIU_ISP0EX, "aclk_xiu_isp0ex", "div_aclk_cam0_bus_400",
  4606. ENABLE_ACLK_CAM01, 2, CLK_IGNORE_UNUSED, 0),
  4607. GATE(CLK_ACLK_CAM0NP_276, "aclk_cam0np_276", "div_aclk_cam0_200",
  4608. ENABLE_ACLK_CAM01, 1, CLK_IGNORE_UNUSED, 0),
  4609. GATE(CLK_ACLK_CAM0ND_400, "aclk_cam0nd_400", "div_aclk_cam0_bus_400",
  4610. ENABLE_ACLK_CAM01, 0, CLK_IGNORE_UNUSED, 0),
  4611. /* ENABLE_ACLK_CAM02 */
  4612. GATE(CLK_ACLK_SMMU_3AA1, "aclk_smmu_3aa1", "div_aclk_cam0_bus_400",
  4613. ENABLE_ACLK_CAM02, 9, CLK_IGNORE_UNUSED, 0),
  4614. GATE(CLK_ACLK_SMMU_3AA0, "aclk_smmu_3aa0", "div_aclk_cam0_bus_400",
  4615. ENABLE_ACLK_CAM02, 8, CLK_IGNORE_UNUSED, 0),
  4616. GATE(CLK_ACLK_SMMU_LITE_D, "aclk_smmu_lite_d", "div_aclk_cam0_bus_400",
  4617. ENABLE_ACLK_CAM02, 7, CLK_IGNORE_UNUSED, 0),
  4618. GATE(CLK_ACLK_SMMU_LITE_B, "aclk_smmu_lite_b", "div_aclk_cam0_bus_400",
  4619. ENABLE_ACLK_CAM02, 6, CLK_IGNORE_UNUSED, 0),
  4620. GATE(CLK_ACLK_SMMU_LITE_A, "aclk_smmu_lite_a", "div_aclk_cam0_bus_400",
  4621. ENABLE_ACLK_CAM02, 5, CLK_IGNORE_UNUSED, 0),
  4622. GATE(CLK_ACLK_BTS_3AA1, "aclk_bts_3aa1", "div_aclk_cam0_bus_400",
  4623. ENABLE_ACLK_CAM02, 4, CLK_IGNORE_UNUSED, 0),
  4624. GATE(CLK_ACLK_BTS_3AA0, "aclk_bts_3aa0", "div_aclk_cam0_bus_400",
  4625. ENABLE_ACLK_CAM02, 3, CLK_IGNORE_UNUSED, 0),
  4626. GATE(CLK_ACLK_BTS_LITE_D, "aclk_bts_lite_d", "div_aclk_cam0_bus_400",
  4627. ENABLE_ACLK_CAM02, 2, CLK_IGNORE_UNUSED, 0),
  4628. GATE(CLK_ACLK_BTS_LITE_B, "aclk_bts_lite_b", "div_aclk_cam0_bus_400",
  4629. ENABLE_ACLK_CAM02, 1, CLK_IGNORE_UNUSED, 0),
  4630. GATE(CLK_ACLK_BTS_LITE_A, "aclk_bts_lite_a", "div_aclk_cam0_bus_400",
  4631. ENABLE_ACLK_CAM02, 0, CLK_IGNORE_UNUSED, 0),
  4632. /* ENABLE_PCLK_CAM0 */
  4633. GATE(CLK_PCLK_SMMU_3AA1, "pclk_smmu_3aa1", "div_aclk_cam0_200",
  4634. ENABLE_PCLK_CAM0, 25, CLK_IGNORE_UNUSED, 0),
  4635. GATE(CLK_PCLK_SMMU_3AA0, "pclk_smmu_3aa0", "div_aclk_cam0_200",
  4636. ENABLE_PCLK_CAM0, 24, CLK_IGNORE_UNUSED, 0),
  4637. GATE(CLK_PCLK_SMMU_LITE_D, "pclk_smmu_lite_d", "div_aclk_cam0_200",
  4638. ENABLE_PCLK_CAM0, 23, CLK_IGNORE_UNUSED, 0),
  4639. GATE(CLK_PCLK_SMMU_LITE_B, "pclk_smmu_lite_b", "div_aclk_cam0_200",
  4640. ENABLE_PCLK_CAM0, 22, CLK_IGNORE_UNUSED, 0),
  4641. GATE(CLK_PCLK_SMMU_LITE_A, "pclk_smmu_lite_a", "div_aclk_cam0_200",
  4642. ENABLE_PCLK_CAM0, 21, CLK_IGNORE_UNUSED, 0),
  4643. GATE(CLK_PCLK_BTS_3AA1, "pclk_bts_3aa1", "div_pclk_cam0_50",
  4644. ENABLE_PCLK_CAM0, 20, CLK_IGNORE_UNUSED, 0),
  4645. GATE(CLK_PCLK_BTS_3AA0, "pclk_bts_3aa0", "div_pclk_cam0_50",
  4646. ENABLE_PCLK_CAM0, 19, CLK_IGNORE_UNUSED, 0),
  4647. GATE(CLK_PCLK_BTS_LITE_D, "pclk_bts_lite_d", "div_pclk_cam0_50",
  4648. ENABLE_PCLK_CAM0, 18, CLK_IGNORE_UNUSED, 0),
  4649. GATE(CLK_PCLK_BTS_LITE_B, "pclk_bts_lite_b", "div_pclk_cam0_50",
  4650. ENABLE_PCLK_CAM0, 17, CLK_IGNORE_UNUSED, 0),
  4651. GATE(CLK_PCLK_BTS_LITE_A, "pclk_bts_lite_a", "div_pclk_cam0_50",
  4652. ENABLE_PCLK_CAM0, 16, CLK_IGNORE_UNUSED, 0),
  4653. GATE(CLK_PCLK_ASYNCAXI_CAM1, "pclk_asyncaxi_cam1", "div_pclk_cam0_50",
  4654. ENABLE_PCLK_CAM0, 15, CLK_IGNORE_UNUSED, 0),
  4655. GATE(CLK_PCLK_ASYNCAXI_3AA1, "pclk_asyncaxi_3aa1", "div_pclk_cam0_50",
  4656. ENABLE_PCLK_CAM0, 14, CLK_IGNORE_UNUSED, 0),
  4657. GATE(CLK_PCLK_ASYNCAXI_3AA0, "pclk_asyncaxi_3aa0", "div_pclk_cam0_50",
  4658. ENABLE_PCLK_CAM0, 13, CLK_IGNORE_UNUSED, 0),
  4659. GATE(CLK_PCLK_ASYNCAXI_LITE_D, "pclk_asyncaxi_lite_d",
  4660. "div_pclk_cam0_50", ENABLE_PCLK_CAM0,
  4661. 12, CLK_IGNORE_UNUSED, 0),
  4662. GATE(CLK_PCLK_ASYNCAXI_LITE_B, "pclk_asyncaxi_lite_b",
  4663. "div_pclk_cam0_50", ENABLE_PCLK_CAM0,
  4664. 11, CLK_IGNORE_UNUSED, 0),
  4665. GATE(CLK_PCLK_ASYNCAXI_LITE_A, "pclk_asyncaxi_lite_a",
  4666. "div_pclk_cam0_50", ENABLE_PCLK_CAM0,
  4667. 10, CLK_IGNORE_UNUSED, 0),
  4668. GATE(CLK_PCLK_PMU_CAM0, "pclk_pmu_cam0", "div_pclk_cam0_50",
  4669. ENABLE_PCLK_CAM0, 9, CLK_IGNORE_UNUSED, 0),
  4670. GATE(CLK_PCLK_SYSREG_CAM0, "pclk_sysreg_cam0", "div_pclk_cam0_50",
  4671. ENABLE_PCLK_CAM0, 8, CLK_IGNORE_UNUSED, 0),
  4672. GATE(CLK_PCLK_CMU_CAM0_LOCAL, "pclk_cmu_cam0_local",
  4673. "div_aclk_cam0_200", ENABLE_PCLK_CAM0,
  4674. 7, CLK_IGNORE_UNUSED, 0),
  4675. GATE(CLK_PCLK_CSIS1, "pclk_csis1", "div_aclk_cam0_200",
  4676. ENABLE_PCLK_CAM0, 6, CLK_IGNORE_UNUSED, 0),
  4677. GATE(CLK_PCLK_CSIS0, "pclk_csis0", "div_aclk_cam0_200",
  4678. ENABLE_PCLK_CAM0, 5, CLK_IGNORE_UNUSED, 0),
  4679. GATE(CLK_PCLK_3AA1, "pclk_3aa1", "div_pclk_3aa1",
  4680. ENABLE_PCLK_CAM0, 4, CLK_IGNORE_UNUSED, 0),
  4681. GATE(CLK_PCLK_3AA0, "pclk_3aa0", "div_pclk_3aa0",
  4682. ENABLE_PCLK_CAM0, 3, CLK_IGNORE_UNUSED, 0),
  4683. GATE(CLK_PCLK_LITE_D, "pclk_lite_d", "div_pclk_lite_d",
  4684. ENABLE_PCLK_CAM0, 2, CLK_IGNORE_UNUSED, 0),
  4685. GATE(CLK_PCLK_LITE_B, "pclk_lite_b", "div_pclk_lite_b",
  4686. ENABLE_PCLK_CAM0, 1, CLK_IGNORE_UNUSED, 0),
  4687. GATE(CLK_PCLK_LITE_A, "pclk_lite_a", "div_pclk_lite_a",
  4688. ENABLE_PCLK_CAM0, 0, CLK_IGNORE_UNUSED, 0),
  4689. /* ENABLE_SCLK_CAM0 */
  4690. GATE(CLK_PHYCLK_RXBYTECLKHS0_S4, "phyclk_rxbyteclkhs0_s4",
  4691. "mout_phyclk_rxbyteclkhs0_s4_user",
  4692. ENABLE_SCLK_CAM0, 8, 0, 0),
  4693. GATE(CLK_PHYCLK_RXBYTECLKHS0_S2A, "phyclk_rxbyteclkhs0_s2a",
  4694. "mout_phyclk_rxbyteclkhs0_s2a_user",
  4695. ENABLE_SCLK_CAM0, 7, 0, 0),
  4696. GATE(CLK_SCLK_LITE_FREECNT, "sclk_lite_freecnt",
  4697. "mout_sclk_lite_freecnt_c", ENABLE_SCLK_CAM0, 6, 0, 0),
  4698. GATE(CLK_SCLK_PIXELASYNCM_3AA1, "sclk_pixelasycm_3aa1",
  4699. "div_aclk_3aa1", ENABLE_SCLK_CAM0, 5, 0, 0),
  4700. GATE(CLK_SCLK_PIXELASYNCM_3AA0, "sclk_pixelasycm_3aa0",
  4701. "div_aclk_3aa0", ENABLE_SCLK_CAM0, 4, 0, 0),
  4702. GATE(CLK_SCLK_PIXELASYNCS_3AA0, "sclk_pixelasycs_3aa0",
  4703. "div_aclk_3aa0", ENABLE_SCLK_CAM0, 3, 0, 0),
  4704. GATE(CLK_SCLK_PIXELASYNCM_LITE_C, "sclk_pixelasyncm_lite_c",
  4705. "div_sclk_pixelasync_lite_c",
  4706. ENABLE_SCLK_CAM0, 2, 0, 0),
  4707. GATE(CLK_SCLK_PIXELASYNCM_LITE_C_INIT, "sclk_pixelasyncm_lite_c_init",
  4708. "div_sclk_pixelasync_lite_c_init",
  4709. ENABLE_SCLK_CAM0, 1, 0, 0),
  4710. GATE(CLK_SCLK_PIXELASYNCS_LITE_C_INIT, "sclk_pixelasyncs_lite_c_init",
  4711. "div_sclk_pixelasync_lite_c",
  4712. ENABLE_SCLK_CAM0, 0, 0, 0),
  4713. };
  4714. static const struct samsung_cmu_info cam0_cmu_info __initconst = {
  4715. .mux_clks = cam0_mux_clks,
  4716. .nr_mux_clks = ARRAY_SIZE(cam0_mux_clks),
  4717. .div_clks = cam0_div_clks,
  4718. .nr_div_clks = ARRAY_SIZE(cam0_div_clks),
  4719. .gate_clks = cam0_gate_clks,
  4720. .nr_gate_clks = ARRAY_SIZE(cam0_gate_clks),
  4721. .fixed_clks = cam0_fixed_clks,
  4722. .nr_fixed_clks = ARRAY_SIZE(cam0_fixed_clks),
  4723. .nr_clk_ids = CAM0_NR_CLK,
  4724. .clk_regs = cam0_clk_regs,
  4725. .nr_clk_regs = ARRAY_SIZE(cam0_clk_regs),
  4726. .suspend_regs = cam0_suspend_regs,
  4727. .nr_suspend_regs = ARRAY_SIZE(cam0_suspend_regs),
  4728. .clk_name = "aclk_cam0_400",
  4729. };
  4730. /*
  4731. * Register offset definitions for CMU_CAM1
  4732. */
  4733. #define MUX_SEL_CAM10 0x0200
  4734. #define MUX_SEL_CAM11 0x0204
  4735. #define MUX_SEL_CAM12 0x0208
  4736. #define MUX_ENABLE_CAM10 0x0300
  4737. #define MUX_ENABLE_CAM11 0x0304
  4738. #define MUX_ENABLE_CAM12 0x0308
  4739. #define MUX_STAT_CAM10 0x0400
  4740. #define MUX_STAT_CAM11 0x0404
  4741. #define MUX_STAT_CAM12 0x0408
  4742. #define MUX_IGNORE_CAM11 0x0504
  4743. #define DIV_CAM10 0x0600
  4744. #define DIV_CAM11 0x0604
  4745. #define DIV_STAT_CAM10 0x0700
  4746. #define DIV_STAT_CAM11 0x0704
  4747. #define ENABLE_ACLK_CAM10 0X0800
  4748. #define ENABLE_ACLK_CAM11 0X0804
  4749. #define ENABLE_ACLK_CAM12 0X0808
  4750. #define ENABLE_PCLK_CAM1 0X0900
  4751. #define ENABLE_SCLK_CAM1 0X0a00
  4752. #define ENABLE_IP_CAM10 0X0b00
  4753. #define ENABLE_IP_CAM11 0X0b04
  4754. #define ENABLE_IP_CAM12 0X0b08
  4755. static const unsigned long cam1_clk_regs[] __initconst = {
  4756. MUX_SEL_CAM10,
  4757. MUX_SEL_CAM11,
  4758. MUX_SEL_CAM12,
  4759. MUX_ENABLE_CAM10,
  4760. MUX_ENABLE_CAM11,
  4761. MUX_ENABLE_CAM12,
  4762. MUX_IGNORE_CAM11,
  4763. DIV_CAM10,
  4764. DIV_CAM11,
  4765. ENABLE_ACLK_CAM10,
  4766. ENABLE_ACLK_CAM11,
  4767. ENABLE_ACLK_CAM12,
  4768. ENABLE_PCLK_CAM1,
  4769. ENABLE_SCLK_CAM1,
  4770. ENABLE_IP_CAM10,
  4771. ENABLE_IP_CAM11,
  4772. ENABLE_IP_CAM12,
  4773. };
  4774. static const struct samsung_clk_reg_dump cam1_suspend_regs[] = {
  4775. { MUX_SEL_CAM10, 0 },
  4776. { MUX_SEL_CAM11, 0 },
  4777. { MUX_SEL_CAM12, 0 },
  4778. };
  4779. PNAME(mout_sclk_isp_uart_user_p) = { "oscclk", "sclk_isp_uart_cam1", };
  4780. PNAME(mout_sclk_isp_spi1_user_p) = { "oscclk", "sclk_isp_spi1_cam1", };
  4781. PNAME(mout_sclk_isp_spi0_user_p) = { "oscclk", "sclk_isp_spi0_cam1", };
  4782. PNAME(mout_aclk_cam1_333_user_p) = { "oscclk", "aclk_cam1_333", };
  4783. PNAME(mout_aclk_cam1_400_user_p) = { "oscclk", "aclk_cam1_400", };
  4784. PNAME(mout_aclk_cam1_552_user_p) = { "oscclk", "aclk_cam1_552", };
  4785. PNAME(mout_phyclk_rxbyteclkhs0_s2b_user_p) = { "oscclk",
  4786. "phyclk_rxbyteclkhs0_s2b_phy", };
  4787. PNAME(mout_aclk_csis2_b_p) = { "mout_aclk_csis2_a",
  4788. "mout_aclk_cam1_333_user", };
  4789. PNAME(mout_aclk_csis2_a_p) = { "mout_aclk_cam1_552_user",
  4790. "mout_aclk_cam1_400_user", };
  4791. PNAME(mout_aclk_fd_b_p) = { "mout_aclk_fd_a",
  4792. "mout_aclk_cam1_333_user", };
  4793. PNAME(mout_aclk_fd_a_p) = { "mout_aclk_cam1_552_user",
  4794. "mout_aclk_cam1_400_user", };
  4795. PNAME(mout_aclk_lite_c_b_p) = { "mout_aclk_lite_c_a",
  4796. "mout_aclk_cam1_333_user", };
  4797. PNAME(mout_aclk_lite_c_a_p) = { "mout_aclk_cam1_552_user",
  4798. "mout_aclk_cam1_400_user", };
  4799. static const struct samsung_fixed_rate_clock cam1_fixed_clks[] __initconst = {
  4800. FRATE(CLK_PHYCLK_RXBYTEECLKHS0_S2B, "phyclk_rxbyteclkhs0_s2b_phy", NULL,
  4801. 0, 100000000),
  4802. };
  4803. static const struct samsung_mux_clock cam1_mux_clks[] __initconst = {
  4804. /* MUX_SEL_CAM10 */
  4805. MUX(CLK_MOUT_SCLK_ISP_UART_USER, "mout_sclk_isp_uart_user",
  4806. mout_sclk_isp_uart_user_p, MUX_SEL_CAM10, 20, 1),
  4807. MUX(CLK_MOUT_SCLK_ISP_SPI1_USER, "mout_sclk_isp_spi1_user",
  4808. mout_sclk_isp_spi1_user_p, MUX_SEL_CAM10, 16, 1),
  4809. MUX(CLK_MOUT_SCLK_ISP_SPI0_USER, "mout_sclk_isp_spi0_user",
  4810. mout_sclk_isp_spi0_user_p, MUX_SEL_CAM10, 12, 1),
  4811. MUX(CLK_MOUT_ACLK_CAM1_333_USER, "mout_aclk_cam1_333_user",
  4812. mout_aclk_cam1_333_user_p, MUX_SEL_CAM10, 8, 1),
  4813. MUX(CLK_MOUT_ACLK_CAM1_400_USER, "mout_aclk_cam1_400_user",
  4814. mout_aclk_cam1_400_user_p, MUX_SEL_CAM10, 4, 1),
  4815. MUX(CLK_MOUT_ACLK_CAM1_552_USER, "mout_aclk_cam1_552_user",
  4816. mout_aclk_cam1_552_user_p, MUX_SEL_CAM10, 0, 1),
  4817. /* MUX_SEL_CAM11 */
  4818. MUX(CLK_MOUT_PHYCLK_RXBYTECLKHS0_S2B_USER,
  4819. "mout_phyclk_rxbyteclkhs0_s2b_user",
  4820. mout_phyclk_rxbyteclkhs0_s2b_user_p,
  4821. MUX_SEL_CAM11, 0, 1),
  4822. /* MUX_SEL_CAM12 */
  4823. MUX(CLK_MOUT_ACLK_CSIS2_B, "mout_aclk_csis2_b", mout_aclk_csis2_b_p,
  4824. MUX_SEL_CAM12, 20, 1),
  4825. MUX(CLK_MOUT_ACLK_CSIS2_A, "mout_aclk_csis2_a", mout_aclk_csis2_a_p,
  4826. MUX_SEL_CAM12, 16, 1),
  4827. MUX(CLK_MOUT_ACLK_FD_B, "mout_aclk_fd_b", mout_aclk_fd_b_p,
  4828. MUX_SEL_CAM12, 12, 1),
  4829. MUX(CLK_MOUT_ACLK_FD_A, "mout_aclk_fd_a", mout_aclk_fd_a_p,
  4830. MUX_SEL_CAM12, 8, 1),
  4831. MUX(CLK_MOUT_ACLK_LITE_C_B, "mout_aclk_lite_c_b", mout_aclk_lite_c_b_p,
  4832. MUX_SEL_CAM12, 4, 1),
  4833. MUX(CLK_MOUT_ACLK_LITE_C_A, "mout_aclk_lite_c_a", mout_aclk_lite_c_a_p,
  4834. MUX_SEL_CAM12, 0, 1),
  4835. };
  4836. static const struct samsung_div_clock cam1_div_clks[] __initconst = {
  4837. /* DIV_CAM10 */
  4838. DIV(CLK_DIV_SCLK_ISP_MPWM, "div_sclk_isp_mpwm",
  4839. "div_pclk_cam1_83", DIV_CAM10, 16, 2),
  4840. DIV(CLK_DIV_PCLK_CAM1_83, "div_pclk_cam1_83",
  4841. "mout_aclk_cam1_333_user", DIV_CAM10, 12, 2),
  4842. DIV(CLK_DIV_PCLK_CAM1_166, "div_pclk_cam1_166",
  4843. "mout_aclk_cam1_333_user", DIV_CAM10, 8, 2),
  4844. DIV(CLK_DIV_PCLK_DBG_CAM1, "div_pclk_dbg_cam1",
  4845. "mout_aclk_cam1_552_user", DIV_CAM10, 4, 3),
  4846. DIV(CLK_DIV_ATCLK_CAM1, "div_atclk_cam1", "mout_aclk_cam1_552_user",
  4847. DIV_CAM10, 0, 3),
  4848. /* DIV_CAM11 */
  4849. DIV(CLK_DIV_ACLK_CSIS2, "div_aclk_csis2", "mout_aclk_csis2_b",
  4850. DIV_CAM11, 16, 3),
  4851. DIV(CLK_DIV_PCLK_FD, "div_pclk_fd", "div_aclk_fd", DIV_CAM11, 12, 2),
  4852. DIV(CLK_DIV_ACLK_FD, "div_aclk_fd", "mout_aclk_fd_b", DIV_CAM11, 8, 3),
  4853. DIV(CLK_DIV_PCLK_LITE_C, "div_pclk_lite_c", "div_aclk_lite_c",
  4854. DIV_CAM11, 4, 2),
  4855. DIV(CLK_DIV_ACLK_LITE_C, "div_aclk_lite_c", "mout_aclk_lite_c_b",
  4856. DIV_CAM11, 0, 3),
  4857. };
  4858. static const struct samsung_gate_clock cam1_gate_clks[] __initconst = {
  4859. /* ENABLE_ACLK_CAM10 */
  4860. GATE(CLK_ACLK_ISP_GIC, "aclk_isp_gic", "mout_aclk_cam1_333_user",
  4861. ENABLE_ACLK_CAM10, 4, 0, 0),
  4862. GATE(CLK_ACLK_FD, "aclk_fd", "div_aclk_fd",
  4863. ENABLE_ACLK_CAM10, 3, 0, 0),
  4864. GATE(CLK_ACLK_LITE_C, "aclk_lite_c", "div_aclk_lite_c",
  4865. ENABLE_ACLK_CAM10, 1, 0, 0),
  4866. GATE(CLK_ACLK_CSIS2, "aclk_csis2", "div_aclk_csis2",
  4867. ENABLE_ACLK_CAM10, 0, 0, 0),
  4868. /* ENABLE_ACLK_CAM11 */
  4869. GATE(CLK_ACLK_ASYNCAPBM_FD, "aclk_asyncapbm_fd", "div_pclk_fd",
  4870. ENABLE_ACLK_CAM11, 29, CLK_IGNORE_UNUSED, 0),
  4871. GATE(CLK_ACLK_ASYNCAPBS_FD, "aclk_asyncapbs_fd", "div_pclk_cam1_166",
  4872. ENABLE_ACLK_CAM11, 28, CLK_IGNORE_UNUSED, 0),
  4873. GATE(CLK_ACLK_ASYNCAPBM_LITE_C, "aclk_asyncapbm_lite_c",
  4874. "div_pclk_lite_c", ENABLE_ACLK_CAM11,
  4875. 27, CLK_IGNORE_UNUSED, 0),
  4876. GATE(CLK_ACLK_ASYNCAPBS_LITE_C, "aclk_asyncapbs_lite_c",
  4877. "div_pclk_cam1_166", ENABLE_ACLK_CAM11,
  4878. 26, CLK_IGNORE_UNUSED, 0),
  4879. GATE(CLK_ACLK_ASYNCAHBS_SFRISP2H2, "aclk_asyncahbs_sfrisp2h2",
  4880. "div_pclk_cam1_83", ENABLE_ACLK_CAM11,
  4881. 25, CLK_IGNORE_UNUSED, 0),
  4882. GATE(CLK_ACLK_ASYNCAHBS_SFRISP2H1, "aclk_asyncahbs_sfrisp2h1",
  4883. "div_pclk_cam1_83", ENABLE_ACLK_CAM11,
  4884. 24, CLK_IGNORE_UNUSED, 0),
  4885. GATE(CLK_ACLK_ASYNCAXIM_CA5, "aclk_asyncaxim_ca5",
  4886. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11,
  4887. 23, CLK_IGNORE_UNUSED, 0),
  4888. GATE(CLK_ACLK_ASYNCAXIS_CA5, "aclk_asyncaxis_ca5",
  4889. "mout_aclk_cam1_552_user", ENABLE_ACLK_CAM11,
  4890. 22, CLK_IGNORE_UNUSED, 0),
  4891. GATE(CLK_ACLK_ASYNCAXIS_ISPX2, "aclk_asyncaxis_ispx2",
  4892. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11,
  4893. 21, CLK_IGNORE_UNUSED, 0),
  4894. GATE(CLK_ACLK_ASYNCAXIS_ISPX1, "aclk_asyncaxis_ispx1",
  4895. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11,
  4896. 20, CLK_IGNORE_UNUSED, 0),
  4897. GATE(CLK_ACLK_ASYNCAXIS_ISPX0, "aclk_asyncaxis_ispx0",
  4898. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11,
  4899. 19, CLK_IGNORE_UNUSED, 0),
  4900. GATE(CLK_ACLK_ASYNCAXIM_ISPEX, "aclk_asyncaxim_ispex",
  4901. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11,
  4902. 18, CLK_IGNORE_UNUSED, 0),
  4903. GATE(CLK_ACLK_ASYNCAXIM_ISP3P, "aclk_asyncaxim_isp3p",
  4904. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11,
  4905. 17, CLK_IGNORE_UNUSED, 0),
  4906. GATE(CLK_ACLK_ASYNCAXIS_ISP3P, "aclk_asyncaxis_isp3p",
  4907. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11,
  4908. 16, CLK_IGNORE_UNUSED, 0),
  4909. GATE(CLK_ACLK_ASYNCAXIM_FD, "aclk_asyncaxim_fd",
  4910. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11,
  4911. 15, CLK_IGNORE_UNUSED, 0),
  4912. GATE(CLK_ACLK_ASYNCAXIS_FD, "aclk_asyncaxis_fd", "div_aclk_fd",
  4913. ENABLE_ACLK_CAM11, 14, CLK_IGNORE_UNUSED, 0),
  4914. GATE(CLK_ACLK_ASYNCAXIM_LITE_C, "aclk_asyncaxim_lite_c",
  4915. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM11,
  4916. 13, CLK_IGNORE_UNUSED, 0),
  4917. GATE(CLK_ACLK_ASYNCAXIS_LITE_C, "aclk_asyncaxis_lite_c",
  4918. "div_aclk_lite_c", ENABLE_ACLK_CAM11,
  4919. 12, CLK_IGNORE_UNUSED, 0),
  4920. GATE(CLK_ACLK_AHB2APB_ISP5P, "aclk_ahb2apb_isp5p", "div_pclk_cam1_83",
  4921. ENABLE_ACLK_CAM11, 11, CLK_IGNORE_UNUSED, 0),
  4922. GATE(CLK_ACLK_AHB2APB_ISP3P, "aclk_ahb2apb_isp3p", "div_pclk_cam1_83",
  4923. ENABLE_ACLK_CAM11, 10, CLK_IGNORE_UNUSED, 0),
  4924. GATE(CLK_ACLK_AXI2APB_ISP3P, "aclk_axi2apb_isp3p",
  4925. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM11,
  4926. 9, CLK_IGNORE_UNUSED, 0),
  4927. GATE(CLK_ACLK_AHB_SFRISP2H, "aclk_ahb_sfrisp2h", "div_pclk_cam1_83",
  4928. ENABLE_ACLK_CAM11, 8, CLK_IGNORE_UNUSED, 0),
  4929. GATE(CLK_ACLK_AXI_ISP_HX_R, "aclk_axi_isp_hx_r", "div_pclk_cam1_166",
  4930. ENABLE_ACLK_CAM11, 7, CLK_IGNORE_UNUSED, 0),
  4931. GATE(CLK_ACLK_AXI_ISP_CX_R, "aclk_axi_isp_cx_r", "div_pclk_cam1_166",
  4932. ENABLE_ACLK_CAM11, 6, CLK_IGNORE_UNUSED, 0),
  4933. GATE(CLK_ACLK_AXI_ISP_HX, "aclk_axi_isp_hx", "mout_aclk_cam1_333_user",
  4934. ENABLE_ACLK_CAM11, 5, CLK_IGNORE_UNUSED, 0),
  4935. GATE(CLK_ACLK_AXI_ISP_CX, "aclk_axi_isp_cx", "mout_aclk_cam1_333_user",
  4936. ENABLE_ACLK_CAM11, 4, CLK_IGNORE_UNUSED, 0),
  4937. GATE(CLK_ACLK_XIU_ISPX, "aclk_xiu_ispx", "mout_aclk_cam1_333_user",
  4938. ENABLE_ACLK_CAM11, 3, CLK_IGNORE_UNUSED, 0),
  4939. GATE(CLK_ACLK_XIU_ISPEX, "aclk_xiu_ispex", "mout_aclk_cam1_400_user",
  4940. ENABLE_ACLK_CAM11, 2, CLK_IGNORE_UNUSED, 0),
  4941. GATE(CLK_ACLK_CAM1NP_333, "aclk_cam1np_333", "mout_aclk_cam1_333_user",
  4942. ENABLE_ACLK_CAM11, 1, CLK_IGNORE_UNUSED, 0),
  4943. GATE(CLK_ACLK_CAM1ND_400, "aclk_cam1nd_400", "mout_aclk_cam1_400_user",
  4944. ENABLE_ACLK_CAM11, 0, CLK_IGNORE_UNUSED, 0),
  4945. /* ENABLE_ACLK_CAM12 */
  4946. GATE(CLK_ACLK_SMMU_ISPCPU, "aclk_smmu_ispcpu",
  4947. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12,
  4948. 10, CLK_IGNORE_UNUSED, 0),
  4949. GATE(CLK_ACLK_SMMU_FD, "aclk_smmu_fd", "mout_aclk_cam1_400_user",
  4950. ENABLE_ACLK_CAM12, 9, CLK_IGNORE_UNUSED, 0),
  4951. GATE(CLK_ACLK_SMMU_LITE_C, "aclk_smmu_lite_c",
  4952. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12,
  4953. 8, CLK_IGNORE_UNUSED, 0),
  4954. GATE(CLK_ACLK_BTS_ISP3P, "aclk_bts_isp3p", "mout_aclk_cam1_400_user",
  4955. ENABLE_ACLK_CAM12, 7, CLK_IGNORE_UNUSED, 0),
  4956. GATE(CLK_ACLK_BTS_FD, "aclk_bts_fd", "mout_aclk_cam1_400_user",
  4957. ENABLE_ACLK_CAM12, 6, CLK_IGNORE_UNUSED, 0),
  4958. GATE(CLK_ACLK_BTS_LITE_C, "aclk_bts_lite_c", "mout_aclk_cam1_400_user",
  4959. ENABLE_ACLK_CAM12, 5, CLK_IGNORE_UNUSED, 0),
  4960. GATE(CLK_ACLK_AHBDN_SFRISP2H, "aclk_ahbdn_sfrisp2h",
  4961. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM12,
  4962. 4, CLK_IGNORE_UNUSED, 0),
  4963. GATE(CLK_ACLK_AHBDN_ISP5P, "aclk_aclk-shbdn_isp5p",
  4964. "mout_aclk_cam1_333_user", ENABLE_ACLK_CAM12,
  4965. 3, CLK_IGNORE_UNUSED, 0),
  4966. GATE(CLK_ACLK_AXIUS_ISP3P, "aclk_axius_isp3p",
  4967. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12,
  4968. 2, CLK_IGNORE_UNUSED, 0),
  4969. GATE(CLK_ACLK_AXIUS_FD, "aclk_axius_fd", "mout_aclk_cam1_400_user",
  4970. ENABLE_ACLK_CAM12, 1, CLK_IGNORE_UNUSED, 0),
  4971. GATE(CLK_ACLK_AXIUS_LITE_C, "aclk_axius_lite_c",
  4972. "mout_aclk_cam1_400_user", ENABLE_ACLK_CAM12,
  4973. 0, CLK_IGNORE_UNUSED, 0),
  4974. /* ENABLE_PCLK_CAM1 */
  4975. GATE(CLK_PCLK_SMMU_ISPCPU, "pclk_smmu_ispcpu", "div_pclk_cam1_166",
  4976. ENABLE_PCLK_CAM1, 27, CLK_IGNORE_UNUSED, 0),
  4977. GATE(CLK_PCLK_SMMU_FD, "pclk_smmu_fd", "div_pclk_cam1_166",
  4978. ENABLE_PCLK_CAM1, 26, CLK_IGNORE_UNUSED, 0),
  4979. GATE(CLK_PCLK_SMMU_LITE_C, "pclk_smmu_lite_c", "div_pclk_cam1_166",
  4980. ENABLE_PCLK_CAM1, 25, CLK_IGNORE_UNUSED, 0),
  4981. GATE(CLK_PCLK_BTS_ISP3P, "pclk_bts_isp3p", "div_pclk_cam1_83",
  4982. ENABLE_PCLK_CAM1, 24, CLK_IGNORE_UNUSED, 0),
  4983. GATE(CLK_PCLK_BTS_FD, "pclk_bts_fd", "div_pclk_cam1_83",
  4984. ENABLE_PCLK_CAM1, 23, CLK_IGNORE_UNUSED, 0),
  4985. GATE(CLK_PCLK_BTS_LITE_C, "pclk_bts_lite_c", "div_pclk_cam1_83",
  4986. ENABLE_PCLK_CAM1, 22, CLK_IGNORE_UNUSED, 0),
  4987. GATE(CLK_PCLK_ASYNCAXIM_CA5, "pclk_asyncaxim_ca5", "div_pclk_cam1_166",
  4988. ENABLE_PCLK_CAM1, 21, CLK_IGNORE_UNUSED, 0),
  4989. GATE(CLK_PCLK_ASYNCAXIM_ISPEX, "pclk_asyncaxim_ispex",
  4990. "div_pclk_cam1_83", ENABLE_PCLK_CAM1,
  4991. 20, CLK_IGNORE_UNUSED, 0),
  4992. GATE(CLK_PCLK_ASYNCAXIM_ISP3P, "pclk_asyncaxim_isp3p",
  4993. "div_pclk_cam1_83", ENABLE_PCLK_CAM1,
  4994. 19, CLK_IGNORE_UNUSED, 0),
  4995. GATE(CLK_PCLK_ASYNCAXIM_FD, "pclk_asyncaxim_fd", "div_pclk_cam1_83",
  4996. ENABLE_PCLK_CAM1, 18, CLK_IGNORE_UNUSED, 0),
  4997. GATE(CLK_PCLK_ASYNCAXIM_LITE_C, "pclk_asyncaxim_lite_c",
  4998. "div_pclk_cam1_83", ENABLE_PCLK_CAM1,
  4999. 17, CLK_IGNORE_UNUSED, 0),
  5000. GATE(CLK_PCLK_PMU_CAM1, "pclk_pmu_cam1", "div_pclk_cam1_83",
  5001. ENABLE_PCLK_CAM1, 16, CLK_IGNORE_UNUSED, 0),
  5002. GATE(CLK_PCLK_SYSREG_CAM1, "pclk_sysreg_cam1", "div_pclk_cam1_83",
  5003. ENABLE_PCLK_CAM1, 15, CLK_IGNORE_UNUSED, 0),
  5004. GATE(CLK_PCLK_CMU_CAM1_LOCAL, "pclk_cmu_cam1_local",
  5005. "div_pclk_cam1_166", ENABLE_PCLK_CAM1,
  5006. 14, CLK_IGNORE_UNUSED, 0),
  5007. GATE(CLK_PCLK_ISP_MCTADC, "pclk_isp_mctadc", "div_pclk_cam1_83",
  5008. ENABLE_PCLK_CAM1, 13, CLK_IGNORE_UNUSED, 0),
  5009. GATE(CLK_PCLK_ISP_WDT, "pclk_isp_wdt", "div_pclk_cam1_83",
  5010. ENABLE_PCLK_CAM1, 12, CLK_IGNORE_UNUSED, 0),
  5011. GATE(CLK_PCLK_ISP_PWM, "pclk_isp_pwm", "div_pclk_cam1_83",
  5012. ENABLE_PCLK_CAM1, 11, CLK_IGNORE_UNUSED, 0),
  5013. GATE(CLK_PCLK_ISP_UART, "pclk_isp_uart", "div_pclk_cam1_83",
  5014. ENABLE_PCLK_CAM1, 10, CLK_IGNORE_UNUSED, 0),
  5015. GATE(CLK_PCLK_ISP_MCUCTL, "pclk_isp_mcuctl", "div_pclk_cam1_83",
  5016. ENABLE_PCLK_CAM1, 9, CLK_IGNORE_UNUSED, 0),
  5017. GATE(CLK_PCLK_ISP_SPI1, "pclk_isp_spi1", "div_pclk_cam1_83",
  5018. ENABLE_PCLK_CAM1, 8, CLK_IGNORE_UNUSED, 0),
  5019. GATE(CLK_PCLK_ISP_SPI0, "pclk_isp_spi0", "div_pclk_cam1_83",
  5020. ENABLE_PCLK_CAM1, 7, CLK_IGNORE_UNUSED, 0),
  5021. GATE(CLK_PCLK_ISP_I2C2, "pclk_isp_i2c2", "div_pclk_cam1_83",
  5022. ENABLE_PCLK_CAM1, 6, CLK_IGNORE_UNUSED, 0),
  5023. GATE(CLK_PCLK_ISP_I2C1, "pclk_isp_i2c1", "div_pclk_cam1_83",
  5024. ENABLE_PCLK_CAM1, 5, CLK_IGNORE_UNUSED, 0),
  5025. GATE(CLK_PCLK_ISP_I2C0, "pclk_isp_i2c0", "div_pclk_cam1_83",
  5026. ENABLE_PCLK_CAM1, 4, CLK_IGNORE_UNUSED, 0),
  5027. GATE(CLK_PCLK_ISP_MPWM, "pclk_isp_mpwm", "div_pclk_cam1_83",
  5028. ENABLE_PCLK_CAM1, 3, CLK_IGNORE_UNUSED, 0),
  5029. GATE(CLK_PCLK_FD, "pclk_fd", "div_pclk_fd",
  5030. ENABLE_PCLK_CAM1, 3, CLK_IGNORE_UNUSED, 0),
  5031. GATE(CLK_PCLK_LITE_C, "pclk_lite_c", "div_pclk_lite_c",
  5032. ENABLE_PCLK_CAM1, 1, CLK_IGNORE_UNUSED, 0),
  5033. GATE(CLK_PCLK_CSIS2, "pclk_csis2", "div_pclk_cam1_166",
  5034. ENABLE_PCLK_CAM1, 0, CLK_IGNORE_UNUSED, 0),
  5035. /* ENABLE_SCLK_CAM1 */
  5036. GATE(CLK_SCLK_ISP_I2C2, "sclk_isp_i2c2", "oscclk", ENABLE_SCLK_CAM1,
  5037. 15, 0, 0),
  5038. GATE(CLK_SCLK_ISP_I2C1, "sclk_isp_i2c1", "oscclk", ENABLE_SCLK_CAM1,
  5039. 14, 0, 0),
  5040. GATE(CLK_SCLK_ISP_I2C0, "sclk_isp_i2c0", "oscclk", ENABLE_SCLK_CAM1,
  5041. 13, 0, 0),
  5042. GATE(CLK_SCLK_ISP_PWM, "sclk_isp_pwm", "oscclk", ENABLE_SCLK_CAM1,
  5043. 12, 0, 0),
  5044. GATE(CLK_PHYCLK_RXBYTECLKHS0_S2B, "phyclk_rxbyteclkhs0_s2b",
  5045. "mout_phyclk_rxbyteclkhs0_s2b_user",
  5046. ENABLE_SCLK_CAM1, 11, 0, 0),
  5047. GATE(CLK_SCLK_LITE_C_FREECNT, "sclk_lite_c_freecnt", "div_pclk_lite_c",
  5048. ENABLE_SCLK_CAM1, 10, 0, 0),
  5049. GATE(CLK_SCLK_PIXELASYNCM_FD, "sclk_pixelasyncm_fd", "div_aclk_fd",
  5050. ENABLE_SCLK_CAM1, 9, 0, 0),
  5051. GATE(CLK_SCLK_ISP_MCTADC, "sclk_isp_mctadc", "sclk_isp_mctadc_cam1",
  5052. ENABLE_SCLK_CAM1, 7, 0, 0),
  5053. GATE(CLK_SCLK_ISP_UART, "sclk_isp_uart", "mout_sclk_isp_uart_user",
  5054. ENABLE_SCLK_CAM1, 6, 0, 0),
  5055. GATE(CLK_SCLK_ISP_SPI1, "sclk_isp_spi1", "mout_sclk_isp_spi1_user",
  5056. ENABLE_SCLK_CAM1, 5, 0, 0),
  5057. GATE(CLK_SCLK_ISP_SPI0, "sclk_isp_spi0", "mout_sclk_isp_spi0_user",
  5058. ENABLE_SCLK_CAM1, 4, 0, 0),
  5059. GATE(CLK_SCLK_ISP_MPWM, "sclk_isp_mpwm", "div_sclk_isp_mpwm",
  5060. ENABLE_SCLK_CAM1, 3, 0, 0),
  5061. GATE(CLK_PCLK_DBG_ISP, "sclk_dbg_isp", "div_pclk_dbg_cam1",
  5062. ENABLE_SCLK_CAM1, 2, 0, 0),
  5063. GATE(CLK_ATCLK_ISP, "atclk_isp", "div_atclk_cam1",
  5064. ENABLE_SCLK_CAM1, 1, 0, 0),
  5065. GATE(CLK_SCLK_ISP_CA5, "sclk_isp_ca5", "mout_aclk_cam1_552_user",
  5066. ENABLE_SCLK_CAM1, 0, 0, 0),
  5067. };
  5068. static const struct samsung_cmu_info cam1_cmu_info __initconst = {
  5069. .mux_clks = cam1_mux_clks,
  5070. .nr_mux_clks = ARRAY_SIZE(cam1_mux_clks),
  5071. .div_clks = cam1_div_clks,
  5072. .nr_div_clks = ARRAY_SIZE(cam1_div_clks),
  5073. .gate_clks = cam1_gate_clks,
  5074. .nr_gate_clks = ARRAY_SIZE(cam1_gate_clks),
  5075. .fixed_clks = cam1_fixed_clks,
  5076. .nr_fixed_clks = ARRAY_SIZE(cam1_fixed_clks),
  5077. .nr_clk_ids = CAM1_NR_CLK,
  5078. .clk_regs = cam1_clk_regs,
  5079. .nr_clk_regs = ARRAY_SIZE(cam1_clk_regs),
  5080. .suspend_regs = cam1_suspend_regs,
  5081. .nr_suspend_regs = ARRAY_SIZE(cam1_suspend_regs),
  5082. .clk_name = "aclk_cam1_400",
  5083. };
  5084. struct exynos5433_cmu_data {
  5085. struct samsung_clk_reg_dump *clk_save;
  5086. unsigned int nr_clk_save;
  5087. const struct samsung_clk_reg_dump *clk_suspend;
  5088. unsigned int nr_clk_suspend;
  5089. struct clk *clk;
  5090. struct clk **pclks;
  5091. int nr_pclks;
  5092. /* must be the last entry */
  5093. struct samsung_clk_provider ctx;
  5094. };
  5095. static int __maybe_unused exynos5433_cmu_suspend(struct device *dev)
  5096. {
  5097. struct exynos5433_cmu_data *data = dev_get_drvdata(dev);
  5098. int i;
  5099. samsung_clk_save(data->ctx.reg_base, data->clk_save,
  5100. data->nr_clk_save);
  5101. for (i = 0; i < data->nr_pclks; i++)
  5102. clk_prepare_enable(data->pclks[i]);
  5103. /* for suspend some registers have to be set to certain values */
  5104. samsung_clk_restore(data->ctx.reg_base, data->clk_suspend,
  5105. data->nr_clk_suspend);
  5106. for (i = 0; i < data->nr_pclks; i++)
  5107. clk_disable_unprepare(data->pclks[i]);
  5108. clk_disable_unprepare(data->clk);
  5109. return 0;
  5110. }
  5111. static int __maybe_unused exynos5433_cmu_resume(struct device *dev)
  5112. {
  5113. struct exynos5433_cmu_data *data = dev_get_drvdata(dev);
  5114. int i;
  5115. clk_prepare_enable(data->clk);
  5116. for (i = 0; i < data->nr_pclks; i++)
  5117. clk_prepare_enable(data->pclks[i]);
  5118. samsung_clk_restore(data->ctx.reg_base, data->clk_save,
  5119. data->nr_clk_save);
  5120. for (i = 0; i < data->nr_pclks; i++)
  5121. clk_disable_unprepare(data->pclks[i]);
  5122. return 0;
  5123. }
  5124. static int __init exynos5433_cmu_probe(struct platform_device *pdev)
  5125. {
  5126. const struct samsung_cmu_info *info;
  5127. struct exynos5433_cmu_data *data;
  5128. struct samsung_clk_provider *ctx;
  5129. struct device *dev = &pdev->dev;
  5130. struct resource *res;
  5131. void __iomem *reg_base;
  5132. int i;
  5133. info = of_device_get_match_data(dev);
  5134. data = devm_kzalloc(dev,
  5135. struct_size(data, ctx.clk_data.hws, info->nr_clk_ids),
  5136. GFP_KERNEL);
  5137. if (!data)
  5138. return -ENOMEM;
  5139. ctx = &data->ctx;
  5140. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  5141. reg_base = devm_ioremap_resource(dev, res);
  5142. if (IS_ERR(reg_base))
  5143. return PTR_ERR(reg_base);
  5144. for (i = 0; i < info->nr_clk_ids; ++i)
  5145. ctx->clk_data.hws[i] = ERR_PTR(-ENOENT);
  5146. ctx->clk_data.num = info->nr_clk_ids;
  5147. ctx->reg_base = reg_base;
  5148. ctx->dev = dev;
  5149. spin_lock_init(&ctx->lock);
  5150. data->clk_save = samsung_clk_alloc_reg_dump(info->clk_regs,
  5151. info->nr_clk_regs);
  5152. data->nr_clk_save = info->nr_clk_regs;
  5153. data->clk_suspend = info->suspend_regs;
  5154. data->nr_clk_suspend = info->nr_suspend_regs;
  5155. data->nr_pclks = of_count_phandle_with_args(dev->of_node, "clocks",
  5156. "#clock-cells");
  5157. if (data->nr_pclks > 0) {
  5158. data->pclks = devm_kcalloc(dev, sizeof(struct clk *),
  5159. data->nr_pclks, GFP_KERNEL);
  5160. for (i = 0; i < data->nr_pclks; i++) {
  5161. struct clk *clk = of_clk_get(dev->of_node, i);
  5162. if (IS_ERR(clk))
  5163. return PTR_ERR(clk);
  5164. data->pclks[i] = clk;
  5165. }
  5166. }
  5167. if (info->clk_name)
  5168. data->clk = clk_get(dev, info->clk_name);
  5169. clk_prepare_enable(data->clk);
  5170. platform_set_drvdata(pdev, data);
  5171. /*
  5172. * Enable runtime PM here to allow the clock core using runtime PM
  5173. * for the registered clocks. Additionally, we increase the runtime
  5174. * PM usage count before registering the clocks, to prevent the
  5175. * clock core from runtime suspending the device.
  5176. */
  5177. pm_runtime_get_noresume(dev);
  5178. pm_runtime_set_active(dev);
  5179. pm_runtime_enable(dev);
  5180. if (info->pll_clks)
  5181. samsung_clk_register_pll(ctx, info->pll_clks, info->nr_pll_clks,
  5182. reg_base);
  5183. if (info->mux_clks)
  5184. samsung_clk_register_mux(ctx, info->mux_clks,
  5185. info->nr_mux_clks);
  5186. if (info->div_clks)
  5187. samsung_clk_register_div(ctx, info->div_clks,
  5188. info->nr_div_clks);
  5189. if (info->gate_clks)
  5190. samsung_clk_register_gate(ctx, info->gate_clks,
  5191. info->nr_gate_clks);
  5192. if (info->fixed_clks)
  5193. samsung_clk_register_fixed_rate(ctx, info->fixed_clks,
  5194. info->nr_fixed_clks);
  5195. if (info->fixed_factor_clks)
  5196. samsung_clk_register_fixed_factor(ctx, info->fixed_factor_clks,
  5197. info->nr_fixed_factor_clks);
  5198. samsung_clk_of_add_provider(dev->of_node, ctx);
  5199. pm_runtime_put_sync(dev);
  5200. return 0;
  5201. }
  5202. static const struct of_device_id exynos5433_cmu_of_match[] = {
  5203. {
  5204. .compatible = "samsung,exynos5433-cmu-aud",
  5205. .data = &aud_cmu_info,
  5206. }, {
  5207. .compatible = "samsung,exynos5433-cmu-cam0",
  5208. .data = &cam0_cmu_info,
  5209. }, {
  5210. .compatible = "samsung,exynos5433-cmu-cam1",
  5211. .data = &cam1_cmu_info,
  5212. }, {
  5213. .compatible = "samsung,exynos5433-cmu-disp",
  5214. .data = &disp_cmu_info,
  5215. }, {
  5216. .compatible = "samsung,exynos5433-cmu-g2d",
  5217. .data = &g2d_cmu_info,
  5218. }, {
  5219. .compatible = "samsung,exynos5433-cmu-g3d",
  5220. .data = &g3d_cmu_info,
  5221. }, {
  5222. .compatible = "samsung,exynos5433-cmu-fsys",
  5223. .data = &fsys_cmu_info,
  5224. }, {
  5225. .compatible = "samsung,exynos5433-cmu-gscl",
  5226. .data = &gscl_cmu_info,
  5227. }, {
  5228. .compatible = "samsung,exynos5433-cmu-mfc",
  5229. .data = &mfc_cmu_info,
  5230. }, {
  5231. .compatible = "samsung,exynos5433-cmu-hevc",
  5232. .data = &hevc_cmu_info,
  5233. }, {
  5234. .compatible = "samsung,exynos5433-cmu-isp",
  5235. .data = &isp_cmu_info,
  5236. }, {
  5237. .compatible = "samsung,exynos5433-cmu-mscl",
  5238. .data = &mscl_cmu_info,
  5239. }, {
  5240. },
  5241. };
  5242. static const struct dev_pm_ops exynos5433_cmu_pm_ops = {
  5243. SET_RUNTIME_PM_OPS(exynos5433_cmu_suspend, exynos5433_cmu_resume,
  5244. NULL)
  5245. SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
  5246. pm_runtime_force_resume)
  5247. };
  5248. static struct platform_driver exynos5433_cmu_driver __refdata = {
  5249. .driver = {
  5250. .name = "exynos5433-cmu",
  5251. .of_match_table = exynos5433_cmu_of_match,
  5252. .suppress_bind_attrs = true,
  5253. .pm = &exynos5433_cmu_pm_ops,
  5254. },
  5255. .probe = exynos5433_cmu_probe,
  5256. };
  5257. static int __init exynos5433_cmu_init(void)
  5258. {
  5259. return platform_driver_register(&exynos5433_cmu_driver);
  5260. }
  5261. core_initcall(exynos5433_cmu_init);