pinctrl-rockchip.c 124 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Pinctrl driver for Rockchip SoCs
  4. *
  5. * Copyright (c) 2013 MundoReader S.L.
  6. * Author: Heiko Stuebner <heiko@sntech.de>
  7. *
  8. * With some ideas taken from pinctrl-samsung:
  9. * Copyright (c) 2012 Samsung Electronics Co., Ltd.
  10. * http://www.samsung.com
  11. * Copyright (c) 2012 Linaro Ltd
  12. * https://www.linaro.org
  13. *
  14. * and pinctrl-at91:
  15. * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
  16. */
  17. #include <linux/init.h>
  18. #include <linux/module.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/io.h>
  21. #include <linux/bitops.h>
  22. #include <linux/gpio/driver.h>
  23. #include <linux/of.h>
  24. #include <linux/of_platform.h>
  25. #include <linux/pinctrl/machine.h>
  26. #include <linux/pinctrl/pinconf.h>
  27. #include <linux/pinctrl/pinctrl.h>
  28. #include <linux/pinctrl/pinmux.h>
  29. #include <linux/pinctrl/pinconf-generic.h>
  30. #include <linux/irqchip/chained_irq.h>
  31. #include <linux/clk.h>
  32. #include <linux/regmap.h>
  33. #include <linux/mfd/syscon.h>
  34. #include <linux/string_helpers.h>
  35. #include <dt-bindings/pinctrl/rockchip.h>
  36. #include "core.h"
  37. #include "pinconf.h"
  38. #include "pinctrl-rockchip.h"
  39. /*
  40. * Generate a bitmask for setting a value (v) with a write mask bit in hiword
  41. * register 31:16 area.
  42. */
  43. #define WRITE_MASK_VAL(h, l, v) \
  44. (GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l))))
  45. /*
  46. * Encode variants of iomux registers into a type variable
  47. */
  48. #define IOMUX_GPIO_ONLY BIT(0)
  49. #define IOMUX_WIDTH_4BIT BIT(1)
  50. #define IOMUX_SOURCE_PMU BIT(2)
  51. #define IOMUX_UNROUTED BIT(3)
  52. #define IOMUX_WIDTH_3BIT BIT(4)
  53. #define IOMUX_WIDTH_2BIT BIT(5)
  54. #define IOMUX_L_SOURCE_PMU BIT(6)
  55. #define PIN_BANK(id, pins, label) \
  56. { \
  57. .bank_num = id, \
  58. .nr_pins = pins, \
  59. .name = label, \
  60. .iomux = { \
  61. { .offset = -1 }, \
  62. { .offset = -1 }, \
  63. { .offset = -1 }, \
  64. { .offset = -1 }, \
  65. }, \
  66. }
  67. #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \
  68. { \
  69. .bank_num = id, \
  70. .nr_pins = pins, \
  71. .name = label, \
  72. .iomux = { \
  73. { .type = iom0, .offset = -1 }, \
  74. { .type = iom1, .offset = -1 }, \
  75. { .type = iom2, .offset = -1 }, \
  76. { .type = iom3, .offset = -1 }, \
  77. }, \
  78. }
  79. #define PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS(id, pins, label, iom0, \
  80. iom1, iom2, iom3, \
  81. offset0, offset1, \
  82. offset2, offset3, pull0, \
  83. pull1, pull2, pull3) \
  84. { \
  85. .bank_num = id, \
  86. .nr_pins = pins, \
  87. .name = label, \
  88. .iomux = { \
  89. { .type = iom0, .offset = offset0 }, \
  90. { .type = iom1, .offset = offset1 }, \
  91. { .type = iom2, .offset = offset2 }, \
  92. { .type = iom3, .offset = offset3 }, \
  93. }, \
  94. .pull_type[0] = pull0, \
  95. .pull_type[1] = pull1, \
  96. .pull_type[2] = pull2, \
  97. .pull_type[3] = pull3, \
  98. }
  99. #define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \
  100. { \
  101. .bank_num = id, \
  102. .nr_pins = pins, \
  103. .name = label, \
  104. .iomux = { \
  105. { .offset = -1 }, \
  106. { .offset = -1 }, \
  107. { .offset = -1 }, \
  108. { .offset = -1 }, \
  109. }, \
  110. .drv = { \
  111. { .drv_type = type0, .offset = -1 }, \
  112. { .drv_type = type1, .offset = -1 }, \
  113. { .drv_type = type2, .offset = -1 }, \
  114. { .drv_type = type3, .offset = -1 }, \
  115. }, \
  116. }
  117. #define PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(id, pins, label, iom0, iom1, \
  118. iom2, iom3, pull0, pull1, \
  119. pull2, pull3) \
  120. { \
  121. .bank_num = id, \
  122. .nr_pins = pins, \
  123. .name = label, \
  124. .iomux = { \
  125. { .type = iom0, .offset = -1 }, \
  126. { .type = iom1, .offset = -1 }, \
  127. { .type = iom2, .offset = -1 }, \
  128. { .type = iom3, .offset = -1 }, \
  129. }, \
  130. .pull_type[0] = pull0, \
  131. .pull_type[1] = pull1, \
  132. .pull_type[2] = pull2, \
  133. .pull_type[3] = pull3, \
  134. }
  135. #define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, \
  136. drv2, drv3, pull0, pull1, \
  137. pull2, pull3) \
  138. { \
  139. .bank_num = id, \
  140. .nr_pins = pins, \
  141. .name = label, \
  142. .iomux = { \
  143. { .offset = -1 }, \
  144. { .offset = -1 }, \
  145. { .offset = -1 }, \
  146. { .offset = -1 }, \
  147. }, \
  148. .drv = { \
  149. { .drv_type = drv0, .offset = -1 }, \
  150. { .drv_type = drv1, .offset = -1 }, \
  151. { .drv_type = drv2, .offset = -1 }, \
  152. { .drv_type = drv3, .offset = -1 }, \
  153. }, \
  154. .pull_type[0] = pull0, \
  155. .pull_type[1] = pull1, \
  156. .pull_type[2] = pull2, \
  157. .pull_type[3] = pull3, \
  158. }
  159. #define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2, \
  160. iom3, offset0, offset1, offset2, \
  161. offset3) \
  162. { \
  163. .bank_num = id, \
  164. .nr_pins = pins, \
  165. .name = label, \
  166. .iomux = { \
  167. { .type = iom0, .offset = offset0 }, \
  168. { .type = iom1, .offset = offset1 }, \
  169. { .type = iom2, .offset = offset2 }, \
  170. { .type = iom3, .offset = offset3 }, \
  171. }, \
  172. }
  173. #define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, \
  174. iom2, iom3, drv0, drv1, drv2, \
  175. drv3, offset0, offset1, \
  176. offset2, offset3) \
  177. { \
  178. .bank_num = id, \
  179. .nr_pins = pins, \
  180. .name = label, \
  181. .iomux = { \
  182. { .type = iom0, .offset = -1 }, \
  183. { .type = iom1, .offset = -1 }, \
  184. { .type = iom2, .offset = -1 }, \
  185. { .type = iom3, .offset = -1 }, \
  186. }, \
  187. .drv = { \
  188. { .drv_type = drv0, .offset = offset0 }, \
  189. { .drv_type = drv1, .offset = offset1 }, \
  190. { .drv_type = drv2, .offset = offset2 }, \
  191. { .drv_type = drv3, .offset = offset3 }, \
  192. }, \
  193. }
  194. #define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, \
  195. label, iom0, iom1, iom2, \
  196. iom3, drv0, drv1, drv2, \
  197. drv3, offset0, offset1, \
  198. offset2, offset3, pull0, \
  199. pull1, pull2, pull3) \
  200. { \
  201. .bank_num = id, \
  202. .nr_pins = pins, \
  203. .name = label, \
  204. .iomux = { \
  205. { .type = iom0, .offset = -1 }, \
  206. { .type = iom1, .offset = -1 }, \
  207. { .type = iom2, .offset = -1 }, \
  208. { .type = iom3, .offset = -1 }, \
  209. }, \
  210. .drv = { \
  211. { .drv_type = drv0, .offset = offset0 }, \
  212. { .drv_type = drv1, .offset = offset1 }, \
  213. { .drv_type = drv2, .offset = offset2 }, \
  214. { .drv_type = drv3, .offset = offset3 }, \
  215. }, \
  216. .pull_type[0] = pull0, \
  217. .pull_type[1] = pull1, \
  218. .pull_type[2] = pull2, \
  219. .pull_type[3] = pull3, \
  220. }
  221. #define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \
  222. { \
  223. .bank_num = ID, \
  224. .pin = PIN, \
  225. .func = FUNC, \
  226. .route_offset = REG, \
  227. .route_val = VAL, \
  228. .route_location = FLAG, \
  229. }
  230. #define RK_MUXROUTE_SAME(ID, PIN, FUNC, REG, VAL) \
  231. PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_SAME)
  232. #define RK_MUXROUTE_GRF(ID, PIN, FUNC, REG, VAL) \
  233. PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_GRF)
  234. #define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL) \
  235. PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU)
  236. #define RK3588_PIN_BANK_FLAGS(ID, PIN, LABEL, M, P) \
  237. PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P)
  238. static struct regmap_config rockchip_regmap_config = {
  239. .reg_bits = 32,
  240. .val_bits = 32,
  241. .reg_stride = 4,
  242. };
  243. static inline const struct rockchip_pin_group *pinctrl_name_to_group(
  244. const struct rockchip_pinctrl *info,
  245. const char *name)
  246. {
  247. int i;
  248. for (i = 0; i < info->ngroups; i++) {
  249. if (!strcmp(info->groups[i].name, name))
  250. return &info->groups[i];
  251. }
  252. return NULL;
  253. }
  254. /*
  255. * given a pin number that is local to a pin controller, find out the pin bank
  256. * and the register base of the pin bank.
  257. */
  258. static struct rockchip_pin_bank *pin_to_bank(struct rockchip_pinctrl *info,
  259. unsigned pin)
  260. {
  261. struct rockchip_pin_bank *b = info->ctrl->pin_banks;
  262. while (pin >= (b->pin_base + b->nr_pins))
  263. b++;
  264. return b;
  265. }
  266. static struct rockchip_pin_bank *bank_num_to_bank(
  267. struct rockchip_pinctrl *info,
  268. unsigned num)
  269. {
  270. struct rockchip_pin_bank *b = info->ctrl->pin_banks;
  271. int i;
  272. for (i = 0; i < info->ctrl->nr_banks; i++, b++) {
  273. if (b->bank_num == num)
  274. return b;
  275. }
  276. return ERR_PTR(-EINVAL);
  277. }
  278. /*
  279. * Pinctrl_ops handling
  280. */
  281. static int rockchip_get_groups_count(struct pinctrl_dev *pctldev)
  282. {
  283. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  284. return info->ngroups;
  285. }
  286. static const char *rockchip_get_group_name(struct pinctrl_dev *pctldev,
  287. unsigned selector)
  288. {
  289. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  290. return info->groups[selector].name;
  291. }
  292. static int rockchip_get_group_pins(struct pinctrl_dev *pctldev,
  293. unsigned selector, const unsigned **pins,
  294. unsigned *npins)
  295. {
  296. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  297. if (selector >= info->ngroups)
  298. return -EINVAL;
  299. *pins = info->groups[selector].pins;
  300. *npins = info->groups[selector].npins;
  301. return 0;
  302. }
  303. static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
  304. struct device_node *np,
  305. struct pinctrl_map **map, unsigned *num_maps)
  306. {
  307. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  308. const struct rockchip_pin_group *grp;
  309. struct device *dev = info->dev;
  310. struct pinctrl_map *new_map;
  311. struct device_node *parent;
  312. int map_num = 1;
  313. int i;
  314. /*
  315. * first find the group of this node and check if we need to create
  316. * config maps for pins
  317. */
  318. grp = pinctrl_name_to_group(info, np->name);
  319. if (!grp) {
  320. dev_err(dev, "unable to find group for node %pOFn\n", np);
  321. return -EINVAL;
  322. }
  323. map_num += grp->npins;
  324. new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL);
  325. if (!new_map)
  326. return -ENOMEM;
  327. *map = new_map;
  328. *num_maps = map_num;
  329. /* create mux map */
  330. parent = of_get_parent(np);
  331. if (!parent) {
  332. kfree(new_map);
  333. return -EINVAL;
  334. }
  335. new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
  336. new_map[0].data.mux.function = parent->name;
  337. new_map[0].data.mux.group = np->name;
  338. of_node_put(parent);
  339. /* create config map */
  340. new_map++;
  341. for (i = 0; i < grp->npins; i++) {
  342. new_map[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
  343. new_map[i].data.configs.group_or_pin =
  344. pin_get_name(pctldev, grp->pins[i]);
  345. new_map[i].data.configs.configs = grp->data[i].configs;
  346. new_map[i].data.configs.num_configs = grp->data[i].nconfigs;
  347. }
  348. dev_dbg(dev, "maps: function %s group %s num %d\n",
  349. (*map)->data.mux.function, (*map)->data.mux.group, map_num);
  350. return 0;
  351. }
  352. static void rockchip_dt_free_map(struct pinctrl_dev *pctldev,
  353. struct pinctrl_map *map, unsigned num_maps)
  354. {
  355. kfree(map);
  356. }
  357. static const struct pinctrl_ops rockchip_pctrl_ops = {
  358. .get_groups_count = rockchip_get_groups_count,
  359. .get_group_name = rockchip_get_group_name,
  360. .get_group_pins = rockchip_get_group_pins,
  361. .dt_node_to_map = rockchip_dt_node_to_map,
  362. .dt_free_map = rockchip_dt_free_map,
  363. };
  364. /*
  365. * Hardware access
  366. */
  367. static struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = {
  368. {
  369. .num = 1,
  370. .pin = 0,
  371. .reg = 0x418,
  372. .bit = 0,
  373. .mask = 0x3
  374. }, {
  375. .num = 1,
  376. .pin = 1,
  377. .reg = 0x418,
  378. .bit = 2,
  379. .mask = 0x3
  380. }, {
  381. .num = 1,
  382. .pin = 2,
  383. .reg = 0x418,
  384. .bit = 4,
  385. .mask = 0x3
  386. }, {
  387. .num = 1,
  388. .pin = 3,
  389. .reg = 0x418,
  390. .bit = 6,
  391. .mask = 0x3
  392. }, {
  393. .num = 1,
  394. .pin = 4,
  395. .reg = 0x418,
  396. .bit = 8,
  397. .mask = 0x3
  398. }, {
  399. .num = 1,
  400. .pin = 5,
  401. .reg = 0x418,
  402. .bit = 10,
  403. .mask = 0x3
  404. }, {
  405. .num = 1,
  406. .pin = 6,
  407. .reg = 0x418,
  408. .bit = 12,
  409. .mask = 0x3
  410. }, {
  411. .num = 1,
  412. .pin = 7,
  413. .reg = 0x418,
  414. .bit = 14,
  415. .mask = 0x3
  416. }, {
  417. .num = 1,
  418. .pin = 8,
  419. .reg = 0x41c,
  420. .bit = 0,
  421. .mask = 0x3
  422. }, {
  423. .num = 1,
  424. .pin = 9,
  425. .reg = 0x41c,
  426. .bit = 2,
  427. .mask = 0x3
  428. },
  429. };
  430. static struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = {
  431. {
  432. .num = 0,
  433. .pin = 20,
  434. .reg = 0x10000,
  435. .bit = 0,
  436. .mask = 0xf
  437. },
  438. {
  439. .num = 0,
  440. .pin = 21,
  441. .reg = 0x10000,
  442. .bit = 4,
  443. .mask = 0xf
  444. },
  445. {
  446. .num = 0,
  447. .pin = 22,
  448. .reg = 0x10000,
  449. .bit = 8,
  450. .mask = 0xf
  451. },
  452. {
  453. .num = 0,
  454. .pin = 23,
  455. .reg = 0x10000,
  456. .bit = 12,
  457. .mask = 0xf
  458. },
  459. };
  460. static struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = {
  461. {
  462. .num = 2,
  463. .pin = 20,
  464. .reg = 0xe8,
  465. .bit = 0,
  466. .mask = 0x7
  467. }, {
  468. .num = 2,
  469. .pin = 21,
  470. .reg = 0xe8,
  471. .bit = 4,
  472. .mask = 0x7
  473. }, {
  474. .num = 2,
  475. .pin = 22,
  476. .reg = 0xe8,
  477. .bit = 8,
  478. .mask = 0x7
  479. }, {
  480. .num = 2,
  481. .pin = 23,
  482. .reg = 0xe8,
  483. .bit = 12,
  484. .mask = 0x7
  485. }, {
  486. .num = 2,
  487. .pin = 24,
  488. .reg = 0xd4,
  489. .bit = 12,
  490. .mask = 0x7
  491. },
  492. };
  493. static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
  494. {
  495. /* gpio1b6_sel */
  496. .num = 1,
  497. .pin = 14,
  498. .reg = 0x28,
  499. .bit = 12,
  500. .mask = 0xf
  501. }, {
  502. /* gpio1b7_sel */
  503. .num = 1,
  504. .pin = 15,
  505. .reg = 0x2c,
  506. .bit = 0,
  507. .mask = 0x3
  508. }, {
  509. /* gpio1c2_sel */
  510. .num = 1,
  511. .pin = 18,
  512. .reg = 0x30,
  513. .bit = 4,
  514. .mask = 0xf
  515. }, {
  516. /* gpio1c3_sel */
  517. .num = 1,
  518. .pin = 19,
  519. .reg = 0x30,
  520. .bit = 8,
  521. .mask = 0xf
  522. }, {
  523. /* gpio1c4_sel */
  524. .num = 1,
  525. .pin = 20,
  526. .reg = 0x30,
  527. .bit = 12,
  528. .mask = 0xf
  529. }, {
  530. /* gpio1c5_sel */
  531. .num = 1,
  532. .pin = 21,
  533. .reg = 0x34,
  534. .bit = 0,
  535. .mask = 0xf
  536. }, {
  537. /* gpio1c6_sel */
  538. .num = 1,
  539. .pin = 22,
  540. .reg = 0x34,
  541. .bit = 4,
  542. .mask = 0xf
  543. }, {
  544. /* gpio1c7_sel */
  545. .num = 1,
  546. .pin = 23,
  547. .reg = 0x34,
  548. .bit = 8,
  549. .mask = 0xf
  550. }, {
  551. /* gpio2a2_sel */
  552. .num = 2,
  553. .pin = 2,
  554. .reg = 0x40,
  555. .bit = 4,
  556. .mask = 0x3
  557. }, {
  558. /* gpio2a3_sel */
  559. .num = 2,
  560. .pin = 3,
  561. .reg = 0x40,
  562. .bit = 6,
  563. .mask = 0x3
  564. }, {
  565. /* gpio2c0_sel */
  566. .num = 2,
  567. .pin = 16,
  568. .reg = 0x50,
  569. .bit = 0,
  570. .mask = 0x3
  571. }, {
  572. /* gpio3b2_sel */
  573. .num = 3,
  574. .pin = 10,
  575. .reg = 0x68,
  576. .bit = 4,
  577. .mask = 0x3
  578. }, {
  579. /* gpio3b3_sel */
  580. .num = 3,
  581. .pin = 11,
  582. .reg = 0x68,
  583. .bit = 6,
  584. .mask = 0x3
  585. }, {
  586. /* gpio3b4_sel */
  587. .num = 3,
  588. .pin = 12,
  589. .reg = 0x68,
  590. .bit = 8,
  591. .mask = 0xf
  592. }, {
  593. /* gpio3b5_sel */
  594. .num = 3,
  595. .pin = 13,
  596. .reg = 0x68,
  597. .bit = 12,
  598. .mask = 0xf
  599. },
  600. };
  601. static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
  602. {
  603. /* gpio2_b7_sel */
  604. .num = 2,
  605. .pin = 15,
  606. .reg = 0x28,
  607. .bit = 0,
  608. .mask = 0x7
  609. }, {
  610. /* gpio2_c7_sel */
  611. .num = 2,
  612. .pin = 23,
  613. .reg = 0x30,
  614. .bit = 14,
  615. .mask = 0x3
  616. }, {
  617. /* gpio3_b1_sel */
  618. .num = 3,
  619. .pin = 9,
  620. .reg = 0x44,
  621. .bit = 2,
  622. .mask = 0x3
  623. }, {
  624. /* gpio3_b2_sel */
  625. .num = 3,
  626. .pin = 10,
  627. .reg = 0x44,
  628. .bit = 4,
  629. .mask = 0x3
  630. }, {
  631. /* gpio3_b3_sel */
  632. .num = 3,
  633. .pin = 11,
  634. .reg = 0x44,
  635. .bit = 6,
  636. .mask = 0x3
  637. }, {
  638. /* gpio3_b4_sel */
  639. .num = 3,
  640. .pin = 12,
  641. .reg = 0x44,
  642. .bit = 8,
  643. .mask = 0x3
  644. }, {
  645. /* gpio3_b5_sel */
  646. .num = 3,
  647. .pin = 13,
  648. .reg = 0x44,
  649. .bit = 10,
  650. .mask = 0x3
  651. }, {
  652. /* gpio3_b6_sel */
  653. .num = 3,
  654. .pin = 14,
  655. .reg = 0x44,
  656. .bit = 12,
  657. .mask = 0x3
  658. }, {
  659. /* gpio3_b7_sel */
  660. .num = 3,
  661. .pin = 15,
  662. .reg = 0x44,
  663. .bit = 14,
  664. .mask = 0x3
  665. },
  666. };
  667. static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
  668. int *reg, u8 *bit, int *mask)
  669. {
  670. struct rockchip_pinctrl *info = bank->drvdata;
  671. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  672. struct rockchip_mux_recalced_data *data;
  673. int i;
  674. for (i = 0; i < ctrl->niomux_recalced; i++) {
  675. data = &ctrl->iomux_recalced[i];
  676. if (data->num == bank->bank_num &&
  677. data->pin == pin)
  678. break;
  679. }
  680. if (i >= ctrl->niomux_recalced)
  681. return;
  682. *reg = data->reg;
  683. *mask = data->mask;
  684. *bit = data->bit;
  685. }
  686. static struct rockchip_mux_route_data px30_mux_route_data[] = {
  687. RK_MUXROUTE_SAME(2, RK_PB4, 1, 0x184, BIT(16 + 7)), /* cif-d0m0 */
  688. RK_MUXROUTE_SAME(3, RK_PA1, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d0m1 */
  689. RK_MUXROUTE_SAME(2, RK_PB6, 1, 0x184, BIT(16 + 7)), /* cif-d1m0 */
  690. RK_MUXROUTE_SAME(3, RK_PA2, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d1m1 */
  691. RK_MUXROUTE_SAME(2, RK_PA0, 1, 0x184, BIT(16 + 7)), /* cif-d2m0 */
  692. RK_MUXROUTE_SAME(3, RK_PA3, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d2m1 */
  693. RK_MUXROUTE_SAME(2, RK_PA1, 1, 0x184, BIT(16 + 7)), /* cif-d3m0 */
  694. RK_MUXROUTE_SAME(3, RK_PA5, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d3m1 */
  695. RK_MUXROUTE_SAME(2, RK_PA2, 1, 0x184, BIT(16 + 7)), /* cif-d4m0 */
  696. RK_MUXROUTE_SAME(3, RK_PA7, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d4m1 */
  697. RK_MUXROUTE_SAME(2, RK_PA3, 1, 0x184, BIT(16 + 7)), /* cif-d5m0 */
  698. RK_MUXROUTE_SAME(3, RK_PB0, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d5m1 */
  699. RK_MUXROUTE_SAME(2, RK_PA4, 1, 0x184, BIT(16 + 7)), /* cif-d6m0 */
  700. RK_MUXROUTE_SAME(3, RK_PB1, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d6m1 */
  701. RK_MUXROUTE_SAME(2, RK_PA5, 1, 0x184, BIT(16 + 7)), /* cif-d7m0 */
  702. RK_MUXROUTE_SAME(3, RK_PB4, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d7m1 */
  703. RK_MUXROUTE_SAME(2, RK_PA6, 1, 0x184, BIT(16 + 7)), /* cif-d8m0 */
  704. RK_MUXROUTE_SAME(3, RK_PB6, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d8m1 */
  705. RK_MUXROUTE_SAME(2, RK_PA7, 1, 0x184, BIT(16 + 7)), /* cif-d9m0 */
  706. RK_MUXROUTE_SAME(3, RK_PB7, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d9m1 */
  707. RK_MUXROUTE_SAME(2, RK_PB7, 1, 0x184, BIT(16 + 7)), /* cif-d10m0 */
  708. RK_MUXROUTE_SAME(3, RK_PC6, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d10m1 */
  709. RK_MUXROUTE_SAME(2, RK_PC0, 1, 0x184, BIT(16 + 7)), /* cif-d11m0 */
  710. RK_MUXROUTE_SAME(3, RK_PC7, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d11m1 */
  711. RK_MUXROUTE_SAME(2, RK_PB0, 1, 0x184, BIT(16 + 7)), /* cif-vsyncm0 */
  712. RK_MUXROUTE_SAME(3, RK_PD1, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-vsyncm1 */
  713. RK_MUXROUTE_SAME(2, RK_PB1, 1, 0x184, BIT(16 + 7)), /* cif-hrefm0 */
  714. RK_MUXROUTE_SAME(3, RK_PD2, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-hrefm1 */
  715. RK_MUXROUTE_SAME(2, RK_PB2, 1, 0x184, BIT(16 + 7)), /* cif-clkinm0 */
  716. RK_MUXROUTE_SAME(3, RK_PD3, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-clkinm1 */
  717. RK_MUXROUTE_SAME(2, RK_PB3, 1, 0x184, BIT(16 + 7)), /* cif-clkoutm0 */
  718. RK_MUXROUTE_SAME(3, RK_PD0, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-clkoutm1 */
  719. RK_MUXROUTE_SAME(3, RK_PC6, 2, 0x184, BIT(16 + 8)), /* pdm-m0 */
  720. RK_MUXROUTE_SAME(2, RK_PC6, 1, 0x184, BIT(16 + 8) | BIT(8)), /* pdm-m1 */
  721. RK_MUXROUTE_SAME(3, RK_PD3, 2, 0x184, BIT(16 + 8)), /* pdm-sdi0m0 */
  722. RK_MUXROUTE_SAME(2, RK_PC5, 2, 0x184, BIT(16 + 8) | BIT(8)), /* pdm-sdi0m1 */
  723. RK_MUXROUTE_SAME(1, RK_PD3, 2, 0x184, BIT(16 + 10)), /* uart2-rxm0 */
  724. RK_MUXROUTE_SAME(2, RK_PB6, 2, 0x184, BIT(16 + 10) | BIT(10)), /* uart2-rxm1 */
  725. RK_MUXROUTE_SAME(1, RK_PD2, 2, 0x184, BIT(16 + 10)), /* uart2-txm0 */
  726. RK_MUXROUTE_SAME(2, RK_PB4, 2, 0x184, BIT(16 + 10) | BIT(10)), /* uart2-txm1 */
  727. RK_MUXROUTE_SAME(0, RK_PC1, 2, 0x184, BIT(16 + 9)), /* uart3-rxm0 */
  728. RK_MUXROUTE_SAME(1, RK_PB7, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-rxm1 */
  729. RK_MUXROUTE_SAME(0, RK_PC0, 2, 0x184, BIT(16 + 9)), /* uart3-txm0 */
  730. RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-txm1 */
  731. RK_MUXROUTE_SAME(0, RK_PC2, 2, 0x184, BIT(16 + 9)), /* uart3-ctsm0 */
  732. RK_MUXROUTE_SAME(1, RK_PB4, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-ctsm1 */
  733. RK_MUXROUTE_SAME(0, RK_PC3, 2, 0x184, BIT(16 + 9)), /* uart3-rtsm0 */
  734. RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-rtsm1 */
  735. };
  736. static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
  737. RK_MUXROUTE_GRF(3, RK_PD2, 1, 0x10260, WRITE_MASK_VAL(0, 0, 0)), /* I2S0_MCLK_M0 */
  738. RK_MUXROUTE_GRF(3, RK_PB0, 3, 0x10260, WRITE_MASK_VAL(0, 0, 1)), /* I2S0_MCLK_M1 */
  739. RK_MUXROUTE_GRF(0, RK_PD4, 4, 0x10260, WRITE_MASK_VAL(3, 2, 0)), /* I2S1_MCLK_M0 */
  740. RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x10260, WRITE_MASK_VAL(3, 2, 1)), /* I2S1_MCLK_M1 */
  741. RK_MUXROUTE_GRF(2, RK_PC7, 6, 0x10260, WRITE_MASK_VAL(3, 2, 2)), /* I2S1_MCLK_M2 */
  742. RK_MUXROUTE_GRF(1, RK_PD0, 1, 0x10260, WRITE_MASK_VAL(4, 4, 0)), /* I2S2_MCLK_M0 */
  743. RK_MUXROUTE_GRF(2, RK_PB3, 2, 0x10260, WRITE_MASK_VAL(4, 4, 1)), /* I2S2_MCLK_M1 */
  744. RK_MUXROUTE_GRF(3, RK_PD4, 2, 0x10260, WRITE_MASK_VAL(12, 12, 0)), /* PDM_CLK0_M0 */
  745. RK_MUXROUTE_GRF(3, RK_PC0, 3, 0x10260, WRITE_MASK_VAL(12, 12, 1)), /* PDM_CLK0_M1 */
  746. RK_MUXROUTE_GRF(3, RK_PC6, 1, 0x10264, WRITE_MASK_VAL(0, 0, 0)), /* CIF_CLKOUT_M0 */
  747. RK_MUXROUTE_GRF(2, RK_PD1, 3, 0x10264, WRITE_MASK_VAL(0, 0, 1)), /* CIF_CLKOUT_M1 */
  748. RK_MUXROUTE_GRF(3, RK_PA4, 5, 0x10264, WRITE_MASK_VAL(5, 4, 0)), /* I2C3_SCL_M0 */
  749. RK_MUXROUTE_GRF(2, RK_PD4, 7, 0x10264, WRITE_MASK_VAL(5, 4, 1)), /* I2C3_SCL_M1 */
  750. RK_MUXROUTE_GRF(1, RK_PD6, 3, 0x10264, WRITE_MASK_VAL(5, 4, 2)), /* I2C3_SCL_M2 */
  751. RK_MUXROUTE_GRF(3, RK_PA0, 7, 0x10264, WRITE_MASK_VAL(6, 6, 0)), /* I2C4_SCL_M0 */
  752. RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x10264, WRITE_MASK_VAL(6, 6, 1)), /* I2C4_SCL_M1 */
  753. RK_MUXROUTE_GRF(2, RK_PA5, 7, 0x10264, WRITE_MASK_VAL(9, 8, 0)), /* I2C5_SCL_M0 */
  754. RK_MUXROUTE_GRF(3, RK_PB0, 5, 0x10264, WRITE_MASK_VAL(9, 8, 1)), /* I2C5_SCL_M1 */
  755. RK_MUXROUTE_GRF(1, RK_PD0, 4, 0x10264, WRITE_MASK_VAL(9, 8, 2)), /* I2C5_SCL_M2 */
  756. RK_MUXROUTE_GRF(3, RK_PC0, 5, 0x10264, WRITE_MASK_VAL(11, 10, 0)), /* SPI1_CLK_M0 */
  757. RK_MUXROUTE_GRF(1, RK_PC6, 3, 0x10264, WRITE_MASK_VAL(11, 10, 1)), /* SPI1_CLK_M1 */
  758. RK_MUXROUTE_GRF(2, RK_PD5, 6, 0x10264, WRITE_MASK_VAL(11, 10, 2)), /* SPI1_CLK_M2 */
  759. RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x10264, WRITE_MASK_VAL(12, 12, 0)), /* RGMII_CLK_M0 */
  760. RK_MUXROUTE_GRF(2, RK_PB7, 2, 0x10264, WRITE_MASK_VAL(12, 12, 1)), /* RGMII_CLK_M1 */
  761. RK_MUXROUTE_GRF(3, RK_PA1, 3, 0x10264, WRITE_MASK_VAL(13, 13, 0)), /* CAN_TXD_M0 */
  762. RK_MUXROUTE_GRF(3, RK_PA7, 5, 0x10264, WRITE_MASK_VAL(13, 13, 1)), /* CAN_TXD_M1 */
  763. RK_MUXROUTE_GRF(3, RK_PA4, 6, 0x10268, WRITE_MASK_VAL(0, 0, 0)), /* PWM8_M0 */
  764. RK_MUXROUTE_GRF(2, RK_PD7, 5, 0x10268, WRITE_MASK_VAL(0, 0, 1)), /* PWM8_M1 */
  765. RK_MUXROUTE_GRF(3, RK_PA5, 6, 0x10268, WRITE_MASK_VAL(2, 2, 0)), /* PWM9_M0 */
  766. RK_MUXROUTE_GRF(2, RK_PD6, 5, 0x10268, WRITE_MASK_VAL(2, 2, 1)), /* PWM9_M1 */
  767. RK_MUXROUTE_GRF(3, RK_PA6, 6, 0x10268, WRITE_MASK_VAL(4, 4, 0)), /* PWM10_M0 */
  768. RK_MUXROUTE_GRF(2, RK_PD5, 5, 0x10268, WRITE_MASK_VAL(4, 4, 1)), /* PWM10_M1 */
  769. RK_MUXROUTE_GRF(3, RK_PA7, 6, 0x10268, WRITE_MASK_VAL(6, 6, 0)), /* PWM11_IR_M0 */
  770. RK_MUXROUTE_GRF(3, RK_PA1, 5, 0x10268, WRITE_MASK_VAL(6, 6, 1)), /* PWM11_IR_M1 */
  771. RK_MUXROUTE_GRF(1, RK_PA5, 3, 0x10268, WRITE_MASK_VAL(8, 8, 0)), /* UART2_TX_M0 */
  772. RK_MUXROUTE_GRF(3, RK_PA2, 1, 0x10268, WRITE_MASK_VAL(8, 8, 1)), /* UART2_TX_M1 */
  773. RK_MUXROUTE_GRF(3, RK_PC6, 3, 0x10268, WRITE_MASK_VAL(11, 10, 0)), /* UART3_TX_M0 */
  774. RK_MUXROUTE_GRF(1, RK_PA7, 2, 0x10268, WRITE_MASK_VAL(11, 10, 1)), /* UART3_TX_M1 */
  775. RK_MUXROUTE_GRF(3, RK_PA0, 4, 0x10268, WRITE_MASK_VAL(11, 10, 2)), /* UART3_TX_M2 */
  776. RK_MUXROUTE_GRF(3, RK_PA4, 4, 0x10268, WRITE_MASK_VAL(13, 12, 0)), /* UART4_TX_M0 */
  777. RK_MUXROUTE_GRF(2, RK_PA6, 4, 0x10268, WRITE_MASK_VAL(13, 12, 1)), /* UART4_TX_M1 */
  778. RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x10268, WRITE_MASK_VAL(13, 12, 2)), /* UART4_TX_M2 */
  779. RK_MUXROUTE_GRF(3, RK_PA6, 4, 0x10268, WRITE_MASK_VAL(15, 14, 0)), /* UART5_TX_M0 */
  780. RK_MUXROUTE_GRF(2, RK_PB0, 4, 0x10268, WRITE_MASK_VAL(15, 14, 1)), /* UART5_TX_M1 */
  781. RK_MUXROUTE_GRF(2, RK_PA0, 3, 0x10268, WRITE_MASK_VAL(15, 14, 2)), /* UART5_TX_M2 */
  782. RK_MUXROUTE_PMU(0, RK_PB6, 3, 0x0114, WRITE_MASK_VAL(0, 0, 0)), /* PWM0_M0 */
  783. RK_MUXROUTE_PMU(2, RK_PB3, 5, 0x0114, WRITE_MASK_VAL(0, 0, 1)), /* PWM0_M1 */
  784. RK_MUXROUTE_PMU(0, RK_PB7, 3, 0x0114, WRITE_MASK_VAL(2, 2, 0)), /* PWM1_M0 */
  785. RK_MUXROUTE_PMU(2, RK_PB2, 5, 0x0114, WRITE_MASK_VAL(2, 2, 1)), /* PWM1_M1 */
  786. RK_MUXROUTE_PMU(0, RK_PC0, 3, 0x0114, WRITE_MASK_VAL(4, 4, 0)), /* PWM2_M0 */
  787. RK_MUXROUTE_PMU(2, RK_PB1, 5, 0x0114, WRITE_MASK_VAL(4, 4, 1)), /* PWM2_M1 */
  788. RK_MUXROUTE_PMU(0, RK_PC1, 3, 0x0114, WRITE_MASK_VAL(6, 6, 0)), /* PWM3_IR_M0 */
  789. RK_MUXROUTE_PMU(2, RK_PB0, 5, 0x0114, WRITE_MASK_VAL(6, 6, 1)), /* PWM3_IR_M1 */
  790. RK_MUXROUTE_PMU(0, RK_PC2, 3, 0x0114, WRITE_MASK_VAL(8, 8, 0)), /* PWM4_M0 */
  791. RK_MUXROUTE_PMU(2, RK_PA7, 5, 0x0114, WRITE_MASK_VAL(8, 8, 1)), /* PWM4_M1 */
  792. RK_MUXROUTE_PMU(0, RK_PC3, 3, 0x0114, WRITE_MASK_VAL(10, 10, 0)), /* PWM5_M0 */
  793. RK_MUXROUTE_PMU(2, RK_PA6, 5, 0x0114, WRITE_MASK_VAL(10, 10, 1)), /* PWM5_M1 */
  794. RK_MUXROUTE_PMU(0, RK_PB2, 3, 0x0114, WRITE_MASK_VAL(12, 12, 0)), /* PWM6_M0 */
  795. RK_MUXROUTE_PMU(2, RK_PD4, 5, 0x0114, WRITE_MASK_VAL(12, 12, 1)), /* PWM6_M1 */
  796. RK_MUXROUTE_PMU(0, RK_PB1, 3, 0x0114, WRITE_MASK_VAL(14, 14, 0)), /* PWM7_IR_M0 */
  797. RK_MUXROUTE_PMU(3, RK_PA0, 5, 0x0114, WRITE_MASK_VAL(14, 14, 1)), /* PWM7_IR_M1 */
  798. RK_MUXROUTE_PMU(0, RK_PB0, 1, 0x0118, WRITE_MASK_VAL(1, 0, 0)), /* SPI0_CLK_M0 */
  799. RK_MUXROUTE_PMU(2, RK_PA1, 1, 0x0118, WRITE_MASK_VAL(1, 0, 1)), /* SPI0_CLK_M1 */
  800. RK_MUXROUTE_PMU(2, RK_PB2, 6, 0x0118, WRITE_MASK_VAL(1, 0, 2)), /* SPI0_CLK_M2 */
  801. RK_MUXROUTE_PMU(0, RK_PB6, 2, 0x0118, WRITE_MASK_VAL(2, 2, 0)), /* UART1_TX_M0 */
  802. RK_MUXROUTE_PMU(1, RK_PD0, 5, 0x0118, WRITE_MASK_VAL(2, 2, 1)), /* UART1_TX_M1 */
  803. };
  804. static struct rockchip_mux_route_data rk3128_mux_route_data[] = {
  805. RK_MUXROUTE_SAME(1, RK_PB2, 1, 0x144, BIT(16 + 3) | BIT(16 + 4)), /* spi-0 */
  806. RK_MUXROUTE_SAME(1, RK_PD3, 3, 0x144, BIT(16 + 3) | BIT(16 + 4) | BIT(3)), /* spi-1 */
  807. RK_MUXROUTE_SAME(0, RK_PB5, 2, 0x144, BIT(16 + 3) | BIT(16 + 4) | BIT(4)), /* spi-2 */
  808. RK_MUXROUTE_SAME(1, RK_PA5, 1, 0x144, BIT(16 + 5)), /* i2s-0 */
  809. RK_MUXROUTE_SAME(0, RK_PB6, 1, 0x144, BIT(16 + 5) | BIT(5)), /* i2s-1 */
  810. RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x144, BIT(16 + 6)), /* emmc-0 */
  811. RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x144, BIT(16 + 6) | BIT(6)), /* emmc-1 */
  812. };
  813. static struct rockchip_mux_route_data rk3188_mux_route_data[] = {
  814. RK_MUXROUTE_SAME(0, RK_PD0, 1, 0xa0, BIT(16 + 11)), /* non-iomuxed emmc/flash pins on flash-dqs */
  815. RK_MUXROUTE_SAME(0, RK_PD0, 2, 0xa0, BIT(16 + 11) | BIT(11)), /* non-iomuxed emmc/flash pins on emmc-clk */
  816. };
  817. static struct rockchip_mux_route_data rk3228_mux_route_data[] = {
  818. RK_MUXROUTE_SAME(0, RK_PD2, 1, 0x50, BIT(16)), /* pwm0-0 */
  819. RK_MUXROUTE_SAME(3, RK_PC5, 1, 0x50, BIT(16) | BIT(0)), /* pwm0-1 */
  820. RK_MUXROUTE_SAME(0, RK_PD3, 1, 0x50, BIT(16 + 1)), /* pwm1-0 */
  821. RK_MUXROUTE_SAME(0, RK_PD6, 2, 0x50, BIT(16 + 1) | BIT(1)), /* pwm1-1 */
  822. RK_MUXROUTE_SAME(0, RK_PD4, 1, 0x50, BIT(16 + 2)), /* pwm2-0 */
  823. RK_MUXROUTE_SAME(1, RK_PB4, 2, 0x50, BIT(16 + 2) | BIT(2)), /* pwm2-1 */
  824. RK_MUXROUTE_SAME(3, RK_PD2, 1, 0x50, BIT(16 + 3)), /* pwm3-0 */
  825. RK_MUXROUTE_SAME(1, RK_PB3, 2, 0x50, BIT(16 + 3) | BIT(3)), /* pwm3-1 */
  826. RK_MUXROUTE_SAME(1, RK_PA1, 1, 0x50, BIT(16 + 4)), /* sdio-0_d0 */
  827. RK_MUXROUTE_SAME(3, RK_PA2, 1, 0x50, BIT(16 + 4) | BIT(4)), /* sdio-1_d0 */
  828. RK_MUXROUTE_SAME(0, RK_PB5, 2, 0x50, BIT(16 + 5)), /* spi-0_rx */
  829. RK_MUXROUTE_SAME(2, RK_PA0, 2, 0x50, BIT(16 + 5) | BIT(5)), /* spi-1_rx */
  830. RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x50, BIT(16 + 7)), /* emmc-0_cmd */
  831. RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x50, BIT(16 + 7) | BIT(7)), /* emmc-1_cmd */
  832. RK_MUXROUTE_SAME(1, RK_PC3, 2, 0x50, BIT(16 + 8)), /* uart2-0_rx */
  833. RK_MUXROUTE_SAME(1, RK_PB2, 2, 0x50, BIT(16 + 8) | BIT(8)), /* uart2-1_rx */
  834. RK_MUXROUTE_SAME(1, RK_PB2, 1, 0x50, BIT(16 + 11)), /* uart1-0_rx */
  835. RK_MUXROUTE_SAME(3, RK_PB5, 1, 0x50, BIT(16 + 11) | BIT(11)), /* uart1-1_rx */
  836. };
  837. static struct rockchip_mux_route_data rk3288_mux_route_data[] = {
  838. RK_MUXROUTE_SAME(7, RK_PC0, 2, 0x264, BIT(16 + 12) | BIT(12)), /* edphdmi_cecinoutt1 */
  839. RK_MUXROUTE_SAME(7, RK_PC7, 4, 0x264, BIT(16 + 12)), /* edphdmi_cecinout */
  840. };
  841. static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
  842. RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
  843. RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
  844. RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
  845. RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x314, BIT(16 + 4)), /* i2c3_sdam0 */
  846. RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x314, BIT(16 + 4) | BIT(4)), /* i2c3_sdam1 */
  847. RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
  848. RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
  849. RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
  850. RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclkrxm1 */
  851. RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, BIT(16 + 12) | BIT(16 + 13)), /* pdm-clkm0 */
  852. RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
  853. RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
  854. RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
  855. };
  856. static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
  857. RK_MUXROUTE_SAME(1, RK_PA1, 2, 0x50, BIT(16) | BIT(16 + 1)), /* uart2dbg_rxm0 */
  858. RK_MUXROUTE_SAME(2, RK_PA1, 1, 0x50, BIT(16) | BIT(16 + 1) | BIT(0)), /* uart2dbg_rxm1 */
  859. RK_MUXROUTE_SAME(1, RK_PB3, 2, 0x50, BIT(16 + 2) | BIT(2)), /* gmac-m1_rxd0 */
  860. RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x50, BIT(16 + 10) | BIT(10)), /* gmac-m1-optimized_rxd3 */
  861. RK_MUXROUTE_SAME(2, RK_PC3, 2, 0x50, BIT(16 + 3)), /* pdm_sdi0m0 */
  862. RK_MUXROUTE_SAME(1, RK_PC7, 3, 0x50, BIT(16 + 3) | BIT(3)), /* pdm_sdi0m1 */
  863. RK_MUXROUTE_SAME(3, RK_PA2, 4, 0x50, BIT(16 + 4) | BIT(16 + 5) | BIT(5)), /* spi_rxdm2 */
  864. RK_MUXROUTE_SAME(1, RK_PD0, 1, 0x50, BIT(16 + 6)), /* i2s2_sdim0 */
  865. RK_MUXROUTE_SAME(3, RK_PA2, 6, 0x50, BIT(16 + 6) | BIT(6)), /* i2s2_sdim1 */
  866. RK_MUXROUTE_SAME(2, RK_PC6, 3, 0x50, BIT(16 + 7) | BIT(7)), /* card_iom1 */
  867. RK_MUXROUTE_SAME(2, RK_PC0, 3, 0x50, BIT(16 + 8) | BIT(8)), /* tsp_d5m1 */
  868. RK_MUXROUTE_SAME(2, RK_PC0, 4, 0x50, BIT(16 + 9) | BIT(9)), /* cif_data5m1 */
  869. };
  870. static struct rockchip_mux_route_data rk3399_mux_route_data[] = {
  871. RK_MUXROUTE_SAME(4, RK_PB0, 2, 0xe21c, BIT(16 + 10) | BIT(16 + 11)), /* uart2dbga_rx */
  872. RK_MUXROUTE_SAME(4, RK_PC0, 2, 0xe21c, BIT(16 + 10) | BIT(16 + 11) | BIT(10)), /* uart2dbgb_rx */
  873. RK_MUXROUTE_SAME(4, RK_PC3, 1, 0xe21c, BIT(16 + 10) | BIT(16 + 11) | BIT(11)), /* uart2dbgc_rx */
  874. RK_MUXROUTE_SAME(2, RK_PD2, 2, 0xe21c, BIT(16 + 14)), /* pcie_clkreqn */
  875. RK_MUXROUTE_SAME(4, RK_PD0, 1, 0xe21c, BIT(16 + 14) | BIT(14)), /* pcie_clkreqnb */
  876. };
  877. static struct rockchip_mux_route_data rk3568_mux_route_data[] = {
  878. RK_MUXROUTE_PMU(0, RK_PB7, 1, 0x0110, WRITE_MASK_VAL(1, 0, 0)), /* PWM0 IO mux M0 */
  879. RK_MUXROUTE_PMU(0, RK_PC7, 2, 0x0110, WRITE_MASK_VAL(1, 0, 1)), /* PWM0 IO mux M1 */
  880. RK_MUXROUTE_PMU(0, RK_PC0, 1, 0x0110, WRITE_MASK_VAL(3, 2, 0)), /* PWM1 IO mux M0 */
  881. RK_MUXROUTE_PMU(0, RK_PB5, 4, 0x0110, WRITE_MASK_VAL(3, 2, 1)), /* PWM1 IO mux M1 */
  882. RK_MUXROUTE_PMU(0, RK_PC1, 1, 0x0110, WRITE_MASK_VAL(5, 4, 0)), /* PWM2 IO mux M0 */
  883. RK_MUXROUTE_PMU(0, RK_PB6, 4, 0x0110, WRITE_MASK_VAL(5, 4, 1)), /* PWM2 IO mux M1 */
  884. RK_MUXROUTE_GRF(0, RK_PB3, 2, 0x0300, WRITE_MASK_VAL(0, 0, 0)), /* CAN0 IO mux M0 */
  885. RK_MUXROUTE_GRF(2, RK_PA1, 4, 0x0300, WRITE_MASK_VAL(0, 0, 1)), /* CAN0 IO mux M1 */
  886. RK_MUXROUTE_GRF(1, RK_PA1, 3, 0x0300, WRITE_MASK_VAL(2, 2, 0)), /* CAN1 IO mux M0 */
  887. RK_MUXROUTE_GRF(4, RK_PC3, 3, 0x0300, WRITE_MASK_VAL(2, 2, 1)), /* CAN1 IO mux M1 */
  888. RK_MUXROUTE_GRF(4, RK_PB5, 3, 0x0300, WRITE_MASK_VAL(4, 4, 0)), /* CAN2 IO mux M0 */
  889. RK_MUXROUTE_GRF(2, RK_PB2, 4, 0x0300, WRITE_MASK_VAL(4, 4, 1)), /* CAN2 IO mux M1 */
  890. RK_MUXROUTE_GRF(4, RK_PC4, 1, 0x0300, WRITE_MASK_VAL(6, 6, 0)), /* HPDIN IO mux M0 */
  891. RK_MUXROUTE_GRF(0, RK_PC2, 2, 0x0300, WRITE_MASK_VAL(6, 6, 1)), /* HPDIN IO mux M1 */
  892. RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x0300, WRITE_MASK_VAL(8, 8, 0)), /* GMAC1 IO mux M0 */
  893. RK_MUXROUTE_GRF(4, RK_PA7, 3, 0x0300, WRITE_MASK_VAL(8, 8, 1)), /* GMAC1 IO mux M1 */
  894. RK_MUXROUTE_GRF(4, RK_PD1, 1, 0x0300, WRITE_MASK_VAL(10, 10, 0)), /* HDMITX IO mux M0 */
  895. RK_MUXROUTE_GRF(0, RK_PC7, 1, 0x0300, WRITE_MASK_VAL(10, 10, 1)), /* HDMITX IO mux M1 */
  896. RK_MUXROUTE_GRF(0, RK_PB6, 1, 0x0300, WRITE_MASK_VAL(14, 14, 0)), /* I2C2 IO mux M0 */
  897. RK_MUXROUTE_GRF(4, RK_PB4, 1, 0x0300, WRITE_MASK_VAL(14, 14, 1)), /* I2C2 IO mux M1 */
  898. RK_MUXROUTE_GRF(1, RK_PA0, 1, 0x0304, WRITE_MASK_VAL(0, 0, 0)), /* I2C3 IO mux M0 */
  899. RK_MUXROUTE_GRF(3, RK_PB6, 4, 0x0304, WRITE_MASK_VAL(0, 0, 1)), /* I2C3 IO mux M1 */
  900. RK_MUXROUTE_GRF(4, RK_PB2, 1, 0x0304, WRITE_MASK_VAL(2, 2, 0)), /* I2C4 IO mux M0 */
  901. RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x0304, WRITE_MASK_VAL(2, 2, 1)), /* I2C4 IO mux M1 */
  902. RK_MUXROUTE_GRF(3, RK_PB4, 4, 0x0304, WRITE_MASK_VAL(4, 4, 0)), /* I2C5 IO mux M0 */
  903. RK_MUXROUTE_GRF(4, RK_PD0, 2, 0x0304, WRITE_MASK_VAL(4, 4, 1)), /* I2C5 IO mux M1 */
  904. RK_MUXROUTE_GRF(3, RK_PB1, 5, 0x0304, WRITE_MASK_VAL(14, 14, 0)), /* PWM8 IO mux M0 */
  905. RK_MUXROUTE_GRF(1, RK_PD5, 4, 0x0304, WRITE_MASK_VAL(14, 14, 1)), /* PWM8 IO mux M1 */
  906. RK_MUXROUTE_GRF(3, RK_PB2, 5, 0x0308, WRITE_MASK_VAL(0, 0, 0)), /* PWM9 IO mux M0 */
  907. RK_MUXROUTE_GRF(1, RK_PD6, 4, 0x0308, WRITE_MASK_VAL(0, 0, 1)), /* PWM9 IO mux M1 */
  908. RK_MUXROUTE_GRF(3, RK_PB5, 5, 0x0308, WRITE_MASK_VAL(2, 2, 0)), /* PWM10 IO mux M0 */
  909. RK_MUXROUTE_GRF(2, RK_PA1, 2, 0x0308, WRITE_MASK_VAL(2, 2, 1)), /* PWM10 IO mux M1 */
  910. RK_MUXROUTE_GRF(3, RK_PB6, 5, 0x0308, WRITE_MASK_VAL(4, 4, 0)), /* PWM11 IO mux M0 */
  911. RK_MUXROUTE_GRF(4, RK_PC0, 3, 0x0308, WRITE_MASK_VAL(4, 4, 1)), /* PWM11 IO mux M1 */
  912. RK_MUXROUTE_GRF(3, RK_PB7, 2, 0x0308, WRITE_MASK_VAL(6, 6, 0)), /* PWM12 IO mux M0 */
  913. RK_MUXROUTE_GRF(4, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(6, 6, 1)), /* PWM12 IO mux M1 */
  914. RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x0308, WRITE_MASK_VAL(8, 8, 0)), /* PWM13 IO mux M0 */
  915. RK_MUXROUTE_GRF(4, RK_PC6, 1, 0x0308, WRITE_MASK_VAL(8, 8, 1)), /* PWM13 IO mux M1 */
  916. RK_MUXROUTE_GRF(3, RK_PC4, 1, 0x0308, WRITE_MASK_VAL(10, 10, 0)), /* PWM14 IO mux M0 */
  917. RK_MUXROUTE_GRF(4, RK_PC2, 1, 0x0308, WRITE_MASK_VAL(10, 10, 1)), /* PWM14 IO mux M1 */
  918. RK_MUXROUTE_GRF(3, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(12, 12, 0)), /* PWM15 IO mux M0 */
  919. RK_MUXROUTE_GRF(4, RK_PC3, 1, 0x0308, WRITE_MASK_VAL(12, 12, 1)), /* PWM15 IO mux M1 */
  920. RK_MUXROUTE_GRF(3, RK_PD2, 3, 0x0308, WRITE_MASK_VAL(14, 14, 0)), /* SDMMC2 IO mux M0 */
  921. RK_MUXROUTE_GRF(3, RK_PA5, 5, 0x0308, WRITE_MASK_VAL(14, 14, 1)), /* SDMMC2 IO mux M1 */
  922. RK_MUXROUTE_GRF(0, RK_PB5, 2, 0x030c, WRITE_MASK_VAL(0, 0, 0)), /* SPI0 IO mux M0 */
  923. RK_MUXROUTE_GRF(2, RK_PD3, 3, 0x030c, WRITE_MASK_VAL(0, 0, 1)), /* SPI0 IO mux M1 */
  924. RK_MUXROUTE_GRF(2, RK_PB5, 3, 0x030c, WRITE_MASK_VAL(2, 2, 0)), /* SPI1 IO mux M0 */
  925. RK_MUXROUTE_GRF(3, RK_PC3, 3, 0x030c, WRITE_MASK_VAL(2, 2, 1)), /* SPI1 IO mux M1 */
  926. RK_MUXROUTE_GRF(2, RK_PC1, 4, 0x030c, WRITE_MASK_VAL(4, 4, 0)), /* SPI2 IO mux M0 */
  927. RK_MUXROUTE_GRF(3, RK_PA0, 3, 0x030c, WRITE_MASK_VAL(4, 4, 1)), /* SPI2 IO mux M1 */
  928. RK_MUXROUTE_GRF(4, RK_PB3, 4, 0x030c, WRITE_MASK_VAL(6, 6, 0)), /* SPI3 IO mux M0 */
  929. RK_MUXROUTE_GRF(4, RK_PC2, 2, 0x030c, WRITE_MASK_VAL(6, 6, 1)), /* SPI3 IO mux M1 */
  930. RK_MUXROUTE_GRF(2, RK_PB4, 2, 0x030c, WRITE_MASK_VAL(8, 8, 0)), /* UART1 IO mux M0 */
  931. RK_MUXROUTE_GRF(3, RK_PD6, 4, 0x030c, WRITE_MASK_VAL(8, 8, 1)), /* UART1 IO mux M1 */
  932. RK_MUXROUTE_GRF(0, RK_PD1, 1, 0x030c, WRITE_MASK_VAL(10, 10, 0)), /* UART2 IO mux M0 */
  933. RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x030c, WRITE_MASK_VAL(10, 10, 1)), /* UART2 IO mux M1 */
  934. RK_MUXROUTE_GRF(1, RK_PA1, 2, 0x030c, WRITE_MASK_VAL(12, 12, 0)), /* UART3 IO mux M0 */
  935. RK_MUXROUTE_GRF(3, RK_PB7, 4, 0x030c, WRITE_MASK_VAL(12, 12, 1)), /* UART3 IO mux M1 */
  936. RK_MUXROUTE_GRF(1, RK_PA6, 2, 0x030c, WRITE_MASK_VAL(14, 14, 0)), /* UART4 IO mux M0 */
  937. RK_MUXROUTE_GRF(3, RK_PB2, 4, 0x030c, WRITE_MASK_VAL(14, 14, 1)), /* UART4 IO mux M1 */
  938. RK_MUXROUTE_GRF(2, RK_PA2, 3, 0x0310, WRITE_MASK_VAL(0, 0, 0)), /* UART5 IO mux M0 */
  939. RK_MUXROUTE_GRF(3, RK_PC2, 4, 0x0310, WRITE_MASK_VAL(0, 0, 1)), /* UART5 IO mux M1 */
  940. RK_MUXROUTE_GRF(2, RK_PA4, 3, 0x0310, WRITE_MASK_VAL(2, 2, 0)), /* UART6 IO mux M0 */
  941. RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x0310, WRITE_MASK_VAL(2, 2, 1)), /* UART6 IO mux M1 */
  942. RK_MUXROUTE_GRF(2, RK_PA6, 3, 0x0310, WRITE_MASK_VAL(5, 4, 0)), /* UART7 IO mux M0 */
  943. RK_MUXROUTE_GRF(3, RK_PC4, 4, 0x0310, WRITE_MASK_VAL(5, 4, 1)), /* UART7 IO mux M1 */
  944. RK_MUXROUTE_GRF(4, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(5, 4, 2)), /* UART7 IO mux M2 */
  945. RK_MUXROUTE_GRF(2, RK_PC5, 3, 0x0310, WRITE_MASK_VAL(6, 6, 0)), /* UART8 IO mux M0 */
  946. RK_MUXROUTE_GRF(2, RK_PD7, 4, 0x0310, WRITE_MASK_VAL(6, 6, 1)), /* UART8 IO mux M1 */
  947. RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9 IO mux M0 */
  948. RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
  949. RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
  950. RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
  951. RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
  952. RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
  953. RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
  954. RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
  955. RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
  956. RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
  957. RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
  958. RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
  959. RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
  960. RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
  961. RK_MUXROUTE_GRF(3, RK_PC4, 5, 0x0314, WRITE_MASK_VAL(1, 0, 2)), /* PDM IO mux M2 */
  962. RK_MUXROUTE_GRF(0, RK_PA5, 3, 0x0314, WRITE_MASK_VAL(3, 2, 0)), /* PCIE20 IO mux M0 */
  963. RK_MUXROUTE_GRF(2, RK_PD0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 1)), /* PCIE20 IO mux M1 */
  964. RK_MUXROUTE_GRF(1, RK_PB0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 2)), /* PCIE20 IO mux M2 */
  965. RK_MUXROUTE_GRF(0, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(5, 4, 0)), /* PCIE30X1 IO mux M0 */
  966. RK_MUXROUTE_GRF(2, RK_PD2, 4, 0x0314, WRITE_MASK_VAL(5, 4, 1)), /* PCIE30X1 IO mux M1 */
  967. RK_MUXROUTE_GRF(1, RK_PA5, 4, 0x0314, WRITE_MASK_VAL(5, 4, 2)), /* PCIE30X1 IO mux M2 */
  968. RK_MUXROUTE_GRF(0, RK_PA6, 2, 0x0314, WRITE_MASK_VAL(7, 6, 0)), /* PCIE30X2 IO mux M0 */
  969. RK_MUXROUTE_GRF(2, RK_PD4, 4, 0x0314, WRITE_MASK_VAL(7, 6, 1)), /* PCIE30X2 IO mux M1 */
  970. RK_MUXROUTE_GRF(4, RK_PC2, 4, 0x0314, WRITE_MASK_VAL(7, 6, 2)), /* PCIE30X2 IO mux M2 */
  971. };
  972. static bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin,
  973. int mux, u32 *loc, u32 *reg, u32 *value)
  974. {
  975. struct rockchip_pinctrl *info = bank->drvdata;
  976. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  977. struct rockchip_mux_route_data *data;
  978. int i;
  979. for (i = 0; i < ctrl->niomux_routes; i++) {
  980. data = &ctrl->iomux_routes[i];
  981. if ((data->bank_num == bank->bank_num) &&
  982. (data->pin == pin) && (data->func == mux))
  983. break;
  984. }
  985. if (i >= ctrl->niomux_routes)
  986. return false;
  987. *loc = data->route_location;
  988. *reg = data->route_offset;
  989. *value = data->route_val;
  990. return true;
  991. }
  992. static int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin)
  993. {
  994. struct rockchip_pinctrl *info = bank->drvdata;
  995. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  996. int iomux_num = (pin / 8);
  997. struct regmap *regmap;
  998. unsigned int val;
  999. int reg, ret, mask, mux_type;
  1000. u8 bit;
  1001. if (iomux_num > 3)
  1002. return -EINVAL;
  1003. if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
  1004. dev_err(info->dev, "pin %d is unrouted\n", pin);
  1005. return -EINVAL;
  1006. }
  1007. if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
  1008. return RK_FUNC_GPIO;
  1009. if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
  1010. regmap = info->regmap_pmu;
  1011. else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
  1012. regmap = (pin % 8 < 4) ? info->regmap_pmu : info->regmap_base;
  1013. else
  1014. regmap = info->regmap_base;
  1015. /* get basic quadrupel of mux registers and the correct reg inside */
  1016. mux_type = bank->iomux[iomux_num].type;
  1017. reg = bank->iomux[iomux_num].offset;
  1018. if (mux_type & IOMUX_WIDTH_4BIT) {
  1019. if ((pin % 8) >= 4)
  1020. reg += 0x4;
  1021. bit = (pin % 4) * 4;
  1022. mask = 0xf;
  1023. } else if (mux_type & IOMUX_WIDTH_3BIT) {
  1024. if ((pin % 8) >= 5)
  1025. reg += 0x4;
  1026. bit = (pin % 8 % 5) * 3;
  1027. mask = 0x7;
  1028. } else {
  1029. bit = (pin % 8) * 2;
  1030. mask = 0x3;
  1031. }
  1032. if (bank->recalced_mask & BIT(pin))
  1033. rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
  1034. if (ctrl->type == RK3576) {
  1035. if ((bank->bank_num == 0) && (pin >= RK_PB4) && (pin <= RK_PB7))
  1036. reg += 0x1ff4; /* GPIO0_IOC_GPIO0B_IOMUX_SEL_H */
  1037. }
  1038. if (ctrl->type == RK3588) {
  1039. if (bank->bank_num == 0) {
  1040. if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
  1041. u32 reg0 = 0;
  1042. reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
  1043. ret = regmap_read(regmap, reg0, &val);
  1044. if (ret)
  1045. return ret;
  1046. if (!(val & BIT(8)))
  1047. return ((val >> bit) & mask);
  1048. reg = reg + 0x8000; /* BUS_IOC_BASE */
  1049. regmap = info->regmap_base;
  1050. }
  1051. } else if (bank->bank_num > 0) {
  1052. reg += 0x8000; /* BUS_IOC_BASE */
  1053. }
  1054. }
  1055. ret = regmap_read(regmap, reg, &val);
  1056. if (ret)
  1057. return ret;
  1058. return ((val >> bit) & mask);
  1059. }
  1060. static int rockchip_verify_mux(struct rockchip_pin_bank *bank,
  1061. int pin, int mux)
  1062. {
  1063. struct rockchip_pinctrl *info = bank->drvdata;
  1064. struct device *dev = info->dev;
  1065. int iomux_num = (pin / 8);
  1066. if (iomux_num > 3)
  1067. return -EINVAL;
  1068. if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) {
  1069. dev_err(dev, "pin %d is unrouted\n", pin);
  1070. return -EINVAL;
  1071. }
  1072. if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) {
  1073. if (mux != RK_FUNC_GPIO) {
  1074. dev_err(dev, "pin %d only supports a gpio mux\n", pin);
  1075. return -ENOTSUPP;
  1076. }
  1077. }
  1078. return 0;
  1079. }
  1080. /*
  1081. * Set a new mux function for a pin.
  1082. *
  1083. * The register is divided into the upper and lower 16 bit. When changing
  1084. * a value, the previous register value is not read and changed. Instead
  1085. * it seems the changed bits are marked in the upper 16 bit, while the
  1086. * changed value gets set in the same offset in the lower 16 bit.
  1087. * All pin settings seem to be 2 bit wide in both the upper and lower
  1088. * parts.
  1089. * @bank: pin bank to change
  1090. * @pin: pin to change
  1091. * @mux: new mux function to set
  1092. */
  1093. static int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux)
  1094. {
  1095. struct rockchip_pinctrl *info = bank->drvdata;
  1096. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  1097. struct device *dev = info->dev;
  1098. int iomux_num = (pin / 8);
  1099. struct regmap *regmap;
  1100. int reg, ret, mask, mux_type;
  1101. u8 bit;
  1102. u32 data, rmask, route_location, route_reg, route_val;
  1103. ret = rockchip_verify_mux(bank, pin, mux);
  1104. if (ret < 0)
  1105. return ret;
  1106. if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY)
  1107. return 0;
  1108. dev_dbg(dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux);
  1109. if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU)
  1110. regmap = info->regmap_pmu;
  1111. else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU)
  1112. regmap = (pin % 8 < 4) ? info->regmap_pmu : info->regmap_base;
  1113. else
  1114. regmap = info->regmap_base;
  1115. /* get basic quadrupel of mux registers and the correct reg inside */
  1116. mux_type = bank->iomux[iomux_num].type;
  1117. reg = bank->iomux[iomux_num].offset;
  1118. if (mux_type & IOMUX_WIDTH_4BIT) {
  1119. if ((pin % 8) >= 4)
  1120. reg += 0x4;
  1121. bit = (pin % 4) * 4;
  1122. mask = 0xf;
  1123. } else if (mux_type & IOMUX_WIDTH_3BIT) {
  1124. if ((pin % 8) >= 5)
  1125. reg += 0x4;
  1126. bit = (pin % 8 % 5) * 3;
  1127. mask = 0x7;
  1128. } else {
  1129. bit = (pin % 8) * 2;
  1130. mask = 0x3;
  1131. }
  1132. if (bank->recalced_mask & BIT(pin))
  1133. rockchip_get_recalced_mux(bank, pin, &reg, &bit, &mask);
  1134. if (ctrl->type == RK3576) {
  1135. if ((bank->bank_num == 0) && (pin >= RK_PB4) && (pin <= RK_PB7))
  1136. reg += 0x1ff4; /* GPIO0_IOC_GPIO0B_IOMUX_SEL_H */
  1137. }
  1138. if (ctrl->type == RK3588) {
  1139. if (bank->bank_num == 0) {
  1140. if ((pin >= RK_PB4) && (pin <= RK_PD7)) {
  1141. if (mux < 8) {
  1142. reg += 0x4000 - 0xC; /* PMU2_IOC_BASE */
  1143. data = (mask << (bit + 16));
  1144. rmask = data | (data >> 16);
  1145. data |= (mux & mask) << bit;
  1146. ret = regmap_update_bits(regmap, reg, rmask, data);
  1147. } else {
  1148. u32 reg0 = 0;
  1149. reg0 = reg + 0x4000 - 0xC; /* PMU2_IOC_BASE */
  1150. data = (mask << (bit + 16));
  1151. rmask = data | (data >> 16);
  1152. data |= 8 << bit;
  1153. ret = regmap_update_bits(regmap, reg0, rmask, data);
  1154. reg0 = reg + 0x8000; /* BUS_IOC_BASE */
  1155. data = (mask << (bit + 16));
  1156. rmask = data | (data >> 16);
  1157. data |= mux << bit;
  1158. regmap = info->regmap_base;
  1159. ret |= regmap_update_bits(regmap, reg0, rmask, data);
  1160. }
  1161. } else {
  1162. data = (mask << (bit + 16));
  1163. rmask = data | (data >> 16);
  1164. data |= (mux & mask) << bit;
  1165. ret = regmap_update_bits(regmap, reg, rmask, data);
  1166. }
  1167. return ret;
  1168. } else if (bank->bank_num > 0) {
  1169. reg += 0x8000; /* BUS_IOC_BASE */
  1170. }
  1171. }
  1172. if (mux > mask)
  1173. return -EINVAL;
  1174. if (bank->route_mask & BIT(pin)) {
  1175. if (rockchip_get_mux_route(bank, pin, mux, &route_location,
  1176. &route_reg, &route_val)) {
  1177. struct regmap *route_regmap = regmap;
  1178. /* handle special locations */
  1179. switch (route_location) {
  1180. case ROCKCHIP_ROUTE_PMU:
  1181. route_regmap = info->regmap_pmu;
  1182. break;
  1183. case ROCKCHIP_ROUTE_GRF:
  1184. route_regmap = info->regmap_base;
  1185. break;
  1186. }
  1187. ret = regmap_write(route_regmap, route_reg, route_val);
  1188. if (ret)
  1189. return ret;
  1190. }
  1191. }
  1192. data = (mask << (bit + 16));
  1193. rmask = data | (data >> 16);
  1194. data |= (mux & mask) << bit;
  1195. ret = regmap_update_bits(regmap, reg, rmask, data);
  1196. return ret;
  1197. }
  1198. #define PX30_PULL_PMU_OFFSET 0x10
  1199. #define PX30_PULL_GRF_OFFSET 0x60
  1200. #define PX30_PULL_BITS_PER_PIN 2
  1201. #define PX30_PULL_PINS_PER_REG 8
  1202. #define PX30_PULL_BANK_STRIDE 16
  1203. static int px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1204. int pin_num, struct regmap **regmap,
  1205. int *reg, u8 *bit)
  1206. {
  1207. struct rockchip_pinctrl *info = bank->drvdata;
  1208. /* The first 32 pins of the first bank are located in PMU */
  1209. if (bank->bank_num == 0) {
  1210. *regmap = info->regmap_pmu;
  1211. *reg = PX30_PULL_PMU_OFFSET;
  1212. } else {
  1213. *regmap = info->regmap_base;
  1214. *reg = PX30_PULL_GRF_OFFSET;
  1215. /* correct the offset, as we're starting with the 2nd bank */
  1216. *reg -= 0x10;
  1217. *reg += bank->bank_num * PX30_PULL_BANK_STRIDE;
  1218. }
  1219. *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * 4);
  1220. *bit = (pin_num % PX30_PULL_PINS_PER_REG);
  1221. *bit *= PX30_PULL_BITS_PER_PIN;
  1222. return 0;
  1223. }
  1224. #define PX30_DRV_PMU_OFFSET 0x20
  1225. #define PX30_DRV_GRF_OFFSET 0xf0
  1226. #define PX30_DRV_BITS_PER_PIN 2
  1227. #define PX30_DRV_PINS_PER_REG 8
  1228. #define PX30_DRV_BANK_STRIDE 16
  1229. static int px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1230. int pin_num, struct regmap **regmap,
  1231. int *reg, u8 *bit)
  1232. {
  1233. struct rockchip_pinctrl *info = bank->drvdata;
  1234. /* The first 32 pins of the first bank are located in PMU */
  1235. if (bank->bank_num == 0) {
  1236. *regmap = info->regmap_pmu;
  1237. *reg = PX30_DRV_PMU_OFFSET;
  1238. } else {
  1239. *regmap = info->regmap_base;
  1240. *reg = PX30_DRV_GRF_OFFSET;
  1241. /* correct the offset, as we're starting with the 2nd bank */
  1242. *reg -= 0x10;
  1243. *reg += bank->bank_num * PX30_DRV_BANK_STRIDE;
  1244. }
  1245. *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * 4);
  1246. *bit = (pin_num % PX30_DRV_PINS_PER_REG);
  1247. *bit *= PX30_DRV_BITS_PER_PIN;
  1248. return 0;
  1249. }
  1250. #define PX30_SCHMITT_PMU_OFFSET 0x38
  1251. #define PX30_SCHMITT_GRF_OFFSET 0xc0
  1252. #define PX30_SCHMITT_PINS_PER_PMU_REG 16
  1253. #define PX30_SCHMITT_BANK_STRIDE 16
  1254. #define PX30_SCHMITT_PINS_PER_GRF_REG 8
  1255. static int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  1256. int pin_num,
  1257. struct regmap **regmap,
  1258. int *reg, u8 *bit)
  1259. {
  1260. struct rockchip_pinctrl *info = bank->drvdata;
  1261. int pins_per_reg;
  1262. if (bank->bank_num == 0) {
  1263. *regmap = info->regmap_pmu;
  1264. *reg = PX30_SCHMITT_PMU_OFFSET;
  1265. pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG;
  1266. } else {
  1267. *regmap = info->regmap_base;
  1268. *reg = PX30_SCHMITT_GRF_OFFSET;
  1269. pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG;
  1270. *reg += (bank->bank_num - 1) * PX30_SCHMITT_BANK_STRIDE;
  1271. }
  1272. *reg += ((pin_num / pins_per_reg) * 4);
  1273. *bit = pin_num % pins_per_reg;
  1274. return 0;
  1275. }
  1276. #define RV1108_PULL_PMU_OFFSET 0x10
  1277. #define RV1108_PULL_OFFSET 0x110
  1278. #define RV1108_PULL_PINS_PER_REG 8
  1279. #define RV1108_PULL_BITS_PER_PIN 2
  1280. #define RV1108_PULL_BANK_STRIDE 16
  1281. static int rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1282. int pin_num, struct regmap **regmap,
  1283. int *reg, u8 *bit)
  1284. {
  1285. struct rockchip_pinctrl *info = bank->drvdata;
  1286. /* The first 24 pins of the first bank are located in PMU */
  1287. if (bank->bank_num == 0) {
  1288. *regmap = info->regmap_pmu;
  1289. *reg = RV1108_PULL_PMU_OFFSET;
  1290. } else {
  1291. *reg = RV1108_PULL_OFFSET;
  1292. *regmap = info->regmap_base;
  1293. /* correct the offset, as we're starting with the 2nd bank */
  1294. *reg -= 0x10;
  1295. *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE;
  1296. }
  1297. *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * 4);
  1298. *bit = (pin_num % RV1108_PULL_PINS_PER_REG);
  1299. *bit *= RV1108_PULL_BITS_PER_PIN;
  1300. return 0;
  1301. }
  1302. #define RV1108_DRV_PMU_OFFSET 0x20
  1303. #define RV1108_DRV_GRF_OFFSET 0x210
  1304. #define RV1108_DRV_BITS_PER_PIN 2
  1305. #define RV1108_DRV_PINS_PER_REG 8
  1306. #define RV1108_DRV_BANK_STRIDE 16
  1307. static int rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1308. int pin_num, struct regmap **regmap,
  1309. int *reg, u8 *bit)
  1310. {
  1311. struct rockchip_pinctrl *info = bank->drvdata;
  1312. /* The first 24 pins of the first bank are located in PMU */
  1313. if (bank->bank_num == 0) {
  1314. *regmap = info->regmap_pmu;
  1315. *reg = RV1108_DRV_PMU_OFFSET;
  1316. } else {
  1317. *regmap = info->regmap_base;
  1318. *reg = RV1108_DRV_GRF_OFFSET;
  1319. /* correct the offset, as we're starting with the 2nd bank */
  1320. *reg -= 0x10;
  1321. *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE;
  1322. }
  1323. *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * 4);
  1324. *bit = pin_num % RV1108_DRV_PINS_PER_REG;
  1325. *bit *= RV1108_DRV_BITS_PER_PIN;
  1326. return 0;
  1327. }
  1328. #define RV1108_SCHMITT_PMU_OFFSET 0x30
  1329. #define RV1108_SCHMITT_GRF_OFFSET 0x388
  1330. #define RV1108_SCHMITT_BANK_STRIDE 8
  1331. #define RV1108_SCHMITT_PINS_PER_GRF_REG 16
  1332. #define RV1108_SCHMITT_PINS_PER_PMU_REG 8
  1333. static int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  1334. int pin_num,
  1335. struct regmap **regmap,
  1336. int *reg, u8 *bit)
  1337. {
  1338. struct rockchip_pinctrl *info = bank->drvdata;
  1339. int pins_per_reg;
  1340. if (bank->bank_num == 0) {
  1341. *regmap = info->regmap_pmu;
  1342. *reg = RV1108_SCHMITT_PMU_OFFSET;
  1343. pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG;
  1344. } else {
  1345. *regmap = info->regmap_base;
  1346. *reg = RV1108_SCHMITT_GRF_OFFSET;
  1347. pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG;
  1348. *reg += (bank->bank_num - 1) * RV1108_SCHMITT_BANK_STRIDE;
  1349. }
  1350. *reg += ((pin_num / pins_per_reg) * 4);
  1351. *bit = pin_num % pins_per_reg;
  1352. return 0;
  1353. }
  1354. #define RV1126_PULL_PMU_OFFSET 0x40
  1355. #define RV1126_PULL_GRF_GPIO1A0_OFFSET 0x10108
  1356. #define RV1126_PULL_PINS_PER_REG 8
  1357. #define RV1126_PULL_BITS_PER_PIN 2
  1358. #define RV1126_PULL_BANK_STRIDE 16
  1359. #define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= 31) /* GPIO0_C4 ~ GPIO0_D7 */
  1360. static int rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1361. int pin_num, struct regmap **regmap,
  1362. int *reg, u8 *bit)
  1363. {
  1364. struct rockchip_pinctrl *info = bank->drvdata;
  1365. /* The first 24 pins of the first bank are located in PMU */
  1366. if (bank->bank_num == 0) {
  1367. if (RV1126_GPIO_C4_D7(pin_num)) {
  1368. *regmap = info->regmap_base;
  1369. *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
  1370. *reg -= (((31 - pin_num) / RV1126_PULL_PINS_PER_REG + 1) * 4);
  1371. *bit = pin_num % RV1126_PULL_PINS_PER_REG;
  1372. *bit *= RV1126_PULL_BITS_PER_PIN;
  1373. return 0;
  1374. }
  1375. *regmap = info->regmap_pmu;
  1376. *reg = RV1126_PULL_PMU_OFFSET;
  1377. } else {
  1378. *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET;
  1379. *regmap = info->regmap_base;
  1380. *reg += (bank->bank_num - 1) * RV1126_PULL_BANK_STRIDE;
  1381. }
  1382. *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * 4);
  1383. *bit = (pin_num % RV1126_PULL_PINS_PER_REG);
  1384. *bit *= RV1126_PULL_BITS_PER_PIN;
  1385. return 0;
  1386. }
  1387. #define RV1126_DRV_PMU_OFFSET 0x20
  1388. #define RV1126_DRV_GRF_GPIO1A0_OFFSET 0x10090
  1389. #define RV1126_DRV_BITS_PER_PIN 4
  1390. #define RV1126_DRV_PINS_PER_REG 4
  1391. #define RV1126_DRV_BANK_STRIDE 32
  1392. static int rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1393. int pin_num, struct regmap **regmap,
  1394. int *reg, u8 *bit)
  1395. {
  1396. struct rockchip_pinctrl *info = bank->drvdata;
  1397. /* The first 24 pins of the first bank are located in PMU */
  1398. if (bank->bank_num == 0) {
  1399. if (RV1126_GPIO_C4_D7(pin_num)) {
  1400. *regmap = info->regmap_base;
  1401. *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
  1402. *reg -= (((31 - pin_num) / RV1126_DRV_PINS_PER_REG + 1) * 4);
  1403. *reg -= 0x4;
  1404. *bit = pin_num % RV1126_DRV_PINS_PER_REG;
  1405. *bit *= RV1126_DRV_BITS_PER_PIN;
  1406. return 0;
  1407. }
  1408. *regmap = info->regmap_pmu;
  1409. *reg = RV1126_DRV_PMU_OFFSET;
  1410. } else {
  1411. *regmap = info->regmap_base;
  1412. *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET;
  1413. *reg += (bank->bank_num - 1) * RV1126_DRV_BANK_STRIDE;
  1414. }
  1415. *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * 4);
  1416. *bit = pin_num % RV1126_DRV_PINS_PER_REG;
  1417. *bit *= RV1126_DRV_BITS_PER_PIN;
  1418. return 0;
  1419. }
  1420. #define RV1126_SCHMITT_PMU_OFFSET 0x60
  1421. #define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET 0x10188
  1422. #define RV1126_SCHMITT_BANK_STRIDE 16
  1423. #define RV1126_SCHMITT_PINS_PER_GRF_REG 8
  1424. #define RV1126_SCHMITT_PINS_PER_PMU_REG 8
  1425. static int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  1426. int pin_num,
  1427. struct regmap **regmap,
  1428. int *reg, u8 *bit)
  1429. {
  1430. struct rockchip_pinctrl *info = bank->drvdata;
  1431. int pins_per_reg;
  1432. if (bank->bank_num == 0) {
  1433. if (RV1126_GPIO_C4_D7(pin_num)) {
  1434. *regmap = info->regmap_base;
  1435. *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
  1436. *reg -= (((31 - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + 1) * 4);
  1437. *bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG;
  1438. return 0;
  1439. }
  1440. *regmap = info->regmap_pmu;
  1441. *reg = RV1126_SCHMITT_PMU_OFFSET;
  1442. pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG;
  1443. } else {
  1444. *regmap = info->regmap_base;
  1445. *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET;
  1446. pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG;
  1447. *reg += (bank->bank_num - 1) * RV1126_SCHMITT_BANK_STRIDE;
  1448. }
  1449. *reg += ((pin_num / pins_per_reg) * 4);
  1450. *bit = pin_num % pins_per_reg;
  1451. return 0;
  1452. }
  1453. #define RK3308_SCHMITT_PINS_PER_REG 8
  1454. #define RK3308_SCHMITT_BANK_STRIDE 16
  1455. #define RK3308_SCHMITT_GRF_OFFSET 0x1a0
  1456. static int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  1457. int pin_num, struct regmap **regmap,
  1458. int *reg, u8 *bit)
  1459. {
  1460. struct rockchip_pinctrl *info = bank->drvdata;
  1461. *regmap = info->regmap_base;
  1462. *reg = RK3308_SCHMITT_GRF_OFFSET;
  1463. *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
  1464. *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * 4);
  1465. *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG;
  1466. return 0;
  1467. }
  1468. #define RK2928_PULL_OFFSET 0x118
  1469. #define RK2928_PULL_PINS_PER_REG 16
  1470. #define RK2928_PULL_BANK_STRIDE 8
  1471. static int rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1472. int pin_num, struct regmap **regmap,
  1473. int *reg, u8 *bit)
  1474. {
  1475. struct rockchip_pinctrl *info = bank->drvdata;
  1476. *regmap = info->regmap_base;
  1477. *reg = RK2928_PULL_OFFSET;
  1478. *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
  1479. *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4;
  1480. *bit = pin_num % RK2928_PULL_PINS_PER_REG;
  1481. return 0;
  1482. };
  1483. #define RK3128_PULL_OFFSET 0x118
  1484. static int rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1485. int pin_num, struct regmap **regmap,
  1486. int *reg, u8 *bit)
  1487. {
  1488. struct rockchip_pinctrl *info = bank->drvdata;
  1489. *regmap = info->regmap_base;
  1490. *reg = RK3128_PULL_OFFSET;
  1491. *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE;
  1492. *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * 4);
  1493. *bit = pin_num % RK2928_PULL_PINS_PER_REG;
  1494. return 0;
  1495. }
  1496. #define RK3188_PULL_OFFSET 0x164
  1497. #define RK3188_PULL_BITS_PER_PIN 2
  1498. #define RK3188_PULL_PINS_PER_REG 8
  1499. #define RK3188_PULL_BANK_STRIDE 16
  1500. #define RK3188_PULL_PMU_OFFSET 0x64
  1501. static int rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1502. int pin_num, struct regmap **regmap,
  1503. int *reg, u8 *bit)
  1504. {
  1505. struct rockchip_pinctrl *info = bank->drvdata;
  1506. /* The first 12 pins of the first bank are located elsewhere */
  1507. if (bank->bank_num == 0 && pin_num < 12) {
  1508. *regmap = info->regmap_pmu ? info->regmap_pmu
  1509. : bank->regmap_pull;
  1510. *reg = info->regmap_pmu ? RK3188_PULL_PMU_OFFSET : 0;
  1511. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1512. *bit = pin_num % RK3188_PULL_PINS_PER_REG;
  1513. *bit *= RK3188_PULL_BITS_PER_PIN;
  1514. } else {
  1515. *regmap = info->regmap_pull ? info->regmap_pull
  1516. : info->regmap_base;
  1517. *reg = info->regmap_pull ? 0 : RK3188_PULL_OFFSET;
  1518. /* correct the offset, as it is the 2nd pull register */
  1519. *reg -= 4;
  1520. *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
  1521. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1522. /*
  1523. * The bits in these registers have an inverse ordering
  1524. * with the lowest pin being in bits 15:14 and the highest
  1525. * pin in bits 1:0
  1526. */
  1527. *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG);
  1528. *bit *= RK3188_PULL_BITS_PER_PIN;
  1529. }
  1530. return 0;
  1531. }
  1532. #define RK3288_PULL_OFFSET 0x140
  1533. static int rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1534. int pin_num, struct regmap **regmap,
  1535. int *reg, u8 *bit)
  1536. {
  1537. struct rockchip_pinctrl *info = bank->drvdata;
  1538. /* The first 24 pins of the first bank are located in PMU */
  1539. if (bank->bank_num == 0) {
  1540. *regmap = info->regmap_pmu;
  1541. *reg = RK3188_PULL_PMU_OFFSET;
  1542. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1543. *bit = pin_num % RK3188_PULL_PINS_PER_REG;
  1544. *bit *= RK3188_PULL_BITS_PER_PIN;
  1545. } else {
  1546. *regmap = info->regmap_base;
  1547. *reg = RK3288_PULL_OFFSET;
  1548. /* correct the offset, as we're starting with the 2nd bank */
  1549. *reg -= 0x10;
  1550. *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
  1551. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1552. *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
  1553. *bit *= RK3188_PULL_BITS_PER_PIN;
  1554. }
  1555. return 0;
  1556. }
  1557. #define RK3288_DRV_PMU_OFFSET 0x70
  1558. #define RK3288_DRV_GRF_OFFSET 0x1c0
  1559. #define RK3288_DRV_BITS_PER_PIN 2
  1560. #define RK3288_DRV_PINS_PER_REG 8
  1561. #define RK3288_DRV_BANK_STRIDE 16
  1562. static int rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1563. int pin_num, struct regmap **regmap,
  1564. int *reg, u8 *bit)
  1565. {
  1566. struct rockchip_pinctrl *info = bank->drvdata;
  1567. /* The first 24 pins of the first bank are located in PMU */
  1568. if (bank->bank_num == 0) {
  1569. *regmap = info->regmap_pmu;
  1570. *reg = RK3288_DRV_PMU_OFFSET;
  1571. *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
  1572. *bit = pin_num % RK3288_DRV_PINS_PER_REG;
  1573. *bit *= RK3288_DRV_BITS_PER_PIN;
  1574. } else {
  1575. *regmap = info->regmap_base;
  1576. *reg = RK3288_DRV_GRF_OFFSET;
  1577. /* correct the offset, as we're starting with the 2nd bank */
  1578. *reg -= 0x10;
  1579. *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
  1580. *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
  1581. *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
  1582. *bit *= RK3288_DRV_BITS_PER_PIN;
  1583. }
  1584. return 0;
  1585. }
  1586. #define RK3228_PULL_OFFSET 0x100
  1587. static int rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1588. int pin_num, struct regmap **regmap,
  1589. int *reg, u8 *bit)
  1590. {
  1591. struct rockchip_pinctrl *info = bank->drvdata;
  1592. *regmap = info->regmap_base;
  1593. *reg = RK3228_PULL_OFFSET;
  1594. *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
  1595. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1596. *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
  1597. *bit *= RK3188_PULL_BITS_PER_PIN;
  1598. return 0;
  1599. }
  1600. #define RK3228_DRV_GRF_OFFSET 0x200
  1601. static int rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1602. int pin_num, struct regmap **regmap,
  1603. int *reg, u8 *bit)
  1604. {
  1605. struct rockchip_pinctrl *info = bank->drvdata;
  1606. *regmap = info->regmap_base;
  1607. *reg = RK3228_DRV_GRF_OFFSET;
  1608. *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
  1609. *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
  1610. *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
  1611. *bit *= RK3288_DRV_BITS_PER_PIN;
  1612. return 0;
  1613. }
  1614. #define RK3308_PULL_OFFSET 0xa0
  1615. static int rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1616. int pin_num, struct regmap **regmap,
  1617. int *reg, u8 *bit)
  1618. {
  1619. struct rockchip_pinctrl *info = bank->drvdata;
  1620. *regmap = info->regmap_base;
  1621. *reg = RK3308_PULL_OFFSET;
  1622. *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
  1623. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1624. *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
  1625. *bit *= RK3188_PULL_BITS_PER_PIN;
  1626. return 0;
  1627. }
  1628. #define RK3308_DRV_GRF_OFFSET 0x100
  1629. static int rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1630. int pin_num, struct regmap **regmap,
  1631. int *reg, u8 *bit)
  1632. {
  1633. struct rockchip_pinctrl *info = bank->drvdata;
  1634. *regmap = info->regmap_base;
  1635. *reg = RK3308_DRV_GRF_OFFSET;
  1636. *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
  1637. *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
  1638. *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
  1639. *bit *= RK3288_DRV_BITS_PER_PIN;
  1640. return 0;
  1641. }
  1642. #define RK3368_PULL_GRF_OFFSET 0x100
  1643. #define RK3368_PULL_PMU_OFFSET 0x10
  1644. static int rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1645. int pin_num, struct regmap **regmap,
  1646. int *reg, u8 *bit)
  1647. {
  1648. struct rockchip_pinctrl *info = bank->drvdata;
  1649. /* The first 32 pins of the first bank are located in PMU */
  1650. if (bank->bank_num == 0) {
  1651. *regmap = info->regmap_pmu;
  1652. *reg = RK3368_PULL_PMU_OFFSET;
  1653. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1654. *bit = pin_num % RK3188_PULL_PINS_PER_REG;
  1655. *bit *= RK3188_PULL_BITS_PER_PIN;
  1656. } else {
  1657. *regmap = info->regmap_base;
  1658. *reg = RK3368_PULL_GRF_OFFSET;
  1659. /* correct the offset, as we're starting with the 2nd bank */
  1660. *reg -= 0x10;
  1661. *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
  1662. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1663. *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
  1664. *bit *= RK3188_PULL_BITS_PER_PIN;
  1665. }
  1666. return 0;
  1667. }
  1668. #define RK3368_DRV_PMU_OFFSET 0x20
  1669. #define RK3368_DRV_GRF_OFFSET 0x200
  1670. static int rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1671. int pin_num, struct regmap **regmap,
  1672. int *reg, u8 *bit)
  1673. {
  1674. struct rockchip_pinctrl *info = bank->drvdata;
  1675. /* The first 32 pins of the first bank are located in PMU */
  1676. if (bank->bank_num == 0) {
  1677. *regmap = info->regmap_pmu;
  1678. *reg = RK3368_DRV_PMU_OFFSET;
  1679. *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
  1680. *bit = pin_num % RK3288_DRV_PINS_PER_REG;
  1681. *bit *= RK3288_DRV_BITS_PER_PIN;
  1682. } else {
  1683. *regmap = info->regmap_base;
  1684. *reg = RK3368_DRV_GRF_OFFSET;
  1685. /* correct the offset, as we're starting with the 2nd bank */
  1686. *reg -= 0x10;
  1687. *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
  1688. *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
  1689. *bit = (pin_num % RK3288_DRV_PINS_PER_REG);
  1690. *bit *= RK3288_DRV_BITS_PER_PIN;
  1691. }
  1692. return 0;
  1693. }
  1694. #define RK3399_PULL_GRF_OFFSET 0xe040
  1695. #define RK3399_PULL_PMU_OFFSET 0x40
  1696. #define RK3399_DRV_3BITS_PER_PIN 3
  1697. static int rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1698. int pin_num, struct regmap **regmap,
  1699. int *reg, u8 *bit)
  1700. {
  1701. struct rockchip_pinctrl *info = bank->drvdata;
  1702. /* The bank0:16 and bank1:32 pins are located in PMU */
  1703. if ((bank->bank_num == 0) || (bank->bank_num == 1)) {
  1704. *regmap = info->regmap_pmu;
  1705. *reg = RK3399_PULL_PMU_OFFSET;
  1706. *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
  1707. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1708. *bit = pin_num % RK3188_PULL_PINS_PER_REG;
  1709. *bit *= RK3188_PULL_BITS_PER_PIN;
  1710. } else {
  1711. *regmap = info->regmap_base;
  1712. *reg = RK3399_PULL_GRF_OFFSET;
  1713. /* correct the offset, as we're starting with the 3rd bank */
  1714. *reg -= 0x20;
  1715. *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
  1716. *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
  1717. *bit = (pin_num % RK3188_PULL_PINS_PER_REG);
  1718. *bit *= RK3188_PULL_BITS_PER_PIN;
  1719. }
  1720. return 0;
  1721. }
  1722. static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1723. int pin_num, struct regmap **regmap,
  1724. int *reg, u8 *bit)
  1725. {
  1726. struct rockchip_pinctrl *info = bank->drvdata;
  1727. int drv_num = (pin_num / 8);
  1728. /* The bank0:16 and bank1:32 pins are located in PMU */
  1729. if ((bank->bank_num == 0) || (bank->bank_num == 1))
  1730. *regmap = info->regmap_pmu;
  1731. else
  1732. *regmap = info->regmap_base;
  1733. *reg = bank->drv[drv_num].offset;
  1734. if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
  1735. (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY))
  1736. *bit = (pin_num % 8) * 3;
  1737. else
  1738. *bit = (pin_num % 8) * 2;
  1739. return 0;
  1740. }
  1741. #define RK3568_PULL_PMU_OFFSET 0x20
  1742. #define RK3568_PULL_GRF_OFFSET 0x80
  1743. #define RK3568_PULL_BITS_PER_PIN 2
  1744. #define RK3568_PULL_PINS_PER_REG 8
  1745. #define RK3568_PULL_BANK_STRIDE 0x10
  1746. static int rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1747. int pin_num, struct regmap **regmap,
  1748. int *reg, u8 *bit)
  1749. {
  1750. struct rockchip_pinctrl *info = bank->drvdata;
  1751. if (bank->bank_num == 0) {
  1752. *regmap = info->regmap_pmu;
  1753. *reg = RK3568_PULL_PMU_OFFSET;
  1754. *reg += bank->bank_num * RK3568_PULL_BANK_STRIDE;
  1755. *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * 4);
  1756. *bit = pin_num % RK3568_PULL_PINS_PER_REG;
  1757. *bit *= RK3568_PULL_BITS_PER_PIN;
  1758. } else {
  1759. *regmap = info->regmap_base;
  1760. *reg = RK3568_PULL_GRF_OFFSET;
  1761. *reg += (bank->bank_num - 1) * RK3568_PULL_BANK_STRIDE;
  1762. *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * 4);
  1763. *bit = (pin_num % RK3568_PULL_PINS_PER_REG);
  1764. *bit *= RK3568_PULL_BITS_PER_PIN;
  1765. }
  1766. return 0;
  1767. }
  1768. #define RK3568_DRV_PMU_OFFSET 0x70
  1769. #define RK3568_DRV_GRF_OFFSET 0x200
  1770. #define RK3568_DRV_BITS_PER_PIN 8
  1771. #define RK3568_DRV_PINS_PER_REG 2
  1772. #define RK3568_DRV_BANK_STRIDE 0x40
  1773. static int rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1774. int pin_num, struct regmap **regmap,
  1775. int *reg, u8 *bit)
  1776. {
  1777. struct rockchip_pinctrl *info = bank->drvdata;
  1778. /* The first 32 pins of the first bank are located in PMU */
  1779. if (bank->bank_num == 0) {
  1780. *regmap = info->regmap_pmu;
  1781. *reg = RK3568_DRV_PMU_OFFSET;
  1782. *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * 4);
  1783. *bit = pin_num % RK3568_DRV_PINS_PER_REG;
  1784. *bit *= RK3568_DRV_BITS_PER_PIN;
  1785. } else {
  1786. *regmap = info->regmap_base;
  1787. *reg = RK3568_DRV_GRF_OFFSET;
  1788. *reg += (bank->bank_num - 1) * RK3568_DRV_BANK_STRIDE;
  1789. *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * 4);
  1790. *bit = (pin_num % RK3568_DRV_PINS_PER_REG);
  1791. *bit *= RK3568_DRV_BITS_PER_PIN;
  1792. }
  1793. return 0;
  1794. }
  1795. #define RK3576_DRV_BITS_PER_PIN 4
  1796. #define RK3576_DRV_PINS_PER_REG 4
  1797. #define RK3576_DRV_GPIO0_AL_OFFSET 0x10
  1798. #define RK3576_DRV_GPIO0_BH_OFFSET 0x2014
  1799. #define RK3576_DRV_GPIO1_OFFSET 0x6020
  1800. #define RK3576_DRV_GPIO2_OFFSET 0x6040
  1801. #define RK3576_DRV_GPIO3_OFFSET 0x6060
  1802. #define RK3576_DRV_GPIO4_AL_OFFSET 0x6080
  1803. #define RK3576_DRV_GPIO4_CL_OFFSET 0xA090
  1804. #define RK3576_DRV_GPIO4_DL_OFFSET 0xB098
  1805. static int rk3576_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  1806. int pin_num, struct regmap **regmap,
  1807. int *reg, u8 *bit)
  1808. {
  1809. struct rockchip_pinctrl *info = bank->drvdata;
  1810. *regmap = info->regmap_base;
  1811. if (bank->bank_num == 0 && pin_num < 12)
  1812. *reg = RK3576_DRV_GPIO0_AL_OFFSET;
  1813. else if (bank->bank_num == 0)
  1814. *reg = RK3576_DRV_GPIO0_BH_OFFSET - 0xc;
  1815. else if (bank->bank_num == 1)
  1816. *reg = RK3576_DRV_GPIO1_OFFSET;
  1817. else if (bank->bank_num == 2)
  1818. *reg = RK3576_DRV_GPIO2_OFFSET;
  1819. else if (bank->bank_num == 3)
  1820. *reg = RK3576_DRV_GPIO3_OFFSET;
  1821. else if (bank->bank_num == 4 && pin_num < 16)
  1822. *reg = RK3576_DRV_GPIO4_AL_OFFSET;
  1823. else if (bank->bank_num == 4 && pin_num < 24)
  1824. *reg = RK3576_DRV_GPIO4_CL_OFFSET - 0x10;
  1825. else if (bank->bank_num == 4)
  1826. *reg = RK3576_DRV_GPIO4_DL_OFFSET - 0x18;
  1827. else
  1828. dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
  1829. *reg += ((pin_num / RK3576_DRV_PINS_PER_REG) * 4);
  1830. *bit = pin_num % RK3576_DRV_PINS_PER_REG;
  1831. *bit *= RK3576_DRV_BITS_PER_PIN;
  1832. return 0;
  1833. }
  1834. #define RK3576_PULL_BITS_PER_PIN 2
  1835. #define RK3576_PULL_PINS_PER_REG 8
  1836. #define RK3576_PULL_GPIO0_AL_OFFSET 0x20
  1837. #define RK3576_PULL_GPIO0_BH_OFFSET 0x2028
  1838. #define RK3576_PULL_GPIO1_OFFSET 0x6110
  1839. #define RK3576_PULL_GPIO2_OFFSET 0x6120
  1840. #define RK3576_PULL_GPIO3_OFFSET 0x6130
  1841. #define RK3576_PULL_GPIO4_AL_OFFSET 0x6140
  1842. #define RK3576_PULL_GPIO4_CL_OFFSET 0xA148
  1843. #define RK3576_PULL_GPIO4_DL_OFFSET 0xB14C
  1844. static int rk3576_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  1845. int pin_num, struct regmap **regmap,
  1846. int *reg, u8 *bit)
  1847. {
  1848. struct rockchip_pinctrl *info = bank->drvdata;
  1849. *regmap = info->regmap_base;
  1850. if (bank->bank_num == 0 && pin_num < 12)
  1851. *reg = RK3576_PULL_GPIO0_AL_OFFSET;
  1852. else if (bank->bank_num == 0)
  1853. *reg = RK3576_PULL_GPIO0_BH_OFFSET - 0x4;
  1854. else if (bank->bank_num == 1)
  1855. *reg = RK3576_PULL_GPIO1_OFFSET;
  1856. else if (bank->bank_num == 2)
  1857. *reg = RK3576_PULL_GPIO2_OFFSET;
  1858. else if (bank->bank_num == 3)
  1859. *reg = RK3576_PULL_GPIO3_OFFSET;
  1860. else if (bank->bank_num == 4 && pin_num < 16)
  1861. *reg = RK3576_PULL_GPIO4_AL_OFFSET;
  1862. else if (bank->bank_num == 4 && pin_num < 24)
  1863. *reg = RK3576_PULL_GPIO4_CL_OFFSET - 0x8;
  1864. else if (bank->bank_num == 4)
  1865. *reg = RK3576_PULL_GPIO4_DL_OFFSET - 0xc;
  1866. else
  1867. dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
  1868. *reg += ((pin_num / RK3576_PULL_PINS_PER_REG) * 4);
  1869. *bit = pin_num % RK3576_PULL_PINS_PER_REG;
  1870. *bit *= RK3576_PULL_BITS_PER_PIN;
  1871. return 0;
  1872. }
  1873. #define RK3576_SMT_BITS_PER_PIN 1
  1874. #define RK3576_SMT_PINS_PER_REG 8
  1875. #define RK3576_SMT_GPIO0_AL_OFFSET 0x30
  1876. #define RK3576_SMT_GPIO0_BH_OFFSET 0x2040
  1877. #define RK3576_SMT_GPIO1_OFFSET 0x6210
  1878. #define RK3576_SMT_GPIO2_OFFSET 0x6220
  1879. #define RK3576_SMT_GPIO3_OFFSET 0x6230
  1880. #define RK3576_SMT_GPIO4_AL_OFFSET 0x6240
  1881. #define RK3576_SMT_GPIO4_CL_OFFSET 0xA248
  1882. #define RK3576_SMT_GPIO4_DL_OFFSET 0xB24C
  1883. static int rk3576_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  1884. int pin_num,
  1885. struct regmap **regmap,
  1886. int *reg, u8 *bit)
  1887. {
  1888. struct rockchip_pinctrl *info = bank->drvdata;
  1889. *regmap = info->regmap_base;
  1890. if (bank->bank_num == 0 && pin_num < 12)
  1891. *reg = RK3576_SMT_GPIO0_AL_OFFSET;
  1892. else if (bank->bank_num == 0)
  1893. *reg = RK3576_SMT_GPIO0_BH_OFFSET - 0x4;
  1894. else if (bank->bank_num == 1)
  1895. *reg = RK3576_SMT_GPIO1_OFFSET;
  1896. else if (bank->bank_num == 2)
  1897. *reg = RK3576_SMT_GPIO2_OFFSET;
  1898. else if (bank->bank_num == 3)
  1899. *reg = RK3576_SMT_GPIO3_OFFSET;
  1900. else if (bank->bank_num == 4 && pin_num < 16)
  1901. *reg = RK3576_SMT_GPIO4_AL_OFFSET;
  1902. else if (bank->bank_num == 4 && pin_num < 24)
  1903. *reg = RK3576_SMT_GPIO4_CL_OFFSET - 0x8;
  1904. else if (bank->bank_num == 4)
  1905. *reg = RK3576_SMT_GPIO4_DL_OFFSET - 0xc;
  1906. else
  1907. dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
  1908. *reg += ((pin_num / RK3576_SMT_PINS_PER_REG) * 4);
  1909. *bit = pin_num % RK3576_SMT_PINS_PER_REG;
  1910. *bit *= RK3576_SMT_BITS_PER_PIN;
  1911. return 0;
  1912. }
  1913. #define RK3588_PMU1_IOC_REG (0x0000)
  1914. #define RK3588_PMU2_IOC_REG (0x4000)
  1915. #define RK3588_BUS_IOC_REG (0x8000)
  1916. #define RK3588_VCCIO1_4_IOC_REG (0x9000)
  1917. #define RK3588_VCCIO3_5_IOC_REG (0xA000)
  1918. #define RK3588_VCCIO2_IOC_REG (0xB000)
  1919. #define RK3588_VCCIO6_IOC_REG (0xC000)
  1920. #define RK3588_EMMC_IOC_REG (0xD000)
  1921. static const u32 rk3588_ds_regs[][2] = {
  1922. {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0010},
  1923. {RK_GPIO0_A4, RK3588_PMU1_IOC_REG + 0x0014},
  1924. {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0018},
  1925. {RK_GPIO0_B4, RK3588_PMU2_IOC_REG + 0x0014},
  1926. {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0018},
  1927. {RK_GPIO0_C4, RK3588_PMU2_IOC_REG + 0x001C},
  1928. {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0020},
  1929. {RK_GPIO0_D4, RK3588_PMU2_IOC_REG + 0x0024},
  1930. {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0020},
  1931. {RK_GPIO1_A4, RK3588_VCCIO1_4_IOC_REG + 0x0024},
  1932. {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0028},
  1933. {RK_GPIO1_B4, RK3588_VCCIO1_4_IOC_REG + 0x002C},
  1934. {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0030},
  1935. {RK_GPIO1_C4, RK3588_VCCIO1_4_IOC_REG + 0x0034},
  1936. {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x0038},
  1937. {RK_GPIO1_D4, RK3588_VCCIO1_4_IOC_REG + 0x003C},
  1938. {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0040},
  1939. {RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0044},
  1940. {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0048},
  1941. {RK_GPIO2_B4, RK3588_VCCIO3_5_IOC_REG + 0x004C},
  1942. {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0050},
  1943. {RK_GPIO2_C4, RK3588_VCCIO3_5_IOC_REG + 0x0054},
  1944. {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x0058},
  1945. {RK_GPIO2_D4, RK3588_EMMC_IOC_REG + 0x005C},
  1946. {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0060},
  1947. {RK_GPIO3_A4, RK3588_VCCIO3_5_IOC_REG + 0x0064},
  1948. {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0068},
  1949. {RK_GPIO3_B4, RK3588_VCCIO3_5_IOC_REG + 0x006C},
  1950. {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0070},
  1951. {RK_GPIO3_C4, RK3588_VCCIO3_5_IOC_REG + 0x0074},
  1952. {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x0078},
  1953. {RK_GPIO3_D4, RK3588_VCCIO3_5_IOC_REG + 0x007C},
  1954. {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0080},
  1955. {RK_GPIO4_A4, RK3588_VCCIO6_IOC_REG + 0x0084},
  1956. {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0088},
  1957. {RK_GPIO4_B4, RK3588_VCCIO6_IOC_REG + 0x008C},
  1958. {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0090},
  1959. {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0090},
  1960. {RK_GPIO4_C4, RK3588_VCCIO3_5_IOC_REG + 0x0094},
  1961. {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x0098},
  1962. {RK_GPIO4_D4, RK3588_VCCIO2_IOC_REG + 0x009C},
  1963. };
  1964. static const u32 rk3588_p_regs[][2] = {
  1965. {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0020},
  1966. {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0024},
  1967. {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0028},
  1968. {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x002C},
  1969. {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0030},
  1970. {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0110},
  1971. {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0114},
  1972. {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0118},
  1973. {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x011C},
  1974. {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0120},
  1975. {RK_GPIO2_A6, RK3588_VCCIO3_5_IOC_REG + 0x0120},
  1976. {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0124},
  1977. {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0128},
  1978. {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x012C},
  1979. {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0130},
  1980. {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0134},
  1981. {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0138},
  1982. {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x013C},
  1983. {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0140},
  1984. {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0144},
  1985. {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0148},
  1986. {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0148},
  1987. {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x014C},
  1988. };
  1989. static const u32 rk3588_smt_regs[][2] = {
  1990. {RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0030},
  1991. {RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0034},
  1992. {RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0040},
  1993. {RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0044},
  1994. {RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0048},
  1995. {RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0210},
  1996. {RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0214},
  1997. {RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0218},
  1998. {RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x021C},
  1999. {RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0220},
  2000. {RK_GPIO2_A6, RK3588_VCCIO3_5_IOC_REG + 0x0220},
  2001. {RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0224},
  2002. {RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0228},
  2003. {RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x022C},
  2004. {RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0230},
  2005. {RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0234},
  2006. {RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0238},
  2007. {RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x023C},
  2008. {RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0240},
  2009. {RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0244},
  2010. {RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0248},
  2011. {RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0248},
  2012. {RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x024C},
  2013. };
  2014. #define RK3588_PULL_BITS_PER_PIN 2
  2015. #define RK3588_PULL_PINS_PER_REG 8
  2016. static int rk3588_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
  2017. int pin_num, struct regmap **regmap,
  2018. int *reg, u8 *bit)
  2019. {
  2020. struct rockchip_pinctrl *info = bank->drvdata;
  2021. u8 bank_num = bank->bank_num;
  2022. u32 pin = bank_num * 32 + pin_num;
  2023. int i;
  2024. for (i = ARRAY_SIZE(rk3588_p_regs) - 1; i >= 0; i--) {
  2025. if (pin >= rk3588_p_regs[i][0]) {
  2026. *reg = rk3588_p_regs[i][1];
  2027. *regmap = info->regmap_base;
  2028. *bit = pin_num % RK3588_PULL_PINS_PER_REG;
  2029. *bit *= RK3588_PULL_BITS_PER_PIN;
  2030. return 0;
  2031. }
  2032. }
  2033. return -EINVAL;
  2034. }
  2035. #define RK3588_DRV_BITS_PER_PIN 4
  2036. #define RK3588_DRV_PINS_PER_REG 4
  2037. static int rk3588_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
  2038. int pin_num, struct regmap **regmap,
  2039. int *reg, u8 *bit)
  2040. {
  2041. struct rockchip_pinctrl *info = bank->drvdata;
  2042. u8 bank_num = bank->bank_num;
  2043. u32 pin = bank_num * 32 + pin_num;
  2044. int i;
  2045. for (i = ARRAY_SIZE(rk3588_ds_regs) - 1; i >= 0; i--) {
  2046. if (pin >= rk3588_ds_regs[i][0]) {
  2047. *reg = rk3588_ds_regs[i][1];
  2048. *regmap = info->regmap_base;
  2049. *bit = pin_num % RK3588_DRV_PINS_PER_REG;
  2050. *bit *= RK3588_DRV_BITS_PER_PIN;
  2051. return 0;
  2052. }
  2053. }
  2054. return -EINVAL;
  2055. }
  2056. #define RK3588_SMT_BITS_PER_PIN 1
  2057. #define RK3588_SMT_PINS_PER_REG 8
  2058. static int rk3588_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  2059. int pin_num,
  2060. struct regmap **regmap,
  2061. int *reg, u8 *bit)
  2062. {
  2063. struct rockchip_pinctrl *info = bank->drvdata;
  2064. u8 bank_num = bank->bank_num;
  2065. u32 pin = bank_num * 32 + pin_num;
  2066. int i;
  2067. for (i = ARRAY_SIZE(rk3588_smt_regs) - 1; i >= 0; i--) {
  2068. if (pin >= rk3588_smt_regs[i][0]) {
  2069. *reg = rk3588_smt_regs[i][1];
  2070. *regmap = info->regmap_base;
  2071. *bit = pin_num % RK3588_SMT_PINS_PER_REG;
  2072. *bit *= RK3588_SMT_BITS_PER_PIN;
  2073. return 0;
  2074. }
  2075. }
  2076. return -EINVAL;
  2077. }
  2078. static int rockchip_perpin_drv_list[DRV_TYPE_MAX][8] = {
  2079. { 2, 4, 8, 12, -1, -1, -1, -1 },
  2080. { 3, 6, 9, 12, -1, -1, -1, -1 },
  2081. { 5, 10, 15, 20, -1, -1, -1, -1 },
  2082. { 4, 6, 8, 10, 12, 14, 16, 18 },
  2083. { 4, 7, 10, 13, 16, 19, 22, 26 }
  2084. };
  2085. static int rockchip_get_drive_perpin(struct rockchip_pin_bank *bank,
  2086. int pin_num)
  2087. {
  2088. struct rockchip_pinctrl *info = bank->drvdata;
  2089. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  2090. struct device *dev = info->dev;
  2091. struct regmap *regmap;
  2092. int reg, ret;
  2093. u32 data, temp, rmask_bits;
  2094. u8 bit;
  2095. int drv_type = bank->drv[pin_num / 8].drv_type;
  2096. ret = ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
  2097. if (ret)
  2098. return ret;
  2099. switch (drv_type) {
  2100. case DRV_TYPE_IO_1V8_3V0_AUTO:
  2101. case DRV_TYPE_IO_3V3_ONLY:
  2102. rmask_bits = RK3399_DRV_3BITS_PER_PIN;
  2103. switch (bit) {
  2104. case 0 ... 12:
  2105. /* regular case, nothing to do */
  2106. break;
  2107. case 15:
  2108. /*
  2109. * drive-strength offset is special, as it is
  2110. * spread over 2 registers
  2111. */
  2112. ret = regmap_read(regmap, reg, &data);
  2113. if (ret)
  2114. return ret;
  2115. ret = regmap_read(regmap, reg + 0x4, &temp);
  2116. if (ret)
  2117. return ret;
  2118. /*
  2119. * the bit data[15] contains bit 0 of the value
  2120. * while temp[1:0] contains bits 2 and 1
  2121. */
  2122. data >>= 15;
  2123. temp &= 0x3;
  2124. temp <<= 1;
  2125. data |= temp;
  2126. return rockchip_perpin_drv_list[drv_type][data];
  2127. case 18 ... 21:
  2128. /* setting fully enclosed in the second register */
  2129. reg += 4;
  2130. bit -= 16;
  2131. break;
  2132. default:
  2133. dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
  2134. bit, drv_type);
  2135. return -EINVAL;
  2136. }
  2137. break;
  2138. case DRV_TYPE_IO_DEFAULT:
  2139. case DRV_TYPE_IO_1V8_OR_3V0:
  2140. case DRV_TYPE_IO_1V8_ONLY:
  2141. rmask_bits = RK3288_DRV_BITS_PER_PIN;
  2142. break;
  2143. default:
  2144. dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
  2145. return -EINVAL;
  2146. }
  2147. ret = regmap_read(regmap, reg, &data);
  2148. if (ret)
  2149. return ret;
  2150. data >>= bit;
  2151. data &= (1 << rmask_bits) - 1;
  2152. return rockchip_perpin_drv_list[drv_type][data];
  2153. }
  2154. static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
  2155. int pin_num, int strength)
  2156. {
  2157. struct rockchip_pinctrl *info = bank->drvdata;
  2158. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  2159. struct device *dev = info->dev;
  2160. struct regmap *regmap;
  2161. int reg, ret, i;
  2162. u32 data, rmask, rmask_bits, temp;
  2163. u8 bit;
  2164. int drv_type = bank->drv[pin_num / 8].drv_type;
  2165. dev_dbg(dev, "setting drive of GPIO%d-%d to %d\n",
  2166. bank->bank_num, pin_num, strength);
  2167. ret = ctrl->drv_calc_reg(bank, pin_num, &regmap, &reg, &bit);
  2168. if (ret)
  2169. return ret;
  2170. if (ctrl->type == RK3588) {
  2171. rmask_bits = RK3588_DRV_BITS_PER_PIN;
  2172. ret = strength;
  2173. goto config;
  2174. } else if (ctrl->type == RK3568) {
  2175. rmask_bits = RK3568_DRV_BITS_PER_PIN;
  2176. ret = (1 << (strength + 1)) - 1;
  2177. goto config;
  2178. } else if (ctrl->type == RK3576) {
  2179. rmask_bits = RK3576_DRV_BITS_PER_PIN;
  2180. ret = ((strength & BIT(2)) >> 2) | ((strength & BIT(0)) << 2) | (strength & BIT(1));
  2181. goto config;
  2182. }
  2183. if (ctrl->type == RV1126) {
  2184. rmask_bits = RV1126_DRV_BITS_PER_PIN;
  2185. ret = strength;
  2186. goto config;
  2187. }
  2188. ret = -EINVAL;
  2189. for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) {
  2190. if (rockchip_perpin_drv_list[drv_type][i] == strength) {
  2191. ret = i;
  2192. break;
  2193. } else if (rockchip_perpin_drv_list[drv_type][i] < 0) {
  2194. ret = rockchip_perpin_drv_list[drv_type][i];
  2195. break;
  2196. }
  2197. }
  2198. if (ret < 0) {
  2199. dev_err(dev, "unsupported driver strength %d\n", strength);
  2200. return ret;
  2201. }
  2202. switch (drv_type) {
  2203. case DRV_TYPE_IO_1V8_3V0_AUTO:
  2204. case DRV_TYPE_IO_3V3_ONLY:
  2205. rmask_bits = RK3399_DRV_3BITS_PER_PIN;
  2206. switch (bit) {
  2207. case 0 ... 12:
  2208. /* regular case, nothing to do */
  2209. break;
  2210. case 15:
  2211. /*
  2212. * drive-strength offset is special, as it is spread
  2213. * over 2 registers, the bit data[15] contains bit 0
  2214. * of the value while temp[1:0] contains bits 2 and 1
  2215. */
  2216. data = (ret & 0x1) << 15;
  2217. temp = (ret >> 0x1) & 0x3;
  2218. rmask = BIT(15) | BIT(31);
  2219. data |= BIT(31);
  2220. ret = regmap_update_bits(regmap, reg, rmask, data);
  2221. if (ret)
  2222. return ret;
  2223. rmask = 0x3 | (0x3 << 16);
  2224. temp |= (0x3 << 16);
  2225. reg += 0x4;
  2226. ret = regmap_update_bits(regmap, reg, rmask, temp);
  2227. return ret;
  2228. case 18 ... 21:
  2229. /* setting fully enclosed in the second register */
  2230. reg += 4;
  2231. bit -= 16;
  2232. break;
  2233. default:
  2234. dev_err(dev, "unsupported bit: %d for pinctrl drive type: %d\n",
  2235. bit, drv_type);
  2236. return -EINVAL;
  2237. }
  2238. break;
  2239. case DRV_TYPE_IO_DEFAULT:
  2240. case DRV_TYPE_IO_1V8_OR_3V0:
  2241. case DRV_TYPE_IO_1V8_ONLY:
  2242. rmask_bits = RK3288_DRV_BITS_PER_PIN;
  2243. break;
  2244. default:
  2245. dev_err(dev, "unsupported pinctrl drive type: %d\n", drv_type);
  2246. return -EINVAL;
  2247. }
  2248. config:
  2249. /* enable the write to the equivalent lower bits */
  2250. data = ((1 << rmask_bits) - 1) << (bit + 16);
  2251. rmask = data | (data >> 16);
  2252. data |= (ret << bit);
  2253. ret = regmap_update_bits(regmap, reg, rmask, data);
  2254. return ret;
  2255. }
  2256. static int rockchip_pull_list[PULL_TYPE_MAX][4] = {
  2257. {
  2258. PIN_CONFIG_BIAS_DISABLE,
  2259. PIN_CONFIG_BIAS_PULL_UP,
  2260. PIN_CONFIG_BIAS_PULL_DOWN,
  2261. PIN_CONFIG_BIAS_BUS_HOLD
  2262. },
  2263. {
  2264. PIN_CONFIG_BIAS_DISABLE,
  2265. PIN_CONFIG_BIAS_PULL_DOWN,
  2266. PIN_CONFIG_BIAS_DISABLE,
  2267. PIN_CONFIG_BIAS_PULL_UP
  2268. },
  2269. };
  2270. static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
  2271. {
  2272. struct rockchip_pinctrl *info = bank->drvdata;
  2273. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  2274. struct device *dev = info->dev;
  2275. struct regmap *regmap;
  2276. int reg, ret, pull_type;
  2277. u8 bit;
  2278. u32 data;
  2279. /* rk3066b does support any pulls */
  2280. if (ctrl->type == RK3066B)
  2281. return PIN_CONFIG_BIAS_DISABLE;
  2282. ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
  2283. if (ret)
  2284. return ret;
  2285. ret = regmap_read(regmap, reg, &data);
  2286. if (ret)
  2287. return ret;
  2288. switch (ctrl->type) {
  2289. case RK2928:
  2290. case RK3128:
  2291. return !(data & BIT(bit))
  2292. ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT
  2293. : PIN_CONFIG_BIAS_DISABLE;
  2294. case PX30:
  2295. case RV1108:
  2296. case RK3188:
  2297. case RK3288:
  2298. case RK3308:
  2299. case RK3328:
  2300. case RK3368:
  2301. case RK3399:
  2302. case RK3568:
  2303. case RK3576:
  2304. case RK3588:
  2305. pull_type = bank->pull_type[pin_num / 8];
  2306. data >>= bit;
  2307. data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1;
  2308. /*
  2309. * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
  2310. * where that pull up value becomes 3.
  2311. */
  2312. if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
  2313. if (data == 3)
  2314. data = 1;
  2315. }
  2316. return rockchip_pull_list[pull_type][data];
  2317. default:
  2318. dev_err(dev, "unsupported pinctrl type\n");
  2319. return -EINVAL;
  2320. };
  2321. }
  2322. static int rockchip_set_pull(struct rockchip_pin_bank *bank,
  2323. int pin_num, int pull)
  2324. {
  2325. struct rockchip_pinctrl *info = bank->drvdata;
  2326. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  2327. struct device *dev = info->dev;
  2328. struct regmap *regmap;
  2329. int reg, ret, i, pull_type;
  2330. u8 bit;
  2331. u32 data, rmask;
  2332. dev_dbg(dev, "setting pull of GPIO%d-%d to %d\n", bank->bank_num, pin_num, pull);
  2333. /* rk3066b does support any pulls */
  2334. if (ctrl->type == RK3066B)
  2335. return pull ? -EINVAL : 0;
  2336. ret = ctrl->pull_calc_reg(bank, pin_num, &regmap, &reg, &bit);
  2337. if (ret)
  2338. return ret;
  2339. switch (ctrl->type) {
  2340. case RK2928:
  2341. case RK3128:
  2342. data = BIT(bit + 16);
  2343. if (pull == PIN_CONFIG_BIAS_DISABLE)
  2344. data |= BIT(bit);
  2345. ret = regmap_write(regmap, reg, data);
  2346. break;
  2347. case PX30:
  2348. case RV1108:
  2349. case RV1126:
  2350. case RK3188:
  2351. case RK3288:
  2352. case RK3308:
  2353. case RK3328:
  2354. case RK3368:
  2355. case RK3399:
  2356. case RK3568:
  2357. case RK3576:
  2358. case RK3588:
  2359. pull_type = bank->pull_type[pin_num / 8];
  2360. ret = -EINVAL;
  2361. for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]);
  2362. i++) {
  2363. if (rockchip_pull_list[pull_type][i] == pull) {
  2364. ret = i;
  2365. break;
  2366. }
  2367. }
  2368. /*
  2369. * In the TRM, pull-up being 1 for everything except the GPIO0_D3-D6,
  2370. * where that pull up value becomes 3.
  2371. */
  2372. if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= 27 && pin_num <= 30) {
  2373. if (ret == 1)
  2374. ret = 3;
  2375. }
  2376. if (ret < 0) {
  2377. dev_err(dev, "unsupported pull setting %d\n", pull);
  2378. return ret;
  2379. }
  2380. /* enable the write to the equivalent lower bits */
  2381. data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16);
  2382. rmask = data | (data >> 16);
  2383. data |= (ret << bit);
  2384. ret = regmap_update_bits(regmap, reg, rmask, data);
  2385. break;
  2386. default:
  2387. dev_err(dev, "unsupported pinctrl type\n");
  2388. return -EINVAL;
  2389. }
  2390. return ret;
  2391. }
  2392. #define RK3328_SCHMITT_BITS_PER_PIN 1
  2393. #define RK3328_SCHMITT_PINS_PER_REG 16
  2394. #define RK3328_SCHMITT_BANK_STRIDE 8
  2395. #define RK3328_SCHMITT_GRF_OFFSET 0x380
  2396. static int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  2397. int pin_num,
  2398. struct regmap **regmap,
  2399. int *reg, u8 *bit)
  2400. {
  2401. struct rockchip_pinctrl *info = bank->drvdata;
  2402. *regmap = info->regmap_base;
  2403. *reg = RK3328_SCHMITT_GRF_OFFSET;
  2404. *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE;
  2405. *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * 4);
  2406. *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG;
  2407. return 0;
  2408. }
  2409. #define RK3568_SCHMITT_BITS_PER_PIN 2
  2410. #define RK3568_SCHMITT_PINS_PER_REG 8
  2411. #define RK3568_SCHMITT_BANK_STRIDE 0x10
  2412. #define RK3568_SCHMITT_GRF_OFFSET 0xc0
  2413. #define RK3568_SCHMITT_PMUGRF_OFFSET 0x30
  2414. static int rk3568_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank,
  2415. int pin_num,
  2416. struct regmap **regmap,
  2417. int *reg, u8 *bit)
  2418. {
  2419. struct rockchip_pinctrl *info = bank->drvdata;
  2420. if (bank->bank_num == 0) {
  2421. *regmap = info->regmap_pmu;
  2422. *reg = RK3568_SCHMITT_PMUGRF_OFFSET;
  2423. } else {
  2424. *regmap = info->regmap_base;
  2425. *reg = RK3568_SCHMITT_GRF_OFFSET;
  2426. *reg += (bank->bank_num - 1) * RK3568_SCHMITT_BANK_STRIDE;
  2427. }
  2428. *reg += ((pin_num / RK3568_SCHMITT_PINS_PER_REG) * 4);
  2429. *bit = pin_num % RK3568_SCHMITT_PINS_PER_REG;
  2430. *bit *= RK3568_SCHMITT_BITS_PER_PIN;
  2431. return 0;
  2432. }
  2433. static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num)
  2434. {
  2435. struct rockchip_pinctrl *info = bank->drvdata;
  2436. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  2437. struct regmap *regmap;
  2438. int reg, ret;
  2439. u8 bit;
  2440. u32 data;
  2441. ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
  2442. if (ret)
  2443. return ret;
  2444. ret = regmap_read(regmap, reg, &data);
  2445. if (ret)
  2446. return ret;
  2447. data >>= bit;
  2448. switch (ctrl->type) {
  2449. case RK3568:
  2450. return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
  2451. default:
  2452. break;
  2453. }
  2454. return data & 0x1;
  2455. }
  2456. static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
  2457. int pin_num, int enable)
  2458. {
  2459. struct rockchip_pinctrl *info = bank->drvdata;
  2460. struct rockchip_pin_ctrl *ctrl = info->ctrl;
  2461. struct device *dev = info->dev;
  2462. struct regmap *regmap;
  2463. int reg, ret;
  2464. u8 bit;
  2465. u32 data, rmask;
  2466. dev_dbg(dev, "setting input schmitt of GPIO%d-%d to %d\n",
  2467. bank->bank_num, pin_num, enable);
  2468. ret = ctrl->schmitt_calc_reg(bank, pin_num, &regmap, &reg, &bit);
  2469. if (ret)
  2470. return ret;
  2471. /* enable the write to the equivalent lower bits */
  2472. switch (ctrl->type) {
  2473. case RK3568:
  2474. data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
  2475. rmask = data | (data >> 16);
  2476. data |= ((enable ? 0x2 : 0x1) << bit);
  2477. break;
  2478. default:
  2479. data = BIT(bit + 16) | (enable << bit);
  2480. rmask = BIT(bit + 16) | BIT(bit);
  2481. break;
  2482. }
  2483. return regmap_update_bits(regmap, reg, rmask, data);
  2484. }
  2485. /*
  2486. * Pinmux_ops handling
  2487. */
  2488. static int rockchip_pmx_get_funcs_count(struct pinctrl_dev *pctldev)
  2489. {
  2490. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  2491. return info->nfunctions;
  2492. }
  2493. static const char *rockchip_pmx_get_func_name(struct pinctrl_dev *pctldev,
  2494. unsigned selector)
  2495. {
  2496. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  2497. return info->functions[selector].name;
  2498. }
  2499. static int rockchip_pmx_get_groups(struct pinctrl_dev *pctldev,
  2500. unsigned selector, const char * const **groups,
  2501. unsigned * const num_groups)
  2502. {
  2503. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  2504. *groups = info->functions[selector].groups;
  2505. *num_groups = info->functions[selector].ngroups;
  2506. return 0;
  2507. }
  2508. static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
  2509. unsigned group)
  2510. {
  2511. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  2512. const unsigned int *pins = info->groups[group].pins;
  2513. const struct rockchip_pin_config *data = info->groups[group].data;
  2514. struct device *dev = info->dev;
  2515. struct rockchip_pin_bank *bank;
  2516. int cnt, ret = 0;
  2517. dev_dbg(dev, "enable function %s group %s\n",
  2518. info->functions[selector].name, info->groups[group].name);
  2519. /*
  2520. * for each pin in the pin group selected, program the corresponding
  2521. * pin function number in the config register.
  2522. */
  2523. for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
  2524. bank = pin_to_bank(info, pins[cnt]);
  2525. ret = rockchip_set_mux(bank, pins[cnt] - bank->pin_base,
  2526. data[cnt].func);
  2527. if (ret)
  2528. break;
  2529. }
  2530. if (ret) {
  2531. /* revert the already done pin settings */
  2532. for (cnt--; cnt >= 0; cnt--) {
  2533. bank = pin_to_bank(info, pins[cnt]);
  2534. rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0);
  2535. }
  2536. return ret;
  2537. }
  2538. return 0;
  2539. }
  2540. static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
  2541. struct pinctrl_gpio_range *range,
  2542. unsigned offset,
  2543. bool input)
  2544. {
  2545. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  2546. struct rockchip_pin_bank *bank;
  2547. bank = pin_to_bank(info, offset);
  2548. return rockchip_set_mux(bank, offset - bank->pin_base, RK_FUNC_GPIO);
  2549. }
  2550. static const struct pinmux_ops rockchip_pmx_ops = {
  2551. .get_functions_count = rockchip_pmx_get_funcs_count,
  2552. .get_function_name = rockchip_pmx_get_func_name,
  2553. .get_function_groups = rockchip_pmx_get_groups,
  2554. .set_mux = rockchip_pmx_set,
  2555. .gpio_set_direction = rockchip_pmx_gpio_set_direction,
  2556. };
  2557. /*
  2558. * Pinconf_ops handling
  2559. */
  2560. static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
  2561. enum pin_config_param pull)
  2562. {
  2563. switch (ctrl->type) {
  2564. case RK2928:
  2565. case RK3128:
  2566. return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT ||
  2567. pull == PIN_CONFIG_BIAS_DISABLE);
  2568. case RK3066B:
  2569. return pull ? false : true;
  2570. case PX30:
  2571. case RV1108:
  2572. case RV1126:
  2573. case RK3188:
  2574. case RK3288:
  2575. case RK3308:
  2576. case RK3328:
  2577. case RK3368:
  2578. case RK3399:
  2579. case RK3568:
  2580. case RK3576:
  2581. case RK3588:
  2582. return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT);
  2583. }
  2584. return false;
  2585. }
  2586. static int rockchip_pinconf_defer_pin(struct rockchip_pin_bank *bank,
  2587. unsigned int pin, u32 param, u32 arg)
  2588. {
  2589. struct rockchip_pin_deferred *cfg;
  2590. cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
  2591. if (!cfg)
  2592. return -ENOMEM;
  2593. cfg->pin = pin;
  2594. cfg->param = param;
  2595. cfg->arg = arg;
  2596. list_add_tail(&cfg->head, &bank->deferred_pins);
  2597. return 0;
  2598. }
  2599. /* set the pin config settings for a specified pin */
  2600. static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
  2601. unsigned long *configs, unsigned num_configs)
  2602. {
  2603. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  2604. struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
  2605. struct gpio_chip *gpio = &bank->gpio_chip;
  2606. enum pin_config_param param;
  2607. u32 arg;
  2608. int i;
  2609. int rc;
  2610. for (i = 0; i < num_configs; i++) {
  2611. param = pinconf_to_config_param(configs[i]);
  2612. arg = pinconf_to_config_argument(configs[i]);
  2613. if (param == PIN_CONFIG_OUTPUT || param == PIN_CONFIG_INPUT_ENABLE) {
  2614. /*
  2615. * Check for gpio driver not being probed yet.
  2616. * The lock makes sure that either gpio-probe has completed
  2617. * or the gpio driver hasn't probed yet.
  2618. */
  2619. mutex_lock(&bank->deferred_lock);
  2620. if (!gpio || !gpio->direction_output) {
  2621. rc = rockchip_pinconf_defer_pin(bank, pin - bank->pin_base, param,
  2622. arg);
  2623. mutex_unlock(&bank->deferred_lock);
  2624. if (rc)
  2625. return rc;
  2626. break;
  2627. }
  2628. mutex_unlock(&bank->deferred_lock);
  2629. }
  2630. switch (param) {
  2631. case PIN_CONFIG_BIAS_DISABLE:
  2632. rc = rockchip_set_pull(bank, pin - bank->pin_base,
  2633. param);
  2634. if (rc)
  2635. return rc;
  2636. break;
  2637. case PIN_CONFIG_BIAS_PULL_UP:
  2638. case PIN_CONFIG_BIAS_PULL_DOWN:
  2639. case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
  2640. case PIN_CONFIG_BIAS_BUS_HOLD:
  2641. if (!rockchip_pinconf_pull_valid(info->ctrl, param))
  2642. return -ENOTSUPP;
  2643. if (!arg)
  2644. return -EINVAL;
  2645. rc = rockchip_set_pull(bank, pin - bank->pin_base,
  2646. param);
  2647. if (rc)
  2648. return rc;
  2649. break;
  2650. case PIN_CONFIG_OUTPUT:
  2651. rc = rockchip_set_mux(bank, pin - bank->pin_base,
  2652. RK_FUNC_GPIO);
  2653. if (rc != RK_FUNC_GPIO)
  2654. return -EINVAL;
  2655. rc = gpio->direction_output(gpio, pin - bank->pin_base,
  2656. arg);
  2657. if (rc)
  2658. return rc;
  2659. break;
  2660. case PIN_CONFIG_INPUT_ENABLE:
  2661. rc = rockchip_set_mux(bank, pin - bank->pin_base,
  2662. RK_FUNC_GPIO);
  2663. if (rc != RK_FUNC_GPIO)
  2664. return -EINVAL;
  2665. rc = gpio->direction_input(gpio, pin - bank->pin_base);
  2666. if (rc)
  2667. return rc;
  2668. break;
  2669. case PIN_CONFIG_DRIVE_STRENGTH:
  2670. /* rk3288 is the first with per-pin drive-strength */
  2671. if (!info->ctrl->drv_calc_reg)
  2672. return -ENOTSUPP;
  2673. rc = rockchip_set_drive_perpin(bank,
  2674. pin - bank->pin_base, arg);
  2675. if (rc < 0)
  2676. return rc;
  2677. break;
  2678. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  2679. if (!info->ctrl->schmitt_calc_reg)
  2680. return -ENOTSUPP;
  2681. rc = rockchip_set_schmitt(bank,
  2682. pin - bank->pin_base, arg);
  2683. if (rc < 0)
  2684. return rc;
  2685. break;
  2686. default:
  2687. return -ENOTSUPP;
  2688. break;
  2689. }
  2690. } /* for each config */
  2691. return 0;
  2692. }
  2693. /* get the pin config settings for a specified pin */
  2694. static int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
  2695. unsigned long *config)
  2696. {
  2697. struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
  2698. struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
  2699. struct gpio_chip *gpio = &bank->gpio_chip;
  2700. enum pin_config_param param = pinconf_to_config_param(*config);
  2701. u16 arg;
  2702. int rc;
  2703. switch (param) {
  2704. case PIN_CONFIG_BIAS_DISABLE:
  2705. if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
  2706. return -EINVAL;
  2707. arg = 0;
  2708. break;
  2709. case PIN_CONFIG_BIAS_PULL_UP:
  2710. case PIN_CONFIG_BIAS_PULL_DOWN:
  2711. case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
  2712. case PIN_CONFIG_BIAS_BUS_HOLD:
  2713. if (!rockchip_pinconf_pull_valid(info->ctrl, param))
  2714. return -ENOTSUPP;
  2715. if (rockchip_get_pull(bank, pin - bank->pin_base) != param)
  2716. return -EINVAL;
  2717. arg = 1;
  2718. break;
  2719. case PIN_CONFIG_OUTPUT:
  2720. rc = rockchip_get_mux(bank, pin - bank->pin_base);
  2721. if (rc != RK_FUNC_GPIO)
  2722. return -EINVAL;
  2723. if (!gpio || !gpio->get) {
  2724. arg = 0;
  2725. break;
  2726. }
  2727. rc = gpio->get(gpio, pin - bank->pin_base);
  2728. if (rc < 0)
  2729. return rc;
  2730. arg = rc ? 1 : 0;
  2731. break;
  2732. case PIN_CONFIG_DRIVE_STRENGTH:
  2733. /* rk3288 is the first with per-pin drive-strength */
  2734. if (!info->ctrl->drv_calc_reg)
  2735. return -ENOTSUPP;
  2736. rc = rockchip_get_drive_perpin(bank, pin - bank->pin_base);
  2737. if (rc < 0)
  2738. return rc;
  2739. arg = rc;
  2740. break;
  2741. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  2742. if (!info->ctrl->schmitt_calc_reg)
  2743. return -ENOTSUPP;
  2744. rc = rockchip_get_schmitt(bank, pin - bank->pin_base);
  2745. if (rc < 0)
  2746. return rc;
  2747. arg = rc;
  2748. break;
  2749. default:
  2750. return -ENOTSUPP;
  2751. break;
  2752. }
  2753. *config = pinconf_to_config_packed(param, arg);
  2754. return 0;
  2755. }
  2756. static const struct pinconf_ops rockchip_pinconf_ops = {
  2757. .pin_config_get = rockchip_pinconf_get,
  2758. .pin_config_set = rockchip_pinconf_set,
  2759. .is_generic = true,
  2760. };
  2761. static const struct of_device_id rockchip_bank_match[] = {
  2762. { .compatible = "rockchip,gpio-bank" },
  2763. { .compatible = "rockchip,rk3188-gpio-bank0" },
  2764. {},
  2765. };
  2766. static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info,
  2767. struct device_node *np)
  2768. {
  2769. struct device_node *child;
  2770. for_each_child_of_node(np, child) {
  2771. if (of_match_node(rockchip_bank_match, child))
  2772. continue;
  2773. info->nfunctions++;
  2774. info->ngroups += of_get_child_count(child);
  2775. }
  2776. }
  2777. static int rockchip_pinctrl_parse_groups(struct device_node *np,
  2778. struct rockchip_pin_group *grp,
  2779. struct rockchip_pinctrl *info,
  2780. u32 index)
  2781. {
  2782. struct device *dev = info->dev;
  2783. struct rockchip_pin_bank *bank;
  2784. int size;
  2785. const __be32 *list;
  2786. int num;
  2787. int i, j;
  2788. int ret;
  2789. dev_dbg(dev, "group(%d): %pOFn\n", index, np);
  2790. /* Initialise group */
  2791. grp->name = np->name;
  2792. /*
  2793. * the binding format is rockchip,pins = <bank pin mux CONFIG>,
  2794. * do sanity check and calculate pins number
  2795. */
  2796. list = of_get_property(np, "rockchip,pins", &size);
  2797. /* we do not check return since it's safe node passed down */
  2798. size /= sizeof(*list);
  2799. if (!size || size % 4)
  2800. return dev_err_probe(dev, -EINVAL, "wrong pins number or pins and configs should be by 4\n");
  2801. grp->npins = size / 4;
  2802. grp->pins = devm_kcalloc(dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
  2803. grp->data = devm_kcalloc(dev, grp->npins, sizeof(*grp->data), GFP_KERNEL);
  2804. if (!grp->pins || !grp->data)
  2805. return -ENOMEM;
  2806. for (i = 0, j = 0; i < size; i += 4, j++) {
  2807. const __be32 *phandle;
  2808. struct device_node *np_config;
  2809. num = be32_to_cpu(*list++);
  2810. bank = bank_num_to_bank(info, num);
  2811. if (IS_ERR(bank))
  2812. return PTR_ERR(bank);
  2813. grp->pins[j] = bank->pin_base + be32_to_cpu(*list++);
  2814. grp->data[j].func = be32_to_cpu(*list++);
  2815. phandle = list++;
  2816. if (!phandle)
  2817. return -EINVAL;
  2818. np_config = of_find_node_by_phandle(be32_to_cpup(phandle));
  2819. ret = pinconf_generic_parse_dt_config(np_config, NULL,
  2820. &grp->data[j].configs, &grp->data[j].nconfigs);
  2821. of_node_put(np_config);
  2822. if (ret)
  2823. return ret;
  2824. }
  2825. return 0;
  2826. }
  2827. static int rockchip_pinctrl_parse_functions(struct device_node *np,
  2828. struct rockchip_pinctrl *info,
  2829. u32 index)
  2830. {
  2831. struct device *dev = info->dev;
  2832. struct rockchip_pmx_func *func;
  2833. struct rockchip_pin_group *grp;
  2834. int ret;
  2835. static u32 grp_index;
  2836. u32 i = 0;
  2837. dev_dbg(dev, "parse function(%d): %pOFn\n", index, np);
  2838. func = &info->functions[index];
  2839. /* Initialise function */
  2840. func->name = np->name;
  2841. func->ngroups = of_get_child_count(np);
  2842. if (func->ngroups <= 0)
  2843. return 0;
  2844. func->groups = devm_kcalloc(dev, func->ngroups, sizeof(*func->groups), GFP_KERNEL);
  2845. if (!func->groups)
  2846. return -ENOMEM;
  2847. for_each_child_of_node_scoped(np, child) {
  2848. func->groups[i] = child->name;
  2849. grp = &info->groups[grp_index++];
  2850. ret = rockchip_pinctrl_parse_groups(child, grp, info, i++);
  2851. if (ret)
  2852. return ret;
  2853. }
  2854. return 0;
  2855. }
  2856. static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
  2857. struct rockchip_pinctrl *info)
  2858. {
  2859. struct device *dev = &pdev->dev;
  2860. struct device_node *np = dev->of_node;
  2861. int ret;
  2862. int i;
  2863. rockchip_pinctrl_child_count(info, np);
  2864. dev_dbg(dev, "nfunctions = %d\n", info->nfunctions);
  2865. dev_dbg(dev, "ngroups = %d\n", info->ngroups);
  2866. info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(*info->functions), GFP_KERNEL);
  2867. if (!info->functions)
  2868. return -ENOMEM;
  2869. info->groups = devm_kcalloc(dev, info->ngroups, sizeof(*info->groups), GFP_KERNEL);
  2870. if (!info->groups)
  2871. return -ENOMEM;
  2872. i = 0;
  2873. for_each_child_of_node_scoped(np, child) {
  2874. if (of_match_node(rockchip_bank_match, child))
  2875. continue;
  2876. ret = rockchip_pinctrl_parse_functions(child, info, i++);
  2877. if (ret) {
  2878. dev_err(dev, "failed to parse function\n");
  2879. return ret;
  2880. }
  2881. }
  2882. return 0;
  2883. }
  2884. static int rockchip_pinctrl_register(struct platform_device *pdev,
  2885. struct rockchip_pinctrl *info)
  2886. {
  2887. struct pinctrl_desc *ctrldesc = &info->pctl;
  2888. struct pinctrl_pin_desc *pindesc, *pdesc;
  2889. struct rockchip_pin_bank *pin_bank;
  2890. struct device *dev = &pdev->dev;
  2891. char **pin_names;
  2892. int pin, bank, ret;
  2893. int k;
  2894. ctrldesc->name = "rockchip-pinctrl";
  2895. ctrldesc->owner = THIS_MODULE;
  2896. ctrldesc->pctlops = &rockchip_pctrl_ops;
  2897. ctrldesc->pmxops = &rockchip_pmx_ops;
  2898. ctrldesc->confops = &rockchip_pinconf_ops;
  2899. pindesc = devm_kcalloc(dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL);
  2900. if (!pindesc)
  2901. return -ENOMEM;
  2902. ctrldesc->pins = pindesc;
  2903. ctrldesc->npins = info->ctrl->nr_pins;
  2904. pdesc = pindesc;
  2905. for (bank = 0, k = 0; bank < info->ctrl->nr_banks; bank++) {
  2906. pin_bank = &info->ctrl->pin_banks[bank];
  2907. pin_names = devm_kasprintf_strarray(dev, pin_bank->name, pin_bank->nr_pins);
  2908. if (IS_ERR(pin_names))
  2909. return PTR_ERR(pin_names);
  2910. for (pin = 0; pin < pin_bank->nr_pins; pin++, k++) {
  2911. pdesc->number = k;
  2912. pdesc->name = pin_names[pin];
  2913. pdesc++;
  2914. }
  2915. INIT_LIST_HEAD(&pin_bank->deferred_pins);
  2916. mutex_init(&pin_bank->deferred_lock);
  2917. }
  2918. ret = rockchip_pinctrl_parse_dt(pdev, info);
  2919. if (ret)
  2920. return ret;
  2921. info->pctl_dev = devm_pinctrl_register(dev, ctrldesc, info);
  2922. if (IS_ERR(info->pctl_dev))
  2923. return dev_err_probe(dev, PTR_ERR(info->pctl_dev), "could not register pinctrl driver\n");
  2924. return 0;
  2925. }
  2926. static const struct of_device_id rockchip_pinctrl_dt_match[];
  2927. /* retrieve the soc specific data */
  2928. static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
  2929. struct rockchip_pinctrl *d,
  2930. struct platform_device *pdev)
  2931. {
  2932. struct device *dev = &pdev->dev;
  2933. struct device_node *node = dev->of_node;
  2934. const struct of_device_id *match;
  2935. struct rockchip_pin_ctrl *ctrl;
  2936. struct rockchip_pin_bank *bank;
  2937. int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j;
  2938. match = of_match_node(rockchip_pinctrl_dt_match, node);
  2939. ctrl = (struct rockchip_pin_ctrl *)match->data;
  2940. grf_offs = ctrl->grf_mux_offset;
  2941. pmu_offs = ctrl->pmu_mux_offset;
  2942. drv_pmu_offs = ctrl->pmu_drv_offset;
  2943. drv_grf_offs = ctrl->grf_drv_offset;
  2944. bank = ctrl->pin_banks;
  2945. for (i = 0; i < ctrl->nr_banks; ++i, ++bank) {
  2946. int bank_pins = 0;
  2947. raw_spin_lock_init(&bank->slock);
  2948. bank->drvdata = d;
  2949. bank->pin_base = ctrl->nr_pins;
  2950. ctrl->nr_pins += bank->nr_pins;
  2951. /* calculate iomux and drv offsets */
  2952. for (j = 0; j < 4; j++) {
  2953. struct rockchip_iomux *iom = &bank->iomux[j];
  2954. struct rockchip_drv *drv = &bank->drv[j];
  2955. int inc;
  2956. if (bank_pins >= bank->nr_pins)
  2957. break;
  2958. /* preset iomux offset value, set new start value */
  2959. if (iom->offset >= 0) {
  2960. if ((iom->type & IOMUX_SOURCE_PMU) ||
  2961. (iom->type & IOMUX_L_SOURCE_PMU))
  2962. pmu_offs = iom->offset;
  2963. else
  2964. grf_offs = iom->offset;
  2965. } else { /* set current iomux offset */
  2966. iom->offset = ((iom->type & IOMUX_SOURCE_PMU) ||
  2967. (iom->type & IOMUX_L_SOURCE_PMU)) ?
  2968. pmu_offs : grf_offs;
  2969. }
  2970. /* preset drv offset value, set new start value */
  2971. if (drv->offset >= 0) {
  2972. if (iom->type & IOMUX_SOURCE_PMU)
  2973. drv_pmu_offs = drv->offset;
  2974. else
  2975. drv_grf_offs = drv->offset;
  2976. } else { /* set current drv offset */
  2977. drv->offset = (iom->type & IOMUX_SOURCE_PMU) ?
  2978. drv_pmu_offs : drv_grf_offs;
  2979. }
  2980. dev_dbg(dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n",
  2981. i, j, iom->offset, drv->offset);
  2982. /*
  2983. * Increase offset according to iomux width.
  2984. * 4bit iomux'es are spread over two registers.
  2985. */
  2986. inc = (iom->type & (IOMUX_WIDTH_4BIT |
  2987. IOMUX_WIDTH_3BIT |
  2988. IOMUX_WIDTH_2BIT)) ? 8 : 4;
  2989. if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU))
  2990. pmu_offs += inc;
  2991. else
  2992. grf_offs += inc;
  2993. /*
  2994. * Increase offset according to drv width.
  2995. * 3bit drive-strenth'es are spread over two registers.
  2996. */
  2997. if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) ||
  2998. (drv->drv_type == DRV_TYPE_IO_3V3_ONLY))
  2999. inc = 8;
  3000. else
  3001. inc = 4;
  3002. if (iom->type & IOMUX_SOURCE_PMU)
  3003. drv_pmu_offs += inc;
  3004. else
  3005. drv_grf_offs += inc;
  3006. bank_pins += 8;
  3007. }
  3008. /* calculate the per-bank recalced_mask */
  3009. for (j = 0; j < ctrl->niomux_recalced; j++) {
  3010. int pin = 0;
  3011. if (ctrl->iomux_recalced[j].num == bank->bank_num) {
  3012. pin = ctrl->iomux_recalced[j].pin;
  3013. bank->recalced_mask |= BIT(pin);
  3014. }
  3015. }
  3016. /* calculate the per-bank route_mask */
  3017. for (j = 0; j < ctrl->niomux_routes; j++) {
  3018. int pin = 0;
  3019. if (ctrl->iomux_routes[j].bank_num == bank->bank_num) {
  3020. pin = ctrl->iomux_routes[j].pin;
  3021. bank->route_mask |= BIT(pin);
  3022. }
  3023. }
  3024. }
  3025. return ctrl;
  3026. }
  3027. #define RK3288_GRF_GPIO6C_IOMUX 0x64
  3028. #define GPIO6C6_SEL_WRITE_ENABLE BIT(28)
  3029. static u32 rk3288_grf_gpio6c_iomux;
  3030. static int __maybe_unused rockchip_pinctrl_suspend(struct device *dev)
  3031. {
  3032. struct rockchip_pinctrl *info = dev_get_drvdata(dev);
  3033. int ret = pinctrl_force_sleep(info->pctl_dev);
  3034. if (ret)
  3035. return ret;
  3036. /*
  3037. * RK3288 GPIO6_C6 mux would be modified by Maskrom when resume, so save
  3038. * the setting here, and restore it at resume.
  3039. */
  3040. if (info->ctrl->type == RK3288) {
  3041. ret = regmap_read(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX,
  3042. &rk3288_grf_gpio6c_iomux);
  3043. if (ret) {
  3044. pinctrl_force_default(info->pctl_dev);
  3045. return ret;
  3046. }
  3047. }
  3048. return 0;
  3049. }
  3050. static int __maybe_unused rockchip_pinctrl_resume(struct device *dev)
  3051. {
  3052. struct rockchip_pinctrl *info = dev_get_drvdata(dev);
  3053. int ret;
  3054. if (info->ctrl->type == RK3288) {
  3055. ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX,
  3056. rk3288_grf_gpio6c_iomux |
  3057. GPIO6C6_SEL_WRITE_ENABLE);
  3058. if (ret)
  3059. return ret;
  3060. }
  3061. return pinctrl_force_default(info->pctl_dev);
  3062. }
  3063. static SIMPLE_DEV_PM_OPS(rockchip_pinctrl_dev_pm_ops, rockchip_pinctrl_suspend,
  3064. rockchip_pinctrl_resume);
  3065. static int rockchip_pinctrl_probe(struct platform_device *pdev)
  3066. {
  3067. struct rockchip_pinctrl *info;
  3068. struct device *dev = &pdev->dev;
  3069. struct device_node *np = dev->of_node, *node;
  3070. struct rockchip_pin_ctrl *ctrl;
  3071. struct resource *res;
  3072. void __iomem *base;
  3073. int ret;
  3074. if (!dev->of_node)
  3075. return dev_err_probe(dev, -ENODEV, "device tree node not found\n");
  3076. info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
  3077. if (!info)
  3078. return -ENOMEM;
  3079. info->dev = dev;
  3080. ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
  3081. if (!ctrl)
  3082. return dev_err_probe(dev, -EINVAL, "driver data not available\n");
  3083. info->ctrl = ctrl;
  3084. node = of_parse_phandle(np, "rockchip,grf", 0);
  3085. if (node) {
  3086. info->regmap_base = syscon_node_to_regmap(node);
  3087. of_node_put(node);
  3088. if (IS_ERR(info->regmap_base))
  3089. return PTR_ERR(info->regmap_base);
  3090. } else {
  3091. base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
  3092. if (IS_ERR(base))
  3093. return PTR_ERR(base);
  3094. rockchip_regmap_config.max_register = resource_size(res) - 4;
  3095. rockchip_regmap_config.name = "rockchip,pinctrl";
  3096. info->regmap_base =
  3097. devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
  3098. /* to check for the old dt-bindings */
  3099. info->reg_size = resource_size(res);
  3100. /* Honor the old binding, with pull registers as 2nd resource */
  3101. if (ctrl->type == RK3188 && info->reg_size < 0x200) {
  3102. base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
  3103. if (IS_ERR(base))
  3104. return PTR_ERR(base);
  3105. rockchip_regmap_config.max_register = resource_size(res) - 4;
  3106. rockchip_regmap_config.name = "rockchip,pinctrl-pull";
  3107. info->regmap_pull =
  3108. devm_regmap_init_mmio(dev, base, &rockchip_regmap_config);
  3109. }
  3110. }
  3111. /* try to find the optional reference to the pmu syscon */
  3112. node = of_parse_phandle(np, "rockchip,pmu", 0);
  3113. if (node) {
  3114. info->regmap_pmu = syscon_node_to_regmap(node);
  3115. of_node_put(node);
  3116. if (IS_ERR(info->regmap_pmu))
  3117. return PTR_ERR(info->regmap_pmu);
  3118. }
  3119. ret = rockchip_pinctrl_register(pdev, info);
  3120. if (ret)
  3121. return ret;
  3122. platform_set_drvdata(pdev, info);
  3123. ret = of_platform_populate(np, NULL, NULL, &pdev->dev);
  3124. if (ret)
  3125. return dev_err_probe(dev, ret, "failed to register gpio device\n");
  3126. return 0;
  3127. }
  3128. static void rockchip_pinctrl_remove(struct platform_device *pdev)
  3129. {
  3130. struct rockchip_pinctrl *info = platform_get_drvdata(pdev);
  3131. struct rockchip_pin_bank *bank;
  3132. struct rockchip_pin_deferred *cfg;
  3133. int i;
  3134. of_platform_depopulate(&pdev->dev);
  3135. for (i = 0; i < info->ctrl->nr_banks; i++) {
  3136. bank = &info->ctrl->pin_banks[i];
  3137. mutex_lock(&bank->deferred_lock);
  3138. while (!list_empty(&bank->deferred_pins)) {
  3139. cfg = list_first_entry(&bank->deferred_pins,
  3140. struct rockchip_pin_deferred, head);
  3141. list_del(&cfg->head);
  3142. kfree(cfg);
  3143. }
  3144. mutex_unlock(&bank->deferred_lock);
  3145. }
  3146. }
  3147. static struct rockchip_pin_bank px30_pin_banks[] = {
  3148. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
  3149. IOMUX_SOURCE_PMU,
  3150. IOMUX_SOURCE_PMU,
  3151. IOMUX_SOURCE_PMU
  3152. ),
  3153. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
  3154. IOMUX_WIDTH_4BIT,
  3155. IOMUX_WIDTH_4BIT,
  3156. IOMUX_WIDTH_4BIT
  3157. ),
  3158. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
  3159. IOMUX_WIDTH_4BIT,
  3160. IOMUX_WIDTH_4BIT,
  3161. IOMUX_WIDTH_4BIT
  3162. ),
  3163. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
  3164. IOMUX_WIDTH_4BIT,
  3165. IOMUX_WIDTH_4BIT,
  3166. IOMUX_WIDTH_4BIT
  3167. ),
  3168. };
  3169. static struct rockchip_pin_ctrl px30_pin_ctrl = {
  3170. .pin_banks = px30_pin_banks,
  3171. .nr_banks = ARRAY_SIZE(px30_pin_banks),
  3172. .label = "PX30-GPIO",
  3173. .type = PX30,
  3174. .grf_mux_offset = 0x0,
  3175. .pmu_mux_offset = 0x0,
  3176. .iomux_routes = px30_mux_route_data,
  3177. .niomux_routes = ARRAY_SIZE(px30_mux_route_data),
  3178. .pull_calc_reg = px30_calc_pull_reg_and_bit,
  3179. .drv_calc_reg = px30_calc_drv_reg_and_bit,
  3180. .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit,
  3181. };
  3182. static struct rockchip_pin_bank rv1108_pin_banks[] = {
  3183. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
  3184. IOMUX_SOURCE_PMU,
  3185. IOMUX_SOURCE_PMU,
  3186. IOMUX_SOURCE_PMU),
  3187. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
  3188. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, 0),
  3189. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, 0),
  3190. };
  3191. static struct rockchip_pin_ctrl rv1108_pin_ctrl = {
  3192. .pin_banks = rv1108_pin_banks,
  3193. .nr_banks = ARRAY_SIZE(rv1108_pin_banks),
  3194. .label = "RV1108-GPIO",
  3195. .type = RV1108,
  3196. .grf_mux_offset = 0x10,
  3197. .pmu_mux_offset = 0x0,
  3198. .iomux_recalced = rv1108_mux_recalced_data,
  3199. .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data),
  3200. .pull_calc_reg = rv1108_calc_pull_reg_and_bit,
  3201. .drv_calc_reg = rv1108_calc_drv_reg_and_bit,
  3202. .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit,
  3203. };
  3204. static struct rockchip_pin_bank rv1126_pin_banks[] = {
  3205. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0",
  3206. IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
  3207. IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU,
  3208. IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU,
  3209. IOMUX_WIDTH_4BIT),
  3210. PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
  3211. IOMUX_WIDTH_4BIT,
  3212. IOMUX_WIDTH_4BIT,
  3213. IOMUX_WIDTH_4BIT,
  3214. IOMUX_WIDTH_4BIT,
  3215. 0x10010, 0x10018, 0x10020, 0x10028),
  3216. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2",
  3217. IOMUX_WIDTH_4BIT,
  3218. IOMUX_WIDTH_4BIT,
  3219. IOMUX_WIDTH_4BIT,
  3220. IOMUX_WIDTH_4BIT),
  3221. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
  3222. IOMUX_WIDTH_4BIT,
  3223. IOMUX_WIDTH_4BIT,
  3224. IOMUX_WIDTH_4BIT,
  3225. IOMUX_WIDTH_4BIT),
  3226. PIN_BANK_IOMUX_FLAGS(4, 2, "gpio4",
  3227. IOMUX_WIDTH_4BIT, 0, 0, 0),
  3228. };
  3229. static struct rockchip_pin_ctrl rv1126_pin_ctrl = {
  3230. .pin_banks = rv1126_pin_banks,
  3231. .nr_banks = ARRAY_SIZE(rv1126_pin_banks),
  3232. .label = "RV1126-GPIO",
  3233. .type = RV1126,
  3234. .grf_mux_offset = 0x10004, /* mux offset from GPIO0_D0 */
  3235. .pmu_mux_offset = 0x0,
  3236. .iomux_routes = rv1126_mux_route_data,
  3237. .niomux_routes = ARRAY_SIZE(rv1126_mux_route_data),
  3238. .iomux_recalced = rv1126_mux_recalced_data,
  3239. .niomux_recalced = ARRAY_SIZE(rv1126_mux_recalced_data),
  3240. .pull_calc_reg = rv1126_calc_pull_reg_and_bit,
  3241. .drv_calc_reg = rv1126_calc_drv_reg_and_bit,
  3242. .schmitt_calc_reg = rv1126_calc_schmitt_reg_and_bit,
  3243. };
  3244. static struct rockchip_pin_bank rk2928_pin_banks[] = {
  3245. PIN_BANK(0, 32, "gpio0"),
  3246. PIN_BANK(1, 32, "gpio1"),
  3247. PIN_BANK(2, 32, "gpio2"),
  3248. PIN_BANK(3, 32, "gpio3"),
  3249. };
  3250. static struct rockchip_pin_ctrl rk2928_pin_ctrl = {
  3251. .pin_banks = rk2928_pin_banks,
  3252. .nr_banks = ARRAY_SIZE(rk2928_pin_banks),
  3253. .label = "RK2928-GPIO",
  3254. .type = RK2928,
  3255. .grf_mux_offset = 0xa8,
  3256. .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
  3257. };
  3258. static struct rockchip_pin_bank rk3036_pin_banks[] = {
  3259. PIN_BANK(0, 32, "gpio0"),
  3260. PIN_BANK(1, 32, "gpio1"),
  3261. PIN_BANK(2, 32, "gpio2"),
  3262. };
  3263. static struct rockchip_pin_ctrl rk3036_pin_ctrl = {
  3264. .pin_banks = rk3036_pin_banks,
  3265. .nr_banks = ARRAY_SIZE(rk3036_pin_banks),
  3266. .label = "RK3036-GPIO",
  3267. .type = RK2928,
  3268. .grf_mux_offset = 0xa8,
  3269. .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
  3270. };
  3271. static struct rockchip_pin_bank rk3066a_pin_banks[] = {
  3272. PIN_BANK(0, 32, "gpio0"),
  3273. PIN_BANK(1, 32, "gpio1"),
  3274. PIN_BANK(2, 32, "gpio2"),
  3275. PIN_BANK(3, 32, "gpio3"),
  3276. PIN_BANK(4, 32, "gpio4"),
  3277. PIN_BANK(6, 16, "gpio6"),
  3278. };
  3279. static struct rockchip_pin_ctrl rk3066a_pin_ctrl = {
  3280. .pin_banks = rk3066a_pin_banks,
  3281. .nr_banks = ARRAY_SIZE(rk3066a_pin_banks),
  3282. .label = "RK3066a-GPIO",
  3283. .type = RK2928,
  3284. .grf_mux_offset = 0xa8,
  3285. .pull_calc_reg = rk2928_calc_pull_reg_and_bit,
  3286. };
  3287. static struct rockchip_pin_bank rk3066b_pin_banks[] = {
  3288. PIN_BANK(0, 32, "gpio0"),
  3289. PIN_BANK(1, 32, "gpio1"),
  3290. PIN_BANK(2, 32, "gpio2"),
  3291. PIN_BANK(3, 32, "gpio3"),
  3292. };
  3293. static struct rockchip_pin_ctrl rk3066b_pin_ctrl = {
  3294. .pin_banks = rk3066b_pin_banks,
  3295. .nr_banks = ARRAY_SIZE(rk3066b_pin_banks),
  3296. .label = "RK3066b-GPIO",
  3297. .type = RK3066B,
  3298. .grf_mux_offset = 0x60,
  3299. };
  3300. static struct rockchip_pin_bank rk3128_pin_banks[] = {
  3301. PIN_BANK(0, 32, "gpio0"),
  3302. PIN_BANK(1, 32, "gpio1"),
  3303. PIN_BANK(2, 32, "gpio2"),
  3304. PIN_BANK(3, 32, "gpio3"),
  3305. };
  3306. static struct rockchip_pin_ctrl rk3128_pin_ctrl = {
  3307. .pin_banks = rk3128_pin_banks,
  3308. .nr_banks = ARRAY_SIZE(rk3128_pin_banks),
  3309. .label = "RK3128-GPIO",
  3310. .type = RK3128,
  3311. .grf_mux_offset = 0xa8,
  3312. .iomux_recalced = rk3128_mux_recalced_data,
  3313. .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data),
  3314. .iomux_routes = rk3128_mux_route_data,
  3315. .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data),
  3316. .pull_calc_reg = rk3128_calc_pull_reg_and_bit,
  3317. };
  3318. static struct rockchip_pin_bank rk3188_pin_banks[] = {
  3319. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
  3320. PIN_BANK(1, 32, "gpio1"),
  3321. PIN_BANK(2, 32, "gpio2"),
  3322. PIN_BANK(3, 32, "gpio3"),
  3323. };
  3324. static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
  3325. .pin_banks = rk3188_pin_banks,
  3326. .nr_banks = ARRAY_SIZE(rk3188_pin_banks),
  3327. .label = "RK3188-GPIO",
  3328. .type = RK3188,
  3329. .grf_mux_offset = 0x60,
  3330. .iomux_routes = rk3188_mux_route_data,
  3331. .niomux_routes = ARRAY_SIZE(rk3188_mux_route_data),
  3332. .pull_calc_reg = rk3188_calc_pull_reg_and_bit,
  3333. };
  3334. static struct rockchip_pin_bank rk3228_pin_banks[] = {
  3335. PIN_BANK(0, 32, "gpio0"),
  3336. PIN_BANK(1, 32, "gpio1"),
  3337. PIN_BANK(2, 32, "gpio2"),
  3338. PIN_BANK(3, 32, "gpio3"),
  3339. };
  3340. static struct rockchip_pin_ctrl rk3228_pin_ctrl = {
  3341. .pin_banks = rk3228_pin_banks,
  3342. .nr_banks = ARRAY_SIZE(rk3228_pin_banks),
  3343. .label = "RK3228-GPIO",
  3344. .type = RK3288,
  3345. .grf_mux_offset = 0x0,
  3346. .iomux_routes = rk3228_mux_route_data,
  3347. .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data),
  3348. .pull_calc_reg = rk3228_calc_pull_reg_and_bit,
  3349. .drv_calc_reg = rk3228_calc_drv_reg_and_bit,
  3350. };
  3351. static struct rockchip_pin_bank rk3288_pin_banks[] = {
  3352. PIN_BANK_IOMUX_FLAGS(0, 24, "gpio0", IOMUX_SOURCE_PMU,
  3353. IOMUX_SOURCE_PMU,
  3354. IOMUX_SOURCE_PMU,
  3355. IOMUX_UNROUTED
  3356. ),
  3357. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_UNROUTED,
  3358. IOMUX_UNROUTED,
  3359. IOMUX_UNROUTED,
  3360. 0
  3361. ),
  3362. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0, 0, 0, IOMUX_UNROUTED),
  3363. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT),
  3364. PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
  3365. IOMUX_WIDTH_4BIT,
  3366. 0,
  3367. 0
  3368. ),
  3369. PIN_BANK_IOMUX_FLAGS(5, 32, "gpio5", IOMUX_UNROUTED,
  3370. 0,
  3371. 0,
  3372. IOMUX_UNROUTED
  3373. ),
  3374. PIN_BANK_IOMUX_FLAGS(6, 32, "gpio6", 0, 0, 0, IOMUX_UNROUTED),
  3375. PIN_BANK_IOMUX_FLAGS(7, 32, "gpio7", 0,
  3376. 0,
  3377. IOMUX_WIDTH_4BIT,
  3378. IOMUX_UNROUTED
  3379. ),
  3380. PIN_BANK(8, 16, "gpio8"),
  3381. };
  3382. static struct rockchip_pin_ctrl rk3288_pin_ctrl = {
  3383. .pin_banks = rk3288_pin_banks,
  3384. .nr_banks = ARRAY_SIZE(rk3288_pin_banks),
  3385. .label = "RK3288-GPIO",
  3386. .type = RK3288,
  3387. .grf_mux_offset = 0x0,
  3388. .pmu_mux_offset = 0x84,
  3389. .iomux_routes = rk3288_mux_route_data,
  3390. .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data),
  3391. .pull_calc_reg = rk3288_calc_pull_reg_and_bit,
  3392. .drv_calc_reg = rk3288_calc_drv_reg_and_bit,
  3393. };
  3394. static struct rockchip_pin_bank rk3308_pin_banks[] = {
  3395. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT,
  3396. IOMUX_WIDTH_2BIT,
  3397. IOMUX_WIDTH_2BIT,
  3398. IOMUX_WIDTH_2BIT),
  3399. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT,
  3400. IOMUX_WIDTH_2BIT,
  3401. IOMUX_WIDTH_2BIT,
  3402. IOMUX_WIDTH_2BIT),
  3403. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT,
  3404. IOMUX_WIDTH_2BIT,
  3405. IOMUX_WIDTH_2BIT,
  3406. IOMUX_WIDTH_2BIT),
  3407. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT,
  3408. IOMUX_WIDTH_2BIT,
  3409. IOMUX_WIDTH_2BIT,
  3410. IOMUX_WIDTH_2BIT),
  3411. PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT,
  3412. IOMUX_WIDTH_2BIT,
  3413. IOMUX_WIDTH_2BIT,
  3414. IOMUX_WIDTH_2BIT),
  3415. };
  3416. static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
  3417. .pin_banks = rk3308_pin_banks,
  3418. .nr_banks = ARRAY_SIZE(rk3308_pin_banks),
  3419. .label = "RK3308-GPIO",
  3420. .type = RK3308,
  3421. .grf_mux_offset = 0x0,
  3422. .iomux_recalced = rk3308_mux_recalced_data,
  3423. .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
  3424. .iomux_routes = rk3308_mux_route_data,
  3425. .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data),
  3426. .pull_calc_reg = rk3308_calc_pull_reg_and_bit,
  3427. .drv_calc_reg = rk3308_calc_drv_reg_and_bit,
  3428. .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit,
  3429. };
  3430. static struct rockchip_pin_bank rk3328_pin_banks[] = {
  3431. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
  3432. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
  3433. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
  3434. IOMUX_WIDTH_2BIT,
  3435. IOMUX_WIDTH_3BIT,
  3436. 0),
  3437. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
  3438. IOMUX_WIDTH_3BIT,
  3439. IOMUX_WIDTH_3BIT,
  3440. 0,
  3441. 0),
  3442. };
  3443. static struct rockchip_pin_ctrl rk3328_pin_ctrl = {
  3444. .pin_banks = rk3328_pin_banks,
  3445. .nr_banks = ARRAY_SIZE(rk3328_pin_banks),
  3446. .label = "RK3328-GPIO",
  3447. .type = RK3328,
  3448. .grf_mux_offset = 0x0,
  3449. .iomux_recalced = rk3328_mux_recalced_data,
  3450. .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data),
  3451. .iomux_routes = rk3328_mux_route_data,
  3452. .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data),
  3453. .pull_calc_reg = rk3228_calc_pull_reg_and_bit,
  3454. .drv_calc_reg = rk3228_calc_drv_reg_and_bit,
  3455. .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit,
  3456. };
  3457. static struct rockchip_pin_bank rk3368_pin_banks[] = {
  3458. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU,
  3459. IOMUX_SOURCE_PMU,
  3460. IOMUX_SOURCE_PMU,
  3461. IOMUX_SOURCE_PMU
  3462. ),
  3463. PIN_BANK(1, 32, "gpio1"),
  3464. PIN_BANK(2, 32, "gpio2"),
  3465. PIN_BANK(3, 32, "gpio3"),
  3466. };
  3467. static struct rockchip_pin_ctrl rk3368_pin_ctrl = {
  3468. .pin_banks = rk3368_pin_banks,
  3469. .nr_banks = ARRAY_SIZE(rk3368_pin_banks),
  3470. .label = "RK3368-GPIO",
  3471. .type = RK3368,
  3472. .grf_mux_offset = 0x0,
  3473. .pmu_mux_offset = 0x0,
  3474. .pull_calc_reg = rk3368_calc_pull_reg_and_bit,
  3475. .drv_calc_reg = rk3368_calc_drv_reg_and_bit,
  3476. };
  3477. static struct rockchip_pin_bank rk3399_pin_banks[] = {
  3478. PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(0, 32, "gpio0",
  3479. IOMUX_SOURCE_PMU,
  3480. IOMUX_SOURCE_PMU,
  3481. IOMUX_SOURCE_PMU,
  3482. IOMUX_SOURCE_PMU,
  3483. DRV_TYPE_IO_1V8_ONLY,
  3484. DRV_TYPE_IO_1V8_ONLY,
  3485. DRV_TYPE_IO_DEFAULT,
  3486. DRV_TYPE_IO_DEFAULT,
  3487. 0x80,
  3488. 0x88,
  3489. -1,
  3490. -1,
  3491. PULL_TYPE_IO_1V8_ONLY,
  3492. PULL_TYPE_IO_1V8_ONLY,
  3493. PULL_TYPE_IO_DEFAULT,
  3494. PULL_TYPE_IO_DEFAULT
  3495. ),
  3496. PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(1, 32, "gpio1", IOMUX_SOURCE_PMU,
  3497. IOMUX_SOURCE_PMU,
  3498. IOMUX_SOURCE_PMU,
  3499. IOMUX_SOURCE_PMU,
  3500. DRV_TYPE_IO_1V8_OR_3V0,
  3501. DRV_TYPE_IO_1V8_OR_3V0,
  3502. DRV_TYPE_IO_1V8_OR_3V0,
  3503. DRV_TYPE_IO_1V8_OR_3V0,
  3504. 0xa0,
  3505. 0xa8,
  3506. 0xb0,
  3507. 0xb8
  3508. ),
  3509. PIN_BANK_DRV_FLAGS_PULL_FLAGS(2, 32, "gpio2", DRV_TYPE_IO_1V8_OR_3V0,
  3510. DRV_TYPE_IO_1V8_OR_3V0,
  3511. DRV_TYPE_IO_1V8_ONLY,
  3512. DRV_TYPE_IO_1V8_ONLY,
  3513. PULL_TYPE_IO_DEFAULT,
  3514. PULL_TYPE_IO_DEFAULT,
  3515. PULL_TYPE_IO_1V8_ONLY,
  3516. PULL_TYPE_IO_1V8_ONLY
  3517. ),
  3518. PIN_BANK_DRV_FLAGS(3, 32, "gpio3", DRV_TYPE_IO_3V3_ONLY,
  3519. DRV_TYPE_IO_3V3_ONLY,
  3520. DRV_TYPE_IO_3V3_ONLY,
  3521. DRV_TYPE_IO_1V8_OR_3V0
  3522. ),
  3523. PIN_BANK_DRV_FLAGS(4, 32, "gpio4", DRV_TYPE_IO_1V8_OR_3V0,
  3524. DRV_TYPE_IO_1V8_3V0_AUTO,
  3525. DRV_TYPE_IO_1V8_OR_3V0,
  3526. DRV_TYPE_IO_1V8_OR_3V0
  3527. ),
  3528. };
  3529. static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
  3530. .pin_banks = rk3399_pin_banks,
  3531. .nr_banks = ARRAY_SIZE(rk3399_pin_banks),
  3532. .label = "RK3399-GPIO",
  3533. .type = RK3399,
  3534. .grf_mux_offset = 0xe000,
  3535. .pmu_mux_offset = 0x0,
  3536. .grf_drv_offset = 0xe100,
  3537. .pmu_drv_offset = 0x80,
  3538. .iomux_routes = rk3399_mux_route_data,
  3539. .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data),
  3540. .pull_calc_reg = rk3399_calc_pull_reg_and_bit,
  3541. .drv_calc_reg = rk3399_calc_drv_reg_and_bit,
  3542. };
  3543. static struct rockchip_pin_bank rk3568_pin_banks[] = {
  3544. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
  3545. IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
  3546. IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
  3547. IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT),
  3548. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT,
  3549. IOMUX_WIDTH_4BIT,
  3550. IOMUX_WIDTH_4BIT,
  3551. IOMUX_WIDTH_4BIT),
  3552. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT,
  3553. IOMUX_WIDTH_4BIT,
  3554. IOMUX_WIDTH_4BIT,
  3555. IOMUX_WIDTH_4BIT),
  3556. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT,
  3557. IOMUX_WIDTH_4BIT,
  3558. IOMUX_WIDTH_4BIT,
  3559. IOMUX_WIDTH_4BIT),
  3560. PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT,
  3561. IOMUX_WIDTH_4BIT,
  3562. IOMUX_WIDTH_4BIT,
  3563. IOMUX_WIDTH_4BIT),
  3564. };
  3565. static struct rockchip_pin_ctrl rk3568_pin_ctrl = {
  3566. .pin_banks = rk3568_pin_banks,
  3567. .nr_banks = ARRAY_SIZE(rk3568_pin_banks),
  3568. .label = "RK3568-GPIO",
  3569. .type = RK3568,
  3570. .grf_mux_offset = 0x0,
  3571. .pmu_mux_offset = 0x0,
  3572. .grf_drv_offset = 0x0200,
  3573. .pmu_drv_offset = 0x0070,
  3574. .iomux_routes = rk3568_mux_route_data,
  3575. .niomux_routes = ARRAY_SIZE(rk3568_mux_route_data),
  3576. .pull_calc_reg = rk3568_calc_pull_reg_and_bit,
  3577. .drv_calc_reg = rk3568_calc_drv_reg_and_bit,
  3578. .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit,
  3579. };
  3580. #define RK3576_PIN_BANK(ID, LABEL, OFFSET0, OFFSET1, OFFSET2, OFFSET3) \
  3581. PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS(ID, 32, LABEL, \
  3582. IOMUX_WIDTH_4BIT, \
  3583. IOMUX_WIDTH_4BIT, \
  3584. IOMUX_WIDTH_4BIT, \
  3585. IOMUX_WIDTH_4BIT, \
  3586. OFFSET0, OFFSET1, \
  3587. OFFSET2, OFFSET3, \
  3588. PULL_TYPE_IO_1V8_ONLY, \
  3589. PULL_TYPE_IO_1V8_ONLY, \
  3590. PULL_TYPE_IO_1V8_ONLY, \
  3591. PULL_TYPE_IO_1V8_ONLY)
  3592. static struct rockchip_pin_bank rk3576_pin_banks[] = {
  3593. RK3576_PIN_BANK(0, "gpio0", 0, 0x8, 0x2004, 0x200C),
  3594. RK3576_PIN_BANK(1, "gpio1", 0x4020, 0x4028, 0x4030, 0x4038),
  3595. RK3576_PIN_BANK(2, "gpio2", 0x4040, 0x4048, 0x4050, 0x4058),
  3596. RK3576_PIN_BANK(3, "gpio3", 0x4060, 0x4068, 0x4070, 0x4078),
  3597. RK3576_PIN_BANK(4, "gpio4", 0x4080, 0x4088, 0xA390, 0xB398),
  3598. };
  3599. static struct rockchip_pin_ctrl rk3576_pin_ctrl __maybe_unused = {
  3600. .pin_banks = rk3576_pin_banks,
  3601. .nr_banks = ARRAY_SIZE(rk3576_pin_banks),
  3602. .label = "RK3576-GPIO",
  3603. .type = RK3576,
  3604. .pull_calc_reg = rk3576_calc_pull_reg_and_bit,
  3605. .drv_calc_reg = rk3576_calc_drv_reg_and_bit,
  3606. .schmitt_calc_reg = rk3576_calc_schmitt_reg_and_bit,
  3607. };
  3608. static struct rockchip_pin_bank rk3588_pin_banks[] = {
  3609. RK3588_PIN_BANK_FLAGS(0, 32, "gpio0",
  3610. IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  3611. RK3588_PIN_BANK_FLAGS(1, 32, "gpio1",
  3612. IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  3613. RK3588_PIN_BANK_FLAGS(2, 32, "gpio2",
  3614. IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  3615. RK3588_PIN_BANK_FLAGS(3, 32, "gpio3",
  3616. IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  3617. RK3588_PIN_BANK_FLAGS(4, 32, "gpio4",
  3618. IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  3619. };
  3620. static struct rockchip_pin_ctrl rk3588_pin_ctrl = {
  3621. .pin_banks = rk3588_pin_banks,
  3622. .nr_banks = ARRAY_SIZE(rk3588_pin_banks),
  3623. .label = "RK3588-GPIO",
  3624. .type = RK3588,
  3625. .pull_calc_reg = rk3588_calc_pull_reg_and_bit,
  3626. .drv_calc_reg = rk3588_calc_drv_reg_and_bit,
  3627. .schmitt_calc_reg = rk3588_calc_schmitt_reg_and_bit,
  3628. };
  3629. static const struct of_device_id rockchip_pinctrl_dt_match[] = {
  3630. { .compatible = "rockchip,px30-pinctrl",
  3631. .data = &px30_pin_ctrl },
  3632. { .compatible = "rockchip,rv1108-pinctrl",
  3633. .data = &rv1108_pin_ctrl },
  3634. { .compatible = "rockchip,rv1126-pinctrl",
  3635. .data = &rv1126_pin_ctrl },
  3636. { .compatible = "rockchip,rk2928-pinctrl",
  3637. .data = &rk2928_pin_ctrl },
  3638. { .compatible = "rockchip,rk3036-pinctrl",
  3639. .data = &rk3036_pin_ctrl },
  3640. { .compatible = "rockchip,rk3066a-pinctrl",
  3641. .data = &rk3066a_pin_ctrl },
  3642. { .compatible = "rockchip,rk3066b-pinctrl",
  3643. .data = &rk3066b_pin_ctrl },
  3644. { .compatible = "rockchip,rk3128-pinctrl",
  3645. .data = (void *)&rk3128_pin_ctrl },
  3646. { .compatible = "rockchip,rk3188-pinctrl",
  3647. .data = &rk3188_pin_ctrl },
  3648. { .compatible = "rockchip,rk3228-pinctrl",
  3649. .data = &rk3228_pin_ctrl },
  3650. { .compatible = "rockchip,rk3288-pinctrl",
  3651. .data = &rk3288_pin_ctrl },
  3652. { .compatible = "rockchip,rk3308-pinctrl",
  3653. .data = &rk3308_pin_ctrl },
  3654. { .compatible = "rockchip,rk3328-pinctrl",
  3655. .data = &rk3328_pin_ctrl },
  3656. { .compatible = "rockchip,rk3368-pinctrl",
  3657. .data = &rk3368_pin_ctrl },
  3658. { .compatible = "rockchip,rk3399-pinctrl",
  3659. .data = &rk3399_pin_ctrl },
  3660. { .compatible = "rockchip,rk3568-pinctrl",
  3661. .data = &rk3568_pin_ctrl },
  3662. { .compatible = "rockchip,rk3576-pinctrl",
  3663. .data = &rk3576_pin_ctrl },
  3664. { .compatible = "rockchip,rk3588-pinctrl",
  3665. .data = &rk3588_pin_ctrl },
  3666. {},
  3667. };
  3668. static struct platform_driver rockchip_pinctrl_driver = {
  3669. .probe = rockchip_pinctrl_probe,
  3670. .remove_new = rockchip_pinctrl_remove,
  3671. .driver = {
  3672. .name = "rockchip-pinctrl",
  3673. .pm = &rockchip_pinctrl_dev_pm_ops,
  3674. .of_match_table = rockchip_pinctrl_dt_match,
  3675. },
  3676. };
  3677. static int __init rockchip_pinctrl_drv_register(void)
  3678. {
  3679. return platform_driver_register(&rockchip_pinctrl_driver);
  3680. }
  3681. postcore_initcall(rockchip_pinctrl_drv_register);
  3682. static void __exit rockchip_pinctrl_drv_unregister(void)
  3683. {
  3684. platform_driver_unregister(&rockchip_pinctrl_driver);
  3685. }
  3686. module_exit(rockchip_pinctrl_drv_unregister);
  3687. MODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver");
  3688. MODULE_LICENSE("GPL");
  3689. MODULE_ALIAS("platform:pinctrl-rockchip");
  3690. MODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match);