clk-exynos5433.c 216 KB

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