g12a.c 144 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Amlogic Meson-G12A Clock Controller Driver
  4. *
  5. * Copyright (c) 2016 Baylibre SAS.
  6. * Author: Michael Turquette <[email protected]>
  7. *
  8. * Copyright (c) 2018 Amlogic, inc.
  9. * Author: Qiufang Dai <[email protected]>
  10. * Author: Jian Hu <[email protected]>
  11. */
  12. #include <linux/clk-provider.h>
  13. #include <linux/init.h>
  14. #include <linux/of_device.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/clk.h>
  17. #include <linux/module.h>
  18. #include "clk-mpll.h"
  19. #include "clk-pll.h"
  20. #include "clk-regmap.h"
  21. #include "clk-cpu-dyndiv.h"
  22. #include "vid-pll-div.h"
  23. #include "meson-eeclk.h"
  24. #include "g12a.h"
  25. static DEFINE_SPINLOCK(meson_clk_lock);
  26. static struct clk_regmap g12a_fixed_pll_dco = {
  27. .data = &(struct meson_clk_pll_data){
  28. .en = {
  29. .reg_off = HHI_FIX_PLL_CNTL0,
  30. .shift = 28,
  31. .width = 1,
  32. },
  33. .m = {
  34. .reg_off = HHI_FIX_PLL_CNTL0,
  35. .shift = 0,
  36. .width = 8,
  37. },
  38. .n = {
  39. .reg_off = HHI_FIX_PLL_CNTL0,
  40. .shift = 10,
  41. .width = 5,
  42. },
  43. .frac = {
  44. .reg_off = HHI_FIX_PLL_CNTL1,
  45. .shift = 0,
  46. .width = 17,
  47. },
  48. .l = {
  49. .reg_off = HHI_FIX_PLL_CNTL0,
  50. .shift = 31,
  51. .width = 1,
  52. },
  53. .rst = {
  54. .reg_off = HHI_FIX_PLL_CNTL0,
  55. .shift = 29,
  56. .width = 1,
  57. },
  58. },
  59. .hw.init = &(struct clk_init_data){
  60. .name = "fixed_pll_dco",
  61. .ops = &meson_clk_pll_ro_ops,
  62. .parent_data = &(const struct clk_parent_data) {
  63. .fw_name = "xtal",
  64. },
  65. .num_parents = 1,
  66. },
  67. };
  68. static struct clk_regmap g12a_fixed_pll = {
  69. .data = &(struct clk_regmap_div_data){
  70. .offset = HHI_FIX_PLL_CNTL0,
  71. .shift = 16,
  72. .width = 2,
  73. .flags = CLK_DIVIDER_POWER_OF_TWO,
  74. },
  75. .hw.init = &(struct clk_init_data){
  76. .name = "fixed_pll",
  77. .ops = &clk_regmap_divider_ro_ops,
  78. .parent_hws = (const struct clk_hw *[]) {
  79. &g12a_fixed_pll_dco.hw
  80. },
  81. .num_parents = 1,
  82. /*
  83. * This clock won't ever change at runtime so
  84. * CLK_SET_RATE_PARENT is not required
  85. */
  86. },
  87. };
  88. static const struct pll_mult_range g12a_sys_pll_mult_range = {
  89. .min = 128,
  90. .max = 250,
  91. };
  92. static struct clk_regmap g12a_sys_pll_dco = {
  93. .data = &(struct meson_clk_pll_data){
  94. .en = {
  95. .reg_off = HHI_SYS_PLL_CNTL0,
  96. .shift = 28,
  97. .width = 1,
  98. },
  99. .m = {
  100. .reg_off = HHI_SYS_PLL_CNTL0,
  101. .shift = 0,
  102. .width = 8,
  103. },
  104. .n = {
  105. .reg_off = HHI_SYS_PLL_CNTL0,
  106. .shift = 10,
  107. .width = 5,
  108. },
  109. .l = {
  110. .reg_off = HHI_SYS_PLL_CNTL0,
  111. .shift = 31,
  112. .width = 1,
  113. },
  114. .rst = {
  115. .reg_off = HHI_SYS_PLL_CNTL0,
  116. .shift = 29,
  117. .width = 1,
  118. },
  119. .range = &g12a_sys_pll_mult_range,
  120. },
  121. .hw.init = &(struct clk_init_data){
  122. .name = "sys_pll_dco",
  123. .ops = &meson_clk_pll_ops,
  124. .parent_data = &(const struct clk_parent_data) {
  125. .fw_name = "xtal",
  126. },
  127. .num_parents = 1,
  128. /* This clock feeds the CPU, avoid disabling it */
  129. .flags = CLK_IS_CRITICAL,
  130. },
  131. };
  132. static struct clk_regmap g12a_sys_pll = {
  133. .data = &(struct clk_regmap_div_data){
  134. .offset = HHI_SYS_PLL_CNTL0,
  135. .shift = 16,
  136. .width = 3,
  137. .flags = CLK_DIVIDER_POWER_OF_TWO,
  138. },
  139. .hw.init = &(struct clk_init_data){
  140. .name = "sys_pll",
  141. .ops = &clk_regmap_divider_ops,
  142. .parent_hws = (const struct clk_hw *[]) {
  143. &g12a_sys_pll_dco.hw
  144. },
  145. .num_parents = 1,
  146. .flags = CLK_SET_RATE_PARENT,
  147. },
  148. };
  149. static struct clk_regmap g12b_sys1_pll_dco = {
  150. .data = &(struct meson_clk_pll_data){
  151. .en = {
  152. .reg_off = HHI_SYS1_PLL_CNTL0,
  153. .shift = 28,
  154. .width = 1,
  155. },
  156. .m = {
  157. .reg_off = HHI_SYS1_PLL_CNTL0,
  158. .shift = 0,
  159. .width = 8,
  160. },
  161. .n = {
  162. .reg_off = HHI_SYS1_PLL_CNTL0,
  163. .shift = 10,
  164. .width = 5,
  165. },
  166. .l = {
  167. .reg_off = HHI_SYS1_PLL_CNTL0,
  168. .shift = 31,
  169. .width = 1,
  170. },
  171. .rst = {
  172. .reg_off = HHI_SYS1_PLL_CNTL0,
  173. .shift = 29,
  174. .width = 1,
  175. },
  176. .range = &g12a_sys_pll_mult_range,
  177. },
  178. .hw.init = &(struct clk_init_data){
  179. .name = "sys1_pll_dco",
  180. .ops = &meson_clk_pll_ops,
  181. .parent_data = &(const struct clk_parent_data) {
  182. .fw_name = "xtal",
  183. },
  184. .num_parents = 1,
  185. /* This clock feeds the CPU, avoid disabling it */
  186. .flags = CLK_IS_CRITICAL,
  187. },
  188. };
  189. static struct clk_regmap g12b_sys1_pll = {
  190. .data = &(struct clk_regmap_div_data){
  191. .offset = HHI_SYS1_PLL_CNTL0,
  192. .shift = 16,
  193. .width = 3,
  194. .flags = CLK_DIVIDER_POWER_OF_TWO,
  195. },
  196. .hw.init = &(struct clk_init_data){
  197. .name = "sys1_pll",
  198. .ops = &clk_regmap_divider_ops,
  199. .parent_hws = (const struct clk_hw *[]) {
  200. &g12b_sys1_pll_dco.hw
  201. },
  202. .num_parents = 1,
  203. .flags = CLK_SET_RATE_PARENT,
  204. },
  205. };
  206. static struct clk_regmap g12a_sys_pll_div16_en = {
  207. .data = &(struct clk_regmap_gate_data){
  208. .offset = HHI_SYS_CPU_CLK_CNTL1,
  209. .bit_idx = 24,
  210. },
  211. .hw.init = &(struct clk_init_data) {
  212. .name = "sys_pll_div16_en",
  213. .ops = &clk_regmap_gate_ro_ops,
  214. .parent_hws = (const struct clk_hw *[]) { &g12a_sys_pll.hw },
  215. .num_parents = 1,
  216. /*
  217. * This clock is used to debug the sys_pll range
  218. * Linux should not change it at runtime
  219. */
  220. },
  221. };
  222. static struct clk_regmap g12b_sys1_pll_div16_en = {
  223. .data = &(struct clk_regmap_gate_data){
  224. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  225. .bit_idx = 24,
  226. },
  227. .hw.init = &(struct clk_init_data) {
  228. .name = "sys1_pll_div16_en",
  229. .ops = &clk_regmap_gate_ro_ops,
  230. .parent_hws = (const struct clk_hw *[]) {
  231. &g12b_sys1_pll.hw
  232. },
  233. .num_parents = 1,
  234. /*
  235. * This clock is used to debug the sys_pll range
  236. * Linux should not change it at runtime
  237. */
  238. },
  239. };
  240. static struct clk_fixed_factor g12a_sys_pll_div16 = {
  241. .mult = 1,
  242. .div = 16,
  243. .hw.init = &(struct clk_init_data){
  244. .name = "sys_pll_div16",
  245. .ops = &clk_fixed_factor_ops,
  246. .parent_hws = (const struct clk_hw *[]) {
  247. &g12a_sys_pll_div16_en.hw
  248. },
  249. .num_parents = 1,
  250. },
  251. };
  252. static struct clk_fixed_factor g12b_sys1_pll_div16 = {
  253. .mult = 1,
  254. .div = 16,
  255. .hw.init = &(struct clk_init_data){
  256. .name = "sys1_pll_div16",
  257. .ops = &clk_fixed_factor_ops,
  258. .parent_hws = (const struct clk_hw *[]) {
  259. &g12b_sys1_pll_div16_en.hw
  260. },
  261. .num_parents = 1,
  262. },
  263. };
  264. static struct clk_fixed_factor g12a_fclk_div2_div = {
  265. .mult = 1,
  266. .div = 2,
  267. .hw.init = &(struct clk_init_data){
  268. .name = "fclk_div2_div",
  269. .ops = &clk_fixed_factor_ops,
  270. .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
  271. .num_parents = 1,
  272. },
  273. };
  274. static struct clk_regmap g12a_fclk_div2 = {
  275. .data = &(struct clk_regmap_gate_data){
  276. .offset = HHI_FIX_PLL_CNTL1,
  277. .bit_idx = 24,
  278. },
  279. .hw.init = &(struct clk_init_data){
  280. .name = "fclk_div2",
  281. .ops = &clk_regmap_gate_ops,
  282. .parent_hws = (const struct clk_hw *[]) {
  283. &g12a_fclk_div2_div.hw
  284. },
  285. .num_parents = 1,
  286. /*
  287. * Similar to fclk_div3, it seems that this clock is used by
  288. * the resident firmware and is required by the platform to
  289. * operate correctly.
  290. * Until the following condition are met, we need this clock to
  291. * be marked as critical:
  292. * a) Mark the clock used by a firmware resource, if possible
  293. * b) CCF has a clock hand-off mechanism to make the sure the
  294. * clock stays on until the proper driver comes along
  295. */
  296. .flags = CLK_IS_CRITICAL,
  297. },
  298. };
  299. static struct clk_fixed_factor g12a_fclk_div3_div = {
  300. .mult = 1,
  301. .div = 3,
  302. .hw.init = &(struct clk_init_data){
  303. .name = "fclk_div3_div",
  304. .ops = &clk_fixed_factor_ops,
  305. .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
  306. .num_parents = 1,
  307. },
  308. };
  309. static struct clk_regmap g12a_fclk_div3 = {
  310. .data = &(struct clk_regmap_gate_data){
  311. .offset = HHI_FIX_PLL_CNTL1,
  312. .bit_idx = 20,
  313. },
  314. .hw.init = &(struct clk_init_data){
  315. .name = "fclk_div3",
  316. .ops = &clk_regmap_gate_ops,
  317. .parent_hws = (const struct clk_hw *[]) {
  318. &g12a_fclk_div3_div.hw
  319. },
  320. .num_parents = 1,
  321. /*
  322. * This clock is used by the resident firmware and is required
  323. * by the platform to operate correctly.
  324. * Until the following condition are met, we need this clock to
  325. * be marked as critical:
  326. * a) Mark the clock used by a firmware resource, if possible
  327. * b) CCF has a clock hand-off mechanism to make the sure the
  328. * clock stays on until the proper driver comes along
  329. */
  330. .flags = CLK_IS_CRITICAL,
  331. },
  332. };
  333. /* Datasheet names this field as "premux0" */
  334. static struct clk_regmap g12a_cpu_clk_premux0 = {
  335. .data = &(struct clk_regmap_mux_data){
  336. .offset = HHI_SYS_CPU_CLK_CNTL0,
  337. .mask = 0x3,
  338. .shift = 0,
  339. .flags = CLK_MUX_ROUND_CLOSEST,
  340. },
  341. .hw.init = &(struct clk_init_data){
  342. .name = "cpu_clk_dyn0_sel",
  343. .ops = &clk_regmap_mux_ops,
  344. .parent_data = (const struct clk_parent_data []) {
  345. { .fw_name = "xtal", },
  346. { .hw = &g12a_fclk_div2.hw },
  347. { .hw = &g12a_fclk_div3.hw },
  348. },
  349. .num_parents = 3,
  350. .flags = CLK_SET_RATE_PARENT,
  351. },
  352. };
  353. /* Datasheet names this field as "premux1" */
  354. static struct clk_regmap g12a_cpu_clk_premux1 = {
  355. .data = &(struct clk_regmap_mux_data){
  356. .offset = HHI_SYS_CPU_CLK_CNTL0,
  357. .mask = 0x3,
  358. .shift = 16,
  359. },
  360. .hw.init = &(struct clk_init_data){
  361. .name = "cpu_clk_dyn1_sel",
  362. .ops = &clk_regmap_mux_ops,
  363. .parent_data = (const struct clk_parent_data []) {
  364. { .fw_name = "xtal", },
  365. { .hw = &g12a_fclk_div2.hw },
  366. { .hw = &g12a_fclk_div3.hw },
  367. },
  368. .num_parents = 3,
  369. /* This sub-tree is used a parking clock */
  370. .flags = CLK_SET_RATE_NO_REPARENT
  371. },
  372. };
  373. /* Datasheet names this field as "mux0_divn_tcnt" */
  374. static struct clk_regmap g12a_cpu_clk_mux0_div = {
  375. .data = &(struct meson_clk_cpu_dyndiv_data){
  376. .div = {
  377. .reg_off = HHI_SYS_CPU_CLK_CNTL0,
  378. .shift = 4,
  379. .width = 6,
  380. },
  381. .dyn = {
  382. .reg_off = HHI_SYS_CPU_CLK_CNTL0,
  383. .shift = 26,
  384. .width = 1,
  385. },
  386. },
  387. .hw.init = &(struct clk_init_data){
  388. .name = "cpu_clk_dyn0_div",
  389. .ops = &meson_clk_cpu_dyndiv_ops,
  390. .parent_hws = (const struct clk_hw *[]) {
  391. &g12a_cpu_clk_premux0.hw
  392. },
  393. .num_parents = 1,
  394. .flags = CLK_SET_RATE_PARENT,
  395. },
  396. };
  397. /* Datasheet names this field as "postmux0" */
  398. static struct clk_regmap g12a_cpu_clk_postmux0 = {
  399. .data = &(struct clk_regmap_mux_data){
  400. .offset = HHI_SYS_CPU_CLK_CNTL0,
  401. .mask = 0x1,
  402. .shift = 2,
  403. .flags = CLK_MUX_ROUND_CLOSEST,
  404. },
  405. .hw.init = &(struct clk_init_data){
  406. .name = "cpu_clk_dyn0",
  407. .ops = &clk_regmap_mux_ops,
  408. .parent_hws = (const struct clk_hw *[]) {
  409. &g12a_cpu_clk_premux0.hw,
  410. &g12a_cpu_clk_mux0_div.hw,
  411. },
  412. .num_parents = 2,
  413. .flags = CLK_SET_RATE_PARENT,
  414. },
  415. };
  416. /* Datasheet names this field as "Mux1_divn_tcnt" */
  417. static struct clk_regmap g12a_cpu_clk_mux1_div = {
  418. .data = &(struct clk_regmap_div_data){
  419. .offset = HHI_SYS_CPU_CLK_CNTL0,
  420. .shift = 20,
  421. .width = 6,
  422. },
  423. .hw.init = &(struct clk_init_data){
  424. .name = "cpu_clk_dyn1_div",
  425. .ops = &clk_regmap_divider_ro_ops,
  426. .parent_hws = (const struct clk_hw *[]) {
  427. &g12a_cpu_clk_premux1.hw
  428. },
  429. .num_parents = 1,
  430. },
  431. };
  432. /* Datasheet names this field as "postmux1" */
  433. static struct clk_regmap g12a_cpu_clk_postmux1 = {
  434. .data = &(struct clk_regmap_mux_data){
  435. .offset = HHI_SYS_CPU_CLK_CNTL0,
  436. .mask = 0x1,
  437. .shift = 18,
  438. },
  439. .hw.init = &(struct clk_init_data){
  440. .name = "cpu_clk_dyn1",
  441. .ops = &clk_regmap_mux_ops,
  442. .parent_hws = (const struct clk_hw *[]) {
  443. &g12a_cpu_clk_premux1.hw,
  444. &g12a_cpu_clk_mux1_div.hw,
  445. },
  446. .num_parents = 2,
  447. /* This sub-tree is used a parking clock */
  448. .flags = CLK_SET_RATE_NO_REPARENT,
  449. },
  450. };
  451. /* Datasheet names this field as "Final_dyn_mux_sel" */
  452. static struct clk_regmap g12a_cpu_clk_dyn = {
  453. .data = &(struct clk_regmap_mux_data){
  454. .offset = HHI_SYS_CPU_CLK_CNTL0,
  455. .mask = 0x1,
  456. .shift = 10,
  457. .flags = CLK_MUX_ROUND_CLOSEST,
  458. },
  459. .hw.init = &(struct clk_init_data){
  460. .name = "cpu_clk_dyn",
  461. .ops = &clk_regmap_mux_ops,
  462. .parent_hws = (const struct clk_hw *[]) {
  463. &g12a_cpu_clk_postmux0.hw,
  464. &g12a_cpu_clk_postmux1.hw,
  465. },
  466. .num_parents = 2,
  467. .flags = CLK_SET_RATE_PARENT,
  468. },
  469. };
  470. /* Datasheet names this field as "Final_mux_sel" */
  471. static struct clk_regmap g12a_cpu_clk = {
  472. .data = &(struct clk_regmap_mux_data){
  473. .offset = HHI_SYS_CPU_CLK_CNTL0,
  474. .mask = 0x1,
  475. .shift = 11,
  476. .flags = CLK_MUX_ROUND_CLOSEST,
  477. },
  478. .hw.init = &(struct clk_init_data){
  479. .name = "cpu_clk",
  480. .ops = &clk_regmap_mux_ops,
  481. .parent_hws = (const struct clk_hw *[]) {
  482. &g12a_cpu_clk_dyn.hw,
  483. &g12a_sys_pll.hw,
  484. },
  485. .num_parents = 2,
  486. .flags = CLK_SET_RATE_PARENT,
  487. },
  488. };
  489. /* Datasheet names this field as "Final_mux_sel" */
  490. static struct clk_regmap g12b_cpu_clk = {
  491. .data = &(struct clk_regmap_mux_data){
  492. .offset = HHI_SYS_CPU_CLK_CNTL0,
  493. .mask = 0x1,
  494. .shift = 11,
  495. .flags = CLK_MUX_ROUND_CLOSEST,
  496. },
  497. .hw.init = &(struct clk_init_data){
  498. .name = "cpu_clk",
  499. .ops = &clk_regmap_mux_ops,
  500. .parent_hws = (const struct clk_hw *[]) {
  501. &g12a_cpu_clk_dyn.hw,
  502. &g12b_sys1_pll.hw
  503. },
  504. .num_parents = 2,
  505. .flags = CLK_SET_RATE_PARENT,
  506. },
  507. };
  508. /* Datasheet names this field as "premux0" */
  509. static struct clk_regmap g12b_cpub_clk_premux0 = {
  510. .data = &(struct clk_regmap_mux_data){
  511. .offset = HHI_SYS_CPUB_CLK_CNTL,
  512. .mask = 0x3,
  513. .shift = 0,
  514. .flags = CLK_MUX_ROUND_CLOSEST,
  515. },
  516. .hw.init = &(struct clk_init_data){
  517. .name = "cpub_clk_dyn0_sel",
  518. .ops = &clk_regmap_mux_ops,
  519. .parent_data = (const struct clk_parent_data []) {
  520. { .fw_name = "xtal", },
  521. { .hw = &g12a_fclk_div2.hw },
  522. { .hw = &g12a_fclk_div3.hw },
  523. },
  524. .num_parents = 3,
  525. .flags = CLK_SET_RATE_PARENT,
  526. },
  527. };
  528. /* Datasheet names this field as "mux0_divn_tcnt" */
  529. static struct clk_regmap g12b_cpub_clk_mux0_div = {
  530. .data = &(struct meson_clk_cpu_dyndiv_data){
  531. .div = {
  532. .reg_off = HHI_SYS_CPUB_CLK_CNTL,
  533. .shift = 4,
  534. .width = 6,
  535. },
  536. .dyn = {
  537. .reg_off = HHI_SYS_CPUB_CLK_CNTL,
  538. .shift = 26,
  539. .width = 1,
  540. },
  541. },
  542. .hw.init = &(struct clk_init_data){
  543. .name = "cpub_clk_dyn0_div",
  544. .ops = &meson_clk_cpu_dyndiv_ops,
  545. .parent_hws = (const struct clk_hw *[]) {
  546. &g12b_cpub_clk_premux0.hw
  547. },
  548. .num_parents = 1,
  549. .flags = CLK_SET_RATE_PARENT,
  550. },
  551. };
  552. /* Datasheet names this field as "postmux0" */
  553. static struct clk_regmap g12b_cpub_clk_postmux0 = {
  554. .data = &(struct clk_regmap_mux_data){
  555. .offset = HHI_SYS_CPUB_CLK_CNTL,
  556. .mask = 0x1,
  557. .shift = 2,
  558. .flags = CLK_MUX_ROUND_CLOSEST,
  559. },
  560. .hw.init = &(struct clk_init_data){
  561. .name = "cpub_clk_dyn0",
  562. .ops = &clk_regmap_mux_ops,
  563. .parent_hws = (const struct clk_hw *[]) {
  564. &g12b_cpub_clk_premux0.hw,
  565. &g12b_cpub_clk_mux0_div.hw
  566. },
  567. .num_parents = 2,
  568. .flags = CLK_SET_RATE_PARENT,
  569. },
  570. };
  571. /* Datasheet names this field as "premux1" */
  572. static struct clk_regmap g12b_cpub_clk_premux1 = {
  573. .data = &(struct clk_regmap_mux_data){
  574. .offset = HHI_SYS_CPUB_CLK_CNTL,
  575. .mask = 0x3,
  576. .shift = 16,
  577. },
  578. .hw.init = &(struct clk_init_data){
  579. .name = "cpub_clk_dyn1_sel",
  580. .ops = &clk_regmap_mux_ops,
  581. .parent_data = (const struct clk_parent_data []) {
  582. { .fw_name = "xtal", },
  583. { .hw = &g12a_fclk_div2.hw },
  584. { .hw = &g12a_fclk_div3.hw },
  585. },
  586. .num_parents = 3,
  587. /* This sub-tree is used a parking clock */
  588. .flags = CLK_SET_RATE_NO_REPARENT,
  589. },
  590. };
  591. /* Datasheet names this field as "Mux1_divn_tcnt" */
  592. static struct clk_regmap g12b_cpub_clk_mux1_div = {
  593. .data = &(struct clk_regmap_div_data){
  594. .offset = HHI_SYS_CPUB_CLK_CNTL,
  595. .shift = 20,
  596. .width = 6,
  597. },
  598. .hw.init = &(struct clk_init_data){
  599. .name = "cpub_clk_dyn1_div",
  600. .ops = &clk_regmap_divider_ro_ops,
  601. .parent_hws = (const struct clk_hw *[]) {
  602. &g12b_cpub_clk_premux1.hw
  603. },
  604. .num_parents = 1,
  605. },
  606. };
  607. /* Datasheet names this field as "postmux1" */
  608. static struct clk_regmap g12b_cpub_clk_postmux1 = {
  609. .data = &(struct clk_regmap_mux_data){
  610. .offset = HHI_SYS_CPUB_CLK_CNTL,
  611. .mask = 0x1,
  612. .shift = 18,
  613. },
  614. .hw.init = &(struct clk_init_data){
  615. .name = "cpub_clk_dyn1",
  616. .ops = &clk_regmap_mux_ops,
  617. .parent_hws = (const struct clk_hw *[]) {
  618. &g12b_cpub_clk_premux1.hw,
  619. &g12b_cpub_clk_mux1_div.hw
  620. },
  621. .num_parents = 2,
  622. /* This sub-tree is used a parking clock */
  623. .flags = CLK_SET_RATE_NO_REPARENT,
  624. },
  625. };
  626. /* Datasheet names this field as "Final_dyn_mux_sel" */
  627. static struct clk_regmap g12b_cpub_clk_dyn = {
  628. .data = &(struct clk_regmap_mux_data){
  629. .offset = HHI_SYS_CPUB_CLK_CNTL,
  630. .mask = 0x1,
  631. .shift = 10,
  632. .flags = CLK_MUX_ROUND_CLOSEST,
  633. },
  634. .hw.init = &(struct clk_init_data){
  635. .name = "cpub_clk_dyn",
  636. .ops = &clk_regmap_mux_ops,
  637. .parent_hws = (const struct clk_hw *[]) {
  638. &g12b_cpub_clk_postmux0.hw,
  639. &g12b_cpub_clk_postmux1.hw
  640. },
  641. .num_parents = 2,
  642. .flags = CLK_SET_RATE_PARENT,
  643. },
  644. };
  645. /* Datasheet names this field as "Final_mux_sel" */
  646. static struct clk_regmap g12b_cpub_clk = {
  647. .data = &(struct clk_regmap_mux_data){
  648. .offset = HHI_SYS_CPUB_CLK_CNTL,
  649. .mask = 0x1,
  650. .shift = 11,
  651. .flags = CLK_MUX_ROUND_CLOSEST,
  652. },
  653. .hw.init = &(struct clk_init_data){
  654. .name = "cpub_clk",
  655. .ops = &clk_regmap_mux_ops,
  656. .parent_hws = (const struct clk_hw *[]) {
  657. &g12b_cpub_clk_dyn.hw,
  658. &g12a_sys_pll.hw
  659. },
  660. .num_parents = 2,
  661. .flags = CLK_SET_RATE_PARENT,
  662. },
  663. };
  664. static struct clk_regmap sm1_gp1_pll;
  665. /* Datasheet names this field as "premux0" */
  666. static struct clk_regmap sm1_dsu_clk_premux0 = {
  667. .data = &(struct clk_regmap_mux_data){
  668. .offset = HHI_SYS_CPU_CLK_CNTL5,
  669. .mask = 0x3,
  670. .shift = 0,
  671. },
  672. .hw.init = &(struct clk_init_data){
  673. .name = "dsu_clk_dyn0_sel",
  674. .ops = &clk_regmap_mux_ro_ops,
  675. .parent_data = (const struct clk_parent_data []) {
  676. { .fw_name = "xtal", },
  677. { .hw = &g12a_fclk_div2.hw },
  678. { .hw = &g12a_fclk_div3.hw },
  679. { .hw = &sm1_gp1_pll.hw },
  680. },
  681. .num_parents = 4,
  682. },
  683. };
  684. /* Datasheet names this field as "premux1" */
  685. static struct clk_regmap sm1_dsu_clk_premux1 = {
  686. .data = &(struct clk_regmap_mux_data){
  687. .offset = HHI_SYS_CPU_CLK_CNTL5,
  688. .mask = 0x3,
  689. .shift = 16,
  690. },
  691. .hw.init = &(struct clk_init_data){
  692. .name = "dsu_clk_dyn1_sel",
  693. .ops = &clk_regmap_mux_ro_ops,
  694. .parent_data = (const struct clk_parent_data []) {
  695. { .fw_name = "xtal", },
  696. { .hw = &g12a_fclk_div2.hw },
  697. { .hw = &g12a_fclk_div3.hw },
  698. { .hw = &sm1_gp1_pll.hw },
  699. },
  700. .num_parents = 4,
  701. },
  702. };
  703. /* Datasheet names this field as "Mux0_divn_tcnt" */
  704. static struct clk_regmap sm1_dsu_clk_mux0_div = {
  705. .data = &(struct clk_regmap_div_data){
  706. .offset = HHI_SYS_CPU_CLK_CNTL5,
  707. .shift = 4,
  708. .width = 6,
  709. },
  710. .hw.init = &(struct clk_init_data){
  711. .name = "dsu_clk_dyn0_div",
  712. .ops = &clk_regmap_divider_ro_ops,
  713. .parent_hws = (const struct clk_hw *[]) {
  714. &sm1_dsu_clk_premux0.hw
  715. },
  716. .num_parents = 1,
  717. },
  718. };
  719. /* Datasheet names this field as "postmux0" */
  720. static struct clk_regmap sm1_dsu_clk_postmux0 = {
  721. .data = &(struct clk_regmap_mux_data){
  722. .offset = HHI_SYS_CPU_CLK_CNTL5,
  723. .mask = 0x1,
  724. .shift = 2,
  725. },
  726. .hw.init = &(struct clk_init_data){
  727. .name = "dsu_clk_dyn0",
  728. .ops = &clk_regmap_mux_ro_ops,
  729. .parent_hws = (const struct clk_hw *[]) {
  730. &sm1_dsu_clk_premux0.hw,
  731. &sm1_dsu_clk_mux0_div.hw,
  732. },
  733. .num_parents = 2,
  734. },
  735. };
  736. /* Datasheet names this field as "Mux1_divn_tcnt" */
  737. static struct clk_regmap sm1_dsu_clk_mux1_div = {
  738. .data = &(struct clk_regmap_div_data){
  739. .offset = HHI_SYS_CPU_CLK_CNTL5,
  740. .shift = 20,
  741. .width = 6,
  742. },
  743. .hw.init = &(struct clk_init_data){
  744. .name = "dsu_clk_dyn1_div",
  745. .ops = &clk_regmap_divider_ro_ops,
  746. .parent_hws = (const struct clk_hw *[]) {
  747. &sm1_dsu_clk_premux1.hw
  748. },
  749. .num_parents = 1,
  750. },
  751. };
  752. /* Datasheet names this field as "postmux1" */
  753. static struct clk_regmap sm1_dsu_clk_postmux1 = {
  754. .data = &(struct clk_regmap_mux_data){
  755. .offset = HHI_SYS_CPU_CLK_CNTL5,
  756. .mask = 0x1,
  757. .shift = 18,
  758. },
  759. .hw.init = &(struct clk_init_data){
  760. .name = "dsu_clk_dyn1",
  761. .ops = &clk_regmap_mux_ro_ops,
  762. .parent_hws = (const struct clk_hw *[]) {
  763. &sm1_dsu_clk_premux1.hw,
  764. &sm1_dsu_clk_mux1_div.hw,
  765. },
  766. .num_parents = 2,
  767. },
  768. };
  769. /* Datasheet names this field as "Final_dyn_mux_sel" */
  770. static struct clk_regmap sm1_dsu_clk_dyn = {
  771. .data = &(struct clk_regmap_mux_data){
  772. .offset = HHI_SYS_CPU_CLK_CNTL5,
  773. .mask = 0x1,
  774. .shift = 10,
  775. },
  776. .hw.init = &(struct clk_init_data){
  777. .name = "dsu_clk_dyn",
  778. .ops = &clk_regmap_mux_ro_ops,
  779. .parent_hws = (const struct clk_hw *[]) {
  780. &sm1_dsu_clk_postmux0.hw,
  781. &sm1_dsu_clk_postmux1.hw,
  782. },
  783. .num_parents = 2,
  784. },
  785. };
  786. /* Datasheet names this field as "Final_mux_sel" */
  787. static struct clk_regmap sm1_dsu_final_clk = {
  788. .data = &(struct clk_regmap_mux_data){
  789. .offset = HHI_SYS_CPU_CLK_CNTL5,
  790. .mask = 0x1,
  791. .shift = 11,
  792. },
  793. .hw.init = &(struct clk_init_data){
  794. .name = "dsu_clk_final",
  795. .ops = &clk_regmap_mux_ro_ops,
  796. .parent_hws = (const struct clk_hw *[]) {
  797. &sm1_dsu_clk_dyn.hw,
  798. &g12a_sys_pll.hw,
  799. },
  800. .num_parents = 2,
  801. },
  802. };
  803. /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 0 */
  804. static struct clk_regmap sm1_cpu1_clk = {
  805. .data = &(struct clk_regmap_mux_data){
  806. .offset = HHI_SYS_CPU_CLK_CNTL6,
  807. .mask = 0x1,
  808. .shift = 24,
  809. },
  810. .hw.init = &(struct clk_init_data){
  811. .name = "cpu1_clk",
  812. .ops = &clk_regmap_mux_ro_ops,
  813. .parent_hws = (const struct clk_hw *[]) {
  814. &g12a_cpu_clk.hw,
  815. /* This CPU also have a dedicated clock tree */
  816. },
  817. .num_parents = 1,
  818. },
  819. };
  820. /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 1 */
  821. static struct clk_regmap sm1_cpu2_clk = {
  822. .data = &(struct clk_regmap_mux_data){
  823. .offset = HHI_SYS_CPU_CLK_CNTL6,
  824. .mask = 0x1,
  825. .shift = 25,
  826. },
  827. .hw.init = &(struct clk_init_data){
  828. .name = "cpu2_clk",
  829. .ops = &clk_regmap_mux_ro_ops,
  830. .parent_hws = (const struct clk_hw *[]) {
  831. &g12a_cpu_clk.hw,
  832. /* This CPU also have a dedicated clock tree */
  833. },
  834. .num_parents = 1,
  835. },
  836. };
  837. /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 2 */
  838. static struct clk_regmap sm1_cpu3_clk = {
  839. .data = &(struct clk_regmap_mux_data){
  840. .offset = HHI_SYS_CPU_CLK_CNTL6,
  841. .mask = 0x1,
  842. .shift = 26,
  843. },
  844. .hw.init = &(struct clk_init_data){
  845. .name = "cpu3_clk",
  846. .ops = &clk_regmap_mux_ro_ops,
  847. .parent_hws = (const struct clk_hw *[]) {
  848. &g12a_cpu_clk.hw,
  849. /* This CPU also have a dedicated clock tree */
  850. },
  851. .num_parents = 1,
  852. },
  853. };
  854. /* Datasheet names this field as "Cpu_clk_sync_mux_sel" bit 4 */
  855. static struct clk_regmap sm1_dsu_clk = {
  856. .data = &(struct clk_regmap_mux_data){
  857. .offset = HHI_SYS_CPU_CLK_CNTL6,
  858. .mask = 0x1,
  859. .shift = 27,
  860. },
  861. .hw.init = &(struct clk_init_data){
  862. .name = "dsu_clk",
  863. .ops = &clk_regmap_mux_ro_ops,
  864. .parent_hws = (const struct clk_hw *[]) {
  865. &g12a_cpu_clk.hw,
  866. &sm1_dsu_final_clk.hw,
  867. },
  868. .num_parents = 2,
  869. },
  870. };
  871. static int g12a_cpu_clk_mux_notifier_cb(struct notifier_block *nb,
  872. unsigned long event, void *data)
  873. {
  874. if (event == POST_RATE_CHANGE || event == PRE_RATE_CHANGE) {
  875. /* Wait for clock propagation before/after changing the mux */
  876. udelay(100);
  877. return NOTIFY_OK;
  878. }
  879. return NOTIFY_DONE;
  880. }
  881. static struct notifier_block g12a_cpu_clk_mux_nb = {
  882. .notifier_call = g12a_cpu_clk_mux_notifier_cb,
  883. };
  884. struct g12a_cpu_clk_postmux_nb_data {
  885. struct notifier_block nb;
  886. struct clk_hw *xtal;
  887. struct clk_hw *cpu_clk_dyn;
  888. struct clk_hw *cpu_clk_postmux0;
  889. struct clk_hw *cpu_clk_postmux1;
  890. struct clk_hw *cpu_clk_premux1;
  891. };
  892. static int g12a_cpu_clk_postmux_notifier_cb(struct notifier_block *nb,
  893. unsigned long event, void *data)
  894. {
  895. struct g12a_cpu_clk_postmux_nb_data *nb_data =
  896. container_of(nb, struct g12a_cpu_clk_postmux_nb_data, nb);
  897. switch (event) {
  898. case PRE_RATE_CHANGE:
  899. /*
  900. * This notifier means cpu_clk_postmux0 clock will be changed
  901. * to feed cpu_clk, this is the current path :
  902. * cpu_clk
  903. * \- cpu_clk_dyn
  904. * \- cpu_clk_postmux0
  905. * \- cpu_clk_muxX_div
  906. * \- cpu_clk_premux0
  907. * \- fclk_div3 or fclk_div2
  908. * OR
  909. * \- cpu_clk_premux0
  910. * \- fclk_div3 or fclk_div2
  911. */
  912. /* Setup cpu_clk_premux1 to xtal */
  913. clk_hw_set_parent(nb_data->cpu_clk_premux1,
  914. nb_data->xtal);
  915. /* Setup cpu_clk_postmux1 to bypass divider */
  916. clk_hw_set_parent(nb_data->cpu_clk_postmux1,
  917. nb_data->cpu_clk_premux1);
  918. /* Switch to parking clk on cpu_clk_postmux1 */
  919. clk_hw_set_parent(nb_data->cpu_clk_dyn,
  920. nb_data->cpu_clk_postmux1);
  921. /*
  922. * Now, cpu_clk is 24MHz in the current path :
  923. * cpu_clk
  924. * \- cpu_clk_dyn
  925. * \- cpu_clk_postmux1
  926. * \- cpu_clk_premux1
  927. * \- xtal
  928. */
  929. udelay(100);
  930. return NOTIFY_OK;
  931. case POST_RATE_CHANGE:
  932. /*
  933. * The cpu_clk_postmux0 has ben updated, now switch back
  934. * cpu_clk_dyn to cpu_clk_postmux0 and take the changes
  935. * in account.
  936. */
  937. /* Configure cpu_clk_dyn back to cpu_clk_postmux0 */
  938. clk_hw_set_parent(nb_data->cpu_clk_dyn,
  939. nb_data->cpu_clk_postmux0);
  940. /*
  941. * new path :
  942. * cpu_clk
  943. * \- cpu_clk_dyn
  944. * \- cpu_clk_postmux0
  945. * \- cpu_clk_muxX_div
  946. * \- cpu_clk_premux0
  947. * \- fclk_div3 or fclk_div2
  948. * OR
  949. * \- cpu_clk_premux0
  950. * \- fclk_div3 or fclk_div2
  951. */
  952. udelay(100);
  953. return NOTIFY_OK;
  954. default:
  955. return NOTIFY_DONE;
  956. }
  957. }
  958. static struct g12a_cpu_clk_postmux_nb_data g12a_cpu_clk_postmux0_nb_data = {
  959. .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
  960. .cpu_clk_postmux0 = &g12a_cpu_clk_postmux0.hw,
  961. .cpu_clk_postmux1 = &g12a_cpu_clk_postmux1.hw,
  962. .cpu_clk_premux1 = &g12a_cpu_clk_premux1.hw,
  963. .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
  964. };
  965. static struct g12a_cpu_clk_postmux_nb_data g12b_cpub_clk_postmux0_nb_data = {
  966. .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
  967. .cpu_clk_postmux0 = &g12b_cpub_clk_postmux0.hw,
  968. .cpu_clk_postmux1 = &g12b_cpub_clk_postmux1.hw,
  969. .cpu_clk_premux1 = &g12b_cpub_clk_premux1.hw,
  970. .nb.notifier_call = g12a_cpu_clk_postmux_notifier_cb,
  971. };
  972. struct g12a_sys_pll_nb_data {
  973. struct notifier_block nb;
  974. struct clk_hw *sys_pll;
  975. struct clk_hw *cpu_clk;
  976. struct clk_hw *cpu_clk_dyn;
  977. };
  978. static int g12a_sys_pll_notifier_cb(struct notifier_block *nb,
  979. unsigned long event, void *data)
  980. {
  981. struct g12a_sys_pll_nb_data *nb_data =
  982. container_of(nb, struct g12a_sys_pll_nb_data, nb);
  983. switch (event) {
  984. case PRE_RATE_CHANGE:
  985. /*
  986. * This notifier means sys_pll clock will be changed
  987. * to feed cpu_clk, this the current path :
  988. * cpu_clk
  989. * \- sys_pll
  990. * \- sys_pll_dco
  991. */
  992. /* Configure cpu_clk to use cpu_clk_dyn */
  993. clk_hw_set_parent(nb_data->cpu_clk,
  994. nb_data->cpu_clk_dyn);
  995. /*
  996. * Now, cpu_clk uses the dyn path
  997. * cpu_clk
  998. * \- cpu_clk_dyn
  999. * \- cpu_clk_dynX
  1000. * \- cpu_clk_dynX_sel
  1001. * \- cpu_clk_dynX_div
  1002. * \- xtal/fclk_div2/fclk_div3
  1003. * \- xtal/fclk_div2/fclk_div3
  1004. */
  1005. udelay(100);
  1006. return NOTIFY_OK;
  1007. case POST_RATE_CHANGE:
  1008. /*
  1009. * The sys_pll has ben updated, now switch back cpu_clk to
  1010. * sys_pll
  1011. */
  1012. /* Configure cpu_clk to use sys_pll */
  1013. clk_hw_set_parent(nb_data->cpu_clk,
  1014. nb_data->sys_pll);
  1015. udelay(100);
  1016. /* new path :
  1017. * cpu_clk
  1018. * \- sys_pll
  1019. * \- sys_pll_dco
  1020. */
  1021. return NOTIFY_OK;
  1022. default:
  1023. return NOTIFY_DONE;
  1024. }
  1025. }
  1026. static struct g12a_sys_pll_nb_data g12a_sys_pll_nb_data = {
  1027. .sys_pll = &g12a_sys_pll.hw,
  1028. .cpu_clk = &g12a_cpu_clk.hw,
  1029. .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
  1030. .nb.notifier_call = g12a_sys_pll_notifier_cb,
  1031. };
  1032. /* G12B first CPU cluster uses sys1_pll */
  1033. static struct g12a_sys_pll_nb_data g12b_cpu_clk_sys1_pll_nb_data = {
  1034. .sys_pll = &g12b_sys1_pll.hw,
  1035. .cpu_clk = &g12b_cpu_clk.hw,
  1036. .cpu_clk_dyn = &g12a_cpu_clk_dyn.hw,
  1037. .nb.notifier_call = g12a_sys_pll_notifier_cb,
  1038. };
  1039. /* G12B second CPU cluster uses sys_pll */
  1040. static struct g12a_sys_pll_nb_data g12b_cpub_clk_sys_pll_nb_data = {
  1041. .sys_pll = &g12a_sys_pll.hw,
  1042. .cpu_clk = &g12b_cpub_clk.hw,
  1043. .cpu_clk_dyn = &g12b_cpub_clk_dyn.hw,
  1044. .nb.notifier_call = g12a_sys_pll_notifier_cb,
  1045. };
  1046. static struct clk_regmap g12a_cpu_clk_div16_en = {
  1047. .data = &(struct clk_regmap_gate_data){
  1048. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1049. .bit_idx = 1,
  1050. },
  1051. .hw.init = &(struct clk_init_data) {
  1052. .name = "cpu_clk_div16_en",
  1053. .ops = &clk_regmap_gate_ro_ops,
  1054. .parent_hws = (const struct clk_hw *[]) {
  1055. &g12a_cpu_clk.hw
  1056. },
  1057. .num_parents = 1,
  1058. /*
  1059. * This clock is used to debug the cpu_clk range
  1060. * Linux should not change it at runtime
  1061. */
  1062. },
  1063. };
  1064. static struct clk_regmap g12b_cpub_clk_div16_en = {
  1065. .data = &(struct clk_regmap_gate_data){
  1066. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1067. .bit_idx = 1,
  1068. },
  1069. .hw.init = &(struct clk_init_data) {
  1070. .name = "cpub_clk_div16_en",
  1071. .ops = &clk_regmap_gate_ro_ops,
  1072. .parent_hws = (const struct clk_hw *[]) {
  1073. &g12b_cpub_clk.hw
  1074. },
  1075. .num_parents = 1,
  1076. /*
  1077. * This clock is used to debug the cpu_clk range
  1078. * Linux should not change it at runtime
  1079. */
  1080. },
  1081. };
  1082. static struct clk_fixed_factor g12a_cpu_clk_div16 = {
  1083. .mult = 1,
  1084. .div = 16,
  1085. .hw.init = &(struct clk_init_data){
  1086. .name = "cpu_clk_div16",
  1087. .ops = &clk_fixed_factor_ops,
  1088. .parent_hws = (const struct clk_hw *[]) {
  1089. &g12a_cpu_clk_div16_en.hw
  1090. },
  1091. .num_parents = 1,
  1092. },
  1093. };
  1094. static struct clk_fixed_factor g12b_cpub_clk_div16 = {
  1095. .mult = 1,
  1096. .div = 16,
  1097. .hw.init = &(struct clk_init_data){
  1098. .name = "cpub_clk_div16",
  1099. .ops = &clk_fixed_factor_ops,
  1100. .parent_hws = (const struct clk_hw *[]) {
  1101. &g12b_cpub_clk_div16_en.hw
  1102. },
  1103. .num_parents = 1,
  1104. },
  1105. };
  1106. static struct clk_regmap g12a_cpu_clk_apb_div = {
  1107. .data = &(struct clk_regmap_div_data){
  1108. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1109. .shift = 3,
  1110. .width = 3,
  1111. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1112. },
  1113. .hw.init = &(struct clk_init_data){
  1114. .name = "cpu_clk_apb_div",
  1115. .ops = &clk_regmap_divider_ro_ops,
  1116. .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
  1117. .num_parents = 1,
  1118. },
  1119. };
  1120. static struct clk_regmap g12a_cpu_clk_apb = {
  1121. .data = &(struct clk_regmap_gate_data){
  1122. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1123. .bit_idx = 1,
  1124. },
  1125. .hw.init = &(struct clk_init_data) {
  1126. .name = "cpu_clk_apb",
  1127. .ops = &clk_regmap_gate_ro_ops,
  1128. .parent_hws = (const struct clk_hw *[]) {
  1129. &g12a_cpu_clk_apb_div.hw
  1130. },
  1131. .num_parents = 1,
  1132. /*
  1133. * This clock is set by the ROM monitor code,
  1134. * Linux should not change it at runtime
  1135. */
  1136. },
  1137. };
  1138. static struct clk_regmap g12a_cpu_clk_atb_div = {
  1139. .data = &(struct clk_regmap_div_data){
  1140. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1141. .shift = 6,
  1142. .width = 3,
  1143. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1144. },
  1145. .hw.init = &(struct clk_init_data){
  1146. .name = "cpu_clk_atb_div",
  1147. .ops = &clk_regmap_divider_ro_ops,
  1148. .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
  1149. .num_parents = 1,
  1150. },
  1151. };
  1152. static struct clk_regmap g12a_cpu_clk_atb = {
  1153. .data = &(struct clk_regmap_gate_data){
  1154. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1155. .bit_idx = 17,
  1156. },
  1157. .hw.init = &(struct clk_init_data) {
  1158. .name = "cpu_clk_atb",
  1159. .ops = &clk_regmap_gate_ro_ops,
  1160. .parent_hws = (const struct clk_hw *[]) {
  1161. &g12a_cpu_clk_atb_div.hw
  1162. },
  1163. .num_parents = 1,
  1164. /*
  1165. * This clock is set by the ROM monitor code,
  1166. * Linux should not change it at runtime
  1167. */
  1168. },
  1169. };
  1170. static struct clk_regmap g12a_cpu_clk_axi_div = {
  1171. .data = &(struct clk_regmap_div_data){
  1172. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1173. .shift = 9,
  1174. .width = 3,
  1175. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1176. },
  1177. .hw.init = &(struct clk_init_data){
  1178. .name = "cpu_clk_axi_div",
  1179. .ops = &clk_regmap_divider_ro_ops,
  1180. .parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
  1181. .num_parents = 1,
  1182. },
  1183. };
  1184. static struct clk_regmap g12a_cpu_clk_axi = {
  1185. .data = &(struct clk_regmap_gate_data){
  1186. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1187. .bit_idx = 18,
  1188. },
  1189. .hw.init = &(struct clk_init_data) {
  1190. .name = "cpu_clk_axi",
  1191. .ops = &clk_regmap_gate_ro_ops,
  1192. .parent_hws = (const struct clk_hw *[]) {
  1193. &g12a_cpu_clk_axi_div.hw
  1194. },
  1195. .num_parents = 1,
  1196. /*
  1197. * This clock is set by the ROM monitor code,
  1198. * Linux should not change it at runtime
  1199. */
  1200. },
  1201. };
  1202. static struct clk_regmap g12a_cpu_clk_trace_div = {
  1203. .data = &(struct clk_regmap_div_data){
  1204. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1205. .shift = 20,
  1206. .width = 3,
  1207. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1208. },
  1209. .hw.init = &(struct clk_init_data){
  1210. .name = "cpu_clk_trace_div",
  1211. .ops = &clk_regmap_divider_ro_ops,
  1212. .parent_data = &(const struct clk_parent_data) {
  1213. /*
  1214. * Note:
  1215. * G12A and G12B have different cpu_clks (with
  1216. * different struct clk_hw). We fallback to the global
  1217. * naming string mechanism so cpu_clk_trace_div picks
  1218. * up the appropriate one.
  1219. */
  1220. .name = "cpu_clk",
  1221. .index = -1,
  1222. },
  1223. .num_parents = 1,
  1224. },
  1225. };
  1226. static struct clk_regmap g12a_cpu_clk_trace = {
  1227. .data = &(struct clk_regmap_gate_data){
  1228. .offset = HHI_SYS_CPU_CLK_CNTL1,
  1229. .bit_idx = 23,
  1230. },
  1231. .hw.init = &(struct clk_init_data) {
  1232. .name = "cpu_clk_trace",
  1233. .ops = &clk_regmap_gate_ro_ops,
  1234. .parent_hws = (const struct clk_hw *[]) {
  1235. &g12a_cpu_clk_trace_div.hw
  1236. },
  1237. .num_parents = 1,
  1238. /*
  1239. * This clock is set by the ROM monitor code,
  1240. * Linux should not change it at runtime
  1241. */
  1242. },
  1243. };
  1244. static struct clk_fixed_factor g12b_cpub_clk_div2 = {
  1245. .mult = 1,
  1246. .div = 2,
  1247. .hw.init = &(struct clk_init_data){
  1248. .name = "cpub_clk_div2",
  1249. .ops = &clk_fixed_factor_ops,
  1250. .parent_hws = (const struct clk_hw *[]) {
  1251. &g12b_cpub_clk.hw
  1252. },
  1253. .num_parents = 1,
  1254. },
  1255. };
  1256. static struct clk_fixed_factor g12b_cpub_clk_div3 = {
  1257. .mult = 1,
  1258. .div = 3,
  1259. .hw.init = &(struct clk_init_data){
  1260. .name = "cpub_clk_div3",
  1261. .ops = &clk_fixed_factor_ops,
  1262. .parent_hws = (const struct clk_hw *[]) {
  1263. &g12b_cpub_clk.hw
  1264. },
  1265. .num_parents = 1,
  1266. },
  1267. };
  1268. static struct clk_fixed_factor g12b_cpub_clk_div4 = {
  1269. .mult = 1,
  1270. .div = 4,
  1271. .hw.init = &(struct clk_init_data){
  1272. .name = "cpub_clk_div4",
  1273. .ops = &clk_fixed_factor_ops,
  1274. .parent_hws = (const struct clk_hw *[]) {
  1275. &g12b_cpub_clk.hw
  1276. },
  1277. .num_parents = 1,
  1278. },
  1279. };
  1280. static struct clk_fixed_factor g12b_cpub_clk_div5 = {
  1281. .mult = 1,
  1282. .div = 5,
  1283. .hw.init = &(struct clk_init_data){
  1284. .name = "cpub_clk_div5",
  1285. .ops = &clk_fixed_factor_ops,
  1286. .parent_hws = (const struct clk_hw *[]) {
  1287. &g12b_cpub_clk.hw
  1288. },
  1289. .num_parents = 1,
  1290. },
  1291. };
  1292. static struct clk_fixed_factor g12b_cpub_clk_div6 = {
  1293. .mult = 1,
  1294. .div = 6,
  1295. .hw.init = &(struct clk_init_data){
  1296. .name = "cpub_clk_div6",
  1297. .ops = &clk_fixed_factor_ops,
  1298. .parent_hws = (const struct clk_hw *[]) {
  1299. &g12b_cpub_clk.hw
  1300. },
  1301. .num_parents = 1,
  1302. },
  1303. };
  1304. static struct clk_fixed_factor g12b_cpub_clk_div7 = {
  1305. .mult = 1,
  1306. .div = 7,
  1307. .hw.init = &(struct clk_init_data){
  1308. .name = "cpub_clk_div7",
  1309. .ops = &clk_fixed_factor_ops,
  1310. .parent_hws = (const struct clk_hw *[]) {
  1311. &g12b_cpub_clk.hw
  1312. },
  1313. .num_parents = 1,
  1314. },
  1315. };
  1316. static struct clk_fixed_factor g12b_cpub_clk_div8 = {
  1317. .mult = 1,
  1318. .div = 8,
  1319. .hw.init = &(struct clk_init_data){
  1320. .name = "cpub_clk_div8",
  1321. .ops = &clk_fixed_factor_ops,
  1322. .parent_hws = (const struct clk_hw *[]) {
  1323. &g12b_cpub_clk.hw
  1324. },
  1325. .num_parents = 1,
  1326. },
  1327. };
  1328. static u32 mux_table_cpub[] = { 1, 2, 3, 4, 5, 6, 7 };
  1329. static struct clk_regmap g12b_cpub_clk_apb_sel = {
  1330. .data = &(struct clk_regmap_mux_data){
  1331. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1332. .mask = 7,
  1333. .shift = 3,
  1334. .table = mux_table_cpub,
  1335. },
  1336. .hw.init = &(struct clk_init_data){
  1337. .name = "cpub_clk_apb_sel",
  1338. .ops = &clk_regmap_mux_ro_ops,
  1339. .parent_hws = (const struct clk_hw *[]) {
  1340. &g12b_cpub_clk_div2.hw,
  1341. &g12b_cpub_clk_div3.hw,
  1342. &g12b_cpub_clk_div4.hw,
  1343. &g12b_cpub_clk_div5.hw,
  1344. &g12b_cpub_clk_div6.hw,
  1345. &g12b_cpub_clk_div7.hw,
  1346. &g12b_cpub_clk_div8.hw
  1347. },
  1348. .num_parents = 7,
  1349. },
  1350. };
  1351. static struct clk_regmap g12b_cpub_clk_apb = {
  1352. .data = &(struct clk_regmap_gate_data){
  1353. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1354. .bit_idx = 16,
  1355. .flags = CLK_GATE_SET_TO_DISABLE,
  1356. },
  1357. .hw.init = &(struct clk_init_data) {
  1358. .name = "cpub_clk_apb",
  1359. .ops = &clk_regmap_gate_ro_ops,
  1360. .parent_hws = (const struct clk_hw *[]) {
  1361. &g12b_cpub_clk_apb_sel.hw
  1362. },
  1363. .num_parents = 1,
  1364. /*
  1365. * This clock is set by the ROM monitor code,
  1366. * Linux should not change it at runtime
  1367. */
  1368. },
  1369. };
  1370. static struct clk_regmap g12b_cpub_clk_atb_sel = {
  1371. .data = &(struct clk_regmap_mux_data){
  1372. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1373. .mask = 7,
  1374. .shift = 6,
  1375. .table = mux_table_cpub,
  1376. },
  1377. .hw.init = &(struct clk_init_data){
  1378. .name = "cpub_clk_atb_sel",
  1379. .ops = &clk_regmap_mux_ro_ops,
  1380. .parent_hws = (const struct clk_hw *[]) {
  1381. &g12b_cpub_clk_div2.hw,
  1382. &g12b_cpub_clk_div3.hw,
  1383. &g12b_cpub_clk_div4.hw,
  1384. &g12b_cpub_clk_div5.hw,
  1385. &g12b_cpub_clk_div6.hw,
  1386. &g12b_cpub_clk_div7.hw,
  1387. &g12b_cpub_clk_div8.hw
  1388. },
  1389. .num_parents = 7,
  1390. },
  1391. };
  1392. static struct clk_regmap g12b_cpub_clk_atb = {
  1393. .data = &(struct clk_regmap_gate_data){
  1394. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1395. .bit_idx = 17,
  1396. .flags = CLK_GATE_SET_TO_DISABLE,
  1397. },
  1398. .hw.init = &(struct clk_init_data) {
  1399. .name = "cpub_clk_atb",
  1400. .ops = &clk_regmap_gate_ro_ops,
  1401. .parent_hws = (const struct clk_hw *[]) {
  1402. &g12b_cpub_clk_atb_sel.hw
  1403. },
  1404. .num_parents = 1,
  1405. /*
  1406. * This clock is set by the ROM monitor code,
  1407. * Linux should not change it at runtime
  1408. */
  1409. },
  1410. };
  1411. static struct clk_regmap g12b_cpub_clk_axi_sel = {
  1412. .data = &(struct clk_regmap_mux_data){
  1413. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1414. .mask = 7,
  1415. .shift = 9,
  1416. .table = mux_table_cpub,
  1417. },
  1418. .hw.init = &(struct clk_init_data){
  1419. .name = "cpub_clk_axi_sel",
  1420. .ops = &clk_regmap_mux_ro_ops,
  1421. .parent_hws = (const struct clk_hw *[]) {
  1422. &g12b_cpub_clk_div2.hw,
  1423. &g12b_cpub_clk_div3.hw,
  1424. &g12b_cpub_clk_div4.hw,
  1425. &g12b_cpub_clk_div5.hw,
  1426. &g12b_cpub_clk_div6.hw,
  1427. &g12b_cpub_clk_div7.hw,
  1428. &g12b_cpub_clk_div8.hw
  1429. },
  1430. .num_parents = 7,
  1431. },
  1432. };
  1433. static struct clk_regmap g12b_cpub_clk_axi = {
  1434. .data = &(struct clk_regmap_gate_data){
  1435. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1436. .bit_idx = 18,
  1437. .flags = CLK_GATE_SET_TO_DISABLE,
  1438. },
  1439. .hw.init = &(struct clk_init_data) {
  1440. .name = "cpub_clk_axi",
  1441. .ops = &clk_regmap_gate_ro_ops,
  1442. .parent_hws = (const struct clk_hw *[]) {
  1443. &g12b_cpub_clk_axi_sel.hw
  1444. },
  1445. .num_parents = 1,
  1446. /*
  1447. * This clock is set by the ROM monitor code,
  1448. * Linux should not change it at runtime
  1449. */
  1450. },
  1451. };
  1452. static struct clk_regmap g12b_cpub_clk_trace_sel = {
  1453. .data = &(struct clk_regmap_mux_data){
  1454. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1455. .mask = 7,
  1456. .shift = 20,
  1457. .table = mux_table_cpub,
  1458. },
  1459. .hw.init = &(struct clk_init_data){
  1460. .name = "cpub_clk_trace_sel",
  1461. .ops = &clk_regmap_mux_ro_ops,
  1462. .parent_hws = (const struct clk_hw *[]) {
  1463. &g12b_cpub_clk_div2.hw,
  1464. &g12b_cpub_clk_div3.hw,
  1465. &g12b_cpub_clk_div4.hw,
  1466. &g12b_cpub_clk_div5.hw,
  1467. &g12b_cpub_clk_div6.hw,
  1468. &g12b_cpub_clk_div7.hw,
  1469. &g12b_cpub_clk_div8.hw
  1470. },
  1471. .num_parents = 7,
  1472. },
  1473. };
  1474. static struct clk_regmap g12b_cpub_clk_trace = {
  1475. .data = &(struct clk_regmap_gate_data){
  1476. .offset = HHI_SYS_CPUB_CLK_CNTL1,
  1477. .bit_idx = 23,
  1478. .flags = CLK_GATE_SET_TO_DISABLE,
  1479. },
  1480. .hw.init = &(struct clk_init_data) {
  1481. .name = "cpub_clk_trace",
  1482. .ops = &clk_regmap_gate_ro_ops,
  1483. .parent_hws = (const struct clk_hw *[]) {
  1484. &g12b_cpub_clk_trace_sel.hw
  1485. },
  1486. .num_parents = 1,
  1487. /*
  1488. * This clock is set by the ROM monitor code,
  1489. * Linux should not change it at runtime
  1490. */
  1491. },
  1492. };
  1493. static const struct pll_mult_range g12a_gp0_pll_mult_range = {
  1494. .min = 125,
  1495. .max = 255,
  1496. };
  1497. /*
  1498. * Internal gp0 pll emulation configuration parameters
  1499. */
  1500. static const struct reg_sequence g12a_gp0_init_regs[] = {
  1501. { .reg = HHI_GP0_PLL_CNTL1, .def = 0x00000000 },
  1502. { .reg = HHI_GP0_PLL_CNTL2, .def = 0x00000000 },
  1503. { .reg = HHI_GP0_PLL_CNTL3, .def = 0x48681c00 },
  1504. { .reg = HHI_GP0_PLL_CNTL4, .def = 0x33771290 },
  1505. { .reg = HHI_GP0_PLL_CNTL5, .def = 0x39272000 },
  1506. { .reg = HHI_GP0_PLL_CNTL6, .def = 0x56540000 },
  1507. };
  1508. static struct clk_regmap g12a_gp0_pll_dco = {
  1509. .data = &(struct meson_clk_pll_data){
  1510. .en = {
  1511. .reg_off = HHI_GP0_PLL_CNTL0,
  1512. .shift = 28,
  1513. .width = 1,
  1514. },
  1515. .m = {
  1516. .reg_off = HHI_GP0_PLL_CNTL0,
  1517. .shift = 0,
  1518. .width = 8,
  1519. },
  1520. .n = {
  1521. .reg_off = HHI_GP0_PLL_CNTL0,
  1522. .shift = 10,
  1523. .width = 5,
  1524. },
  1525. .frac = {
  1526. .reg_off = HHI_GP0_PLL_CNTL1,
  1527. .shift = 0,
  1528. .width = 17,
  1529. },
  1530. .l = {
  1531. .reg_off = HHI_GP0_PLL_CNTL0,
  1532. .shift = 31,
  1533. .width = 1,
  1534. },
  1535. .rst = {
  1536. .reg_off = HHI_GP0_PLL_CNTL0,
  1537. .shift = 29,
  1538. .width = 1,
  1539. },
  1540. .range = &g12a_gp0_pll_mult_range,
  1541. .init_regs = g12a_gp0_init_regs,
  1542. .init_count = ARRAY_SIZE(g12a_gp0_init_regs),
  1543. },
  1544. .hw.init = &(struct clk_init_data){
  1545. .name = "gp0_pll_dco",
  1546. .ops = &meson_clk_pll_ops,
  1547. .parent_data = &(const struct clk_parent_data) {
  1548. .fw_name = "xtal",
  1549. },
  1550. .num_parents = 1,
  1551. },
  1552. };
  1553. static struct clk_regmap g12a_gp0_pll = {
  1554. .data = &(struct clk_regmap_div_data){
  1555. .offset = HHI_GP0_PLL_CNTL0,
  1556. .shift = 16,
  1557. .width = 3,
  1558. .flags = (CLK_DIVIDER_POWER_OF_TWO |
  1559. CLK_DIVIDER_ROUND_CLOSEST),
  1560. },
  1561. .hw.init = &(struct clk_init_data){
  1562. .name = "gp0_pll",
  1563. .ops = &clk_regmap_divider_ops,
  1564. .parent_hws = (const struct clk_hw *[]) {
  1565. &g12a_gp0_pll_dco.hw
  1566. },
  1567. .num_parents = 1,
  1568. .flags = CLK_SET_RATE_PARENT,
  1569. },
  1570. };
  1571. static struct clk_regmap sm1_gp1_pll_dco = {
  1572. .data = &(struct meson_clk_pll_data){
  1573. .en = {
  1574. .reg_off = HHI_GP1_PLL_CNTL0,
  1575. .shift = 28,
  1576. .width = 1,
  1577. },
  1578. .m = {
  1579. .reg_off = HHI_GP1_PLL_CNTL0,
  1580. .shift = 0,
  1581. .width = 8,
  1582. },
  1583. .n = {
  1584. .reg_off = HHI_GP1_PLL_CNTL0,
  1585. .shift = 10,
  1586. .width = 5,
  1587. },
  1588. .frac = {
  1589. .reg_off = HHI_GP1_PLL_CNTL1,
  1590. .shift = 0,
  1591. .width = 17,
  1592. },
  1593. .l = {
  1594. .reg_off = HHI_GP1_PLL_CNTL0,
  1595. .shift = 31,
  1596. .width = 1,
  1597. },
  1598. .rst = {
  1599. .reg_off = HHI_GP1_PLL_CNTL0,
  1600. .shift = 29,
  1601. .width = 1,
  1602. },
  1603. },
  1604. .hw.init = &(struct clk_init_data){
  1605. .name = "gp1_pll_dco",
  1606. .ops = &meson_clk_pll_ro_ops,
  1607. .parent_data = &(const struct clk_parent_data) {
  1608. .fw_name = "xtal",
  1609. },
  1610. .num_parents = 1,
  1611. /* This clock feeds the DSU, avoid disabling it */
  1612. .flags = CLK_IS_CRITICAL,
  1613. },
  1614. };
  1615. static struct clk_regmap sm1_gp1_pll = {
  1616. .data = &(struct clk_regmap_div_data){
  1617. .offset = HHI_GP1_PLL_CNTL0,
  1618. .shift = 16,
  1619. .width = 3,
  1620. .flags = (CLK_DIVIDER_POWER_OF_TWO |
  1621. CLK_DIVIDER_ROUND_CLOSEST),
  1622. },
  1623. .hw.init = &(struct clk_init_data){
  1624. .name = "gp1_pll",
  1625. .ops = &clk_regmap_divider_ro_ops,
  1626. .parent_hws = (const struct clk_hw *[]) {
  1627. &sm1_gp1_pll_dco.hw
  1628. },
  1629. .num_parents = 1,
  1630. },
  1631. };
  1632. /*
  1633. * Internal hifi pll emulation configuration parameters
  1634. */
  1635. static const struct reg_sequence g12a_hifi_init_regs[] = {
  1636. { .reg = HHI_HIFI_PLL_CNTL1, .def = 0x00000000 },
  1637. { .reg = HHI_HIFI_PLL_CNTL2, .def = 0x00000000 },
  1638. { .reg = HHI_HIFI_PLL_CNTL3, .def = 0x6a285c00 },
  1639. { .reg = HHI_HIFI_PLL_CNTL4, .def = 0x65771290 },
  1640. { .reg = HHI_HIFI_PLL_CNTL5, .def = 0x39272000 },
  1641. { .reg = HHI_HIFI_PLL_CNTL6, .def = 0x56540000 },
  1642. };
  1643. static struct clk_regmap g12a_hifi_pll_dco = {
  1644. .data = &(struct meson_clk_pll_data){
  1645. .en = {
  1646. .reg_off = HHI_HIFI_PLL_CNTL0,
  1647. .shift = 28,
  1648. .width = 1,
  1649. },
  1650. .m = {
  1651. .reg_off = HHI_HIFI_PLL_CNTL0,
  1652. .shift = 0,
  1653. .width = 8,
  1654. },
  1655. .n = {
  1656. .reg_off = HHI_HIFI_PLL_CNTL0,
  1657. .shift = 10,
  1658. .width = 5,
  1659. },
  1660. .frac = {
  1661. .reg_off = HHI_HIFI_PLL_CNTL1,
  1662. .shift = 0,
  1663. .width = 17,
  1664. },
  1665. .l = {
  1666. .reg_off = HHI_HIFI_PLL_CNTL0,
  1667. .shift = 31,
  1668. .width = 1,
  1669. },
  1670. .rst = {
  1671. .reg_off = HHI_HIFI_PLL_CNTL0,
  1672. .shift = 29,
  1673. .width = 1,
  1674. },
  1675. .range = &g12a_gp0_pll_mult_range,
  1676. .init_regs = g12a_hifi_init_regs,
  1677. .init_count = ARRAY_SIZE(g12a_hifi_init_regs),
  1678. .flags = CLK_MESON_PLL_ROUND_CLOSEST,
  1679. },
  1680. .hw.init = &(struct clk_init_data){
  1681. .name = "hifi_pll_dco",
  1682. .ops = &meson_clk_pll_ops,
  1683. .parent_data = &(const struct clk_parent_data) {
  1684. .fw_name = "xtal",
  1685. },
  1686. .num_parents = 1,
  1687. },
  1688. };
  1689. static struct clk_regmap g12a_hifi_pll = {
  1690. .data = &(struct clk_regmap_div_data){
  1691. .offset = HHI_HIFI_PLL_CNTL0,
  1692. .shift = 16,
  1693. .width = 2,
  1694. .flags = (CLK_DIVIDER_POWER_OF_TWO |
  1695. CLK_DIVIDER_ROUND_CLOSEST),
  1696. },
  1697. .hw.init = &(struct clk_init_data){
  1698. .name = "hifi_pll",
  1699. .ops = &clk_regmap_divider_ops,
  1700. .parent_hws = (const struct clk_hw *[]) {
  1701. &g12a_hifi_pll_dco.hw
  1702. },
  1703. .num_parents = 1,
  1704. .flags = CLK_SET_RATE_PARENT,
  1705. },
  1706. };
  1707. /*
  1708. * The Meson G12A PCIE PLL is fined tuned to deliver a very precise
  1709. * 100MHz reference clock for the PCIe Analog PHY, and thus requires
  1710. * a strict register sequence to enable the PLL.
  1711. */
  1712. static const struct reg_sequence g12a_pcie_pll_init_regs[] = {
  1713. { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x20090496 },
  1714. { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x30090496 },
  1715. { .reg = HHI_PCIE_PLL_CNTL1, .def = 0x00000000 },
  1716. { .reg = HHI_PCIE_PLL_CNTL2, .def = 0x00001100 },
  1717. { .reg = HHI_PCIE_PLL_CNTL3, .def = 0x10058e00 },
  1718. { .reg = HHI_PCIE_PLL_CNTL4, .def = 0x000100c0 },
  1719. { .reg = HHI_PCIE_PLL_CNTL5, .def = 0x68000048 },
  1720. { .reg = HHI_PCIE_PLL_CNTL5, .def = 0x68000068, .delay_us = 20 },
  1721. { .reg = HHI_PCIE_PLL_CNTL4, .def = 0x008100c0, .delay_us = 10 },
  1722. { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x34090496 },
  1723. { .reg = HHI_PCIE_PLL_CNTL0, .def = 0x14090496, .delay_us = 10 },
  1724. { .reg = HHI_PCIE_PLL_CNTL2, .def = 0x00001000 },
  1725. };
  1726. /* Keep a single entry table for recalc/round_rate() ops */
  1727. static const struct pll_params_table g12a_pcie_pll_table[] = {
  1728. PLL_PARAMS(150, 1),
  1729. {0, 0},
  1730. };
  1731. static struct clk_regmap g12a_pcie_pll_dco = {
  1732. .data = &(struct meson_clk_pll_data){
  1733. .en = {
  1734. .reg_off = HHI_PCIE_PLL_CNTL0,
  1735. .shift = 28,
  1736. .width = 1,
  1737. },
  1738. .m = {
  1739. .reg_off = HHI_PCIE_PLL_CNTL0,
  1740. .shift = 0,
  1741. .width = 8,
  1742. },
  1743. .n = {
  1744. .reg_off = HHI_PCIE_PLL_CNTL0,
  1745. .shift = 10,
  1746. .width = 5,
  1747. },
  1748. .frac = {
  1749. .reg_off = HHI_PCIE_PLL_CNTL1,
  1750. .shift = 0,
  1751. .width = 12,
  1752. },
  1753. .l = {
  1754. .reg_off = HHI_PCIE_PLL_CNTL0,
  1755. .shift = 31,
  1756. .width = 1,
  1757. },
  1758. .rst = {
  1759. .reg_off = HHI_PCIE_PLL_CNTL0,
  1760. .shift = 29,
  1761. .width = 1,
  1762. },
  1763. .table = g12a_pcie_pll_table,
  1764. .init_regs = g12a_pcie_pll_init_regs,
  1765. .init_count = ARRAY_SIZE(g12a_pcie_pll_init_regs),
  1766. },
  1767. .hw.init = &(struct clk_init_data){
  1768. .name = "pcie_pll_dco",
  1769. .ops = &meson_clk_pcie_pll_ops,
  1770. .parent_data = &(const struct clk_parent_data) {
  1771. .fw_name = "xtal",
  1772. },
  1773. .num_parents = 1,
  1774. },
  1775. };
  1776. static struct clk_fixed_factor g12a_pcie_pll_dco_div2 = {
  1777. .mult = 1,
  1778. .div = 2,
  1779. .hw.init = &(struct clk_init_data){
  1780. .name = "pcie_pll_dco_div2",
  1781. .ops = &clk_fixed_factor_ops,
  1782. .parent_hws = (const struct clk_hw *[]) {
  1783. &g12a_pcie_pll_dco.hw
  1784. },
  1785. .num_parents = 1,
  1786. .flags = CLK_SET_RATE_PARENT,
  1787. },
  1788. };
  1789. static struct clk_regmap g12a_pcie_pll_od = {
  1790. .data = &(struct clk_regmap_div_data){
  1791. .offset = HHI_PCIE_PLL_CNTL0,
  1792. .shift = 16,
  1793. .width = 5,
  1794. .flags = CLK_DIVIDER_ROUND_CLOSEST |
  1795. CLK_DIVIDER_ONE_BASED |
  1796. CLK_DIVIDER_ALLOW_ZERO,
  1797. },
  1798. .hw.init = &(struct clk_init_data){
  1799. .name = "pcie_pll_od",
  1800. .ops = &clk_regmap_divider_ops,
  1801. .parent_hws = (const struct clk_hw *[]) {
  1802. &g12a_pcie_pll_dco_div2.hw
  1803. },
  1804. .num_parents = 1,
  1805. .flags = CLK_SET_RATE_PARENT,
  1806. },
  1807. };
  1808. static struct clk_fixed_factor g12a_pcie_pll = {
  1809. .mult = 1,
  1810. .div = 2,
  1811. .hw.init = &(struct clk_init_data){
  1812. .name = "pcie_pll_pll",
  1813. .ops = &clk_fixed_factor_ops,
  1814. .parent_hws = (const struct clk_hw *[]) {
  1815. &g12a_pcie_pll_od.hw
  1816. },
  1817. .num_parents = 1,
  1818. .flags = CLK_SET_RATE_PARENT,
  1819. },
  1820. };
  1821. static struct clk_regmap g12a_hdmi_pll_dco = {
  1822. .data = &(struct meson_clk_pll_data){
  1823. .en = {
  1824. .reg_off = HHI_HDMI_PLL_CNTL0,
  1825. .shift = 28,
  1826. .width = 1,
  1827. },
  1828. .m = {
  1829. .reg_off = HHI_HDMI_PLL_CNTL0,
  1830. .shift = 0,
  1831. .width = 8,
  1832. },
  1833. .n = {
  1834. .reg_off = HHI_HDMI_PLL_CNTL0,
  1835. .shift = 10,
  1836. .width = 5,
  1837. },
  1838. .frac = {
  1839. .reg_off = HHI_HDMI_PLL_CNTL1,
  1840. .shift = 0,
  1841. .width = 16,
  1842. },
  1843. .l = {
  1844. .reg_off = HHI_HDMI_PLL_CNTL0,
  1845. .shift = 30,
  1846. .width = 1,
  1847. },
  1848. .rst = {
  1849. .reg_off = HHI_HDMI_PLL_CNTL0,
  1850. .shift = 29,
  1851. .width = 1,
  1852. },
  1853. },
  1854. .hw.init = &(struct clk_init_data){
  1855. .name = "hdmi_pll_dco",
  1856. .ops = &meson_clk_pll_ro_ops,
  1857. .parent_data = &(const struct clk_parent_data) {
  1858. .fw_name = "xtal",
  1859. },
  1860. .num_parents = 1,
  1861. /*
  1862. * Display directly handle hdmi pll registers ATM, we need
  1863. * NOCACHE to keep our view of the clock as accurate as possible
  1864. */
  1865. .flags = CLK_GET_RATE_NOCACHE,
  1866. },
  1867. };
  1868. static struct clk_regmap g12a_hdmi_pll_od = {
  1869. .data = &(struct clk_regmap_div_data){
  1870. .offset = HHI_HDMI_PLL_CNTL0,
  1871. .shift = 16,
  1872. .width = 2,
  1873. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1874. },
  1875. .hw.init = &(struct clk_init_data){
  1876. .name = "hdmi_pll_od",
  1877. .ops = &clk_regmap_divider_ro_ops,
  1878. .parent_hws = (const struct clk_hw *[]) {
  1879. &g12a_hdmi_pll_dco.hw
  1880. },
  1881. .num_parents = 1,
  1882. .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
  1883. },
  1884. };
  1885. static struct clk_regmap g12a_hdmi_pll_od2 = {
  1886. .data = &(struct clk_regmap_div_data){
  1887. .offset = HHI_HDMI_PLL_CNTL0,
  1888. .shift = 18,
  1889. .width = 2,
  1890. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1891. },
  1892. .hw.init = &(struct clk_init_data){
  1893. .name = "hdmi_pll_od2",
  1894. .ops = &clk_regmap_divider_ro_ops,
  1895. .parent_hws = (const struct clk_hw *[]) {
  1896. &g12a_hdmi_pll_od.hw
  1897. },
  1898. .num_parents = 1,
  1899. .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
  1900. },
  1901. };
  1902. static struct clk_regmap g12a_hdmi_pll = {
  1903. .data = &(struct clk_regmap_div_data){
  1904. .offset = HHI_HDMI_PLL_CNTL0,
  1905. .shift = 20,
  1906. .width = 2,
  1907. .flags = CLK_DIVIDER_POWER_OF_TWO,
  1908. },
  1909. .hw.init = &(struct clk_init_data){
  1910. .name = "hdmi_pll",
  1911. .ops = &clk_regmap_divider_ro_ops,
  1912. .parent_hws = (const struct clk_hw *[]) {
  1913. &g12a_hdmi_pll_od2.hw
  1914. },
  1915. .num_parents = 1,
  1916. .flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_PARENT,
  1917. },
  1918. };
  1919. static struct clk_fixed_factor g12a_fclk_div4_div = {
  1920. .mult = 1,
  1921. .div = 4,
  1922. .hw.init = &(struct clk_init_data){
  1923. .name = "fclk_div4_div",
  1924. .ops = &clk_fixed_factor_ops,
  1925. .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
  1926. .num_parents = 1,
  1927. },
  1928. };
  1929. static struct clk_regmap g12a_fclk_div4 = {
  1930. .data = &(struct clk_regmap_gate_data){
  1931. .offset = HHI_FIX_PLL_CNTL1,
  1932. .bit_idx = 21,
  1933. },
  1934. .hw.init = &(struct clk_init_data){
  1935. .name = "fclk_div4",
  1936. .ops = &clk_regmap_gate_ops,
  1937. .parent_hws = (const struct clk_hw *[]) {
  1938. &g12a_fclk_div4_div.hw
  1939. },
  1940. .num_parents = 1,
  1941. },
  1942. };
  1943. static struct clk_fixed_factor g12a_fclk_div5_div = {
  1944. .mult = 1,
  1945. .div = 5,
  1946. .hw.init = &(struct clk_init_data){
  1947. .name = "fclk_div5_div",
  1948. .ops = &clk_fixed_factor_ops,
  1949. .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
  1950. .num_parents = 1,
  1951. },
  1952. };
  1953. static struct clk_regmap g12a_fclk_div5 = {
  1954. .data = &(struct clk_regmap_gate_data){
  1955. .offset = HHI_FIX_PLL_CNTL1,
  1956. .bit_idx = 22,
  1957. },
  1958. .hw.init = &(struct clk_init_data){
  1959. .name = "fclk_div5",
  1960. .ops = &clk_regmap_gate_ops,
  1961. .parent_hws = (const struct clk_hw *[]) {
  1962. &g12a_fclk_div5_div.hw
  1963. },
  1964. .num_parents = 1,
  1965. },
  1966. };
  1967. static struct clk_fixed_factor g12a_fclk_div7_div = {
  1968. .mult = 1,
  1969. .div = 7,
  1970. .hw.init = &(struct clk_init_data){
  1971. .name = "fclk_div7_div",
  1972. .ops = &clk_fixed_factor_ops,
  1973. .parent_hws = (const struct clk_hw *[]) { &g12a_fixed_pll.hw },
  1974. .num_parents = 1,
  1975. },
  1976. };
  1977. static struct clk_regmap g12a_fclk_div7 = {
  1978. .data = &(struct clk_regmap_gate_data){
  1979. .offset = HHI_FIX_PLL_CNTL1,
  1980. .bit_idx = 23,
  1981. },
  1982. .hw.init = &(struct clk_init_data){
  1983. .name = "fclk_div7",
  1984. .ops = &clk_regmap_gate_ops,
  1985. .parent_hws = (const struct clk_hw *[]) {
  1986. &g12a_fclk_div7_div.hw
  1987. },
  1988. .num_parents = 1,
  1989. },
  1990. };
  1991. static struct clk_fixed_factor g12a_fclk_div2p5_div = {
  1992. .mult = 1,
  1993. .div = 5,
  1994. .hw.init = &(struct clk_init_data){
  1995. .name = "fclk_div2p5_div",
  1996. .ops = &clk_fixed_factor_ops,
  1997. .parent_hws = (const struct clk_hw *[]) {
  1998. &g12a_fixed_pll_dco.hw
  1999. },
  2000. .num_parents = 1,
  2001. },
  2002. };
  2003. static struct clk_regmap g12a_fclk_div2p5 = {
  2004. .data = &(struct clk_regmap_gate_data){
  2005. .offset = HHI_FIX_PLL_CNTL1,
  2006. .bit_idx = 25,
  2007. },
  2008. .hw.init = &(struct clk_init_data){
  2009. .name = "fclk_div2p5",
  2010. .ops = &clk_regmap_gate_ops,
  2011. .parent_hws = (const struct clk_hw *[]) {
  2012. &g12a_fclk_div2p5_div.hw
  2013. },
  2014. .num_parents = 1,
  2015. },
  2016. };
  2017. static struct clk_fixed_factor g12a_mpll_50m_div = {
  2018. .mult = 1,
  2019. .div = 80,
  2020. .hw.init = &(struct clk_init_data){
  2021. .name = "mpll_50m_div",
  2022. .ops = &clk_fixed_factor_ops,
  2023. .parent_hws = (const struct clk_hw *[]) {
  2024. &g12a_fixed_pll_dco.hw
  2025. },
  2026. .num_parents = 1,
  2027. },
  2028. };
  2029. static struct clk_regmap g12a_mpll_50m = {
  2030. .data = &(struct clk_regmap_mux_data){
  2031. .offset = HHI_FIX_PLL_CNTL3,
  2032. .mask = 0x1,
  2033. .shift = 5,
  2034. },
  2035. .hw.init = &(struct clk_init_data){
  2036. .name = "mpll_50m",
  2037. .ops = &clk_regmap_mux_ro_ops,
  2038. .parent_data = (const struct clk_parent_data []) {
  2039. { .fw_name = "xtal", },
  2040. { .hw = &g12a_mpll_50m_div.hw },
  2041. },
  2042. .num_parents = 2,
  2043. },
  2044. };
  2045. static struct clk_fixed_factor g12a_mpll_prediv = {
  2046. .mult = 1,
  2047. .div = 2,
  2048. .hw.init = &(struct clk_init_data){
  2049. .name = "mpll_prediv",
  2050. .ops = &clk_fixed_factor_ops,
  2051. .parent_hws = (const struct clk_hw *[]) {
  2052. &g12a_fixed_pll_dco.hw
  2053. },
  2054. .num_parents = 1,
  2055. },
  2056. };
  2057. static const struct reg_sequence g12a_mpll0_init_regs[] = {
  2058. { .reg = HHI_MPLL_CNTL2, .def = 0x40000033 },
  2059. };
  2060. static struct clk_regmap g12a_mpll0_div = {
  2061. .data = &(struct meson_clk_mpll_data){
  2062. .sdm = {
  2063. .reg_off = HHI_MPLL_CNTL1,
  2064. .shift = 0,
  2065. .width = 14,
  2066. },
  2067. .sdm_en = {
  2068. .reg_off = HHI_MPLL_CNTL1,
  2069. .shift = 30,
  2070. .width = 1,
  2071. },
  2072. .n2 = {
  2073. .reg_off = HHI_MPLL_CNTL1,
  2074. .shift = 20,
  2075. .width = 9,
  2076. },
  2077. .ssen = {
  2078. .reg_off = HHI_MPLL_CNTL1,
  2079. .shift = 29,
  2080. .width = 1,
  2081. },
  2082. .lock = &meson_clk_lock,
  2083. .init_regs = g12a_mpll0_init_regs,
  2084. .init_count = ARRAY_SIZE(g12a_mpll0_init_regs),
  2085. },
  2086. .hw.init = &(struct clk_init_data){
  2087. .name = "mpll0_div",
  2088. .ops = &meson_clk_mpll_ops,
  2089. .parent_hws = (const struct clk_hw *[]) {
  2090. &g12a_mpll_prediv.hw
  2091. },
  2092. .num_parents = 1,
  2093. },
  2094. };
  2095. static struct clk_regmap g12a_mpll0 = {
  2096. .data = &(struct clk_regmap_gate_data){
  2097. .offset = HHI_MPLL_CNTL1,
  2098. .bit_idx = 31,
  2099. },
  2100. .hw.init = &(struct clk_init_data){
  2101. .name = "mpll0",
  2102. .ops = &clk_regmap_gate_ops,
  2103. .parent_hws = (const struct clk_hw *[]) { &g12a_mpll0_div.hw },
  2104. .num_parents = 1,
  2105. .flags = CLK_SET_RATE_PARENT,
  2106. },
  2107. };
  2108. static const struct reg_sequence g12a_mpll1_init_regs[] = {
  2109. { .reg = HHI_MPLL_CNTL4, .def = 0x40000033 },
  2110. };
  2111. static struct clk_regmap g12a_mpll1_div = {
  2112. .data = &(struct meson_clk_mpll_data){
  2113. .sdm = {
  2114. .reg_off = HHI_MPLL_CNTL3,
  2115. .shift = 0,
  2116. .width = 14,
  2117. },
  2118. .sdm_en = {
  2119. .reg_off = HHI_MPLL_CNTL3,
  2120. .shift = 30,
  2121. .width = 1,
  2122. },
  2123. .n2 = {
  2124. .reg_off = HHI_MPLL_CNTL3,
  2125. .shift = 20,
  2126. .width = 9,
  2127. },
  2128. .ssen = {
  2129. .reg_off = HHI_MPLL_CNTL3,
  2130. .shift = 29,
  2131. .width = 1,
  2132. },
  2133. .lock = &meson_clk_lock,
  2134. .init_regs = g12a_mpll1_init_regs,
  2135. .init_count = ARRAY_SIZE(g12a_mpll1_init_regs),
  2136. },
  2137. .hw.init = &(struct clk_init_data){
  2138. .name = "mpll1_div",
  2139. .ops = &meson_clk_mpll_ops,
  2140. .parent_hws = (const struct clk_hw *[]) {
  2141. &g12a_mpll_prediv.hw
  2142. },
  2143. .num_parents = 1,
  2144. },
  2145. };
  2146. static struct clk_regmap g12a_mpll1 = {
  2147. .data = &(struct clk_regmap_gate_data){
  2148. .offset = HHI_MPLL_CNTL3,
  2149. .bit_idx = 31,
  2150. },
  2151. .hw.init = &(struct clk_init_data){
  2152. .name = "mpll1",
  2153. .ops = &clk_regmap_gate_ops,
  2154. .parent_hws = (const struct clk_hw *[]) { &g12a_mpll1_div.hw },
  2155. .num_parents = 1,
  2156. .flags = CLK_SET_RATE_PARENT,
  2157. },
  2158. };
  2159. static const struct reg_sequence g12a_mpll2_init_regs[] = {
  2160. { .reg = HHI_MPLL_CNTL6, .def = 0x40000033 },
  2161. };
  2162. static struct clk_regmap g12a_mpll2_div = {
  2163. .data = &(struct meson_clk_mpll_data){
  2164. .sdm = {
  2165. .reg_off = HHI_MPLL_CNTL5,
  2166. .shift = 0,
  2167. .width = 14,
  2168. },
  2169. .sdm_en = {
  2170. .reg_off = HHI_MPLL_CNTL5,
  2171. .shift = 30,
  2172. .width = 1,
  2173. },
  2174. .n2 = {
  2175. .reg_off = HHI_MPLL_CNTL5,
  2176. .shift = 20,
  2177. .width = 9,
  2178. },
  2179. .ssen = {
  2180. .reg_off = HHI_MPLL_CNTL5,
  2181. .shift = 29,
  2182. .width = 1,
  2183. },
  2184. .lock = &meson_clk_lock,
  2185. .init_regs = g12a_mpll2_init_regs,
  2186. .init_count = ARRAY_SIZE(g12a_mpll2_init_regs),
  2187. },
  2188. .hw.init = &(struct clk_init_data){
  2189. .name = "mpll2_div",
  2190. .ops = &meson_clk_mpll_ops,
  2191. .parent_hws = (const struct clk_hw *[]) {
  2192. &g12a_mpll_prediv.hw
  2193. },
  2194. .num_parents = 1,
  2195. },
  2196. };
  2197. static struct clk_regmap g12a_mpll2 = {
  2198. .data = &(struct clk_regmap_gate_data){
  2199. .offset = HHI_MPLL_CNTL5,
  2200. .bit_idx = 31,
  2201. },
  2202. .hw.init = &(struct clk_init_data){
  2203. .name = "mpll2",
  2204. .ops = &clk_regmap_gate_ops,
  2205. .parent_hws = (const struct clk_hw *[]) { &g12a_mpll2_div.hw },
  2206. .num_parents = 1,
  2207. .flags = CLK_SET_RATE_PARENT,
  2208. },
  2209. };
  2210. static const struct reg_sequence g12a_mpll3_init_regs[] = {
  2211. { .reg = HHI_MPLL_CNTL8, .def = 0x40000033 },
  2212. };
  2213. static struct clk_regmap g12a_mpll3_div = {
  2214. .data = &(struct meson_clk_mpll_data){
  2215. .sdm = {
  2216. .reg_off = HHI_MPLL_CNTL7,
  2217. .shift = 0,
  2218. .width = 14,
  2219. },
  2220. .sdm_en = {
  2221. .reg_off = HHI_MPLL_CNTL7,
  2222. .shift = 30,
  2223. .width = 1,
  2224. },
  2225. .n2 = {
  2226. .reg_off = HHI_MPLL_CNTL7,
  2227. .shift = 20,
  2228. .width = 9,
  2229. },
  2230. .ssen = {
  2231. .reg_off = HHI_MPLL_CNTL7,
  2232. .shift = 29,
  2233. .width = 1,
  2234. },
  2235. .lock = &meson_clk_lock,
  2236. .init_regs = g12a_mpll3_init_regs,
  2237. .init_count = ARRAY_SIZE(g12a_mpll3_init_regs),
  2238. },
  2239. .hw.init = &(struct clk_init_data){
  2240. .name = "mpll3_div",
  2241. .ops = &meson_clk_mpll_ops,
  2242. .parent_hws = (const struct clk_hw *[]) {
  2243. &g12a_mpll_prediv.hw
  2244. },
  2245. .num_parents = 1,
  2246. },
  2247. };
  2248. static struct clk_regmap g12a_mpll3 = {
  2249. .data = &(struct clk_regmap_gate_data){
  2250. .offset = HHI_MPLL_CNTL7,
  2251. .bit_idx = 31,
  2252. },
  2253. .hw.init = &(struct clk_init_data){
  2254. .name = "mpll3",
  2255. .ops = &clk_regmap_gate_ops,
  2256. .parent_hws = (const struct clk_hw *[]) { &g12a_mpll3_div.hw },
  2257. .num_parents = 1,
  2258. .flags = CLK_SET_RATE_PARENT,
  2259. },
  2260. };
  2261. static u32 mux_table_clk81[] = { 0, 2, 3, 4, 5, 6, 7 };
  2262. static const struct clk_parent_data clk81_parent_data[] = {
  2263. { .fw_name = "xtal", },
  2264. { .hw = &g12a_fclk_div7.hw },
  2265. { .hw = &g12a_mpll1.hw },
  2266. { .hw = &g12a_mpll2.hw },
  2267. { .hw = &g12a_fclk_div4.hw },
  2268. { .hw = &g12a_fclk_div3.hw },
  2269. { .hw = &g12a_fclk_div5.hw },
  2270. };
  2271. static struct clk_regmap g12a_mpeg_clk_sel = {
  2272. .data = &(struct clk_regmap_mux_data){
  2273. .offset = HHI_MPEG_CLK_CNTL,
  2274. .mask = 0x7,
  2275. .shift = 12,
  2276. .table = mux_table_clk81,
  2277. },
  2278. .hw.init = &(struct clk_init_data){
  2279. .name = "mpeg_clk_sel",
  2280. .ops = &clk_regmap_mux_ro_ops,
  2281. .parent_data = clk81_parent_data,
  2282. .num_parents = ARRAY_SIZE(clk81_parent_data),
  2283. },
  2284. };
  2285. static struct clk_regmap g12a_mpeg_clk_div = {
  2286. .data = &(struct clk_regmap_div_data){
  2287. .offset = HHI_MPEG_CLK_CNTL,
  2288. .shift = 0,
  2289. .width = 7,
  2290. },
  2291. .hw.init = &(struct clk_init_data){
  2292. .name = "mpeg_clk_div",
  2293. .ops = &clk_regmap_divider_ops,
  2294. .parent_hws = (const struct clk_hw *[]) {
  2295. &g12a_mpeg_clk_sel.hw
  2296. },
  2297. .num_parents = 1,
  2298. .flags = CLK_SET_RATE_PARENT,
  2299. },
  2300. };
  2301. static struct clk_regmap g12a_clk81 = {
  2302. .data = &(struct clk_regmap_gate_data){
  2303. .offset = HHI_MPEG_CLK_CNTL,
  2304. .bit_idx = 7,
  2305. },
  2306. .hw.init = &(struct clk_init_data){
  2307. .name = "clk81",
  2308. .ops = &clk_regmap_gate_ops,
  2309. .parent_hws = (const struct clk_hw *[]) {
  2310. &g12a_mpeg_clk_div.hw
  2311. },
  2312. .num_parents = 1,
  2313. .flags = (CLK_SET_RATE_PARENT | CLK_IS_CRITICAL),
  2314. },
  2315. };
  2316. static const struct clk_parent_data g12a_sd_emmc_clk0_parent_data[] = {
  2317. { .fw_name = "xtal", },
  2318. { .hw = &g12a_fclk_div2.hw },
  2319. { .hw = &g12a_fclk_div3.hw },
  2320. { .hw = &g12a_fclk_div5.hw },
  2321. { .hw = &g12a_fclk_div7.hw },
  2322. /*
  2323. * Following these parent clocks, we should also have had mpll2, mpll3
  2324. * and gp0_pll but these clocks are too precious to be used here. All
  2325. * the necessary rates for MMC and NAND operation can be acheived using
  2326. * g12a_ee_core or fclk_div clocks
  2327. */
  2328. };
  2329. /* SDIO clock */
  2330. static struct clk_regmap g12a_sd_emmc_a_clk0_sel = {
  2331. .data = &(struct clk_regmap_mux_data){
  2332. .offset = HHI_SD_EMMC_CLK_CNTL,
  2333. .mask = 0x7,
  2334. .shift = 9,
  2335. },
  2336. .hw.init = &(struct clk_init_data) {
  2337. .name = "sd_emmc_a_clk0_sel",
  2338. .ops = &clk_regmap_mux_ops,
  2339. .parent_data = g12a_sd_emmc_clk0_parent_data,
  2340. .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
  2341. .flags = CLK_SET_RATE_PARENT,
  2342. },
  2343. };
  2344. static struct clk_regmap g12a_sd_emmc_a_clk0_div = {
  2345. .data = &(struct clk_regmap_div_data){
  2346. .offset = HHI_SD_EMMC_CLK_CNTL,
  2347. .shift = 0,
  2348. .width = 7,
  2349. },
  2350. .hw.init = &(struct clk_init_data) {
  2351. .name = "sd_emmc_a_clk0_div",
  2352. .ops = &clk_regmap_divider_ops,
  2353. .parent_hws = (const struct clk_hw *[]) {
  2354. &g12a_sd_emmc_a_clk0_sel.hw
  2355. },
  2356. .num_parents = 1,
  2357. .flags = CLK_SET_RATE_PARENT,
  2358. },
  2359. };
  2360. static struct clk_regmap g12a_sd_emmc_a_clk0 = {
  2361. .data = &(struct clk_regmap_gate_data){
  2362. .offset = HHI_SD_EMMC_CLK_CNTL,
  2363. .bit_idx = 7,
  2364. },
  2365. .hw.init = &(struct clk_init_data){
  2366. .name = "sd_emmc_a_clk0",
  2367. .ops = &clk_regmap_gate_ops,
  2368. .parent_hws = (const struct clk_hw *[]) {
  2369. &g12a_sd_emmc_a_clk0_div.hw
  2370. },
  2371. .num_parents = 1,
  2372. .flags = CLK_SET_RATE_PARENT,
  2373. },
  2374. };
  2375. /* SDcard clock */
  2376. static struct clk_regmap g12a_sd_emmc_b_clk0_sel = {
  2377. .data = &(struct clk_regmap_mux_data){
  2378. .offset = HHI_SD_EMMC_CLK_CNTL,
  2379. .mask = 0x7,
  2380. .shift = 25,
  2381. },
  2382. .hw.init = &(struct clk_init_data) {
  2383. .name = "sd_emmc_b_clk0_sel",
  2384. .ops = &clk_regmap_mux_ops,
  2385. .parent_data = g12a_sd_emmc_clk0_parent_data,
  2386. .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
  2387. .flags = CLK_SET_RATE_PARENT,
  2388. },
  2389. };
  2390. static struct clk_regmap g12a_sd_emmc_b_clk0_div = {
  2391. .data = &(struct clk_regmap_div_data){
  2392. .offset = HHI_SD_EMMC_CLK_CNTL,
  2393. .shift = 16,
  2394. .width = 7,
  2395. },
  2396. .hw.init = &(struct clk_init_data) {
  2397. .name = "sd_emmc_b_clk0_div",
  2398. .ops = &clk_regmap_divider_ops,
  2399. .parent_hws = (const struct clk_hw *[]) {
  2400. &g12a_sd_emmc_b_clk0_sel.hw
  2401. },
  2402. .num_parents = 1,
  2403. .flags = CLK_SET_RATE_PARENT,
  2404. },
  2405. };
  2406. static struct clk_regmap g12a_sd_emmc_b_clk0 = {
  2407. .data = &(struct clk_regmap_gate_data){
  2408. .offset = HHI_SD_EMMC_CLK_CNTL,
  2409. .bit_idx = 23,
  2410. },
  2411. .hw.init = &(struct clk_init_data){
  2412. .name = "sd_emmc_b_clk0",
  2413. .ops = &clk_regmap_gate_ops,
  2414. .parent_hws = (const struct clk_hw *[]) {
  2415. &g12a_sd_emmc_b_clk0_div.hw
  2416. },
  2417. .num_parents = 1,
  2418. .flags = CLK_SET_RATE_PARENT,
  2419. },
  2420. };
  2421. /* EMMC/NAND clock */
  2422. static struct clk_regmap g12a_sd_emmc_c_clk0_sel = {
  2423. .data = &(struct clk_regmap_mux_data){
  2424. .offset = HHI_NAND_CLK_CNTL,
  2425. .mask = 0x7,
  2426. .shift = 9,
  2427. },
  2428. .hw.init = &(struct clk_init_data) {
  2429. .name = "sd_emmc_c_clk0_sel",
  2430. .ops = &clk_regmap_mux_ops,
  2431. .parent_data = g12a_sd_emmc_clk0_parent_data,
  2432. .num_parents = ARRAY_SIZE(g12a_sd_emmc_clk0_parent_data),
  2433. .flags = CLK_SET_RATE_PARENT,
  2434. },
  2435. };
  2436. static struct clk_regmap g12a_sd_emmc_c_clk0_div = {
  2437. .data = &(struct clk_regmap_div_data){
  2438. .offset = HHI_NAND_CLK_CNTL,
  2439. .shift = 0,
  2440. .width = 7,
  2441. },
  2442. .hw.init = &(struct clk_init_data) {
  2443. .name = "sd_emmc_c_clk0_div",
  2444. .ops = &clk_regmap_divider_ops,
  2445. .parent_hws = (const struct clk_hw *[]) {
  2446. &g12a_sd_emmc_c_clk0_sel.hw
  2447. },
  2448. .num_parents = 1,
  2449. .flags = CLK_SET_RATE_PARENT,
  2450. },
  2451. };
  2452. static struct clk_regmap g12a_sd_emmc_c_clk0 = {
  2453. .data = &(struct clk_regmap_gate_data){
  2454. .offset = HHI_NAND_CLK_CNTL,
  2455. .bit_idx = 7,
  2456. },
  2457. .hw.init = &(struct clk_init_data){
  2458. .name = "sd_emmc_c_clk0",
  2459. .ops = &clk_regmap_gate_ops,
  2460. .parent_hws = (const struct clk_hw *[]) {
  2461. &g12a_sd_emmc_c_clk0_div.hw
  2462. },
  2463. .num_parents = 1,
  2464. .flags = CLK_SET_RATE_PARENT,
  2465. },
  2466. };
  2467. /* Video Clocks */
  2468. static struct clk_regmap g12a_vid_pll_div = {
  2469. .data = &(struct meson_vid_pll_div_data){
  2470. .val = {
  2471. .reg_off = HHI_VID_PLL_CLK_DIV,
  2472. .shift = 0,
  2473. .width = 15,
  2474. },
  2475. .sel = {
  2476. .reg_off = HHI_VID_PLL_CLK_DIV,
  2477. .shift = 16,
  2478. .width = 2,
  2479. },
  2480. },
  2481. .hw.init = &(struct clk_init_data) {
  2482. .name = "vid_pll_div",
  2483. .ops = &meson_vid_pll_div_ro_ops,
  2484. .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_pll.hw },
  2485. .num_parents = 1,
  2486. .flags = CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
  2487. },
  2488. };
  2489. static const struct clk_hw *g12a_vid_pll_parent_hws[] = {
  2490. &g12a_vid_pll_div.hw,
  2491. &g12a_hdmi_pll.hw,
  2492. };
  2493. static struct clk_regmap g12a_vid_pll_sel = {
  2494. .data = &(struct clk_regmap_mux_data){
  2495. .offset = HHI_VID_PLL_CLK_DIV,
  2496. .mask = 0x1,
  2497. .shift = 18,
  2498. },
  2499. .hw.init = &(struct clk_init_data){
  2500. .name = "vid_pll_sel",
  2501. .ops = &clk_regmap_mux_ops,
  2502. /*
  2503. * bit 18 selects from 2 possible parents:
  2504. * vid_pll_div or hdmi_pll
  2505. */
  2506. .parent_hws = g12a_vid_pll_parent_hws,
  2507. .num_parents = ARRAY_SIZE(g12a_vid_pll_parent_hws),
  2508. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  2509. },
  2510. };
  2511. static struct clk_regmap g12a_vid_pll = {
  2512. .data = &(struct clk_regmap_gate_data){
  2513. .offset = HHI_VID_PLL_CLK_DIV,
  2514. .bit_idx = 19,
  2515. },
  2516. .hw.init = &(struct clk_init_data) {
  2517. .name = "vid_pll",
  2518. .ops = &clk_regmap_gate_ops,
  2519. .parent_hws = (const struct clk_hw *[]) {
  2520. &g12a_vid_pll_sel.hw
  2521. },
  2522. .num_parents = 1,
  2523. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2524. },
  2525. };
  2526. /* VPU Clock */
  2527. static const struct clk_hw *g12a_vpu_parent_hws[] = {
  2528. &g12a_fclk_div3.hw,
  2529. &g12a_fclk_div4.hw,
  2530. &g12a_fclk_div5.hw,
  2531. &g12a_fclk_div7.hw,
  2532. &g12a_mpll1.hw,
  2533. &g12a_vid_pll.hw,
  2534. &g12a_hifi_pll.hw,
  2535. &g12a_gp0_pll.hw,
  2536. };
  2537. static struct clk_regmap g12a_vpu_0_sel = {
  2538. .data = &(struct clk_regmap_mux_data){
  2539. .offset = HHI_VPU_CLK_CNTL,
  2540. .mask = 0x7,
  2541. .shift = 9,
  2542. },
  2543. .hw.init = &(struct clk_init_data){
  2544. .name = "vpu_0_sel",
  2545. .ops = &clk_regmap_mux_ops,
  2546. .parent_hws = g12a_vpu_parent_hws,
  2547. .num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
  2548. .flags = CLK_SET_RATE_NO_REPARENT,
  2549. },
  2550. };
  2551. static struct clk_regmap g12a_vpu_0_div = {
  2552. .data = &(struct clk_regmap_div_data){
  2553. .offset = HHI_VPU_CLK_CNTL,
  2554. .shift = 0,
  2555. .width = 7,
  2556. },
  2557. .hw.init = &(struct clk_init_data){
  2558. .name = "vpu_0_div",
  2559. .ops = &clk_regmap_divider_ops,
  2560. .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_sel.hw },
  2561. .num_parents = 1,
  2562. .flags = CLK_SET_RATE_PARENT,
  2563. },
  2564. };
  2565. static struct clk_regmap g12a_vpu_0 = {
  2566. .data = &(struct clk_regmap_gate_data){
  2567. .offset = HHI_VPU_CLK_CNTL,
  2568. .bit_idx = 8,
  2569. },
  2570. .hw.init = &(struct clk_init_data) {
  2571. .name = "vpu_0",
  2572. .ops = &clk_regmap_gate_ops,
  2573. .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_0_div.hw },
  2574. .num_parents = 1,
  2575. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2576. },
  2577. };
  2578. static struct clk_regmap g12a_vpu_1_sel = {
  2579. .data = &(struct clk_regmap_mux_data){
  2580. .offset = HHI_VPU_CLK_CNTL,
  2581. .mask = 0x7,
  2582. .shift = 25,
  2583. },
  2584. .hw.init = &(struct clk_init_data){
  2585. .name = "vpu_1_sel",
  2586. .ops = &clk_regmap_mux_ops,
  2587. .parent_hws = g12a_vpu_parent_hws,
  2588. .num_parents = ARRAY_SIZE(g12a_vpu_parent_hws),
  2589. .flags = CLK_SET_RATE_NO_REPARENT,
  2590. },
  2591. };
  2592. static struct clk_regmap g12a_vpu_1_div = {
  2593. .data = &(struct clk_regmap_div_data){
  2594. .offset = HHI_VPU_CLK_CNTL,
  2595. .shift = 16,
  2596. .width = 7,
  2597. },
  2598. .hw.init = &(struct clk_init_data){
  2599. .name = "vpu_1_div",
  2600. .ops = &clk_regmap_divider_ops,
  2601. .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_sel.hw },
  2602. .num_parents = 1,
  2603. .flags = CLK_SET_RATE_PARENT,
  2604. },
  2605. };
  2606. static struct clk_regmap g12a_vpu_1 = {
  2607. .data = &(struct clk_regmap_gate_data){
  2608. .offset = HHI_VPU_CLK_CNTL,
  2609. .bit_idx = 24,
  2610. },
  2611. .hw.init = &(struct clk_init_data) {
  2612. .name = "vpu_1",
  2613. .ops = &clk_regmap_gate_ops,
  2614. .parent_hws = (const struct clk_hw *[]) { &g12a_vpu_1_div.hw },
  2615. .num_parents = 1,
  2616. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2617. },
  2618. };
  2619. static struct clk_regmap g12a_vpu = {
  2620. .data = &(struct clk_regmap_mux_data){
  2621. .offset = HHI_VPU_CLK_CNTL,
  2622. .mask = 1,
  2623. .shift = 31,
  2624. },
  2625. .hw.init = &(struct clk_init_data){
  2626. .name = "vpu",
  2627. .ops = &clk_regmap_mux_ops,
  2628. /*
  2629. * bit 31 selects from 2 possible parents:
  2630. * vpu_0 or vpu_1
  2631. */
  2632. .parent_hws = (const struct clk_hw *[]) {
  2633. &g12a_vpu_0.hw,
  2634. &g12a_vpu_1.hw,
  2635. },
  2636. .num_parents = 2,
  2637. .flags = CLK_SET_RATE_NO_REPARENT,
  2638. },
  2639. };
  2640. /* VDEC clocks */
  2641. static const struct clk_hw *g12a_vdec_parent_hws[] = {
  2642. &g12a_fclk_div2p5.hw,
  2643. &g12a_fclk_div3.hw,
  2644. &g12a_fclk_div4.hw,
  2645. &g12a_fclk_div5.hw,
  2646. &g12a_fclk_div7.hw,
  2647. &g12a_hifi_pll.hw,
  2648. &g12a_gp0_pll.hw,
  2649. };
  2650. static struct clk_regmap g12a_vdec_1_sel = {
  2651. .data = &(struct clk_regmap_mux_data){
  2652. .offset = HHI_VDEC_CLK_CNTL,
  2653. .mask = 0x7,
  2654. .shift = 9,
  2655. .flags = CLK_MUX_ROUND_CLOSEST,
  2656. },
  2657. .hw.init = &(struct clk_init_data){
  2658. .name = "vdec_1_sel",
  2659. .ops = &clk_regmap_mux_ops,
  2660. .parent_hws = g12a_vdec_parent_hws,
  2661. .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
  2662. .flags = CLK_SET_RATE_PARENT,
  2663. },
  2664. };
  2665. static struct clk_regmap g12a_vdec_1_div = {
  2666. .data = &(struct clk_regmap_div_data){
  2667. .offset = HHI_VDEC_CLK_CNTL,
  2668. .shift = 0,
  2669. .width = 7,
  2670. .flags = CLK_DIVIDER_ROUND_CLOSEST,
  2671. },
  2672. .hw.init = &(struct clk_init_data){
  2673. .name = "vdec_1_div",
  2674. .ops = &clk_regmap_divider_ops,
  2675. .parent_hws = (const struct clk_hw *[]) {
  2676. &g12a_vdec_1_sel.hw
  2677. },
  2678. .num_parents = 1,
  2679. .flags = CLK_SET_RATE_PARENT,
  2680. },
  2681. };
  2682. static struct clk_regmap g12a_vdec_1 = {
  2683. .data = &(struct clk_regmap_gate_data){
  2684. .offset = HHI_VDEC_CLK_CNTL,
  2685. .bit_idx = 8,
  2686. },
  2687. .hw.init = &(struct clk_init_data) {
  2688. .name = "vdec_1",
  2689. .ops = &clk_regmap_gate_ops,
  2690. .parent_hws = (const struct clk_hw *[]) {
  2691. &g12a_vdec_1_div.hw
  2692. },
  2693. .num_parents = 1,
  2694. .flags = CLK_SET_RATE_PARENT,
  2695. },
  2696. };
  2697. static struct clk_regmap g12a_vdec_hevcf_sel = {
  2698. .data = &(struct clk_regmap_mux_data){
  2699. .offset = HHI_VDEC2_CLK_CNTL,
  2700. .mask = 0x7,
  2701. .shift = 9,
  2702. .flags = CLK_MUX_ROUND_CLOSEST,
  2703. },
  2704. .hw.init = &(struct clk_init_data){
  2705. .name = "vdec_hevcf_sel",
  2706. .ops = &clk_regmap_mux_ops,
  2707. .parent_hws = g12a_vdec_parent_hws,
  2708. .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
  2709. .flags = CLK_SET_RATE_PARENT,
  2710. },
  2711. };
  2712. static struct clk_regmap g12a_vdec_hevcf_div = {
  2713. .data = &(struct clk_regmap_div_data){
  2714. .offset = HHI_VDEC2_CLK_CNTL,
  2715. .shift = 0,
  2716. .width = 7,
  2717. .flags = CLK_DIVIDER_ROUND_CLOSEST,
  2718. },
  2719. .hw.init = &(struct clk_init_data){
  2720. .name = "vdec_hevcf_div",
  2721. .ops = &clk_regmap_divider_ops,
  2722. .parent_hws = (const struct clk_hw *[]) {
  2723. &g12a_vdec_hevcf_sel.hw
  2724. },
  2725. .num_parents = 1,
  2726. .flags = CLK_SET_RATE_PARENT,
  2727. },
  2728. };
  2729. static struct clk_regmap g12a_vdec_hevcf = {
  2730. .data = &(struct clk_regmap_gate_data){
  2731. .offset = HHI_VDEC2_CLK_CNTL,
  2732. .bit_idx = 8,
  2733. },
  2734. .hw.init = &(struct clk_init_data) {
  2735. .name = "vdec_hevcf",
  2736. .ops = &clk_regmap_gate_ops,
  2737. .parent_hws = (const struct clk_hw *[]) {
  2738. &g12a_vdec_hevcf_div.hw
  2739. },
  2740. .num_parents = 1,
  2741. .flags = CLK_SET_RATE_PARENT,
  2742. },
  2743. };
  2744. static struct clk_regmap g12a_vdec_hevc_sel = {
  2745. .data = &(struct clk_regmap_mux_data){
  2746. .offset = HHI_VDEC2_CLK_CNTL,
  2747. .mask = 0x7,
  2748. .shift = 25,
  2749. .flags = CLK_MUX_ROUND_CLOSEST,
  2750. },
  2751. .hw.init = &(struct clk_init_data){
  2752. .name = "vdec_hevc_sel",
  2753. .ops = &clk_regmap_mux_ops,
  2754. .parent_hws = g12a_vdec_parent_hws,
  2755. .num_parents = ARRAY_SIZE(g12a_vdec_parent_hws),
  2756. .flags = CLK_SET_RATE_PARENT,
  2757. },
  2758. };
  2759. static struct clk_regmap g12a_vdec_hevc_div = {
  2760. .data = &(struct clk_regmap_div_data){
  2761. .offset = HHI_VDEC2_CLK_CNTL,
  2762. .shift = 16,
  2763. .width = 7,
  2764. .flags = CLK_DIVIDER_ROUND_CLOSEST,
  2765. },
  2766. .hw.init = &(struct clk_init_data){
  2767. .name = "vdec_hevc_div",
  2768. .ops = &clk_regmap_divider_ops,
  2769. .parent_hws = (const struct clk_hw *[]) {
  2770. &g12a_vdec_hevc_sel.hw
  2771. },
  2772. .num_parents = 1,
  2773. .flags = CLK_SET_RATE_PARENT,
  2774. },
  2775. };
  2776. static struct clk_regmap g12a_vdec_hevc = {
  2777. .data = &(struct clk_regmap_gate_data){
  2778. .offset = HHI_VDEC2_CLK_CNTL,
  2779. .bit_idx = 24,
  2780. },
  2781. .hw.init = &(struct clk_init_data) {
  2782. .name = "vdec_hevc",
  2783. .ops = &clk_regmap_gate_ops,
  2784. .parent_hws = (const struct clk_hw *[]) {
  2785. &g12a_vdec_hevc_div.hw
  2786. },
  2787. .num_parents = 1,
  2788. .flags = CLK_SET_RATE_PARENT,
  2789. },
  2790. };
  2791. /* VAPB Clock */
  2792. static const struct clk_hw *g12a_vapb_parent_hws[] = {
  2793. &g12a_fclk_div4.hw,
  2794. &g12a_fclk_div3.hw,
  2795. &g12a_fclk_div5.hw,
  2796. &g12a_fclk_div7.hw,
  2797. &g12a_mpll1.hw,
  2798. &g12a_vid_pll.hw,
  2799. &g12a_mpll2.hw,
  2800. &g12a_fclk_div2p5.hw,
  2801. };
  2802. static struct clk_regmap g12a_vapb_0_sel = {
  2803. .data = &(struct clk_regmap_mux_data){
  2804. .offset = HHI_VAPBCLK_CNTL,
  2805. .mask = 0x3,
  2806. .shift = 9,
  2807. },
  2808. .hw.init = &(struct clk_init_data){
  2809. .name = "vapb_0_sel",
  2810. .ops = &clk_regmap_mux_ops,
  2811. .parent_hws = g12a_vapb_parent_hws,
  2812. .num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
  2813. .flags = CLK_SET_RATE_NO_REPARENT,
  2814. },
  2815. };
  2816. static struct clk_regmap g12a_vapb_0_div = {
  2817. .data = &(struct clk_regmap_div_data){
  2818. .offset = HHI_VAPBCLK_CNTL,
  2819. .shift = 0,
  2820. .width = 7,
  2821. },
  2822. .hw.init = &(struct clk_init_data){
  2823. .name = "vapb_0_div",
  2824. .ops = &clk_regmap_divider_ops,
  2825. .parent_hws = (const struct clk_hw *[]) {
  2826. &g12a_vapb_0_sel.hw
  2827. },
  2828. .num_parents = 1,
  2829. .flags = CLK_SET_RATE_PARENT,
  2830. },
  2831. };
  2832. static struct clk_regmap g12a_vapb_0 = {
  2833. .data = &(struct clk_regmap_gate_data){
  2834. .offset = HHI_VAPBCLK_CNTL,
  2835. .bit_idx = 8,
  2836. },
  2837. .hw.init = &(struct clk_init_data) {
  2838. .name = "vapb_0",
  2839. .ops = &clk_regmap_gate_ops,
  2840. .parent_hws = (const struct clk_hw *[]) {
  2841. &g12a_vapb_0_div.hw
  2842. },
  2843. .num_parents = 1,
  2844. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2845. },
  2846. };
  2847. static struct clk_regmap g12a_vapb_1_sel = {
  2848. .data = &(struct clk_regmap_mux_data){
  2849. .offset = HHI_VAPBCLK_CNTL,
  2850. .mask = 0x3,
  2851. .shift = 25,
  2852. },
  2853. .hw.init = &(struct clk_init_data){
  2854. .name = "vapb_1_sel",
  2855. .ops = &clk_regmap_mux_ops,
  2856. .parent_hws = g12a_vapb_parent_hws,
  2857. .num_parents = ARRAY_SIZE(g12a_vapb_parent_hws),
  2858. .flags = CLK_SET_RATE_NO_REPARENT,
  2859. },
  2860. };
  2861. static struct clk_regmap g12a_vapb_1_div = {
  2862. .data = &(struct clk_regmap_div_data){
  2863. .offset = HHI_VAPBCLK_CNTL,
  2864. .shift = 16,
  2865. .width = 7,
  2866. },
  2867. .hw.init = &(struct clk_init_data){
  2868. .name = "vapb_1_div",
  2869. .ops = &clk_regmap_divider_ops,
  2870. .parent_hws = (const struct clk_hw *[]) {
  2871. &g12a_vapb_1_sel.hw
  2872. },
  2873. .num_parents = 1,
  2874. .flags = CLK_SET_RATE_PARENT,
  2875. },
  2876. };
  2877. static struct clk_regmap g12a_vapb_1 = {
  2878. .data = &(struct clk_regmap_gate_data){
  2879. .offset = HHI_VAPBCLK_CNTL,
  2880. .bit_idx = 24,
  2881. },
  2882. .hw.init = &(struct clk_init_data) {
  2883. .name = "vapb_1",
  2884. .ops = &clk_regmap_gate_ops,
  2885. .parent_hws = (const struct clk_hw *[]) {
  2886. &g12a_vapb_1_div.hw
  2887. },
  2888. .num_parents = 1,
  2889. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2890. },
  2891. };
  2892. static struct clk_regmap g12a_vapb_sel = {
  2893. .data = &(struct clk_regmap_mux_data){
  2894. .offset = HHI_VAPBCLK_CNTL,
  2895. .mask = 1,
  2896. .shift = 31,
  2897. },
  2898. .hw.init = &(struct clk_init_data){
  2899. .name = "vapb_sel",
  2900. .ops = &clk_regmap_mux_ops,
  2901. /*
  2902. * bit 31 selects from 2 possible parents:
  2903. * vapb_0 or vapb_1
  2904. */
  2905. .parent_hws = (const struct clk_hw *[]) {
  2906. &g12a_vapb_0.hw,
  2907. &g12a_vapb_1.hw,
  2908. },
  2909. .num_parents = 2,
  2910. .flags = CLK_SET_RATE_NO_REPARENT,
  2911. },
  2912. };
  2913. static struct clk_regmap g12a_vapb = {
  2914. .data = &(struct clk_regmap_gate_data){
  2915. .offset = HHI_VAPBCLK_CNTL,
  2916. .bit_idx = 30,
  2917. },
  2918. .hw.init = &(struct clk_init_data) {
  2919. .name = "vapb",
  2920. .ops = &clk_regmap_gate_ops,
  2921. .parent_hws = (const struct clk_hw *[]) { &g12a_vapb_sel.hw },
  2922. .num_parents = 1,
  2923. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2924. },
  2925. };
  2926. static const struct clk_hw *g12a_vclk_parent_hws[] = {
  2927. &g12a_vid_pll.hw,
  2928. &g12a_gp0_pll.hw,
  2929. &g12a_hifi_pll.hw,
  2930. &g12a_mpll1.hw,
  2931. &g12a_fclk_div3.hw,
  2932. &g12a_fclk_div4.hw,
  2933. &g12a_fclk_div5.hw,
  2934. &g12a_fclk_div7.hw,
  2935. };
  2936. static struct clk_regmap g12a_vclk_sel = {
  2937. .data = &(struct clk_regmap_mux_data){
  2938. .offset = HHI_VID_CLK_CNTL,
  2939. .mask = 0x7,
  2940. .shift = 16,
  2941. },
  2942. .hw.init = &(struct clk_init_data){
  2943. .name = "vclk_sel",
  2944. .ops = &clk_regmap_mux_ops,
  2945. .parent_hws = g12a_vclk_parent_hws,
  2946. .num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
  2947. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  2948. },
  2949. };
  2950. static struct clk_regmap g12a_vclk2_sel = {
  2951. .data = &(struct clk_regmap_mux_data){
  2952. .offset = HHI_VIID_CLK_CNTL,
  2953. .mask = 0x7,
  2954. .shift = 16,
  2955. },
  2956. .hw.init = &(struct clk_init_data){
  2957. .name = "vclk2_sel",
  2958. .ops = &clk_regmap_mux_ops,
  2959. .parent_hws = g12a_vclk_parent_hws,
  2960. .num_parents = ARRAY_SIZE(g12a_vclk_parent_hws),
  2961. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  2962. },
  2963. };
  2964. static struct clk_regmap g12a_vclk_input = {
  2965. .data = &(struct clk_regmap_gate_data){
  2966. .offset = HHI_VID_CLK_DIV,
  2967. .bit_idx = 16,
  2968. },
  2969. .hw.init = &(struct clk_init_data) {
  2970. .name = "vclk_input",
  2971. .ops = &clk_regmap_gate_ops,
  2972. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk_sel.hw },
  2973. .num_parents = 1,
  2974. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2975. },
  2976. };
  2977. static struct clk_regmap g12a_vclk2_input = {
  2978. .data = &(struct clk_regmap_gate_data){
  2979. .offset = HHI_VIID_CLK_DIV,
  2980. .bit_idx = 16,
  2981. },
  2982. .hw.init = &(struct clk_init_data) {
  2983. .name = "vclk2_input",
  2984. .ops = &clk_regmap_gate_ops,
  2985. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_sel.hw },
  2986. .num_parents = 1,
  2987. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  2988. },
  2989. };
  2990. static struct clk_regmap g12a_vclk_div = {
  2991. .data = &(struct clk_regmap_div_data){
  2992. .offset = HHI_VID_CLK_DIV,
  2993. .shift = 0,
  2994. .width = 8,
  2995. },
  2996. .hw.init = &(struct clk_init_data){
  2997. .name = "vclk_div",
  2998. .ops = &clk_regmap_divider_ops,
  2999. .parent_hws = (const struct clk_hw *[]) {
  3000. &g12a_vclk_input.hw
  3001. },
  3002. .num_parents = 1,
  3003. .flags = CLK_GET_RATE_NOCACHE,
  3004. },
  3005. };
  3006. static struct clk_regmap g12a_vclk2_div = {
  3007. .data = &(struct clk_regmap_div_data){
  3008. .offset = HHI_VIID_CLK_DIV,
  3009. .shift = 0,
  3010. .width = 8,
  3011. },
  3012. .hw.init = &(struct clk_init_data){
  3013. .name = "vclk2_div",
  3014. .ops = &clk_regmap_divider_ops,
  3015. .parent_hws = (const struct clk_hw *[]) {
  3016. &g12a_vclk2_input.hw
  3017. },
  3018. .num_parents = 1,
  3019. .flags = CLK_GET_RATE_NOCACHE,
  3020. },
  3021. };
  3022. static struct clk_regmap g12a_vclk = {
  3023. .data = &(struct clk_regmap_gate_data){
  3024. .offset = HHI_VID_CLK_CNTL,
  3025. .bit_idx = 19,
  3026. },
  3027. .hw.init = &(struct clk_init_data) {
  3028. .name = "vclk",
  3029. .ops = &clk_regmap_gate_ops,
  3030. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk_div.hw },
  3031. .num_parents = 1,
  3032. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3033. },
  3034. };
  3035. static struct clk_regmap g12a_vclk2 = {
  3036. .data = &(struct clk_regmap_gate_data){
  3037. .offset = HHI_VIID_CLK_CNTL,
  3038. .bit_idx = 19,
  3039. },
  3040. .hw.init = &(struct clk_init_data) {
  3041. .name = "vclk2",
  3042. .ops = &clk_regmap_gate_ops,
  3043. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2_div.hw },
  3044. .num_parents = 1,
  3045. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3046. },
  3047. };
  3048. static struct clk_regmap g12a_vclk_div1 = {
  3049. .data = &(struct clk_regmap_gate_data){
  3050. .offset = HHI_VID_CLK_CNTL,
  3051. .bit_idx = 0,
  3052. },
  3053. .hw.init = &(struct clk_init_data) {
  3054. .name = "vclk_div1",
  3055. .ops = &clk_regmap_gate_ops,
  3056. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
  3057. .num_parents = 1,
  3058. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3059. },
  3060. };
  3061. static struct clk_regmap g12a_vclk_div2_en = {
  3062. .data = &(struct clk_regmap_gate_data){
  3063. .offset = HHI_VID_CLK_CNTL,
  3064. .bit_idx = 1,
  3065. },
  3066. .hw.init = &(struct clk_init_data) {
  3067. .name = "vclk_div2_en",
  3068. .ops = &clk_regmap_gate_ops,
  3069. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
  3070. .num_parents = 1,
  3071. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3072. },
  3073. };
  3074. static struct clk_regmap g12a_vclk_div4_en = {
  3075. .data = &(struct clk_regmap_gate_data){
  3076. .offset = HHI_VID_CLK_CNTL,
  3077. .bit_idx = 2,
  3078. },
  3079. .hw.init = &(struct clk_init_data) {
  3080. .name = "vclk_div4_en",
  3081. .ops = &clk_regmap_gate_ops,
  3082. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
  3083. .num_parents = 1,
  3084. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3085. },
  3086. };
  3087. static struct clk_regmap g12a_vclk_div6_en = {
  3088. .data = &(struct clk_regmap_gate_data){
  3089. .offset = HHI_VID_CLK_CNTL,
  3090. .bit_idx = 3,
  3091. },
  3092. .hw.init = &(struct clk_init_data) {
  3093. .name = "vclk_div6_en",
  3094. .ops = &clk_regmap_gate_ops,
  3095. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
  3096. .num_parents = 1,
  3097. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3098. },
  3099. };
  3100. static struct clk_regmap g12a_vclk_div12_en = {
  3101. .data = &(struct clk_regmap_gate_data){
  3102. .offset = HHI_VID_CLK_CNTL,
  3103. .bit_idx = 4,
  3104. },
  3105. .hw.init = &(struct clk_init_data) {
  3106. .name = "vclk_div12_en",
  3107. .ops = &clk_regmap_gate_ops,
  3108. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk.hw },
  3109. .num_parents = 1,
  3110. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3111. },
  3112. };
  3113. static struct clk_regmap g12a_vclk2_div1 = {
  3114. .data = &(struct clk_regmap_gate_data){
  3115. .offset = HHI_VIID_CLK_CNTL,
  3116. .bit_idx = 0,
  3117. },
  3118. .hw.init = &(struct clk_init_data) {
  3119. .name = "vclk2_div1",
  3120. .ops = &clk_regmap_gate_ops,
  3121. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
  3122. .num_parents = 1,
  3123. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3124. },
  3125. };
  3126. static struct clk_regmap g12a_vclk2_div2_en = {
  3127. .data = &(struct clk_regmap_gate_data){
  3128. .offset = HHI_VIID_CLK_CNTL,
  3129. .bit_idx = 1,
  3130. },
  3131. .hw.init = &(struct clk_init_data) {
  3132. .name = "vclk2_div2_en",
  3133. .ops = &clk_regmap_gate_ops,
  3134. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
  3135. .num_parents = 1,
  3136. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3137. },
  3138. };
  3139. static struct clk_regmap g12a_vclk2_div4_en = {
  3140. .data = &(struct clk_regmap_gate_data){
  3141. .offset = HHI_VIID_CLK_CNTL,
  3142. .bit_idx = 2,
  3143. },
  3144. .hw.init = &(struct clk_init_data) {
  3145. .name = "vclk2_div4_en",
  3146. .ops = &clk_regmap_gate_ops,
  3147. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
  3148. .num_parents = 1,
  3149. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3150. },
  3151. };
  3152. static struct clk_regmap g12a_vclk2_div6_en = {
  3153. .data = &(struct clk_regmap_gate_data){
  3154. .offset = HHI_VIID_CLK_CNTL,
  3155. .bit_idx = 3,
  3156. },
  3157. .hw.init = &(struct clk_init_data) {
  3158. .name = "vclk2_div6_en",
  3159. .ops = &clk_regmap_gate_ops,
  3160. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
  3161. .num_parents = 1,
  3162. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3163. },
  3164. };
  3165. static struct clk_regmap g12a_vclk2_div12_en = {
  3166. .data = &(struct clk_regmap_gate_data){
  3167. .offset = HHI_VIID_CLK_CNTL,
  3168. .bit_idx = 4,
  3169. },
  3170. .hw.init = &(struct clk_init_data) {
  3171. .name = "vclk2_div12_en",
  3172. .ops = &clk_regmap_gate_ops,
  3173. .parent_hws = (const struct clk_hw *[]) { &g12a_vclk2.hw },
  3174. .num_parents = 1,
  3175. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3176. },
  3177. };
  3178. static struct clk_fixed_factor g12a_vclk_div2 = {
  3179. .mult = 1,
  3180. .div = 2,
  3181. .hw.init = &(struct clk_init_data){
  3182. .name = "vclk_div2",
  3183. .ops = &clk_fixed_factor_ops,
  3184. .parent_hws = (const struct clk_hw *[]) {
  3185. &g12a_vclk_div2_en.hw
  3186. },
  3187. .num_parents = 1,
  3188. },
  3189. };
  3190. static struct clk_fixed_factor g12a_vclk_div4 = {
  3191. .mult = 1,
  3192. .div = 4,
  3193. .hw.init = &(struct clk_init_data){
  3194. .name = "vclk_div4",
  3195. .ops = &clk_fixed_factor_ops,
  3196. .parent_hws = (const struct clk_hw *[]) {
  3197. &g12a_vclk_div4_en.hw
  3198. },
  3199. .num_parents = 1,
  3200. },
  3201. };
  3202. static struct clk_fixed_factor g12a_vclk_div6 = {
  3203. .mult = 1,
  3204. .div = 6,
  3205. .hw.init = &(struct clk_init_data){
  3206. .name = "vclk_div6",
  3207. .ops = &clk_fixed_factor_ops,
  3208. .parent_hws = (const struct clk_hw *[]) {
  3209. &g12a_vclk_div6_en.hw
  3210. },
  3211. .num_parents = 1,
  3212. },
  3213. };
  3214. static struct clk_fixed_factor g12a_vclk_div12 = {
  3215. .mult = 1,
  3216. .div = 12,
  3217. .hw.init = &(struct clk_init_data){
  3218. .name = "vclk_div12",
  3219. .ops = &clk_fixed_factor_ops,
  3220. .parent_hws = (const struct clk_hw *[]) {
  3221. &g12a_vclk_div12_en.hw
  3222. },
  3223. .num_parents = 1,
  3224. },
  3225. };
  3226. static struct clk_fixed_factor g12a_vclk2_div2 = {
  3227. .mult = 1,
  3228. .div = 2,
  3229. .hw.init = &(struct clk_init_data){
  3230. .name = "vclk2_div2",
  3231. .ops = &clk_fixed_factor_ops,
  3232. .parent_hws = (const struct clk_hw *[]) {
  3233. &g12a_vclk2_div2_en.hw
  3234. },
  3235. .num_parents = 1,
  3236. },
  3237. };
  3238. static struct clk_fixed_factor g12a_vclk2_div4 = {
  3239. .mult = 1,
  3240. .div = 4,
  3241. .hw.init = &(struct clk_init_data){
  3242. .name = "vclk2_div4",
  3243. .ops = &clk_fixed_factor_ops,
  3244. .parent_hws = (const struct clk_hw *[]) {
  3245. &g12a_vclk2_div4_en.hw
  3246. },
  3247. .num_parents = 1,
  3248. },
  3249. };
  3250. static struct clk_fixed_factor g12a_vclk2_div6 = {
  3251. .mult = 1,
  3252. .div = 6,
  3253. .hw.init = &(struct clk_init_data){
  3254. .name = "vclk2_div6",
  3255. .ops = &clk_fixed_factor_ops,
  3256. .parent_hws = (const struct clk_hw *[]) {
  3257. &g12a_vclk2_div6_en.hw
  3258. },
  3259. .num_parents = 1,
  3260. },
  3261. };
  3262. static struct clk_fixed_factor g12a_vclk2_div12 = {
  3263. .mult = 1,
  3264. .div = 12,
  3265. .hw.init = &(struct clk_init_data){
  3266. .name = "vclk2_div12",
  3267. .ops = &clk_fixed_factor_ops,
  3268. .parent_hws = (const struct clk_hw *[]) {
  3269. &g12a_vclk2_div12_en.hw
  3270. },
  3271. .num_parents = 1,
  3272. },
  3273. };
  3274. static u32 mux_table_cts_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
  3275. static const struct clk_hw *g12a_cts_parent_hws[] = {
  3276. &g12a_vclk_div1.hw,
  3277. &g12a_vclk_div2.hw,
  3278. &g12a_vclk_div4.hw,
  3279. &g12a_vclk_div6.hw,
  3280. &g12a_vclk_div12.hw,
  3281. &g12a_vclk2_div1.hw,
  3282. &g12a_vclk2_div2.hw,
  3283. &g12a_vclk2_div4.hw,
  3284. &g12a_vclk2_div6.hw,
  3285. &g12a_vclk2_div12.hw,
  3286. };
  3287. static struct clk_regmap g12a_cts_enci_sel = {
  3288. .data = &(struct clk_regmap_mux_data){
  3289. .offset = HHI_VID_CLK_DIV,
  3290. .mask = 0xf,
  3291. .shift = 28,
  3292. .table = mux_table_cts_sel,
  3293. },
  3294. .hw.init = &(struct clk_init_data){
  3295. .name = "cts_enci_sel",
  3296. .ops = &clk_regmap_mux_ops,
  3297. .parent_hws = g12a_cts_parent_hws,
  3298. .num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
  3299. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  3300. },
  3301. };
  3302. static struct clk_regmap g12a_cts_encp_sel = {
  3303. .data = &(struct clk_regmap_mux_data){
  3304. .offset = HHI_VID_CLK_DIV,
  3305. .mask = 0xf,
  3306. .shift = 20,
  3307. .table = mux_table_cts_sel,
  3308. },
  3309. .hw.init = &(struct clk_init_data){
  3310. .name = "cts_encp_sel",
  3311. .ops = &clk_regmap_mux_ops,
  3312. .parent_hws = g12a_cts_parent_hws,
  3313. .num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
  3314. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  3315. },
  3316. };
  3317. static struct clk_regmap g12a_cts_vdac_sel = {
  3318. .data = &(struct clk_regmap_mux_data){
  3319. .offset = HHI_VIID_CLK_DIV,
  3320. .mask = 0xf,
  3321. .shift = 28,
  3322. .table = mux_table_cts_sel,
  3323. },
  3324. .hw.init = &(struct clk_init_data){
  3325. .name = "cts_vdac_sel",
  3326. .ops = &clk_regmap_mux_ops,
  3327. .parent_hws = g12a_cts_parent_hws,
  3328. .num_parents = ARRAY_SIZE(g12a_cts_parent_hws),
  3329. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  3330. },
  3331. };
  3332. /* TOFIX: add support for cts_tcon */
  3333. static u32 mux_table_hdmi_tx_sel[] = { 0, 1, 2, 3, 4, 8, 9, 10, 11, 12 };
  3334. static const struct clk_hw *g12a_cts_hdmi_tx_parent_hws[] = {
  3335. &g12a_vclk_div1.hw,
  3336. &g12a_vclk_div2.hw,
  3337. &g12a_vclk_div4.hw,
  3338. &g12a_vclk_div6.hw,
  3339. &g12a_vclk_div12.hw,
  3340. &g12a_vclk2_div1.hw,
  3341. &g12a_vclk2_div2.hw,
  3342. &g12a_vclk2_div4.hw,
  3343. &g12a_vclk2_div6.hw,
  3344. &g12a_vclk2_div12.hw,
  3345. };
  3346. static struct clk_regmap g12a_hdmi_tx_sel = {
  3347. .data = &(struct clk_regmap_mux_data){
  3348. .offset = HHI_HDMI_CLK_CNTL,
  3349. .mask = 0xf,
  3350. .shift = 16,
  3351. .table = mux_table_hdmi_tx_sel,
  3352. },
  3353. .hw.init = &(struct clk_init_data){
  3354. .name = "hdmi_tx_sel",
  3355. .ops = &clk_regmap_mux_ops,
  3356. .parent_hws = g12a_cts_hdmi_tx_parent_hws,
  3357. .num_parents = ARRAY_SIZE(g12a_cts_hdmi_tx_parent_hws),
  3358. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  3359. },
  3360. };
  3361. static struct clk_regmap g12a_cts_enci = {
  3362. .data = &(struct clk_regmap_gate_data){
  3363. .offset = HHI_VID_CLK_CNTL2,
  3364. .bit_idx = 0,
  3365. },
  3366. .hw.init = &(struct clk_init_data) {
  3367. .name = "cts_enci",
  3368. .ops = &clk_regmap_gate_ops,
  3369. .parent_hws = (const struct clk_hw *[]) {
  3370. &g12a_cts_enci_sel.hw
  3371. },
  3372. .num_parents = 1,
  3373. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3374. },
  3375. };
  3376. static struct clk_regmap g12a_cts_encp = {
  3377. .data = &(struct clk_regmap_gate_data){
  3378. .offset = HHI_VID_CLK_CNTL2,
  3379. .bit_idx = 2,
  3380. },
  3381. .hw.init = &(struct clk_init_data) {
  3382. .name = "cts_encp",
  3383. .ops = &clk_regmap_gate_ops,
  3384. .parent_hws = (const struct clk_hw *[]) {
  3385. &g12a_cts_encp_sel.hw
  3386. },
  3387. .num_parents = 1,
  3388. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3389. },
  3390. };
  3391. static struct clk_regmap g12a_cts_vdac = {
  3392. .data = &(struct clk_regmap_gate_data){
  3393. .offset = HHI_VID_CLK_CNTL2,
  3394. .bit_idx = 4,
  3395. },
  3396. .hw.init = &(struct clk_init_data) {
  3397. .name = "cts_vdac",
  3398. .ops = &clk_regmap_gate_ops,
  3399. .parent_hws = (const struct clk_hw *[]) {
  3400. &g12a_cts_vdac_sel.hw
  3401. },
  3402. .num_parents = 1,
  3403. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3404. },
  3405. };
  3406. static struct clk_regmap g12a_hdmi_tx = {
  3407. .data = &(struct clk_regmap_gate_data){
  3408. .offset = HHI_VID_CLK_CNTL2,
  3409. .bit_idx = 5,
  3410. },
  3411. .hw.init = &(struct clk_init_data) {
  3412. .name = "hdmi_tx",
  3413. .ops = &clk_regmap_gate_ops,
  3414. .parent_hws = (const struct clk_hw *[]) {
  3415. &g12a_hdmi_tx_sel.hw
  3416. },
  3417. .num_parents = 1,
  3418. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3419. },
  3420. };
  3421. /* MIPI DSI Host Clocks */
  3422. static const struct clk_hw *g12a_mipi_dsi_pxclk_parent_hws[] = {
  3423. &g12a_vid_pll.hw,
  3424. &g12a_gp0_pll.hw,
  3425. &g12a_hifi_pll.hw,
  3426. &g12a_mpll1.hw,
  3427. &g12a_fclk_div2.hw,
  3428. &g12a_fclk_div2p5.hw,
  3429. &g12a_fclk_div3.hw,
  3430. &g12a_fclk_div7.hw,
  3431. };
  3432. static struct clk_regmap g12a_mipi_dsi_pxclk_sel = {
  3433. .data = &(struct clk_regmap_mux_data){
  3434. .offset = HHI_MIPIDSI_PHY_CLK_CNTL,
  3435. .mask = 0x7,
  3436. .shift = 12,
  3437. .flags = CLK_MUX_ROUND_CLOSEST,
  3438. },
  3439. .hw.init = &(struct clk_init_data){
  3440. .name = "mipi_dsi_pxclk_sel",
  3441. .ops = &clk_regmap_mux_ops,
  3442. .parent_hws = g12a_mipi_dsi_pxclk_parent_hws,
  3443. .num_parents = ARRAY_SIZE(g12a_mipi_dsi_pxclk_parent_hws),
  3444. .flags = CLK_SET_RATE_NO_REPARENT,
  3445. },
  3446. };
  3447. static struct clk_regmap g12a_mipi_dsi_pxclk_div = {
  3448. .data = &(struct clk_regmap_div_data){
  3449. .offset = HHI_MIPIDSI_PHY_CLK_CNTL,
  3450. .shift = 0,
  3451. .width = 7,
  3452. },
  3453. .hw.init = &(struct clk_init_data){
  3454. .name = "mipi_dsi_pxclk_div",
  3455. .ops = &clk_regmap_divider_ops,
  3456. .parent_hws = (const struct clk_hw *[]) {
  3457. &g12a_mipi_dsi_pxclk_sel.hw
  3458. },
  3459. .num_parents = 1,
  3460. .flags = CLK_SET_RATE_PARENT,
  3461. },
  3462. };
  3463. static struct clk_regmap g12a_mipi_dsi_pxclk = {
  3464. .data = &(struct clk_regmap_gate_data){
  3465. .offset = HHI_MIPIDSI_PHY_CLK_CNTL,
  3466. .bit_idx = 8,
  3467. },
  3468. .hw.init = &(struct clk_init_data) {
  3469. .name = "mipi_dsi_pxclk",
  3470. .ops = &clk_regmap_gate_ops,
  3471. .parent_hws = (const struct clk_hw *[]) {
  3472. &g12a_mipi_dsi_pxclk_div.hw
  3473. },
  3474. .num_parents = 1,
  3475. .flags = CLK_SET_RATE_PARENT,
  3476. },
  3477. };
  3478. /* HDMI Clocks */
  3479. static const struct clk_parent_data g12a_hdmi_parent_data[] = {
  3480. { .fw_name = "xtal", },
  3481. { .hw = &g12a_fclk_div4.hw },
  3482. { .hw = &g12a_fclk_div3.hw },
  3483. { .hw = &g12a_fclk_div5.hw },
  3484. };
  3485. static struct clk_regmap g12a_hdmi_sel = {
  3486. .data = &(struct clk_regmap_mux_data){
  3487. .offset = HHI_HDMI_CLK_CNTL,
  3488. .mask = 0x3,
  3489. .shift = 9,
  3490. .flags = CLK_MUX_ROUND_CLOSEST,
  3491. },
  3492. .hw.init = &(struct clk_init_data){
  3493. .name = "hdmi_sel",
  3494. .ops = &clk_regmap_mux_ops,
  3495. .parent_data = g12a_hdmi_parent_data,
  3496. .num_parents = ARRAY_SIZE(g12a_hdmi_parent_data),
  3497. .flags = CLK_SET_RATE_NO_REPARENT | CLK_GET_RATE_NOCACHE,
  3498. },
  3499. };
  3500. static struct clk_regmap g12a_hdmi_div = {
  3501. .data = &(struct clk_regmap_div_data){
  3502. .offset = HHI_HDMI_CLK_CNTL,
  3503. .shift = 0,
  3504. .width = 7,
  3505. },
  3506. .hw.init = &(struct clk_init_data){
  3507. .name = "hdmi_div",
  3508. .ops = &clk_regmap_divider_ops,
  3509. .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_sel.hw },
  3510. .num_parents = 1,
  3511. .flags = CLK_GET_RATE_NOCACHE,
  3512. },
  3513. };
  3514. static struct clk_regmap g12a_hdmi = {
  3515. .data = &(struct clk_regmap_gate_data){
  3516. .offset = HHI_HDMI_CLK_CNTL,
  3517. .bit_idx = 8,
  3518. },
  3519. .hw.init = &(struct clk_init_data) {
  3520. .name = "hdmi",
  3521. .ops = &clk_regmap_gate_ops,
  3522. .parent_hws = (const struct clk_hw *[]) { &g12a_hdmi_div.hw },
  3523. .num_parents = 1,
  3524. .flags = CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  3525. },
  3526. };
  3527. /*
  3528. * The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
  3529. * muxed by a glitch-free switch. The CCF can manage this glitch-free
  3530. * mux because it does top-to-bottom updates the each clock tree and
  3531. * switches to the "inactive" one when CLK_SET_RATE_GATE is set.
  3532. */
  3533. static const struct clk_parent_data g12a_mali_0_1_parent_data[] = {
  3534. { .fw_name = "xtal", },
  3535. { .hw = &g12a_gp0_pll.hw },
  3536. { .hw = &g12a_hifi_pll.hw },
  3537. { .hw = &g12a_fclk_div2p5.hw },
  3538. { .hw = &g12a_fclk_div3.hw },
  3539. { .hw = &g12a_fclk_div4.hw },
  3540. { .hw = &g12a_fclk_div5.hw },
  3541. { .hw = &g12a_fclk_div7.hw },
  3542. };
  3543. static struct clk_regmap g12a_mali_0_sel = {
  3544. .data = &(struct clk_regmap_mux_data){
  3545. .offset = HHI_MALI_CLK_CNTL,
  3546. .mask = 0x7,
  3547. .shift = 9,
  3548. },
  3549. .hw.init = &(struct clk_init_data){
  3550. .name = "mali_0_sel",
  3551. .ops = &clk_regmap_mux_ops,
  3552. .parent_data = g12a_mali_0_1_parent_data,
  3553. .num_parents = 8,
  3554. /*
  3555. * Don't request the parent to change the rate because
  3556. * all GPU frequencies can be derived from the fclk_*
  3557. * clocks and one special GP0_PLL setting. This is
  3558. * important because we need the MPLL clocks for audio.
  3559. */
  3560. .flags = 0,
  3561. },
  3562. };
  3563. static struct clk_regmap g12a_mali_0_div = {
  3564. .data = &(struct clk_regmap_div_data){
  3565. .offset = HHI_MALI_CLK_CNTL,
  3566. .shift = 0,
  3567. .width = 7,
  3568. },
  3569. .hw.init = &(struct clk_init_data){
  3570. .name = "mali_0_div",
  3571. .ops = &clk_regmap_divider_ops,
  3572. .parent_hws = (const struct clk_hw *[]) {
  3573. &g12a_mali_0_sel.hw
  3574. },
  3575. .num_parents = 1,
  3576. .flags = CLK_SET_RATE_PARENT,
  3577. },
  3578. };
  3579. static struct clk_regmap g12a_mali_0 = {
  3580. .data = &(struct clk_regmap_gate_data){
  3581. .offset = HHI_MALI_CLK_CNTL,
  3582. .bit_idx = 8,
  3583. },
  3584. .hw.init = &(struct clk_init_data){
  3585. .name = "mali_0",
  3586. .ops = &clk_regmap_gate_ops,
  3587. .parent_hws = (const struct clk_hw *[]) {
  3588. &g12a_mali_0_div.hw
  3589. },
  3590. .num_parents = 1,
  3591. .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
  3592. },
  3593. };
  3594. static struct clk_regmap g12a_mali_1_sel = {
  3595. .data = &(struct clk_regmap_mux_data){
  3596. .offset = HHI_MALI_CLK_CNTL,
  3597. .mask = 0x7,
  3598. .shift = 25,
  3599. },
  3600. .hw.init = &(struct clk_init_data){
  3601. .name = "mali_1_sel",
  3602. .ops = &clk_regmap_mux_ops,
  3603. .parent_data = g12a_mali_0_1_parent_data,
  3604. .num_parents = 8,
  3605. /*
  3606. * Don't request the parent to change the rate because
  3607. * all GPU frequencies can be derived from the fclk_*
  3608. * clocks and one special GP0_PLL setting. This is
  3609. * important because we need the MPLL clocks for audio.
  3610. */
  3611. .flags = 0,
  3612. },
  3613. };
  3614. static struct clk_regmap g12a_mali_1_div = {
  3615. .data = &(struct clk_regmap_div_data){
  3616. .offset = HHI_MALI_CLK_CNTL,
  3617. .shift = 16,
  3618. .width = 7,
  3619. },
  3620. .hw.init = &(struct clk_init_data){
  3621. .name = "mali_1_div",
  3622. .ops = &clk_regmap_divider_ops,
  3623. .parent_hws = (const struct clk_hw *[]) {
  3624. &g12a_mali_1_sel.hw
  3625. },
  3626. .num_parents = 1,
  3627. .flags = CLK_SET_RATE_PARENT,
  3628. },
  3629. };
  3630. static struct clk_regmap g12a_mali_1 = {
  3631. .data = &(struct clk_regmap_gate_data){
  3632. .offset = HHI_MALI_CLK_CNTL,
  3633. .bit_idx = 24,
  3634. },
  3635. .hw.init = &(struct clk_init_data){
  3636. .name = "mali_1",
  3637. .ops = &clk_regmap_gate_ops,
  3638. .parent_hws = (const struct clk_hw *[]) {
  3639. &g12a_mali_1_div.hw
  3640. },
  3641. .num_parents = 1,
  3642. .flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
  3643. },
  3644. };
  3645. static const struct clk_hw *g12a_mali_parent_hws[] = {
  3646. &g12a_mali_0.hw,
  3647. &g12a_mali_1.hw,
  3648. };
  3649. static struct clk_regmap g12a_mali = {
  3650. .data = &(struct clk_regmap_mux_data){
  3651. .offset = HHI_MALI_CLK_CNTL,
  3652. .mask = 1,
  3653. .shift = 31,
  3654. },
  3655. .hw.init = &(struct clk_init_data){
  3656. .name = "mali",
  3657. .ops = &clk_regmap_mux_ops,
  3658. .parent_hws = g12a_mali_parent_hws,
  3659. .num_parents = 2,
  3660. .flags = CLK_SET_RATE_PARENT,
  3661. },
  3662. };
  3663. static struct clk_regmap g12a_ts_div = {
  3664. .data = &(struct clk_regmap_div_data){
  3665. .offset = HHI_TS_CLK_CNTL,
  3666. .shift = 0,
  3667. .width = 8,
  3668. },
  3669. .hw.init = &(struct clk_init_data){
  3670. .name = "ts_div",
  3671. .ops = &clk_regmap_divider_ro_ops,
  3672. .parent_data = &(const struct clk_parent_data) {
  3673. .fw_name = "xtal",
  3674. },
  3675. .num_parents = 1,
  3676. },
  3677. };
  3678. static struct clk_regmap g12a_ts = {
  3679. .data = &(struct clk_regmap_gate_data){
  3680. .offset = HHI_TS_CLK_CNTL,
  3681. .bit_idx = 8,
  3682. },
  3683. .hw.init = &(struct clk_init_data){
  3684. .name = "ts",
  3685. .ops = &clk_regmap_gate_ops,
  3686. .parent_hws = (const struct clk_hw *[]) {
  3687. &g12a_ts_div.hw
  3688. },
  3689. .num_parents = 1,
  3690. },
  3691. };
  3692. /* SPICC SCLK source clock */
  3693. static const struct clk_parent_data spicc_sclk_parent_data[] = {
  3694. { .fw_name = "xtal", },
  3695. { .hw = &g12a_clk81.hw },
  3696. { .hw = &g12a_fclk_div4.hw },
  3697. { .hw = &g12a_fclk_div3.hw },
  3698. { .hw = &g12a_fclk_div5.hw },
  3699. { .hw = &g12a_fclk_div7.hw },
  3700. };
  3701. static struct clk_regmap g12a_spicc0_sclk_sel = {
  3702. .data = &(struct clk_regmap_mux_data){
  3703. .offset = HHI_SPICC_CLK_CNTL,
  3704. .mask = 7,
  3705. .shift = 7,
  3706. },
  3707. .hw.init = &(struct clk_init_data){
  3708. .name = "spicc0_sclk_sel",
  3709. .ops = &clk_regmap_mux_ops,
  3710. .parent_data = spicc_sclk_parent_data,
  3711. .num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
  3712. },
  3713. };
  3714. static struct clk_regmap g12a_spicc0_sclk_div = {
  3715. .data = &(struct clk_regmap_div_data){
  3716. .offset = HHI_SPICC_CLK_CNTL,
  3717. .shift = 0,
  3718. .width = 6,
  3719. },
  3720. .hw.init = &(struct clk_init_data){
  3721. .name = "spicc0_sclk_div",
  3722. .ops = &clk_regmap_divider_ops,
  3723. .parent_hws = (const struct clk_hw *[]) {
  3724. &g12a_spicc0_sclk_sel.hw
  3725. },
  3726. .num_parents = 1,
  3727. .flags = CLK_SET_RATE_PARENT,
  3728. },
  3729. };
  3730. static struct clk_regmap g12a_spicc0_sclk = {
  3731. .data = &(struct clk_regmap_gate_data){
  3732. .offset = HHI_SPICC_CLK_CNTL,
  3733. .bit_idx = 6,
  3734. },
  3735. .hw.init = &(struct clk_init_data){
  3736. .name = "spicc0_sclk",
  3737. .ops = &clk_regmap_gate_ops,
  3738. .parent_hws = (const struct clk_hw *[]) {
  3739. &g12a_spicc0_sclk_div.hw
  3740. },
  3741. .num_parents = 1,
  3742. .flags = CLK_SET_RATE_PARENT,
  3743. },
  3744. };
  3745. static struct clk_regmap g12a_spicc1_sclk_sel = {
  3746. .data = &(struct clk_regmap_mux_data){
  3747. .offset = HHI_SPICC_CLK_CNTL,
  3748. .mask = 7,
  3749. .shift = 23,
  3750. },
  3751. .hw.init = &(struct clk_init_data){
  3752. .name = "spicc1_sclk_sel",
  3753. .ops = &clk_regmap_mux_ops,
  3754. .parent_data = spicc_sclk_parent_data,
  3755. .num_parents = ARRAY_SIZE(spicc_sclk_parent_data),
  3756. },
  3757. };
  3758. static struct clk_regmap g12a_spicc1_sclk_div = {
  3759. .data = &(struct clk_regmap_div_data){
  3760. .offset = HHI_SPICC_CLK_CNTL,
  3761. .shift = 16,
  3762. .width = 6,
  3763. },
  3764. .hw.init = &(struct clk_init_data){
  3765. .name = "spicc1_sclk_div",
  3766. .ops = &clk_regmap_divider_ops,
  3767. .parent_hws = (const struct clk_hw *[]) {
  3768. &g12a_spicc1_sclk_sel.hw
  3769. },
  3770. .num_parents = 1,
  3771. .flags = CLK_SET_RATE_PARENT,
  3772. },
  3773. };
  3774. static struct clk_regmap g12a_spicc1_sclk = {
  3775. .data = &(struct clk_regmap_gate_data){
  3776. .offset = HHI_SPICC_CLK_CNTL,
  3777. .bit_idx = 22,
  3778. },
  3779. .hw.init = &(struct clk_init_data){
  3780. .name = "spicc1_sclk",
  3781. .ops = &clk_regmap_gate_ops,
  3782. .parent_hws = (const struct clk_hw *[]) {
  3783. &g12a_spicc1_sclk_div.hw
  3784. },
  3785. .num_parents = 1,
  3786. .flags = CLK_SET_RATE_PARENT,
  3787. },
  3788. };
  3789. /* Neural Network Accelerator source clock */
  3790. static const struct clk_parent_data nna_clk_parent_data[] = {
  3791. { .fw_name = "xtal", },
  3792. { .hw = &g12a_gp0_pll.hw, },
  3793. { .hw = &g12a_hifi_pll.hw, },
  3794. { .hw = &g12a_fclk_div2p5.hw, },
  3795. { .hw = &g12a_fclk_div3.hw, },
  3796. { .hw = &g12a_fclk_div4.hw, },
  3797. { .hw = &g12a_fclk_div5.hw, },
  3798. { .hw = &g12a_fclk_div7.hw },
  3799. };
  3800. static struct clk_regmap sm1_nna_axi_clk_sel = {
  3801. .data = &(struct clk_regmap_mux_data){
  3802. .offset = HHI_NNA_CLK_CNTL,
  3803. .mask = 7,
  3804. .shift = 9,
  3805. },
  3806. .hw.init = &(struct clk_init_data){
  3807. .name = "nna_axi_clk_sel",
  3808. .ops = &clk_regmap_mux_ops,
  3809. .parent_data = nna_clk_parent_data,
  3810. .num_parents = ARRAY_SIZE(nna_clk_parent_data),
  3811. },
  3812. };
  3813. static struct clk_regmap sm1_nna_axi_clk_div = {
  3814. .data = &(struct clk_regmap_div_data){
  3815. .offset = HHI_NNA_CLK_CNTL,
  3816. .shift = 0,
  3817. .width = 7,
  3818. },
  3819. .hw.init = &(struct clk_init_data){
  3820. .name = "nna_axi_clk_div",
  3821. .ops = &clk_regmap_divider_ops,
  3822. .parent_hws = (const struct clk_hw *[]) {
  3823. &sm1_nna_axi_clk_sel.hw
  3824. },
  3825. .num_parents = 1,
  3826. .flags = CLK_SET_RATE_PARENT,
  3827. },
  3828. };
  3829. static struct clk_regmap sm1_nna_axi_clk = {
  3830. .data = &(struct clk_regmap_gate_data){
  3831. .offset = HHI_NNA_CLK_CNTL,
  3832. .bit_idx = 8,
  3833. },
  3834. .hw.init = &(struct clk_init_data){
  3835. .name = "nna_axi_clk",
  3836. .ops = &clk_regmap_gate_ops,
  3837. .parent_hws = (const struct clk_hw *[]) {
  3838. &sm1_nna_axi_clk_div.hw
  3839. },
  3840. .num_parents = 1,
  3841. .flags = CLK_SET_RATE_PARENT,
  3842. },
  3843. };
  3844. static struct clk_regmap sm1_nna_core_clk_sel = {
  3845. .data = &(struct clk_regmap_mux_data){
  3846. .offset = HHI_NNA_CLK_CNTL,
  3847. .mask = 7,
  3848. .shift = 25,
  3849. },
  3850. .hw.init = &(struct clk_init_data){
  3851. .name = "nna_core_clk_sel",
  3852. .ops = &clk_regmap_mux_ops,
  3853. .parent_data = nna_clk_parent_data,
  3854. .num_parents = ARRAY_SIZE(nna_clk_parent_data),
  3855. },
  3856. };
  3857. static struct clk_regmap sm1_nna_core_clk_div = {
  3858. .data = &(struct clk_regmap_div_data){
  3859. .offset = HHI_NNA_CLK_CNTL,
  3860. .shift = 16,
  3861. .width = 7,
  3862. },
  3863. .hw.init = &(struct clk_init_data){
  3864. .name = "nna_core_clk_div",
  3865. .ops = &clk_regmap_divider_ops,
  3866. .parent_hws = (const struct clk_hw *[]) {
  3867. &sm1_nna_core_clk_sel.hw
  3868. },
  3869. .num_parents = 1,
  3870. .flags = CLK_SET_RATE_PARENT,
  3871. },
  3872. };
  3873. static struct clk_regmap sm1_nna_core_clk = {
  3874. .data = &(struct clk_regmap_gate_data){
  3875. .offset = HHI_NNA_CLK_CNTL,
  3876. .bit_idx = 24,
  3877. },
  3878. .hw.init = &(struct clk_init_data){
  3879. .name = "nna_core_clk",
  3880. .ops = &clk_regmap_gate_ops,
  3881. .parent_hws = (const struct clk_hw *[]) {
  3882. &sm1_nna_core_clk_div.hw
  3883. },
  3884. .num_parents = 1,
  3885. .flags = CLK_SET_RATE_PARENT,
  3886. },
  3887. };
  3888. #define MESON_GATE(_name, _reg, _bit) \
  3889. MESON_PCLK(_name, _reg, _bit, &g12a_clk81.hw)
  3890. #define MESON_GATE_RO(_name, _reg, _bit) \
  3891. MESON_PCLK_RO(_name, _reg, _bit, &g12a_clk81.hw)
  3892. /* Everything Else (EE) domain gates */
  3893. static MESON_GATE(g12a_ddr, HHI_GCLK_MPEG0, 0);
  3894. static MESON_GATE(g12a_dos, HHI_GCLK_MPEG0, 1);
  3895. static MESON_GATE(g12a_audio_locker, HHI_GCLK_MPEG0, 2);
  3896. static MESON_GATE(g12a_mipi_dsi_host, HHI_GCLK_MPEG0, 3);
  3897. static MESON_GATE(g12a_eth_phy, HHI_GCLK_MPEG0, 4);
  3898. static MESON_GATE(g12a_isa, HHI_GCLK_MPEG0, 5);
  3899. static MESON_GATE(g12a_pl301, HHI_GCLK_MPEG0, 6);
  3900. static MESON_GATE(g12a_periphs, HHI_GCLK_MPEG0, 7);
  3901. static MESON_GATE(g12a_spicc_0, HHI_GCLK_MPEG0, 8);
  3902. static MESON_GATE(g12a_i2c, HHI_GCLK_MPEG0, 9);
  3903. static MESON_GATE(g12a_sana, HHI_GCLK_MPEG0, 10);
  3904. static MESON_GATE(g12a_sd, HHI_GCLK_MPEG0, 11);
  3905. static MESON_GATE(g12a_rng0, HHI_GCLK_MPEG0, 12);
  3906. static MESON_GATE(g12a_uart0, HHI_GCLK_MPEG0, 13);
  3907. static MESON_GATE(g12a_spicc_1, HHI_GCLK_MPEG0, 14);
  3908. static MESON_GATE(g12a_hiu_reg, HHI_GCLK_MPEG0, 19);
  3909. static MESON_GATE(g12a_mipi_dsi_phy, HHI_GCLK_MPEG0, 20);
  3910. static MESON_GATE(g12a_assist_misc, HHI_GCLK_MPEG0, 23);
  3911. static MESON_GATE(g12a_emmc_a, HHI_GCLK_MPEG0, 4);
  3912. static MESON_GATE(g12a_emmc_b, HHI_GCLK_MPEG0, 25);
  3913. static MESON_GATE(g12a_emmc_c, HHI_GCLK_MPEG0, 26);
  3914. static MESON_GATE(g12a_audio_codec, HHI_GCLK_MPEG0, 28);
  3915. static MESON_GATE(g12a_audio, HHI_GCLK_MPEG1, 0);
  3916. static MESON_GATE(g12a_eth_core, HHI_GCLK_MPEG1, 3);
  3917. static MESON_GATE(g12a_demux, HHI_GCLK_MPEG1, 4);
  3918. static MESON_GATE(g12a_audio_ififo, HHI_GCLK_MPEG1, 11);
  3919. static MESON_GATE(g12a_adc, HHI_GCLK_MPEG1, 13);
  3920. static MESON_GATE(g12a_uart1, HHI_GCLK_MPEG1, 16);
  3921. static MESON_GATE(g12a_g2d, HHI_GCLK_MPEG1, 20);
  3922. static MESON_GATE(g12a_reset, HHI_GCLK_MPEG1, 23);
  3923. static MESON_GATE(g12a_pcie_comb, HHI_GCLK_MPEG1, 24);
  3924. static MESON_GATE(g12a_parser, HHI_GCLK_MPEG1, 25);
  3925. static MESON_GATE(g12a_usb_general, HHI_GCLK_MPEG1, 26);
  3926. static MESON_GATE(g12a_pcie_phy, HHI_GCLK_MPEG1, 27);
  3927. static MESON_GATE(g12a_ahb_arb0, HHI_GCLK_MPEG1, 29);
  3928. static MESON_GATE(g12a_ahb_data_bus, HHI_GCLK_MPEG2, 1);
  3929. static MESON_GATE(g12a_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
  3930. static MESON_GATE(g12a_htx_hdcp22, HHI_GCLK_MPEG2, 3);
  3931. static MESON_GATE(g12a_htx_pclk, HHI_GCLK_MPEG2, 4);
  3932. static MESON_GATE(g12a_bt656, HHI_GCLK_MPEG2, 6);
  3933. static MESON_GATE(g12a_usb1_to_ddr, HHI_GCLK_MPEG2, 8);
  3934. static MESON_GATE(g12a_mmc_pclk, HHI_GCLK_MPEG2, 11);
  3935. static MESON_GATE(g12a_uart2, HHI_GCLK_MPEG2, 15);
  3936. static MESON_GATE(g12a_vpu_intr, HHI_GCLK_MPEG2, 25);
  3937. static MESON_GATE(g12a_gic, HHI_GCLK_MPEG2, 30);
  3938. static MESON_GATE(g12a_vclk2_venci0, HHI_GCLK_OTHER, 1);
  3939. static MESON_GATE(g12a_vclk2_venci1, HHI_GCLK_OTHER, 2);
  3940. static MESON_GATE(g12a_vclk2_vencp0, HHI_GCLK_OTHER, 3);
  3941. static MESON_GATE(g12a_vclk2_vencp1, HHI_GCLK_OTHER, 4);
  3942. static MESON_GATE(g12a_vclk2_venct0, HHI_GCLK_OTHER, 5);
  3943. static MESON_GATE(g12a_vclk2_venct1, HHI_GCLK_OTHER, 6);
  3944. static MESON_GATE(g12a_vclk2_other, HHI_GCLK_OTHER, 7);
  3945. static MESON_GATE(g12a_vclk2_enci, HHI_GCLK_OTHER, 8);
  3946. static MESON_GATE(g12a_vclk2_encp, HHI_GCLK_OTHER, 9);
  3947. static MESON_GATE(g12a_dac_clk, HHI_GCLK_OTHER, 10);
  3948. static MESON_GATE(g12a_aoclk_gate, HHI_GCLK_OTHER, 14);
  3949. static MESON_GATE(g12a_iec958_gate, HHI_GCLK_OTHER, 16);
  3950. static MESON_GATE(g12a_enc480p, HHI_GCLK_OTHER, 20);
  3951. static MESON_GATE(g12a_rng1, HHI_GCLK_OTHER, 21);
  3952. static MESON_GATE(g12a_vclk2_enct, HHI_GCLK_OTHER, 22);
  3953. static MESON_GATE(g12a_vclk2_encl, HHI_GCLK_OTHER, 23);
  3954. static MESON_GATE(g12a_vclk2_venclmmc, HHI_GCLK_OTHER, 24);
  3955. static MESON_GATE(g12a_vclk2_vencl, HHI_GCLK_OTHER, 25);
  3956. static MESON_GATE(g12a_vclk2_other1, HHI_GCLK_OTHER, 26);
  3957. static MESON_GATE_RO(g12a_dma, HHI_GCLK_OTHER2, 0);
  3958. static MESON_GATE_RO(g12a_efuse, HHI_GCLK_OTHER2, 1);
  3959. static MESON_GATE_RO(g12a_rom_boot, HHI_GCLK_OTHER2, 2);
  3960. static MESON_GATE_RO(g12a_reset_sec, HHI_GCLK_OTHER2, 3);
  3961. static MESON_GATE_RO(g12a_sec_ahb_apb3, HHI_GCLK_OTHER2, 4);
  3962. /* Array of all clocks provided by this provider */
  3963. static struct clk_hw_onecell_data g12a_hw_onecell_data = {
  3964. .hws = {
  3965. [CLKID_SYS_PLL] = &g12a_sys_pll.hw,
  3966. [CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
  3967. [CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
  3968. [CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw,
  3969. [CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw,
  3970. [CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw,
  3971. [CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw,
  3972. [CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw,
  3973. [CLKID_GP0_PLL] = &g12a_gp0_pll.hw,
  3974. [CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw,
  3975. [CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw,
  3976. [CLKID_CLK81] = &g12a_clk81.hw,
  3977. [CLKID_MPLL0] = &g12a_mpll0.hw,
  3978. [CLKID_MPLL1] = &g12a_mpll1.hw,
  3979. [CLKID_MPLL2] = &g12a_mpll2.hw,
  3980. [CLKID_MPLL3] = &g12a_mpll3.hw,
  3981. [CLKID_DDR] = &g12a_ddr.hw,
  3982. [CLKID_DOS] = &g12a_dos.hw,
  3983. [CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw,
  3984. [CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw,
  3985. [CLKID_ETH_PHY] = &g12a_eth_phy.hw,
  3986. [CLKID_ISA] = &g12a_isa.hw,
  3987. [CLKID_PL301] = &g12a_pl301.hw,
  3988. [CLKID_PERIPHS] = &g12a_periphs.hw,
  3989. [CLKID_SPICC0] = &g12a_spicc_0.hw,
  3990. [CLKID_I2C] = &g12a_i2c.hw,
  3991. [CLKID_SANA] = &g12a_sana.hw,
  3992. [CLKID_SD] = &g12a_sd.hw,
  3993. [CLKID_RNG0] = &g12a_rng0.hw,
  3994. [CLKID_UART0] = &g12a_uart0.hw,
  3995. [CLKID_SPICC1] = &g12a_spicc_1.hw,
  3996. [CLKID_HIU_IFACE] = &g12a_hiu_reg.hw,
  3997. [CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw,
  3998. [CLKID_ASSIST_MISC] = &g12a_assist_misc.hw,
  3999. [CLKID_SD_EMMC_A] = &g12a_emmc_a.hw,
  4000. [CLKID_SD_EMMC_B] = &g12a_emmc_b.hw,
  4001. [CLKID_SD_EMMC_C] = &g12a_emmc_c.hw,
  4002. [CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw,
  4003. [CLKID_AUDIO] = &g12a_audio.hw,
  4004. [CLKID_ETH] = &g12a_eth_core.hw,
  4005. [CLKID_DEMUX] = &g12a_demux.hw,
  4006. [CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw,
  4007. [CLKID_ADC] = &g12a_adc.hw,
  4008. [CLKID_UART1] = &g12a_uart1.hw,
  4009. [CLKID_G2D] = &g12a_g2d.hw,
  4010. [CLKID_RESET] = &g12a_reset.hw,
  4011. [CLKID_PCIE_COMB] = &g12a_pcie_comb.hw,
  4012. [CLKID_PARSER] = &g12a_parser.hw,
  4013. [CLKID_USB] = &g12a_usb_general.hw,
  4014. [CLKID_PCIE_PHY] = &g12a_pcie_phy.hw,
  4015. [CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw,
  4016. [CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw,
  4017. [CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw,
  4018. [CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw,
  4019. [CLKID_HTX_PCLK] = &g12a_htx_pclk.hw,
  4020. [CLKID_BT656] = &g12a_bt656.hw,
  4021. [CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw,
  4022. [CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw,
  4023. [CLKID_UART2] = &g12a_uart2.hw,
  4024. [CLKID_VPU_INTR] = &g12a_vpu_intr.hw,
  4025. [CLKID_GIC] = &g12a_gic.hw,
  4026. [CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw,
  4027. [CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw,
  4028. [CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw,
  4029. [CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw,
  4030. [CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw,
  4031. [CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw,
  4032. [CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw,
  4033. [CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw,
  4034. [CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw,
  4035. [CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw,
  4036. [CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw,
  4037. [CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw,
  4038. [CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw,
  4039. [CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw,
  4040. [CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw,
  4041. [CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw,
  4042. [CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw,
  4043. [CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw,
  4044. [CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw,
  4045. [CLKID_HIFI_PLL] = &g12a_hifi_pll.hw,
  4046. [CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw,
  4047. [CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw,
  4048. [CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw,
  4049. [CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw,
  4050. [CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw,
  4051. [CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw,
  4052. [CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw,
  4053. [CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw,
  4054. [CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw,
  4055. [CLKID_DAC_CLK] = &g12a_dac_clk.hw,
  4056. [CLKID_AOCLK] = &g12a_aoclk_gate.hw,
  4057. [CLKID_IEC958] = &g12a_iec958_gate.hw,
  4058. [CLKID_ENC480P] = &g12a_enc480p.hw,
  4059. [CLKID_RNG1] = &g12a_rng1.hw,
  4060. [CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw,
  4061. [CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw,
  4062. [CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw,
  4063. [CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw,
  4064. [CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw,
  4065. [CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw,
  4066. [CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw,
  4067. [CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw,
  4068. [CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw,
  4069. [CLKID_DMA] = &g12a_dma.hw,
  4070. [CLKID_EFUSE] = &g12a_efuse.hw,
  4071. [CLKID_ROM_BOOT] = &g12a_rom_boot.hw,
  4072. [CLKID_RESET_SEC] = &g12a_reset_sec.hw,
  4073. [CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw,
  4074. [CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw,
  4075. [CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw,
  4076. [CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw,
  4077. [CLKID_VPU_0] = &g12a_vpu_0.hw,
  4078. [CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw,
  4079. [CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw,
  4080. [CLKID_VPU_1] = &g12a_vpu_1.hw,
  4081. [CLKID_VPU] = &g12a_vpu.hw,
  4082. [CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw,
  4083. [CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw,
  4084. [CLKID_VAPB_0] = &g12a_vapb_0.hw,
  4085. [CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw,
  4086. [CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw,
  4087. [CLKID_VAPB_1] = &g12a_vapb_1.hw,
  4088. [CLKID_VAPB_SEL] = &g12a_vapb_sel.hw,
  4089. [CLKID_VAPB] = &g12a_vapb.hw,
  4090. [CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw,
  4091. [CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw,
  4092. [CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw,
  4093. [CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw,
  4094. [CLKID_VID_PLL] = &g12a_vid_pll_div.hw,
  4095. [CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw,
  4096. [CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw,
  4097. [CLKID_VCLK_SEL] = &g12a_vclk_sel.hw,
  4098. [CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw,
  4099. [CLKID_VCLK_INPUT] = &g12a_vclk_input.hw,
  4100. [CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw,
  4101. [CLKID_VCLK_DIV] = &g12a_vclk_div.hw,
  4102. [CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw,
  4103. [CLKID_VCLK] = &g12a_vclk.hw,
  4104. [CLKID_VCLK2] = &g12a_vclk2.hw,
  4105. [CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw,
  4106. [CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw,
  4107. [CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw,
  4108. [CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw,
  4109. [CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw,
  4110. [CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw,
  4111. [CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw,
  4112. [CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw,
  4113. [CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw,
  4114. [CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw,
  4115. [CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw,
  4116. [CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw,
  4117. [CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw,
  4118. [CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw,
  4119. [CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw,
  4120. [CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw,
  4121. [CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw,
  4122. [CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
  4123. [CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
  4124. [CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
  4125. [CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
  4126. [CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
  4127. [CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
  4128. [CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
  4129. [CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
  4130. [CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
  4131. [CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
  4132. [CLKID_HDMI_DIV] = &g12a_hdmi_div.hw,
  4133. [CLKID_HDMI] = &g12a_hdmi.hw,
  4134. [CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw,
  4135. [CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw,
  4136. [CLKID_MALI_0] = &g12a_mali_0.hw,
  4137. [CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw,
  4138. [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw,
  4139. [CLKID_MALI_1] = &g12a_mali_1.hw,
  4140. [CLKID_MALI] = &g12a_mali.hw,
  4141. [CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
  4142. [CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
  4143. [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
  4144. [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
  4145. [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
  4146. [CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw,
  4147. [CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw,
  4148. [CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw,
  4149. [CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw,
  4150. [CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw,
  4151. [CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw,
  4152. [CLKID_CPU_CLK] = &g12a_cpu_clk.hw,
  4153. [CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw,
  4154. [CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw,
  4155. [CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw,
  4156. [CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw,
  4157. [CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw,
  4158. [CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw,
  4159. [CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw,
  4160. [CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw,
  4161. [CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw,
  4162. [CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw,
  4163. [CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw,
  4164. [CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw,
  4165. [CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw,
  4166. [CLKID_PCIE_PLL] = &g12a_pcie_pll.hw,
  4167. [CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw,
  4168. [CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw,
  4169. [CLKID_VDEC_1] = &g12a_vdec_1.hw,
  4170. [CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw,
  4171. [CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw,
  4172. [CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw,
  4173. [CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw,
  4174. [CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw,
  4175. [CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw,
  4176. [CLKID_TS_DIV] = &g12a_ts_div.hw,
  4177. [CLKID_TS] = &g12a_ts.hw,
  4178. [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw,
  4179. [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw,
  4180. [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw,
  4181. [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
  4182. [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
  4183. [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
  4184. [CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
  4185. [CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
  4186. [CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
  4187. [NR_CLKS] = NULL,
  4188. },
  4189. .num = NR_CLKS,
  4190. };
  4191. static struct clk_hw_onecell_data g12b_hw_onecell_data = {
  4192. .hws = {
  4193. [CLKID_SYS_PLL] = &g12a_sys_pll.hw,
  4194. [CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
  4195. [CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
  4196. [CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw,
  4197. [CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw,
  4198. [CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw,
  4199. [CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw,
  4200. [CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw,
  4201. [CLKID_GP0_PLL] = &g12a_gp0_pll.hw,
  4202. [CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw,
  4203. [CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw,
  4204. [CLKID_CLK81] = &g12a_clk81.hw,
  4205. [CLKID_MPLL0] = &g12a_mpll0.hw,
  4206. [CLKID_MPLL1] = &g12a_mpll1.hw,
  4207. [CLKID_MPLL2] = &g12a_mpll2.hw,
  4208. [CLKID_MPLL3] = &g12a_mpll3.hw,
  4209. [CLKID_DDR] = &g12a_ddr.hw,
  4210. [CLKID_DOS] = &g12a_dos.hw,
  4211. [CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw,
  4212. [CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw,
  4213. [CLKID_ETH_PHY] = &g12a_eth_phy.hw,
  4214. [CLKID_ISA] = &g12a_isa.hw,
  4215. [CLKID_PL301] = &g12a_pl301.hw,
  4216. [CLKID_PERIPHS] = &g12a_periphs.hw,
  4217. [CLKID_SPICC0] = &g12a_spicc_0.hw,
  4218. [CLKID_I2C] = &g12a_i2c.hw,
  4219. [CLKID_SANA] = &g12a_sana.hw,
  4220. [CLKID_SD] = &g12a_sd.hw,
  4221. [CLKID_RNG0] = &g12a_rng0.hw,
  4222. [CLKID_UART0] = &g12a_uart0.hw,
  4223. [CLKID_SPICC1] = &g12a_spicc_1.hw,
  4224. [CLKID_HIU_IFACE] = &g12a_hiu_reg.hw,
  4225. [CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw,
  4226. [CLKID_ASSIST_MISC] = &g12a_assist_misc.hw,
  4227. [CLKID_SD_EMMC_A] = &g12a_emmc_a.hw,
  4228. [CLKID_SD_EMMC_B] = &g12a_emmc_b.hw,
  4229. [CLKID_SD_EMMC_C] = &g12a_emmc_c.hw,
  4230. [CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw,
  4231. [CLKID_AUDIO] = &g12a_audio.hw,
  4232. [CLKID_ETH] = &g12a_eth_core.hw,
  4233. [CLKID_DEMUX] = &g12a_demux.hw,
  4234. [CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw,
  4235. [CLKID_ADC] = &g12a_adc.hw,
  4236. [CLKID_UART1] = &g12a_uart1.hw,
  4237. [CLKID_G2D] = &g12a_g2d.hw,
  4238. [CLKID_RESET] = &g12a_reset.hw,
  4239. [CLKID_PCIE_COMB] = &g12a_pcie_comb.hw,
  4240. [CLKID_PARSER] = &g12a_parser.hw,
  4241. [CLKID_USB] = &g12a_usb_general.hw,
  4242. [CLKID_PCIE_PHY] = &g12a_pcie_phy.hw,
  4243. [CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw,
  4244. [CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw,
  4245. [CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw,
  4246. [CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw,
  4247. [CLKID_HTX_PCLK] = &g12a_htx_pclk.hw,
  4248. [CLKID_BT656] = &g12a_bt656.hw,
  4249. [CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw,
  4250. [CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw,
  4251. [CLKID_UART2] = &g12a_uart2.hw,
  4252. [CLKID_VPU_INTR] = &g12a_vpu_intr.hw,
  4253. [CLKID_GIC] = &g12a_gic.hw,
  4254. [CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw,
  4255. [CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw,
  4256. [CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw,
  4257. [CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw,
  4258. [CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw,
  4259. [CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw,
  4260. [CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw,
  4261. [CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw,
  4262. [CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw,
  4263. [CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw,
  4264. [CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw,
  4265. [CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw,
  4266. [CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw,
  4267. [CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw,
  4268. [CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw,
  4269. [CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw,
  4270. [CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw,
  4271. [CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw,
  4272. [CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw,
  4273. [CLKID_HIFI_PLL] = &g12a_hifi_pll.hw,
  4274. [CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw,
  4275. [CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw,
  4276. [CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw,
  4277. [CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw,
  4278. [CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw,
  4279. [CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw,
  4280. [CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw,
  4281. [CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw,
  4282. [CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw,
  4283. [CLKID_DAC_CLK] = &g12a_dac_clk.hw,
  4284. [CLKID_AOCLK] = &g12a_aoclk_gate.hw,
  4285. [CLKID_IEC958] = &g12a_iec958_gate.hw,
  4286. [CLKID_ENC480P] = &g12a_enc480p.hw,
  4287. [CLKID_RNG1] = &g12a_rng1.hw,
  4288. [CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw,
  4289. [CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw,
  4290. [CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw,
  4291. [CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw,
  4292. [CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw,
  4293. [CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw,
  4294. [CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw,
  4295. [CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw,
  4296. [CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw,
  4297. [CLKID_DMA] = &g12a_dma.hw,
  4298. [CLKID_EFUSE] = &g12a_efuse.hw,
  4299. [CLKID_ROM_BOOT] = &g12a_rom_boot.hw,
  4300. [CLKID_RESET_SEC] = &g12a_reset_sec.hw,
  4301. [CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw,
  4302. [CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw,
  4303. [CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw,
  4304. [CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw,
  4305. [CLKID_VPU_0] = &g12a_vpu_0.hw,
  4306. [CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw,
  4307. [CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw,
  4308. [CLKID_VPU_1] = &g12a_vpu_1.hw,
  4309. [CLKID_VPU] = &g12a_vpu.hw,
  4310. [CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw,
  4311. [CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw,
  4312. [CLKID_VAPB_0] = &g12a_vapb_0.hw,
  4313. [CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw,
  4314. [CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw,
  4315. [CLKID_VAPB_1] = &g12a_vapb_1.hw,
  4316. [CLKID_VAPB_SEL] = &g12a_vapb_sel.hw,
  4317. [CLKID_VAPB] = &g12a_vapb.hw,
  4318. [CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw,
  4319. [CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw,
  4320. [CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw,
  4321. [CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw,
  4322. [CLKID_VID_PLL] = &g12a_vid_pll_div.hw,
  4323. [CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw,
  4324. [CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw,
  4325. [CLKID_VCLK_SEL] = &g12a_vclk_sel.hw,
  4326. [CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw,
  4327. [CLKID_VCLK_INPUT] = &g12a_vclk_input.hw,
  4328. [CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw,
  4329. [CLKID_VCLK_DIV] = &g12a_vclk_div.hw,
  4330. [CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw,
  4331. [CLKID_VCLK] = &g12a_vclk.hw,
  4332. [CLKID_VCLK2] = &g12a_vclk2.hw,
  4333. [CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw,
  4334. [CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw,
  4335. [CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw,
  4336. [CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw,
  4337. [CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw,
  4338. [CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw,
  4339. [CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw,
  4340. [CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw,
  4341. [CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw,
  4342. [CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw,
  4343. [CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw,
  4344. [CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw,
  4345. [CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw,
  4346. [CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw,
  4347. [CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw,
  4348. [CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw,
  4349. [CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw,
  4350. [CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
  4351. [CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
  4352. [CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
  4353. [CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
  4354. [CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
  4355. [CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
  4356. [CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
  4357. [CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
  4358. [CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
  4359. [CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
  4360. [CLKID_HDMI_DIV] = &g12a_hdmi_div.hw,
  4361. [CLKID_HDMI] = &g12a_hdmi.hw,
  4362. [CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw,
  4363. [CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw,
  4364. [CLKID_MALI_0] = &g12a_mali_0.hw,
  4365. [CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw,
  4366. [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw,
  4367. [CLKID_MALI_1] = &g12a_mali_1.hw,
  4368. [CLKID_MALI] = &g12a_mali.hw,
  4369. [CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
  4370. [CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
  4371. [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
  4372. [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
  4373. [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
  4374. [CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw,
  4375. [CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw,
  4376. [CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw,
  4377. [CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw,
  4378. [CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw,
  4379. [CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw,
  4380. [CLKID_CPU_CLK] = &g12b_cpu_clk.hw,
  4381. [CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw,
  4382. [CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw,
  4383. [CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw,
  4384. [CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw,
  4385. [CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw,
  4386. [CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw,
  4387. [CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw,
  4388. [CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw,
  4389. [CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw,
  4390. [CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw,
  4391. [CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw,
  4392. [CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw,
  4393. [CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw,
  4394. [CLKID_PCIE_PLL] = &g12a_pcie_pll.hw,
  4395. [CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw,
  4396. [CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw,
  4397. [CLKID_VDEC_1] = &g12a_vdec_1.hw,
  4398. [CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw,
  4399. [CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw,
  4400. [CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw,
  4401. [CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw,
  4402. [CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw,
  4403. [CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw,
  4404. [CLKID_TS_DIV] = &g12a_ts_div.hw,
  4405. [CLKID_TS] = &g12a_ts.hw,
  4406. [CLKID_SYS1_PLL_DCO] = &g12b_sys1_pll_dco.hw,
  4407. [CLKID_SYS1_PLL] = &g12b_sys1_pll.hw,
  4408. [CLKID_SYS1_PLL_DIV16_EN] = &g12b_sys1_pll_div16_en.hw,
  4409. [CLKID_SYS1_PLL_DIV16] = &g12b_sys1_pll_div16.hw,
  4410. [CLKID_CPUB_CLK_DYN0_SEL] = &g12b_cpub_clk_premux0.hw,
  4411. [CLKID_CPUB_CLK_DYN0_DIV] = &g12b_cpub_clk_mux0_div.hw,
  4412. [CLKID_CPUB_CLK_DYN0] = &g12b_cpub_clk_postmux0.hw,
  4413. [CLKID_CPUB_CLK_DYN1_SEL] = &g12b_cpub_clk_premux1.hw,
  4414. [CLKID_CPUB_CLK_DYN1_DIV] = &g12b_cpub_clk_mux1_div.hw,
  4415. [CLKID_CPUB_CLK_DYN1] = &g12b_cpub_clk_postmux1.hw,
  4416. [CLKID_CPUB_CLK_DYN] = &g12b_cpub_clk_dyn.hw,
  4417. [CLKID_CPUB_CLK] = &g12b_cpub_clk.hw,
  4418. [CLKID_CPUB_CLK_DIV16_EN] = &g12b_cpub_clk_div16_en.hw,
  4419. [CLKID_CPUB_CLK_DIV16] = &g12b_cpub_clk_div16.hw,
  4420. [CLKID_CPUB_CLK_DIV2] = &g12b_cpub_clk_div2.hw,
  4421. [CLKID_CPUB_CLK_DIV3] = &g12b_cpub_clk_div3.hw,
  4422. [CLKID_CPUB_CLK_DIV4] = &g12b_cpub_clk_div4.hw,
  4423. [CLKID_CPUB_CLK_DIV5] = &g12b_cpub_clk_div5.hw,
  4424. [CLKID_CPUB_CLK_DIV6] = &g12b_cpub_clk_div6.hw,
  4425. [CLKID_CPUB_CLK_DIV7] = &g12b_cpub_clk_div7.hw,
  4426. [CLKID_CPUB_CLK_DIV8] = &g12b_cpub_clk_div8.hw,
  4427. [CLKID_CPUB_CLK_APB_SEL] = &g12b_cpub_clk_apb_sel.hw,
  4428. [CLKID_CPUB_CLK_APB] = &g12b_cpub_clk_apb.hw,
  4429. [CLKID_CPUB_CLK_ATB_SEL] = &g12b_cpub_clk_atb_sel.hw,
  4430. [CLKID_CPUB_CLK_ATB] = &g12b_cpub_clk_atb.hw,
  4431. [CLKID_CPUB_CLK_AXI_SEL] = &g12b_cpub_clk_axi_sel.hw,
  4432. [CLKID_CPUB_CLK_AXI] = &g12b_cpub_clk_axi.hw,
  4433. [CLKID_CPUB_CLK_TRACE_SEL] = &g12b_cpub_clk_trace_sel.hw,
  4434. [CLKID_CPUB_CLK_TRACE] = &g12b_cpub_clk_trace.hw,
  4435. [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw,
  4436. [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw,
  4437. [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw,
  4438. [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
  4439. [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
  4440. [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
  4441. [CLKID_NNA_AXI_CLK_SEL] = &sm1_nna_axi_clk_sel.hw,
  4442. [CLKID_NNA_AXI_CLK_DIV] = &sm1_nna_axi_clk_div.hw,
  4443. [CLKID_NNA_AXI_CLK] = &sm1_nna_axi_clk.hw,
  4444. [CLKID_NNA_CORE_CLK_SEL] = &sm1_nna_core_clk_sel.hw,
  4445. [CLKID_NNA_CORE_CLK_DIV] = &sm1_nna_core_clk_div.hw,
  4446. [CLKID_NNA_CORE_CLK] = &sm1_nna_core_clk.hw,
  4447. [CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
  4448. [CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
  4449. [CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
  4450. [NR_CLKS] = NULL,
  4451. },
  4452. .num = NR_CLKS,
  4453. };
  4454. static struct clk_hw_onecell_data sm1_hw_onecell_data = {
  4455. .hws = {
  4456. [CLKID_SYS_PLL] = &g12a_sys_pll.hw,
  4457. [CLKID_FIXED_PLL] = &g12a_fixed_pll.hw,
  4458. [CLKID_FCLK_DIV2] = &g12a_fclk_div2.hw,
  4459. [CLKID_FCLK_DIV3] = &g12a_fclk_div3.hw,
  4460. [CLKID_FCLK_DIV4] = &g12a_fclk_div4.hw,
  4461. [CLKID_FCLK_DIV5] = &g12a_fclk_div5.hw,
  4462. [CLKID_FCLK_DIV7] = &g12a_fclk_div7.hw,
  4463. [CLKID_FCLK_DIV2P5] = &g12a_fclk_div2p5.hw,
  4464. [CLKID_GP0_PLL] = &g12a_gp0_pll.hw,
  4465. [CLKID_MPEG_SEL] = &g12a_mpeg_clk_sel.hw,
  4466. [CLKID_MPEG_DIV] = &g12a_mpeg_clk_div.hw,
  4467. [CLKID_CLK81] = &g12a_clk81.hw,
  4468. [CLKID_MPLL0] = &g12a_mpll0.hw,
  4469. [CLKID_MPLL1] = &g12a_mpll1.hw,
  4470. [CLKID_MPLL2] = &g12a_mpll2.hw,
  4471. [CLKID_MPLL3] = &g12a_mpll3.hw,
  4472. [CLKID_DDR] = &g12a_ddr.hw,
  4473. [CLKID_DOS] = &g12a_dos.hw,
  4474. [CLKID_AUDIO_LOCKER] = &g12a_audio_locker.hw,
  4475. [CLKID_MIPI_DSI_HOST] = &g12a_mipi_dsi_host.hw,
  4476. [CLKID_ETH_PHY] = &g12a_eth_phy.hw,
  4477. [CLKID_ISA] = &g12a_isa.hw,
  4478. [CLKID_PL301] = &g12a_pl301.hw,
  4479. [CLKID_PERIPHS] = &g12a_periphs.hw,
  4480. [CLKID_SPICC0] = &g12a_spicc_0.hw,
  4481. [CLKID_I2C] = &g12a_i2c.hw,
  4482. [CLKID_SANA] = &g12a_sana.hw,
  4483. [CLKID_SD] = &g12a_sd.hw,
  4484. [CLKID_RNG0] = &g12a_rng0.hw,
  4485. [CLKID_UART0] = &g12a_uart0.hw,
  4486. [CLKID_SPICC1] = &g12a_spicc_1.hw,
  4487. [CLKID_HIU_IFACE] = &g12a_hiu_reg.hw,
  4488. [CLKID_MIPI_DSI_PHY] = &g12a_mipi_dsi_phy.hw,
  4489. [CLKID_ASSIST_MISC] = &g12a_assist_misc.hw,
  4490. [CLKID_SD_EMMC_A] = &g12a_emmc_a.hw,
  4491. [CLKID_SD_EMMC_B] = &g12a_emmc_b.hw,
  4492. [CLKID_SD_EMMC_C] = &g12a_emmc_c.hw,
  4493. [CLKID_AUDIO_CODEC] = &g12a_audio_codec.hw,
  4494. [CLKID_AUDIO] = &g12a_audio.hw,
  4495. [CLKID_ETH] = &g12a_eth_core.hw,
  4496. [CLKID_DEMUX] = &g12a_demux.hw,
  4497. [CLKID_AUDIO_IFIFO] = &g12a_audio_ififo.hw,
  4498. [CLKID_ADC] = &g12a_adc.hw,
  4499. [CLKID_UART1] = &g12a_uart1.hw,
  4500. [CLKID_G2D] = &g12a_g2d.hw,
  4501. [CLKID_RESET] = &g12a_reset.hw,
  4502. [CLKID_PCIE_COMB] = &g12a_pcie_comb.hw,
  4503. [CLKID_PARSER] = &g12a_parser.hw,
  4504. [CLKID_USB] = &g12a_usb_general.hw,
  4505. [CLKID_PCIE_PHY] = &g12a_pcie_phy.hw,
  4506. [CLKID_AHB_ARB0] = &g12a_ahb_arb0.hw,
  4507. [CLKID_AHB_DATA_BUS] = &g12a_ahb_data_bus.hw,
  4508. [CLKID_AHB_CTRL_BUS] = &g12a_ahb_ctrl_bus.hw,
  4509. [CLKID_HTX_HDCP22] = &g12a_htx_hdcp22.hw,
  4510. [CLKID_HTX_PCLK] = &g12a_htx_pclk.hw,
  4511. [CLKID_BT656] = &g12a_bt656.hw,
  4512. [CLKID_USB1_DDR_BRIDGE] = &g12a_usb1_to_ddr.hw,
  4513. [CLKID_MMC_PCLK] = &g12a_mmc_pclk.hw,
  4514. [CLKID_UART2] = &g12a_uart2.hw,
  4515. [CLKID_VPU_INTR] = &g12a_vpu_intr.hw,
  4516. [CLKID_GIC] = &g12a_gic.hw,
  4517. [CLKID_SD_EMMC_A_CLK0_SEL] = &g12a_sd_emmc_a_clk0_sel.hw,
  4518. [CLKID_SD_EMMC_A_CLK0_DIV] = &g12a_sd_emmc_a_clk0_div.hw,
  4519. [CLKID_SD_EMMC_A_CLK0] = &g12a_sd_emmc_a_clk0.hw,
  4520. [CLKID_SD_EMMC_B_CLK0_SEL] = &g12a_sd_emmc_b_clk0_sel.hw,
  4521. [CLKID_SD_EMMC_B_CLK0_DIV] = &g12a_sd_emmc_b_clk0_div.hw,
  4522. [CLKID_SD_EMMC_B_CLK0] = &g12a_sd_emmc_b_clk0.hw,
  4523. [CLKID_SD_EMMC_C_CLK0_SEL] = &g12a_sd_emmc_c_clk0_sel.hw,
  4524. [CLKID_SD_EMMC_C_CLK0_DIV] = &g12a_sd_emmc_c_clk0_div.hw,
  4525. [CLKID_SD_EMMC_C_CLK0] = &g12a_sd_emmc_c_clk0.hw,
  4526. [CLKID_MPLL0_DIV] = &g12a_mpll0_div.hw,
  4527. [CLKID_MPLL1_DIV] = &g12a_mpll1_div.hw,
  4528. [CLKID_MPLL2_DIV] = &g12a_mpll2_div.hw,
  4529. [CLKID_MPLL3_DIV] = &g12a_mpll3_div.hw,
  4530. [CLKID_FCLK_DIV2_DIV] = &g12a_fclk_div2_div.hw,
  4531. [CLKID_FCLK_DIV3_DIV] = &g12a_fclk_div3_div.hw,
  4532. [CLKID_FCLK_DIV4_DIV] = &g12a_fclk_div4_div.hw,
  4533. [CLKID_FCLK_DIV5_DIV] = &g12a_fclk_div5_div.hw,
  4534. [CLKID_FCLK_DIV7_DIV] = &g12a_fclk_div7_div.hw,
  4535. [CLKID_FCLK_DIV2P5_DIV] = &g12a_fclk_div2p5_div.hw,
  4536. [CLKID_HIFI_PLL] = &g12a_hifi_pll.hw,
  4537. [CLKID_VCLK2_VENCI0] = &g12a_vclk2_venci0.hw,
  4538. [CLKID_VCLK2_VENCI1] = &g12a_vclk2_venci1.hw,
  4539. [CLKID_VCLK2_VENCP0] = &g12a_vclk2_vencp0.hw,
  4540. [CLKID_VCLK2_VENCP1] = &g12a_vclk2_vencp1.hw,
  4541. [CLKID_VCLK2_VENCT0] = &g12a_vclk2_venct0.hw,
  4542. [CLKID_VCLK2_VENCT1] = &g12a_vclk2_venct1.hw,
  4543. [CLKID_VCLK2_OTHER] = &g12a_vclk2_other.hw,
  4544. [CLKID_VCLK2_ENCI] = &g12a_vclk2_enci.hw,
  4545. [CLKID_VCLK2_ENCP] = &g12a_vclk2_encp.hw,
  4546. [CLKID_DAC_CLK] = &g12a_dac_clk.hw,
  4547. [CLKID_AOCLK] = &g12a_aoclk_gate.hw,
  4548. [CLKID_IEC958] = &g12a_iec958_gate.hw,
  4549. [CLKID_ENC480P] = &g12a_enc480p.hw,
  4550. [CLKID_RNG1] = &g12a_rng1.hw,
  4551. [CLKID_VCLK2_ENCT] = &g12a_vclk2_enct.hw,
  4552. [CLKID_VCLK2_ENCL] = &g12a_vclk2_encl.hw,
  4553. [CLKID_VCLK2_VENCLMMC] = &g12a_vclk2_venclmmc.hw,
  4554. [CLKID_VCLK2_VENCL] = &g12a_vclk2_vencl.hw,
  4555. [CLKID_VCLK2_OTHER1] = &g12a_vclk2_other1.hw,
  4556. [CLKID_FIXED_PLL_DCO] = &g12a_fixed_pll_dco.hw,
  4557. [CLKID_SYS_PLL_DCO] = &g12a_sys_pll_dco.hw,
  4558. [CLKID_GP0_PLL_DCO] = &g12a_gp0_pll_dco.hw,
  4559. [CLKID_HIFI_PLL_DCO] = &g12a_hifi_pll_dco.hw,
  4560. [CLKID_DMA] = &g12a_dma.hw,
  4561. [CLKID_EFUSE] = &g12a_efuse.hw,
  4562. [CLKID_ROM_BOOT] = &g12a_rom_boot.hw,
  4563. [CLKID_RESET_SEC] = &g12a_reset_sec.hw,
  4564. [CLKID_SEC_AHB_APB3] = &g12a_sec_ahb_apb3.hw,
  4565. [CLKID_MPLL_PREDIV] = &g12a_mpll_prediv.hw,
  4566. [CLKID_VPU_0_SEL] = &g12a_vpu_0_sel.hw,
  4567. [CLKID_VPU_0_DIV] = &g12a_vpu_0_div.hw,
  4568. [CLKID_VPU_0] = &g12a_vpu_0.hw,
  4569. [CLKID_VPU_1_SEL] = &g12a_vpu_1_sel.hw,
  4570. [CLKID_VPU_1_DIV] = &g12a_vpu_1_div.hw,
  4571. [CLKID_VPU_1] = &g12a_vpu_1.hw,
  4572. [CLKID_VPU] = &g12a_vpu.hw,
  4573. [CLKID_VAPB_0_SEL] = &g12a_vapb_0_sel.hw,
  4574. [CLKID_VAPB_0_DIV] = &g12a_vapb_0_div.hw,
  4575. [CLKID_VAPB_0] = &g12a_vapb_0.hw,
  4576. [CLKID_VAPB_1_SEL] = &g12a_vapb_1_sel.hw,
  4577. [CLKID_VAPB_1_DIV] = &g12a_vapb_1_div.hw,
  4578. [CLKID_VAPB_1] = &g12a_vapb_1.hw,
  4579. [CLKID_VAPB_SEL] = &g12a_vapb_sel.hw,
  4580. [CLKID_VAPB] = &g12a_vapb.hw,
  4581. [CLKID_HDMI_PLL_DCO] = &g12a_hdmi_pll_dco.hw,
  4582. [CLKID_HDMI_PLL_OD] = &g12a_hdmi_pll_od.hw,
  4583. [CLKID_HDMI_PLL_OD2] = &g12a_hdmi_pll_od2.hw,
  4584. [CLKID_HDMI_PLL] = &g12a_hdmi_pll.hw,
  4585. [CLKID_VID_PLL] = &g12a_vid_pll_div.hw,
  4586. [CLKID_VID_PLL_SEL] = &g12a_vid_pll_sel.hw,
  4587. [CLKID_VID_PLL_DIV] = &g12a_vid_pll.hw,
  4588. [CLKID_VCLK_SEL] = &g12a_vclk_sel.hw,
  4589. [CLKID_VCLK2_SEL] = &g12a_vclk2_sel.hw,
  4590. [CLKID_VCLK_INPUT] = &g12a_vclk_input.hw,
  4591. [CLKID_VCLK2_INPUT] = &g12a_vclk2_input.hw,
  4592. [CLKID_VCLK_DIV] = &g12a_vclk_div.hw,
  4593. [CLKID_VCLK2_DIV] = &g12a_vclk2_div.hw,
  4594. [CLKID_VCLK] = &g12a_vclk.hw,
  4595. [CLKID_VCLK2] = &g12a_vclk2.hw,
  4596. [CLKID_VCLK_DIV1] = &g12a_vclk_div1.hw,
  4597. [CLKID_VCLK_DIV2_EN] = &g12a_vclk_div2_en.hw,
  4598. [CLKID_VCLK_DIV4_EN] = &g12a_vclk_div4_en.hw,
  4599. [CLKID_VCLK_DIV6_EN] = &g12a_vclk_div6_en.hw,
  4600. [CLKID_VCLK_DIV12_EN] = &g12a_vclk_div12_en.hw,
  4601. [CLKID_VCLK2_DIV1] = &g12a_vclk2_div1.hw,
  4602. [CLKID_VCLK2_DIV2_EN] = &g12a_vclk2_div2_en.hw,
  4603. [CLKID_VCLK2_DIV4_EN] = &g12a_vclk2_div4_en.hw,
  4604. [CLKID_VCLK2_DIV6_EN] = &g12a_vclk2_div6_en.hw,
  4605. [CLKID_VCLK2_DIV12_EN] = &g12a_vclk2_div12_en.hw,
  4606. [CLKID_VCLK_DIV2] = &g12a_vclk_div2.hw,
  4607. [CLKID_VCLK_DIV4] = &g12a_vclk_div4.hw,
  4608. [CLKID_VCLK_DIV6] = &g12a_vclk_div6.hw,
  4609. [CLKID_VCLK_DIV12] = &g12a_vclk_div12.hw,
  4610. [CLKID_VCLK2_DIV2] = &g12a_vclk2_div2.hw,
  4611. [CLKID_VCLK2_DIV4] = &g12a_vclk2_div4.hw,
  4612. [CLKID_VCLK2_DIV6] = &g12a_vclk2_div6.hw,
  4613. [CLKID_VCLK2_DIV12] = &g12a_vclk2_div12.hw,
  4614. [CLKID_CTS_ENCI_SEL] = &g12a_cts_enci_sel.hw,
  4615. [CLKID_CTS_ENCP_SEL] = &g12a_cts_encp_sel.hw,
  4616. [CLKID_CTS_VDAC_SEL] = &g12a_cts_vdac_sel.hw,
  4617. [CLKID_HDMI_TX_SEL] = &g12a_hdmi_tx_sel.hw,
  4618. [CLKID_CTS_ENCI] = &g12a_cts_enci.hw,
  4619. [CLKID_CTS_ENCP] = &g12a_cts_encp.hw,
  4620. [CLKID_CTS_VDAC] = &g12a_cts_vdac.hw,
  4621. [CLKID_HDMI_TX] = &g12a_hdmi_tx.hw,
  4622. [CLKID_HDMI_SEL] = &g12a_hdmi_sel.hw,
  4623. [CLKID_HDMI_DIV] = &g12a_hdmi_div.hw,
  4624. [CLKID_HDMI] = &g12a_hdmi.hw,
  4625. [CLKID_MALI_0_SEL] = &g12a_mali_0_sel.hw,
  4626. [CLKID_MALI_0_DIV] = &g12a_mali_0_div.hw,
  4627. [CLKID_MALI_0] = &g12a_mali_0.hw,
  4628. [CLKID_MALI_1_SEL] = &g12a_mali_1_sel.hw,
  4629. [CLKID_MALI_1_DIV] = &g12a_mali_1_div.hw,
  4630. [CLKID_MALI_1] = &g12a_mali_1.hw,
  4631. [CLKID_MALI] = &g12a_mali.hw,
  4632. [CLKID_MPLL_50M_DIV] = &g12a_mpll_50m_div.hw,
  4633. [CLKID_MPLL_50M] = &g12a_mpll_50m.hw,
  4634. [CLKID_SYS_PLL_DIV16_EN] = &g12a_sys_pll_div16_en.hw,
  4635. [CLKID_SYS_PLL_DIV16] = &g12a_sys_pll_div16.hw,
  4636. [CLKID_CPU_CLK_DYN0_SEL] = &g12a_cpu_clk_premux0.hw,
  4637. [CLKID_CPU_CLK_DYN0_DIV] = &g12a_cpu_clk_mux0_div.hw,
  4638. [CLKID_CPU_CLK_DYN0] = &g12a_cpu_clk_postmux0.hw,
  4639. [CLKID_CPU_CLK_DYN1_SEL] = &g12a_cpu_clk_premux1.hw,
  4640. [CLKID_CPU_CLK_DYN1_DIV] = &g12a_cpu_clk_mux1_div.hw,
  4641. [CLKID_CPU_CLK_DYN1] = &g12a_cpu_clk_postmux1.hw,
  4642. [CLKID_CPU_CLK_DYN] = &g12a_cpu_clk_dyn.hw,
  4643. [CLKID_CPU_CLK] = &g12a_cpu_clk.hw,
  4644. [CLKID_CPU_CLK_DIV16_EN] = &g12a_cpu_clk_div16_en.hw,
  4645. [CLKID_CPU_CLK_DIV16] = &g12a_cpu_clk_div16.hw,
  4646. [CLKID_CPU_CLK_APB_DIV] = &g12a_cpu_clk_apb_div.hw,
  4647. [CLKID_CPU_CLK_APB] = &g12a_cpu_clk_apb.hw,
  4648. [CLKID_CPU_CLK_ATB_DIV] = &g12a_cpu_clk_atb_div.hw,
  4649. [CLKID_CPU_CLK_ATB] = &g12a_cpu_clk_atb.hw,
  4650. [CLKID_CPU_CLK_AXI_DIV] = &g12a_cpu_clk_axi_div.hw,
  4651. [CLKID_CPU_CLK_AXI] = &g12a_cpu_clk_axi.hw,
  4652. [CLKID_CPU_CLK_TRACE_DIV] = &g12a_cpu_clk_trace_div.hw,
  4653. [CLKID_CPU_CLK_TRACE] = &g12a_cpu_clk_trace.hw,
  4654. [CLKID_PCIE_PLL_DCO] = &g12a_pcie_pll_dco.hw,
  4655. [CLKID_PCIE_PLL_DCO_DIV2] = &g12a_pcie_pll_dco_div2.hw,
  4656. [CLKID_PCIE_PLL_OD] = &g12a_pcie_pll_od.hw,
  4657. [CLKID_PCIE_PLL] = &g12a_pcie_pll.hw,
  4658. [CLKID_VDEC_1_SEL] = &g12a_vdec_1_sel.hw,
  4659. [CLKID_VDEC_1_DIV] = &g12a_vdec_1_div.hw,
  4660. [CLKID_VDEC_1] = &g12a_vdec_1.hw,
  4661. [CLKID_VDEC_HEVC_SEL] = &g12a_vdec_hevc_sel.hw,
  4662. [CLKID_VDEC_HEVC_DIV] = &g12a_vdec_hevc_div.hw,
  4663. [CLKID_VDEC_HEVC] = &g12a_vdec_hevc.hw,
  4664. [CLKID_VDEC_HEVCF_SEL] = &g12a_vdec_hevcf_sel.hw,
  4665. [CLKID_VDEC_HEVCF_DIV] = &g12a_vdec_hevcf_div.hw,
  4666. [CLKID_VDEC_HEVCF] = &g12a_vdec_hevcf.hw,
  4667. [CLKID_TS_DIV] = &g12a_ts_div.hw,
  4668. [CLKID_TS] = &g12a_ts.hw,
  4669. [CLKID_GP1_PLL_DCO] = &sm1_gp1_pll_dco.hw,
  4670. [CLKID_GP1_PLL] = &sm1_gp1_pll.hw,
  4671. [CLKID_DSU_CLK_DYN0_SEL] = &sm1_dsu_clk_premux0.hw,
  4672. [CLKID_DSU_CLK_DYN0_DIV] = &sm1_dsu_clk_premux1.hw,
  4673. [CLKID_DSU_CLK_DYN0] = &sm1_dsu_clk_mux0_div.hw,
  4674. [CLKID_DSU_CLK_DYN1_SEL] = &sm1_dsu_clk_postmux0.hw,
  4675. [CLKID_DSU_CLK_DYN1_DIV] = &sm1_dsu_clk_mux1_div.hw,
  4676. [CLKID_DSU_CLK_DYN1] = &sm1_dsu_clk_postmux1.hw,
  4677. [CLKID_DSU_CLK_DYN] = &sm1_dsu_clk_dyn.hw,
  4678. [CLKID_DSU_CLK_FINAL] = &sm1_dsu_final_clk.hw,
  4679. [CLKID_DSU_CLK] = &sm1_dsu_clk.hw,
  4680. [CLKID_CPU1_CLK] = &sm1_cpu1_clk.hw,
  4681. [CLKID_CPU2_CLK] = &sm1_cpu2_clk.hw,
  4682. [CLKID_CPU3_CLK] = &sm1_cpu3_clk.hw,
  4683. [CLKID_SPICC0_SCLK_SEL] = &g12a_spicc0_sclk_sel.hw,
  4684. [CLKID_SPICC0_SCLK_DIV] = &g12a_spicc0_sclk_div.hw,
  4685. [CLKID_SPICC0_SCLK] = &g12a_spicc0_sclk.hw,
  4686. [CLKID_SPICC1_SCLK_SEL] = &g12a_spicc1_sclk_sel.hw,
  4687. [CLKID_SPICC1_SCLK_DIV] = &g12a_spicc1_sclk_div.hw,
  4688. [CLKID_SPICC1_SCLK] = &g12a_spicc1_sclk.hw,
  4689. [CLKID_NNA_AXI_CLK_SEL] = &sm1_nna_axi_clk_sel.hw,
  4690. [CLKID_NNA_AXI_CLK_DIV] = &sm1_nna_axi_clk_div.hw,
  4691. [CLKID_NNA_AXI_CLK] = &sm1_nna_axi_clk.hw,
  4692. [CLKID_NNA_CORE_CLK_SEL] = &sm1_nna_core_clk_sel.hw,
  4693. [CLKID_NNA_CORE_CLK_DIV] = &sm1_nna_core_clk_div.hw,
  4694. [CLKID_NNA_CORE_CLK] = &sm1_nna_core_clk.hw,
  4695. [CLKID_MIPI_DSI_PXCLK_SEL] = &g12a_mipi_dsi_pxclk_sel.hw,
  4696. [CLKID_MIPI_DSI_PXCLK_DIV] = &g12a_mipi_dsi_pxclk_div.hw,
  4697. [CLKID_MIPI_DSI_PXCLK] = &g12a_mipi_dsi_pxclk.hw,
  4698. [NR_CLKS] = NULL,
  4699. },
  4700. .num = NR_CLKS,
  4701. };
  4702. /* Convenience table to populate regmap in .probe */
  4703. static struct clk_regmap *const g12a_clk_regmaps[] = {
  4704. &g12a_clk81,
  4705. &g12a_dos,
  4706. &g12a_ddr,
  4707. &g12a_audio_locker,
  4708. &g12a_mipi_dsi_host,
  4709. &g12a_eth_phy,
  4710. &g12a_isa,
  4711. &g12a_pl301,
  4712. &g12a_periphs,
  4713. &g12a_spicc_0,
  4714. &g12a_i2c,
  4715. &g12a_sana,
  4716. &g12a_sd,
  4717. &g12a_rng0,
  4718. &g12a_uart0,
  4719. &g12a_spicc_1,
  4720. &g12a_hiu_reg,
  4721. &g12a_mipi_dsi_phy,
  4722. &g12a_assist_misc,
  4723. &g12a_emmc_a,
  4724. &g12a_emmc_b,
  4725. &g12a_emmc_c,
  4726. &g12a_audio_codec,
  4727. &g12a_audio,
  4728. &g12a_eth_core,
  4729. &g12a_demux,
  4730. &g12a_audio_ififo,
  4731. &g12a_adc,
  4732. &g12a_uart1,
  4733. &g12a_g2d,
  4734. &g12a_reset,
  4735. &g12a_pcie_comb,
  4736. &g12a_parser,
  4737. &g12a_usb_general,
  4738. &g12a_pcie_phy,
  4739. &g12a_ahb_arb0,
  4740. &g12a_ahb_data_bus,
  4741. &g12a_ahb_ctrl_bus,
  4742. &g12a_htx_hdcp22,
  4743. &g12a_htx_pclk,
  4744. &g12a_bt656,
  4745. &g12a_usb1_to_ddr,
  4746. &g12a_mmc_pclk,
  4747. &g12a_uart2,
  4748. &g12a_vpu_intr,
  4749. &g12a_gic,
  4750. &g12a_sd_emmc_a_clk0,
  4751. &g12a_sd_emmc_b_clk0,
  4752. &g12a_sd_emmc_c_clk0,
  4753. &g12a_mpeg_clk_div,
  4754. &g12a_sd_emmc_a_clk0_div,
  4755. &g12a_sd_emmc_b_clk0_div,
  4756. &g12a_sd_emmc_c_clk0_div,
  4757. &g12a_mpeg_clk_sel,
  4758. &g12a_sd_emmc_a_clk0_sel,
  4759. &g12a_sd_emmc_b_clk0_sel,
  4760. &g12a_sd_emmc_c_clk0_sel,
  4761. &g12a_mpll0,
  4762. &g12a_mpll1,
  4763. &g12a_mpll2,
  4764. &g12a_mpll3,
  4765. &g12a_mpll0_div,
  4766. &g12a_mpll1_div,
  4767. &g12a_mpll2_div,
  4768. &g12a_mpll3_div,
  4769. &g12a_fixed_pll,
  4770. &g12a_sys_pll,
  4771. &g12a_gp0_pll,
  4772. &g12a_hifi_pll,
  4773. &g12a_vclk2_venci0,
  4774. &g12a_vclk2_venci1,
  4775. &g12a_vclk2_vencp0,
  4776. &g12a_vclk2_vencp1,
  4777. &g12a_vclk2_venct0,
  4778. &g12a_vclk2_venct1,
  4779. &g12a_vclk2_other,
  4780. &g12a_vclk2_enci,
  4781. &g12a_vclk2_encp,
  4782. &g12a_dac_clk,
  4783. &g12a_aoclk_gate,
  4784. &g12a_iec958_gate,
  4785. &g12a_enc480p,
  4786. &g12a_rng1,
  4787. &g12a_vclk2_enct,
  4788. &g12a_vclk2_encl,
  4789. &g12a_vclk2_venclmmc,
  4790. &g12a_vclk2_vencl,
  4791. &g12a_vclk2_other1,
  4792. &g12a_fixed_pll_dco,
  4793. &g12a_sys_pll_dco,
  4794. &g12a_gp0_pll_dco,
  4795. &g12a_hifi_pll_dco,
  4796. &g12a_fclk_div2,
  4797. &g12a_fclk_div3,
  4798. &g12a_fclk_div4,
  4799. &g12a_fclk_div5,
  4800. &g12a_fclk_div7,
  4801. &g12a_fclk_div2p5,
  4802. &g12a_dma,
  4803. &g12a_efuse,
  4804. &g12a_rom_boot,
  4805. &g12a_reset_sec,
  4806. &g12a_sec_ahb_apb3,
  4807. &g12a_vpu_0_sel,
  4808. &g12a_vpu_0_div,
  4809. &g12a_vpu_0,
  4810. &g12a_vpu_1_sel,
  4811. &g12a_vpu_1_div,
  4812. &g12a_vpu_1,
  4813. &g12a_vpu,
  4814. &g12a_vapb_0_sel,
  4815. &g12a_vapb_0_div,
  4816. &g12a_vapb_0,
  4817. &g12a_vapb_1_sel,
  4818. &g12a_vapb_1_div,
  4819. &g12a_vapb_1,
  4820. &g12a_vapb_sel,
  4821. &g12a_vapb,
  4822. &g12a_hdmi_pll_dco,
  4823. &g12a_hdmi_pll_od,
  4824. &g12a_hdmi_pll_od2,
  4825. &g12a_hdmi_pll,
  4826. &g12a_vid_pll_div,
  4827. &g12a_vid_pll_sel,
  4828. &g12a_vid_pll,
  4829. &g12a_vclk_sel,
  4830. &g12a_vclk2_sel,
  4831. &g12a_vclk_input,
  4832. &g12a_vclk2_input,
  4833. &g12a_vclk_div,
  4834. &g12a_vclk2_div,
  4835. &g12a_vclk,
  4836. &g12a_vclk2,
  4837. &g12a_vclk_div1,
  4838. &g12a_vclk_div2_en,
  4839. &g12a_vclk_div4_en,
  4840. &g12a_vclk_div6_en,
  4841. &g12a_vclk_div12_en,
  4842. &g12a_vclk2_div1,
  4843. &g12a_vclk2_div2_en,
  4844. &g12a_vclk2_div4_en,
  4845. &g12a_vclk2_div6_en,
  4846. &g12a_vclk2_div12_en,
  4847. &g12a_cts_enci_sel,
  4848. &g12a_cts_encp_sel,
  4849. &g12a_cts_vdac_sel,
  4850. &g12a_hdmi_tx_sel,
  4851. &g12a_cts_enci,
  4852. &g12a_cts_encp,
  4853. &g12a_cts_vdac,
  4854. &g12a_hdmi_tx,
  4855. &g12a_hdmi_sel,
  4856. &g12a_hdmi_div,
  4857. &g12a_hdmi,
  4858. &g12a_mali_0_sel,
  4859. &g12a_mali_0_div,
  4860. &g12a_mali_0,
  4861. &g12a_mali_1_sel,
  4862. &g12a_mali_1_div,
  4863. &g12a_mali_1,
  4864. &g12a_mali,
  4865. &g12a_mpll_50m,
  4866. &g12a_sys_pll_div16_en,
  4867. &g12a_cpu_clk_premux0,
  4868. &g12a_cpu_clk_mux0_div,
  4869. &g12a_cpu_clk_postmux0,
  4870. &g12a_cpu_clk_premux1,
  4871. &g12a_cpu_clk_mux1_div,
  4872. &g12a_cpu_clk_postmux1,
  4873. &g12a_cpu_clk_dyn,
  4874. &g12a_cpu_clk,
  4875. &g12a_cpu_clk_div16_en,
  4876. &g12a_cpu_clk_apb_div,
  4877. &g12a_cpu_clk_apb,
  4878. &g12a_cpu_clk_atb_div,
  4879. &g12a_cpu_clk_atb,
  4880. &g12a_cpu_clk_axi_div,
  4881. &g12a_cpu_clk_axi,
  4882. &g12a_cpu_clk_trace_div,
  4883. &g12a_cpu_clk_trace,
  4884. &g12a_pcie_pll_od,
  4885. &g12a_pcie_pll_dco,
  4886. &g12a_vdec_1_sel,
  4887. &g12a_vdec_1_div,
  4888. &g12a_vdec_1,
  4889. &g12a_vdec_hevc_sel,
  4890. &g12a_vdec_hevc_div,
  4891. &g12a_vdec_hevc,
  4892. &g12a_vdec_hevcf_sel,
  4893. &g12a_vdec_hevcf_div,
  4894. &g12a_vdec_hevcf,
  4895. &g12a_ts_div,
  4896. &g12a_ts,
  4897. &g12b_cpu_clk,
  4898. &g12b_sys1_pll_dco,
  4899. &g12b_sys1_pll,
  4900. &g12b_sys1_pll_div16_en,
  4901. &g12b_cpub_clk_premux0,
  4902. &g12b_cpub_clk_mux0_div,
  4903. &g12b_cpub_clk_postmux0,
  4904. &g12b_cpub_clk_premux1,
  4905. &g12b_cpub_clk_mux1_div,
  4906. &g12b_cpub_clk_postmux1,
  4907. &g12b_cpub_clk_dyn,
  4908. &g12b_cpub_clk,
  4909. &g12b_cpub_clk_div16_en,
  4910. &g12b_cpub_clk_apb_sel,
  4911. &g12b_cpub_clk_apb,
  4912. &g12b_cpub_clk_atb_sel,
  4913. &g12b_cpub_clk_atb,
  4914. &g12b_cpub_clk_axi_sel,
  4915. &g12b_cpub_clk_axi,
  4916. &g12b_cpub_clk_trace_sel,
  4917. &g12b_cpub_clk_trace,
  4918. &sm1_gp1_pll_dco,
  4919. &sm1_gp1_pll,
  4920. &sm1_dsu_clk_premux0,
  4921. &sm1_dsu_clk_premux1,
  4922. &sm1_dsu_clk_mux0_div,
  4923. &sm1_dsu_clk_postmux0,
  4924. &sm1_dsu_clk_mux1_div,
  4925. &sm1_dsu_clk_postmux1,
  4926. &sm1_dsu_clk_dyn,
  4927. &sm1_dsu_final_clk,
  4928. &sm1_dsu_clk,
  4929. &sm1_cpu1_clk,
  4930. &sm1_cpu2_clk,
  4931. &sm1_cpu3_clk,
  4932. &g12a_spicc0_sclk_sel,
  4933. &g12a_spicc0_sclk_div,
  4934. &g12a_spicc0_sclk,
  4935. &g12a_spicc1_sclk_sel,
  4936. &g12a_spicc1_sclk_div,
  4937. &g12a_spicc1_sclk,
  4938. &sm1_nna_axi_clk_sel,
  4939. &sm1_nna_axi_clk_div,
  4940. &sm1_nna_axi_clk,
  4941. &sm1_nna_core_clk_sel,
  4942. &sm1_nna_core_clk_div,
  4943. &sm1_nna_core_clk,
  4944. &g12a_mipi_dsi_pxclk_sel,
  4945. &g12a_mipi_dsi_pxclk_div,
  4946. &g12a_mipi_dsi_pxclk,
  4947. };
  4948. static const struct reg_sequence g12a_init_regs[] = {
  4949. { .reg = HHI_MPLL_CNTL0, .def = 0x00000543 },
  4950. };
  4951. #define DVFS_CON_ID "dvfs"
  4952. static int meson_g12a_dvfs_setup_common(struct device *dev,
  4953. struct clk_hw **hws)
  4954. {
  4955. struct clk *notifier_clk;
  4956. struct clk_hw *xtal;
  4957. int ret;
  4958. xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
  4959. /* Setup clock notifier for cpu_clk_postmux0 */
  4960. g12a_cpu_clk_postmux0_nb_data.xtal = xtal;
  4961. notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_postmux0.hw,
  4962. DVFS_CON_ID);
  4963. ret = devm_clk_notifier_register(dev, notifier_clk,
  4964. &g12a_cpu_clk_postmux0_nb_data.nb);
  4965. if (ret) {
  4966. dev_err(dev, "failed to register the cpu_clk_postmux0 notifier\n");
  4967. return ret;
  4968. }
  4969. /* Setup clock notifier for cpu_clk_dyn mux */
  4970. notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk_dyn.hw,
  4971. DVFS_CON_ID);
  4972. ret = devm_clk_notifier_register(dev, notifier_clk,
  4973. &g12a_cpu_clk_mux_nb);
  4974. if (ret) {
  4975. dev_err(dev, "failed to register the cpu_clk_dyn notifier\n");
  4976. return ret;
  4977. }
  4978. return 0;
  4979. }
  4980. static int meson_g12b_dvfs_setup(struct platform_device *pdev)
  4981. {
  4982. struct clk_hw **hws = g12b_hw_onecell_data.hws;
  4983. struct device *dev = &pdev->dev;
  4984. struct clk *notifier_clk;
  4985. struct clk_hw *xtal;
  4986. int ret;
  4987. ret = meson_g12a_dvfs_setup_common(dev, hws);
  4988. if (ret)
  4989. return ret;
  4990. xtal = clk_hw_get_parent_by_index(hws[CLKID_CPU_CLK_DYN1_SEL], 0);
  4991. /* Setup clock notifier for cpu_clk mux */
  4992. notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpu_clk.hw,
  4993. DVFS_CON_ID);
  4994. ret = devm_clk_notifier_register(dev, notifier_clk,
  4995. &g12a_cpu_clk_mux_nb);
  4996. if (ret) {
  4997. dev_err(dev, "failed to register the cpu_clk notifier\n");
  4998. return ret;
  4999. }
  5000. /* Setup clock notifier for sys1_pll */
  5001. notifier_clk = devm_clk_hw_get_clk(dev, &g12b_sys1_pll.hw,
  5002. DVFS_CON_ID);
  5003. ret = devm_clk_notifier_register(dev, notifier_clk,
  5004. &g12b_cpu_clk_sys1_pll_nb_data.nb);
  5005. if (ret) {
  5006. dev_err(dev, "failed to register the sys1_pll notifier\n");
  5007. return ret;
  5008. }
  5009. /* Add notifiers for the second CPU cluster */
  5010. /* Setup clock notifier for cpub_clk_postmux0 */
  5011. g12b_cpub_clk_postmux0_nb_data.xtal = xtal;
  5012. notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_postmux0.hw,
  5013. DVFS_CON_ID);
  5014. ret = devm_clk_notifier_register(dev, notifier_clk,
  5015. &g12b_cpub_clk_postmux0_nb_data.nb);
  5016. if (ret) {
  5017. dev_err(dev, "failed to register the cpub_clk_postmux0 notifier\n");
  5018. return ret;
  5019. }
  5020. /* Setup clock notifier for cpub_clk_dyn mux */
  5021. notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk_dyn.hw, "dvfs");
  5022. ret = devm_clk_notifier_register(dev, notifier_clk,
  5023. &g12a_cpu_clk_mux_nb);
  5024. if (ret) {
  5025. dev_err(dev, "failed to register the cpub_clk_dyn notifier\n");
  5026. return ret;
  5027. }
  5028. /* Setup clock notifier for cpub_clk mux */
  5029. notifier_clk = devm_clk_hw_get_clk(dev, &g12b_cpub_clk.hw, DVFS_CON_ID);
  5030. ret = devm_clk_notifier_register(dev, notifier_clk,
  5031. &g12a_cpu_clk_mux_nb);
  5032. if (ret) {
  5033. dev_err(dev, "failed to register the cpub_clk notifier\n");
  5034. return ret;
  5035. }
  5036. /* Setup clock notifier for sys_pll */
  5037. notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
  5038. ret = devm_clk_notifier_register(dev, notifier_clk,
  5039. &g12b_cpub_clk_sys_pll_nb_data.nb);
  5040. if (ret) {
  5041. dev_err(dev, "failed to register the sys_pll notifier\n");
  5042. return ret;
  5043. }
  5044. return 0;
  5045. }
  5046. static int meson_g12a_dvfs_setup(struct platform_device *pdev)
  5047. {
  5048. struct clk_hw **hws = g12a_hw_onecell_data.hws;
  5049. struct device *dev = &pdev->dev;
  5050. struct clk *notifier_clk;
  5051. int ret;
  5052. ret = meson_g12a_dvfs_setup_common(dev, hws);
  5053. if (ret)
  5054. return ret;
  5055. /* Setup clock notifier for cpu_clk mux */
  5056. notifier_clk = devm_clk_hw_get_clk(dev, &g12a_cpu_clk.hw, DVFS_CON_ID);
  5057. ret = devm_clk_notifier_register(dev, notifier_clk,
  5058. &g12a_cpu_clk_mux_nb);
  5059. if (ret) {
  5060. dev_err(dev, "failed to register the cpu_clk notifier\n");
  5061. return ret;
  5062. }
  5063. /* Setup clock notifier for sys_pll */
  5064. notifier_clk = devm_clk_hw_get_clk(dev, &g12a_sys_pll.hw, DVFS_CON_ID);
  5065. ret = devm_clk_notifier_register(dev, notifier_clk,
  5066. &g12a_sys_pll_nb_data.nb);
  5067. if (ret) {
  5068. dev_err(dev, "failed to register the sys_pll notifier\n");
  5069. return ret;
  5070. }
  5071. return 0;
  5072. }
  5073. struct meson_g12a_data {
  5074. const struct meson_eeclkc_data eeclkc_data;
  5075. int (*dvfs_setup)(struct platform_device *pdev);
  5076. };
  5077. static int meson_g12a_probe(struct platform_device *pdev)
  5078. {
  5079. const struct meson_eeclkc_data *eeclkc_data;
  5080. const struct meson_g12a_data *g12a_data;
  5081. int ret;
  5082. eeclkc_data = of_device_get_match_data(&pdev->dev);
  5083. if (!eeclkc_data)
  5084. return -EINVAL;
  5085. ret = meson_eeclkc_probe(pdev);
  5086. if (ret)
  5087. return ret;
  5088. g12a_data = container_of(eeclkc_data, struct meson_g12a_data,
  5089. eeclkc_data);
  5090. if (g12a_data->dvfs_setup)
  5091. return g12a_data->dvfs_setup(pdev);
  5092. return 0;
  5093. }
  5094. static const struct meson_g12a_data g12a_clkc_data = {
  5095. .eeclkc_data = {
  5096. .regmap_clks = g12a_clk_regmaps,
  5097. .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
  5098. .hw_onecell_data = &g12a_hw_onecell_data,
  5099. .init_regs = g12a_init_regs,
  5100. .init_count = ARRAY_SIZE(g12a_init_regs),
  5101. },
  5102. .dvfs_setup = meson_g12a_dvfs_setup,
  5103. };
  5104. static const struct meson_g12a_data g12b_clkc_data = {
  5105. .eeclkc_data = {
  5106. .regmap_clks = g12a_clk_regmaps,
  5107. .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
  5108. .hw_onecell_data = &g12b_hw_onecell_data,
  5109. },
  5110. .dvfs_setup = meson_g12b_dvfs_setup,
  5111. };
  5112. static const struct meson_g12a_data sm1_clkc_data = {
  5113. .eeclkc_data = {
  5114. .regmap_clks = g12a_clk_regmaps,
  5115. .regmap_clk_num = ARRAY_SIZE(g12a_clk_regmaps),
  5116. .hw_onecell_data = &sm1_hw_onecell_data,
  5117. },
  5118. .dvfs_setup = meson_g12a_dvfs_setup,
  5119. };
  5120. static const struct of_device_id clkc_match_table[] = {
  5121. {
  5122. .compatible = "amlogic,g12a-clkc",
  5123. .data = &g12a_clkc_data.eeclkc_data
  5124. },
  5125. {
  5126. .compatible = "amlogic,g12b-clkc",
  5127. .data = &g12b_clkc_data.eeclkc_data
  5128. },
  5129. {
  5130. .compatible = "amlogic,sm1-clkc",
  5131. .data = &sm1_clkc_data.eeclkc_data
  5132. },
  5133. {}
  5134. };
  5135. MODULE_DEVICE_TABLE(of, clkc_match_table);
  5136. static struct platform_driver g12a_driver = {
  5137. .probe = meson_g12a_probe,
  5138. .driver = {
  5139. .name = "g12a-clkc",
  5140. .of_match_table = clkc_match_table,
  5141. },
  5142. };
  5143. module_platform_driver(g12a_driver);
  5144. MODULE_LICENSE("GPL v2");