mlx-platform.c 188 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666
  1. // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
  2. /*
  3. * Mellanox platform driver
  4. *
  5. * Copyright (C) 2016-2018 Mellanox Technologies
  6. * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
  7. */
  8. #include <linux/device.h>
  9. #include <linux/dmi.h>
  10. #include <linux/i2c.h>
  11. #include <linux/i2c-mux.h>
  12. #include <linux/io.h>
  13. #include <linux/module.h>
  14. #include <linux/pci.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/platform_data/i2c-mux-reg.h>
  17. #include <linux/platform_data/mlxreg.h>
  18. #include <linux/reboot.h>
  19. #include <linux/regmap.h>
  20. #define MLX_PLAT_DEVICE_NAME "mlxplat"
  21. /* LPC bus IO offsets */
  22. #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
  23. #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
  24. #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00
  25. #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01
  26. #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02
  27. #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03
  28. #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET 0x04
  29. #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET 0x05
  30. #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET 0x06
  31. #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET 0x07
  32. #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET 0x08
  33. #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET 0x09
  34. #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET 0x0a
  35. #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET 0x0b
  36. #define MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET 0x17
  37. #define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET 0x19
  38. #define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET 0x1c
  39. #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
  40. #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e
  41. #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f
  42. #define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET 0x20
  43. #define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET 0x21
  44. #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22
  45. #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23
  46. #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24
  47. #define MLXPLAT_CPLD_LPC_REG_LED6_OFFSET 0x25
  48. #define MLXPLAT_CPLD_LPC_REG_LED7_OFFSET 0x26
  49. #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION 0x2a
  50. #define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET 0x2b
  51. #define MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET 0x2d
  52. #define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET 0x2e
  53. #define MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET 0x2f
  54. #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30
  55. #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31
  56. #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32
  57. #define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET 0x33
  58. #define MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE 0x34
  59. #define MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET 0x35
  60. #define MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET 0x36
  61. #define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
  62. #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a
  63. #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b
  64. #define MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET 0x3c
  65. #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40
  66. #define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
  67. #define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET 0x42
  68. #define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
  69. #define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET 0x44
  70. #define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
  71. #define MLXPLAT_CPLD_LPC_REG_BRD_OFFSET 0x47
  72. #define MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET 0x48
  73. #define MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET 0x49
  74. #define MLXPLAT_CPLD_LPC_REG_GWP_OFFSET 0x4a
  75. #define MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET 0x4b
  76. #define MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET 0x4c
  77. #define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
  78. #define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET 0x51
  79. #define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET 0x52
  80. #define MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET 0x53
  81. #define MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET 0x54
  82. #define MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET 0x55
  83. #define MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET 0x56
  84. #define MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET 0x57
  85. #define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET 0x58
  86. #define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET 0x59
  87. #define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET 0x5a
  88. #define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET 0x64
  89. #define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET 0x65
  90. #define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET 0x66
  91. #define MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET 0x70
  92. #define MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET 0x71
  93. #define MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET 0x72
  94. #define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET 0x88
  95. #define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET 0x89
  96. #define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET 0x8a
  97. #define MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET 0x8e
  98. #define MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET 0x8f
  99. #define MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET 0x90
  100. #define MLXPLAT_CPLD_LPC_REG_EROT_OFFSET 0x91
  101. #define MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET 0x92
  102. #define MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET 0x93
  103. #define MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET 0x94
  104. #define MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET 0x95
  105. #define MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET 0x96
  106. #define MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET 0x97
  107. #define MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET 0x98
  108. #define MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET 0x99
  109. #define MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET 0x9a
  110. #define MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET 0x9b
  111. #define MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET 0x9c
  112. #define MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET 0x9d
  113. #define MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET 0x9e
  114. #define MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET 0x9f
  115. #define MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET 0xa0
  116. #define MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET 0xa1
  117. #define MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET 0xa2
  118. #define MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET 0xa3
  119. #define MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET 0xa4
  120. #define MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET 0xa5
  121. #define MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET 0xa6
  122. #define MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET 0xa7
  123. #define MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET 0xa8
  124. #define MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET 0xa9
  125. #define MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET 0xaa
  126. #define MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET 0xab
  127. #define MLXPLAT_CPLD_LPC_REG_LC_PWR_ON 0xb2
  128. #define MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET 0xb6
  129. #define MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET 0xb7
  130. #define MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET 0xb8
  131. #define MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET 0xb9
  132. #define MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET 0xc2
  133. #define MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT 0xc3
  134. #define MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET 0xc4
  135. #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET 0xc7
  136. #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
  137. #define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET 0xc9
  138. #define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET 0xcb
  139. #define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET 0xcd
  140. #define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET 0xce
  141. #define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET 0xcf
  142. #define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET 0xd1
  143. #define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET 0xd2
  144. #define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET 0xd3
  145. #define MLXPLAT_CPLD_LPC_REG_DBG_CTRL_OFFSET 0xd9
  146. #define MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET 0xdb
  147. #define MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET 0xda
  148. #define MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET 0xdc
  149. #define MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET 0xdd
  150. #define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET 0xde
  151. #define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET 0xdf
  152. #define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET 0xe0
  153. #define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET 0xe1
  154. #define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET 0xe2
  155. #define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET 0xe3
  156. #define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET 0xe4
  157. #define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET 0xe5
  158. #define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET 0xe6
  159. #define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET 0xe7
  160. #define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET 0xe8
  161. #define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET 0xe9
  162. #define MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET 0xea
  163. #define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET 0xeb
  164. #define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET 0xec
  165. #define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET 0xed
  166. #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee
  167. #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef
  168. #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0
  169. #define MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET 0xf1
  170. #define MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET 0xf2
  171. #define MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET 0xf3
  172. #define MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET 0xf4
  173. #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET 0xf5
  174. #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET 0xf6
  175. #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
  176. #define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
  177. #define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
  178. #define MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET 0xfa
  179. #define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET 0xfb
  180. #define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET 0xfc
  181. #define MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET 0xfd
  182. #define MLXPLAT_CPLD_LPC_IO_RANGE 0x100
  183. #define MLXPLAT_CPLD_LPC_PIO_OFFSET 0x10000UL
  184. #define MLXPLAT_CPLD_LPC_REG1 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
  185. MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET) | \
  186. MLXPLAT_CPLD_LPC_PIO_OFFSET)
  187. #define MLXPLAT_CPLD_LPC_REG2 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
  188. MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET) | \
  189. MLXPLAT_CPLD_LPC_PIO_OFFSET)
  190. #define MLXPLAT_CPLD_LPC_REG3 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
  191. MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET) | \
  192. MLXPLAT_CPLD_LPC_PIO_OFFSET)
  193. #define MLXPLAT_CPLD_LPC_REG4 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
  194. MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET) | \
  195. MLXPLAT_CPLD_LPC_PIO_OFFSET)
  196. /* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
  197. #define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
  198. #define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF 0x08
  199. #define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF 0x08
  200. #define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF 0x40
  201. #define MLXPLAT_CPLD_AGGR_MASK_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
  202. MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
  203. MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
  204. #define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG 0x01
  205. #define MLXPLAT_CPLD_AGGR_MASK_NG_DEF 0x04
  206. #define MLXPLAT_CPLD_AGGR_MASK_COMEX BIT(0)
  207. #define MLXPLAT_CPLD_AGGR_MASK_LC BIT(3)
  208. #define MLXPLAT_CPLD_AGGR_MASK_MODULAR (MLXPLAT_CPLD_AGGR_MASK_NG_DEF | \
  209. MLXPLAT_CPLD_AGGR_MASK_COMEX | \
  210. MLXPLAT_CPLD_AGGR_MASK_LC)
  211. #define MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT BIT(0)
  212. #define MLXPLAT_CPLD_AGGR_MASK_LC_RDY BIT(1)
  213. #define MLXPLAT_CPLD_AGGR_MASK_LC_PG BIT(2)
  214. #define MLXPLAT_CPLD_AGGR_MASK_LC_SCRD BIT(3)
  215. #define MLXPLAT_CPLD_AGGR_MASK_LC_SYNC BIT(4)
  216. #define MLXPLAT_CPLD_AGGR_MASK_LC_ACT BIT(5)
  217. #define MLXPLAT_CPLD_AGGR_MASK_LC_SDWN BIT(6)
  218. #define MLXPLAT_CPLD_AGGR_MASK_LC_LOW (MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT | \
  219. MLXPLAT_CPLD_AGGR_MASK_LC_RDY | \
  220. MLXPLAT_CPLD_AGGR_MASK_LC_PG | \
  221. MLXPLAT_CPLD_AGGR_MASK_LC_SCRD | \
  222. MLXPLAT_CPLD_AGGR_MASK_LC_SYNC | \
  223. MLXPLAT_CPLD_AGGR_MASK_LC_ACT | \
  224. MLXPLAT_CPLD_AGGR_MASK_LC_SDWN)
  225. #define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW 0xc1
  226. #define MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2 BIT(2)
  227. #define MLXPLAT_CPLD_LOW_AGGR_MASK_PWR_BUT GENMASK(5, 4)
  228. #define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C BIT(6)
  229. #define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0)
  230. #define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0)
  231. #define MLXPLAT_CPLD_PSU_EXT_MASK GENMASK(3, 0)
  232. #define MLXPLAT_CPLD_PWR_EXT_MASK GENMASK(3, 0)
  233. #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
  234. #define MLXPLAT_CPLD_ASIC_MASK GENMASK(1, 0)
  235. #define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(6, 0)
  236. #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
  237. #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
  238. #define MLXPLAT_CPLD_VOLTREG_UPD_MASK GENMASK(5, 4)
  239. #define MLXPLAT_CPLD_GWP_MASK GENMASK(0, 0)
  240. #define MLXPLAT_CPLD_EROT_MASK GENMASK(1, 0)
  241. #define MLXPLAT_CPLD_FU_CAP_MASK GENMASK(1, 0)
  242. #define MLXPLAT_CPLD_PWR_BUTTON_MASK BIT(0)
  243. #define MLXPLAT_CPLD_LATCH_RST_MASK BIT(6)
  244. #define MLXPLAT_CPLD_THERMAL1_PDB_MASK BIT(3)
  245. #define MLXPLAT_CPLD_THERMAL2_PDB_MASK BIT(4)
  246. #define MLXPLAT_CPLD_INTRUSION_MASK BIT(6)
  247. #define MLXPLAT_CPLD_PWM_PG_MASK BIT(7)
  248. #define MLXPLAT_CPLD_L1_CHA_HEALTH_MASK (MLXPLAT_CPLD_THERMAL1_PDB_MASK | \
  249. MLXPLAT_CPLD_THERMAL2_PDB_MASK | \
  250. MLXPLAT_CPLD_INTRUSION_MASK |\
  251. MLXPLAT_CPLD_PWM_PG_MASK)
  252. #define MLXPLAT_CPLD_I2C_CAP_BIT 0x04
  253. #define MLXPLAT_CPLD_I2C_CAP_MASK GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
  254. #define MLXPLAT_CPLD_SYS_RESET_MASK BIT(0)
  255. /* Masks for aggregation for comex carriers */
  256. #define MLXPLAT_CPLD_AGGR_MASK_CARRIER BIT(1)
  257. #define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
  258. MLXPLAT_CPLD_AGGR_MASK_CARRIER)
  259. #define MLXPLAT_CPLD_LOW_AGGRCX_MASK 0xc1
  260. /* Masks for aggregation for modular systems */
  261. #define MLXPLAT_CPLD_LPC_LC_MASK GENMASK(7, 0)
  262. #define MLXPLAT_CPLD_HALT_MASK BIT(3)
  263. #define MLXPLAT_CPLD_RESET_MASK GENMASK(7, 1)
  264. /* Default I2C parent bus number */
  265. #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
  266. /* Maximum number of possible physical buses equipped on system */
  267. #define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM 16
  268. #define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM 24
  269. /* Number of channels in group */
  270. #define MLXPLAT_CPLD_GRP_CHNL_NUM 8
  271. /* Start channel numbers */
  272. #define MLXPLAT_CPLD_CH1 2
  273. #define MLXPLAT_CPLD_CH2 10
  274. #define MLXPLAT_CPLD_CH3 18
  275. #define MLXPLAT_CPLD_CH2_ETH_MODULAR 3
  276. #define MLXPLAT_CPLD_CH3_ETH_MODULAR 43
  277. #define MLXPLAT_CPLD_CH4_ETH_MODULAR 51
  278. #define MLXPLAT_CPLD_CH2_RACK_SWITCH 18
  279. #define MLXPLAT_CPLD_CH2_NG800 34
  280. /* Number of LPC attached MUX platform devices */
  281. #define MLXPLAT_CPLD_LPC_MUX_DEVS 4
  282. /* Hotplug devices adapter numbers */
  283. #define MLXPLAT_CPLD_NR_NONE -1
  284. #define MLXPLAT_CPLD_PSU_DEFAULT_NR 10
  285. #define MLXPLAT_CPLD_PSU_MSNXXXX_NR 4
  286. #define MLXPLAT_CPLD_FAN1_DEFAULT_NR 11
  287. #define MLXPLAT_CPLD_FAN2_DEFAULT_NR 12
  288. #define MLXPLAT_CPLD_FAN3_DEFAULT_NR 13
  289. #define MLXPLAT_CPLD_FAN4_DEFAULT_NR 14
  290. #define MLXPLAT_CPLD_NR_ASIC 3
  291. #define MLXPLAT_CPLD_NR_LC_BASE 34
  292. #define MLXPLAT_CPLD_NR_LC_SET(nr) (MLXPLAT_CPLD_NR_LC_BASE + (nr))
  293. #define MLXPLAT_CPLD_LC_ADDR 0x32
  294. /* Masks and default values for watchdogs */
  295. #define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
  296. #define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
  297. #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK GENMASK(7, 4)
  298. #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK 0
  299. #define MLXPLAT_CPLD_WD_RESET_ACT_MASK GENMASK(7, 1)
  300. #define MLXPLAT_CPLD_WD_FAN_ACT_MASK (GENMASK(7, 0) & ~BIT(4))
  301. #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK (GENMASK(7, 0) & ~BIT(7))
  302. #define MLXPLAT_CPLD_WD_CPBLTY_MASK (GENMASK(7, 0) & ~BIT(6))
  303. #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT 30
  304. #define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT 600
  305. #define MLXPLAT_CPLD_WD_MAX_DEVS 2
  306. #define MLXPLAT_CPLD_LPC_SYSIRQ 17
  307. /* Minimum power required for turning on Ethernet modular system (WATT) */
  308. #define MLXPLAT_CPLD_ETH_MODULAR_PWR_MIN 50
  309. /* Default value for PWM control register for rack switch system */
  310. #define MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT 0xf4
  311. #define MLXPLAT_I2C_MAIN_BUS_NOTIFIED 0x01
  312. #define MLXPLAT_I2C_MAIN_BUS_HANDLE_CREATED 0x02
  313. /* Lattice FPGA PCI configuration */
  314. #define PCI_VENDOR_ID_LATTICE 0x1204
  315. #define PCI_DEVICE_ID_LATTICE_I2C_BRIDGE 0x9c2f
  316. #define PCI_DEVICE_ID_LATTICE_JTAG_BRIDGE 0x9c30
  317. #define PCI_DEVICE_ID_LATTICE_LPC_BRIDGE 0x9c32
  318. /* mlxplat_priv - platform private data
  319. * @pdev_i2c - i2c controller platform device
  320. * @pdev_mux - array of mux platform devices
  321. * @pdev_hotplug - hotplug platform devices
  322. * @pdev_led - led platform devices
  323. * @pdev_io_regs - register access platform devices
  324. * @pdev_fan - FAN platform devices
  325. * @pdev_wd - array of watchdog platform devices
  326. * @regmap: device register map
  327. * @hotplug_resources: system hotplug resources
  328. * @hotplug_resources_size: size of system hotplug resources
  329. * @hi2c_main_init_status: init status of I2C main bus
  330. * @irq_fpga: FPGA IRQ number
  331. */
  332. struct mlxplat_priv {
  333. struct platform_device *pdev_i2c;
  334. struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
  335. struct platform_device *pdev_hotplug;
  336. struct platform_device *pdev_led;
  337. struct platform_device *pdev_io_regs;
  338. struct platform_device *pdev_fan;
  339. struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
  340. void *regmap;
  341. struct resource *hotplug_resources;
  342. unsigned int hotplug_resources_size;
  343. u8 i2c_main_init_status;
  344. int irq_fpga;
  345. };
  346. static struct platform_device *mlxplat_dev;
  347. static int mlxplat_i2c_main_completion_notify(void *handle, int id);
  348. static void __iomem *i2c_bridge_addr, *jtag_bridge_addr;
  349. /* Regions for LPC I2C controller and LPC base register space */
  350. static const struct resource mlxplat_lpc_resources[] = {
  351. [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
  352. MLXPLAT_CPLD_LPC_IO_RANGE,
  353. "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
  354. [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
  355. MLXPLAT_CPLD_LPC_IO_RANGE,
  356. "mlxplat_cpld_lpc_regs",
  357. IORESOURCE_IO),
  358. };
  359. /* Platform systems default i2c data */
  360. static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_default_data = {
  361. .completion_notify = mlxplat_i2c_main_completion_notify,
  362. };
  363. /* Platform i2c next generation systems data */
  364. static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
  365. {
  366. .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  367. .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
  368. .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
  369. },
  370. };
  371. static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
  372. {
  373. .data = mlxplat_mlxcpld_i2c_ng_items_data,
  374. },
  375. };
  376. /* Platform next generation systems i2c data */
  377. static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
  378. .items = mlxplat_mlxcpld_i2c_ng_items,
  379. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  380. .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
  381. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
  382. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
  383. .completion_notify = mlxplat_i2c_main_completion_notify,
  384. };
  385. /* Platform default channels */
  386. static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
  387. {
  388. MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
  389. MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
  390. 5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
  391. },
  392. {
  393. MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
  394. MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
  395. 5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
  396. },
  397. };
  398. /* Platform channels for MSN21xx system family */
  399. static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
  400. /* Platform mux data */
  401. static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
  402. {
  403. .parent = 1,
  404. .base_nr = MLXPLAT_CPLD_CH1,
  405. .write_only = 1,
  406. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
  407. .reg_size = 1,
  408. .idle_in_use = 1,
  409. },
  410. {
  411. .parent = 1,
  412. .base_nr = MLXPLAT_CPLD_CH2,
  413. .write_only = 1,
  414. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
  415. .reg_size = 1,
  416. .idle_in_use = 1,
  417. },
  418. };
  419. /* Platform mux configuration variables */
  420. static int mlxplat_max_adap_num;
  421. static int mlxplat_mux_num;
  422. static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
  423. static struct notifier_block *mlxplat_reboot_nb;
  424. /* Platform extended mux data */
  425. static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
  426. {
  427. .parent = 1,
  428. .base_nr = MLXPLAT_CPLD_CH1,
  429. .write_only = 1,
  430. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
  431. .reg_size = 1,
  432. .idle_in_use = 1,
  433. },
  434. {
  435. .parent = 1,
  436. .base_nr = MLXPLAT_CPLD_CH2,
  437. .write_only = 1,
  438. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
  439. .reg_size = 1,
  440. .idle_in_use = 1,
  441. },
  442. {
  443. .parent = 1,
  444. .base_nr = MLXPLAT_CPLD_CH3,
  445. .write_only = 1,
  446. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
  447. .reg_size = 1,
  448. .idle_in_use = 1,
  449. },
  450. };
  451. /* Platform channels for modular system family */
  452. static const int mlxplat_modular_upper_channel[] = { 1 };
  453. static const int mlxplat_modular_channels[] = {
  454. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
  455. 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
  456. 38, 39, 40
  457. };
  458. /* Platform modular mux data */
  459. static struct i2c_mux_reg_platform_data mlxplat_modular_mux_data[] = {
  460. {
  461. .parent = 1,
  462. .base_nr = MLXPLAT_CPLD_CH1,
  463. .write_only = 1,
  464. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG4,
  465. .reg_size = 1,
  466. .idle_in_use = 1,
  467. .values = mlxplat_modular_upper_channel,
  468. .n_values = ARRAY_SIZE(mlxplat_modular_upper_channel),
  469. },
  470. {
  471. .parent = 1,
  472. .base_nr = MLXPLAT_CPLD_CH2_ETH_MODULAR,
  473. .write_only = 1,
  474. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
  475. .reg_size = 1,
  476. .idle_in_use = 1,
  477. .values = mlxplat_modular_channels,
  478. .n_values = ARRAY_SIZE(mlxplat_modular_channels),
  479. },
  480. {
  481. .parent = MLXPLAT_CPLD_CH1,
  482. .base_nr = MLXPLAT_CPLD_CH3_ETH_MODULAR,
  483. .write_only = 1,
  484. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
  485. .reg_size = 1,
  486. .idle_in_use = 1,
  487. .values = mlxplat_msn21xx_channels,
  488. .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
  489. },
  490. {
  491. .parent = 1,
  492. .base_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR,
  493. .write_only = 1,
  494. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
  495. .reg_size = 1,
  496. .idle_in_use = 1,
  497. .values = mlxplat_msn21xx_channels,
  498. .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
  499. },
  500. };
  501. /* Platform channels for rack switch system family */
  502. static const int mlxplat_rack_switch_channels[] = {
  503. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
  504. };
  505. /* Platform rack switch mux data */
  506. static struct i2c_mux_reg_platform_data mlxplat_rack_switch_mux_data[] = {
  507. {
  508. .parent = 1,
  509. .base_nr = MLXPLAT_CPLD_CH1,
  510. .write_only = 1,
  511. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
  512. .reg_size = 1,
  513. .idle_in_use = 1,
  514. .values = mlxplat_rack_switch_channels,
  515. .n_values = ARRAY_SIZE(mlxplat_rack_switch_channels),
  516. },
  517. {
  518. .parent = 1,
  519. .base_nr = MLXPLAT_CPLD_CH2_RACK_SWITCH,
  520. .write_only = 1,
  521. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
  522. .reg_size = 1,
  523. .idle_in_use = 1,
  524. .values = mlxplat_msn21xx_channels,
  525. .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
  526. },
  527. };
  528. /* Platform channels for ng800 system family */
  529. static const int mlxplat_ng800_channels[] = {
  530. 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
  531. 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
  532. };
  533. /* Platform ng800 mux data */
  534. static struct i2c_mux_reg_platform_data mlxplat_ng800_mux_data[] = {
  535. {
  536. .parent = 1,
  537. .base_nr = MLXPLAT_CPLD_CH1,
  538. .write_only = 1,
  539. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
  540. .reg_size = 1,
  541. .idle_in_use = 1,
  542. .values = mlxplat_ng800_channels,
  543. .n_values = ARRAY_SIZE(mlxplat_ng800_channels),
  544. },
  545. {
  546. .parent = 1,
  547. .base_nr = MLXPLAT_CPLD_CH2_NG800,
  548. .write_only = 1,
  549. .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
  550. .reg_size = 1,
  551. .idle_in_use = 1,
  552. .values = mlxplat_msn21xx_channels,
  553. .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
  554. },
  555. };
  556. /* Platform hotplug devices */
  557. static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
  558. {
  559. I2C_BOARD_INFO("dps460", 0x59),
  560. },
  561. {
  562. I2C_BOARD_INFO("dps460", 0x58),
  563. },
  564. };
  565. static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
  566. {
  567. I2C_BOARD_INFO("dps460", 0x5b),
  568. },
  569. {
  570. I2C_BOARD_INFO("dps460", 0x5a),
  571. },
  572. };
  573. static struct i2c_board_info mlxplat_mlxcpld_pwr_ng800[] = {
  574. {
  575. I2C_BOARD_INFO("dps460", 0x59),
  576. },
  577. {
  578. I2C_BOARD_INFO("dps460", 0x5a),
  579. },
  580. };
  581. static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
  582. {
  583. I2C_BOARD_INFO("24c32", 0x50),
  584. },
  585. {
  586. I2C_BOARD_INFO("24c32", 0x50),
  587. },
  588. {
  589. I2C_BOARD_INFO("24c32", 0x50),
  590. },
  591. {
  592. I2C_BOARD_INFO("24c32", 0x50),
  593. },
  594. };
  595. /* Platform hotplug comex carrier system family data */
  596. static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
  597. {
  598. .label = "psu1",
  599. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  600. .mask = BIT(0),
  601. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  602. },
  603. {
  604. .label = "psu2",
  605. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  606. .mask = BIT(1),
  607. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  608. },
  609. };
  610. /* Platform hotplug default data */
  611. static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
  612. {
  613. .label = "psu1",
  614. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  615. .mask = BIT(0),
  616. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  617. },
  618. {
  619. .label = "psu2",
  620. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  621. .mask = BIT(1),
  622. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  623. },
  624. };
  625. static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
  626. {
  627. .label = "pwr1",
  628. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  629. .mask = BIT(0),
  630. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
  631. .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
  632. },
  633. {
  634. .label = "pwr2",
  635. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  636. .mask = BIT(1),
  637. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
  638. .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
  639. },
  640. };
  641. static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_wc_items_data[] = {
  642. {
  643. .label = "pwr1",
  644. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  645. .mask = BIT(0),
  646. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  647. },
  648. {
  649. .label = "pwr2",
  650. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  651. .mask = BIT(1),
  652. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  653. },
  654. };
  655. static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_ng800_items_data[] = {
  656. {
  657. .label = "pwr1",
  658. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  659. .mask = BIT(0),
  660. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr_ng800[0],
  661. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  662. },
  663. {
  664. .label = "pwr2",
  665. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  666. .mask = BIT(1),
  667. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr_ng800[1],
  668. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  669. },
  670. };
  671. static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
  672. {
  673. .label = "fan1",
  674. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  675. .mask = BIT(0),
  676. .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
  677. .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
  678. },
  679. {
  680. .label = "fan2",
  681. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  682. .mask = BIT(1),
  683. .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
  684. .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
  685. },
  686. {
  687. .label = "fan3",
  688. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  689. .mask = BIT(2),
  690. .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
  691. .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
  692. },
  693. {
  694. .label = "fan4",
  695. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  696. .mask = BIT(3),
  697. .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
  698. .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
  699. },
  700. };
  701. static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
  702. {
  703. .label = "asic1",
  704. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  705. .mask = MLXPLAT_CPLD_ASIC_MASK,
  706. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  707. },
  708. };
  709. static struct mlxreg_core_data mlxplat_mlxcpld_default_asic2_items_data[] = {
  710. {
  711. .label = "asic2",
  712. .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
  713. .mask = MLXPLAT_CPLD_ASIC_MASK,
  714. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  715. },
  716. };
  717. static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
  718. {
  719. .data = mlxplat_mlxcpld_default_psu_items_data,
  720. .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
  721. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  722. .mask = MLXPLAT_CPLD_PSU_MASK,
  723. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
  724. .inversed = 1,
  725. .health = false,
  726. },
  727. {
  728. .data = mlxplat_mlxcpld_default_pwr_items_data,
  729. .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
  730. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  731. .mask = MLXPLAT_CPLD_PWR_MASK,
  732. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
  733. .inversed = 0,
  734. .health = false,
  735. },
  736. {
  737. .data = mlxplat_mlxcpld_default_fan_items_data,
  738. .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
  739. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  740. .mask = MLXPLAT_CPLD_FAN_MASK,
  741. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
  742. .inversed = 1,
  743. .health = false,
  744. },
  745. {
  746. .data = mlxplat_mlxcpld_default_asic_items_data,
  747. .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
  748. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  749. .mask = MLXPLAT_CPLD_ASIC_MASK,
  750. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  751. .inversed = 0,
  752. .health = true,
  753. },
  754. };
  755. static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
  756. {
  757. .data = mlxplat_mlxcpld_comex_psu_items_data,
  758. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
  759. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  760. .mask = MLXPLAT_CPLD_PSU_MASK,
  761. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
  762. .inversed = 1,
  763. .health = false,
  764. },
  765. {
  766. .data = mlxplat_mlxcpld_default_pwr_items_data,
  767. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
  768. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  769. .mask = MLXPLAT_CPLD_PWR_MASK,
  770. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
  771. .inversed = 0,
  772. .health = false,
  773. },
  774. {
  775. .data = mlxplat_mlxcpld_default_fan_items_data,
  776. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
  777. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  778. .mask = MLXPLAT_CPLD_FAN_MASK,
  779. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
  780. .inversed = 1,
  781. .health = false,
  782. },
  783. {
  784. .data = mlxplat_mlxcpld_default_asic_items_data,
  785. .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
  786. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  787. .mask = MLXPLAT_CPLD_ASIC_MASK,
  788. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  789. .inversed = 0,
  790. .health = true,
  791. },
  792. };
  793. static
  794. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
  795. .items = mlxplat_mlxcpld_default_items,
  796. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
  797. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  798. .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
  799. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  800. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  801. };
  802. static struct mlxreg_core_item mlxplat_mlxcpld_default_wc_items[] = {
  803. {
  804. .data = mlxplat_mlxcpld_comex_psu_items_data,
  805. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
  806. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  807. .mask = MLXPLAT_CPLD_PSU_MASK,
  808. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
  809. .inversed = 1,
  810. .health = false,
  811. },
  812. {
  813. .data = mlxplat_mlxcpld_default_pwr_wc_items_data,
  814. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
  815. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  816. .mask = MLXPLAT_CPLD_PWR_MASK,
  817. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
  818. .inversed = 0,
  819. .health = false,
  820. },
  821. {
  822. .data = mlxplat_mlxcpld_default_asic_items_data,
  823. .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
  824. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  825. .mask = MLXPLAT_CPLD_ASIC_MASK,
  826. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  827. .inversed = 0,
  828. .health = true,
  829. },
  830. };
  831. static
  832. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_wc_data = {
  833. .items = mlxplat_mlxcpld_default_wc_items,
  834. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_wc_items),
  835. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  836. .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
  837. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  838. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  839. };
  840. static
  841. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
  842. .items = mlxplat_mlxcpld_comex_items,
  843. .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
  844. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  845. .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
  846. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
  847. .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
  848. };
  849. static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
  850. {
  851. .label = "pwr1",
  852. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  853. .mask = BIT(0),
  854. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  855. },
  856. {
  857. .label = "pwr2",
  858. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  859. .mask = BIT(1),
  860. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  861. },
  862. };
  863. /* Platform hotplug MSN21xx system family data */
  864. static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
  865. {
  866. .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
  867. .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
  868. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  869. .mask = MLXPLAT_CPLD_PWR_MASK,
  870. .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
  871. .inversed = 0,
  872. .health = false,
  873. },
  874. {
  875. .data = mlxplat_mlxcpld_default_asic_items_data,
  876. .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
  877. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  878. .mask = MLXPLAT_CPLD_ASIC_MASK,
  879. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  880. .inversed = 0,
  881. .health = true,
  882. },
  883. };
  884. static
  885. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
  886. .items = mlxplat_mlxcpld_msn21xx_items,
  887. .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
  888. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  889. .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
  890. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  891. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  892. };
  893. /* Platform hotplug msn274x system family data */
  894. static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
  895. {
  896. .label = "psu1",
  897. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  898. .mask = BIT(0),
  899. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  900. },
  901. {
  902. .label = "psu2",
  903. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  904. .mask = BIT(1),
  905. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  906. },
  907. };
  908. static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
  909. {
  910. .label = "pwr1",
  911. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  912. .mask = BIT(0),
  913. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
  914. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  915. },
  916. {
  917. .label = "pwr2",
  918. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  919. .mask = BIT(1),
  920. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
  921. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  922. },
  923. };
  924. static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
  925. {
  926. .label = "fan1",
  927. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  928. .mask = BIT(0),
  929. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  930. },
  931. {
  932. .label = "fan2",
  933. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  934. .mask = BIT(1),
  935. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  936. },
  937. {
  938. .label = "fan3",
  939. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  940. .mask = BIT(2),
  941. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  942. },
  943. {
  944. .label = "fan4",
  945. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  946. .mask = BIT(3),
  947. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  948. },
  949. };
  950. static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
  951. {
  952. .data = mlxplat_mlxcpld_msn274x_psu_items_data,
  953. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  954. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  955. .mask = MLXPLAT_CPLD_PSU_MASK,
  956. .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
  957. .inversed = 1,
  958. .health = false,
  959. },
  960. {
  961. .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
  962. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  963. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  964. .mask = MLXPLAT_CPLD_PWR_MASK,
  965. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
  966. .inversed = 0,
  967. .health = false,
  968. },
  969. {
  970. .data = mlxplat_mlxcpld_msn274x_fan_items_data,
  971. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  972. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  973. .mask = MLXPLAT_CPLD_FAN_MASK,
  974. .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
  975. .inversed = 1,
  976. .health = false,
  977. },
  978. {
  979. .data = mlxplat_mlxcpld_default_asic_items_data,
  980. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  981. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  982. .mask = MLXPLAT_CPLD_ASIC_MASK,
  983. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  984. .inversed = 0,
  985. .health = true,
  986. },
  987. };
  988. static
  989. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
  990. .items = mlxplat_mlxcpld_msn274x_items,
  991. .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
  992. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  993. .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  994. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  995. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  996. };
  997. /* Platform hotplug MSN201x system family data */
  998. static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
  999. {
  1000. .label = "pwr1",
  1001. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1002. .mask = BIT(0),
  1003. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1004. },
  1005. {
  1006. .label = "pwr2",
  1007. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1008. .mask = BIT(1),
  1009. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1010. },
  1011. };
  1012. static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
  1013. {
  1014. .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
  1015. .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
  1016. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1017. .mask = MLXPLAT_CPLD_PWR_MASK,
  1018. .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
  1019. .inversed = 0,
  1020. .health = false,
  1021. },
  1022. {
  1023. .data = mlxplat_mlxcpld_default_asic_items_data,
  1024. .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
  1025. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  1026. .mask = MLXPLAT_CPLD_ASIC_MASK,
  1027. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  1028. .inversed = 0,
  1029. .health = true,
  1030. },
  1031. };
  1032. static
  1033. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
  1034. .items = mlxplat_mlxcpld_msn201x_items,
  1035. .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
  1036. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  1037. .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
  1038. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  1039. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  1040. };
  1041. /* Platform hotplug next generation system family data */
  1042. static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
  1043. {
  1044. .label = "psu1",
  1045. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1046. .mask = BIT(0),
  1047. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1048. },
  1049. {
  1050. .label = "psu2",
  1051. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1052. .mask = BIT(1),
  1053. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1054. },
  1055. };
  1056. static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
  1057. {
  1058. .label = "fan1",
  1059. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1060. .mask = BIT(0),
  1061. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  1062. .bit = BIT(0),
  1063. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1064. },
  1065. {
  1066. .label = "fan2",
  1067. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1068. .mask = BIT(1),
  1069. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  1070. .bit = BIT(1),
  1071. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1072. },
  1073. {
  1074. .label = "fan3",
  1075. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1076. .mask = BIT(2),
  1077. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  1078. .bit = BIT(2),
  1079. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1080. },
  1081. {
  1082. .label = "fan4",
  1083. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1084. .mask = BIT(3),
  1085. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  1086. .bit = BIT(3),
  1087. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1088. },
  1089. {
  1090. .label = "fan5",
  1091. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1092. .mask = BIT(4),
  1093. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  1094. .bit = BIT(4),
  1095. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1096. },
  1097. {
  1098. .label = "fan6",
  1099. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1100. .mask = BIT(5),
  1101. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  1102. .bit = BIT(5),
  1103. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1104. },
  1105. {
  1106. .label = "fan7",
  1107. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1108. .mask = BIT(6),
  1109. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  1110. .bit = BIT(6),
  1111. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1112. },
  1113. };
  1114. static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
  1115. {
  1116. .data = mlxplat_mlxcpld_default_ng_psu_items_data,
  1117. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1118. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1119. .mask = MLXPLAT_CPLD_PSU_MASK,
  1120. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
  1121. .inversed = 1,
  1122. .health = false,
  1123. },
  1124. {
  1125. .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
  1126. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1127. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1128. .mask = MLXPLAT_CPLD_PWR_MASK,
  1129. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
  1130. .inversed = 0,
  1131. .health = false,
  1132. },
  1133. {
  1134. .data = mlxplat_mlxcpld_default_ng_fan_items_data,
  1135. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1136. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1137. .mask = MLXPLAT_CPLD_FAN_NG_MASK,
  1138. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
  1139. .inversed = 1,
  1140. .health = false,
  1141. },
  1142. {
  1143. .data = mlxplat_mlxcpld_default_asic_items_data,
  1144. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1145. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  1146. .mask = MLXPLAT_CPLD_ASIC_MASK,
  1147. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  1148. .inversed = 0,
  1149. .health = true,
  1150. },
  1151. };
  1152. static
  1153. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
  1154. .items = mlxplat_mlxcpld_default_ng_items,
  1155. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
  1156. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  1157. .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
  1158. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  1159. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  1160. };
  1161. /* Platform hotplug extended system family data */
  1162. static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
  1163. {
  1164. .label = "psu1",
  1165. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1166. .mask = BIT(0),
  1167. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1168. },
  1169. {
  1170. .label = "psu2",
  1171. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1172. .mask = BIT(1),
  1173. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1174. },
  1175. {
  1176. .label = "psu3",
  1177. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1178. .mask = BIT(2),
  1179. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1180. },
  1181. {
  1182. .label = "psu4",
  1183. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1184. .mask = BIT(3),
  1185. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1186. },
  1187. };
  1188. static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
  1189. {
  1190. .label = "pwr1",
  1191. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1192. .mask = BIT(0),
  1193. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
  1194. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1195. },
  1196. {
  1197. .label = "pwr2",
  1198. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1199. .mask = BIT(1),
  1200. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
  1201. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1202. },
  1203. {
  1204. .label = "pwr3",
  1205. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1206. .mask = BIT(2),
  1207. .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
  1208. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1209. },
  1210. {
  1211. .label = "pwr4",
  1212. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1213. .mask = BIT(3),
  1214. .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
  1215. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1216. },
  1217. };
  1218. static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
  1219. {
  1220. .data = mlxplat_mlxcpld_ext_psu_items_data,
  1221. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1222. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1223. .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
  1224. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  1225. .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
  1226. .inversed = 1,
  1227. .health = false,
  1228. },
  1229. {
  1230. .data = mlxplat_mlxcpld_ext_pwr_items_data,
  1231. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1232. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1233. .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
  1234. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  1235. .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
  1236. .inversed = 0,
  1237. .health = false,
  1238. },
  1239. {
  1240. .data = mlxplat_mlxcpld_default_ng_fan_items_data,
  1241. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1242. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1243. .mask = MLXPLAT_CPLD_FAN_NG_MASK,
  1244. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
  1245. .inversed = 1,
  1246. .health = false,
  1247. },
  1248. {
  1249. .data = mlxplat_mlxcpld_default_asic_items_data,
  1250. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1251. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  1252. .mask = MLXPLAT_CPLD_ASIC_MASK,
  1253. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  1254. .inversed = 0,
  1255. .health = true,
  1256. },
  1257. {
  1258. .data = mlxplat_mlxcpld_default_asic2_items_data,
  1259. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1260. .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
  1261. .mask = MLXPLAT_CPLD_ASIC_MASK,
  1262. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic2_items_data),
  1263. .inversed = 0,
  1264. .health = true,
  1265. }
  1266. };
  1267. static struct mlxreg_core_item mlxplat_mlxcpld_ng800_items[] = {
  1268. {
  1269. .data = mlxplat_mlxcpld_default_ng_psu_items_data,
  1270. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1271. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  1272. .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
  1273. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  1274. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
  1275. .inversed = 1,
  1276. .health = false,
  1277. },
  1278. {
  1279. .data = mlxplat_mlxcpld_default_pwr_ng800_items_data,
  1280. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1281. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1282. .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
  1283. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  1284. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_ng800_items_data),
  1285. .inversed = 0,
  1286. .health = false,
  1287. },
  1288. {
  1289. .data = mlxplat_mlxcpld_default_ng_fan_items_data,
  1290. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1291. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  1292. .mask = MLXPLAT_CPLD_FAN_NG_MASK,
  1293. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
  1294. .inversed = 1,
  1295. .health = false,
  1296. },
  1297. {
  1298. .data = mlxplat_mlxcpld_default_asic_items_data,
  1299. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  1300. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  1301. .mask = MLXPLAT_CPLD_ASIC_MASK,
  1302. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
  1303. .inversed = 0,
  1304. .health = true,
  1305. },
  1306. };
  1307. static
  1308. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
  1309. .items = mlxplat_mlxcpld_ext_items,
  1310. .counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
  1311. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  1312. .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
  1313. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  1314. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
  1315. };
  1316. static
  1317. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ng800_data = {
  1318. .items = mlxplat_mlxcpld_ng800_items,
  1319. .counter = ARRAY_SIZE(mlxplat_mlxcpld_ng800_items),
  1320. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  1321. .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
  1322. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  1323. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
  1324. };
  1325. static struct mlxreg_core_data mlxplat_mlxcpld_modular_pwr_items_data[] = {
  1326. {
  1327. .label = "pwr1",
  1328. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1329. .mask = BIT(0),
  1330. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
  1331. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1332. },
  1333. {
  1334. .label = "pwr2",
  1335. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1336. .mask = BIT(1),
  1337. .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
  1338. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1339. },
  1340. {
  1341. .label = "pwr3",
  1342. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1343. .mask = BIT(2),
  1344. .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
  1345. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1346. },
  1347. {
  1348. .label = "pwr4",
  1349. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  1350. .mask = BIT(3),
  1351. .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
  1352. .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
  1353. },
  1354. };
  1355. static
  1356. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_lc_act = {
  1357. .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
  1358. };
  1359. static struct mlxreg_core_data mlxplat_mlxcpld_modular_asic_items_data[] = {
  1360. {
  1361. .label = "asic1",
  1362. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  1363. .mask = MLXPLAT_CPLD_ASIC_MASK,
  1364. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  1365. },
  1366. };
  1367. static struct i2c_board_info mlxplat_mlxcpld_lc_i2c_dev[] = {
  1368. {
  1369. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1370. .platform_data = &mlxplat_mlxcpld_lc_act,
  1371. },
  1372. {
  1373. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1374. .platform_data = &mlxplat_mlxcpld_lc_act,
  1375. },
  1376. {
  1377. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1378. .platform_data = &mlxplat_mlxcpld_lc_act,
  1379. },
  1380. {
  1381. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1382. .platform_data = &mlxplat_mlxcpld_lc_act,
  1383. },
  1384. {
  1385. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1386. .platform_data = &mlxplat_mlxcpld_lc_act,
  1387. },
  1388. {
  1389. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1390. .platform_data = &mlxplat_mlxcpld_lc_act,
  1391. },
  1392. {
  1393. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1394. .platform_data = &mlxplat_mlxcpld_lc_act,
  1395. },
  1396. {
  1397. I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
  1398. .platform_data = &mlxplat_mlxcpld_lc_act,
  1399. },
  1400. };
  1401. static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_modular_lc_notifier[] = {
  1402. {
  1403. .identity = "lc1",
  1404. },
  1405. {
  1406. .identity = "lc2",
  1407. },
  1408. {
  1409. .identity = "lc3",
  1410. },
  1411. {
  1412. .identity = "lc4",
  1413. },
  1414. {
  1415. .identity = "lc5",
  1416. },
  1417. {
  1418. .identity = "lc6",
  1419. },
  1420. {
  1421. .identity = "lc7",
  1422. },
  1423. {
  1424. .identity = "lc8",
  1425. },
  1426. };
  1427. static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pr_items_data[] = {
  1428. {
  1429. .label = "lc1_present",
  1430. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1431. .mask = BIT(0),
  1432. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
  1433. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
  1434. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1435. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
  1436. .slot = 1,
  1437. },
  1438. {
  1439. .label = "lc2_present",
  1440. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1441. .mask = BIT(1),
  1442. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
  1443. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
  1444. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1445. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
  1446. .slot = 2,
  1447. },
  1448. {
  1449. .label = "lc3_present",
  1450. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1451. .mask = BIT(2),
  1452. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
  1453. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
  1454. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1455. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
  1456. .slot = 3,
  1457. },
  1458. {
  1459. .label = "lc4_present",
  1460. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1461. .mask = BIT(3),
  1462. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
  1463. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
  1464. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1465. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
  1466. .slot = 4,
  1467. },
  1468. {
  1469. .label = "lc5_present",
  1470. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1471. .mask = BIT(4),
  1472. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
  1473. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
  1474. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1475. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
  1476. .slot = 5,
  1477. },
  1478. {
  1479. .label = "lc6_present",
  1480. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1481. .mask = BIT(5),
  1482. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
  1483. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
  1484. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1485. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
  1486. .slot = 6,
  1487. },
  1488. {
  1489. .label = "lc7_present",
  1490. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1491. .mask = BIT(6),
  1492. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
  1493. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
  1494. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1495. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
  1496. .slot = 7,
  1497. },
  1498. {
  1499. .label = "lc8_present",
  1500. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  1501. .mask = BIT(7),
  1502. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
  1503. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
  1504. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1505. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
  1506. .slot = 8,
  1507. },
  1508. };
  1509. static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ver_items_data[] = {
  1510. {
  1511. .label = "lc1_verified",
  1512. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1513. .mask = BIT(0),
  1514. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1515. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1516. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1517. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1518. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
  1519. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
  1520. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1521. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
  1522. .slot = 1,
  1523. },
  1524. {
  1525. .label = "lc2_verified",
  1526. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1527. .mask = BIT(1),
  1528. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1529. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1530. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1531. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1532. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
  1533. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
  1534. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1535. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
  1536. .slot = 2,
  1537. },
  1538. {
  1539. .label = "lc3_verified",
  1540. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1541. .mask = BIT(2),
  1542. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1543. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1544. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1545. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1546. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
  1547. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
  1548. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1549. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
  1550. .slot = 3,
  1551. },
  1552. {
  1553. .label = "lc4_verified",
  1554. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1555. .mask = BIT(3),
  1556. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1557. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1558. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1559. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1560. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
  1561. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
  1562. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1563. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
  1564. .slot = 4,
  1565. },
  1566. {
  1567. .label = "lc5_verified",
  1568. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1569. .mask = BIT(4),
  1570. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1571. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1572. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1573. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1574. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
  1575. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
  1576. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1577. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
  1578. .slot = 5,
  1579. },
  1580. {
  1581. .label = "lc6_verified",
  1582. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1583. .mask = BIT(5),
  1584. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1585. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1586. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1587. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1588. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
  1589. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
  1590. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1591. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
  1592. .slot = 6,
  1593. },
  1594. {
  1595. .label = "lc7_verified",
  1596. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1597. .mask = BIT(6),
  1598. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1599. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1600. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1601. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1602. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
  1603. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
  1604. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1605. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
  1606. .slot = 7,
  1607. },
  1608. {
  1609. .label = "lc8_verified",
  1610. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  1611. .mask = BIT(7),
  1612. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1613. .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1614. .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  1615. .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  1616. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
  1617. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
  1618. .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
  1619. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
  1620. .slot = 8,
  1621. },
  1622. };
  1623. static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pg_data[] = {
  1624. {
  1625. .label = "lc1_powered",
  1626. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1627. .mask = BIT(0),
  1628. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
  1629. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
  1630. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1631. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
  1632. .slot = 1,
  1633. },
  1634. {
  1635. .label = "lc2_powered",
  1636. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1637. .mask = BIT(1),
  1638. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
  1639. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
  1640. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1641. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
  1642. .slot = 2,
  1643. },
  1644. {
  1645. .label = "lc3_powered",
  1646. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1647. .mask = BIT(2),
  1648. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
  1649. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
  1650. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1651. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
  1652. .slot = 3,
  1653. },
  1654. {
  1655. .label = "lc4_powered",
  1656. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1657. .mask = BIT(3),
  1658. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
  1659. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
  1660. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1661. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
  1662. .slot = 4,
  1663. },
  1664. {
  1665. .label = "lc5_powered",
  1666. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1667. .mask = BIT(4),
  1668. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
  1669. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
  1670. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1671. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
  1672. .slot = 5,
  1673. },
  1674. {
  1675. .label = "lc6_powered",
  1676. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1677. .mask = BIT(5),
  1678. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
  1679. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
  1680. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1681. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
  1682. .slot = 6,
  1683. },
  1684. {
  1685. .label = "lc7_powered",
  1686. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1687. .mask = BIT(6),
  1688. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
  1689. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
  1690. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1691. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
  1692. .slot = 7,
  1693. },
  1694. {
  1695. .label = "lc8_powered",
  1696. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  1697. .mask = BIT(7),
  1698. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
  1699. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
  1700. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1701. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
  1702. .slot = 8,
  1703. },
  1704. };
  1705. static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ready_data[] = {
  1706. {
  1707. .label = "lc1_ready",
  1708. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1709. .mask = BIT(0),
  1710. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
  1711. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
  1712. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1713. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
  1714. .slot = 1,
  1715. },
  1716. {
  1717. .label = "lc2_ready",
  1718. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1719. .mask = BIT(1),
  1720. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
  1721. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
  1722. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1723. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
  1724. .slot = 2,
  1725. },
  1726. {
  1727. .label = "lc3_ready",
  1728. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1729. .mask = BIT(2),
  1730. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
  1731. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
  1732. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1733. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
  1734. .slot = 3,
  1735. },
  1736. {
  1737. .label = "lc4_ready",
  1738. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1739. .mask = BIT(3),
  1740. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
  1741. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
  1742. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1743. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
  1744. .slot = 4,
  1745. },
  1746. {
  1747. .label = "lc5_ready",
  1748. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1749. .mask = BIT(4),
  1750. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
  1751. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
  1752. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1753. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
  1754. .slot = 5,
  1755. },
  1756. {
  1757. .label = "lc6_ready",
  1758. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1759. .mask = BIT(5),
  1760. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
  1761. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
  1762. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1763. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
  1764. .slot = 6,
  1765. },
  1766. {
  1767. .label = "lc7_ready",
  1768. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1769. .mask = BIT(6),
  1770. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
  1771. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
  1772. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1773. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
  1774. .slot = 7,
  1775. },
  1776. {
  1777. .label = "lc8_ready",
  1778. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  1779. .mask = BIT(7),
  1780. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
  1781. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
  1782. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1783. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
  1784. .slot = 8,
  1785. },
  1786. };
  1787. static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_synced_data[] = {
  1788. {
  1789. .label = "lc1_synced",
  1790. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1791. .mask = BIT(0),
  1792. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
  1793. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
  1794. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1795. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
  1796. .slot = 1,
  1797. },
  1798. {
  1799. .label = "lc2_synced",
  1800. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1801. .mask = BIT(1),
  1802. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
  1803. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
  1804. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1805. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
  1806. .slot = 2,
  1807. },
  1808. {
  1809. .label = "lc3_synced",
  1810. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1811. .mask = BIT(2),
  1812. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
  1813. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
  1814. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1815. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
  1816. .slot = 3,
  1817. },
  1818. {
  1819. .label = "lc4_synced",
  1820. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1821. .mask = BIT(3),
  1822. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
  1823. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
  1824. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1825. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
  1826. .slot = 4,
  1827. },
  1828. {
  1829. .label = "lc5_synced",
  1830. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1831. .mask = BIT(4),
  1832. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
  1833. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
  1834. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1835. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
  1836. .slot = 5,
  1837. },
  1838. {
  1839. .label = "lc6_synced",
  1840. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1841. .mask = BIT(5),
  1842. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
  1843. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
  1844. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1845. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
  1846. .slot = 6,
  1847. },
  1848. {
  1849. .label = "lc7_synced",
  1850. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1851. .mask = BIT(6),
  1852. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
  1853. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
  1854. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1855. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
  1856. .slot = 7,
  1857. },
  1858. {
  1859. .label = "lc8_synced",
  1860. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  1861. .mask = BIT(7),
  1862. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
  1863. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
  1864. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1865. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
  1866. .slot = 8,
  1867. },
  1868. };
  1869. static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_act_data[] = {
  1870. {
  1871. .label = "lc1_active",
  1872. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1873. .mask = BIT(0),
  1874. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
  1875. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
  1876. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1877. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
  1878. .slot = 1,
  1879. },
  1880. {
  1881. .label = "lc2_active",
  1882. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1883. .mask = BIT(1),
  1884. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
  1885. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
  1886. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1887. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
  1888. .slot = 2,
  1889. },
  1890. {
  1891. .label = "lc3_active",
  1892. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1893. .mask = BIT(2),
  1894. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
  1895. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
  1896. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1897. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
  1898. .slot = 3,
  1899. },
  1900. {
  1901. .label = "lc4_active",
  1902. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1903. .mask = BIT(3),
  1904. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
  1905. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
  1906. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1907. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
  1908. .slot = 4,
  1909. },
  1910. {
  1911. .label = "lc5_active",
  1912. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1913. .mask = BIT(4),
  1914. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
  1915. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
  1916. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1917. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
  1918. .slot = 5,
  1919. },
  1920. {
  1921. .label = "lc6_active",
  1922. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1923. .mask = BIT(5),
  1924. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
  1925. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
  1926. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1927. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
  1928. .slot = 6,
  1929. },
  1930. {
  1931. .label = "lc7_active",
  1932. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1933. .mask = BIT(6),
  1934. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
  1935. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
  1936. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1937. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
  1938. .slot = 7,
  1939. },
  1940. {
  1941. .label = "lc8_active",
  1942. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  1943. .mask = BIT(7),
  1944. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
  1945. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
  1946. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1947. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
  1948. .slot = 8,
  1949. },
  1950. };
  1951. static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_sd_data[] = {
  1952. {
  1953. .label = "lc1_shutdown",
  1954. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  1955. .mask = BIT(0),
  1956. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
  1957. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
  1958. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1959. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
  1960. .slot = 1,
  1961. },
  1962. {
  1963. .label = "lc2_shutdown",
  1964. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  1965. .mask = BIT(1),
  1966. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
  1967. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
  1968. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1969. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
  1970. .slot = 2,
  1971. },
  1972. {
  1973. .label = "lc3_shutdown",
  1974. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  1975. .mask = BIT(2),
  1976. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
  1977. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
  1978. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1979. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
  1980. .slot = 3,
  1981. },
  1982. {
  1983. .label = "lc4_shutdown",
  1984. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  1985. .mask = BIT(3),
  1986. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
  1987. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
  1988. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1989. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
  1990. .slot = 4,
  1991. },
  1992. {
  1993. .label = "lc5_shutdown",
  1994. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  1995. .mask = BIT(4),
  1996. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
  1997. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
  1998. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  1999. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
  2000. .slot = 5,
  2001. },
  2002. {
  2003. .label = "lc6_shutdown",
  2004. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  2005. .mask = BIT(5),
  2006. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
  2007. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
  2008. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  2009. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
  2010. .slot = 6,
  2011. },
  2012. {
  2013. .label = "lc7_shutdown",
  2014. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  2015. .mask = BIT(6),
  2016. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
  2017. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
  2018. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  2019. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
  2020. .slot = 7,
  2021. },
  2022. {
  2023. .label = "lc8_shutdown",
  2024. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  2025. .mask = BIT(7),
  2026. .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
  2027. .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
  2028. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  2029. .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
  2030. .slot = 8,
  2031. },
  2032. };
  2033. static struct mlxreg_core_item mlxplat_mlxcpld_modular_items[] = {
  2034. {
  2035. .data = mlxplat_mlxcpld_ext_psu_items_data,
  2036. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2037. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  2038. .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
  2039. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  2040. .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
  2041. .inversed = 1,
  2042. .health = false,
  2043. },
  2044. {
  2045. .data = mlxplat_mlxcpld_modular_pwr_items_data,
  2046. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2047. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  2048. .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
  2049. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  2050. .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
  2051. .inversed = 0,
  2052. .health = false,
  2053. },
  2054. {
  2055. .data = mlxplat_mlxcpld_default_ng_fan_items_data,
  2056. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2057. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  2058. .mask = MLXPLAT_CPLD_FAN_NG_MASK,
  2059. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
  2060. .inversed = 1,
  2061. .health = false,
  2062. },
  2063. {
  2064. .data = mlxplat_mlxcpld_modular_asic_items_data,
  2065. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2066. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  2067. .mask = MLXPLAT_CPLD_ASIC_MASK,
  2068. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_asic_items_data),
  2069. .inversed = 0,
  2070. .health = true,
  2071. },
  2072. {
  2073. .data = mlxplat_mlxcpld_modular_lc_pr_items_data,
  2074. .kind = MLXREG_HOTPLUG_LC_PRESENT,
  2075. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
  2076. .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
  2077. .mask = MLXPLAT_CPLD_LPC_LC_MASK,
  2078. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pr_items_data),
  2079. .inversed = 1,
  2080. .health = false,
  2081. },
  2082. {
  2083. .data = mlxplat_mlxcpld_modular_lc_ver_items_data,
  2084. .kind = MLXREG_HOTPLUG_LC_VERIFIED,
  2085. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
  2086. .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
  2087. .mask = MLXPLAT_CPLD_LPC_LC_MASK,
  2088. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ver_items_data),
  2089. .inversed = 0,
  2090. .health = false,
  2091. },
  2092. {
  2093. .data = mlxplat_mlxcpld_modular_lc_pg_data,
  2094. .kind = MLXREG_HOTPLUG_LC_POWERED,
  2095. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
  2096. .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
  2097. .mask = MLXPLAT_CPLD_LPC_LC_MASK,
  2098. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pg_data),
  2099. .inversed = 0,
  2100. .health = false,
  2101. },
  2102. {
  2103. .data = mlxplat_mlxcpld_modular_lc_ready_data,
  2104. .kind = MLXREG_HOTPLUG_LC_READY,
  2105. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
  2106. .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
  2107. .mask = MLXPLAT_CPLD_LPC_LC_MASK,
  2108. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ready_data),
  2109. .inversed = 0,
  2110. .health = false,
  2111. },
  2112. {
  2113. .data = mlxplat_mlxcpld_modular_lc_synced_data,
  2114. .kind = MLXREG_HOTPLUG_LC_SYNCED,
  2115. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
  2116. .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
  2117. .mask = MLXPLAT_CPLD_LPC_LC_MASK,
  2118. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_synced_data),
  2119. .inversed = 0,
  2120. .health = false,
  2121. },
  2122. {
  2123. .data = mlxplat_mlxcpld_modular_lc_act_data,
  2124. .kind = MLXREG_HOTPLUG_LC_ACTIVE,
  2125. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
  2126. .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
  2127. .mask = MLXPLAT_CPLD_LPC_LC_MASK,
  2128. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_act_data),
  2129. .inversed = 0,
  2130. .health = false,
  2131. },
  2132. {
  2133. .data = mlxplat_mlxcpld_modular_lc_sd_data,
  2134. .kind = MLXREG_HOTPLUG_LC_THERMAL,
  2135. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
  2136. .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
  2137. .mask = MLXPLAT_CPLD_LPC_LC_MASK,
  2138. .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_sd_data),
  2139. .inversed = 0,
  2140. .health = false,
  2141. },
  2142. };
  2143. static
  2144. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_modular_data = {
  2145. .items = mlxplat_mlxcpld_modular_items,
  2146. .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_items),
  2147. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  2148. .mask = MLXPLAT_CPLD_AGGR_MASK_MODULAR,
  2149. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  2150. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  2151. };
  2152. /* Platform hotplug for NVLink blade systems family data */
  2153. static struct mlxreg_core_data mlxplat_mlxcpld_global_wp_items_data[] = {
  2154. {
  2155. .label = "global_wp_grant",
  2156. .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
  2157. .mask = MLXPLAT_CPLD_GWP_MASK,
  2158. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2159. },
  2160. };
  2161. static struct mlxreg_core_item mlxplat_mlxcpld_chassis_blade_items[] = {
  2162. {
  2163. .data = mlxplat_mlxcpld_global_wp_items_data,
  2164. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2165. .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
  2166. .mask = MLXPLAT_CPLD_GWP_MASK,
  2167. .count = ARRAY_SIZE(mlxplat_mlxcpld_global_wp_items_data),
  2168. .inversed = 0,
  2169. .health = false,
  2170. },
  2171. };
  2172. static
  2173. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_chassis_blade_data = {
  2174. .items = mlxplat_mlxcpld_chassis_blade_items,
  2175. .counter = ARRAY_SIZE(mlxplat_mlxcpld_chassis_blade_items),
  2176. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  2177. .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
  2178. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  2179. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  2180. };
  2181. /* Platform hotplug for switch systems family data */
  2182. static struct mlxreg_core_data mlxplat_mlxcpld_erot_ap_items_data[] = {
  2183. {
  2184. .label = "erot1_ap",
  2185. .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
  2186. .mask = BIT(0),
  2187. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2188. },
  2189. {
  2190. .label = "erot2_ap",
  2191. .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
  2192. .mask = BIT(1),
  2193. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2194. },
  2195. };
  2196. static struct mlxreg_core_data mlxplat_mlxcpld_erot_error_items_data[] = {
  2197. {
  2198. .label = "erot1_error",
  2199. .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
  2200. .mask = BIT(0),
  2201. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2202. },
  2203. {
  2204. .label = "erot2_error",
  2205. .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
  2206. .mask = BIT(1),
  2207. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2208. },
  2209. };
  2210. static struct mlxreg_core_item mlxplat_mlxcpld_rack_switch_items[] = {
  2211. {
  2212. .data = mlxplat_mlxcpld_ext_psu_items_data,
  2213. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2214. .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
  2215. .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
  2216. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  2217. .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
  2218. .inversed = 1,
  2219. .health = false,
  2220. },
  2221. {
  2222. .data = mlxplat_mlxcpld_ext_pwr_items_data,
  2223. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2224. .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
  2225. .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
  2226. .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  2227. .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
  2228. .inversed = 0,
  2229. .health = false,
  2230. },
  2231. {
  2232. .data = mlxplat_mlxcpld_default_ng_fan_items_data,
  2233. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2234. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  2235. .mask = MLXPLAT_CPLD_FAN_NG_MASK,
  2236. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
  2237. .inversed = 1,
  2238. .health = false,
  2239. },
  2240. {
  2241. .data = mlxplat_mlxcpld_erot_ap_items_data,
  2242. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2243. .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
  2244. .mask = MLXPLAT_CPLD_EROT_MASK,
  2245. .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_ap_items_data),
  2246. .inversed = 1,
  2247. .health = false,
  2248. },
  2249. {
  2250. .data = mlxplat_mlxcpld_erot_error_items_data,
  2251. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2252. .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
  2253. .mask = MLXPLAT_CPLD_EROT_MASK,
  2254. .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_error_items_data),
  2255. .inversed = 1,
  2256. .health = false,
  2257. },
  2258. };
  2259. static
  2260. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_rack_switch_data = {
  2261. .items = mlxplat_mlxcpld_rack_switch_items,
  2262. .counter = ARRAY_SIZE(mlxplat_mlxcpld_rack_switch_items),
  2263. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  2264. .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
  2265. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  2266. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
  2267. };
  2268. /* Callback performs graceful shutdown after notification about power button event */
  2269. static int
  2270. mlxplat_mlxcpld_l1_switch_pwr_events_handler(void *handle, enum mlxreg_hotplug_kind kind,
  2271. u8 action)
  2272. {
  2273. if (action) {
  2274. dev_info(&mlxplat_dev->dev, "System shutdown due to short press of power button");
  2275. kernel_power_off();
  2276. }
  2277. return 0;
  2278. }
  2279. static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_l1_switch_pwr_events_notifier = {
  2280. .user_handler = mlxplat_mlxcpld_l1_switch_pwr_events_handler,
  2281. };
  2282. /* Platform hotplug for l1 switch systems family data */
  2283. static struct mlxreg_core_data mlxplat_mlxcpld_l1_switch_pwr_events_items_data[] = {
  2284. {
  2285. .label = "power_button",
  2286. .reg = MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET,
  2287. .mask = MLXPLAT_CPLD_PWR_BUTTON_MASK,
  2288. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2289. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  2290. .hpdev.notifier = &mlxplat_mlxcpld_l1_switch_pwr_events_notifier,
  2291. },
  2292. };
  2293. /* Callback activates latch reset flow after notification about intrusion event */
  2294. static int
  2295. mlxplat_mlxcpld_l1_switch_intrusion_events_handler(void *handle, enum mlxreg_hotplug_kind kind,
  2296. u8 action)
  2297. {
  2298. struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
  2299. u32 regval;
  2300. int err;
  2301. err = regmap_read(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET, &regval);
  2302. if (err)
  2303. goto fail_regmap_read;
  2304. if (action) {
  2305. dev_info(&mlxplat_dev->dev, "Detected intrusion - system latch is opened");
  2306. err = regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  2307. regval | MLXPLAT_CPLD_LATCH_RST_MASK);
  2308. } else {
  2309. dev_info(&mlxplat_dev->dev, "System latch is properly closed");
  2310. err = regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  2311. regval & ~MLXPLAT_CPLD_LATCH_RST_MASK);
  2312. }
  2313. if (err)
  2314. goto fail_regmap_write;
  2315. return 0;
  2316. fail_regmap_read:
  2317. fail_regmap_write:
  2318. dev_err(&mlxplat_dev->dev, "Register access failed");
  2319. return err;
  2320. }
  2321. static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_l1_switch_intrusion_events_notifier = {
  2322. .user_handler = mlxplat_mlxcpld_l1_switch_intrusion_events_handler,
  2323. };
  2324. static struct mlxreg_core_data mlxplat_mlxcpld_l1_switch_health_events_items_data[] = {
  2325. {
  2326. .label = "thermal1_pdb",
  2327. .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
  2328. .mask = MLXPLAT_CPLD_THERMAL1_PDB_MASK,
  2329. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2330. },
  2331. {
  2332. .label = "thermal2_pdb",
  2333. .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
  2334. .mask = MLXPLAT_CPLD_THERMAL2_PDB_MASK,
  2335. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2336. },
  2337. {
  2338. .label = "intrusion",
  2339. .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
  2340. .mask = MLXPLAT_CPLD_INTRUSION_MASK,
  2341. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2342. .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
  2343. .hpdev.notifier = &mlxplat_mlxcpld_l1_switch_intrusion_events_notifier,
  2344. },
  2345. {
  2346. .label = "pwm_pg",
  2347. .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
  2348. .mask = MLXPLAT_CPLD_PWM_PG_MASK,
  2349. .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
  2350. },
  2351. };
  2352. static struct mlxreg_core_item mlxplat_mlxcpld_l1_switch_events_items[] = {
  2353. {
  2354. .data = mlxplat_mlxcpld_default_ng_fan_items_data,
  2355. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2356. .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  2357. .mask = MLXPLAT_CPLD_FAN_NG_MASK,
  2358. .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
  2359. .inversed = 1,
  2360. .health = false,
  2361. },
  2362. {
  2363. .data = mlxplat_mlxcpld_erot_ap_items_data,
  2364. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2365. .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
  2366. .mask = MLXPLAT_CPLD_EROT_MASK,
  2367. .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_ap_items_data),
  2368. .inversed = 1,
  2369. .health = false,
  2370. },
  2371. {
  2372. .data = mlxplat_mlxcpld_erot_error_items_data,
  2373. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2374. .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
  2375. .mask = MLXPLAT_CPLD_EROT_MASK,
  2376. .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_error_items_data),
  2377. .inversed = 1,
  2378. .health = false,
  2379. },
  2380. {
  2381. .data = mlxplat_mlxcpld_l1_switch_pwr_events_items_data,
  2382. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2383. .reg = MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET,
  2384. .mask = MLXPLAT_CPLD_PWR_BUTTON_MASK,
  2385. .count = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_pwr_events_items_data),
  2386. .inversed = 1,
  2387. .health = false,
  2388. },
  2389. {
  2390. .data = mlxplat_mlxcpld_l1_switch_health_events_items_data,
  2391. .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
  2392. .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
  2393. .mask = MLXPLAT_CPLD_L1_CHA_HEALTH_MASK,
  2394. .count = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_health_events_items_data),
  2395. .inversed = 1,
  2396. .health = false,
  2397. .ind = 8,
  2398. },
  2399. };
  2400. static
  2401. struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_l1_switch_data = {
  2402. .items = mlxplat_mlxcpld_l1_switch_events_items,
  2403. .counter = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_events_items),
  2404. .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
  2405. .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
  2406. .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
  2407. .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_PWR_BUT,
  2408. };
  2409. /* Platform led default data */
  2410. static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
  2411. {
  2412. .label = "status:green",
  2413. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2414. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2415. },
  2416. {
  2417. .label = "status:red",
  2418. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2419. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2420. },
  2421. {
  2422. .label = "psu:green",
  2423. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2424. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2425. },
  2426. {
  2427. .label = "psu:red",
  2428. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2429. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2430. },
  2431. {
  2432. .label = "fan1:green",
  2433. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2434. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2435. },
  2436. {
  2437. .label = "fan1:red",
  2438. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2439. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2440. },
  2441. {
  2442. .label = "fan2:green",
  2443. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2444. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2445. },
  2446. {
  2447. .label = "fan2:red",
  2448. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2449. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2450. },
  2451. {
  2452. .label = "fan3:green",
  2453. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2454. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2455. },
  2456. {
  2457. .label = "fan3:red",
  2458. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2459. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2460. },
  2461. {
  2462. .label = "fan4:green",
  2463. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2464. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2465. },
  2466. {
  2467. .label = "fan4:red",
  2468. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2469. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2470. },
  2471. };
  2472. static struct mlxreg_core_platform_data mlxplat_default_led_data = {
  2473. .data = mlxplat_mlxcpld_default_led_data,
  2474. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
  2475. };
  2476. /* Platform led default data for water cooling */
  2477. static struct mlxreg_core_data mlxplat_mlxcpld_default_led_wc_data[] = {
  2478. {
  2479. .label = "status:green",
  2480. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2481. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2482. },
  2483. {
  2484. .label = "status:red",
  2485. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2486. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2487. },
  2488. {
  2489. .label = "psu:green",
  2490. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2491. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2492. },
  2493. {
  2494. .label = "psu:red",
  2495. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2496. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2497. },
  2498. };
  2499. static struct mlxreg_core_platform_data mlxplat_default_led_wc_data = {
  2500. .data = mlxplat_mlxcpld_default_led_wc_data,
  2501. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_wc_data),
  2502. };
  2503. /* Platform led default data for water cooling Ethernet switch blade */
  2504. static struct mlxreg_core_data mlxplat_mlxcpld_default_led_eth_wc_blade_data[] = {
  2505. {
  2506. .label = "status:green",
  2507. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2508. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2509. },
  2510. {
  2511. .label = "status:red",
  2512. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2513. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2514. },
  2515. };
  2516. static struct mlxreg_core_platform_data mlxplat_default_led_eth_wc_blade_data = {
  2517. .data = mlxplat_mlxcpld_default_led_eth_wc_blade_data,
  2518. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_eth_wc_blade_data),
  2519. };
  2520. /* Platform led MSN21xx system family data */
  2521. static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
  2522. {
  2523. .label = "status:green",
  2524. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2525. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2526. },
  2527. {
  2528. .label = "status:red",
  2529. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2530. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2531. },
  2532. {
  2533. .label = "fan:green",
  2534. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2535. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2536. },
  2537. {
  2538. .label = "fan:red",
  2539. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2540. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2541. },
  2542. {
  2543. .label = "psu1:green",
  2544. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2545. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2546. },
  2547. {
  2548. .label = "psu1:red",
  2549. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2550. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2551. },
  2552. {
  2553. .label = "psu2:green",
  2554. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2555. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2556. },
  2557. {
  2558. .label = "psu2:red",
  2559. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2560. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2561. },
  2562. {
  2563. .label = "uid:blue",
  2564. .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
  2565. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2566. },
  2567. };
  2568. static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
  2569. .data = mlxplat_mlxcpld_msn21xx_led_data,
  2570. .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
  2571. };
  2572. /* Platform led for default data for 200GbE systems */
  2573. static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
  2574. {
  2575. .label = "status:green",
  2576. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2577. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2578. },
  2579. {
  2580. .label = "status:orange",
  2581. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2582. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2583. },
  2584. {
  2585. .label = "psu:green",
  2586. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2587. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2588. },
  2589. {
  2590. .label = "psu:orange",
  2591. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2592. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2593. },
  2594. {
  2595. .label = "fan1:green",
  2596. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2597. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2598. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2599. .bit = BIT(0),
  2600. },
  2601. {
  2602. .label = "fan1:orange",
  2603. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2604. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2605. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2606. .bit = BIT(0),
  2607. },
  2608. {
  2609. .label = "fan2:green",
  2610. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2611. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2612. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2613. .bit = BIT(1),
  2614. },
  2615. {
  2616. .label = "fan2:orange",
  2617. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2618. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2619. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2620. .bit = BIT(1),
  2621. },
  2622. {
  2623. .label = "fan3:green",
  2624. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2625. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2626. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2627. .bit = BIT(2),
  2628. },
  2629. {
  2630. .label = "fan3:orange",
  2631. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2632. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2633. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2634. .bit = BIT(2),
  2635. },
  2636. {
  2637. .label = "fan4:green",
  2638. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2639. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2640. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2641. .bit = BIT(3),
  2642. },
  2643. {
  2644. .label = "fan4:orange",
  2645. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2646. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2647. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2648. .bit = BIT(3),
  2649. },
  2650. {
  2651. .label = "fan5:green",
  2652. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2653. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2654. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2655. .bit = BIT(4),
  2656. },
  2657. {
  2658. .label = "fan5:orange",
  2659. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2660. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2661. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2662. .bit = BIT(4),
  2663. },
  2664. {
  2665. .label = "fan6:green",
  2666. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2667. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2668. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2669. .bit = BIT(5),
  2670. },
  2671. {
  2672. .label = "fan6:orange",
  2673. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2674. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2675. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2676. .bit = BIT(5),
  2677. },
  2678. {
  2679. .label = "fan7:green",
  2680. .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
  2681. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2682. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2683. .bit = BIT(6),
  2684. },
  2685. {
  2686. .label = "fan7:orange",
  2687. .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
  2688. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2689. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2690. .bit = BIT(6),
  2691. },
  2692. {
  2693. .label = "uid:blue",
  2694. .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
  2695. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2696. },
  2697. };
  2698. static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
  2699. .data = mlxplat_mlxcpld_default_ng_led_data,
  2700. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
  2701. };
  2702. /* Platform led for Comex based 100GbE systems */
  2703. static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
  2704. {
  2705. .label = "status:green",
  2706. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2707. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2708. },
  2709. {
  2710. .label = "status:red",
  2711. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2712. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2713. },
  2714. {
  2715. .label = "psu:green",
  2716. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2717. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2718. },
  2719. {
  2720. .label = "psu:red",
  2721. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2722. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2723. },
  2724. {
  2725. .label = "fan1:green",
  2726. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2727. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2728. },
  2729. {
  2730. .label = "fan1:red",
  2731. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2732. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2733. },
  2734. {
  2735. .label = "fan2:green",
  2736. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2737. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2738. },
  2739. {
  2740. .label = "fan2:red",
  2741. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2742. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2743. },
  2744. {
  2745. .label = "fan3:green",
  2746. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2747. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2748. },
  2749. {
  2750. .label = "fan3:red",
  2751. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2752. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2753. },
  2754. {
  2755. .label = "fan4:green",
  2756. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2757. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2758. },
  2759. {
  2760. .label = "fan4:red",
  2761. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2762. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2763. },
  2764. {
  2765. .label = "uid:blue",
  2766. .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
  2767. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2768. },
  2769. };
  2770. static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
  2771. .data = mlxplat_mlxcpld_comex_100G_led_data,
  2772. .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
  2773. };
  2774. /* Platform led for data for modular systems */
  2775. static struct mlxreg_core_data mlxplat_mlxcpld_modular_led_data[] = {
  2776. {
  2777. .label = "status:green",
  2778. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2779. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2780. },
  2781. {
  2782. .label = "status:orange",
  2783. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2784. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2785. },
  2786. {
  2787. .label = "psu:green",
  2788. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2789. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2790. },
  2791. {
  2792. .label = "psu:orange",
  2793. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2794. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2795. },
  2796. {
  2797. .label = "fan1:green",
  2798. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2799. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2800. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2801. .bit = BIT(0),
  2802. },
  2803. {
  2804. .label = "fan1:orange",
  2805. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2806. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2807. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2808. .bit = BIT(0),
  2809. },
  2810. {
  2811. .label = "fan2:green",
  2812. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2813. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2814. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2815. .bit = BIT(1),
  2816. },
  2817. {
  2818. .label = "fan2:orange",
  2819. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2820. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2821. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2822. .bit = BIT(1),
  2823. },
  2824. {
  2825. .label = "fan3:green",
  2826. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2827. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2828. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2829. .bit = BIT(2),
  2830. },
  2831. {
  2832. .label = "fan3:orange",
  2833. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2834. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2835. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2836. .bit = BIT(2),
  2837. },
  2838. {
  2839. .label = "fan4:green",
  2840. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2841. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2842. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2843. .bit = BIT(3),
  2844. },
  2845. {
  2846. .label = "fan4:orange",
  2847. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2848. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2849. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2850. .bit = BIT(3),
  2851. },
  2852. {
  2853. .label = "fan5:green",
  2854. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2855. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2856. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2857. .bit = BIT(4),
  2858. },
  2859. {
  2860. .label = "fan5:orange",
  2861. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2862. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2863. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2864. .bit = BIT(4),
  2865. },
  2866. {
  2867. .label = "fan6:green",
  2868. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2869. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2870. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2871. .bit = BIT(5),
  2872. },
  2873. {
  2874. .label = "fan6:orange",
  2875. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2876. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2877. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2878. .bit = BIT(5),
  2879. },
  2880. {
  2881. .label = "fan7:green",
  2882. .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
  2883. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2884. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2885. .bit = BIT(6),
  2886. },
  2887. {
  2888. .label = "fan7:orange",
  2889. .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
  2890. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2891. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2892. .bit = BIT(6),
  2893. },
  2894. {
  2895. .label = "uid:blue",
  2896. .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
  2897. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2898. },
  2899. {
  2900. .label = "fan_front:green",
  2901. .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
  2902. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2903. },
  2904. {
  2905. .label = "fan_front:orange",
  2906. .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
  2907. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2908. },
  2909. {
  2910. .label = "mgmt:green",
  2911. .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
  2912. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2913. },
  2914. {
  2915. .label = "mgmt:orange",
  2916. .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
  2917. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2918. },
  2919. };
  2920. static struct mlxreg_core_platform_data mlxplat_modular_led_data = {
  2921. .data = mlxplat_mlxcpld_modular_led_data,
  2922. .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_led_data),
  2923. };
  2924. /* Platform led data for chassis system */
  2925. static struct mlxreg_core_data mlxplat_mlxcpld_l1_switch_led_data[] = {
  2926. {
  2927. .label = "status:green",
  2928. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2929. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2930. },
  2931. {
  2932. .label = "status:orange",
  2933. .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
  2934. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
  2935. },
  2936. {
  2937. .label = "fan1:green",
  2938. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2939. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2940. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2941. .bit = BIT(0),
  2942. },
  2943. {
  2944. .label = "fan1:orange",
  2945. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2946. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2947. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2948. .bit = BIT(0),
  2949. },
  2950. {
  2951. .label = "fan2:green",
  2952. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2953. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2954. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2955. .bit = BIT(1),
  2956. },
  2957. {
  2958. .label = "fan2:orange",
  2959. .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
  2960. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2961. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2962. .bit = BIT(1),
  2963. },
  2964. {
  2965. .label = "fan3:green",
  2966. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2967. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2968. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2969. .bit = BIT(2),
  2970. },
  2971. {
  2972. .label = "fan3:orange",
  2973. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2974. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2975. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2976. .bit = BIT(2),
  2977. },
  2978. {
  2979. .label = "fan4:green",
  2980. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2981. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2982. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2983. .bit = BIT(3),
  2984. },
  2985. {
  2986. .label = "fan4:orange",
  2987. .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
  2988. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  2989. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2990. .bit = BIT(3),
  2991. },
  2992. {
  2993. .label = "fan5:green",
  2994. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  2995. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  2996. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  2997. .bit = BIT(4),
  2998. },
  2999. {
  3000. .label = "fan5:orange",
  3001. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  3002. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  3003. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  3004. .bit = BIT(4),
  3005. },
  3006. {
  3007. .label = "fan6:green",
  3008. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  3009. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  3010. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  3011. .bit = BIT(5),
  3012. },
  3013. {
  3014. .label = "fan6:orange",
  3015. .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
  3016. .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
  3017. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  3018. .bit = BIT(5),
  3019. },
  3020. {
  3021. .label = "uid:blue",
  3022. .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
  3023. .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
  3024. },
  3025. };
  3026. static struct mlxreg_core_platform_data mlxplat_l1_switch_led_data = {
  3027. .data = mlxplat_mlxcpld_l1_switch_led_data,
  3028. .counter = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_led_data),
  3029. };
  3030. /* Platform register access default */
  3031. static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
  3032. {
  3033. .label = "cpld1_version",
  3034. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
  3035. .bit = GENMASK(7, 0),
  3036. .mode = 0444,
  3037. },
  3038. {
  3039. .label = "cpld2_version",
  3040. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
  3041. .bit = GENMASK(7, 0),
  3042. .mode = 0444,
  3043. },
  3044. {
  3045. .label = "cpld1_pn",
  3046. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
  3047. .bit = GENMASK(15, 0),
  3048. .mode = 0444,
  3049. .regnum = 2,
  3050. },
  3051. {
  3052. .label = "cpld2_pn",
  3053. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
  3054. .bit = GENMASK(15, 0),
  3055. .mode = 0444,
  3056. .regnum = 2,
  3057. },
  3058. {
  3059. .label = "cpld1_version_min",
  3060. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
  3061. .bit = GENMASK(7, 0),
  3062. .mode = 0444,
  3063. },
  3064. {
  3065. .label = "cpld2_version_min",
  3066. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
  3067. .bit = GENMASK(7, 0),
  3068. .mode = 0444,
  3069. },
  3070. {
  3071. .label = "reset_long_pb",
  3072. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3073. .mask = GENMASK(7, 0) & ~BIT(0),
  3074. .mode = 0444,
  3075. },
  3076. {
  3077. .label = "reset_short_pb",
  3078. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3079. .mask = GENMASK(7, 0) & ~BIT(1),
  3080. .mode = 0444,
  3081. },
  3082. {
  3083. .label = "reset_aux_pwr_or_ref",
  3084. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3085. .mask = GENMASK(7, 0) & ~BIT(2),
  3086. .mode = 0444,
  3087. },
  3088. {
  3089. .label = "reset_main_pwr_fail",
  3090. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3091. .mask = GENMASK(7, 0) & ~BIT(3),
  3092. .mode = 0444,
  3093. },
  3094. {
  3095. .label = "reset_sw_reset",
  3096. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3097. .mask = GENMASK(7, 0) & ~BIT(4),
  3098. .mode = 0444,
  3099. },
  3100. {
  3101. .label = "reset_fw_reset",
  3102. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3103. .mask = GENMASK(7, 0) & ~BIT(5),
  3104. .mode = 0444,
  3105. },
  3106. {
  3107. .label = "reset_hotswap_or_wd",
  3108. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3109. .mask = GENMASK(7, 0) & ~BIT(6),
  3110. .mode = 0444,
  3111. },
  3112. {
  3113. .label = "reset_asic_thermal",
  3114. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3115. .mask = GENMASK(7, 0) & ~BIT(7),
  3116. .mode = 0444,
  3117. },
  3118. {
  3119. .label = "psu1_on",
  3120. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3121. .mask = GENMASK(7, 0) & ~BIT(0),
  3122. .mode = 0200,
  3123. },
  3124. {
  3125. .label = "psu2_on",
  3126. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3127. .mask = GENMASK(7, 0) & ~BIT(1),
  3128. .mode = 0200,
  3129. },
  3130. {
  3131. .label = "pwr_cycle",
  3132. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3133. .mask = GENMASK(7, 0) & ~BIT(2),
  3134. .mode = 0200,
  3135. },
  3136. {
  3137. .label = "pwr_down",
  3138. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3139. .mask = GENMASK(7, 0) & ~BIT(3),
  3140. .mode = 0200,
  3141. },
  3142. {
  3143. .label = "select_iio",
  3144. .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
  3145. .mask = GENMASK(7, 0) & ~BIT(6),
  3146. .mode = 0644,
  3147. },
  3148. {
  3149. .label = "asic_health",
  3150. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  3151. .mask = MLXPLAT_CPLD_ASIC_MASK,
  3152. .bit = 1,
  3153. .mode = 0444,
  3154. },
  3155. };
  3156. static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
  3157. .data = mlxplat_mlxcpld_default_regs_io_data,
  3158. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
  3159. };
  3160. /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
  3161. static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
  3162. {
  3163. .label = "cpld1_version",
  3164. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
  3165. .bit = GENMASK(7, 0),
  3166. .mode = 0444,
  3167. },
  3168. {
  3169. .label = "cpld2_version",
  3170. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
  3171. .bit = GENMASK(7, 0),
  3172. .mode = 0444,
  3173. },
  3174. {
  3175. .label = "cpld1_pn",
  3176. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
  3177. .bit = GENMASK(15, 0),
  3178. .mode = 0444,
  3179. .regnum = 2,
  3180. },
  3181. {
  3182. .label = "cpld2_pn",
  3183. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
  3184. .bit = GENMASK(15, 0),
  3185. .mode = 0444,
  3186. .regnum = 2,
  3187. },
  3188. {
  3189. .label = "cpld1_version_min",
  3190. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
  3191. .bit = GENMASK(7, 0),
  3192. .mode = 0444,
  3193. },
  3194. {
  3195. .label = "cpld2_version_min",
  3196. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
  3197. .bit = GENMASK(7, 0),
  3198. .mode = 0444,
  3199. },
  3200. {
  3201. .label = "reset_long_pb",
  3202. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3203. .mask = GENMASK(7, 0) & ~BIT(0),
  3204. .mode = 0444,
  3205. },
  3206. {
  3207. .label = "reset_short_pb",
  3208. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3209. .mask = GENMASK(7, 0) & ~BIT(1),
  3210. .mode = 0444,
  3211. },
  3212. {
  3213. .label = "reset_aux_pwr_or_ref",
  3214. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3215. .mask = GENMASK(7, 0) & ~BIT(2),
  3216. .mode = 0444,
  3217. },
  3218. {
  3219. .label = "reset_sw_reset",
  3220. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3221. .mask = GENMASK(7, 0) & ~BIT(3),
  3222. .mode = 0444,
  3223. },
  3224. {
  3225. .label = "reset_main_pwr_fail",
  3226. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3227. .mask = GENMASK(7, 0) & ~BIT(4),
  3228. .mode = 0444,
  3229. },
  3230. {
  3231. .label = "reset_asic_thermal",
  3232. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3233. .mask = GENMASK(7, 0) & ~BIT(5),
  3234. .mode = 0444,
  3235. },
  3236. {
  3237. .label = "reset_hotswap_or_halt",
  3238. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3239. .mask = GENMASK(7, 0) & ~BIT(6),
  3240. .mode = 0444,
  3241. },
  3242. {
  3243. .label = "reset_sff_wd",
  3244. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3245. .mask = GENMASK(7, 0) & ~BIT(6),
  3246. .mode = 0444,
  3247. },
  3248. {
  3249. .label = "psu1_on",
  3250. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3251. .mask = GENMASK(7, 0) & ~BIT(0),
  3252. .mode = 0200,
  3253. },
  3254. {
  3255. .label = "psu2_on",
  3256. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3257. .mask = GENMASK(7, 0) & ~BIT(1),
  3258. .mode = 0200,
  3259. },
  3260. {
  3261. .label = "pwr_cycle",
  3262. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3263. .mask = GENMASK(7, 0) & ~BIT(2),
  3264. .mode = 0200,
  3265. },
  3266. {
  3267. .label = "pwr_down",
  3268. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3269. .mask = GENMASK(7, 0) & ~BIT(3),
  3270. .mode = 0200,
  3271. },
  3272. {
  3273. .label = "select_iio",
  3274. .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
  3275. .mask = GENMASK(7, 0) & ~BIT(6),
  3276. .mode = 0644,
  3277. },
  3278. {
  3279. .label = "asic_health",
  3280. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  3281. .mask = MLXPLAT_CPLD_ASIC_MASK,
  3282. .bit = 1,
  3283. .mode = 0444,
  3284. },
  3285. };
  3286. static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
  3287. .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
  3288. .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
  3289. };
  3290. /* Platform register access for next generation systems families data */
  3291. static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
  3292. {
  3293. .label = "cpld1_version",
  3294. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
  3295. .bit = GENMASK(7, 0),
  3296. .mode = 0444,
  3297. },
  3298. {
  3299. .label = "cpld2_version",
  3300. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
  3301. .bit = GENMASK(7, 0),
  3302. .mode = 0444,
  3303. },
  3304. {
  3305. .label = "cpld3_version",
  3306. .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
  3307. .bit = GENMASK(7, 0),
  3308. .mode = 0444,
  3309. },
  3310. {
  3311. .label = "cpld4_version",
  3312. .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
  3313. .bit = GENMASK(7, 0),
  3314. .mode = 0444,
  3315. },
  3316. {
  3317. .label = "cpld5_version",
  3318. .reg = MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET,
  3319. .bit = GENMASK(7, 0),
  3320. .mode = 0444,
  3321. },
  3322. {
  3323. .label = "cpld1_pn",
  3324. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
  3325. .bit = GENMASK(15, 0),
  3326. .mode = 0444,
  3327. .regnum = 2,
  3328. },
  3329. {
  3330. .label = "cpld2_pn",
  3331. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
  3332. .bit = GENMASK(15, 0),
  3333. .mode = 0444,
  3334. .regnum = 2,
  3335. },
  3336. {
  3337. .label = "cpld3_pn",
  3338. .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
  3339. .bit = GENMASK(15, 0),
  3340. .mode = 0444,
  3341. .regnum = 2,
  3342. },
  3343. {
  3344. .label = "cpld4_pn",
  3345. .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
  3346. .bit = GENMASK(15, 0),
  3347. .mode = 0444,
  3348. .regnum = 2,
  3349. },
  3350. {
  3351. .label = "cpld5_pn",
  3352. .reg = MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET,
  3353. .bit = GENMASK(15, 0),
  3354. .mode = 0444,
  3355. .regnum = 2,
  3356. },
  3357. {
  3358. .label = "cpld1_version_min",
  3359. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
  3360. .bit = GENMASK(7, 0),
  3361. .mode = 0444,
  3362. },
  3363. {
  3364. .label = "cpld2_version_min",
  3365. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
  3366. .bit = GENMASK(7, 0),
  3367. .mode = 0444,
  3368. },
  3369. {
  3370. .label = "cpld3_version_min",
  3371. .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
  3372. .bit = GENMASK(7, 0),
  3373. .mode = 0444,
  3374. },
  3375. {
  3376. .label = "cpld4_version_min",
  3377. .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
  3378. .bit = GENMASK(7, 0),
  3379. .mode = 0444,
  3380. },
  3381. {
  3382. .label = "cpld5_version_min",
  3383. .reg = MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET,
  3384. .bit = GENMASK(7, 0),
  3385. .mode = 0444,
  3386. },
  3387. {
  3388. .label = "asic_reset",
  3389. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
  3390. .mask = GENMASK(7, 0) & ~BIT(3),
  3391. .mode = 0200,
  3392. },
  3393. {
  3394. .label = "asic2_reset",
  3395. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
  3396. .mask = GENMASK(7, 0) & ~BIT(2),
  3397. .mode = 0200,
  3398. },
  3399. {
  3400. .label = "erot1_reset",
  3401. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
  3402. .mask = GENMASK(7, 0) & ~BIT(6),
  3403. .mode = 0644,
  3404. },
  3405. {
  3406. .label = "erot2_reset",
  3407. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
  3408. .mask = GENMASK(7, 0) & ~BIT(7),
  3409. .mode = 0644,
  3410. },
  3411. {
  3412. .label = "clk_brd_prog_en",
  3413. .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
  3414. .mask = GENMASK(7, 0) & ~BIT(1),
  3415. .mode = 0644,
  3416. .secured = 1,
  3417. },
  3418. {
  3419. .label = "erot1_recovery",
  3420. .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
  3421. .mask = GENMASK(7, 0) & ~BIT(6),
  3422. .mode = 0644,
  3423. },
  3424. {
  3425. .label = "erot2_recovery",
  3426. .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
  3427. .mask = GENMASK(7, 0) & ~BIT(7),
  3428. .mode = 0644,
  3429. },
  3430. {
  3431. .label = "erot1_wp",
  3432. .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
  3433. .mask = GENMASK(7, 0) & ~BIT(4),
  3434. .mode = 0644,
  3435. .secured = 1,
  3436. },
  3437. {
  3438. .label = "erot2_wp",
  3439. .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
  3440. .mask = GENMASK(7, 0) & ~BIT(5),
  3441. .mode = 0644,
  3442. .secured = 1,
  3443. },
  3444. {
  3445. .label = "reset_long_pb",
  3446. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3447. .mask = GENMASK(7, 0) & ~BIT(0),
  3448. .mode = 0444,
  3449. },
  3450. {
  3451. .label = "reset_short_pb",
  3452. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3453. .mask = GENMASK(7, 0) & ~BIT(1),
  3454. .mode = 0444,
  3455. },
  3456. {
  3457. .label = "reset_aux_pwr_or_ref",
  3458. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3459. .mask = GENMASK(7, 0) & ~BIT(2),
  3460. .mode = 0444,
  3461. },
  3462. {
  3463. .label = "reset_swb_dc_dc_pwr_fail",
  3464. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3465. .mask = GENMASK(7, 0) & ~BIT(3),
  3466. .mode = 0444,
  3467. },
  3468. {
  3469. .label = "reset_from_asic",
  3470. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3471. .mask = GENMASK(7, 0) & ~BIT(5),
  3472. .mode = 0444,
  3473. },
  3474. {
  3475. .label = "reset_swb_wd",
  3476. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3477. .mask = GENMASK(7, 0) & ~BIT(6),
  3478. .mode = 0444,
  3479. },
  3480. {
  3481. .label = "reset_asic_thermal",
  3482. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3483. .mask = GENMASK(7, 0) & ~BIT(7),
  3484. .mode = 0444,
  3485. },
  3486. {
  3487. .label = "reset_sw_reset",
  3488. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3489. .mask = GENMASK(7, 0) & ~BIT(0),
  3490. .mode = 0444,
  3491. },
  3492. {
  3493. .label = "reset_comex_pwr_fail",
  3494. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3495. .mask = GENMASK(7, 0) & ~BIT(3),
  3496. .mode = 0444,
  3497. },
  3498. {
  3499. .label = "reset_platform",
  3500. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3501. .mask = GENMASK(7, 0) & ~BIT(4),
  3502. .mode = 0444,
  3503. },
  3504. {
  3505. .label = "reset_soc",
  3506. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3507. .mask = GENMASK(7, 0) & ~BIT(5),
  3508. .mode = 0444,
  3509. },
  3510. {
  3511. .label = "reset_comex_wd",
  3512. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3513. .mask = GENMASK(7, 0) & ~BIT(6),
  3514. .mode = 0444,
  3515. },
  3516. {
  3517. .label = "reset_pwr_converter_fail",
  3518. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3519. .mask = GENMASK(7, 0) & ~BIT(0),
  3520. .mode = 0444,
  3521. },
  3522. {
  3523. .label = "reset_system",
  3524. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3525. .mask = GENMASK(7, 0) & ~BIT(1),
  3526. .mode = 0444,
  3527. },
  3528. {
  3529. .label = "reset_sw_pwr_off",
  3530. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3531. .mask = GENMASK(7, 0) & ~BIT(2),
  3532. .mode = 0444,
  3533. },
  3534. {
  3535. .label = "reset_comex_thermal",
  3536. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3537. .mask = GENMASK(7, 0) & ~BIT(3),
  3538. .mode = 0444,
  3539. },
  3540. {
  3541. .label = "reset_reload_bios",
  3542. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3543. .mask = GENMASK(7, 0) & ~BIT(5),
  3544. .mode = 0444,
  3545. },
  3546. {
  3547. .label = "reset_ac_pwr_fail",
  3548. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3549. .mask = GENMASK(7, 0) & ~BIT(6),
  3550. .mode = 0444,
  3551. },
  3552. {
  3553. .label = "reset_ac_ok_fail",
  3554. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3555. .mask = GENMASK(7, 0) & ~BIT(7),
  3556. .mode = 0444,
  3557. },
  3558. {
  3559. .label = "psu1_on",
  3560. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3561. .mask = GENMASK(7, 0) & ~BIT(0),
  3562. .mode = 0200,
  3563. },
  3564. {
  3565. .label = "psu2_on",
  3566. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3567. .mask = GENMASK(7, 0) & ~BIT(1),
  3568. .mode = 0200,
  3569. },
  3570. {
  3571. .label = "pwr_cycle",
  3572. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3573. .mask = GENMASK(7, 0) & ~BIT(2),
  3574. .mode = 0200,
  3575. },
  3576. {
  3577. .label = "pwr_down",
  3578. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3579. .mask = GENMASK(7, 0) & ~BIT(3),
  3580. .mode = 0200,
  3581. },
  3582. {
  3583. .label = "deep_pwr_cycle",
  3584. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3585. .mask = GENMASK(7, 0) & ~BIT(5),
  3586. .mode = 0200,
  3587. },
  3588. {
  3589. .label = "latch_reset",
  3590. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  3591. .mask = GENMASK(7, 0) & ~BIT(6),
  3592. .mode = 0200,
  3593. },
  3594. {
  3595. .label = "jtag_cap",
  3596. .reg = MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET,
  3597. .mask = MLXPLAT_CPLD_FU_CAP_MASK,
  3598. .bit = 1,
  3599. .mode = 0444,
  3600. },
  3601. {
  3602. .label = "jtag_enable",
  3603. .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
  3604. .mask = GENMASK(7, 0) & ~BIT(4),
  3605. .mode = 0644,
  3606. },
  3607. {
  3608. .label = "dbg1",
  3609. .reg = MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET,
  3610. .bit = GENMASK(7, 0),
  3611. .mode = 0644,
  3612. },
  3613. {
  3614. .label = "dbg2",
  3615. .reg = MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET,
  3616. .bit = GENMASK(7, 0),
  3617. .mode = 0644,
  3618. },
  3619. {
  3620. .label = "dbg3",
  3621. .reg = MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET,
  3622. .bit = GENMASK(7, 0),
  3623. .mode = 0644,
  3624. },
  3625. {
  3626. .label = "dbg4",
  3627. .reg = MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET,
  3628. .bit = GENMASK(7, 0),
  3629. .mode = 0644,
  3630. },
  3631. {
  3632. .label = "asic_health",
  3633. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  3634. .mask = MLXPLAT_CPLD_ASIC_MASK,
  3635. .bit = 1,
  3636. .mode = 0444,
  3637. },
  3638. {
  3639. .label = "asic2_health",
  3640. .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
  3641. .mask = MLXPLAT_CPLD_ASIC_MASK,
  3642. .bit = 1,
  3643. .mode = 0444,
  3644. },
  3645. {
  3646. .label = "fan_dir",
  3647. .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
  3648. .bit = GENMASK(7, 0),
  3649. .mode = 0444,
  3650. },
  3651. {
  3652. .label = "bios_safe_mode",
  3653. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  3654. .mask = GENMASK(7, 0) & ~BIT(4),
  3655. .mode = 0444,
  3656. },
  3657. {
  3658. .label = "bios_active_image",
  3659. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  3660. .mask = GENMASK(7, 0) & ~BIT(5),
  3661. .mode = 0444,
  3662. },
  3663. {
  3664. .label = "bios_auth_fail",
  3665. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  3666. .mask = GENMASK(7, 0) & ~BIT(6),
  3667. .mode = 0444,
  3668. },
  3669. {
  3670. .label = "bios_upgrade_fail",
  3671. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  3672. .mask = GENMASK(7, 0) & ~BIT(7),
  3673. .mode = 0444,
  3674. },
  3675. {
  3676. .label = "voltreg_update_status",
  3677. .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
  3678. .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
  3679. .bit = 5,
  3680. .mode = 0444,
  3681. },
  3682. {
  3683. .label = "pwr_converter_prog_en",
  3684. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  3685. .mask = GENMASK(7, 0) & ~BIT(0),
  3686. .mode = 0644,
  3687. .secured = 1,
  3688. },
  3689. {
  3690. .label = "vpd_wp",
  3691. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  3692. .mask = GENMASK(7, 0) & ~BIT(3),
  3693. .mode = 0644,
  3694. },
  3695. {
  3696. .label = "pcie_asic_reset_dis",
  3697. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  3698. .mask = GENMASK(7, 0) & ~BIT(4),
  3699. .mode = 0644,
  3700. },
  3701. {
  3702. .label = "erot1_ap_reset",
  3703. .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
  3704. .mask = GENMASK(7, 0) & ~BIT(0),
  3705. .mode = 0444,
  3706. },
  3707. {
  3708. .label = "erot2_ap_reset",
  3709. .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
  3710. .mask = GENMASK(7, 0) & ~BIT(1),
  3711. .mode = 0444,
  3712. },
  3713. {
  3714. .label = "lid_open",
  3715. .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
  3716. .mask = GENMASK(7, 0) & ~BIT(2),
  3717. .mode = 0444,
  3718. },
  3719. {
  3720. .label = "clk_brd1_boot_fail",
  3721. .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
  3722. .mask = GENMASK(7, 0) & ~BIT(4),
  3723. .mode = 0444,
  3724. },
  3725. {
  3726. .label = "clk_brd2_boot_fail",
  3727. .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
  3728. .mask = GENMASK(7, 0) & ~BIT(5),
  3729. .mode = 0444,
  3730. },
  3731. {
  3732. .label = "clk_brd_fail",
  3733. .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
  3734. .mask = GENMASK(7, 0) & ~BIT(6),
  3735. .mode = 0444,
  3736. },
  3737. {
  3738. .label = "asic_pg_fail",
  3739. .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
  3740. .mask = GENMASK(7, 0) & ~BIT(7),
  3741. .mode = 0444,
  3742. },
  3743. {
  3744. .label = "spi_chnl_select",
  3745. .reg = MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT,
  3746. .mask = GENMASK(7, 0),
  3747. .bit = 1,
  3748. .mode = 0644,
  3749. },
  3750. {
  3751. .label = "config1",
  3752. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
  3753. .bit = GENMASK(7, 0),
  3754. .mode = 0444,
  3755. },
  3756. {
  3757. .label = "config2",
  3758. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
  3759. .bit = GENMASK(7, 0),
  3760. .mode = 0444,
  3761. },
  3762. {
  3763. .label = "config3",
  3764. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
  3765. .bit = GENMASK(7, 0),
  3766. .mode = 0444,
  3767. },
  3768. {
  3769. .label = "ufm_version",
  3770. .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
  3771. .bit = GENMASK(7, 0),
  3772. .mode = 0444,
  3773. },
  3774. };
  3775. static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
  3776. .data = mlxplat_mlxcpld_default_ng_regs_io_data,
  3777. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
  3778. };
  3779. /* Platform register access for modular systems families data */
  3780. static struct mlxreg_core_data mlxplat_mlxcpld_modular_regs_io_data[] = {
  3781. {
  3782. .label = "cpld1_version",
  3783. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
  3784. .bit = GENMASK(7, 0),
  3785. .mode = 0444,
  3786. },
  3787. {
  3788. .label = "cpld2_version",
  3789. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
  3790. .bit = GENMASK(7, 0),
  3791. .mode = 0444,
  3792. },
  3793. {
  3794. .label = "cpld3_version",
  3795. .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
  3796. .bit = GENMASK(7, 0),
  3797. .mode = 0444,
  3798. },
  3799. {
  3800. .label = "cpld4_version",
  3801. .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
  3802. .bit = GENMASK(7, 0),
  3803. .mode = 0444,
  3804. },
  3805. {
  3806. .label = "cpld1_pn",
  3807. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
  3808. .bit = GENMASK(15, 0),
  3809. .mode = 0444,
  3810. .regnum = 2,
  3811. },
  3812. {
  3813. .label = "cpld2_pn",
  3814. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
  3815. .bit = GENMASK(15, 0),
  3816. .mode = 0444,
  3817. .regnum = 2,
  3818. },
  3819. {
  3820. .label = "cpld3_pn",
  3821. .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
  3822. .bit = GENMASK(15, 0),
  3823. .mode = 0444,
  3824. .regnum = 2,
  3825. },
  3826. {
  3827. .label = "cpld4_pn",
  3828. .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
  3829. .bit = GENMASK(15, 0),
  3830. .mode = 0444,
  3831. .regnum = 2,
  3832. },
  3833. {
  3834. .label = "cpld1_version_min",
  3835. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
  3836. .bit = GENMASK(7, 0),
  3837. .mode = 0444,
  3838. },
  3839. {
  3840. .label = "cpld2_version_min",
  3841. .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
  3842. .bit = GENMASK(7, 0),
  3843. .mode = 0444,
  3844. },
  3845. {
  3846. .label = "cpld3_version_min",
  3847. .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
  3848. .bit = GENMASK(7, 0),
  3849. .mode = 0444,
  3850. },
  3851. {
  3852. .label = "cpld4_version_min",
  3853. .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
  3854. .bit = GENMASK(7, 0),
  3855. .mode = 0444,
  3856. },
  3857. {
  3858. .label = "lc1_enable",
  3859. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3860. .mask = GENMASK(7, 0) & ~BIT(0),
  3861. .mode = 0644,
  3862. },
  3863. {
  3864. .label = "lc2_enable",
  3865. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3866. .mask = GENMASK(7, 0) & ~BIT(1),
  3867. .mode = 0644,
  3868. },
  3869. {
  3870. .label = "lc3_enable",
  3871. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3872. .mask = GENMASK(7, 0) & ~BIT(2),
  3873. .mode = 0644,
  3874. },
  3875. {
  3876. .label = "lc4_enable",
  3877. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3878. .mask = GENMASK(7, 0) & ~BIT(3),
  3879. .mode = 0644,
  3880. },
  3881. {
  3882. .label = "lc5_enable",
  3883. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3884. .mask = GENMASK(7, 0) & ~BIT(4),
  3885. .mode = 0644,
  3886. },
  3887. {
  3888. .label = "lc6_enable",
  3889. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3890. .mask = GENMASK(7, 0) & ~BIT(5),
  3891. .mode = 0644,
  3892. },
  3893. {
  3894. .label = "lc7_enable",
  3895. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3896. .mask = GENMASK(7, 0) & ~BIT(6),
  3897. .mode = 0644,
  3898. },
  3899. {
  3900. .label = "lc8_enable",
  3901. .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
  3902. .mask = GENMASK(7, 0) & ~BIT(7),
  3903. .mode = 0644,
  3904. },
  3905. {
  3906. .label = "reset_long_pb",
  3907. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3908. .mask = GENMASK(7, 0) & ~BIT(0),
  3909. .mode = 0444,
  3910. },
  3911. {
  3912. .label = "reset_short_pb",
  3913. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3914. .mask = GENMASK(7, 0) & ~BIT(1),
  3915. .mode = 0444,
  3916. },
  3917. {
  3918. .label = "reset_aux_pwr_or_fu",
  3919. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3920. .mask = GENMASK(7, 0) & ~BIT(2),
  3921. .mode = 0444,
  3922. },
  3923. {
  3924. .label = "reset_mgmt_dc_dc_pwr_fail",
  3925. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3926. .mask = GENMASK(7, 0) & ~BIT(3),
  3927. .mode = 0444,
  3928. },
  3929. {
  3930. .label = "reset_sys_comex_bios",
  3931. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3932. .mask = GENMASK(7, 0) & ~BIT(5),
  3933. .mode = 0444,
  3934. },
  3935. {
  3936. .label = "reset_sw_reset",
  3937. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3938. .mask = GENMASK(7, 0) & ~BIT(0),
  3939. .mode = 0444,
  3940. },
  3941. {
  3942. .label = "reset_aux_pwr_or_reload",
  3943. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3944. .mask = GENMASK(7, 0) & ~BIT(2),
  3945. .mode = 0444,
  3946. },
  3947. {
  3948. .label = "reset_comex_pwr_fail",
  3949. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3950. .mask = GENMASK(7, 0) & ~BIT(3),
  3951. .mode = 0444,
  3952. },
  3953. {
  3954. .label = "reset_platform",
  3955. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3956. .mask = GENMASK(7, 0) & ~BIT(4),
  3957. .mode = 0444,
  3958. },
  3959. {
  3960. .label = "reset_soc",
  3961. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3962. .mask = GENMASK(7, 0) & ~BIT(5),
  3963. .mode = 0444,
  3964. },
  3965. {
  3966. .label = "reset_pwr_off_from_carrier",
  3967. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  3968. .mask = GENMASK(7, 0) & ~BIT(7),
  3969. .mode = 0444,
  3970. },
  3971. {
  3972. .label = "reset_swb_wd",
  3973. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3974. .mask = GENMASK(7, 0) & ~BIT(0),
  3975. .mode = 0444,
  3976. },
  3977. {
  3978. .label = "reset_swb_aux_pwr_or_fu",
  3979. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  3980. .mask = GENMASK(7, 0) & ~BIT(2),
  3981. .mode = 0444,
  3982. },
  3983. {
  3984. .label = "reset_swb_dc_dc_pwr_fail",
  3985. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3986. .mask = GENMASK(7, 0) & ~BIT(3),
  3987. .mode = 0444,
  3988. },
  3989. {
  3990. .label = "reset_swb_12v_fail",
  3991. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3992. .mask = GENMASK(7, 0) & ~BIT(4),
  3993. .mode = 0444,
  3994. },
  3995. {
  3996. .label = "reset_system",
  3997. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  3998. .mask = GENMASK(7, 0) & ~BIT(5),
  3999. .mode = 0444,
  4000. },
  4001. {
  4002. .label = "reset_thermal_spc_or_pciesw",
  4003. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4004. .mask = GENMASK(7, 0) & ~BIT(7),
  4005. .mode = 0444,
  4006. },
  4007. {
  4008. .label = "bios_safe_mode",
  4009. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4010. .mask = GENMASK(7, 0) & ~BIT(4),
  4011. .mode = 0444,
  4012. },
  4013. {
  4014. .label = "bios_active_image",
  4015. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4016. .mask = GENMASK(7, 0) & ~BIT(5),
  4017. .mode = 0444,
  4018. },
  4019. {
  4020. .label = "bios_auth_fail",
  4021. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4022. .mask = GENMASK(7, 0) & ~BIT(6),
  4023. .mode = 0444,
  4024. },
  4025. {
  4026. .label = "bios_upgrade_fail",
  4027. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4028. .mask = GENMASK(7, 0) & ~BIT(7),
  4029. .mode = 0444,
  4030. },
  4031. {
  4032. .label = "voltreg_update_status",
  4033. .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
  4034. .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
  4035. .bit = 5,
  4036. .mode = 0444,
  4037. },
  4038. {
  4039. .label = "vpd_wp",
  4040. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  4041. .mask = GENMASK(7, 0) & ~BIT(3),
  4042. .mode = 0644,
  4043. },
  4044. {
  4045. .label = "pcie_asic_reset_dis",
  4046. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  4047. .mask = GENMASK(7, 0) & ~BIT(4),
  4048. .mode = 0644,
  4049. },
  4050. {
  4051. .label = "shutdown_unlock",
  4052. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  4053. .mask = GENMASK(7, 0) & ~BIT(5),
  4054. .mode = 0644,
  4055. },
  4056. {
  4057. .label = "lc1_rst_mask",
  4058. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4059. .mask = GENMASK(7, 0) & ~BIT(0),
  4060. .mode = 0200,
  4061. },
  4062. {
  4063. .label = "lc2_rst_mask",
  4064. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4065. .mask = GENMASK(7, 0) & ~BIT(1),
  4066. .mode = 0200,
  4067. },
  4068. {
  4069. .label = "lc3_rst_mask",
  4070. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4071. .mask = GENMASK(7, 0) & ~BIT(2),
  4072. .mode = 0200,
  4073. },
  4074. {
  4075. .label = "lc4_rst_mask",
  4076. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4077. .mask = GENMASK(7, 0) & ~BIT(3),
  4078. .mode = 0200,
  4079. },
  4080. {
  4081. .label = "lc5_rst_mask",
  4082. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4083. .mask = GENMASK(7, 0) & ~BIT(4),
  4084. .mode = 0200,
  4085. },
  4086. {
  4087. .label = "lc6_rst_mask",
  4088. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4089. .mask = GENMASK(7, 0) & ~BIT(5),
  4090. .mode = 0200,
  4091. },
  4092. {
  4093. .label = "lc7_rst_mask",
  4094. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4095. .mask = GENMASK(7, 0) & ~BIT(6),
  4096. .mode = 0200,
  4097. },
  4098. {
  4099. .label = "lc8_rst_mask",
  4100. .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
  4101. .mask = GENMASK(7, 0) & ~BIT(7),
  4102. .mode = 0200,
  4103. },
  4104. {
  4105. .label = "psu1_on",
  4106. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4107. .mask = GENMASK(7, 0) & ~BIT(0),
  4108. .mode = 0200,
  4109. },
  4110. {
  4111. .label = "psu2_on",
  4112. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4113. .mask = GENMASK(7, 0) & ~BIT(1),
  4114. .mode = 0200,
  4115. },
  4116. {
  4117. .label = "pwr_cycle",
  4118. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4119. .mask = GENMASK(7, 0) & ~BIT(2),
  4120. .mode = 0200,
  4121. },
  4122. {
  4123. .label = "pwr_down",
  4124. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4125. .mask = GENMASK(7, 0) & ~BIT(3),
  4126. .mode = 0200,
  4127. },
  4128. {
  4129. .label = "psu3_on",
  4130. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4131. .mask = GENMASK(7, 0) & ~BIT(4),
  4132. .mode = 0200,
  4133. },
  4134. {
  4135. .label = "psu4_on",
  4136. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4137. .mask = GENMASK(7, 0) & ~BIT(5),
  4138. .mode = 0200,
  4139. },
  4140. {
  4141. .label = "auto_power_mode",
  4142. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4143. .mask = GENMASK(7, 0) & ~BIT(6),
  4144. .mode = 0644,
  4145. },
  4146. {
  4147. .label = "pm_mgmt_en",
  4148. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4149. .mask = GENMASK(7, 0) & ~BIT(7),
  4150. .mode = 0644,
  4151. },
  4152. {
  4153. .label = "jtag_enable",
  4154. .reg = MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE,
  4155. .mask = GENMASK(3, 0),
  4156. .bit = 1,
  4157. .mode = 0644,
  4158. },
  4159. {
  4160. .label = "safe_bios_dis",
  4161. .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
  4162. .mask = GENMASK(7, 0) & ~BIT(5),
  4163. .mode = 0644,
  4164. },
  4165. {
  4166. .label = "safe_bios_dis_wp",
  4167. .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET,
  4168. .mask = GENMASK(7, 0) & ~BIT(5),
  4169. .mode = 0644,
  4170. },
  4171. {
  4172. .label = "asic_health",
  4173. .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
  4174. .mask = MLXPLAT_CPLD_ASIC_MASK,
  4175. .bit = 1,
  4176. .mode = 0444,
  4177. },
  4178. {
  4179. .label = "fan_dir",
  4180. .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
  4181. .bit = GENMASK(7, 0),
  4182. .mode = 0444,
  4183. },
  4184. {
  4185. .label = "lc1_pwr",
  4186. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4187. .mask = GENMASK(7, 0) & ~BIT(0),
  4188. .mode = 0644,
  4189. },
  4190. {
  4191. .label = "lc2_pwr",
  4192. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4193. .mask = GENMASK(7, 0) & ~BIT(1),
  4194. .mode = 0644,
  4195. },
  4196. {
  4197. .label = "lc3_pwr",
  4198. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4199. .mask = GENMASK(7, 0) & ~BIT(2),
  4200. .mode = 0644,
  4201. },
  4202. {
  4203. .label = "lc4_pwr",
  4204. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4205. .mask = GENMASK(7, 0) & ~BIT(3),
  4206. .mode = 0644,
  4207. },
  4208. {
  4209. .label = "lc5_pwr",
  4210. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4211. .mask = GENMASK(7, 0) & ~BIT(4),
  4212. .mode = 0644,
  4213. },
  4214. {
  4215. .label = "lc6_pwr",
  4216. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4217. .mask = GENMASK(7, 0) & ~BIT(5),
  4218. .mode = 0644,
  4219. },
  4220. {
  4221. .label = "lc7_pwr",
  4222. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4223. .mask = GENMASK(7, 0) & ~BIT(6),
  4224. .mode = 0644,
  4225. },
  4226. {
  4227. .label = "lc8_pwr",
  4228. .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
  4229. .mask = GENMASK(7, 0) & ~BIT(7),
  4230. .mode = 0644,
  4231. },
  4232. {
  4233. .label = "config1",
  4234. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
  4235. .bit = GENMASK(7, 0),
  4236. .mode = 0444,
  4237. },
  4238. {
  4239. .label = "config2",
  4240. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
  4241. .bit = GENMASK(7, 0),
  4242. .mode = 0444,
  4243. },
  4244. {
  4245. .label = "config3",
  4246. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
  4247. .bit = GENMASK(7, 0),
  4248. .mode = 0444,
  4249. },
  4250. {
  4251. .label = "ufm_version",
  4252. .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
  4253. .bit = GENMASK(7, 0),
  4254. .mode = 0444,
  4255. },
  4256. };
  4257. static struct mlxreg_core_platform_data mlxplat_modular_regs_io_data = {
  4258. .data = mlxplat_mlxcpld_modular_regs_io_data,
  4259. .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_regs_io_data),
  4260. };
  4261. /* Platform register access for chassis blade systems family data */
  4262. static struct mlxreg_core_data mlxplat_mlxcpld_chassis_blade_regs_io_data[] = {
  4263. {
  4264. .label = "cpld1_version",
  4265. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
  4266. .bit = GENMASK(7, 0),
  4267. .mode = 0444,
  4268. },
  4269. {
  4270. .label = "cpld1_pn",
  4271. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
  4272. .bit = GENMASK(15, 0),
  4273. .mode = 0444,
  4274. .regnum = 2,
  4275. },
  4276. {
  4277. .label = "cpld1_version_min",
  4278. .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
  4279. .bit = GENMASK(7, 0),
  4280. .mode = 0444,
  4281. },
  4282. {
  4283. .label = "reset_aux_pwr_or_ref",
  4284. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  4285. .mask = GENMASK(7, 0) & ~BIT(2),
  4286. .mode = 0444,
  4287. },
  4288. {
  4289. .label = "reset_from_comex",
  4290. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  4291. .mask = GENMASK(7, 0) & ~BIT(4),
  4292. .mode = 0444,
  4293. },
  4294. {
  4295. .label = "reset_comex_pwr_fail",
  4296. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  4297. .mask = GENMASK(7, 0) & ~BIT(3),
  4298. .mode = 0444,
  4299. },
  4300. {
  4301. .label = "reset_platform",
  4302. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  4303. .mask = GENMASK(7, 0) & ~BIT(4),
  4304. .mode = 0444,
  4305. },
  4306. {
  4307. .label = "reset_soc",
  4308. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  4309. .mask = GENMASK(7, 0) & ~BIT(5),
  4310. .mode = 0444,
  4311. },
  4312. {
  4313. .label = "reset_comex_wd",
  4314. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
  4315. .mask = GENMASK(7, 0) & ~BIT(6),
  4316. .mode = 0444,
  4317. },
  4318. {
  4319. .label = "reset_voltmon_upgrade_fail",
  4320. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4321. .mask = GENMASK(7, 0) & ~BIT(0),
  4322. .mode = 0444,
  4323. },
  4324. {
  4325. .label = "reset_system",
  4326. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4327. .mask = GENMASK(7, 0) & ~BIT(1),
  4328. .mode = 0444,
  4329. },
  4330. {
  4331. .label = "reset_sw_pwr_off",
  4332. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4333. .mask = GENMASK(7, 0) & ~BIT(2),
  4334. .mode = 0444,
  4335. },
  4336. {
  4337. .label = "reset_comex_thermal",
  4338. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4339. .mask = GENMASK(7, 0) & ~BIT(3),
  4340. .mode = 0444,
  4341. },
  4342. {
  4343. .label = "reset_reload_bios",
  4344. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4345. .mask = GENMASK(7, 0) & ~BIT(5),
  4346. .mode = 0444,
  4347. },
  4348. {
  4349. .label = "reset_ac_pwr_fail",
  4350. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4351. .mask = GENMASK(7, 0) & ~BIT(6),
  4352. .mode = 0444,
  4353. },
  4354. {
  4355. .label = "reset_long_pwr_pb",
  4356. .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
  4357. .mask = GENMASK(7, 0) & ~BIT(7),
  4358. .mode = 0444,
  4359. },
  4360. {
  4361. .label = "pwr_cycle",
  4362. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4363. .mask = GENMASK(7, 0) & ~BIT(2),
  4364. .mode = 0200,
  4365. },
  4366. {
  4367. .label = "pwr_down",
  4368. .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
  4369. .mask = GENMASK(7, 0) & ~BIT(3),
  4370. .mode = 0200,
  4371. },
  4372. {
  4373. .label = "global_wp_request",
  4374. .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
  4375. .mask = GENMASK(7, 0) & ~BIT(0),
  4376. .mode = 0644,
  4377. },
  4378. {
  4379. .label = "jtag_enable",
  4380. .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
  4381. .mask = GENMASK(7, 0) & ~BIT(4),
  4382. .mode = 0644,
  4383. },
  4384. {
  4385. .label = "comm_chnl_ready",
  4386. .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
  4387. .mask = GENMASK(7, 0) & ~BIT(6),
  4388. .mode = 0200,
  4389. },
  4390. {
  4391. .label = "bios_safe_mode",
  4392. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4393. .mask = GENMASK(7, 0) & ~BIT(4),
  4394. .mode = 0444,
  4395. },
  4396. {
  4397. .label = "bios_active_image",
  4398. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4399. .mask = GENMASK(7, 0) & ~BIT(5),
  4400. .mode = 0444,
  4401. },
  4402. {
  4403. .label = "bios_auth_fail",
  4404. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4405. .mask = GENMASK(7, 0) & ~BIT(6),
  4406. .mode = 0444,
  4407. },
  4408. {
  4409. .label = "bios_upgrade_fail",
  4410. .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
  4411. .mask = GENMASK(7, 0) & ~BIT(7),
  4412. .mode = 0444,
  4413. },
  4414. {
  4415. .label = "voltreg_update_status",
  4416. .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
  4417. .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
  4418. .bit = 5,
  4419. .mode = 0444,
  4420. },
  4421. {
  4422. .label = "vpd_wp",
  4423. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  4424. .mask = GENMASK(7, 0) & ~BIT(3),
  4425. .mode = 0644,
  4426. },
  4427. {
  4428. .label = "pcie_asic_reset_dis",
  4429. .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
  4430. .mask = GENMASK(7, 0) & ~BIT(4),
  4431. .mode = 0644,
  4432. },
  4433. {
  4434. .label = "global_wp_response",
  4435. .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
  4436. .mask = GENMASK(7, 0) & ~BIT(0),
  4437. .mode = 0444,
  4438. },
  4439. {
  4440. .label = "config1",
  4441. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
  4442. .bit = GENMASK(7, 0),
  4443. .mode = 0444,
  4444. },
  4445. {
  4446. .label = "config2",
  4447. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
  4448. .bit = GENMASK(7, 0),
  4449. .mode = 0444,
  4450. },
  4451. {
  4452. .label = "config3",
  4453. .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
  4454. .bit = GENMASK(7, 0),
  4455. .mode = 0444,
  4456. },
  4457. {
  4458. .label = "ufm_version",
  4459. .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
  4460. .bit = GENMASK(7, 0),
  4461. .mode = 0444,
  4462. },
  4463. };
  4464. static struct mlxreg_core_platform_data mlxplat_chassis_blade_regs_io_data = {
  4465. .data = mlxplat_mlxcpld_chassis_blade_regs_io_data,
  4466. .counter = ARRAY_SIZE(mlxplat_mlxcpld_chassis_blade_regs_io_data),
  4467. };
  4468. /* Platform FAN default */
  4469. static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
  4470. {
  4471. .label = "pwm1",
  4472. .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
  4473. },
  4474. {
  4475. .label = "pwm2",
  4476. .reg = MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET,
  4477. },
  4478. {
  4479. .label = "pwm3",
  4480. .reg = MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET,
  4481. },
  4482. {
  4483. .label = "pwm4",
  4484. .reg = MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET,
  4485. },
  4486. {
  4487. .label = "tacho1",
  4488. .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
  4489. .mask = GENMASK(7, 0),
  4490. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4491. .bit = BIT(0),
  4492. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4493. },
  4494. {
  4495. .label = "tacho2",
  4496. .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
  4497. .mask = GENMASK(7, 0),
  4498. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4499. .bit = BIT(1),
  4500. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4501. },
  4502. {
  4503. .label = "tacho3",
  4504. .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
  4505. .mask = GENMASK(7, 0),
  4506. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4507. .bit = BIT(2),
  4508. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4509. },
  4510. {
  4511. .label = "tacho4",
  4512. .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
  4513. .mask = GENMASK(7, 0),
  4514. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4515. .bit = BIT(3),
  4516. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4517. },
  4518. {
  4519. .label = "tacho5",
  4520. .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
  4521. .mask = GENMASK(7, 0),
  4522. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4523. .bit = BIT(4),
  4524. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4525. },
  4526. {
  4527. .label = "tacho6",
  4528. .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
  4529. .mask = GENMASK(7, 0),
  4530. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4531. .bit = BIT(5),
  4532. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4533. },
  4534. {
  4535. .label = "tacho7",
  4536. .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
  4537. .mask = GENMASK(7, 0),
  4538. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4539. .bit = BIT(6),
  4540. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4541. },
  4542. {
  4543. .label = "tacho8",
  4544. .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
  4545. .mask = GENMASK(7, 0),
  4546. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
  4547. .bit = BIT(7),
  4548. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4549. },
  4550. {
  4551. .label = "tacho9",
  4552. .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
  4553. .mask = GENMASK(7, 0),
  4554. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
  4555. .bit = BIT(0),
  4556. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4557. },
  4558. {
  4559. .label = "tacho10",
  4560. .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
  4561. .mask = GENMASK(7, 0),
  4562. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
  4563. .bit = BIT(1),
  4564. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4565. },
  4566. {
  4567. .label = "tacho11",
  4568. .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
  4569. .mask = GENMASK(7, 0),
  4570. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
  4571. .bit = BIT(2),
  4572. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4573. },
  4574. {
  4575. .label = "tacho12",
  4576. .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
  4577. .mask = GENMASK(7, 0),
  4578. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
  4579. .bit = BIT(3),
  4580. .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
  4581. },
  4582. {
  4583. .label = "tacho13",
  4584. .reg = MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET,
  4585. .mask = GENMASK(7, 0),
  4586. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
  4587. .bit = BIT(4),
  4588. },
  4589. {
  4590. .label = "tacho14",
  4591. .reg = MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET,
  4592. .mask = GENMASK(7, 0),
  4593. .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
  4594. .bit = BIT(5),
  4595. },
  4596. {
  4597. .label = "conf",
  4598. .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
  4599. },
  4600. };
  4601. static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
  4602. .data = mlxplat_mlxcpld_default_fan_data,
  4603. .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
  4604. .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
  4605. };
  4606. /* Watchdog type1: hardware implementation version1
  4607. * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
  4608. */
  4609. static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
  4610. {
  4611. .label = "action",
  4612. .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
  4613. .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
  4614. .bit = 0,
  4615. },
  4616. {
  4617. .label = "timeout",
  4618. .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
  4619. .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
  4620. .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
  4621. },
  4622. {
  4623. .label = "ping",
  4624. .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
  4625. .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
  4626. .bit = 0,
  4627. },
  4628. {
  4629. .label = "reset",
  4630. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  4631. .mask = GENMASK(7, 0) & ~BIT(6),
  4632. .bit = 6,
  4633. },
  4634. };
  4635. static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
  4636. {
  4637. .label = "action",
  4638. .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
  4639. .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
  4640. .bit = 4,
  4641. },
  4642. {
  4643. .label = "timeout",
  4644. .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
  4645. .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
  4646. .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
  4647. },
  4648. {
  4649. .label = "ping",
  4650. .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
  4651. .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
  4652. .bit = 1,
  4653. },
  4654. };
  4655. static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
  4656. {
  4657. .data = mlxplat_mlxcpld_wd_main_regs_type1,
  4658. .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
  4659. .version = MLX_WDT_TYPE1,
  4660. .identity = "mlx-wdt-main",
  4661. },
  4662. {
  4663. .data = mlxplat_mlxcpld_wd_aux_regs_type1,
  4664. .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
  4665. .version = MLX_WDT_TYPE1,
  4666. .identity = "mlx-wdt-aux",
  4667. },
  4668. };
  4669. /* Watchdog type2: hardware implementation version 2
  4670. * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
  4671. */
  4672. static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
  4673. {
  4674. .label = "action",
  4675. .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
  4676. .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
  4677. .bit = 0,
  4678. },
  4679. {
  4680. .label = "timeout",
  4681. .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
  4682. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4683. .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
  4684. },
  4685. {
  4686. .label = "timeleft",
  4687. .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
  4688. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4689. },
  4690. {
  4691. .label = "ping",
  4692. .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
  4693. .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
  4694. .bit = 0,
  4695. },
  4696. {
  4697. .label = "reset",
  4698. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  4699. .mask = GENMASK(7, 0) & ~BIT(6),
  4700. .bit = 6,
  4701. },
  4702. };
  4703. static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
  4704. {
  4705. .label = "action",
  4706. .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
  4707. .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
  4708. .bit = 4,
  4709. },
  4710. {
  4711. .label = "timeout",
  4712. .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
  4713. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4714. .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
  4715. },
  4716. {
  4717. .label = "timeleft",
  4718. .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
  4719. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4720. },
  4721. {
  4722. .label = "ping",
  4723. .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
  4724. .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
  4725. .bit = 4,
  4726. },
  4727. };
  4728. static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
  4729. {
  4730. .data = mlxplat_mlxcpld_wd_main_regs_type2,
  4731. .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
  4732. .version = MLX_WDT_TYPE2,
  4733. .identity = "mlx-wdt-main",
  4734. },
  4735. {
  4736. .data = mlxplat_mlxcpld_wd_aux_regs_type2,
  4737. .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
  4738. .version = MLX_WDT_TYPE2,
  4739. .identity = "mlx-wdt-aux",
  4740. },
  4741. };
  4742. /* Watchdog type3: hardware implementation version 3
  4743. * Can be on all systems. It's differentiated by WD capability bit.
  4744. * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
  4745. * still have only one main watchdog.
  4746. */
  4747. static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
  4748. {
  4749. .label = "action",
  4750. .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
  4751. .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
  4752. .bit = 0,
  4753. },
  4754. {
  4755. .label = "timeout",
  4756. .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
  4757. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4758. .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
  4759. },
  4760. {
  4761. .label = "timeleft",
  4762. .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
  4763. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4764. },
  4765. {
  4766. .label = "ping",
  4767. .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
  4768. .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
  4769. .bit = 0,
  4770. },
  4771. {
  4772. .label = "reset",
  4773. .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
  4774. .mask = GENMASK(7, 0) & ~BIT(6),
  4775. .bit = 6,
  4776. },
  4777. };
  4778. static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
  4779. {
  4780. .label = "action",
  4781. .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
  4782. .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
  4783. .bit = 4,
  4784. },
  4785. {
  4786. .label = "timeout",
  4787. .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
  4788. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4789. .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
  4790. },
  4791. {
  4792. .label = "timeleft",
  4793. .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
  4794. .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
  4795. },
  4796. {
  4797. .label = "ping",
  4798. .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
  4799. .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
  4800. .bit = 4,
  4801. },
  4802. };
  4803. static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
  4804. {
  4805. .data = mlxplat_mlxcpld_wd_main_regs_type3,
  4806. .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
  4807. .version = MLX_WDT_TYPE3,
  4808. .identity = "mlx-wdt-main",
  4809. },
  4810. {
  4811. .data = mlxplat_mlxcpld_wd_aux_regs_type3,
  4812. .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
  4813. .version = MLX_WDT_TYPE3,
  4814. .identity = "mlx-wdt-aux",
  4815. },
  4816. };
  4817. static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
  4818. {
  4819. switch (reg) {
  4820. case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
  4821. case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
  4822. case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
  4823. case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
  4824. case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
  4825. case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
  4826. case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
  4827. case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
  4828. case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
  4829. case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
  4830. case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
  4831. case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
  4832. case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
  4833. case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
  4834. case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
  4835. case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
  4836. case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
  4837. case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
  4838. case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
  4839. case MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET:
  4840. case MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET:
  4841. case MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET:
  4842. case MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET:
  4843. case MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET:
  4844. case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
  4845. case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
  4846. case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
  4847. case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
  4848. case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
  4849. case MLXPLAT_CPLD_LPC_REG_BRD_OFFSET:
  4850. case MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET:
  4851. case MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET:
  4852. case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
  4853. case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
  4854. case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
  4855. case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
  4856. case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
  4857. case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
  4858. case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
  4859. case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
  4860. case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
  4861. case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
  4862. case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
  4863. case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
  4864. case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
  4865. case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
  4866. case MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET:
  4867. case MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET:
  4868. case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
  4869. case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
  4870. case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
  4871. case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
  4872. case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
  4873. case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
  4874. case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
  4875. case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
  4876. case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
  4877. case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
  4878. case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
  4879. case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
  4880. case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
  4881. case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
  4882. case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
  4883. case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
  4884. case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
  4885. case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
  4886. case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
  4887. case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
  4888. case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
  4889. case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
  4890. case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
  4891. case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
  4892. case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
  4893. case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
  4894. case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
  4895. case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
  4896. case MLXPLAT_CPLD_LPC_REG_DBG_CTRL_OFFSET:
  4897. case MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET:
  4898. case MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET:
  4899. case MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET:
  4900. case MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET:
  4901. case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
  4902. case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
  4903. case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
  4904. case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
  4905. case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
  4906. return true;
  4907. }
  4908. return false;
  4909. }
  4910. static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
  4911. {
  4912. switch (reg) {
  4913. case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
  4914. case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
  4915. case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
  4916. case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
  4917. case MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET:
  4918. case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
  4919. case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
  4920. case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
  4921. case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
  4922. case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
  4923. case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
  4924. case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
  4925. case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
  4926. case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET:
  4927. case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET:
  4928. case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
  4929. case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
  4930. case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
  4931. case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
  4932. case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
  4933. case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
  4934. case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
  4935. case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
  4936. case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
  4937. case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
  4938. case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
  4939. case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
  4940. case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
  4941. case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
  4942. case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
  4943. case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
  4944. case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
  4945. case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
  4946. case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
  4947. case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
  4948. case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
  4949. case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
  4950. case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
  4951. case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
  4952. case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
  4953. case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
  4954. case MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET:
  4955. case MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET:
  4956. case MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET:
  4957. case MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET:
  4958. case MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET:
  4959. case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
  4960. case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
  4961. case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
  4962. case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
  4963. case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
  4964. case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
  4965. case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
  4966. case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
  4967. case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
  4968. case MLXPLAT_CPLD_LPC_REG_BRD_OFFSET:
  4969. case MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET:
  4970. case MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET:
  4971. case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
  4972. case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
  4973. case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
  4974. case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
  4975. case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
  4976. case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
  4977. case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
  4978. case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
  4979. case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
  4980. case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
  4981. case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
  4982. case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
  4983. case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
  4984. case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
  4985. case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
  4986. case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
  4987. case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
  4988. case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
  4989. case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
  4990. case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
  4991. case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
  4992. case MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET:
  4993. case MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET:
  4994. case MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET:
  4995. case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
  4996. case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
  4997. case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
  4998. case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
  4999. case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
  5000. case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
  5001. case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
  5002. case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
  5003. case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
  5004. case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
  5005. case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
  5006. case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
  5007. case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
  5008. case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
  5009. case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
  5010. case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
  5011. case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
  5012. case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
  5013. case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
  5014. case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
  5015. case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
  5016. case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
  5017. case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
  5018. case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
  5019. case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
  5020. case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
  5021. case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
  5022. case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
  5023. case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
  5024. case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
  5025. case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
  5026. case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
  5027. case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
  5028. case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
  5029. case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
  5030. case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
  5031. case MLXPLAT_CPLD_LPC_REG_DBG_CTRL_OFFSET:
  5032. case MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET:
  5033. case MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET:
  5034. case MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET:
  5035. case MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET:
  5036. case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
  5037. case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
  5038. case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
  5039. case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
  5040. case MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET:
  5041. case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
  5042. case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
  5043. case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
  5044. case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
  5045. case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
  5046. case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
  5047. case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
  5048. case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
  5049. case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
  5050. case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
  5051. case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
  5052. case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
  5053. case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
  5054. case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
  5055. case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
  5056. case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
  5057. case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
  5058. case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
  5059. case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
  5060. case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
  5061. case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
  5062. case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
  5063. case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
  5064. case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
  5065. case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
  5066. case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
  5067. case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
  5068. case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
  5069. case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
  5070. return true;
  5071. }
  5072. return false;
  5073. }
  5074. static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
  5075. {
  5076. switch (reg) {
  5077. case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
  5078. case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
  5079. case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
  5080. case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
  5081. case MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET:
  5082. case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
  5083. case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
  5084. case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
  5085. case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
  5086. case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
  5087. case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
  5088. case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
  5089. case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
  5090. case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET:
  5091. case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET:
  5092. case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
  5093. case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
  5094. case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
  5095. case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
  5096. case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
  5097. case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
  5098. case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
  5099. case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
  5100. case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
  5101. case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
  5102. case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
  5103. case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
  5104. case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
  5105. case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
  5106. case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
  5107. case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
  5108. case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
  5109. case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
  5110. case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
  5111. case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
  5112. case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
  5113. case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
  5114. case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
  5115. case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
  5116. case MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET:
  5117. case MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET:
  5118. case MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET:
  5119. case MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET:
  5120. case MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET:
  5121. case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
  5122. case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
  5123. case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
  5124. case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
  5125. case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
  5126. case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
  5127. case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
  5128. case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
  5129. case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
  5130. case MLXPLAT_CPLD_LPC_REG_BRD_OFFSET:
  5131. case MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET:
  5132. case MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET:
  5133. case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
  5134. case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
  5135. case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
  5136. case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
  5137. case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
  5138. case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
  5139. case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
  5140. case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
  5141. case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
  5142. case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
  5143. case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
  5144. case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
  5145. case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
  5146. case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
  5147. case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
  5148. case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
  5149. case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
  5150. case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
  5151. case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
  5152. case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
  5153. case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
  5154. case MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET:
  5155. case MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET:
  5156. case MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET:
  5157. case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
  5158. case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
  5159. case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
  5160. case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
  5161. case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
  5162. case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
  5163. case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
  5164. case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
  5165. case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
  5166. case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
  5167. case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
  5168. case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
  5169. case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
  5170. case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
  5171. case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
  5172. case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
  5173. case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
  5174. case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
  5175. case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
  5176. case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
  5177. case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
  5178. case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
  5179. case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
  5180. case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
  5181. case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
  5182. case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
  5183. case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
  5184. case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
  5185. case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
  5186. case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
  5187. case MLXPLAT_CPLD_LPC_REG_DBG_CTRL_OFFSET:
  5188. case MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET:
  5189. case MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET:
  5190. case MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET:
  5191. case MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET:
  5192. case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
  5193. case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
  5194. case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
  5195. case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
  5196. case MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET:
  5197. case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
  5198. case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
  5199. case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
  5200. case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
  5201. case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
  5202. case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
  5203. case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
  5204. case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
  5205. case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
  5206. case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
  5207. case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
  5208. case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
  5209. case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
  5210. case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
  5211. case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
  5212. case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
  5213. case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
  5214. case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
  5215. case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
  5216. case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
  5217. case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
  5218. case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
  5219. case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
  5220. case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
  5221. case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
  5222. case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
  5223. case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
  5224. case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
  5225. case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
  5226. return true;
  5227. }
  5228. return false;
  5229. }
  5230. static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
  5231. { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
  5232. { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
  5233. { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
  5234. { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
  5235. };
  5236. static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
  5237. { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
  5238. { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
  5239. };
  5240. static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
  5241. { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
  5242. MLXPLAT_CPLD_LOW_AGGRCX_MASK },
  5243. { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
  5244. };
  5245. static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
  5246. { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
  5247. { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
  5248. { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
  5249. { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
  5250. };
  5251. static const struct reg_default mlxplat_mlxcpld_regmap_rack_switch[] = {
  5252. { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT },
  5253. { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
  5254. { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
  5255. { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
  5256. };
  5257. static const struct reg_default mlxplat_mlxcpld_regmap_eth_modular[] = {
  5258. { MLXPLAT_CPLD_LPC_REG_GP2_OFFSET, 0x61 },
  5259. { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
  5260. { MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET, 0x00 },
  5261. { MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET, 0x00 },
  5262. { MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET, 0x00 },
  5263. { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
  5264. { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
  5265. { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
  5266. { MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET,
  5267. MLXPLAT_CPLD_AGGR_MASK_LC_LOW },
  5268. };
  5269. struct mlxplat_mlxcpld_regmap_context {
  5270. void __iomem *base;
  5271. };
  5272. static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
  5273. static int
  5274. mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
  5275. {
  5276. struct mlxplat_mlxcpld_regmap_context *ctx = context;
  5277. *val = ioread8(ctx->base + reg);
  5278. return 0;
  5279. }
  5280. static int
  5281. mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
  5282. {
  5283. struct mlxplat_mlxcpld_regmap_context *ctx = context;
  5284. iowrite8(val, ctx->base + reg);
  5285. return 0;
  5286. }
  5287. static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
  5288. .reg_bits = 8,
  5289. .val_bits = 8,
  5290. .max_register = 255,
  5291. .cache_type = REGCACHE_FLAT,
  5292. .writeable_reg = mlxplat_mlxcpld_writeable_reg,
  5293. .readable_reg = mlxplat_mlxcpld_readable_reg,
  5294. .volatile_reg = mlxplat_mlxcpld_volatile_reg,
  5295. .reg_defaults = mlxplat_mlxcpld_regmap_default,
  5296. .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
  5297. .reg_read = mlxplat_mlxcpld_reg_read,
  5298. .reg_write = mlxplat_mlxcpld_reg_write,
  5299. };
  5300. static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
  5301. .reg_bits = 8,
  5302. .val_bits = 8,
  5303. .max_register = 255,
  5304. .cache_type = REGCACHE_FLAT,
  5305. .writeable_reg = mlxplat_mlxcpld_writeable_reg,
  5306. .readable_reg = mlxplat_mlxcpld_readable_reg,
  5307. .volatile_reg = mlxplat_mlxcpld_volatile_reg,
  5308. .reg_defaults = mlxplat_mlxcpld_regmap_ng,
  5309. .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
  5310. .reg_read = mlxplat_mlxcpld_reg_read,
  5311. .reg_write = mlxplat_mlxcpld_reg_write,
  5312. };
  5313. static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
  5314. .reg_bits = 8,
  5315. .val_bits = 8,
  5316. .max_register = 255,
  5317. .cache_type = REGCACHE_FLAT,
  5318. .writeable_reg = mlxplat_mlxcpld_writeable_reg,
  5319. .readable_reg = mlxplat_mlxcpld_readable_reg,
  5320. .volatile_reg = mlxplat_mlxcpld_volatile_reg,
  5321. .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
  5322. .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
  5323. .reg_read = mlxplat_mlxcpld_reg_read,
  5324. .reg_write = mlxplat_mlxcpld_reg_write,
  5325. };
  5326. static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
  5327. .reg_bits = 8,
  5328. .val_bits = 8,
  5329. .max_register = 255,
  5330. .cache_type = REGCACHE_FLAT,
  5331. .writeable_reg = mlxplat_mlxcpld_writeable_reg,
  5332. .readable_reg = mlxplat_mlxcpld_readable_reg,
  5333. .volatile_reg = mlxplat_mlxcpld_volatile_reg,
  5334. .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
  5335. .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
  5336. .reg_read = mlxplat_mlxcpld_reg_read,
  5337. .reg_write = mlxplat_mlxcpld_reg_write,
  5338. };
  5339. static const struct regmap_config mlxplat_mlxcpld_regmap_config_rack_switch = {
  5340. .reg_bits = 8,
  5341. .val_bits = 8,
  5342. .max_register = 255,
  5343. .cache_type = REGCACHE_FLAT,
  5344. .writeable_reg = mlxplat_mlxcpld_writeable_reg,
  5345. .readable_reg = mlxplat_mlxcpld_readable_reg,
  5346. .volatile_reg = mlxplat_mlxcpld_volatile_reg,
  5347. .reg_defaults = mlxplat_mlxcpld_regmap_rack_switch,
  5348. .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_rack_switch),
  5349. .reg_read = mlxplat_mlxcpld_reg_read,
  5350. .reg_write = mlxplat_mlxcpld_reg_write,
  5351. };
  5352. static const struct regmap_config mlxplat_mlxcpld_regmap_config_eth_modular = {
  5353. .reg_bits = 8,
  5354. .val_bits = 8,
  5355. .max_register = 255,
  5356. .cache_type = REGCACHE_FLAT,
  5357. .writeable_reg = mlxplat_mlxcpld_writeable_reg,
  5358. .readable_reg = mlxplat_mlxcpld_readable_reg,
  5359. .volatile_reg = mlxplat_mlxcpld_volatile_reg,
  5360. .reg_defaults = mlxplat_mlxcpld_regmap_eth_modular,
  5361. .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_eth_modular),
  5362. .reg_read = mlxplat_mlxcpld_reg_read,
  5363. .reg_write = mlxplat_mlxcpld_reg_write,
  5364. };
  5365. static struct resource mlxplat_mlxcpld_resources[] = {
  5366. [0] = DEFINE_RES_IRQ_NAMED(MLXPLAT_CPLD_LPC_SYSIRQ, "mlxreg-hotplug"),
  5367. };
  5368. static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
  5369. static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
  5370. static struct mlxreg_core_platform_data *mlxplat_led;
  5371. static struct mlxreg_core_platform_data *mlxplat_regs_io;
  5372. static struct mlxreg_core_platform_data *mlxplat_fan;
  5373. static struct mlxreg_core_platform_data
  5374. *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
  5375. static const struct regmap_config *mlxplat_regmap_config;
  5376. static struct pci_dev *lpc_bridge;
  5377. static struct pci_dev *i2c_bridge;
  5378. static struct pci_dev *jtag_bridge;
  5379. /* Platform default reset function */
  5380. static int mlxplat_reboot_notifier(struct notifier_block *nb, unsigned long action, void *unused)
  5381. {
  5382. struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
  5383. u32 regval;
  5384. int ret;
  5385. ret = regmap_read(priv->regmap, MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET, &regval);
  5386. if (action == SYS_RESTART && !ret && regval & MLXPLAT_CPLD_SYS_RESET_MASK)
  5387. regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET,
  5388. MLXPLAT_CPLD_RESET_MASK);
  5389. return NOTIFY_DONE;
  5390. }
  5391. static struct notifier_block mlxplat_reboot_default_nb = {
  5392. .notifier_call = mlxplat_reboot_notifier,
  5393. };
  5394. /* Platform default poweroff function */
  5395. static void mlxplat_poweroff(void)
  5396. {
  5397. struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
  5398. if (mlxplat_reboot_nb)
  5399. unregister_reboot_notifier(mlxplat_reboot_nb);
  5400. regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET, MLXPLAT_CPLD_HALT_MASK);
  5401. kernel_halt();
  5402. }
  5403. static int __init mlxplat_register_platform_device(void)
  5404. {
  5405. mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, -1,
  5406. mlxplat_lpc_resources,
  5407. ARRAY_SIZE(mlxplat_lpc_resources));
  5408. if (IS_ERR(mlxplat_dev))
  5409. return PTR_ERR(mlxplat_dev);
  5410. else
  5411. return 1;
  5412. }
  5413. static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
  5414. {
  5415. int i;
  5416. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5417. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5418. mlxplat_mux_data = mlxplat_default_mux_data;
  5419. for (i = 0; i < mlxplat_mux_num; i++) {
  5420. mlxplat_mux_data[i].values = mlxplat_default_channels[i];
  5421. mlxplat_mux_data[i].n_values =
  5422. ARRAY_SIZE(mlxplat_default_channels[i]);
  5423. }
  5424. mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
  5425. mlxplat_hotplug->deferred_nr =
  5426. mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5427. mlxplat_led = &mlxplat_default_led_data;
  5428. mlxplat_regs_io = &mlxplat_default_regs_io_data;
  5429. mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
  5430. mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
  5431. return mlxplat_register_platform_device();
  5432. }
  5433. static int __init mlxplat_dmi_default_wc_matched(const struct dmi_system_id *dmi)
  5434. {
  5435. int i;
  5436. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5437. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5438. mlxplat_mux_data = mlxplat_default_mux_data;
  5439. for (i = 0; i < mlxplat_mux_num; i++) {
  5440. mlxplat_mux_data[i].values = mlxplat_default_channels[i];
  5441. mlxplat_mux_data[i].n_values =
  5442. ARRAY_SIZE(mlxplat_default_channels[i]);
  5443. }
  5444. mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
  5445. mlxplat_hotplug->deferred_nr =
  5446. mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5447. mlxplat_led = &mlxplat_default_led_wc_data;
  5448. mlxplat_regs_io = &mlxplat_default_regs_io_data;
  5449. mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
  5450. mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
  5451. return mlxplat_register_platform_device();
  5452. }
  5453. static int __init mlxplat_dmi_default_eth_wc_blade_matched(const struct dmi_system_id *dmi)
  5454. {
  5455. int i;
  5456. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5457. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5458. mlxplat_mux_data = mlxplat_default_mux_data;
  5459. for (i = 0; i < mlxplat_mux_num; i++) {
  5460. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5461. mlxplat_mux_data[i].n_values =
  5462. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5463. }
  5464. mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
  5465. mlxplat_hotplug->deferred_nr =
  5466. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5467. mlxplat_led = &mlxplat_default_led_eth_wc_blade_data;
  5468. mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
  5469. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5470. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5471. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5472. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
  5473. return mlxplat_register_platform_device();
  5474. }
  5475. static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
  5476. {
  5477. int i;
  5478. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5479. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5480. mlxplat_mux_data = mlxplat_default_mux_data;
  5481. for (i = 0; i < mlxplat_mux_num; i++) {
  5482. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5483. mlxplat_mux_data[i].n_values =
  5484. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5485. }
  5486. mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
  5487. mlxplat_hotplug->deferred_nr =
  5488. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5489. mlxplat_led = &mlxplat_msn21xx_led_data;
  5490. mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
  5491. mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
  5492. mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
  5493. return mlxplat_register_platform_device();
  5494. }
  5495. static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
  5496. {
  5497. int i;
  5498. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5499. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5500. mlxplat_mux_data = mlxplat_default_mux_data;
  5501. for (i = 0; i < mlxplat_mux_num; i++) {
  5502. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5503. mlxplat_mux_data[i].n_values =
  5504. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5505. }
  5506. mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
  5507. mlxplat_hotplug->deferred_nr =
  5508. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5509. mlxplat_led = &mlxplat_default_led_data;
  5510. mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
  5511. mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
  5512. mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
  5513. return mlxplat_register_platform_device();
  5514. }
  5515. static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
  5516. {
  5517. int i;
  5518. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5519. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5520. mlxplat_mux_data = mlxplat_default_mux_data;
  5521. for (i = 0; i < mlxplat_mux_num; i++) {
  5522. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5523. mlxplat_mux_data[i].n_values =
  5524. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5525. }
  5526. mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
  5527. mlxplat_hotplug->deferred_nr =
  5528. mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5529. mlxplat_led = &mlxplat_msn21xx_led_data;
  5530. mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
  5531. mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
  5532. mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
  5533. return mlxplat_register_platform_device();
  5534. }
  5535. static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
  5536. {
  5537. int i;
  5538. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5539. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5540. mlxplat_mux_data = mlxplat_default_mux_data;
  5541. for (i = 0; i < mlxplat_mux_num; i++) {
  5542. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5543. mlxplat_mux_data[i].n_values =
  5544. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5545. }
  5546. mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
  5547. mlxplat_hotplug->deferred_nr =
  5548. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5549. mlxplat_led = &mlxplat_default_ng_led_data;
  5550. mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
  5551. mlxplat_fan = &mlxplat_default_fan_data;
  5552. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5553. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5554. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5555. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
  5556. return mlxplat_register_platform_device();
  5557. }
  5558. static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
  5559. {
  5560. int i;
  5561. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
  5562. mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
  5563. mlxplat_mux_data = mlxplat_extended_mux_data;
  5564. for (i = 0; i < mlxplat_mux_num; i++) {
  5565. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5566. mlxplat_mux_data[i].n_values =
  5567. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5568. }
  5569. mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
  5570. mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
  5571. mlxplat_led = &mlxplat_comex_100G_led_data;
  5572. mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
  5573. mlxplat_fan = &mlxplat_default_fan_data;
  5574. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5575. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5576. mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
  5577. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
  5578. return mlxplat_register_platform_device();
  5579. }
  5580. static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
  5581. {
  5582. int i;
  5583. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5584. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5585. mlxplat_mux_data = mlxplat_default_mux_data;
  5586. for (i = 0; i < mlxplat_mux_num; i++) {
  5587. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5588. mlxplat_mux_data[i].n_values =
  5589. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5590. }
  5591. mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
  5592. mlxplat_hotplug->deferred_nr =
  5593. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5594. mlxplat_led = &mlxplat_default_ng_led_data;
  5595. mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
  5596. mlxplat_fan = &mlxplat_default_fan_data;
  5597. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5598. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5599. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5600. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
  5601. return mlxplat_register_platform_device();
  5602. }
  5603. static int __init mlxplat_dmi_modular_matched(const struct dmi_system_id *dmi)
  5604. {
  5605. int i;
  5606. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5607. mlxplat_mux_num = ARRAY_SIZE(mlxplat_modular_mux_data);
  5608. mlxplat_mux_data = mlxplat_modular_mux_data;
  5609. mlxplat_hotplug = &mlxplat_mlxcpld_modular_data;
  5610. mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR;
  5611. mlxplat_led = &mlxplat_modular_led_data;
  5612. mlxplat_regs_io = &mlxplat_modular_regs_io_data;
  5613. mlxplat_fan = &mlxplat_default_fan_data;
  5614. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5615. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5616. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5617. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_eth_modular;
  5618. return mlxplat_register_platform_device();
  5619. }
  5620. static int __init mlxplat_dmi_chassis_blade_matched(const struct dmi_system_id *dmi)
  5621. {
  5622. int i;
  5623. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5624. mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
  5625. mlxplat_mux_data = mlxplat_default_mux_data;
  5626. mlxplat_hotplug = &mlxplat_mlxcpld_chassis_blade_data;
  5627. mlxplat_hotplug->deferred_nr =
  5628. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5629. for (i = 0; i < mlxplat_mux_num; i++) {
  5630. mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
  5631. mlxplat_mux_data[i].n_values =
  5632. ARRAY_SIZE(mlxplat_msn21xx_channels);
  5633. }
  5634. mlxplat_regs_io = &mlxplat_chassis_blade_regs_io_data;
  5635. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5636. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
  5637. return mlxplat_register_platform_device();
  5638. }
  5639. static int __init mlxplat_dmi_rack_switch_matched(const struct dmi_system_id *dmi)
  5640. {
  5641. int i;
  5642. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5643. mlxplat_mux_num = ARRAY_SIZE(mlxplat_rack_switch_mux_data);
  5644. mlxplat_mux_data = mlxplat_rack_switch_mux_data;
  5645. mlxplat_hotplug = &mlxplat_mlxcpld_rack_switch_data;
  5646. mlxplat_hotplug->deferred_nr =
  5647. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5648. mlxplat_led = &mlxplat_default_ng_led_data;
  5649. mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
  5650. mlxplat_fan = &mlxplat_default_fan_data;
  5651. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5652. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5653. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5654. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_rack_switch;
  5655. return mlxplat_register_platform_device();
  5656. }
  5657. static int __init mlxplat_dmi_ng800_matched(const struct dmi_system_id *dmi)
  5658. {
  5659. int i;
  5660. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5661. mlxplat_mux_num = ARRAY_SIZE(mlxplat_ng800_mux_data);
  5662. mlxplat_mux_data = mlxplat_ng800_mux_data;
  5663. mlxplat_hotplug = &mlxplat_mlxcpld_ng800_data;
  5664. mlxplat_hotplug->deferred_nr =
  5665. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5666. mlxplat_led = &mlxplat_default_ng_led_data;
  5667. mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
  5668. mlxplat_fan = &mlxplat_default_fan_data;
  5669. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5670. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5671. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5672. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
  5673. return mlxplat_register_platform_device();
  5674. }
  5675. static int __init mlxplat_dmi_l1_switch_matched(const struct dmi_system_id *dmi)
  5676. {
  5677. int i;
  5678. mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
  5679. mlxplat_mux_num = ARRAY_SIZE(mlxplat_rack_switch_mux_data);
  5680. mlxplat_mux_data = mlxplat_rack_switch_mux_data;
  5681. mlxplat_hotplug = &mlxplat_mlxcpld_l1_switch_data;
  5682. mlxplat_hotplug->deferred_nr =
  5683. mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
  5684. mlxplat_led = &mlxplat_l1_switch_led_data;
  5685. mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
  5686. mlxplat_fan = &mlxplat_default_fan_data;
  5687. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
  5688. mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
  5689. mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
  5690. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_rack_switch;
  5691. pm_power_off = mlxplat_poweroff;
  5692. mlxplat_reboot_nb = &mlxplat_reboot_default_nb;
  5693. return mlxplat_register_platform_device();
  5694. }
  5695. static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
  5696. {
  5697. .callback = mlxplat_dmi_default_wc_matched,
  5698. .matches = {
  5699. DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
  5700. DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI138"),
  5701. },
  5702. },
  5703. {
  5704. .callback = mlxplat_dmi_default_matched,
  5705. .matches = {
  5706. DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
  5707. },
  5708. },
  5709. {
  5710. .callback = mlxplat_dmi_msn21xx_matched,
  5711. .matches = {
  5712. DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
  5713. },
  5714. },
  5715. {
  5716. .callback = mlxplat_dmi_msn274x_matched,
  5717. .matches = {
  5718. DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
  5719. },
  5720. },
  5721. {
  5722. .callback = mlxplat_dmi_msn201x_matched,
  5723. .matches = {
  5724. DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
  5725. },
  5726. },
  5727. {
  5728. .callback = mlxplat_dmi_default_eth_wc_blade_matched,
  5729. .matches = {
  5730. DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
  5731. DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI139"),
  5732. },
  5733. },
  5734. {
  5735. .callback = mlxplat_dmi_qmb7xx_matched,
  5736. .matches = {
  5737. DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
  5738. },
  5739. },
  5740. {
  5741. .callback = mlxplat_dmi_qmb7xx_matched,
  5742. .matches = {
  5743. DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
  5744. },
  5745. },
  5746. {
  5747. .callback = mlxplat_dmi_comex_matched,
  5748. .matches = {
  5749. DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
  5750. },
  5751. },
  5752. {
  5753. .callback = mlxplat_dmi_rack_switch_matched,
  5754. .matches = {
  5755. DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
  5756. DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI142"),
  5757. },
  5758. },
  5759. {
  5760. .callback = mlxplat_dmi_ng400_matched,
  5761. .matches = {
  5762. DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
  5763. },
  5764. },
  5765. {
  5766. .callback = mlxplat_dmi_modular_matched,
  5767. .matches = {
  5768. DMI_MATCH(DMI_BOARD_NAME, "VMOD0011"),
  5769. },
  5770. },
  5771. {
  5772. .callback = mlxplat_dmi_ng800_matched,
  5773. .matches = {
  5774. DMI_MATCH(DMI_BOARD_NAME, "VMOD0013"),
  5775. },
  5776. },
  5777. {
  5778. .callback = mlxplat_dmi_chassis_blade_matched,
  5779. .matches = {
  5780. DMI_MATCH(DMI_BOARD_NAME, "VMOD0015"),
  5781. },
  5782. },
  5783. {
  5784. .callback = mlxplat_dmi_l1_switch_matched,
  5785. .matches = {
  5786. DMI_MATCH(DMI_BOARD_NAME, "VMOD0017"),
  5787. },
  5788. },
  5789. {
  5790. .callback = mlxplat_dmi_msn274x_matched,
  5791. .matches = {
  5792. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5793. DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
  5794. },
  5795. },
  5796. {
  5797. .callback = mlxplat_dmi_default_matched,
  5798. .matches = {
  5799. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5800. DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
  5801. },
  5802. },
  5803. {
  5804. .callback = mlxplat_dmi_default_matched,
  5805. .matches = {
  5806. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5807. DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
  5808. },
  5809. },
  5810. {
  5811. .callback = mlxplat_dmi_default_matched,
  5812. .matches = {
  5813. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5814. DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
  5815. },
  5816. },
  5817. {
  5818. .callback = mlxplat_dmi_default_matched,
  5819. .matches = {
  5820. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5821. DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
  5822. },
  5823. },
  5824. {
  5825. .callback = mlxplat_dmi_msn21xx_matched,
  5826. .matches = {
  5827. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5828. DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
  5829. },
  5830. },
  5831. {
  5832. .callback = mlxplat_dmi_msn201x_matched,
  5833. .matches = {
  5834. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5835. DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
  5836. },
  5837. },
  5838. {
  5839. .callback = mlxplat_dmi_qmb7xx_matched,
  5840. .matches = {
  5841. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5842. DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
  5843. },
  5844. },
  5845. {
  5846. .callback = mlxplat_dmi_qmb7xx_matched,
  5847. .matches = {
  5848. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5849. DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
  5850. },
  5851. },
  5852. {
  5853. .callback = mlxplat_dmi_qmb7xx_matched,
  5854. .matches = {
  5855. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5856. DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
  5857. },
  5858. },
  5859. {
  5860. .callback = mlxplat_dmi_qmb7xx_matched,
  5861. .matches = {
  5862. DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
  5863. DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
  5864. },
  5865. },
  5866. { }
  5867. };
  5868. MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
  5869. static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
  5870. {
  5871. struct i2c_adapter *search_adap;
  5872. int i, shift = 0;
  5873. /* Scan adapters from expected id to verify it is free. */
  5874. *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
  5875. for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
  5876. mlxplat_max_adap_num; i++) {
  5877. search_adap = i2c_get_adapter(i);
  5878. if (search_adap) {
  5879. i2c_put_adapter(search_adap);
  5880. continue;
  5881. }
  5882. /* Return if expected parent adapter is free. */
  5883. if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
  5884. return 0;
  5885. break;
  5886. }
  5887. /* Return with error if free id for adapter is not found. */
  5888. if (i == mlxplat_max_adap_num)
  5889. return -ENODEV;
  5890. /* Shift adapter ids, since expected parent adapter is not free. */
  5891. *nr = i;
  5892. for (i = 0; i < mlxplat_mux_num; i++) {
  5893. shift = *nr - mlxplat_mux_data[i].parent;
  5894. mlxplat_mux_data[i].parent = *nr;
  5895. mlxplat_mux_data[i].base_nr += shift;
  5896. }
  5897. if (shift > 0)
  5898. mlxplat_hotplug->shift_nr = shift;
  5899. return 0;
  5900. }
  5901. static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
  5902. {
  5903. u32 regval;
  5904. int i, rc;
  5905. rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
  5906. &regval);
  5907. if (rc)
  5908. return rc;
  5909. if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
  5910. for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
  5911. if (mlxplat_wd_data[i])
  5912. mlxplat_wd_data[i] =
  5913. &mlxplat_mlxcpld_wd_set_type3[i];
  5914. }
  5915. }
  5916. return 0;
  5917. }
  5918. static int mlxplat_lpc_cpld_device_init(struct resource **hotplug_resources,
  5919. unsigned int *hotplug_resources_size)
  5920. {
  5921. int err;
  5922. mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
  5923. mlxplat_lpc_resources[1].start, 1);
  5924. if (!mlxplat_mlxcpld_regmap_ctx.base) {
  5925. err = -ENOMEM;
  5926. goto fail_devm_ioport_map;
  5927. }
  5928. *hotplug_resources = mlxplat_mlxcpld_resources;
  5929. *hotplug_resources_size = ARRAY_SIZE(mlxplat_mlxcpld_resources);
  5930. return 0;
  5931. fail_devm_ioport_map:
  5932. return err;
  5933. }
  5934. static void mlxplat_lpc_cpld_device_exit(void)
  5935. {
  5936. }
  5937. static int
  5938. mlxplat_pci_fpga_device_init(unsigned int device, const char *res_name, struct pci_dev **pci_bridge,
  5939. void __iomem **pci_bridge_addr)
  5940. {
  5941. void __iomem *pci_mem_addr;
  5942. struct pci_dev *pci_dev;
  5943. int err;
  5944. pci_dev = pci_get_device(PCI_VENDOR_ID_LATTICE, device, NULL);
  5945. if (!pci_dev)
  5946. return -ENODEV;
  5947. err = pci_enable_device(pci_dev);
  5948. if (err) {
  5949. dev_err(&pci_dev->dev, "pci_enable_device failed with error %d\n", err);
  5950. goto fail_pci_enable_device;
  5951. }
  5952. err = pci_request_region(pci_dev, 0, res_name);
  5953. if (err) {
  5954. dev_err(&pci_dev->dev, "pci_request_regions failed with error %d\n", err);
  5955. goto fail_pci_request_regions;
  5956. }
  5957. err = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64));
  5958. if (err) {
  5959. err = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32));
  5960. if (err) {
  5961. dev_err(&pci_dev->dev, "dma_set_mask failed with error %d\n", err);
  5962. goto fail_pci_set_dma_mask;
  5963. }
  5964. }
  5965. pci_set_master(pci_dev);
  5966. pci_mem_addr = devm_ioremap(&pci_dev->dev, pci_resource_start(pci_dev, 0),
  5967. pci_resource_len(pci_dev, 0));
  5968. if (!pci_mem_addr) {
  5969. dev_err(&mlxplat_dev->dev, "ioremap failed\n");
  5970. err = -EIO;
  5971. goto fail_ioremap;
  5972. }
  5973. *pci_bridge = pci_dev;
  5974. *pci_bridge_addr = pci_mem_addr;
  5975. return 0;
  5976. fail_ioremap:
  5977. fail_pci_set_dma_mask:
  5978. pci_release_regions(pci_dev);
  5979. fail_pci_request_regions:
  5980. pci_disable_device(pci_dev);
  5981. fail_pci_enable_device:
  5982. pci_dev_put(pci_dev);
  5983. return err;
  5984. }
  5985. static void
  5986. mlxplat_pci_fpga_device_exit(struct pci_dev *pci_bridge,
  5987. void __iomem *pci_bridge_addr)
  5988. {
  5989. iounmap(pci_bridge_addr);
  5990. pci_release_regions(pci_bridge);
  5991. pci_disable_device(pci_bridge);
  5992. pci_dev_put(pci_bridge);
  5993. }
  5994. static int
  5995. mlxplat_pci_fpga_devices_init(struct resource **hotplug_resources,
  5996. unsigned int *hotplug_resources_size)
  5997. {
  5998. int err;
  5999. err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_LPC_BRIDGE,
  6000. "mlxplat_lpc_bridge", &lpc_bridge,
  6001. &mlxplat_mlxcpld_regmap_ctx.base);
  6002. if (err)
  6003. goto mlxplat_pci_fpga_device_init_lpc_fail;
  6004. err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_I2C_BRIDGE,
  6005. "mlxplat_i2c_bridge", &i2c_bridge,
  6006. &i2c_bridge_addr);
  6007. if (err)
  6008. goto mlxplat_pci_fpga_device_init_i2c_fail;
  6009. err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_JTAG_BRIDGE,
  6010. "mlxplat_jtag_bridge", &jtag_bridge,
  6011. &jtag_bridge_addr);
  6012. if (err)
  6013. goto mlxplat_pci_fpga_device_init_jtag_fail;
  6014. return 0;
  6015. mlxplat_pci_fpga_device_init_jtag_fail:
  6016. mlxplat_pci_fpga_device_exit(i2c_bridge, i2c_bridge_addr);
  6017. mlxplat_pci_fpga_device_init_i2c_fail:
  6018. mlxplat_pci_fpga_device_exit(lpc_bridge, mlxplat_mlxcpld_regmap_ctx.base);
  6019. mlxplat_pci_fpga_device_init_lpc_fail:
  6020. return err;
  6021. }
  6022. static void mlxplat_pci_fpga_devices_exit(void)
  6023. {
  6024. mlxplat_pci_fpga_device_exit(jtag_bridge, jtag_bridge_addr);
  6025. mlxplat_pci_fpga_device_exit(i2c_bridge, i2c_bridge_addr);
  6026. mlxplat_pci_fpga_device_exit(lpc_bridge, mlxplat_mlxcpld_regmap_ctx.base);
  6027. }
  6028. static int
  6029. mlxplat_logicdev_init(struct resource **hotplug_resources, unsigned int *hotplug_resources_size)
  6030. {
  6031. int err;
  6032. err = mlxplat_pci_fpga_devices_init(hotplug_resources, hotplug_resources_size);
  6033. if (err == -ENODEV)
  6034. return mlxplat_lpc_cpld_device_init(hotplug_resources, hotplug_resources_size);
  6035. return err;
  6036. }
  6037. static void mlxplat_logicdev_exit(void)
  6038. {
  6039. if (lpc_bridge)
  6040. mlxplat_pci_fpga_devices_exit();
  6041. else
  6042. mlxplat_lpc_cpld_device_exit();
  6043. }
  6044. static int mlxplat_platdevs_init(struct mlxplat_priv *priv)
  6045. {
  6046. int i = 0, err;
  6047. /* Add hotplug driver */
  6048. if (mlxplat_hotplug) {
  6049. mlxplat_hotplug->regmap = priv->regmap;
  6050. if (priv->irq_fpga)
  6051. mlxplat_hotplug->irq = priv->irq_fpga;
  6052. priv->pdev_hotplug =
  6053. platform_device_register_resndata(&mlxplat_dev->dev,
  6054. "mlxreg-hotplug", PLATFORM_DEVID_NONE,
  6055. priv->hotplug_resources,
  6056. priv->hotplug_resources_size,
  6057. mlxplat_hotplug, sizeof(*mlxplat_hotplug));
  6058. if (IS_ERR(priv->pdev_hotplug)) {
  6059. err = PTR_ERR(priv->pdev_hotplug);
  6060. goto fail_platform_hotplug_register;
  6061. }
  6062. }
  6063. /* Add LED driver. */
  6064. if (mlxplat_led) {
  6065. mlxplat_led->regmap = priv->regmap;
  6066. priv->pdev_led =
  6067. platform_device_register_resndata(&mlxplat_dev->dev, "leds-mlxreg",
  6068. PLATFORM_DEVID_NONE, NULL, 0, mlxplat_led,
  6069. sizeof(*mlxplat_led));
  6070. if (IS_ERR(priv->pdev_led)) {
  6071. err = PTR_ERR(priv->pdev_led);
  6072. goto fail_platform_leds_register;
  6073. }
  6074. }
  6075. /* Add registers io access driver. */
  6076. if (mlxplat_regs_io) {
  6077. mlxplat_regs_io->regmap = priv->regmap;
  6078. priv->pdev_io_regs = platform_device_register_resndata(&mlxplat_dev->dev,
  6079. "mlxreg-io",
  6080. PLATFORM_DEVID_NONE, NULL,
  6081. 0, mlxplat_regs_io,
  6082. sizeof(*mlxplat_regs_io));
  6083. if (IS_ERR(priv->pdev_io_regs)) {
  6084. err = PTR_ERR(priv->pdev_io_regs);
  6085. goto fail_platform_io_register;
  6086. }
  6087. }
  6088. /* Add FAN driver. */
  6089. if (mlxplat_fan) {
  6090. mlxplat_fan->regmap = priv->regmap;
  6091. priv->pdev_fan = platform_device_register_resndata(&mlxplat_dev->dev, "mlxreg-fan",
  6092. PLATFORM_DEVID_NONE, NULL, 0,
  6093. mlxplat_fan,
  6094. sizeof(*mlxplat_fan));
  6095. if (IS_ERR(priv->pdev_fan)) {
  6096. err = PTR_ERR(priv->pdev_fan);
  6097. goto fail_platform_fan_register;
  6098. }
  6099. }
  6100. /* Add WD drivers. */
  6101. err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
  6102. if (err)
  6103. goto fail_platform_wd_register;
  6104. for (i = 0; i < MLXPLAT_CPLD_WD_MAX_DEVS; i++) {
  6105. if (mlxplat_wd_data[i]) {
  6106. mlxplat_wd_data[i]->regmap = priv->regmap;
  6107. priv->pdev_wd[i] =
  6108. platform_device_register_resndata(&mlxplat_dev->dev, "mlx-wdt", i,
  6109. NULL, 0, mlxplat_wd_data[i],
  6110. sizeof(*mlxplat_wd_data[i]));
  6111. if (IS_ERR(priv->pdev_wd[i])) {
  6112. err = PTR_ERR(priv->pdev_wd[i]);
  6113. goto fail_platform_wd_register;
  6114. }
  6115. }
  6116. }
  6117. return 0;
  6118. fail_platform_wd_register:
  6119. while (--i >= 0)
  6120. platform_device_unregister(priv->pdev_wd[i]);
  6121. fail_platform_fan_register:
  6122. if (mlxplat_regs_io)
  6123. platform_device_unregister(priv->pdev_io_regs);
  6124. fail_platform_io_register:
  6125. if (mlxplat_led)
  6126. platform_device_unregister(priv->pdev_led);
  6127. fail_platform_leds_register:
  6128. if (mlxplat_hotplug)
  6129. platform_device_unregister(priv->pdev_hotplug);
  6130. fail_platform_hotplug_register:
  6131. return err;
  6132. }
  6133. static void mlxplat_platdevs_exit(struct mlxplat_priv *priv)
  6134. {
  6135. int i;
  6136. for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
  6137. platform_device_unregister(priv->pdev_wd[i]);
  6138. if (priv->pdev_fan)
  6139. platform_device_unregister(priv->pdev_fan);
  6140. if (priv->pdev_io_regs)
  6141. platform_device_unregister(priv->pdev_io_regs);
  6142. if (priv->pdev_led)
  6143. platform_device_unregister(priv->pdev_led);
  6144. if (priv->pdev_hotplug)
  6145. platform_device_unregister(priv->pdev_hotplug);
  6146. }
  6147. static int
  6148. mlxplat_i2c_mux_complition_notify(void *handle, struct i2c_adapter *parent,
  6149. struct i2c_adapter *adapters[])
  6150. {
  6151. struct mlxplat_priv *priv = handle;
  6152. return mlxplat_platdevs_init(priv);
  6153. }
  6154. static int mlxplat_i2c_mux_topology_init(struct mlxplat_priv *priv)
  6155. {
  6156. int i, err;
  6157. if (!priv->pdev_i2c) {
  6158. priv->i2c_main_init_status = MLXPLAT_I2C_MAIN_BUS_NOTIFIED;
  6159. return 0;
  6160. }
  6161. priv->i2c_main_init_status = MLXPLAT_I2C_MAIN_BUS_HANDLE_CREATED;
  6162. for (i = 0; i < mlxplat_mux_num; i++) {
  6163. priv->pdev_mux[i] = platform_device_register_resndata(&priv->pdev_i2c->dev,
  6164. "i2c-mux-reg", i, NULL, 0,
  6165. &mlxplat_mux_data[i],
  6166. sizeof(mlxplat_mux_data[i]));
  6167. if (IS_ERR(priv->pdev_mux[i])) {
  6168. err = PTR_ERR(priv->pdev_mux[i]);
  6169. goto fail_platform_mux_register;
  6170. }
  6171. }
  6172. return mlxplat_i2c_mux_complition_notify(priv, NULL, NULL);
  6173. fail_platform_mux_register:
  6174. while (--i >= 0)
  6175. platform_device_unregister(priv->pdev_mux[i]);
  6176. return err;
  6177. }
  6178. static void mlxplat_i2c_mux_topology_exit(struct mlxplat_priv *priv)
  6179. {
  6180. int i;
  6181. for (i = mlxplat_mux_num - 1; i >= 0 ; i--) {
  6182. if (priv->pdev_mux[i])
  6183. platform_device_unregister(priv->pdev_mux[i]);
  6184. }
  6185. }
  6186. static int mlxplat_i2c_main_completion_notify(void *handle, int id)
  6187. {
  6188. struct mlxplat_priv *priv = handle;
  6189. return mlxplat_i2c_mux_topology_init(priv);
  6190. }
  6191. static int mlxplat_i2c_main_init(struct mlxplat_priv *priv)
  6192. {
  6193. int nr, err;
  6194. if (!mlxplat_i2c)
  6195. return 0;
  6196. err = mlxplat_mlxcpld_verify_bus_topology(&nr);
  6197. if (nr < 0)
  6198. goto fail_mlxplat_mlxcpld_verify_bus_topology;
  6199. nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
  6200. mlxplat_i2c->regmap = priv->regmap;
  6201. mlxplat_i2c->handle = priv;
  6202. /* Set mapped base address of I2C-LPC bridge over PCIe */
  6203. if (lpc_bridge)
  6204. mlxplat_i2c->addr = i2c_bridge_addr;
  6205. priv->pdev_i2c = platform_device_register_resndata(&mlxplat_dev->dev, "i2c_mlxcpld",
  6206. nr, priv->hotplug_resources,
  6207. priv->hotplug_resources_size,
  6208. mlxplat_i2c, sizeof(*mlxplat_i2c));
  6209. if (IS_ERR(priv->pdev_i2c)) {
  6210. err = PTR_ERR(priv->pdev_i2c);
  6211. goto fail_platform_i2c_register;
  6212. }
  6213. if (priv->i2c_main_init_status == MLXPLAT_I2C_MAIN_BUS_NOTIFIED) {
  6214. err = mlxplat_i2c_mux_topology_init(priv);
  6215. if (err)
  6216. goto fail_mlxplat_i2c_mux_topology_init;
  6217. }
  6218. return 0;
  6219. fail_mlxplat_i2c_mux_topology_init:
  6220. platform_device_unregister(priv->pdev_i2c);
  6221. fail_platform_i2c_register:
  6222. fail_mlxplat_mlxcpld_verify_bus_topology:
  6223. return err;
  6224. }
  6225. static void mlxplat_i2c_main_exit(struct mlxplat_priv *priv)
  6226. {
  6227. mlxplat_platdevs_exit(priv);
  6228. mlxplat_i2c_mux_topology_exit(priv);
  6229. if (priv->pdev_i2c)
  6230. platform_device_unregister(priv->pdev_i2c);
  6231. }
  6232. static int mlxplat_probe(struct platform_device *pdev)
  6233. {
  6234. unsigned int hotplug_resources_size = 0;
  6235. struct resource *hotplug_resources = NULL;
  6236. struct acpi_device *acpi_dev;
  6237. struct mlxplat_priv *priv;
  6238. int irq_fpga = 0, i, err;
  6239. acpi_dev = ACPI_COMPANION(&pdev->dev);
  6240. if (acpi_dev) {
  6241. irq_fpga = acpi_dev_gpio_irq_get(acpi_dev, 0);
  6242. if (irq_fpga < 0)
  6243. return -ENODEV;
  6244. mlxplat_dev = pdev;
  6245. }
  6246. err = mlxplat_logicdev_init(&hotplug_resources, &hotplug_resources_size);
  6247. if (err)
  6248. return err;
  6249. priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
  6250. GFP_KERNEL);
  6251. if (!priv) {
  6252. err = -ENOMEM;
  6253. goto fail_alloc;
  6254. }
  6255. platform_set_drvdata(mlxplat_dev, priv);
  6256. priv->hotplug_resources = hotplug_resources;
  6257. priv->hotplug_resources_size = hotplug_resources_size;
  6258. priv->irq_fpga = irq_fpga;
  6259. if (!mlxplat_regmap_config)
  6260. mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
  6261. priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
  6262. &mlxplat_mlxcpld_regmap_ctx,
  6263. mlxplat_regmap_config);
  6264. if (IS_ERR(priv->regmap)) {
  6265. err = PTR_ERR(priv->regmap);
  6266. goto fail_alloc;
  6267. }
  6268. /* Set default registers. */
  6269. for (i = 0; i < mlxplat_regmap_config->num_reg_defaults; i++) {
  6270. err = regmap_write(priv->regmap,
  6271. mlxplat_regmap_config->reg_defaults[i].reg,
  6272. mlxplat_regmap_config->reg_defaults[i].def);
  6273. if (err)
  6274. goto fail_regmap_write;
  6275. }
  6276. err = mlxplat_i2c_main_init(priv);
  6277. if (err)
  6278. goto fail_mlxplat_i2c_main_init;
  6279. /* Sync registers with hardware. */
  6280. regcache_mark_dirty(priv->regmap);
  6281. err = regcache_sync(priv->regmap);
  6282. if (err)
  6283. goto fail_regcache_sync;
  6284. if (mlxplat_reboot_nb) {
  6285. err = register_reboot_notifier(mlxplat_reboot_nb);
  6286. if (err)
  6287. goto fail_register_reboot_notifier;
  6288. }
  6289. return 0;
  6290. fail_register_reboot_notifier:
  6291. fail_regcache_sync:
  6292. mlxplat_i2c_main_exit(priv);
  6293. fail_mlxplat_i2c_main_init:
  6294. fail_regmap_write:
  6295. fail_alloc:
  6296. mlxplat_logicdev_exit();
  6297. return err;
  6298. }
  6299. static void mlxplat_remove(struct platform_device *pdev)
  6300. {
  6301. struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
  6302. if (pm_power_off)
  6303. pm_power_off = NULL;
  6304. if (mlxplat_reboot_nb)
  6305. unregister_reboot_notifier(mlxplat_reboot_nb);
  6306. mlxplat_i2c_main_exit(priv);
  6307. mlxplat_logicdev_exit();
  6308. }
  6309. static const struct acpi_device_id mlxplat_acpi_table[] = {
  6310. { "MLNXBF49", 0 },
  6311. {}
  6312. };
  6313. MODULE_DEVICE_TABLE(acpi, mlxplat_acpi_table);
  6314. static struct platform_driver mlxplat_driver = {
  6315. .driver = {
  6316. .name = "mlxplat",
  6317. .acpi_match_table = mlxplat_acpi_table,
  6318. .probe_type = PROBE_FORCE_SYNCHRONOUS,
  6319. },
  6320. .probe = mlxplat_probe,
  6321. .remove_new = mlxplat_remove,
  6322. };
  6323. static int __init mlxplat_init(void)
  6324. {
  6325. int err;
  6326. if (!dmi_check_system(mlxplat_dmi_table))
  6327. return -ENODEV;
  6328. err = platform_driver_register(&mlxplat_driver);
  6329. if (err)
  6330. return err;
  6331. return 0;
  6332. }
  6333. module_init(mlxplat_init);
  6334. static void __exit mlxplat_exit(void)
  6335. {
  6336. if (mlxplat_dev)
  6337. platform_device_unregister(mlxplat_dev);
  6338. platform_driver_unregister(&mlxplat_driver);
  6339. }
  6340. module_exit(mlxplat_exit);
  6341. MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");
  6342. MODULE_DESCRIPTION("Mellanox platform driver");
  6343. MODULE_LICENSE("Dual BSD/GPL");