| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454 |
- // SPDX-License-Identifier: GPL-2.0-only
- /*
- * Cadence Torrent SD0801 PHY driver.
- *
- * Copyright 2018 Cadence Design Systems, Inc.
- *
- */
- #include <dt-bindings/phy/phy.h>
- #include <dt-bindings/phy/phy-cadence.h>
- #include <linux/clk.h>
- #include <linux/clk-provider.h>
- #include <linux/delay.h>
- #include <linux/err.h>
- #include <linux/io.h>
- #include <linux/iopoll.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/of.h>
- #include <linux/phy/phy.h>
- #include <linux/platform_device.h>
- #include <linux/reset.h>
- #include <linux/regmap.h>
- #define REF_CLK_19_2MHZ 19200000
- #define REF_CLK_25MHZ 25000000
- #define REF_CLK_100MHZ 100000000
- #define REF_CLK_156_25MHZ 156250000
- #define MAX_NUM_LANES 4
- #define DEFAULT_MAX_BIT_RATE 8100 /* in Mbps */
- #define POLL_TIMEOUT_US 5000
- #define PLL_LOCK_TIMEOUT 100000
- #define DP_PLL0 BIT(0)
- #define DP_PLL1 BIT(1)
- #define TORRENT_COMMON_CDB_OFFSET 0x0
- #define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \
- ((0x4000 << (block_offset)) + \
- (((ln) << 9) << (reg_offset)))
- #define TORRENT_RX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \
- ((0x8000 << (block_offset)) + \
- (((ln) << 9) << (reg_offset)))
- #define TORRENT_PHY_PCS_COMMON_OFFSET(block_offset) \
- (0xC000 << (block_offset))
- #define TORRENT_PHY_PCS_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \
- ((0xD000 << (block_offset)) + \
- (((ln) << 8) << (reg_offset)))
- #define TORRENT_PHY_PMA_COMMON_OFFSET(block_offset) \
- (0xE000 << (block_offset))
- #define TORRENT_DPTX_PHY_OFFSET 0x0
- /*
- * register offsets from DPTX PHY register block base (i.e MHDP
- * register base + 0x30a00)
- */
- #define PHY_AUX_CTRL 0x04
- #define PHY_RESET 0x20
- #define PMA_TX_ELEC_IDLE_SHIFT 4
- #define PHY_PMA_XCVR_PLLCLK_EN 0x24
- #define PHY_PMA_XCVR_PLLCLK_EN_ACK 0x28
- #define PHY_PMA_XCVR_POWER_STATE_REQ 0x2c
- #define PHY_POWER_STATE_LN(ln) ((ln) * 8)
- #define PMA_XCVR_POWER_STATE_REQ_LN_MASK 0x3FU
- #define PHY_PMA_XCVR_POWER_STATE_ACK 0x30
- #define PHY_PMA_CMN_READY 0x34
- /*
- * register offsets from SD0801 PHY register block base (i.e MHDP
- * register base + 0x500000)
- */
- #define CMN_SSM_BANDGAP_TMR 0x0021U
- #define CMN_SSM_BIAS_TMR 0x0022U
- #define CMN_PLLSM0_PLLPRE_TMR 0x002AU
- #define CMN_PLLSM0_PLLLOCK_TMR 0x002CU
- #define CMN_PLLSM1_PLLPRE_TMR 0x0032U
- #define CMN_PLLSM1_PLLLOCK_TMR 0x0034U
- #define CMN_CDIAG_CDB_PWRI_OVRD 0x0041U
- #define CMN_CDIAG_XCVRC_PWRI_OVRD 0x0047U
- #define CMN_CDIAG_REFCLK_OVRD 0x004CU
- #define CMN_CDIAG_REFCLK_DRV0_CTRL 0x0050U
- #define CMN_BGCAL_INIT_TMR 0x0064U
- #define CMN_BGCAL_ITER_TMR 0x0065U
- #define CMN_IBCAL_INIT_TMR 0x0074U
- #define CMN_PLL0_VCOCAL_TCTRL 0x0082U
- #define CMN_PLL0_VCOCAL_INIT_TMR 0x0084U
- #define CMN_PLL0_VCOCAL_ITER_TMR 0x0085U
- #define CMN_PLL0_VCOCAL_REFTIM_START 0x0086U
- #define CMN_PLL0_VCOCAL_PLLCNT_START 0x0088U
- #define CMN_PLL0_INTDIV_M0 0x0090U
- #define CMN_PLL0_FRACDIVL_M0 0x0091U
- #define CMN_PLL0_FRACDIVH_M0 0x0092U
- #define CMN_PLL0_HIGH_THR_M0 0x0093U
- #define CMN_PLL0_DSM_DIAG_M0 0x0094U
- #define CMN_PLL0_DSM_FBH_OVRD_M0 0x0095U
- #define CMN_PLL0_DSM_FBL_OVRD_M0 0x0096U
- #define CMN_PLL0_SS_CTRL1_M0 0x0098U
- #define CMN_PLL0_SS_CTRL2_M0 0x0099U
- #define CMN_PLL0_SS_CTRL3_M0 0x009AU
- #define CMN_PLL0_SS_CTRL4_M0 0x009BU
- #define CMN_PLL0_LOCK_REFCNT_START 0x009CU
- #define CMN_PLL0_LOCK_PLLCNT_START 0x009EU
- #define CMN_PLL0_LOCK_PLLCNT_THR 0x009FU
- #define CMN_PLL0_INTDIV_M1 0x00A0U
- #define CMN_PLL0_FRACDIVH_M1 0x00A2U
- #define CMN_PLL0_HIGH_THR_M1 0x00A3U
- #define CMN_PLL0_DSM_DIAG_M1 0x00A4U
- #define CMN_PLL0_SS_CTRL1_M1 0x00A8U
- #define CMN_PLL0_SS_CTRL2_M1 0x00A9U
- #define CMN_PLL0_SS_CTRL3_M1 0x00AAU
- #define CMN_PLL0_SS_CTRL4_M1 0x00ABU
- #define CMN_PLL1_VCOCAL_TCTRL 0x00C2U
- #define CMN_PLL1_VCOCAL_INIT_TMR 0x00C4U
- #define CMN_PLL1_VCOCAL_ITER_TMR 0x00C5U
- #define CMN_PLL1_VCOCAL_REFTIM_START 0x00C6U
- #define CMN_PLL1_VCOCAL_PLLCNT_START 0x00C8U
- #define CMN_PLL1_INTDIV_M0 0x00D0U
- #define CMN_PLL1_FRACDIVL_M0 0x00D1U
- #define CMN_PLL1_FRACDIVH_M0 0x00D2U
- #define CMN_PLL1_HIGH_THR_M0 0x00D3U
- #define CMN_PLL1_DSM_DIAG_M0 0x00D4U
- #define CMN_PLL1_DSM_FBH_OVRD_M0 0x00D5U
- #define CMN_PLL1_DSM_FBL_OVRD_M0 0x00D6U
- #define CMN_PLL1_SS_CTRL1_M0 0x00D8U
- #define CMN_PLL1_SS_CTRL2_M0 0x00D9U
- #define CMN_PLL1_SS_CTRL3_M0 0x00DAU
- #define CMN_PLL1_SS_CTRL4_M0 0x00DBU
- #define CMN_PLL1_LOCK_REFCNT_START 0x00DCU
- #define CMN_PLL1_LOCK_PLLCNT_START 0x00DEU
- #define CMN_PLL1_LOCK_PLLCNT_THR 0x00DFU
- #define CMN_TXPUCAL_TUNE 0x0103U
- #define CMN_TXPUCAL_INIT_TMR 0x0104U
- #define CMN_TXPUCAL_ITER_TMR 0x0105U
- #define CMN_TXPDCAL_TUNE 0x010BU
- #define CMN_TXPDCAL_INIT_TMR 0x010CU
- #define CMN_TXPDCAL_ITER_TMR 0x010DU
- #define CMN_RXCAL_INIT_TMR 0x0114U
- #define CMN_RXCAL_ITER_TMR 0x0115U
- #define CMN_SD_CAL_INIT_TMR 0x0124U
- #define CMN_SD_CAL_ITER_TMR 0x0125U
- #define CMN_SD_CAL_REFTIM_START 0x0126U
- #define CMN_SD_CAL_PLLCNT_START 0x0128U
- #define CMN_PDIAG_PLL0_CTRL_M0 0x01A0U
- #define CMN_PDIAG_PLL0_CLK_SEL_M0 0x01A1U
- #define CMN_PDIAG_PLL0_CP_PADJ_M0 0x01A4U
- #define CMN_PDIAG_PLL0_CP_IADJ_M0 0x01A5U
- #define CMN_PDIAG_PLL0_FILT_PADJ_M0 0x01A6U
- #define CMN_PDIAG_PLL0_CTRL_M1 0x01B0U
- #define CMN_PDIAG_PLL0_CLK_SEL_M1 0x01B1U
- #define CMN_PDIAG_PLL0_CP_PADJ_M1 0x01B4U
- #define CMN_PDIAG_PLL0_CP_IADJ_M1 0x01B5U
- #define CMN_PDIAG_PLL0_FILT_PADJ_M1 0x01B6U
- #define CMN_PDIAG_PLL1_CTRL_M0 0x01C0U
- #define CMN_PDIAG_PLL1_CLK_SEL_M0 0x01C1U
- #define CMN_PDIAG_PLL1_CP_PADJ_M0 0x01C4U
- #define CMN_PDIAG_PLL1_CP_IADJ_M0 0x01C5U
- #define CMN_PDIAG_PLL1_FILT_PADJ_M0 0x01C6U
- #define CMN_DIAG_BIAS_OVRD1 0x01E1U
- /* PMA TX Lane registers */
- #define TX_TXCC_CTRL 0x0040U
- #define TX_TXCC_CPOST_MULT_00 0x004CU
- #define TX_TXCC_CPOST_MULT_01 0x004DU
- #define TX_TXCC_MGNFS_MULT_000 0x0050U
- #define TX_TXCC_MGNFS_MULT_100 0x0054U
- #define DRV_DIAG_TX_DRV 0x00C6U
- #define XCVR_DIAG_PLLDRC_CTRL 0x00E5U
- #define XCVR_DIAG_HSCLK_SEL 0x00E6U
- #define XCVR_DIAG_HSCLK_DIV 0x00E7U
- #define XCVR_DIAG_RXCLK_CTRL 0x00E9U
- #define XCVR_DIAG_BIDI_CTRL 0x00EAU
- #define XCVR_DIAG_PSC_OVRD 0x00EBU
- #define TX_PSC_A0 0x0100U
- #define TX_PSC_A1 0x0101U
- #define TX_PSC_A2 0x0102U
- #define TX_PSC_A3 0x0103U
- #define TX_RCVDET_ST_TMR 0x0123U
- #define TX_DIAG_ACYA 0x01E7U
- #define TX_DIAG_ACYA_HBDC_MASK 0x0001U
- /* PMA RX Lane registers */
- #define RX_PSC_A0 0x0000U
- #define RX_PSC_A1 0x0001U
- #define RX_PSC_A2 0x0002U
- #define RX_PSC_A3 0x0003U
- #define RX_PSC_CAL 0x0006U
- #define RX_SDCAL0_INIT_TMR 0x0044U
- #define RX_SDCAL0_ITER_TMR 0x0045U
- #define RX_SDCAL1_INIT_TMR 0x004CU
- #define RX_SDCAL1_ITER_TMR 0x004DU
- #define RX_CDRLF_CNFG 0x0080U
- #define RX_CDRLF_CNFG3 0x0082U
- #define RX_SIGDET_HL_FILT_TMR 0x0090U
- #define RX_REE_GCSM1_CTRL 0x0108U
- #define RX_REE_GCSM1_EQENM_PH1 0x0109U
- #define RX_REE_GCSM1_EQENM_PH2 0x010AU
- #define RX_REE_GCSM2_CTRL 0x0110U
- #define RX_REE_PERGCSM_CTRL 0x0118U
- #define RX_REE_ATTEN_THR 0x0149U
- #define RX_REE_TAP1_CLIP 0x0171U
- #define RX_REE_TAP2TON_CLIP 0x0172U
- #define RX_REE_SMGM_CTRL1 0x0177U
- #define RX_REE_SMGM_CTRL2 0x0178U
- #define RX_DIAG_DFE_CTRL 0x01E0U
- #define RX_DIAG_DFE_AMP_TUNE_2 0x01E2U
- #define RX_DIAG_DFE_AMP_TUNE_3 0x01E3U
- #define RX_DIAG_NQST_CTRL 0x01E5U
- #define RX_DIAG_SIGDET_TUNE 0x01E8U
- #define RX_DIAG_PI_RATE 0x01F4U
- #define RX_DIAG_PI_CAP 0x01F5U
- #define RX_DIAG_ACYA 0x01FFU
- /* PHY PCS common registers */
- #define PHY_PIPE_CMN_CTRL1 0x0000U
- #define PHY_PLL_CFG 0x000EU
- #define PHY_PIPE_USB3_GEN2_PRE_CFG0 0x0020U
- #define PHY_PIPE_USB3_GEN2_POST_CFG0 0x0022U
- #define PHY_PIPE_USB3_GEN2_POST_CFG1 0x0023U
- /* PHY PCS lane registers */
- #define PHY_PCS_ISO_LINK_CTRL 0x000BU
- /* PHY PMA common registers */
- #define PHY_PMA_CMN_CTRL1 0x0000U
- #define PHY_PMA_CMN_CTRL2 0x0001U
- #define PHY_PMA_PLL_RAW_CTRL 0x0003U
- #define CDNS_TORRENT_OUTPUT_CLOCKS 3
- static const char * const clk_names[] = {
- [CDNS_TORRENT_REFCLK_DRIVER] = "refclk-driver",
- [CDNS_TORRENT_DERIVED_REFCLK] = "refclk-der",
- [CDNS_TORRENT_RECEIVED_REFCLK] = "refclk-rec",
- };
- static const struct reg_field phy_pll_cfg =
- REG_FIELD(PHY_PLL_CFG, 0, 1);
- static const struct reg_field phy_pma_cmn_ctrl_1 =
- REG_FIELD(PHY_PMA_CMN_CTRL1, 0, 0);
- static const struct reg_field phy_pma_cmn_ctrl_2 =
- REG_FIELD(PHY_PMA_CMN_CTRL2, 0, 7);
- static const struct reg_field phy_pma_pll_raw_ctrl =
- REG_FIELD(PHY_PMA_PLL_RAW_CTRL, 0, 1);
- static const struct reg_field phy_reset_ctrl =
- REG_FIELD(PHY_RESET, 8, 8);
- static const struct reg_field phy_pcs_iso_link_ctrl_1 =
- REG_FIELD(PHY_PCS_ISO_LINK_CTRL, 1, 1);
- static const struct reg_field phy_pipe_cmn_ctrl1_0 = REG_FIELD(PHY_PIPE_CMN_CTRL1, 0, 0);
- static const struct reg_field cmn_cdiag_refclk_ovrd_4 =
- REG_FIELD(CMN_CDIAG_REFCLK_OVRD, 4, 4);
- #define REFCLK_OUT_NUM_CMN_CONFIG 4
- enum cdns_torrent_refclk_out_cmn {
- CMN_CDIAG_REFCLK_DRV0_CTRL_1,
- CMN_CDIAG_REFCLK_DRV0_CTRL_4,
- CMN_CDIAG_REFCLK_DRV0_CTRL_5,
- CMN_CDIAG_REFCLK_DRV0_CTRL_6,
- };
- static const struct reg_field refclk_out_cmn_cfg[] = {
- [CMN_CDIAG_REFCLK_DRV0_CTRL_1] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 1, 1),
- [CMN_CDIAG_REFCLK_DRV0_CTRL_4] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 4, 4),
- [CMN_CDIAG_REFCLK_DRV0_CTRL_5] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 5, 5),
- [CMN_CDIAG_REFCLK_DRV0_CTRL_6] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 6, 6),
- };
- static const int refclk_driver_parent_index[] = {
- CDNS_TORRENT_DERIVED_REFCLK,
- CDNS_TORRENT_RECEIVED_REFCLK
- };
- static const u32 cdns_torrent_refclk_driver_mux_table[] = { 1, 0 };
- enum cdns_torrent_phy_type {
- TYPE_NONE,
- TYPE_DP,
- TYPE_PCIE,
- TYPE_SGMII,
- TYPE_QSGMII,
- TYPE_USB,
- TYPE_USXGMII,
- };
- enum cdns_torrent_ref_clk {
- CLK_19_2_MHZ,
- CLK_25_MHZ,
- CLK_100_MHZ,
- CLK_156_25_MHZ,
- CLK_ANY,
- };
- enum cdns_torrent_ssc_mode {
- NO_SSC,
- EXTERNAL_SSC,
- INTERNAL_SSC,
- ANY_SSC,
- };
- /* Unique key id for vals table entry
- * REFCLK0_RATE | REFCLK1_RATE | LINK0_TYPE | LINK1_TYPE | SSC_TYPE
- */
- #define REFCLK0_SHIFT 12
- #define REFCLK0_MASK GENMASK(14, 12)
- #define REFCLK1_SHIFT 9
- #define REFCLK1_MASK GENMASK(11, 9)
- #define LINK0_SHIFT 6
- #define LINK0_MASK GENMASK(8, 6)
- #define LINK1_SHIFT 3
- #define LINK1_MASK GENMASK(5, 3)
- #define SSC_SHIFT 0
- #define SSC_MASK GENMASK(2, 0)
- #define CDNS_TORRENT_KEY(refclk0, refclk1, link0, link1, ssc) \
- ((((refclk0) << REFCLK0_SHIFT) & REFCLK0_MASK) | \
- (((refclk1) << REFCLK1_SHIFT) & REFCLK1_MASK) | \
- (((link0) << LINK0_SHIFT) & LINK0_MASK) | \
- (((link1) << LINK1_SHIFT) & LINK1_MASK) | \
- (((ssc) << SSC_SHIFT) & SSC_MASK))
- #define CDNS_TORRENT_KEY_ANYCLK(link0, link1) \
- CDNS_TORRENT_KEY(CLK_ANY, CLK_ANY, \
- (link0), (link1), ANY_SSC)
- struct cdns_torrent_inst {
- struct phy *phy;
- u32 mlane;
- enum cdns_torrent_phy_type phy_type;
- u32 num_lanes;
- struct reset_control *lnk_rst;
- enum cdns_torrent_ssc_mode ssc_mode;
- };
- struct cdns_torrent_phy {
- void __iomem *base; /* DPTX registers base */
- void __iomem *sd_base; /* SD0801 registers base */
- u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */
- u32 dp_pll;
- u32 protocol_bitmask;
- struct reset_control *phy_rst;
- struct reset_control *apb_rst;
- struct device *dev;
- struct clk *clk;
- struct clk *clk1;
- enum cdns_torrent_ref_clk ref_clk_rate;
- enum cdns_torrent_ref_clk ref_clk1_rate;
- struct cdns_torrent_inst phys[MAX_NUM_LANES];
- int nsubnodes;
- int already_configured;
- const struct cdns_torrent_data *init_data;
- struct regmap *regmap_common_cdb;
- struct regmap *regmap_phy_pcs_common_cdb;
- struct regmap *regmap_phy_pma_common_cdb;
- struct regmap *regmap_tx_lane_cdb[MAX_NUM_LANES];
- struct regmap *regmap_rx_lane_cdb[MAX_NUM_LANES];
- struct regmap *regmap_phy_pcs_lane_cdb[MAX_NUM_LANES];
- struct regmap *regmap_dptx_phy_reg;
- struct regmap_field *phy_pll_cfg;
- struct regmap_field *phy_pipe_cmn_ctrl1_0;
- struct regmap_field *cmn_cdiag_refclk_ovrd_4;
- struct regmap_field *phy_pma_cmn_ctrl_1;
- struct regmap_field *phy_pma_cmn_ctrl_2;
- struct regmap_field *phy_pma_pll_raw_ctrl;
- struct regmap_field *phy_reset_ctrl;
- struct regmap_field *phy_pcs_iso_link_ctrl_1[MAX_NUM_LANES];
- struct clk_hw_onecell_data *clk_hw_data;
- };
- enum phy_powerstate {
- POWERSTATE_A0 = 0,
- /* Powerstate A1 is unused */
- POWERSTATE_A2 = 2,
- POWERSTATE_A3 = 3,
- };
- struct cdns_torrent_refclk_driver {
- struct clk_hw hw;
- struct regmap_field *cmn_fields[REFCLK_OUT_NUM_CMN_CONFIG];
- struct clk_init_data clk_data;
- };
- #define to_cdns_torrent_refclk_driver(_hw) \
- container_of(_hw, struct cdns_torrent_refclk_driver, hw)
- struct cdns_torrent_derived_refclk {
- struct clk_hw hw;
- struct regmap_field *phy_pipe_cmn_ctrl1_0;
- struct regmap_field *cmn_cdiag_refclk_ovrd_4;
- struct clk_init_data clk_data;
- };
- #define to_cdns_torrent_derived_refclk(_hw) \
- container_of(_hw, struct cdns_torrent_derived_refclk, hw)
- struct cdns_torrent_received_refclk {
- struct clk_hw hw;
- struct regmap_field *phy_pipe_cmn_ctrl1_0;
- struct regmap_field *cmn_cdiag_refclk_ovrd_4;
- struct clk_init_data clk_data;
- };
- #define to_cdns_torrent_received_refclk(_hw) \
- container_of(_hw, struct cdns_torrent_received_refclk, hw)
- struct cdns_reg_pairs {
- u32 val;
- u32 off;
- };
- struct cdns_torrent_vals {
- const struct cdns_reg_pairs *reg_pairs;
- u32 num_regs;
- };
- struct cdns_torrent_vals_entry {
- u32 key;
- const struct cdns_torrent_vals *vals;
- };
- struct cdns_torrent_vals_table {
- const struct cdns_torrent_vals_entry *entries;
- u32 num_entries;
- };
- struct cdns_torrent_data {
- u8 block_offset_shift;
- u8 reg_offset_shift;
- struct cdns_torrent_vals_table link_cmn_vals_tbl;
- struct cdns_torrent_vals_table xcvr_diag_vals_tbl;
- struct cdns_torrent_vals_table pcs_cmn_vals_tbl;
- struct cdns_torrent_vals_table phy_pma_cmn_vals_tbl;
- struct cdns_torrent_vals_table cmn_vals_tbl;
- struct cdns_torrent_vals_table tx_ln_vals_tbl;
- struct cdns_torrent_vals_table rx_ln_vals_tbl;
- };
- struct cdns_regmap_cdb_context {
- struct device *dev;
- void __iomem *base;
- u8 reg_offset_shift;
- };
- static const struct cdns_torrent_vals *cdns_torrent_get_tbl_vals(const struct cdns_torrent_vals_table *tbl,
- enum cdns_torrent_ref_clk refclk0,
- enum cdns_torrent_ref_clk refclk1,
- enum cdns_torrent_phy_type link0,
- enum cdns_torrent_phy_type link1,
- enum cdns_torrent_ssc_mode ssc)
- {
- int i;
- u32 key = CDNS_TORRENT_KEY(refclk0, refclk1, link0, link1, ssc);
- for (i = 0; i < tbl->num_entries; i++) {
- if (tbl->entries[i].key == key)
- return tbl->entries[i].vals;
- }
- return NULL;
- }
- static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val)
- {
- struct cdns_regmap_cdb_context *ctx = context;
- u32 offset = reg << ctx->reg_offset_shift;
- writew(val, ctx->base + offset);
- return 0;
- }
- static int cdns_regmap_read(void *context, unsigned int reg, unsigned int *val)
- {
- struct cdns_regmap_cdb_context *ctx = context;
- u32 offset = reg << ctx->reg_offset_shift;
- *val = readw(ctx->base + offset);
- return 0;
- }
- static int cdns_regmap_dptx_write(void *context, unsigned int reg,
- unsigned int val)
- {
- struct cdns_regmap_cdb_context *ctx = context;
- u32 offset = reg;
- writel(val, ctx->base + offset);
- return 0;
- }
- static int cdns_regmap_dptx_read(void *context, unsigned int reg,
- unsigned int *val)
- {
- struct cdns_regmap_cdb_context *ctx = context;
- u32 offset = reg;
- *val = readl(ctx->base + offset);
- return 0;
- }
- #define TORRENT_TX_LANE_CDB_REGMAP_CONF(n) \
- { \
- .name = "torrent_tx_lane" n "_cdb", \
- .reg_stride = 1, \
- .fast_io = true, \
- .reg_write = cdns_regmap_write, \
- .reg_read = cdns_regmap_read, \
- }
- #define TORRENT_RX_LANE_CDB_REGMAP_CONF(n) \
- { \
- .name = "torrent_rx_lane" n "_cdb", \
- .reg_stride = 1, \
- .fast_io = true, \
- .reg_write = cdns_regmap_write, \
- .reg_read = cdns_regmap_read, \
- }
- static const struct regmap_config cdns_torrent_tx_lane_cdb_config[] = {
- TORRENT_TX_LANE_CDB_REGMAP_CONF("0"),
- TORRENT_TX_LANE_CDB_REGMAP_CONF("1"),
- TORRENT_TX_LANE_CDB_REGMAP_CONF("2"),
- TORRENT_TX_LANE_CDB_REGMAP_CONF("3"),
- };
- static const struct regmap_config cdns_torrent_rx_lane_cdb_config[] = {
- TORRENT_RX_LANE_CDB_REGMAP_CONF("0"),
- TORRENT_RX_LANE_CDB_REGMAP_CONF("1"),
- TORRENT_RX_LANE_CDB_REGMAP_CONF("2"),
- TORRENT_RX_LANE_CDB_REGMAP_CONF("3"),
- };
- static const struct regmap_config cdns_torrent_common_cdb_config = {
- .name = "torrent_common_cdb",
- .reg_stride = 1,
- .fast_io = true,
- .reg_write = cdns_regmap_write,
- .reg_read = cdns_regmap_read,
- };
- #define TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF(n) \
- { \
- .name = "torrent_phy_pcs_lane" n "_cdb", \
- .reg_stride = 1, \
- .fast_io = true, \
- .reg_write = cdns_regmap_write, \
- .reg_read = cdns_regmap_read, \
- }
- static const struct regmap_config cdns_torrent_phy_pcs_lane_cdb_config[] = {
- TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("0"),
- TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("1"),
- TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("2"),
- TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("3"),
- };
- static const struct regmap_config cdns_torrent_phy_pcs_cmn_cdb_config = {
- .name = "torrent_phy_pcs_cmn_cdb",
- .reg_stride = 1,
- .fast_io = true,
- .reg_write = cdns_regmap_write,
- .reg_read = cdns_regmap_read,
- };
- static const struct regmap_config cdns_torrent_phy_pma_cmn_cdb_config = {
- .name = "torrent_phy_pma_cmn_cdb",
- .reg_stride = 1,
- .fast_io = true,
- .reg_write = cdns_regmap_write,
- .reg_read = cdns_regmap_read,
- };
- static const struct regmap_config cdns_torrent_dptx_phy_config = {
- .name = "torrent_dptx_phy",
- .reg_stride = 1,
- .fast_io = true,
- .reg_write = cdns_regmap_dptx_write,
- .reg_read = cdns_regmap_dptx_read,
- };
- /* PHY mmr access functions */
- static void cdns_torrent_phy_write(struct regmap *regmap, u32 offset, u32 val)
- {
- regmap_write(regmap, offset, val);
- }
- static u32 cdns_torrent_phy_read(struct regmap *regmap, u32 offset)
- {
- unsigned int val;
- regmap_read(regmap, offset, &val);
- return val;
- }
- /* DPTX mmr access functions */
- static void cdns_torrent_dp_write(struct regmap *regmap, u32 offset, u32 val)
- {
- regmap_write(regmap, offset, val);
- }
- static u32 cdns_torrent_dp_read(struct regmap *regmap, u32 offset)
- {
- u32 val;
- regmap_read(regmap, offset, &val);
- return val;
- }
- /*
- * Structure used to store values of PHY registers for voltage-related
- * coefficients, for particular voltage swing and pre-emphasis level. Values
- * are shared across all physical lanes.
- */
- struct coefficients {
- /* Value of DRV_DIAG_TX_DRV register to use */
- u16 diag_tx_drv;
- /* Value of TX_TXCC_MGNFS_MULT_000 register to use */
- u16 mgnfs_mult;
- /* Value of TX_TXCC_CPOST_MULT_00 register to use */
- u16 cpost_mult;
- };
- /*
- * Array consists of values of voltage-related registers for sd0801 PHY. A value
- * of 0xFFFF is a placeholder for invalid combination, and will never be used.
- */
- static const struct coefficients vltg_coeff[4][4] = {
- /* voltage swing 0, pre-emphasis 0->3 */
- { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x002A,
- .cpost_mult = 0x0000},
- {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
- .cpost_mult = 0x0014},
- {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0012,
- .cpost_mult = 0x0020},
- {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
- .cpost_mult = 0x002A}
- },
- /* voltage swing 1, pre-emphasis 0->3 */
- { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
- .cpost_mult = 0x0000},
- {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
- .cpost_mult = 0x0012},
- {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
- .cpost_mult = 0x001F},
- {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
- .cpost_mult = 0xFFFF}
- },
- /* voltage swing 2, pre-emphasis 0->3 */
- { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
- .cpost_mult = 0x0000},
- {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
- .cpost_mult = 0x0013},
- {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
- .cpost_mult = 0xFFFF},
- {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
- .cpost_mult = 0xFFFF}
- },
- /* voltage swing 3, pre-emphasis 0->3 */
- { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
- .cpost_mult = 0x0000},
- {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
- .cpost_mult = 0xFFFF},
- {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
- .cpost_mult = 0xFFFF},
- {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
- .cpost_mult = 0xFFFF}
- }
- };
- static const char *cdns_torrent_get_phy_type(enum cdns_torrent_phy_type phy_type)
- {
- switch (phy_type) {
- case TYPE_DP:
- return "DisplayPort";
- case TYPE_PCIE:
- return "PCIe";
- case TYPE_SGMII:
- return "SGMII";
- case TYPE_QSGMII:
- return "QSGMII";
- case TYPE_USB:
- return "USB";
- case TYPE_USXGMII:
- return "USXGMII";
- default:
- return "None";
- }
- }
- /*
- * Set registers responsible for enabling and configuring SSC, with second and
- * third register values provided by parameters.
- */
- static
- void cdns_torrent_dp_enable_ssc_19_2mhz(struct cdns_torrent_phy *cdns_phy,
- u32 ctrl2_val, u32 ctrl3_val)
- {
- struct regmap *regmap = cdns_phy->regmap_common_cdb;
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl3_val);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl3_val);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
- }
- static
- void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy,
- u32 rate, bool ssc)
- {
- struct regmap *regmap = cdns_phy->regmap_common_cdb;
- /* Assumes 19.2 MHz refclock */
- switch (rate) {
- /* Setting VCO for 10.8GHz */
- case 2700:
- case 5400:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0119);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00BC);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0012);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0119);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00BC);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0012);
- if (ssc)
- cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x033A, 0x006A);
- break;
- /* Setting VCO for 9.72GHz */
- case 1620:
- case 2430:
- case 3240:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01FA);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0152);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01FA);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0152);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
- if (ssc)
- cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x05DD, 0x0069);
- break;
- /* Setting VCO for 8.64GHz */
- case 2160:
- case 4320:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01C2);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x012C);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01C2);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x012C);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
- if (ssc)
- cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x0536, 0x0069);
- break;
- /* Setting VCO for 8.1GHz */
- case 8100:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01A5);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xE000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x011A);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01A5);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xE000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x011A);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
- if (ssc)
- cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x04D7, 0x006A);
- break;
- }
- if (ssc) {
- cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x025E);
- cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
- cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x025E);
- cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
- } else {
- cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x0260);
- cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x0260);
- /* Set reset register values to disable SSC */
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
- }
- cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x0099);
- cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x0099);
- cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x0099);
- cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x0099);
- }
- /*
- * Set registers responsible for enabling and configuring SSC, with second
- * register value provided by a parameter.
- */
- static void cdns_torrent_dp_enable_ssc_25mhz(struct cdns_torrent_phy *cdns_phy,
- u32 ctrl2_val)
- {
- struct regmap *regmap = cdns_phy->regmap_common_cdb;
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x007F);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x007F);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
- }
- static
- void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy *cdns_phy,
- u32 rate, bool ssc)
- {
- struct regmap *regmap = cdns_phy->regmap_common_cdb;
- /* Assumes 25 MHz refclock */
- switch (rate) {
- /* Setting VCO for 10.8GHz */
- case 2700:
- case 5400:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01B0);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0120);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01B0);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0120);
- if (ssc)
- cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x0423);
- break;
- /* Setting VCO for 9.72GHz */
- case 1620:
- case 2430:
- case 3240:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0184);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xCCCD);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0104);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0184);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xCCCD);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0104);
- if (ssc)
- cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x03B9);
- break;
- /* Setting VCO for 8.64GHz */
- case 2160:
- case 4320:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0159);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x999A);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00E7);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0159);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x999A);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00E7);
- if (ssc)
- cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x034F);
- break;
- /* Setting VCO for 8.1GHz */
- case 8100:
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0144);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00D8);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0144);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00D8);
- if (ssc)
- cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x031A);
- break;
- }
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
- if (ssc) {
- cdns_torrent_phy_write(regmap,
- CMN_PLL0_VCOCAL_PLLCNT_START, 0x0315);
- cdns_torrent_phy_write(regmap,
- CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
- cdns_torrent_phy_write(regmap,
- CMN_PLL1_VCOCAL_PLLCNT_START, 0x0315);
- cdns_torrent_phy_write(regmap,
- CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
- } else {
- cdns_torrent_phy_write(regmap,
- CMN_PLL0_VCOCAL_PLLCNT_START, 0x0317);
- cdns_torrent_phy_write(regmap,
- CMN_PLL1_VCOCAL_PLLCNT_START, 0x0317);
- /* Set reset register values to disable SSC */
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000);
- cdns_torrent_phy_write(regmap,
- CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000);
- cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000);
- cdns_torrent_phy_write(regmap,
- CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
- }
- cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x00C7);
- cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x00C7);
- cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x00C7);
- cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x00C7);
- }
- static
- void cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(struct cdns_torrent_phy *cdns_phy,
- u32 rate, bool ssc)
- {
- struct regmap *regmap = cdns_phy->regmap_common_cdb;
- /* Assumes 100 MHz refclock */
- switch (rate) {
- /* Setting VCO for 10.8GHz */
- case 2700:
- case 5400:
- if (cdns_phy->dp_pll & DP_PLL0)
- cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_FBH_OVRD_M0, 0x0022);
- if (cdns_phy->dp_pll & DP_PLL1) {
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0028);
- cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBH_OVRD_M0, 0x0022);
- cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBL_OVRD_M0, 0x000C);
- }
- break;
- /* Setting VCO for 9.72GHz */
- case 1620:
- case 2430:
- case 3240:
- if (cdns_phy->dp_pll & DP_PLL0) {
- cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0061);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x3333);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0042);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
- }
- if (cdns_phy->dp_pll & DP_PLL1) {
- cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0061);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x3333);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0042);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
- }
- break;
- /* Setting VCO for 8.64GHz */
- case 2160:
- case 4320:
- if (cdns_phy->dp_pll & DP_PLL0) {
- cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0056);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x6666);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x003A);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
- }
- if (cdns_phy->dp_pll & DP_PLL1) {
- cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0056);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x6666);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x003A);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
- }
- break;
- /* Setting VCO for 8.1GHz */
- case 8100:
- if (cdns_phy->dp_pll & DP_PLL0) {
- cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
- cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0051);
- cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0036);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
- }
- if (cdns_phy->dp_pll & DP_PLL1) {
- cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
- cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0051);
- cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
- cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0036);
- cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
- }
- break;
- }
- }
- /* Set PLL used for DP configuration */
- static int cdns_torrent_dp_get_pll(struct cdns_torrent_phy *cdns_phy,
- enum cdns_torrent_phy_type phy_t2)
- {
- switch (phy_t2) {
- case TYPE_PCIE:
- case TYPE_USB:
- cdns_phy->dp_pll = DP_PLL1;
- break;
- case TYPE_SGMII:
- case TYPE_QSGMII:
- cdns_phy->dp_pll = DP_PLL0;
- break;
- case TYPE_NONE:
- cdns_phy->dp_pll = DP_PLL0 | DP_PLL1;
- break;
- default:
- dev_err(cdns_phy->dev, "Unsupported PHY configuration\n");
- return -EINVAL;
- }
- return 0;
- }
- /*
- * Enable or disable PLL for selected lanes.
- */
- static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- struct phy_configure_opts_dp *dp,
- bool enable)
- {
- struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
- u32 rd_val, pll_ack_val;
- int ret;
- /*
- * Used to determine, which bits to check for or enable in
- * PHY_PMA_XCVR_PLLCLK_EN register.
- */
- u32 pll_bits;
- /* Used to enable or disable lanes. */
- u32 pll_val;
- /* Select values of registers and mask, depending on enabled lane count. */
- pll_val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
- if (enable) {
- pll_bits = ((1 << dp->lanes) - 1);
- pll_val |= pll_bits;
- pll_ack_val = pll_bits;
- } else {
- pll_bits = ((1 << inst->num_lanes) - 1);
- pll_val &= (~pll_bits);
- pll_ack_val = 0;
- }
- cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_val);
- /* Wait for acknowledgment from PHY. */
- ret = regmap_read_poll_timeout(regmap,
- PHY_PMA_XCVR_PLLCLK_EN_ACK,
- rd_val,
- (rd_val & pll_bits) == pll_ack_val,
- 0, POLL_TIMEOUT_US);
- ndelay(100);
- return ret;
- }
- static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- u32 num_lanes,
- enum phy_powerstate powerstate)
- {
- /* Register value for power state for a single byte. */
- u32 value_part, i;
- u32 value = 0;
- u32 mask = 0;
- u32 read_val;
- int ret;
- struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
- switch (powerstate) {
- case (POWERSTATE_A0):
- value_part = 0x01U;
- break;
- case (POWERSTATE_A2):
- value_part = 0x04U;
- break;
- default:
- /* Powerstate A3 */
- value_part = 0x08U;
- break;
- }
- /* Select values of registers and mask, depending on enabled lane count. */
- for (i = 0; i < num_lanes; i++) {
- value |= (value_part << PHY_POWER_STATE_LN(i));
- mask |= (PMA_XCVR_POWER_STATE_REQ_LN_MASK << PHY_POWER_STATE_LN(i));
- }
- /* Set power state A<n>. */
- cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, value);
- /* Wait, until PHY acknowledges power state completion. */
- ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_POWER_STATE_ACK,
- read_val, (read_val & mask) == value, 0,
- POLL_TIMEOUT_US);
- if (ret)
- return ret;
- cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, 0x00000000);
- ndelay(100);
- return ret;
- }
- static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst, u32 num_lanes)
- {
- unsigned int read_val;
- int ret;
- struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
- /*
- * waiting for ACK of pma_xcvr_pllclk_en_ln_*, only for the
- * master lane
- */
- ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_PLLCLK_EN_ACK,
- read_val, read_val & 1,
- 0, POLL_TIMEOUT_US);
- if (ret == -ETIMEDOUT) {
- dev_err(cdns_phy->dev,
- "timeout waiting for link PLL clock enable ack\n");
- return ret;
- }
- ndelay(100);
- ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes,
- POWERSTATE_A2);
- if (ret)
- return ret;
- ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes,
- POWERSTATE_A0);
- return ret;
- }
- static int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy *cdns_phy)
- {
- unsigned int reg;
- int ret;
- struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
- ret = regmap_read_poll_timeout(regmap, PHY_PMA_CMN_READY, reg,
- reg & 1, 0, POLL_TIMEOUT_US);
- if (ret == -ETIMEDOUT) {
- dev_err(cdns_phy->dev,
- "timeout waiting for PMA common ready\n");
- return -ETIMEDOUT;
- }
- return 0;
- }
- static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- u32 rate, u32 num_lanes)
- {
- unsigned int clk_sel_val = 0;
- unsigned int hsclk_div_val = 0;
- unsigned int i;
- switch (rate) {
- case 1620:
- clk_sel_val = 0x0f01;
- hsclk_div_val = 2;
- break;
- case 2160:
- case 2430:
- case 2700:
- clk_sel_val = 0x0701;
- hsclk_div_val = 1;
- break;
- case 3240:
- clk_sel_val = 0x0b00;
- hsclk_div_val = 2;
- break;
- case 4320:
- case 5400:
- clk_sel_val = 0x0301;
- hsclk_div_val = 0;
- break;
- case 8100:
- clk_sel_val = 0x0200;
- hsclk_div_val = 0;
- break;
- }
- if (cdns_phy->dp_pll & DP_PLL0)
- cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
- CMN_PDIAG_PLL0_CLK_SEL_M0, clk_sel_val);
- if (cdns_phy->dp_pll & DP_PLL1)
- cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
- CMN_PDIAG_PLL1_CLK_SEL_M0, clk_sel_val);
- /* PMA lane configuration to deal with multi-link operation */
- for (i = 0; i < num_lanes; i++)
- cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + i],
- XCVR_DIAG_HSCLK_DIV, hsclk_div_val);
- }
- /*
- * Perform register operations related to setting link rate, once powerstate is
- * set and PLL disable request was processed.
- */
- static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- struct phy_configure_opts_dp *dp)
- {
- u32 read_val, field_val;
- int ret;
- /*
- * Disable the associated PLL (cmn_pll0_en or cmn_pll1_en) before
- * re-programming the new data rate.
- */
- ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val);
- if (ret)
- return ret;
- field_val &= ~(cdns_phy->dp_pll);
- regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val);
- /*
- * Wait for PLL ready de-assertion.
- * For PLL0 - PHY_PMA_CMN_CTRL2[2] == 1
- * For PLL1 - PHY_PMA_CMN_CTRL2[3] == 1
- */
- if (cdns_phy->dp_pll & DP_PLL0) {
- ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
- read_val,
- ((read_val >> 2) & 0x01) != 0,
- 0, POLL_TIMEOUT_US);
- if (ret)
- return ret;
- }
- if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1) {
- ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
- read_val,
- ((read_val >> 3) & 0x01) != 0,
- 0, POLL_TIMEOUT_US);
- if (ret)
- return ret;
- }
- ndelay(200);
- /* DP Rate Change - VCO Output settings. */
- if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ)
- /* PMA common configuration 19.2MHz */
- cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy, dp->link_rate, dp->ssc);
- else if (cdns_phy->ref_clk_rate == CLK_25_MHZ)
- /* PMA common configuration 25MHz */
- cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy, dp->link_rate, dp->ssc);
- else if (cdns_phy->ref_clk_rate == CLK_100_MHZ)
- /* PMA common configuration 100MHz */
- cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy, dp->link_rate, dp->ssc);
- cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, dp->link_rate, dp->lanes);
- /* Enable the associated PLL (cmn_pll0_en or cmn_pll1_en) */
- ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val);
- if (ret)
- return ret;
- field_val |= cdns_phy->dp_pll;
- regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val);
- /*
- * Wait for PLL ready assertion.
- * For PLL0 - PHY_PMA_CMN_CTRL2[0] == 1
- * For PLL1 - PHY_PMA_CMN_CTRL2[1] == 1
- */
- if (cdns_phy->dp_pll & DP_PLL0) {
- ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
- read_val,
- (read_val & 0x01) != 0,
- 0, POLL_TIMEOUT_US);
- if (ret)
- return ret;
- }
- if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1)
- ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
- read_val,
- ((read_val >> 1) & 0x01) != 0,
- 0, POLL_TIMEOUT_US);
- return ret;
- }
- /*
- * Verify, that parameters to configure PHY with are correct.
- */
- static int cdns_torrent_dp_verify_config(struct cdns_torrent_inst *inst,
- struct phy_configure_opts_dp *dp)
- {
- u8 i;
- /* If changing link rate was required, verify it's supported. */
- if (dp->set_rate) {
- switch (dp->link_rate) {
- case 1620:
- case 2160:
- case 2430:
- case 2700:
- case 3240:
- case 4320:
- case 5400:
- case 8100:
- /* valid bit rate */
- break;
- default:
- return -EINVAL;
- }
- }
- /* Verify lane count. */
- switch (dp->lanes) {
- case 1:
- case 2:
- case 4:
- /* valid lane count. */
- break;
- default:
- return -EINVAL;
- }
- /* Check against actual number of PHY's lanes. */
- if (dp->lanes > inst->num_lanes)
- return -EINVAL;
- /*
- * If changing voltages is required, check swing and pre-emphasis
- * levels, per-lane.
- */
- if (dp->set_voltages) {
- /* Lane count verified previously. */
- for (i = 0; i < dp->lanes; i++) {
- if (dp->voltage[i] > 3 || dp->pre[i] > 3)
- return -EINVAL;
- /* Sum of voltage swing and pre-emphasis levels cannot
- * exceed 3.
- */
- if (dp->voltage[i] + dp->pre[i] > 3)
- return -EINVAL;
- }
- }
- return 0;
- }
- /* Set power state A0 and PLL clock enable to 0 on enabled lanes. */
- static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- u32 num_lanes)
- {
- struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
- u32 pwr_state = cdns_torrent_dp_read(regmap,
- PHY_PMA_XCVR_POWER_STATE_REQ);
- u32 pll_clk_en = cdns_torrent_dp_read(regmap,
- PHY_PMA_XCVR_PLLCLK_EN);
- u32 i;
- for (i = 0; i < num_lanes; i++) {
- pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK
- << PHY_POWER_STATE_LN(inst->mlane + i));
- pll_clk_en &= ~(0x01U << (inst->mlane + i));
- }
- cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, pwr_state);
- cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_clk_en);
- }
- /* Configure lane count as required. */
- static int cdns_torrent_dp_set_lanes(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- struct phy_configure_opts_dp *dp)
- {
- u32 value, i;
- int ret;
- struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
- u8 lane_mask = (1 << dp->lanes) - 1;
- u8 pma_tx_elec_idle_mask = 0;
- u32 clane = inst->mlane;
- lane_mask <<= clane;
- value = cdns_torrent_dp_read(regmap, PHY_RESET);
- /* clear pma_tx_elec_idle_ln_* bits. */
- pma_tx_elec_idle_mask = ((1 << inst->num_lanes) - 1) << clane;
- pma_tx_elec_idle_mask <<= PMA_TX_ELEC_IDLE_SHIFT;
- value &= ~pma_tx_elec_idle_mask;
- /* Assert pma_tx_elec_idle_ln_* for disabled lanes. */
- value |= ((~lane_mask) << PMA_TX_ELEC_IDLE_SHIFT) &
- pma_tx_elec_idle_mask;
- cdns_torrent_dp_write(regmap, PHY_RESET, value);
- /* reset the link by asserting master lane phy_l0*_reset_n low */
- cdns_torrent_dp_write(regmap, PHY_RESET,
- value & (~(1 << clane)));
- /*
- * Assert lane reset on unused lanes and master lane so they remain in reset
- * and powered down when re-enabling the link
- */
- for (i = 0; i < inst->num_lanes; i++)
- value &= (~(1 << (clane + i)));
- for (i = 1; i < inst->num_lanes; i++)
- value |= ((1 << (clane + i)) & lane_mask);
- cdns_torrent_dp_write(regmap, PHY_RESET, value);
- cdns_torrent_dp_set_a0_pll(cdns_phy, inst, dp->lanes);
- /* release phy_l0*_reset_n based on used laneCount */
- for (i = 0; i < inst->num_lanes; i++)
- value &= (~(1 << (clane + i)));
- for (i = 0; i < inst->num_lanes; i++)
- value |= ((1 << (clane + i)) & lane_mask);
- cdns_torrent_dp_write(regmap, PHY_RESET, value);
- /* Wait, until PHY gets ready after releasing PHY reset signal. */
- ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
- if (ret)
- return ret;
- ndelay(100);
- /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
- value = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
- value |= (1 << clane);
- cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, value);
- ret = cdns_torrent_dp_run(cdns_phy, inst, dp->lanes);
- return ret;
- }
- /* Configure link rate as required. */
- static int cdns_torrent_dp_set_rate(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- struct phy_configure_opts_dp *dp)
- {
- int ret;
- ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
- POWERSTATE_A3);
- if (ret)
- return ret;
- ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, false);
- if (ret)
- return ret;
- ndelay(200);
- ret = cdns_torrent_dp_configure_rate(cdns_phy, inst, dp);
- if (ret)
- return ret;
- ndelay(200);
- ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, true);
- if (ret)
- return ret;
- ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
- POWERSTATE_A2);
- if (ret)
- return ret;
- ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
- POWERSTATE_A0);
- if (ret)
- return ret;
- ndelay(900);
- return ret;
- }
- /* Configure voltage swing and pre-emphasis for all enabled lanes. */
- static void cdns_torrent_dp_set_voltages(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- struct phy_configure_opts_dp *dp)
- {
- u8 lane;
- u16 val;
- for (lane = 0; lane < dp->lanes; lane++) {
- val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- TX_DIAG_ACYA);
- /*
- * Write 1 to register bit TX_DIAG_ACYA[0] to freeze the
- * current state of the analog TX driver.
- */
- val |= TX_DIAG_ACYA_HBDC_MASK;
- cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- TX_DIAG_ACYA, val);
- cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- TX_TXCC_CTRL, 0x08A4);
- val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].diag_tx_drv;
- cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- DRV_DIAG_TX_DRV, val);
- val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].mgnfs_mult;
- cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- TX_TXCC_MGNFS_MULT_000,
- val);
- val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].cpost_mult;
- cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- TX_TXCC_CPOST_MULT_00,
- val);
- val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- TX_DIAG_ACYA);
- /*
- * Write 0 to register bit TX_DIAG_ACYA[0] to allow the state of
- * analog TX driver to reflect the new programmed one.
- */
- val &= ~TX_DIAG_ACYA_HBDC_MASK;
- cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
- TX_DIAG_ACYA, val);
- }
- };
- static int cdns_torrent_dp_configure(struct phy *phy,
- union phy_configure_opts *opts)
- {
- struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
- struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
- int ret;
- if (cdns_phy->already_configured)
- return 0;
- ret = cdns_torrent_dp_verify_config(inst, &opts->dp);
- if (ret) {
- dev_err(&phy->dev, "invalid params for phy configure\n");
- return ret;
- }
- if (opts->dp.set_lanes) {
- ret = cdns_torrent_dp_set_lanes(cdns_phy, inst, &opts->dp);
- if (ret) {
- dev_err(&phy->dev, "cdns_torrent_dp_set_lanes failed\n");
- return ret;
- }
- }
- if (opts->dp.set_rate) {
- ret = cdns_torrent_dp_set_rate(cdns_phy, inst, &opts->dp);
- if (ret) {
- dev_err(&phy->dev, "cdns_torrent_dp_set_rate failed\n");
- return ret;
- }
- }
- if (opts->dp.set_voltages)
- cdns_torrent_dp_set_voltages(cdns_phy, inst, &opts->dp);
- return ret;
- }
- static int cdns_torrent_phy_on(struct phy *phy)
- {
- struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
- struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
- u32 read_val;
- int ret;
- if (cdns_phy->already_configured) {
- /* Give 5ms to 10ms delay for the PIPE clock to be stable */
- usleep_range(5000, 10000);
- return 0;
- }
- if (cdns_phy->nsubnodes == 1) {
- /* Take the PHY lane group out of reset */
- reset_control_deassert(inst->lnk_rst);
- /* Take the PHY out of reset */
- ret = reset_control_deassert(cdns_phy->phy_rst);
- if (ret)
- return ret;
- }
- /*
- * Wait for cmn_ready assertion
- * PHY_PMA_CMN_CTRL1[0] == 1
- */
- ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_1,
- read_val, read_val, 1000,
- PLL_LOCK_TIMEOUT);
- if (ret) {
- dev_err(cdns_phy->dev, "Timeout waiting for CMN ready\n");
- return ret;
- }
- if (inst->phy_type == TYPE_PCIE || inst->phy_type == TYPE_USB) {
- ret = regmap_field_read_poll_timeout(cdns_phy->phy_pcs_iso_link_ctrl_1[inst->mlane],
- read_val, !read_val, 1000,
- PLL_LOCK_TIMEOUT);
- if (ret == -ETIMEDOUT) {
- dev_err(cdns_phy->dev, "Timeout waiting for PHY status ready\n");
- return ret;
- }
- }
- return 0;
- }
- static int cdns_torrent_phy_off(struct phy *phy)
- {
- struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
- struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
- int ret;
- if (cdns_phy->nsubnodes != 1)
- return 0;
- ret = reset_control_assert(cdns_phy->phy_rst);
- if (ret)
- return ret;
- return reset_control_assert(inst->lnk_rst);
- }
- static void cdns_torrent_dp_common_init(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst)
- {
- struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
- unsigned char lane_bits;
- u32 val;
- cdns_torrent_dp_write(regmap, PHY_AUX_CTRL, 0x0003); /* enable AUX */
- /*
- * Set lines power state to A0
- * Set lines pll clk enable to 0
- */
- cdns_torrent_dp_set_a0_pll(cdns_phy, inst, inst->num_lanes);
- /*
- * release phy_l0*_reset_n and pma_tx_elec_idle_ln_* based on
- * used lanes
- */
- lane_bits = (1 << inst->num_lanes) - 1;
- val = cdns_torrent_dp_read(regmap, PHY_RESET);
- val |= (0xF & lane_bits);
- val &= ~(lane_bits << 4);
- cdns_torrent_dp_write(regmap, PHY_RESET, val);
- /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
- val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
- val |= 1;
- cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, val);
- /*
- * PHY PMA registers configuration functions
- * Initialize PHY with max supported link rate, without SSC.
- */
- if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ)
- cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy,
- cdns_phy->max_bit_rate,
- false);
- else if (cdns_phy->ref_clk_rate == CLK_25_MHZ)
- cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy,
- cdns_phy->max_bit_rate,
- false);
- else if (cdns_phy->ref_clk_rate == CLK_100_MHZ)
- cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy,
- cdns_phy->max_bit_rate,
- false);
- cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, cdns_phy->max_bit_rate,
- inst->num_lanes);
- /* take out of reset */
- regmap_field_write(cdns_phy->phy_reset_ctrl, 0x1);
- }
- static int cdns_torrent_dp_start(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- struct phy *phy)
- {
- int ret;
- ret = cdns_torrent_phy_on(phy);
- if (ret)
- return ret;
- ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
- if (ret)
- return ret;
- ret = cdns_torrent_dp_run(cdns_phy, inst, inst->num_lanes);
- return ret;
- }
- static int cdns_torrent_dp_init(struct phy *phy)
- {
- struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
- struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
- int ret;
- switch (cdns_phy->ref_clk_rate) {
- case CLK_19_2_MHZ:
- case CLK_25_MHZ:
- case CLK_100_MHZ:
- /* Valid Ref Clock Rate */
- break;
- default:
- dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n");
- return -EINVAL;
- }
- ret = cdns_torrent_dp_get_pll(cdns_phy, TYPE_NONE);
- if (ret)
- return ret;
- cdns_torrent_dp_common_init(cdns_phy, inst);
- return cdns_torrent_dp_start(cdns_phy, inst, phy);
- }
- static int cdns_torrent_dp_multilink_init(struct cdns_torrent_phy *cdns_phy,
- struct cdns_torrent_inst *inst,
- struct phy *phy)
- {
- if (cdns_phy->ref_clk_rate != CLK_100_MHZ) {
- dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n");
- return -EINVAL;
- }
- cdns_torrent_dp_common_init(cdns_phy, inst);
- return cdns_torrent_dp_start(cdns_phy, inst, phy);
- }
- static int cdns_torrent_derived_refclk_enable(struct clk_hw *hw)
- {
- struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
- regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 1);
- regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 1);
- return 0;
- }
- static void cdns_torrent_derived_refclk_disable(struct clk_hw *hw)
- {
- struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
- regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 0);
- regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 0);
- }
- static int cdns_torrent_derived_refclk_is_enabled(struct clk_hw *hw)
- {
- struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
- int val;
- regmap_field_read(derived_refclk->cmn_cdiag_refclk_ovrd_4, &val);
- return !!val;
- }
- static const struct clk_ops cdns_torrent_derived_refclk_ops = {
- .enable = cdns_torrent_derived_refclk_enable,
- .disable = cdns_torrent_derived_refclk_disable,
- .is_enabled = cdns_torrent_derived_refclk_is_enabled,
- };
- static int cdns_torrent_derived_refclk_register(struct cdns_torrent_phy *cdns_phy)
- {
- struct cdns_torrent_derived_refclk *derived_refclk;
- struct device *dev = cdns_phy->dev;
- struct clk_init_data *init;
- const char *parent_name;
- char clk_name[100];
- struct clk_hw *hw;
- struct clk *clk;
- int ret;
- derived_refclk = devm_kzalloc(dev, sizeof(*derived_refclk), GFP_KERNEL);
- if (!derived_refclk)
- return -ENOMEM;
- snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
- clk_names[CDNS_TORRENT_DERIVED_REFCLK]);
- clk = devm_clk_get_optional(dev, "phy_en_refclk");
- if (IS_ERR(clk)) {
- dev_err(dev, "No parent clock for derived_refclk\n");
- return PTR_ERR(clk);
- }
- init = &derived_refclk->clk_data;
- if (clk) {
- parent_name = __clk_get_name(clk);
- init->parent_names = &parent_name;
- init->num_parents = 1;
- }
- init->ops = &cdns_torrent_derived_refclk_ops;
- init->flags = 0;
- init->name = clk_name;
- derived_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0;
- derived_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4;
- derived_refclk->hw.init = init;
- hw = &derived_refclk->hw;
- ret = devm_clk_hw_register(dev, hw);
- if (ret)
- return ret;
- cdns_phy->clk_hw_data->hws[CDNS_TORRENT_DERIVED_REFCLK] = hw;
- return 0;
- }
- static int cdns_torrent_received_refclk_enable(struct clk_hw *hw)
- {
- struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
- regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 1);
- return 0;
- }
- static void cdns_torrent_received_refclk_disable(struct clk_hw *hw)
- {
- struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
- regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 0);
- }
- static int cdns_torrent_received_refclk_is_enabled(struct clk_hw *hw)
- {
- struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
- int val, cmn_val;
- regmap_field_read(received_refclk->phy_pipe_cmn_ctrl1_0, &val);
- regmap_field_read(received_refclk->cmn_cdiag_refclk_ovrd_4, &cmn_val);
- return val && !cmn_val;
- }
- static const struct clk_ops cdns_torrent_received_refclk_ops = {
- .enable = cdns_torrent_received_refclk_enable,
- .disable = cdns_torrent_received_refclk_disable,
- .is_enabled = cdns_torrent_received_refclk_is_enabled,
- };
- static int cdns_torrent_received_refclk_register(struct cdns_torrent_phy *cdns_phy)
- {
- struct cdns_torrent_received_refclk *received_refclk;
- struct device *dev = cdns_phy->dev;
- struct clk_init_data *init;
- const char *parent_name;
- char clk_name[100];
- struct clk_hw *hw;
- struct clk *clk;
- int ret;
- received_refclk = devm_kzalloc(dev, sizeof(*received_refclk), GFP_KERNEL);
- if (!received_refclk)
- return -ENOMEM;
- snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
- clk_names[CDNS_TORRENT_RECEIVED_REFCLK]);
- clk = devm_clk_get_optional(dev, "phy_en_refclk");
- if (IS_ERR(clk)) {
- dev_err(dev, "No parent clock for received_refclk\n");
- return PTR_ERR(clk);
- }
- init = &received_refclk->clk_data;
- if (clk) {
- parent_name = __clk_get_name(clk);
- init->parent_names = &parent_name;
- init->num_parents = 1;
- }
- init->ops = &cdns_torrent_received_refclk_ops;
- init->flags = 0;
- init->name = clk_name;
- received_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0;
- received_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4;
- received_refclk->hw.init = init;
- hw = &received_refclk->hw;
- ret = devm_clk_hw_register(dev, hw);
- if (ret)
- return ret;
- cdns_phy->clk_hw_data->hws[CDNS_TORRENT_RECEIVED_REFCLK] = hw;
- return 0;
- }
- static int cdns_torrent_refclk_driver_enable(struct clk_hw *hw)
- {
- struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
- regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_6], 0);
- regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_5], 1);
- regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 0);
- return 0;
- }
- static void cdns_torrent_refclk_driver_disable(struct clk_hw *hw)
- {
- struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
- regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 1);
- }
- static int cdns_torrent_refclk_driver_is_enabled(struct clk_hw *hw)
- {
- struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
- int val;
- regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], &val);
- return !val;
- }
- static u8 cdns_torrent_refclk_driver_get_parent(struct clk_hw *hw)
- {
- struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
- unsigned int val;
- regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], &val);
- return clk_mux_val_to_index(hw, cdns_torrent_refclk_driver_mux_table, 0, val);
- }
- static int cdns_torrent_refclk_driver_set_parent(struct clk_hw *hw, u8 index)
- {
- struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
- unsigned int val;
- val = cdns_torrent_refclk_driver_mux_table[index];
- return regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], val);
- }
- static const struct clk_ops cdns_torrent_refclk_driver_ops = {
- .enable = cdns_torrent_refclk_driver_enable,
- .disable = cdns_torrent_refclk_driver_disable,
- .is_enabled = cdns_torrent_refclk_driver_is_enabled,
- .determine_rate = __clk_mux_determine_rate,
- .set_parent = cdns_torrent_refclk_driver_set_parent,
- .get_parent = cdns_torrent_refclk_driver_get_parent,
- };
- static int cdns_torrent_refclk_driver_register(struct cdns_torrent_phy *cdns_phy)
- {
- struct cdns_torrent_refclk_driver *refclk_driver;
- struct device *dev = cdns_phy->dev;
- struct regmap_field *field;
- struct clk_init_data *init;
- const char **parent_names;
- unsigned int num_parents;
- struct regmap *regmap;
- char clk_name[100];
- struct clk_hw *hw;
- int i, ret;
- refclk_driver = devm_kzalloc(dev, sizeof(*refclk_driver), GFP_KERNEL);
- if (!refclk_driver)
- return -ENOMEM;
- num_parents = ARRAY_SIZE(refclk_driver_parent_index);
- parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents), GFP_KERNEL);
- if (!parent_names)
- return -ENOMEM;
- for (i = 0; i < num_parents; i++) {
- hw = cdns_phy->clk_hw_data->hws[refclk_driver_parent_index[i]];
- if (IS_ERR_OR_NULL(hw)) {
- dev_err(dev, "No parent clock for refclk driver clock\n");
- return IS_ERR(hw) ? PTR_ERR(hw) : -ENOENT;
- }
- parent_names[i] = clk_hw_get_name(hw);
- }
- snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
- clk_names[CDNS_TORRENT_REFCLK_DRIVER]);
- init = &refclk_driver->clk_data;
- init->ops = &cdns_torrent_refclk_driver_ops;
- init->flags = CLK_SET_RATE_NO_REPARENT;
- init->parent_names = parent_names;
- init->num_parents = num_parents;
- init->name = clk_name;
- regmap = cdns_phy->regmap_common_cdb;
- for (i = 0; i < REFCLK_OUT_NUM_CMN_CONFIG; i++) {
- field = devm_regmap_field_alloc(dev, regmap, refclk_out_cmn_cfg[i]);
- if (IS_ERR(field)) {
- dev_err(dev, "Refclk driver CMN reg field init failed\n");
- return PTR_ERR(field);
- }
- refclk_driver->cmn_fields[i] = field;
- }
- /* Enable Derived reference clock as default */
- regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], 1);
- refclk_driver->hw.init = init;
- hw = &refclk_driver->hw;
- ret = devm_clk_hw_register(dev, hw);
- if (ret)
- return ret;
- cdns_phy->clk_hw_data->hws[CDNS_TORRENT_REFCLK_DRIVER] = hw;
- return 0;
- }
- static struct regmap *cdns_regmap_init(struct device *dev, void __iomem *base,
- u32 block_offset,
- u8 reg_offset_shift,
- const struct regmap_config *config)
- {
- struct cdns_regmap_cdb_context *ctx;
- ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
- if (!ctx)
- return ERR_PTR(-ENOMEM);
- ctx->dev = dev;
- ctx->base = base + block_offset;
- ctx->reg_offset_shift = reg_offset_shift;
- return devm_regmap_init(dev, NULL, ctx, config);
- }
- static int cdns_torrent_dp_regfield_init(struct cdns_torrent_phy *cdns_phy)
- {
- struct device *dev = cdns_phy->dev;
- struct regmap_field *field;
- struct regmap *regmap;
- regmap = cdns_phy->regmap_dptx_phy_reg;
- field = devm_regmap_field_alloc(dev, regmap, phy_reset_ctrl);
- if (IS_ERR(field)) {
- dev_err(dev, "PHY_RESET reg field init failed\n");
- return PTR_ERR(field);
- }
- cdns_phy->phy_reset_ctrl = field;
- return 0;
- }
- static int cdns_torrent_regfield_init(struct cdns_torrent_phy *cdns_phy)
- {
- struct device *dev = cdns_phy->dev;
- struct regmap_field *field;
- struct regmap *regmap;
- int i;
- regmap = cdns_phy->regmap_phy_pcs_common_cdb;
- field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg);
- if (IS_ERR(field)) {
- dev_err(dev, "PHY_PLL_CFG reg field init failed\n");
- return PTR_ERR(field);
- }
- cdns_phy->phy_pll_cfg = field;
- regmap = cdns_phy->regmap_phy_pcs_common_cdb;
- field = devm_regmap_field_alloc(dev, regmap, phy_pipe_cmn_ctrl1_0);
- if (IS_ERR(field)) {
- dev_err(dev, "phy_pipe_cmn_ctrl1_0 reg field init failed\n");
- return PTR_ERR(field);
- }
- cdns_phy->phy_pipe_cmn_ctrl1_0 = field;
- regmap = cdns_phy->regmap_common_cdb;
- field = devm_regmap_field_alloc(dev, regmap, cmn_cdiag_refclk_ovrd_4);
- if (IS_ERR(field)) {
- dev_err(dev, "cmn_cdiag_refclk_ovrd_4 reg field init failed\n");
- return PTR_ERR(field);
- }
- cdns_phy->cmn_cdiag_refclk_ovrd_4 = field;
- regmap = cdns_phy->regmap_phy_pma_common_cdb;
- field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_1);
- if (IS_ERR(field)) {
- dev_err(dev, "PHY_PMA_CMN_CTRL1 reg field init failed\n");
- return PTR_ERR(field);
- }
- cdns_phy->phy_pma_cmn_ctrl_1 = field;
- regmap = cdns_phy->regmap_phy_pma_common_cdb;
- field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_2);
- if (IS_ERR(field)) {
- dev_err(dev, "PHY_PMA_CMN_CTRL2 reg field init failed\n");
- return PTR_ERR(field);
- }
- cdns_phy->phy_pma_cmn_ctrl_2 = field;
- regmap = cdns_phy->regmap_phy_pma_common_cdb;
- field = devm_regmap_field_alloc(dev, regmap, phy_pma_pll_raw_ctrl);
- if (IS_ERR(field)) {
- dev_err(dev, "PHY_PMA_PLL_RAW_CTRL reg field init failed\n");
- return PTR_ERR(field);
- }
- cdns_phy->phy_pma_pll_raw_ctrl = field;
- for (i = 0; i < MAX_NUM_LANES; i++) {
- regmap = cdns_phy->regmap_phy_pcs_lane_cdb[i];
- field = devm_regmap_field_alloc(dev, regmap, phy_pcs_iso_link_ctrl_1);
- if (IS_ERR(field)) {
- dev_err(dev, "PHY_PCS_ISO_LINK_CTRL reg field init for ln %d failed\n", i);
- return PTR_ERR(field);
- }
- cdns_phy->phy_pcs_iso_link_ctrl_1[i] = field;
- }
- return 0;
- }
- static int cdns_torrent_dp_regmap_init(struct cdns_torrent_phy *cdns_phy)
- {
- void __iomem *base = cdns_phy->base;
- struct device *dev = cdns_phy->dev;
- struct regmap *regmap;
- u8 reg_offset_shift;
- u32 block_offset;
- reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
- block_offset = TORRENT_DPTX_PHY_OFFSET;
- regmap = cdns_regmap_init(dev, base, block_offset,
- reg_offset_shift,
- &cdns_torrent_dptx_phy_config);
- if (IS_ERR(regmap)) {
- dev_err(dev, "Failed to init DPTX PHY regmap\n");
- return PTR_ERR(regmap);
- }
- cdns_phy->regmap_dptx_phy_reg = regmap;
- return 0;
- }
- static int cdns_torrent_regmap_init(struct cdns_torrent_phy *cdns_phy)
- {
- void __iomem *sd_base = cdns_phy->sd_base;
- u8 block_offset_shift, reg_offset_shift;
- struct device *dev = cdns_phy->dev;
- struct regmap *regmap;
- u32 block_offset;
- int i;
- block_offset_shift = cdns_phy->init_data->block_offset_shift;
- reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
- for (i = 0; i < MAX_NUM_LANES; i++) {
- block_offset = TORRENT_TX_LANE_CDB_OFFSET(i, block_offset_shift,
- reg_offset_shift);
- regmap = cdns_regmap_init(dev, sd_base, block_offset,
- reg_offset_shift,
- &cdns_torrent_tx_lane_cdb_config[i]);
- if (IS_ERR(regmap)) {
- dev_err(dev, "Failed to init tx lane CDB regmap\n");
- return PTR_ERR(regmap);
- }
- cdns_phy->regmap_tx_lane_cdb[i] = regmap;
- block_offset = TORRENT_RX_LANE_CDB_OFFSET(i, block_offset_shift,
- reg_offset_shift);
- regmap = cdns_regmap_init(dev, sd_base, block_offset,
- reg_offset_shift,
- &cdns_torrent_rx_lane_cdb_config[i]);
- if (IS_ERR(regmap)) {
- dev_err(dev, "Failed to init rx lane CDB regmap\n");
- return PTR_ERR(regmap);
- }
- cdns_phy->regmap_rx_lane_cdb[i] = regmap;
- block_offset = TORRENT_PHY_PCS_LANE_CDB_OFFSET(i, block_offset_shift,
- reg_offset_shift);
- regmap = cdns_regmap_init(dev, sd_base, block_offset,
- reg_offset_shift,
- &cdns_torrent_phy_pcs_lane_cdb_config[i]);
- if (IS_ERR(regmap)) {
- dev_err(dev, "Failed to init PHY PCS lane CDB regmap\n");
- return PTR_ERR(regmap);
- }
- cdns_phy->regmap_phy_pcs_lane_cdb[i] = regmap;
- }
- block_offset = TORRENT_COMMON_CDB_OFFSET;
- regmap = cdns_regmap_init(dev, sd_base, block_offset,
- reg_offset_shift,
- &cdns_torrent_common_cdb_config);
- if (IS_ERR(regmap)) {
- dev_err(dev, "Failed to init common CDB regmap\n");
- return PTR_ERR(regmap);
- }
- cdns_phy->regmap_common_cdb = regmap;
- block_offset = TORRENT_PHY_PCS_COMMON_OFFSET(block_offset_shift);
- regmap = cdns_regmap_init(dev, sd_base, block_offset,
- reg_offset_shift,
- &cdns_torrent_phy_pcs_cmn_cdb_config);
- if (IS_ERR(regmap)) {
- dev_err(dev, "Failed to init PHY PCS common CDB regmap\n");
- return PTR_ERR(regmap);
- }
- cdns_phy->regmap_phy_pcs_common_cdb = regmap;
- block_offset = TORRENT_PHY_PMA_COMMON_OFFSET(block_offset_shift);
- regmap = cdns_regmap_init(dev, sd_base, block_offset,
- reg_offset_shift,
- &cdns_torrent_phy_pma_cmn_cdb_config);
- if (IS_ERR(regmap)) {
- dev_err(dev, "Failed to init PHY PMA common CDB regmap\n");
- return PTR_ERR(regmap);
- }
- cdns_phy->regmap_phy_pma_common_cdb = regmap;
- return 0;
- }
- static int cdns_torrent_phy_init(struct phy *phy)
- {
- struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
- const struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
- const struct cdns_torrent_data *init_data = cdns_phy->init_data;
- const struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
- enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate;
- struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
- enum cdns_torrent_phy_type phy_type = inst->phy_type;
- const struct cdns_torrent_vals *phy_pma_cmn_vals;
- enum cdns_torrent_ssc_mode ssc = inst->ssc_mode;
- const struct cdns_torrent_vals *pcs_cmn_vals;
- const struct cdns_reg_pairs *reg_pairs;
- struct regmap *regmap;
- u32 num_regs;
- int i, j;
- if (cdns_phy->already_configured)
- return 0;
- if (cdns_phy->nsubnodes > 1) {
- if (phy_type == TYPE_DP)
- return cdns_torrent_dp_multilink_init(cdns_phy, inst, phy);
- return 0;
- }
- /**
- * Spread spectrum generation is not required or supported
- * for SGMII/QSGMII/USXGMII
- */
- if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII || phy_type == TYPE_USXGMII)
- ssc = NO_SSC;
- /* PHY configuration specific registers for single link */
- link_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->link_cmn_vals_tbl,
- CLK_ANY, CLK_ANY,
- phy_type, TYPE_NONE,
- ANY_SSC);
- if (link_cmn_vals) {
- reg_pairs = link_cmn_vals->reg_pairs;
- num_regs = link_cmn_vals->num_regs;
- regmap = cdns_phy->regmap_common_cdb;
- /**
- * First array value in link_cmn_vals must be of
- * PHY_PLL_CFG register
- */
- regmap_field_write(cdns_phy->phy_pll_cfg, reg_pairs[0].val);
- for (i = 1; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- xcvr_diag_vals = cdns_torrent_get_tbl_vals(&init_data->xcvr_diag_vals_tbl,
- CLK_ANY, CLK_ANY,
- phy_type, TYPE_NONE,
- ANY_SSC);
- if (xcvr_diag_vals) {
- reg_pairs = xcvr_diag_vals->reg_pairs;
- num_regs = xcvr_diag_vals->num_regs;
- for (i = 0; i < inst->num_lanes; i++) {
- regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
- for (j = 0; j < num_regs; j++)
- regmap_write(regmap, reg_pairs[j].off,
- reg_pairs[j].val);
- }
- }
- /* PHY PCS common registers configurations */
- pcs_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->pcs_cmn_vals_tbl,
- CLK_ANY, CLK_ANY,
- phy_type, TYPE_NONE,
- ANY_SSC);
- if (pcs_cmn_vals) {
- reg_pairs = pcs_cmn_vals->reg_pairs;
- num_regs = pcs_cmn_vals->num_regs;
- regmap = cdns_phy->regmap_phy_pcs_common_cdb;
- for (i = 0; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- /* PHY PMA common registers configurations */
- phy_pma_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->phy_pma_cmn_vals_tbl,
- CLK_ANY, CLK_ANY,
- phy_type, TYPE_NONE,
- ANY_SSC);
- if (phy_pma_cmn_vals) {
- reg_pairs = phy_pma_cmn_vals->reg_pairs;
- num_regs = phy_pma_cmn_vals->num_regs;
- regmap = cdns_phy->regmap_phy_pma_common_cdb;
- for (i = 0; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- /* PMA common registers configurations */
- cmn_vals = cdns_torrent_get_tbl_vals(&init_data->cmn_vals_tbl,
- ref_clk, ref_clk,
- phy_type, TYPE_NONE,
- ssc);
- if (cmn_vals) {
- reg_pairs = cmn_vals->reg_pairs;
- num_regs = cmn_vals->num_regs;
- regmap = cdns_phy->regmap_common_cdb;
- for (i = 0; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- /* PMA TX lane registers configurations */
- tx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->tx_ln_vals_tbl,
- ref_clk, ref_clk,
- phy_type, TYPE_NONE,
- ssc);
- if (tx_ln_vals) {
- reg_pairs = tx_ln_vals->reg_pairs;
- num_regs = tx_ln_vals->num_regs;
- for (i = 0; i < inst->num_lanes; i++) {
- regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
- for (j = 0; j < num_regs; j++)
- regmap_write(regmap, reg_pairs[j].off,
- reg_pairs[j].val);
- }
- }
- /* PMA RX lane registers configurations */
- rx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->rx_ln_vals_tbl,
- ref_clk, ref_clk,
- phy_type, TYPE_NONE,
- ssc);
- if (rx_ln_vals) {
- reg_pairs = rx_ln_vals->reg_pairs;
- num_regs = rx_ln_vals->num_regs;
- for (i = 0; i < inst->num_lanes; i++) {
- regmap = cdns_phy->regmap_rx_lane_cdb[i + inst->mlane];
- for (j = 0; j < num_regs; j++)
- regmap_write(regmap, reg_pairs[j].off,
- reg_pairs[j].val);
- }
- }
- if (phy_type == TYPE_DP)
- return cdns_torrent_dp_init(phy);
- return 0;
- }
- static const struct phy_ops cdns_torrent_phy_ops = {
- .init = cdns_torrent_phy_init,
- .configure = cdns_torrent_dp_configure,
- .power_on = cdns_torrent_phy_on,
- .power_off = cdns_torrent_phy_off,
- .owner = THIS_MODULE,
- };
- static
- int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy *cdns_phy)
- {
- const struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
- const struct cdns_torrent_data *init_data = cdns_phy->init_data;
- const struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
- enum cdns_torrent_ref_clk ref_clk1 = cdns_phy->ref_clk1_rate;
- enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate;
- const struct cdns_torrent_vals *phy_pma_cmn_vals;
- const struct cdns_torrent_vals *pcs_cmn_vals;
- enum cdns_torrent_phy_type phy_t1, phy_t2;
- const struct cdns_reg_pairs *reg_pairs;
- int i, j, node, mlane, num_lanes, ret;
- struct device *dev = cdns_phy->dev;
- enum cdns_torrent_ssc_mode ssc;
- struct regmap *regmap;
- u32 num_regs, num_protocols, protocol;
- num_protocols = hweight32(cdns_phy->protocol_bitmask);
- /* Maximum 2 protocols are supported */
- if (num_protocols > 2) {
- dev_err(dev, "at most 2 protocols are supported\n");
- return -EINVAL;
- }
- /**
- * Get PHY types directly from subnodes if only 2 subnodes exist.
- * It is possible for phy_t1 to be the same as phy_t2 for special
- * configurations such as PCIe Multilink.
- */
- if (cdns_phy->nsubnodes == 2) {
- phy_t1 = cdns_phy->phys[0].phy_type;
- phy_t2 = cdns_phy->phys[1].phy_type;
- } else {
- /**
- * Both PHY types / protocols should be unique.
- * If they are the same, it should be expressed with either
- * a) Single-Link (1 Sub-node) - handled via PHY APIs
- * OR
- * b) Double-Link (2 Sub-nodes) - handled above
- */
- if (num_protocols != 2) {
- dev_err(dev, "incorrect representation of link\n");
- return -EINVAL;
- }
- phy_t1 = fns(cdns_phy->protocol_bitmask, 0);
- phy_t2 = fns(cdns_phy->protocol_bitmask, 1);
- }
- /**
- * Configure all links with the protocol phy_t1 first followed by
- * configuring all links with the protocol phy_t2.
- *
- * When phy_t1 = phy_t2, it is a single protocol and configuration
- * is performed with a single iteration of the protocol and multiple
- * iterations over the sub-nodes (links).
- *
- * When phy_t1 != phy_t2, there are two protocols and configuration
- * is performed by iterating over all sub-nodes matching the first
- * protocol and configuring them first, followed by iterating over
- * all sub-nodes matching the second protocol and configuring them
- * next.
- */
- for (protocol = 0; protocol < num_protocols; protocol++) {
- /**
- * For the case where num_protocols is 1,
- * phy_t1 = phy_t2 and the swap is unnecessary.
- *
- * Swapping phy_t1 and phy_t2 is only required when the
- * number of protocols is 2 and there are 2 or more links.
- */
- if (protocol == 1) {
- /**
- * If first protocol with phy_t1 is configured, then
- * configure the PHY for second protocol with phy_t2.
- * Get the array values as [phy_t2][phy_t1][ssc].
- */
- swap(phy_t1, phy_t2);
- swap(ref_clk, ref_clk1);
- }
- for (node = 0; node < cdns_phy->nsubnodes; node++) {
- if (cdns_phy->phys[node].phy_type != phy_t1)
- continue;
- mlane = cdns_phy->phys[node].mlane;
- ssc = cdns_phy->phys[node].ssc_mode;
- num_lanes = cdns_phy->phys[node].num_lanes;
- /**
- * PHY configuration specific registers:
- * link_cmn_vals depend on combination of PHY types being
- * configured and are common for both PHY types, so array
- * values should be same for [phy_t1][phy_t2][ssc] and
- * [phy_t2][phy_t1][ssc].
- * xcvr_diag_vals also depend on combination of PHY types
- * being configured, but these can be different for particular
- * PHY type and are per lane.
- */
- link_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->link_cmn_vals_tbl,
- CLK_ANY, CLK_ANY,
- phy_t1, phy_t2, ANY_SSC);
- if (link_cmn_vals) {
- reg_pairs = link_cmn_vals->reg_pairs;
- num_regs = link_cmn_vals->num_regs;
- regmap = cdns_phy->regmap_common_cdb;
- /**
- * First array value in link_cmn_vals must be of
- * PHY_PLL_CFG register
- */
- regmap_field_write(cdns_phy->phy_pll_cfg,
- reg_pairs[0].val);
- for (i = 1; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- xcvr_diag_vals = cdns_torrent_get_tbl_vals(&init_data->xcvr_diag_vals_tbl,
- CLK_ANY, CLK_ANY,
- phy_t1, phy_t2, ANY_SSC);
- if (xcvr_diag_vals) {
- reg_pairs = xcvr_diag_vals->reg_pairs;
- num_regs = xcvr_diag_vals->num_regs;
- for (i = 0; i < num_lanes; i++) {
- regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
- for (j = 0; j < num_regs; j++)
- regmap_write(regmap, reg_pairs[j].off,
- reg_pairs[j].val);
- }
- }
- /* PHY PCS common registers configurations */
- pcs_cmn_vals = cdns_torrent_get_tbl_vals(&init_data->pcs_cmn_vals_tbl,
- CLK_ANY, CLK_ANY,
- phy_t1, phy_t2, ANY_SSC);
- if (pcs_cmn_vals) {
- reg_pairs = pcs_cmn_vals->reg_pairs;
- num_regs = pcs_cmn_vals->num_regs;
- regmap = cdns_phy->regmap_phy_pcs_common_cdb;
- for (i = 0; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- /* PHY PMA common registers configurations */
- phy_pma_cmn_vals =
- cdns_torrent_get_tbl_vals(&init_data->phy_pma_cmn_vals_tbl,
- CLK_ANY, CLK_ANY, phy_t1, phy_t2,
- ANY_SSC);
- if (phy_pma_cmn_vals) {
- reg_pairs = phy_pma_cmn_vals->reg_pairs;
- num_regs = phy_pma_cmn_vals->num_regs;
- regmap = cdns_phy->regmap_phy_pma_common_cdb;
- for (i = 0; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- /* PMA common registers configurations */
- cmn_vals = cdns_torrent_get_tbl_vals(&init_data->cmn_vals_tbl,
- ref_clk, ref_clk1,
- phy_t1, phy_t2, ssc);
- if (cmn_vals) {
- reg_pairs = cmn_vals->reg_pairs;
- num_regs = cmn_vals->num_regs;
- regmap = cdns_phy->regmap_common_cdb;
- for (i = 0; i < num_regs; i++)
- regmap_write(regmap, reg_pairs[i].off,
- reg_pairs[i].val);
- }
- /* PMA TX lane registers configurations */
- tx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->tx_ln_vals_tbl,
- ref_clk, ref_clk1,
- phy_t1, phy_t2, ssc);
- if (tx_ln_vals) {
- reg_pairs = tx_ln_vals->reg_pairs;
- num_regs = tx_ln_vals->num_regs;
- for (i = 0; i < num_lanes; i++) {
- regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
- for (j = 0; j < num_regs; j++)
- regmap_write(regmap, reg_pairs[j].off,
- reg_pairs[j].val);
- }
- }
- /* PMA RX lane registers configurations */
- rx_ln_vals = cdns_torrent_get_tbl_vals(&init_data->rx_ln_vals_tbl,
- ref_clk, ref_clk1,
- phy_t1, phy_t2, ssc);
- if (rx_ln_vals) {
- reg_pairs = rx_ln_vals->reg_pairs;
- num_regs = rx_ln_vals->num_regs;
- for (i = 0; i < num_lanes; i++) {
- regmap = cdns_phy->regmap_rx_lane_cdb[i + mlane];
- for (j = 0; j < num_regs; j++)
- regmap_write(regmap, reg_pairs[j].off,
- reg_pairs[j].val);
- }
- }
- if (phy_t1 == TYPE_DP) {
- ret = cdns_torrent_dp_get_pll(cdns_phy, phy_t2);
- if (ret)
- return ret;
- }
- reset_control_deassert(cdns_phy->phys[node].lnk_rst);
- }
- }
- /* Take the PHY out of reset */
- ret = reset_control_deassert(cdns_phy->phy_rst);
- if (ret)
- return ret;
- return 0;
- }
- static void cdns_torrent_clk_cleanup(struct cdns_torrent_phy *cdns_phy)
- {
- struct device *dev = cdns_phy->dev;
- of_clk_del_provider(dev->of_node);
- }
- static int cdns_torrent_clk_register(struct cdns_torrent_phy *cdns_phy)
- {
- struct device *dev = cdns_phy->dev;
- struct device_node *node = dev->of_node;
- struct clk_hw_onecell_data *data;
- int ret;
- data = devm_kzalloc(dev, struct_size(data, hws, CDNS_TORRENT_OUTPUT_CLOCKS), GFP_KERNEL);
- if (!data)
- return -ENOMEM;
- data->num = CDNS_TORRENT_OUTPUT_CLOCKS;
- cdns_phy->clk_hw_data = data;
- ret = cdns_torrent_derived_refclk_register(cdns_phy);
- if (ret) {
- dev_err(dev, "failed to register derived refclk\n");
- return ret;
- }
- ret = cdns_torrent_received_refclk_register(cdns_phy);
- if (ret) {
- dev_err(dev, "failed to register received refclk\n");
- return ret;
- }
- ret = cdns_torrent_refclk_driver_register(cdns_phy);
- if (ret) {
- dev_err(dev, "failed to register refclk driver\n");
- return ret;
- }
- ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, data);
- if (ret) {
- dev_err(dev, "Failed to add clock provider: %s\n", node->name);
- return ret;
- }
- return 0;
- }
- static int cdns_torrent_of_get_reset(struct cdns_torrent_phy *cdns_phy)
- {
- struct device *dev = cdns_phy->dev;
- cdns_phy->phy_rst = devm_reset_control_get_exclusive_by_index(dev, 0);
- if (IS_ERR(cdns_phy->phy_rst)) {
- dev_err(dev, "%s: failed to get reset\n",
- dev->of_node->full_name);
- return PTR_ERR(cdns_phy->phy_rst);
- }
- cdns_phy->apb_rst = devm_reset_control_get_optional_exclusive(dev, "torrent_apb");
- if (IS_ERR(cdns_phy->apb_rst)) {
- dev_err(dev, "%s: failed to get apb reset\n",
- dev->of_node->full_name);
- return PTR_ERR(cdns_phy->apb_rst);
- }
- return 0;
- }
- static int cdns_torrent_of_get_clk(struct cdns_torrent_phy *cdns_phy)
- {
- /* refclk: Input reference clock for PLL0 */
- cdns_phy->clk = devm_clk_get(cdns_phy->dev, "refclk");
- if (IS_ERR(cdns_phy->clk))
- return dev_err_probe(cdns_phy->dev, PTR_ERR(cdns_phy->clk),
- "phy ref clock not found\n");
- /* refclk1: Input reference clock for PLL1 */
- cdns_phy->clk1 = devm_clk_get_optional(cdns_phy->dev, "pll1_refclk");
- if (IS_ERR(cdns_phy->clk1))
- return dev_err_probe(cdns_phy->dev, PTR_ERR(cdns_phy->clk1),
- "phy PLL1 ref clock not found\n");
- return 0;
- }
- static int cdns_torrent_clk(struct cdns_torrent_phy *cdns_phy)
- {
- unsigned long ref_clk1_rate;
- unsigned long ref_clk_rate;
- int ret;
- ret = clk_prepare_enable(cdns_phy->clk);
- if (ret) {
- dev_err(cdns_phy->dev, "Failed to prepare ref clock: %d\n", ret);
- return ret;
- }
- ref_clk_rate = clk_get_rate(cdns_phy->clk);
- if (!ref_clk_rate) {
- dev_err(cdns_phy->dev, "Failed to get ref clock rate\n");
- ret = -EINVAL;
- goto disable_clk;
- }
- switch (ref_clk_rate) {
- case REF_CLK_19_2MHZ:
- cdns_phy->ref_clk_rate = CLK_19_2_MHZ;
- break;
- case REF_CLK_25MHZ:
- cdns_phy->ref_clk_rate = CLK_25_MHZ;
- break;
- case REF_CLK_100MHZ:
- cdns_phy->ref_clk_rate = CLK_100_MHZ;
- break;
- case REF_CLK_156_25MHZ:
- cdns_phy->ref_clk_rate = CLK_156_25_MHZ;
- break;
- default:
- dev_err(cdns_phy->dev, "Invalid ref clock rate\n");
- ret = -EINVAL;
- goto disable_clk;
- }
- if (cdns_phy->clk1) {
- ret = clk_prepare_enable(cdns_phy->clk1);
- if (ret) {
- dev_err(cdns_phy->dev, "Failed to prepare PLL1 ref clock: %d\n", ret);
- goto disable_clk;
- }
- ref_clk1_rate = clk_get_rate(cdns_phy->clk1);
- if (!ref_clk1_rate) {
- dev_err(cdns_phy->dev, "Failed to get PLL1 ref clock rate\n");
- ret = -EINVAL;
- goto disable_clk1;
- }
- switch (ref_clk1_rate) {
- case REF_CLK_19_2MHZ:
- cdns_phy->ref_clk1_rate = CLK_19_2_MHZ;
- break;
- case REF_CLK_25MHZ:
- cdns_phy->ref_clk1_rate = CLK_25_MHZ;
- break;
- case REF_CLK_100MHZ:
- cdns_phy->ref_clk1_rate = CLK_100_MHZ;
- break;
- case REF_CLK_156_25MHZ:
- cdns_phy->ref_clk1_rate = CLK_156_25_MHZ;
- break;
- default:
- dev_err(cdns_phy->dev, "Invalid PLL1 ref clock rate\n");
- ret = -EINVAL;
- goto disable_clk1;
- }
- } else {
- cdns_phy->ref_clk1_rate = cdns_phy->ref_clk_rate;
- }
- return 0;
- disable_clk1:
- clk_disable_unprepare(cdns_phy->clk1);
- disable_clk:
- clk_disable_unprepare(cdns_phy->clk);
- return ret;
- }
- static int cdns_torrent_phy_probe(struct platform_device *pdev)
- {
- struct cdns_torrent_phy *cdns_phy;
- struct device *dev = &pdev->dev;
- struct phy_provider *phy_provider;
- const struct cdns_torrent_data *data;
- struct device_node *child;
- int ret, subnodes, node = 0, i;
- u32 total_num_lanes = 0;
- u8 init_dp_regmap = 0;
- u32 phy_type;
- /* Get init data for this PHY */
- data = of_device_get_match_data(dev);
- if (!data)
- return -EINVAL;
- cdns_phy = devm_kzalloc(dev, sizeof(*cdns_phy), GFP_KERNEL);
- if (!cdns_phy)
- return -ENOMEM;
- dev_set_drvdata(dev, cdns_phy);
- cdns_phy->dev = dev;
- cdns_phy->init_data = data;
- cdns_phy->protocol_bitmask = 0;
- cdns_phy->sd_base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(cdns_phy->sd_base))
- return PTR_ERR(cdns_phy->sd_base);
- subnodes = of_get_available_child_count(dev->of_node);
- if (subnodes == 0) {
- dev_err(dev, "No available link subnodes found\n");
- return -EINVAL;
- }
- ret = cdns_torrent_regmap_init(cdns_phy);
- if (ret)
- return ret;
- ret = cdns_torrent_regfield_init(cdns_phy);
- if (ret)
- return ret;
- ret = cdns_torrent_clk_register(cdns_phy);
- if (ret)
- return ret;
- ret = cdns_torrent_of_get_reset(cdns_phy);
- if (ret)
- goto clk_cleanup;
- ret = cdns_torrent_of_get_clk(cdns_phy);
- if (ret)
- goto clk_cleanup;
- regmap_field_read(cdns_phy->phy_pma_cmn_ctrl_1, &cdns_phy->already_configured);
- if (!cdns_phy->already_configured) {
- ret = cdns_torrent_clk(cdns_phy);
- if (ret)
- goto clk_cleanup;
- /* Enable APB */
- reset_control_deassert(cdns_phy->apb_rst);
- }
- for_each_available_child_of_node(dev->of_node, child) {
- struct phy *gphy;
- /* PHY subnode name must be 'phy'. */
- if (!(of_node_name_eq(child, "phy")))
- continue;
- cdns_phy->phys[node].lnk_rst =
- of_reset_control_array_get_exclusive(child);
- if (IS_ERR(cdns_phy->phys[node].lnk_rst)) {
- dev_err(dev, "%s: failed to get reset\n",
- child->full_name);
- ret = PTR_ERR(cdns_phy->phys[node].lnk_rst);
- goto put_lnk_rst;
- }
- if (of_property_read_u32(child, "reg",
- &cdns_phy->phys[node].mlane)) {
- dev_err(dev, "%s: No \"reg\"-property.\n",
- child->full_name);
- ret = -EINVAL;
- goto put_child;
- }
- if (of_property_read_u32(child, "cdns,phy-type", &phy_type)) {
- dev_err(dev, "%s: No \"cdns,phy-type\"-property.\n",
- child->full_name);
- ret = -EINVAL;
- goto put_child;
- }
- switch (phy_type) {
- case PHY_TYPE_PCIE:
- cdns_phy->phys[node].phy_type = TYPE_PCIE;
- break;
- case PHY_TYPE_DP:
- cdns_phy->phys[node].phy_type = TYPE_DP;
- break;
- case PHY_TYPE_SGMII:
- cdns_phy->phys[node].phy_type = TYPE_SGMII;
- break;
- case PHY_TYPE_QSGMII:
- cdns_phy->phys[node].phy_type = TYPE_QSGMII;
- break;
- case PHY_TYPE_USB3:
- cdns_phy->phys[node].phy_type = TYPE_USB;
- break;
- case PHY_TYPE_USXGMII:
- cdns_phy->phys[node].phy_type = TYPE_USXGMII;
- break;
- default:
- dev_err(dev, "Unsupported protocol\n");
- ret = -EINVAL;
- goto put_child;
- }
- if (of_property_read_u32(child, "cdns,num-lanes",
- &cdns_phy->phys[node].num_lanes)) {
- dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n",
- child->full_name);
- ret = -EINVAL;
- goto put_child;
- }
- total_num_lanes += cdns_phy->phys[node].num_lanes;
- /* Get SSC mode */
- cdns_phy->phys[node].ssc_mode = NO_SSC;
- of_property_read_u32(child, "cdns,ssc-mode",
- &cdns_phy->phys[node].ssc_mode);
- gphy = devm_phy_create(dev, child, &cdns_torrent_phy_ops);
- if (IS_ERR(gphy)) {
- ret = PTR_ERR(gphy);
- goto put_child;
- }
- if (cdns_phy->phys[node].phy_type == TYPE_DP) {
- switch (cdns_phy->phys[node].num_lanes) {
- case 1:
- case 2:
- case 4:
- /* valid number of lanes */
- break;
- default:
- dev_err(dev, "unsupported number of lanes: %d\n",
- cdns_phy->phys[node].num_lanes);
- ret = -EINVAL;
- goto put_child;
- }
- cdns_phy->max_bit_rate = DEFAULT_MAX_BIT_RATE;
- of_property_read_u32(child, "cdns,max-bit-rate",
- &cdns_phy->max_bit_rate);
- switch (cdns_phy->max_bit_rate) {
- case 1620:
- case 2160:
- case 2430:
- case 2700:
- case 3240:
- case 4320:
- case 5400:
- case 8100:
- /* valid bit rate */
- break;
- default:
- dev_err(dev, "unsupported max bit rate: %dMbps\n",
- cdns_phy->max_bit_rate);
- ret = -EINVAL;
- goto put_child;
- }
- /* DPTX registers */
- cdns_phy->base = devm_platform_ioremap_resource(pdev, 1);
- if (IS_ERR(cdns_phy->base)) {
- ret = PTR_ERR(cdns_phy->base);
- goto put_child;
- }
- if (!init_dp_regmap) {
- ret = cdns_torrent_dp_regmap_init(cdns_phy);
- if (ret)
- goto put_child;
- ret = cdns_torrent_dp_regfield_init(cdns_phy);
- if (ret)
- goto put_child;
- init_dp_regmap++;
- }
- dev_dbg(dev, "DP max bit rate %d.%03d Gbps\n",
- cdns_phy->max_bit_rate / 1000,
- cdns_phy->max_bit_rate % 1000);
- gphy->attrs.bus_width = cdns_phy->phys[node].num_lanes;
- gphy->attrs.max_link_rate = cdns_phy->max_bit_rate;
- gphy->attrs.mode = PHY_MODE_DP;
- }
- cdns_phy->phys[node].phy = gphy;
- cdns_phy->protocol_bitmask |= BIT(cdns_phy->phys[node].phy_type);
- phy_set_drvdata(gphy, &cdns_phy->phys[node]);
- node++;
- }
- cdns_phy->nsubnodes = node;
- if (total_num_lanes > MAX_NUM_LANES) {
- dev_err(dev, "Invalid lane configuration\n");
- ret = -EINVAL;
- goto put_lnk_rst;
- }
- if (cdns_phy->nsubnodes > 1 && !cdns_phy->already_configured) {
- ret = cdns_torrent_phy_configure_multilink(cdns_phy);
- if (ret)
- goto put_lnk_rst;
- }
- phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
- if (IS_ERR(phy_provider)) {
- ret = PTR_ERR(phy_provider);
- goto put_lnk_rst;
- }
- if (cdns_phy->nsubnodes > 1)
- dev_dbg(dev, "Multi-link: %s (%d lanes) & %s (%d lanes)",
- cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type),
- cdns_phy->phys[0].num_lanes,
- cdns_torrent_get_phy_type(cdns_phy->phys[1].phy_type),
- cdns_phy->phys[1].num_lanes);
- else
- dev_dbg(dev, "Single link: %s (%d lanes)",
- cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type),
- cdns_phy->phys[0].num_lanes);
- return 0;
- put_child:
- node++;
- put_lnk_rst:
- for (i = 0; i < node; i++)
- reset_control_put(cdns_phy->phys[i].lnk_rst);
- of_node_put(child);
- reset_control_assert(cdns_phy->apb_rst);
- clk_disable_unprepare(cdns_phy->clk1);
- clk_disable_unprepare(cdns_phy->clk);
- clk_cleanup:
- cdns_torrent_clk_cleanup(cdns_phy);
- return ret;
- }
- static void cdns_torrent_phy_remove(struct platform_device *pdev)
- {
- struct cdns_torrent_phy *cdns_phy = platform_get_drvdata(pdev);
- int i;
- reset_control_assert(cdns_phy->phy_rst);
- reset_control_assert(cdns_phy->apb_rst);
- for (i = 0; i < cdns_phy->nsubnodes; i++) {
- reset_control_assert(cdns_phy->phys[i].lnk_rst);
- reset_control_put(cdns_phy->phys[i].lnk_rst);
- }
- clk_disable_unprepare(cdns_phy->clk1);
- clk_disable_unprepare(cdns_phy->clk);
- cdns_torrent_clk_cleanup(cdns_phy);
- }
- /* SGMII and QSGMII link configuration */
- static const struct cdns_reg_pairs sgmii_qsgmii_link_cmn_regs[] = {
- {0x0002, PHY_PLL_CFG}
- };
- static const struct cdns_reg_pairs sgmii_qsgmii_xcvr_diag_ln_regs[] = {
- {0x0003, XCVR_DIAG_HSCLK_DIV},
- {0x0113, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals sgmii_qsgmii_link_cmn_vals = {
- .reg_pairs = sgmii_qsgmii_link_cmn_regs,
- .num_regs = ARRAY_SIZE(sgmii_qsgmii_link_cmn_regs),
- };
- static const struct cdns_torrent_vals sgmii_qsgmii_xcvr_diag_ln_vals = {
- .reg_pairs = sgmii_qsgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sgmii_qsgmii_xcvr_diag_ln_regs),
- };
- static int cdns_torrent_phy_suspend_noirq(struct device *dev)
- {
- struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(dev);
- int i;
- reset_control_assert(cdns_phy->phy_rst);
- reset_control_assert(cdns_phy->apb_rst);
- for (i = 0; i < cdns_phy->nsubnodes; i++)
- reset_control_assert(cdns_phy->phys[i].lnk_rst);
- if (cdns_phy->already_configured)
- cdns_phy->already_configured = 0;
- else {
- clk_disable_unprepare(cdns_phy->clk1);
- clk_disable_unprepare(cdns_phy->clk);
- }
- return 0;
- }
- static int cdns_torrent_phy_resume_noirq(struct device *dev)
- {
- struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(dev);
- int node = cdns_phy->nsubnodes;
- int ret, i;
- ret = cdns_torrent_clk(cdns_phy);
- if (ret)
- return ret;
- /* Enable APB */
- reset_control_deassert(cdns_phy->apb_rst);
- if (cdns_phy->nsubnodes > 1) {
- ret = cdns_torrent_phy_configure_multilink(cdns_phy);
- if (ret)
- goto put_lnk_rst;
- }
- return 0;
- put_lnk_rst:
- for (i = 0; i < node; i++)
- reset_control_assert(cdns_phy->phys[i].lnk_rst);
- reset_control_assert(cdns_phy->apb_rst);
- clk_disable_unprepare(cdns_phy->clk1);
- clk_disable_unprepare(cdns_phy->clk);
- return ret;
- }
- static DEFINE_NOIRQ_DEV_PM_OPS(cdns_torrent_phy_pm_ops,
- cdns_torrent_phy_suspend_noirq,
- cdns_torrent_phy_resume_noirq);
- /* USB and DP link configuration */
- static const struct cdns_reg_pairs usb_dp_link_cmn_regs[] = {
- {0x0002, PHY_PLL_CFG},
- {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs usb_dp_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0041, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_reg_pairs dp_usb_xcvr_diag_ln_regs[] = {
- {0x0001, XCVR_DIAG_HSCLK_SEL},
- {0x0009, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals usb_dp_link_cmn_vals = {
- .reg_pairs = usb_dp_link_cmn_regs,
- .num_regs = ARRAY_SIZE(usb_dp_link_cmn_regs),
- };
- static const struct cdns_torrent_vals usb_dp_xcvr_diag_ln_vals = {
- .reg_pairs = usb_dp_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(usb_dp_xcvr_diag_ln_regs),
- };
- static const struct cdns_torrent_vals dp_usb_xcvr_diag_ln_vals = {
- .reg_pairs = dp_usb_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(dp_usb_xcvr_diag_ln_regs),
- };
- /* USXGMII and SGMII/QSGMII link configuration */
- static const struct cdns_reg_pairs usxgmii_sgmii_link_cmn_regs[] = {
- {0x0002, PHY_PLL_CFG},
- {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M0},
- {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs usxgmii_sgmii_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0001, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_reg_pairs sgmii_usxgmii_xcvr_diag_ln_regs[] = {
- {0x0111, XCVR_DIAG_HSCLK_SEL},
- {0x0103, XCVR_DIAG_HSCLK_DIV},
- {0x0A9B, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals usxgmii_sgmii_link_cmn_vals = {
- .reg_pairs = usxgmii_sgmii_link_cmn_regs,
- .num_regs = ARRAY_SIZE(usxgmii_sgmii_link_cmn_regs),
- };
- static const struct cdns_torrent_vals usxgmii_sgmii_xcvr_diag_ln_vals = {
- .reg_pairs = usxgmii_sgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(usxgmii_sgmii_xcvr_diag_ln_regs),
- };
- static const struct cdns_torrent_vals sgmii_usxgmii_xcvr_diag_ln_vals = {
- .reg_pairs = sgmii_usxgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sgmii_usxgmii_xcvr_diag_ln_regs),
- };
- /* Multilink USXGMII, using PLL0, 156.25 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs ml_usxgmii_pll0_156_25_no_ssc_cmn_regs[] = {
- {0x0014, CMN_PLL0_DSM_FBH_OVRD_M0},
- {0x0005, CMN_PLL0_DSM_FBL_OVRD_M0},
- {0x061B, CMN_PLL0_VCOCAL_INIT_TMR},
- {0x0019, CMN_PLL0_VCOCAL_ITER_TMR},
- {0x1354, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x1354, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0138, CMN_PLL0_LOCK_REFCNT_START},
- {0x0138, CMN_PLL0_LOCK_PLLCNT_START}
- };
- static const struct cdns_torrent_vals ml_usxgmii_pll0_156_25_no_ssc_cmn_vals = {
- .reg_pairs = ml_usxgmii_pll0_156_25_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(ml_usxgmii_pll0_156_25_no_ssc_cmn_regs),
- };
- /* Multilink SGMII/QSGMII, using PLL1, 100 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs ml_sgmii_pll1_100_no_ssc_cmn_regs[] = {
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL},
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_torrent_vals ml_sgmii_pll1_100_no_ssc_cmn_vals = {
- .reg_pairs = ml_sgmii_pll1_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(ml_sgmii_pll1_100_no_ssc_cmn_regs),
- };
- /* TI J7200, Multilink USXGMII, using PLL0, 156.25 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_regs[] = {
- {0x0014, CMN_SSM_BIAS_TMR},
- {0x0028, CMN_PLLSM0_PLLPRE_TMR},
- {0x00A4, CMN_PLLSM0_PLLLOCK_TMR},
- {0x0062, CMN_BGCAL_INIT_TMR},
- {0x0062, CMN_BGCAL_ITER_TMR},
- {0x0014, CMN_IBCAL_INIT_TMR},
- {0x0018, CMN_TXPUCAL_INIT_TMR},
- {0x0005, CMN_TXPUCAL_ITER_TMR},
- {0x0018, CMN_TXPDCAL_INIT_TMR},
- {0x0005, CMN_TXPDCAL_ITER_TMR},
- {0x024A, CMN_RXCAL_INIT_TMR},
- {0x0005, CMN_RXCAL_ITER_TMR},
- {0x000B, CMN_SD_CAL_REFTIM_START},
- {0x0132, CMN_SD_CAL_PLLCNT_START},
- {0x0014, CMN_PLL0_DSM_FBH_OVRD_M0},
- {0x0005, CMN_PLL0_DSM_FBL_OVRD_M0},
- {0x061B, CMN_PLL0_VCOCAL_INIT_TMR},
- {0x0019, CMN_PLL0_VCOCAL_ITER_TMR},
- {0x1354, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x1354, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0138, CMN_PLL0_LOCK_REFCNT_START},
- {0x0138, CMN_PLL0_LOCK_PLLCNT_START}
- };
- static const struct cdns_torrent_vals j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_vals = {
- .reg_pairs = j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_regs),
- };
- /* TI J7200, Multilink SGMII/QSGMII, using PLL1, 100 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs j7200_ml_sgmii_pll1_100_no_ssc_cmn_regs[] = {
- {0x0028, CMN_PLLSM1_PLLPRE_TMR},
- {0x00A4, CMN_PLLSM1_PLLLOCK_TMR},
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL},
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_torrent_vals j7200_ml_sgmii_pll1_100_no_ssc_cmn_vals = {
- .reg_pairs = j7200_ml_sgmii_pll1_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(j7200_ml_sgmii_pll1_100_no_ssc_cmn_regs),
- };
- /* PCIe and USXGMII link configuration */
- static const struct cdns_reg_pairs pcie_usxgmii_link_cmn_regs[] = {
- {0x0003, PHY_PLL_CFG},
- {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
- {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
- {0x0400, CMN_PDIAG_PLL1_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs pcie_usxgmii_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0012, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_reg_pairs usxgmii_pcie_xcvr_diag_ln_regs[] = {
- {0x0011, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0089, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals pcie_usxgmii_link_cmn_vals = {
- .reg_pairs = pcie_usxgmii_link_cmn_regs,
- .num_regs = ARRAY_SIZE(pcie_usxgmii_link_cmn_regs),
- };
- static const struct cdns_torrent_vals pcie_usxgmii_xcvr_diag_ln_vals = {
- .reg_pairs = pcie_usxgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(pcie_usxgmii_xcvr_diag_ln_regs),
- };
- static const struct cdns_torrent_vals usxgmii_pcie_xcvr_diag_ln_vals = {
- .reg_pairs = usxgmii_pcie_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(usxgmii_pcie_xcvr_diag_ln_regs),
- };
- /*
- * Multilink USXGMII, using PLL1, 156.25 MHz Ref clk, no SSC
- */
- static const struct cdns_reg_pairs ml_usxgmii_pll1_156_25_no_ssc_cmn_regs[] = {
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0014, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x0005, CMN_PLL1_DSM_FBL_OVRD_M0},
- {0x061B, CMN_PLL1_VCOCAL_INIT_TMR},
- {0x0019, CMN_PLL1_VCOCAL_ITER_TMR},
- {0x1354, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x1354, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL},
- {0x0138, CMN_PLL1_LOCK_REFCNT_START},
- {0x0138, CMN_PLL1_LOCK_PLLCNT_START},
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_reg_pairs ml_usxgmii_156_25_no_ssc_tx_ln_regs[] = {
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3 },
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x0000, XCVR_DIAG_PSC_OVRD}
- };
- static const struct cdns_reg_pairs ml_usxgmii_156_25_no_ssc_rx_ln_regs[] = {
- {0x091D, RX_PSC_A0},
- {0x0900, RX_PSC_A2},
- {0x0100, RX_PSC_A3},
- {0x0030, RX_REE_SMGM_CTRL1},
- {0x03C7, RX_REE_GCSM1_EQENM_PH1},
- {0x01C7, RX_REE_GCSM1_EQENM_PH2},
- {0x0000, RX_DIAG_DFE_CTRL},
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x00B9, RX_DIAG_NQST_CTRL},
- {0x0C21, RX_DIAG_DFE_AMP_TUNE_2},
- {0x0002, RX_DIAG_DFE_AMP_TUNE_3},
- {0x0033, RX_DIAG_PI_RATE},
- {0x0001, RX_DIAG_ACYA},
- {0x018C, RX_CDRLF_CNFG}
- };
- static const struct cdns_torrent_vals ml_usxgmii_pll1_156_25_no_ssc_cmn_vals = {
- .reg_pairs = ml_usxgmii_pll1_156_25_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(ml_usxgmii_pll1_156_25_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals ml_usxgmii_156_25_no_ssc_tx_ln_vals = {
- .reg_pairs = ml_usxgmii_156_25_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(ml_usxgmii_156_25_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals ml_usxgmii_156_25_no_ssc_rx_ln_vals = {
- .reg_pairs = ml_usxgmii_156_25_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(ml_usxgmii_156_25_no_ssc_rx_ln_regs),
- };
- /* TI USXGMII configuration: Enable cmn_refclk_rcv_out_en */
- static const struct cdns_reg_pairs ti_usxgmii_phy_pma_cmn_regs[] = {
- {0x0040, PHY_PMA_CMN_CTRL1},
- };
- static const struct cdns_torrent_vals ti_usxgmii_phy_pma_cmn_vals = {
- .reg_pairs = ti_usxgmii_phy_pma_cmn_regs,
- .num_regs = ARRAY_SIZE(ti_usxgmii_phy_pma_cmn_regs),
- };
- /* Single USXGMII link configuration */
- static const struct cdns_reg_pairs sl_usxgmii_link_cmn_regs[] = {
- {0x0000, PHY_PLL_CFG},
- {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs sl_usxgmii_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0001, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals sl_usxgmii_link_cmn_vals = {
- .reg_pairs = sl_usxgmii_link_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_usxgmii_link_cmn_regs),
- };
- static const struct cdns_torrent_vals sl_usxgmii_xcvr_diag_ln_vals = {
- .reg_pairs = sl_usxgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sl_usxgmii_xcvr_diag_ln_regs),
- };
- /* Single link USXGMII, 156.25 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs sl_usxgmii_156_25_no_ssc_cmn_regs[] = {
- {0x0014, CMN_SSM_BIAS_TMR},
- {0x0028, CMN_PLLSM0_PLLPRE_TMR},
- {0x00A4, CMN_PLLSM0_PLLLOCK_TMR},
- {0x0028, CMN_PLLSM1_PLLPRE_TMR},
- {0x00A4, CMN_PLLSM1_PLLLOCK_TMR},
- {0x0062, CMN_BGCAL_INIT_TMR},
- {0x0062, CMN_BGCAL_ITER_TMR},
- {0x0014, CMN_IBCAL_INIT_TMR},
- {0x0018, CMN_TXPUCAL_INIT_TMR},
- {0x0005, CMN_TXPUCAL_ITER_TMR},
- {0x0018, CMN_TXPDCAL_INIT_TMR},
- {0x0005, CMN_TXPDCAL_ITER_TMR},
- {0x024A, CMN_RXCAL_INIT_TMR},
- {0x0005, CMN_RXCAL_ITER_TMR},
- {0x000B, CMN_SD_CAL_REFTIM_START},
- {0x0132, CMN_SD_CAL_PLLCNT_START},
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0014, CMN_PLL0_DSM_FBH_OVRD_M0},
- {0x0014, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x0005, CMN_PLL0_DSM_FBL_OVRD_M0},
- {0x0005, CMN_PLL1_DSM_FBL_OVRD_M0},
- {0x061B, CMN_PLL0_VCOCAL_INIT_TMR},
- {0x061B, CMN_PLL1_VCOCAL_INIT_TMR},
- {0x0019, CMN_PLL0_VCOCAL_ITER_TMR},
- {0x0019, CMN_PLL1_VCOCAL_ITER_TMR},
- {0x1354, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x1354, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x1354, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x1354, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL},
- {0x0138, CMN_PLL0_LOCK_REFCNT_START},
- {0x0138, CMN_PLL1_LOCK_REFCNT_START},
- {0x0138, CMN_PLL0_LOCK_PLLCNT_START},
- {0x0138, CMN_PLL1_LOCK_PLLCNT_START}
- };
- static const struct cdns_reg_pairs usxgmii_156_25_no_ssc_tx_ln_regs[] = {
- {0x07A2, TX_RCVDET_ST_TMR},
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3},
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x0000, XCVR_DIAG_PSC_OVRD}
- };
- static const struct cdns_reg_pairs usxgmii_156_25_no_ssc_rx_ln_regs[] = {
- {0x0014, RX_SDCAL0_INIT_TMR},
- {0x0062, RX_SDCAL0_ITER_TMR},
- {0x0014, RX_SDCAL1_INIT_TMR},
- {0x0062, RX_SDCAL1_ITER_TMR},
- {0x091D, RX_PSC_A0},
- {0x0900, RX_PSC_A2},
- {0x0100, RX_PSC_A3},
- {0x0030, RX_REE_SMGM_CTRL1},
- {0x03C7, RX_REE_GCSM1_EQENM_PH1},
- {0x01C7, RX_REE_GCSM1_EQENM_PH2},
- {0x0000, RX_DIAG_DFE_CTRL},
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x00B9, RX_DIAG_NQST_CTRL},
- {0x0C21, RX_DIAG_DFE_AMP_TUNE_2},
- {0x0002, RX_DIAG_DFE_AMP_TUNE_3},
- {0x0033, RX_DIAG_PI_RATE},
- {0x0001, RX_DIAG_ACYA},
- {0x018C, RX_CDRLF_CNFG}
- };
- static const struct cdns_torrent_vals sl_usxgmii_156_25_no_ssc_cmn_vals = {
- .reg_pairs = sl_usxgmii_156_25_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_usxgmii_156_25_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals usxgmii_156_25_no_ssc_tx_ln_vals = {
- .reg_pairs = usxgmii_156_25_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals usxgmii_156_25_no_ssc_rx_ln_vals = {
- .reg_pairs = usxgmii_156_25_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(usxgmii_156_25_no_ssc_rx_ln_regs),
- };
- /* PCIe and DP link configuration */
- static const struct cdns_reg_pairs pcie_dp_link_cmn_regs[] = {
- {0x0003, PHY_PLL_CFG},
- {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
- {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1}
- };
- static const struct cdns_reg_pairs pcie_dp_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0012, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_reg_pairs dp_pcie_xcvr_diag_ln_regs[] = {
- {0x0001, XCVR_DIAG_HSCLK_SEL},
- {0x0009, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals pcie_dp_link_cmn_vals = {
- .reg_pairs = pcie_dp_link_cmn_regs,
- .num_regs = ARRAY_SIZE(pcie_dp_link_cmn_regs),
- };
- static const struct cdns_torrent_vals pcie_dp_xcvr_diag_ln_vals = {
- .reg_pairs = pcie_dp_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(pcie_dp_xcvr_diag_ln_regs),
- };
- static const struct cdns_torrent_vals dp_pcie_xcvr_diag_ln_vals = {
- .reg_pairs = dp_pcie_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(dp_pcie_xcvr_diag_ln_regs),
- };
- /* DP Multilink, 100 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs dp_100_no_ssc_cmn_regs[] = {
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_reg_pairs dp_100_no_ssc_tx_ln_regs[] = {
- {0x00FB, TX_PSC_A0},
- {0x04AA, TX_PSC_A2},
- {0x04AA, TX_PSC_A3},
- {0x000F, XCVR_DIAG_BIDI_CTRL}
- };
- static const struct cdns_reg_pairs dp_100_no_ssc_rx_ln_regs[] = {
- {0x0000, RX_PSC_A0},
- {0x0000, RX_PSC_A2},
- {0x0000, RX_PSC_A3},
- {0x0000, RX_PSC_CAL},
- {0x0000, RX_REE_GCSM1_CTRL},
- {0x0000, RX_REE_GCSM2_CTRL},
- {0x0000, RX_REE_PERGCSM_CTRL}
- };
- static const struct cdns_torrent_vals dp_100_no_ssc_cmn_vals = {
- .reg_pairs = dp_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(dp_100_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals dp_100_no_ssc_tx_ln_vals = {
- .reg_pairs = dp_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(dp_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals dp_100_no_ssc_rx_ln_vals = {
- .reg_pairs = dp_100_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(dp_100_no_ssc_rx_ln_regs),
- };
- /* Single DisplayPort(DP) link configuration */
- static const struct cdns_reg_pairs sl_dp_link_cmn_regs[] = {
- {0x0000, PHY_PLL_CFG},
- };
- static const struct cdns_reg_pairs sl_dp_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals sl_dp_link_cmn_vals = {
- .reg_pairs = sl_dp_link_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_dp_link_cmn_regs),
- };
- static const struct cdns_torrent_vals sl_dp_xcvr_diag_ln_vals = {
- .reg_pairs = sl_dp_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sl_dp_xcvr_diag_ln_regs),
- };
- /* Single DP, 19.2 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs sl_dp_19_2_no_ssc_cmn_regs[] = {
- {0x0014, CMN_SSM_BIAS_TMR},
- {0x0027, CMN_PLLSM0_PLLPRE_TMR},
- {0x00A1, CMN_PLLSM0_PLLLOCK_TMR},
- {0x0027, CMN_PLLSM1_PLLPRE_TMR},
- {0x00A1, CMN_PLLSM1_PLLLOCK_TMR},
- {0x0060, CMN_BGCAL_INIT_TMR},
- {0x0060, CMN_BGCAL_ITER_TMR},
- {0x0014, CMN_IBCAL_INIT_TMR},
- {0x0018, CMN_TXPUCAL_INIT_TMR},
- {0x0005, CMN_TXPUCAL_ITER_TMR},
- {0x0018, CMN_TXPDCAL_INIT_TMR},
- {0x0005, CMN_TXPDCAL_ITER_TMR},
- {0x0240, CMN_RXCAL_INIT_TMR},
- {0x0005, CMN_RXCAL_ITER_TMR},
- {0x0002, CMN_SD_CAL_INIT_TMR},
- {0x0002, CMN_SD_CAL_ITER_TMR},
- {0x000B, CMN_SD_CAL_REFTIM_START},
- {0x0137, CMN_SD_CAL_PLLCNT_START},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x00C0, CMN_PLL0_VCOCAL_INIT_TMR},
- {0x0004, CMN_PLL0_VCOCAL_ITER_TMR},
- {0x00C0, CMN_PLL1_VCOCAL_INIT_TMR},
- {0x0004, CMN_PLL1_VCOCAL_ITER_TMR},
- {0x0260, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0260, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL}
- };
- static const struct cdns_reg_pairs sl_dp_19_2_no_ssc_tx_ln_regs[] = {
- {0x0780, TX_RCVDET_ST_TMR},
- {0x00FB, TX_PSC_A0},
- {0x04AA, TX_PSC_A2},
- {0x04AA, TX_PSC_A3},
- {0x000F, XCVR_DIAG_BIDI_CTRL}
- };
- static const struct cdns_reg_pairs sl_dp_19_2_no_ssc_rx_ln_regs[] = {
- {0x0000, RX_PSC_A0},
- {0x0000, RX_PSC_A2},
- {0x0000, RX_PSC_A3},
- {0x0000, RX_PSC_CAL},
- {0x0000, RX_REE_GCSM1_CTRL},
- {0x0000, RX_REE_GCSM2_CTRL},
- {0x0000, RX_REE_PERGCSM_CTRL}
- };
- static const struct cdns_torrent_vals sl_dp_19_2_no_ssc_cmn_vals = {
- .reg_pairs = sl_dp_19_2_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals sl_dp_19_2_no_ssc_tx_ln_vals = {
- .reg_pairs = sl_dp_19_2_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals sl_dp_19_2_no_ssc_rx_ln_vals = {
- .reg_pairs = sl_dp_19_2_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_rx_ln_regs),
- };
- /* Single DP, 25 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs sl_dp_25_no_ssc_cmn_regs[] = {
- {0x0019, CMN_SSM_BIAS_TMR},
- {0x0032, CMN_PLLSM0_PLLPRE_TMR},
- {0x00D1, CMN_PLLSM0_PLLLOCK_TMR},
- {0x0032, CMN_PLLSM1_PLLPRE_TMR},
- {0x00D1, CMN_PLLSM1_PLLLOCK_TMR},
- {0x007D, CMN_BGCAL_INIT_TMR},
- {0x007D, CMN_BGCAL_ITER_TMR},
- {0x0019, CMN_IBCAL_INIT_TMR},
- {0x001E, CMN_TXPUCAL_INIT_TMR},
- {0x0006, CMN_TXPUCAL_ITER_TMR},
- {0x001E, CMN_TXPDCAL_INIT_TMR},
- {0x0006, CMN_TXPDCAL_ITER_TMR},
- {0x02EE, CMN_RXCAL_INIT_TMR},
- {0x0006, CMN_RXCAL_ITER_TMR},
- {0x0002, CMN_SD_CAL_INIT_TMR},
- {0x0002, CMN_SD_CAL_ITER_TMR},
- {0x000E, CMN_SD_CAL_REFTIM_START},
- {0x012B, CMN_SD_CAL_PLLCNT_START},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x00FA, CMN_PLL0_VCOCAL_INIT_TMR},
- {0x0004, CMN_PLL0_VCOCAL_ITER_TMR},
- {0x00FA, CMN_PLL1_VCOCAL_INIT_TMR},
- {0x0004, CMN_PLL1_VCOCAL_ITER_TMR},
- {0x0317, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0317, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL}
- };
- static const struct cdns_reg_pairs sl_dp_25_no_ssc_tx_ln_regs[] = {
- {0x09C4, TX_RCVDET_ST_TMR},
- {0x00FB, TX_PSC_A0},
- {0x04AA, TX_PSC_A2},
- {0x04AA, TX_PSC_A3},
- {0x000F, XCVR_DIAG_BIDI_CTRL}
- };
- static const struct cdns_reg_pairs sl_dp_25_no_ssc_rx_ln_regs[] = {
- {0x0000, RX_PSC_A0},
- {0x0000, RX_PSC_A2},
- {0x0000, RX_PSC_A3},
- {0x0000, RX_PSC_CAL},
- {0x0000, RX_REE_GCSM1_CTRL},
- {0x0000, RX_REE_GCSM2_CTRL},
- {0x0000, RX_REE_PERGCSM_CTRL}
- };
- static const struct cdns_torrent_vals sl_dp_25_no_ssc_cmn_vals = {
- .reg_pairs = sl_dp_25_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals sl_dp_25_no_ssc_tx_ln_vals = {
- .reg_pairs = sl_dp_25_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals sl_dp_25_no_ssc_rx_ln_vals = {
- .reg_pairs = sl_dp_25_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_rx_ln_regs),
- };
- /* Single DP, 100 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs sl_dp_100_no_ssc_cmn_regs[] = {
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL}
- };
- static const struct cdns_reg_pairs sl_dp_100_no_ssc_tx_ln_regs[] = {
- {0x00FB, TX_PSC_A0},
- {0x04AA, TX_PSC_A2},
- {0x04AA, TX_PSC_A3},
- {0x000F, XCVR_DIAG_BIDI_CTRL}
- };
- static const struct cdns_reg_pairs sl_dp_100_no_ssc_rx_ln_regs[] = {
- {0x0000, RX_PSC_A0},
- {0x0000, RX_PSC_A2},
- {0x0000, RX_PSC_A3},
- {0x0000, RX_PSC_CAL},
- {0x0000, RX_REE_GCSM1_CTRL},
- {0x0000, RX_REE_GCSM2_CTRL},
- {0x0000, RX_REE_PERGCSM_CTRL}
- };
- static const struct cdns_torrent_vals sl_dp_100_no_ssc_cmn_vals = {
- .reg_pairs = sl_dp_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals sl_dp_100_no_ssc_tx_ln_vals = {
- .reg_pairs = sl_dp_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals sl_dp_100_no_ssc_rx_ln_vals = {
- .reg_pairs = sl_dp_100_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_rx_ln_regs),
- };
- /* USB and SGMII/QSGMII link configuration */
- static const struct cdns_reg_pairs usb_sgmii_link_cmn_regs[] = {
- {0x0002, PHY_PLL_CFG},
- {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0},
- {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs usb_sgmii_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0041, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_reg_pairs sgmii_usb_xcvr_diag_ln_regs[] = {
- {0x0011, XCVR_DIAG_HSCLK_SEL},
- {0x0003, XCVR_DIAG_HSCLK_DIV},
- {0x009B, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals usb_sgmii_link_cmn_vals = {
- .reg_pairs = usb_sgmii_link_cmn_regs,
- .num_regs = ARRAY_SIZE(usb_sgmii_link_cmn_regs),
- };
- static const struct cdns_torrent_vals usb_sgmii_xcvr_diag_ln_vals = {
- .reg_pairs = usb_sgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(usb_sgmii_xcvr_diag_ln_regs),
- };
- static const struct cdns_torrent_vals sgmii_usb_xcvr_diag_ln_vals = {
- .reg_pairs = sgmii_usb_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sgmii_usb_xcvr_diag_ln_regs),
- };
- /* PCIe and USB Unique SSC link configuration */
- static const struct cdns_reg_pairs pcie_usb_link_cmn_regs[] = {
- {0x0003, PHY_PLL_CFG},
- {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
- {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
- {0x8600, CMN_PDIAG_PLL1_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs pcie_usb_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0012, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_reg_pairs usb_pcie_xcvr_diag_ln_regs[] = {
- {0x0011, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x00C9, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals pcie_usb_link_cmn_vals = {
- .reg_pairs = pcie_usb_link_cmn_regs,
- .num_regs = ARRAY_SIZE(pcie_usb_link_cmn_regs),
- };
- static const struct cdns_torrent_vals pcie_usb_xcvr_diag_ln_vals = {
- .reg_pairs = pcie_usb_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(pcie_usb_xcvr_diag_ln_regs),
- };
- static const struct cdns_torrent_vals usb_pcie_xcvr_diag_ln_vals = {
- .reg_pairs = usb_pcie_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(usb_pcie_xcvr_diag_ln_regs),
- };
- /* USB 100 MHz Ref clk, internal SSC */
- static const struct cdns_reg_pairs usb_100_int_ssc_cmn_regs[] = {
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0004, CMN_PLL0_DSM_DIAG_M1},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0064, CMN_PLL0_INTDIV_M0},
- {0x0050, CMN_PLL0_INTDIV_M1},
- {0x0064, CMN_PLL1_INTDIV_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M1},
- {0x0002, CMN_PLL1_FRACDIVH_M0},
- {0x0044, CMN_PLL0_HIGH_THR_M0},
- {0x0036, CMN_PLL0_HIGH_THR_M1},
- {0x0044, CMN_PLL1_HIGH_THR_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
- {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M1},
- {0x0001, CMN_PLL1_SS_CTRL1_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M1},
- {0x011B, CMN_PLL1_SS_CTRL2_M0},
- {0x006E, CMN_PLL0_SS_CTRL3_M0},
- {0x0058, CMN_PLL0_SS_CTRL3_M1},
- {0x006E, CMN_PLL1_SS_CTRL3_M0},
- {0x000E, CMN_PLL0_SS_CTRL4_M0},
- {0x0012, CMN_PLL0_SS_CTRL4_M1},
- {0x000E, CMN_PLL1_SS_CTRL4_M0},
- {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
- {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
- {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
- {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
- {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
- {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_torrent_vals usb_100_int_ssc_cmn_vals = {
- .reg_pairs = usb_100_int_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(usb_100_int_ssc_cmn_regs),
- };
- /* Single USB link configuration */
- static const struct cdns_reg_pairs sl_usb_link_cmn_regs[] = {
- {0x0000, PHY_PLL_CFG},
- {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs sl_usb_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0041, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals sl_usb_link_cmn_vals = {
- .reg_pairs = sl_usb_link_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_usb_link_cmn_regs),
- };
- static const struct cdns_torrent_vals sl_usb_xcvr_diag_ln_vals = {
- .reg_pairs = sl_usb_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sl_usb_xcvr_diag_ln_regs),
- };
- /* USB PHY PCS common configuration */
- static const struct cdns_reg_pairs usb_phy_pcs_cmn_regs[] = {
- {0x0A0A, PHY_PIPE_USB3_GEN2_PRE_CFG0},
- {0x1000, PHY_PIPE_USB3_GEN2_POST_CFG0},
- {0x0010, PHY_PIPE_USB3_GEN2_POST_CFG1}
- };
- static const struct cdns_torrent_vals usb_phy_pcs_cmn_vals = {
- .reg_pairs = usb_phy_pcs_cmn_regs,
- .num_regs = ARRAY_SIZE(usb_phy_pcs_cmn_regs),
- };
- /* USB 100 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs sl_usb_100_no_ssc_cmn_regs[] = {
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL},
- {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
- {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
- };
- static const struct cdns_torrent_vals sl_usb_100_no_ssc_cmn_vals = {
- .reg_pairs = sl_usb_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_usb_100_no_ssc_cmn_regs),
- };
- static const struct cdns_reg_pairs usb_100_no_ssc_cmn_regs[] = {
- {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
- {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_reg_pairs usb_100_no_ssc_tx_ln_regs[] = {
- {0x02FF, TX_PSC_A0},
- {0x06AF, TX_PSC_A1},
- {0x06AE, TX_PSC_A2},
- {0x06AE, TX_PSC_A3},
- {0x2A82, TX_TXCC_CTRL},
- {0x0014, TX_TXCC_CPOST_MULT_01},
- {0x0003, XCVR_DIAG_PSC_OVRD}
- };
- static const struct cdns_reg_pairs usb_100_no_ssc_rx_ln_regs[] = {
- {0x0D1D, RX_PSC_A0},
- {0x0D1D, RX_PSC_A1},
- {0x0D00, RX_PSC_A2},
- {0x0500, RX_PSC_A3},
- {0x0013, RX_SIGDET_HL_FILT_TMR},
- {0x0000, RX_REE_GCSM1_CTRL},
- {0x0C02, RX_REE_ATTEN_THR},
- {0x0330, RX_REE_SMGM_CTRL1},
- {0x0300, RX_REE_SMGM_CTRL2},
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x1004, RX_DIAG_SIGDET_TUNE},
- {0x00F9, RX_DIAG_NQST_CTRL},
- {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
- {0x0002, RX_DIAG_DFE_AMP_TUNE_3},
- {0x0000, RX_DIAG_PI_CAP},
- {0x0031, RX_DIAG_PI_RATE},
- {0x0001, RX_DIAG_ACYA},
- {0x018C, RX_CDRLF_CNFG},
- {0x0003, RX_CDRLF_CNFG3}
- };
- static const struct cdns_torrent_vals usb_100_no_ssc_cmn_vals = {
- .reg_pairs = usb_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(usb_100_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals usb_100_no_ssc_tx_ln_vals = {
- .reg_pairs = usb_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(usb_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals usb_100_no_ssc_rx_ln_vals = {
- .reg_pairs = usb_100_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(usb_100_no_ssc_rx_ln_regs),
- };
- /* Single link USB, 100 MHz Ref clk, internal SSC */
- static const struct cdns_reg_pairs sl_usb_100_int_ssc_cmn_regs[] = {
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0064, CMN_PLL0_INTDIV_M0},
- {0x0064, CMN_PLL1_INTDIV_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M0},
- {0x0002, CMN_PLL1_FRACDIVH_M0},
- {0x0044, CMN_PLL0_HIGH_THR_M0},
- {0x0044, CMN_PLL1_HIGH_THR_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
- {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M0},
- {0x0001, CMN_PLL1_SS_CTRL1_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M0},
- {0x011B, CMN_PLL1_SS_CTRL2_M0},
- {0x006E, CMN_PLL0_SS_CTRL3_M0},
- {0x006E, CMN_PLL1_SS_CTRL3_M0},
- {0x000E, CMN_PLL0_SS_CTRL4_M0},
- {0x000E, CMN_PLL1_SS_CTRL4_M0},
- {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL},
- {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
- {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
- {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
- {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
- {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
- {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
- };
- static const struct cdns_torrent_vals sl_usb_100_int_ssc_cmn_vals = {
- .reg_pairs = sl_usb_100_int_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_usb_100_int_ssc_cmn_regs),
- };
- /* PCIe and SGMII/QSGMII Unique SSC link configuration */
- static const struct cdns_reg_pairs pcie_sgmii_link_cmn_regs[] = {
- {0x0003, PHY_PLL_CFG},
- {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
- {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
- {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs pcie_sgmii_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0001, XCVR_DIAG_HSCLK_DIV},
- {0x0012, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_reg_pairs sgmii_pcie_xcvr_diag_ln_regs[] = {
- {0x0011, XCVR_DIAG_HSCLK_SEL},
- {0x0003, XCVR_DIAG_HSCLK_DIV},
- {0x009B, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals pcie_sgmii_link_cmn_vals = {
- .reg_pairs = pcie_sgmii_link_cmn_regs,
- .num_regs = ARRAY_SIZE(pcie_sgmii_link_cmn_regs),
- };
- static const struct cdns_torrent_vals pcie_sgmii_xcvr_diag_ln_vals = {
- .reg_pairs = pcie_sgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(pcie_sgmii_xcvr_diag_ln_regs),
- };
- static const struct cdns_torrent_vals sgmii_pcie_xcvr_diag_ln_vals = {
- .reg_pairs = sgmii_pcie_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sgmii_pcie_xcvr_diag_ln_regs),
- };
- /* SGMII 100 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs sl_sgmii_100_no_ssc_cmn_regs[] = {
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL}
- };
- static const struct cdns_torrent_vals sl_sgmii_100_no_ssc_cmn_vals = {
- .reg_pairs = sl_sgmii_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_sgmii_100_no_ssc_cmn_regs),
- };
- static const struct cdns_reg_pairs sgmii_100_no_ssc_cmn_regs[] = {
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_reg_pairs sgmii_100_no_ssc_tx_ln_regs[] = {
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3},
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x00B3, DRV_DIAG_TX_DRV},
- {0x0002, XCVR_DIAG_PSC_OVRD}
- };
- static const struct cdns_reg_pairs ti_sgmii_100_no_ssc_tx_ln_regs[] = {
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3},
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x00B3, DRV_DIAG_TX_DRV},
- {0x0002, XCVR_DIAG_PSC_OVRD},
- {0x4000, XCVR_DIAG_RXCLK_CTRL}
- };
- static const struct cdns_reg_pairs sgmii_100_no_ssc_rx_ln_regs[] = {
- {0x091D, RX_PSC_A0},
- {0x0900, RX_PSC_A2},
- {0x0100, RX_PSC_A3},
- {0x03C7, RX_REE_GCSM1_EQENM_PH1},
- {0x01C7, RX_REE_GCSM1_EQENM_PH2},
- {0x0000, RX_DIAG_DFE_CTRL},
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x0098, RX_DIAG_NQST_CTRL},
- {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
- {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
- {0x0000, RX_DIAG_PI_CAP},
- {0x0010, RX_DIAG_PI_RATE},
- {0x0001, RX_DIAG_ACYA},
- {0x018C, RX_CDRLF_CNFG},
- };
- static const struct cdns_torrent_vals sgmii_100_no_ssc_cmn_vals = {
- .reg_pairs = sgmii_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals sgmii_100_no_ssc_tx_ln_vals = {
- .reg_pairs = sgmii_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals ti_sgmii_100_no_ssc_tx_ln_vals = {
- .reg_pairs = ti_sgmii_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(ti_sgmii_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals sgmii_100_no_ssc_rx_ln_vals = {
- .reg_pairs = sgmii_100_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_rx_ln_regs),
- };
- /* TI J7200, multilink SGMII */
- static const struct cdns_reg_pairs j7200_sgmii_100_no_ssc_tx_ln_regs[] = {
- {0x07A2, TX_RCVDET_ST_TMR},
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3 },
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x00B3, DRV_DIAG_TX_DRV},
- {0x0002, XCVR_DIAG_PSC_OVRD},
- {0x4000, XCVR_DIAG_RXCLK_CTRL}
- };
- static const struct cdns_torrent_vals j7200_sgmii_100_no_ssc_tx_ln_vals = {
- .reg_pairs = j7200_sgmii_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(j7200_sgmii_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_reg_pairs j7200_sgmii_100_no_ssc_rx_ln_regs[] = {
- {0x0014, RX_SDCAL0_INIT_TMR},
- {0x0062, RX_SDCAL0_ITER_TMR},
- {0x0014, RX_SDCAL1_INIT_TMR},
- {0x0062, RX_SDCAL1_ITER_TMR},
- {0x091D, RX_PSC_A0},
- {0x0900, RX_PSC_A2},
- {0x0100, RX_PSC_A3},
- {0x03C7, RX_REE_GCSM1_EQENM_PH1},
- {0x01C7, RX_REE_GCSM1_EQENM_PH2},
- {0x0000, RX_DIAG_DFE_CTRL},
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x0098, RX_DIAG_NQST_CTRL},
- {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
- {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
- {0x0000, RX_DIAG_PI_CAP},
- {0x0010, RX_DIAG_PI_RATE},
- {0x0001, RX_DIAG_ACYA},
- {0x018C, RX_CDRLF_CNFG}
- };
- static const struct cdns_torrent_vals j7200_sgmii_100_no_ssc_rx_ln_vals = {
- .reg_pairs = j7200_sgmii_100_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(j7200_sgmii_100_no_ssc_rx_ln_regs),
- };
- /* SGMII 100 MHz Ref clk, internal SSC */
- static const struct cdns_reg_pairs sgmii_100_int_ssc_cmn_regs[] = {
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0004, CMN_PLL0_DSM_DIAG_M1},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0064, CMN_PLL0_INTDIV_M0},
- {0x0050, CMN_PLL0_INTDIV_M1},
- {0x0064, CMN_PLL1_INTDIV_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M1},
- {0x0002, CMN_PLL1_FRACDIVH_M0},
- {0x0044, CMN_PLL0_HIGH_THR_M0},
- {0x0036, CMN_PLL0_HIGH_THR_M1},
- {0x0044, CMN_PLL1_HIGH_THR_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
- {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M1},
- {0x0001, CMN_PLL1_SS_CTRL1_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M1},
- {0x011B, CMN_PLL1_SS_CTRL2_M0},
- {0x006E, CMN_PLL0_SS_CTRL3_M0},
- {0x0058, CMN_PLL0_SS_CTRL3_M1},
- {0x006E, CMN_PLL1_SS_CTRL3_M0},
- {0x000E, CMN_PLL0_SS_CTRL4_M0},
- {0x0012, CMN_PLL0_SS_CTRL4_M1},
- {0x000E, CMN_PLL1_SS_CTRL4_M0},
- {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
- {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
- {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
- {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_torrent_vals sgmii_100_int_ssc_cmn_vals = {
- .reg_pairs = sgmii_100_int_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sgmii_100_int_ssc_cmn_regs),
- };
- /* QSGMII 100 MHz Ref clk, no SSC */
- static const struct cdns_reg_pairs sl_qsgmii_100_no_ssc_cmn_regs[] = {
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
- {0x0003, CMN_PLL0_VCOCAL_TCTRL},
- {0x0003, CMN_PLL1_VCOCAL_TCTRL}
- };
- static const struct cdns_torrent_vals sl_qsgmii_100_no_ssc_cmn_vals = {
- .reg_pairs = sl_qsgmii_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_qsgmii_100_no_ssc_cmn_regs),
- };
- static const struct cdns_reg_pairs qsgmii_100_no_ssc_cmn_regs[] = {
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_reg_pairs qsgmii_100_no_ssc_tx_ln_regs[] = {
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3},
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x0011, TX_TXCC_MGNFS_MULT_100},
- {0x0003, DRV_DIAG_TX_DRV},
- {0x0002, XCVR_DIAG_PSC_OVRD}
- };
- static const struct cdns_reg_pairs ti_qsgmii_100_no_ssc_tx_ln_regs[] = {
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3},
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x0011, TX_TXCC_MGNFS_MULT_100},
- {0x0003, DRV_DIAG_TX_DRV},
- {0x0002, XCVR_DIAG_PSC_OVRD},
- {0x4000, XCVR_DIAG_RXCLK_CTRL}
- };
- static const struct cdns_reg_pairs qsgmii_100_no_ssc_rx_ln_regs[] = {
- {0x091D, RX_PSC_A0},
- {0x0900, RX_PSC_A2},
- {0x0100, RX_PSC_A3},
- {0x03C7, RX_REE_GCSM1_EQENM_PH1},
- {0x01C7, RX_REE_GCSM1_EQENM_PH2},
- {0x0000, RX_DIAG_DFE_CTRL},
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x0098, RX_DIAG_NQST_CTRL},
- {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
- {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
- {0x0000, RX_DIAG_PI_CAP},
- {0x0010, RX_DIAG_PI_RATE},
- {0x0001, RX_DIAG_ACYA},
- {0x018C, RX_CDRLF_CNFG},
- };
- static const struct cdns_torrent_vals qsgmii_100_no_ssc_cmn_vals = {
- .reg_pairs = qsgmii_100_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals qsgmii_100_no_ssc_tx_ln_vals = {
- .reg_pairs = qsgmii_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals ti_qsgmii_100_no_ssc_tx_ln_vals = {
- .reg_pairs = ti_qsgmii_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(ti_qsgmii_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_torrent_vals qsgmii_100_no_ssc_rx_ln_vals = {
- .reg_pairs = qsgmii_100_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_rx_ln_regs),
- };
- /* TI J7200, multilink QSGMII */
- static const struct cdns_reg_pairs j7200_qsgmii_100_no_ssc_tx_ln_regs[] = {
- {0x07A2, TX_RCVDET_ST_TMR},
- {0x00F3, TX_PSC_A0},
- {0x04A2, TX_PSC_A2},
- {0x04A2, TX_PSC_A3 },
- {0x0000, TX_TXCC_CPOST_MULT_00},
- {0x0011, TX_TXCC_MGNFS_MULT_100},
- {0x0003, DRV_DIAG_TX_DRV},
- {0x0002, XCVR_DIAG_PSC_OVRD},
- {0x4000, XCVR_DIAG_RXCLK_CTRL}
- };
- static const struct cdns_torrent_vals j7200_qsgmii_100_no_ssc_tx_ln_vals = {
- .reg_pairs = j7200_qsgmii_100_no_ssc_tx_ln_regs,
- .num_regs = ARRAY_SIZE(j7200_qsgmii_100_no_ssc_tx_ln_regs),
- };
- static const struct cdns_reg_pairs j7200_qsgmii_100_no_ssc_rx_ln_regs[] = {
- {0x0014, RX_SDCAL0_INIT_TMR},
- {0x0062, RX_SDCAL0_ITER_TMR},
- {0x0014, RX_SDCAL1_INIT_TMR},
- {0x0062, RX_SDCAL1_ITER_TMR},
- {0x091D, RX_PSC_A0},
- {0x0900, RX_PSC_A2},
- {0x0100, RX_PSC_A3},
- {0x03C7, RX_REE_GCSM1_EQENM_PH1},
- {0x01C7, RX_REE_GCSM1_EQENM_PH2},
- {0x0000, RX_DIAG_DFE_CTRL},
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x0098, RX_DIAG_NQST_CTRL},
- {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
- {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
- {0x0000, RX_DIAG_PI_CAP},
- {0x0010, RX_DIAG_PI_RATE},
- {0x0001, RX_DIAG_ACYA},
- {0x018C, RX_CDRLF_CNFG}
- };
- static const struct cdns_torrent_vals j7200_qsgmii_100_no_ssc_rx_ln_vals = {
- .reg_pairs = j7200_qsgmii_100_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(j7200_qsgmii_100_no_ssc_rx_ln_regs),
- };
- /* QSGMII 100 MHz Ref clk, internal SSC */
- static const struct cdns_reg_pairs qsgmii_100_int_ssc_cmn_regs[] = {
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0004, CMN_PLL0_DSM_DIAG_M1},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0064, CMN_PLL0_INTDIV_M0},
- {0x0050, CMN_PLL0_INTDIV_M1},
- {0x0064, CMN_PLL1_INTDIV_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M1},
- {0x0002, CMN_PLL1_FRACDIVH_M0},
- {0x0044, CMN_PLL0_HIGH_THR_M0},
- {0x0036, CMN_PLL0_HIGH_THR_M1},
- {0x0044, CMN_PLL1_HIGH_THR_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
- {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M1},
- {0x0001, CMN_PLL1_SS_CTRL1_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M1},
- {0x011B, CMN_PLL1_SS_CTRL2_M0},
- {0x006E, CMN_PLL0_SS_CTRL3_M0},
- {0x0058, CMN_PLL0_SS_CTRL3_M1},
- {0x006E, CMN_PLL1_SS_CTRL3_M0},
- {0x000E, CMN_PLL0_SS_CTRL4_M0},
- {0x0012, CMN_PLL0_SS_CTRL4_M1},
- {0x000E, CMN_PLL1_SS_CTRL4_M0},
- {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
- {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
- {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
- {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
- {0x007F, CMN_TXPUCAL_TUNE},
- {0x007F, CMN_TXPDCAL_TUNE}
- };
- static const struct cdns_torrent_vals qsgmii_100_int_ssc_cmn_vals = {
- .reg_pairs = qsgmii_100_int_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(qsgmii_100_int_ssc_cmn_regs),
- };
- /* Single SGMII/QSGMII link configuration */
- static const struct cdns_reg_pairs sl_sgmii_link_cmn_regs[] = {
- {0x0000, PHY_PLL_CFG},
- {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}
- };
- static const struct cdns_reg_pairs sl_sgmii_xcvr_diag_ln_regs[] = {
- {0x0000, XCVR_DIAG_HSCLK_SEL},
- {0x0003, XCVR_DIAG_HSCLK_DIV},
- {0x0013, XCVR_DIAG_PLLDRC_CTRL}
- };
- static const struct cdns_torrent_vals sl_sgmii_link_cmn_vals = {
- .reg_pairs = sl_sgmii_link_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_sgmii_link_cmn_regs),
- };
- static const struct cdns_torrent_vals sl_sgmii_xcvr_diag_ln_vals = {
- .reg_pairs = sl_sgmii_xcvr_diag_ln_regs,
- .num_regs = ARRAY_SIZE(sl_sgmii_xcvr_diag_ln_regs),
- };
- /* Multi link PCIe, 100 MHz Ref clk, internal SSC */
- static const struct cdns_reg_pairs pcie_100_int_ssc_cmn_regs[] = {
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0004, CMN_PLL0_DSM_DIAG_M1},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0064, CMN_PLL0_INTDIV_M0},
- {0x0050, CMN_PLL0_INTDIV_M1},
- {0x0064, CMN_PLL1_INTDIV_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M1},
- {0x0002, CMN_PLL1_FRACDIVH_M0},
- {0x0044, CMN_PLL0_HIGH_THR_M0},
- {0x0036, CMN_PLL0_HIGH_THR_M1},
- {0x0044, CMN_PLL1_HIGH_THR_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
- {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M1},
- {0x0001, CMN_PLL1_SS_CTRL1_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M1},
- {0x011B, CMN_PLL1_SS_CTRL2_M0},
- {0x006E, CMN_PLL0_SS_CTRL3_M0},
- {0x0058, CMN_PLL0_SS_CTRL3_M1},
- {0x006E, CMN_PLL1_SS_CTRL3_M0},
- {0x000E, CMN_PLL0_SS_CTRL4_M0},
- {0x0012, CMN_PLL0_SS_CTRL4_M1},
- {0x000E, CMN_PLL1_SS_CTRL4_M0},
- {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
- {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
- {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
- {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
- };
- static const struct cdns_torrent_vals pcie_100_int_ssc_cmn_vals = {
- .reg_pairs = pcie_100_int_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(pcie_100_int_ssc_cmn_regs),
- };
- /* Single link PCIe, 100 MHz Ref clk, internal SSC */
- static const struct cdns_reg_pairs sl_pcie_100_int_ssc_cmn_regs[] = {
- {0x0004, CMN_PLL0_DSM_DIAG_M0},
- {0x0004, CMN_PLL0_DSM_DIAG_M1},
- {0x0004, CMN_PLL1_DSM_DIAG_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
- {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
- {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
- {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
- {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
- {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
- {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
- {0x0064, CMN_PLL0_INTDIV_M0},
- {0x0050, CMN_PLL0_INTDIV_M1},
- {0x0050, CMN_PLL1_INTDIV_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M0},
- {0x0002, CMN_PLL0_FRACDIVH_M1},
- {0x0002, CMN_PLL1_FRACDIVH_M0},
- {0x0044, CMN_PLL0_HIGH_THR_M0},
- {0x0036, CMN_PLL0_HIGH_THR_M1},
- {0x0036, CMN_PLL1_HIGH_THR_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
- {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
- {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M0},
- {0x0001, CMN_PLL0_SS_CTRL1_M1},
- {0x0001, CMN_PLL1_SS_CTRL1_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M0},
- {0x011B, CMN_PLL0_SS_CTRL2_M1},
- {0x011B, CMN_PLL1_SS_CTRL2_M0},
- {0x006E, CMN_PLL0_SS_CTRL3_M0},
- {0x0058, CMN_PLL0_SS_CTRL3_M1},
- {0x0058, CMN_PLL1_SS_CTRL3_M0},
- {0x000E, CMN_PLL0_SS_CTRL4_M0},
- {0x0012, CMN_PLL0_SS_CTRL4_M1},
- {0x0012, CMN_PLL1_SS_CTRL4_M0},
- {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
- {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
- {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
- {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
- {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
- {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
- {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
- {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
- {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
- };
- static const struct cdns_torrent_vals sl_pcie_100_int_ssc_cmn_vals = {
- .reg_pairs = sl_pcie_100_int_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(sl_pcie_100_int_ssc_cmn_regs),
- };
- /* PCIe, 100 MHz Ref clk, no SSC & external SSC */
- static const struct cdns_reg_pairs pcie_100_ext_no_ssc_cmn_regs[] = {
- {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
- {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
- {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0}
- };
- static const struct cdns_reg_pairs pcie_100_ext_no_ssc_rx_ln_regs[] = {
- {0x0019, RX_REE_TAP1_CLIP},
- {0x0019, RX_REE_TAP2TON_CLIP},
- {0x0001, RX_DIAG_ACYA}
- };
- static const struct cdns_torrent_vals pcie_100_no_ssc_cmn_vals = {
- .reg_pairs = pcie_100_ext_no_ssc_cmn_regs,
- .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_cmn_regs),
- };
- static const struct cdns_torrent_vals pcie_100_no_ssc_rx_ln_vals = {
- .reg_pairs = pcie_100_ext_no_ssc_rx_ln_regs,
- .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs),
- };
- static const struct cdns_torrent_vals_entry link_cmn_vals_entries[] = {
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_NONE), &sl_dp_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_PCIE), &pcie_dp_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_USB), &usb_dp_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_NONE), NULL},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_SGMII), &pcie_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_QSGMII), &pcie_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USB), &pcie_usb_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_DP), &pcie_dp_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USXGMII), &pcie_usxgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_NONE), &sl_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_PCIE), &pcie_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_QSGMII), &sgmii_qsgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USB), &usb_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USXGMII), &usxgmii_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_NONE), &sl_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_PCIE), &pcie_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_SGMII), &sgmii_qsgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USB), &usb_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USXGMII), &usxgmii_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &sl_usb_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &pcie_usb_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_dp_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &sl_usxgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_PCIE), &pcie_usxgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_SGMII), &usxgmii_sgmii_link_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_QSGMII), &usxgmii_sgmii_link_cmn_vals},
- };
- static const struct cdns_torrent_vals_entry xcvr_diag_vals_entries[] = {
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_NONE), &sl_dp_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_PCIE), &dp_pcie_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_DP, TYPE_USB), &dp_usb_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_NONE), NULL},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_SGMII), &pcie_sgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_QSGMII), &pcie_sgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USB), &pcie_usb_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_DP), &pcie_dp_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_PCIE, TYPE_USXGMII), &pcie_usxgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_NONE), &sl_sgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_PCIE), &sgmii_pcie_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_QSGMII), &sgmii_qsgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USB), &sgmii_usb_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_SGMII, TYPE_USXGMII), &sgmii_usxgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_NONE), &sl_sgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_PCIE), &sgmii_pcie_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_SGMII), &sgmii_qsgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USB), &sgmii_usb_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_QSGMII, TYPE_USXGMII), &sgmii_usxgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &sl_usb_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &usb_pcie_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_sgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_sgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_dp_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &sl_usxgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_PCIE), &usxgmii_pcie_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_SGMII), &usxgmii_sgmii_xcvr_diag_ln_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_QSGMII), &usxgmii_sgmii_xcvr_diag_ln_vals},
- };
- static const struct cdns_torrent_vals_entry pcs_cmn_vals_entries[] = {
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_NONE), &usb_phy_pcs_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_PCIE), &usb_phy_pcs_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_SGMII), &usb_phy_pcs_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_QSGMII), &usb_phy_pcs_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USB, TYPE_DP), &usb_phy_pcs_cmn_vals},
- };
- static const struct cdns_torrent_vals_entry cmn_vals_entries[] = {
- {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &sl_pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sl_sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_QSGMII, NO_SSC), &sl_sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &sl_qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_SGMII, NO_SSC), &sl_qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &sl_usxgmii_156_25_no_ssc_cmn_vals},
- /* Dual refclk */
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &ml_sgmii_pll1_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &ml_sgmii_pll1_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_pll1_156_25_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
- };
- static const struct cdns_torrent_vals_entry cdns_tx_ln_vals_entries[] = {
- {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_QSGMII, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_SGMII, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
- /* Dual refclk */
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
- };
- static const struct cdns_torrent_vals_entry cdns_rx_ln_vals_entries[] = {
- {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_QSGMII, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_SGMII, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
- /* Dual refclk */
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
- };
- static const struct cdns_torrent_data cdns_map_torrent = {
- .block_offset_shift = 0x2,
- .reg_offset_shift = 0x2,
- .link_cmn_vals_tbl = {
- .entries = link_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(link_cmn_vals_entries),
- },
- .xcvr_diag_vals_tbl = {
- .entries = xcvr_diag_vals_entries,
- .num_entries = ARRAY_SIZE(xcvr_diag_vals_entries),
- },
- .pcs_cmn_vals_tbl = {
- .entries = pcs_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(pcs_cmn_vals_entries),
- },
- .cmn_vals_tbl = {
- .entries = cmn_vals_entries,
- .num_entries = ARRAY_SIZE(cmn_vals_entries),
- },
- .tx_ln_vals_tbl = {
- .entries = cdns_tx_ln_vals_entries,
- .num_entries = ARRAY_SIZE(cdns_tx_ln_vals_entries),
- },
- .rx_ln_vals_tbl = {
- .entries = cdns_rx_ln_vals_entries,
- .num_entries = ARRAY_SIZE(cdns_rx_ln_vals_entries),
- },
- };
- static const struct cdns_torrent_vals_entry j721e_phy_pma_cmn_vals_entries[] = {
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_NONE), &ti_usxgmii_phy_pma_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_PCIE), &ti_usxgmii_phy_pma_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_SGMII), &ti_usxgmii_phy_pma_cmn_vals},
- {CDNS_TORRENT_KEY_ANYCLK(TYPE_USXGMII, TYPE_QSGMII), &ti_usxgmii_phy_pma_cmn_vals},
- };
- static const struct cdns_torrent_vals_entry ti_tx_ln_vals_entries[] = {
- {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_QSGMII, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_SGMII, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
- /* Dual refclk */
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
- };
- static const struct cdns_torrent_data ti_j721e_map_torrent = {
- .block_offset_shift = 0x0,
- .reg_offset_shift = 0x1,
- .link_cmn_vals_tbl = {
- .entries = link_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(link_cmn_vals_entries),
- },
- .xcvr_diag_vals_tbl = {
- .entries = xcvr_diag_vals_entries,
- .num_entries = ARRAY_SIZE(xcvr_diag_vals_entries),
- },
- .pcs_cmn_vals_tbl = {
- .entries = pcs_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(pcs_cmn_vals_entries),
- },
- .phy_pma_cmn_vals_tbl = {
- .entries = j721e_phy_pma_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(j721e_phy_pma_cmn_vals_entries),
- },
- .cmn_vals_tbl = {
- .entries = cmn_vals_entries,
- .num_entries = ARRAY_SIZE(cmn_vals_entries),
- },
- .tx_ln_vals_tbl = {
- .entries = ti_tx_ln_vals_entries,
- .num_entries = ARRAY_SIZE(ti_tx_ln_vals_entries),
- },
- .rx_ln_vals_tbl = {
- .entries = cdns_rx_ln_vals_entries,
- .num_entries = ARRAY_SIZE(cdns_rx_ln_vals_entries),
- },
- };
- /* TI J7200 (Torrent SD0805) */
- static const struct cdns_torrent_vals_entry ti_j7200_cmn_vals_entries[] = {
- {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &sl_dp_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &sl_pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sl_sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_QSGMII, NO_SSC), &sl_sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &sl_qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_SGMII, NO_SSC), &sl_qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &sl_usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &sl_usb_100_int_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &sl_usxgmii_156_25_no_ssc_cmn_vals},
- /* Dual refclk */
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &j7200_ml_sgmii_pll1_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &j7200_ml_sgmii_pll1_100_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_pll1_156_25_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &j7200_ml_usxgmii_pll0_156_25_no_ssc_cmn_vals},
- };
- static const struct cdns_torrent_vals_entry ti_j7200_tx_ln_vals_entries[] = {
- {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_QSGMII, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &ti_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_SGMII, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &ti_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
- /* Dual refclk */
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), NULL},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &j7200_sgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &j7200_qsgmii_100_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &usxgmii_156_25_no_ssc_tx_ln_vals},
- };
- static const struct cdns_torrent_vals_entry ti_j7200_rx_ln_vals_entries[] = {
- {CDNS_TORRENT_KEY(CLK_19_2_MHZ, CLK_19_2_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_19_2_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_25_MHZ, CLK_25_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_25_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_NONE, NO_SSC), &sl_dp_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_PCIE, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_DP, TYPE_USB, NO_SSC), &dp_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_NONE, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_SGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_QSGMII, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, EXTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_USB, INTERNAL_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_PCIE, TYPE_DP, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_NONE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_PCIE, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_QSGMII, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, NO_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, EXTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_SGMII, TYPE_USB, INTERNAL_SSC), &sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_NONE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_PCIE, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_SGMII, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, NO_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, EXTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_QSGMII, TYPE_USB, INTERNAL_SSC), &qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_NONE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_PCIE, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_SGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, EXTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_QSGMII, INTERNAL_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_100_MHZ, TYPE_USB, TYPE_DP, NO_SSC), &usb_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_156_25_MHZ, TYPE_USXGMII, TYPE_NONE, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
- /* Dual refclk */
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_PCIE, TYPE_USXGMII, NO_SSC), &pcie_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_SGMII, TYPE_USXGMII, NO_SSC), &j7200_sgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_100_MHZ, CLK_156_25_MHZ, TYPE_QSGMII, TYPE_USXGMII, NO_SSC), &j7200_qsgmii_100_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_PCIE, NO_SSC), &ml_usxgmii_156_25_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_SGMII, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
- {CDNS_TORRENT_KEY(CLK_156_25_MHZ, CLK_100_MHZ, TYPE_USXGMII, TYPE_QSGMII, NO_SSC), &usxgmii_156_25_no_ssc_rx_ln_vals},
- };
- static const struct cdns_torrent_data ti_j7200_map_torrent = {
- .block_offset_shift = 0x0,
- .reg_offset_shift = 0x1,
- .link_cmn_vals_tbl = {
- .entries = link_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(link_cmn_vals_entries),
- },
- .xcvr_diag_vals_tbl = {
- .entries = xcvr_diag_vals_entries,
- .num_entries = ARRAY_SIZE(xcvr_diag_vals_entries),
- },
- .pcs_cmn_vals_tbl = {
- .entries = pcs_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(pcs_cmn_vals_entries),
- },
- .phy_pma_cmn_vals_tbl = {
- .entries = j721e_phy_pma_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(j721e_phy_pma_cmn_vals_entries),
- },
- .cmn_vals_tbl = {
- .entries = ti_j7200_cmn_vals_entries,
- .num_entries = ARRAY_SIZE(ti_j7200_cmn_vals_entries),
- },
- .tx_ln_vals_tbl = {
- .entries = ti_j7200_tx_ln_vals_entries,
- .num_entries = ARRAY_SIZE(ti_j7200_tx_ln_vals_entries),
- },
- .rx_ln_vals_tbl = {
- .entries = ti_j7200_rx_ln_vals_entries,
- .num_entries = ARRAY_SIZE(ti_j7200_rx_ln_vals_entries),
- },
- };
- static const struct of_device_id cdns_torrent_phy_of_match[] = {
- {
- .compatible = "cdns,torrent-phy",
- .data = &cdns_map_torrent,
- },
- {
- .compatible = "ti,j721e-serdes-10g",
- .data = &ti_j721e_map_torrent,
- },
- {
- .compatible = "ti,j7200-serdes-10g",
- .data = &ti_j7200_map_torrent,
- },
- {}
- };
- MODULE_DEVICE_TABLE(of, cdns_torrent_phy_of_match);
- static struct platform_driver cdns_torrent_phy_driver = {
- .probe = cdns_torrent_phy_probe,
- .remove_new = cdns_torrent_phy_remove,
- .driver = {
- .name = "cdns-torrent-phy",
- .of_match_table = cdns_torrent_phy_of_match,
- .pm = pm_sleep_ptr(&cdns_torrent_phy_pm_ops),
- }
- };
- module_platform_driver(cdns_torrent_phy_driver);
- MODULE_AUTHOR("Cadence Design Systems, Inc.");
- MODULE_DESCRIPTION("Cadence Torrent PHY driver");
- MODULE_LICENSE("GPL v2");
|