clk-exynos5433.c 218 KB

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