motorcomm.c 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Motorcomm 8511/8521/8531/8531S/8821 PHY driver.
  4. *
  5. * Author: Peter Geis <pgwipeout@gmail.com>
  6. * Author: Frank <Frank.Sae@motor-comm.com>
  7. */
  8. #include <linux/etherdevice.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/phy.h>
  12. #include <linux/of.h>
  13. #define PHY_ID_YT8511 0x0000010a
  14. #define PHY_ID_YT8521 0x0000011a
  15. #define PHY_ID_YT8531 0x4f51e91b
  16. #define PHY_ID_YT8531S 0x4f51e91a
  17. #define PHY_ID_YT8821 0x4f51ea19
  18. /* YT8521/YT8531S/YT8821 Register Overview
  19. * UTP Register space | FIBER Register space
  20. * ------------------------------------------------------------
  21. * | UTP MII | FIBER MII |
  22. * | UTP MMD | |
  23. * | UTP Extended | FIBER Extended |
  24. * ------------------------------------------------------------
  25. * | Common Extended |
  26. * ------------------------------------------------------------
  27. */
  28. /* 0x10 ~ 0x15 , 0x1E and 0x1F are common MII registers of yt phy */
  29. /* Specific Function Control Register */
  30. #define YTPHY_SPECIFIC_FUNCTION_CONTROL_REG 0x10
  31. /* 2b00 Manual MDI configuration
  32. * 2b01 Manual MDIX configuration
  33. * 2b10 Reserved
  34. * 2b11 Enable automatic crossover for all modes *default*
  35. */
  36. #define YTPHY_SFCR_MDI_CROSSOVER_MODE_MASK (BIT(6) | BIT(5))
  37. #define YTPHY_SFCR_CROSSOVER_EN BIT(3)
  38. #define YTPHY_SFCR_SQE_TEST_EN BIT(2)
  39. #define YTPHY_SFCR_POLARITY_REVERSAL_EN BIT(1)
  40. #define YTPHY_SFCR_JABBER_DIS BIT(0)
  41. /* Specific Status Register */
  42. #define YTPHY_SPECIFIC_STATUS_REG 0x11
  43. #define YTPHY_SSR_SPEED_MASK ((0x3 << 14) | BIT(9))
  44. #define YTPHY_SSR_SPEED_10M ((0x0 << 14))
  45. #define YTPHY_SSR_SPEED_100M ((0x1 << 14))
  46. #define YTPHY_SSR_SPEED_1000M ((0x2 << 14))
  47. #define YTPHY_SSR_SPEED_10G ((0x3 << 14))
  48. #define YTPHY_SSR_SPEED_2500M ((0x0 << 14) | BIT(9))
  49. #define YTPHY_SSR_DUPLEX_OFFSET 13
  50. #define YTPHY_SSR_DUPLEX BIT(13)
  51. #define YTPHY_SSR_PAGE_RECEIVED BIT(12)
  52. #define YTPHY_SSR_SPEED_DUPLEX_RESOLVED BIT(11)
  53. #define YTPHY_SSR_LINK BIT(10)
  54. #define YTPHY_SSR_MDIX_CROSSOVER BIT(6)
  55. #define YTPHY_SSR_DOWNGRADE BIT(5)
  56. #define YTPHY_SSR_TRANSMIT_PAUSE BIT(3)
  57. #define YTPHY_SSR_RECEIVE_PAUSE BIT(2)
  58. #define YTPHY_SSR_POLARITY BIT(1)
  59. #define YTPHY_SSR_JABBER BIT(0)
  60. /* Interrupt enable Register */
  61. #define YTPHY_INTERRUPT_ENABLE_REG 0x12
  62. #define YTPHY_IER_WOL BIT(6)
  63. /* Interrupt Status Register */
  64. #define YTPHY_INTERRUPT_STATUS_REG 0x13
  65. #define YTPHY_ISR_AUTONEG_ERR BIT(15)
  66. #define YTPHY_ISR_SPEED_CHANGED BIT(14)
  67. #define YTPHY_ISR_DUPLEX_CHANGED BIT(13)
  68. #define YTPHY_ISR_PAGE_RECEIVED BIT(12)
  69. #define YTPHY_ISR_LINK_FAILED BIT(11)
  70. #define YTPHY_ISR_LINK_SUCCESSED BIT(10)
  71. #define YTPHY_ISR_WOL BIT(6)
  72. #define YTPHY_ISR_WIRESPEED_DOWNGRADE BIT(5)
  73. #define YTPHY_ISR_SERDES_LINK_FAILED BIT(3)
  74. #define YTPHY_ISR_SERDES_LINK_SUCCESSED BIT(2)
  75. #define YTPHY_ISR_POLARITY_CHANGED BIT(1)
  76. #define YTPHY_ISR_JABBER_HAPPENED BIT(0)
  77. /* Speed Auto Downgrade Control Register */
  78. #define YTPHY_SPEED_AUTO_DOWNGRADE_CONTROL_REG 0x14
  79. #define YTPHY_SADCR_SPEED_DOWNGRADE_EN BIT(5)
  80. /* If these bits are set to 3, the PHY attempts five times ( 3(set value) +
  81. * additional 2) before downgrading, default 0x3
  82. */
  83. #define YTPHY_SADCR_SPEED_RETRY_LIMIT (0x3 << 2)
  84. /* Rx Error Counter Register */
  85. #define YTPHY_RX_ERROR_COUNTER_REG 0x15
  86. /* Extended Register's Address Offset Register */
  87. #define YTPHY_PAGE_SELECT 0x1E
  88. /* Extended Register's Data Register */
  89. #define YTPHY_PAGE_DATA 0x1F
  90. /* FIBER Auto-Negotiation link partner ability */
  91. #define YTPHY_FLPA_PAUSE (0x3 << 7)
  92. #define YTPHY_FLPA_ASYM_PAUSE (0x2 << 7)
  93. #define YT8511_PAGE_SELECT 0x1e
  94. #define YT8511_PAGE 0x1f
  95. #define YT8511_EXT_CLK_GATE 0x0c
  96. #define YT8511_EXT_DELAY_DRIVE 0x0d
  97. #define YT8511_EXT_SLEEP_CTRL 0x27
  98. /* 2b00 25m from pll
  99. * 2b01 25m from xtl *default*
  100. * 2b10 62.m from pll
  101. * 2b11 125m from pll
  102. */
  103. #define YT8511_CLK_125M (BIT(2) | BIT(1))
  104. #define YT8511_PLLON_SLP BIT(14)
  105. /* RX Delay enabled = 1.8ns 1000T, 8ns 10/100T */
  106. #define YT8511_DELAY_RX BIT(0)
  107. /* TX Gig-E Delay is bits 7:4, default 0x5
  108. * TX Fast-E Delay is bits 15:12, default 0xf
  109. * Delay = 150ps * N - 250ps
  110. * On = 2000ps, off = 50ps
  111. */
  112. #define YT8511_DELAY_GE_TX_EN (0xf << 4)
  113. #define YT8511_DELAY_GE_TX_DIS (0x2 << 4)
  114. #define YT8511_DELAY_FE_TX_EN (0xf << 12)
  115. #define YT8511_DELAY_FE_TX_DIS (0x2 << 12)
  116. /* Extended register is different from MMD Register and MII Register.
  117. * We can use ytphy_read_ext/ytphy_write_ext/ytphy_modify_ext function to
  118. * operate extended register.
  119. * Extended Register start
  120. */
  121. /* Phy gmii clock gating Register */
  122. #define YT8521_CLOCK_GATING_REG 0xC
  123. #define YT8521_CGR_RX_CLK_EN BIT(12)
  124. #define YT8521_EXTREG_SLEEP_CONTROL1_REG 0x27
  125. #define YT8521_ESC1R_SLEEP_SW BIT(15)
  126. #define YT8521_ESC1R_PLLON_SLP BIT(14)
  127. /* Phy fiber Link timer cfg2 Register */
  128. #define YT8521_LINK_TIMER_CFG2_REG 0xA5
  129. #define YT8521_LTCR_EN_AUTOSEN BIT(15)
  130. /* 0xA000, 0xA001, 0xA003, 0xA006 ~ 0xA00A and 0xA012 are common ext registers
  131. * of yt8521 phy. There is no need to switch reg space when operating these
  132. * registers.
  133. */
  134. #define YT8521_REG_SPACE_SELECT_REG 0xA000
  135. #define YT8521_RSSR_SPACE_MASK BIT(1)
  136. #define YT8521_RSSR_FIBER_SPACE (0x1 << 1)
  137. #define YT8521_RSSR_UTP_SPACE (0x0 << 1)
  138. #define YT8521_RSSR_TO_BE_ARBITRATED (0xFF)
  139. #define YT8521_CHIP_CONFIG_REG 0xA001
  140. #define YT8521_CCR_SW_RST BIT(15)
  141. #define YT8531_RGMII_LDO_VOL_MASK GENMASK(5, 4)
  142. #define YT8531_LDO_VOL_3V3 0x0
  143. #define YT8531_LDO_VOL_1V8 0x2
  144. /* 1b0 disable 1.9ns rxc clock delay *default*
  145. * 1b1 enable 1.9ns rxc clock delay
  146. */
  147. #define YT8521_CCR_RXC_DLY_EN BIT(8)
  148. #define YT8521_CCR_RXC_DLY_1_900_NS 1900
  149. #define YT8521_CCR_MODE_SEL_MASK (BIT(2) | BIT(1) | BIT(0))
  150. #define YT8521_CCR_MODE_UTP_TO_RGMII 0
  151. #define YT8521_CCR_MODE_FIBER_TO_RGMII 1
  152. #define YT8521_CCR_MODE_UTP_FIBER_TO_RGMII 2
  153. #define YT8521_CCR_MODE_UTP_TO_SGMII 3
  154. #define YT8521_CCR_MODE_SGPHY_TO_RGMAC 4
  155. #define YT8521_CCR_MODE_SGMAC_TO_RGPHY 5
  156. #define YT8521_CCR_MODE_UTP_TO_FIBER_AUTO 6
  157. #define YT8521_CCR_MODE_UTP_TO_FIBER_FORCE 7
  158. /* 3 phy polling modes,poll mode combines utp and fiber mode*/
  159. #define YT8521_MODE_FIBER 0x1
  160. #define YT8521_MODE_UTP 0x2
  161. #define YT8521_MODE_POLL 0x3
  162. #define YT8521_RGMII_CONFIG1_REG 0xA003
  163. /* 1b0 use original tx_clk_rgmii *default*
  164. * 1b1 use inverted tx_clk_rgmii.
  165. */
  166. #define YT8521_RC1R_TX_CLK_SEL_INVERTED BIT(14)
  167. #define YT8521_RC1R_RX_DELAY_MASK GENMASK(13, 10)
  168. #define YT8521_RC1R_FE_TX_DELAY_MASK GENMASK(7, 4)
  169. #define YT8521_RC1R_GE_TX_DELAY_MASK GENMASK(3, 0)
  170. #define YT8521_RC1R_RGMII_0_000_NS 0
  171. #define YT8521_RC1R_RGMII_0_150_NS 1
  172. #define YT8521_RC1R_RGMII_0_300_NS 2
  173. #define YT8521_RC1R_RGMII_0_450_NS 3
  174. #define YT8521_RC1R_RGMII_0_600_NS 4
  175. #define YT8521_RC1R_RGMII_0_750_NS 5
  176. #define YT8521_RC1R_RGMII_0_900_NS 6
  177. #define YT8521_RC1R_RGMII_1_050_NS 7
  178. #define YT8521_RC1R_RGMII_1_200_NS 8
  179. #define YT8521_RC1R_RGMII_1_350_NS 9
  180. #define YT8521_RC1R_RGMII_1_500_NS 10
  181. #define YT8521_RC1R_RGMII_1_650_NS 11
  182. #define YT8521_RC1R_RGMII_1_800_NS 12
  183. #define YT8521_RC1R_RGMII_1_950_NS 13
  184. #define YT8521_RC1R_RGMII_2_100_NS 14
  185. #define YT8521_RC1R_RGMII_2_250_NS 15
  186. /* LED CONFIG */
  187. #define YT8521_MAX_LEDS 3
  188. #define YT8521_LED0_CFG_REG 0xA00C
  189. #define YT8521_LED1_CFG_REG 0xA00D
  190. #define YT8521_LED2_CFG_REG 0xA00E
  191. #define YT8521_LED_ACT_BLK_IND BIT(13)
  192. #define YT8521_LED_FDX_ON_EN BIT(12)
  193. #define YT8521_LED_HDX_ON_EN BIT(11)
  194. #define YT8521_LED_TXACT_BLK_EN BIT(10)
  195. #define YT8521_LED_RXACT_BLK_EN BIT(9)
  196. #define YT8521_LED_1000_ON_EN BIT(6)
  197. #define YT8521_LED_100_ON_EN BIT(5)
  198. #define YT8521_LED_10_ON_EN BIT(4)
  199. #define YTPHY_MISC_CONFIG_REG 0xA006
  200. #define YTPHY_MCR_FIBER_SPEED_MASK BIT(0)
  201. #define YTPHY_MCR_FIBER_1000BX (0x1 << 0)
  202. #define YTPHY_MCR_FIBER_100FX (0x0 << 0)
  203. /* WOL MAC ADDR: MACADDR2(highest), MACADDR1(middle), MACADDR0(lowest) */
  204. #define YTPHY_WOL_MACADDR2_REG 0xA007
  205. #define YTPHY_WOL_MACADDR1_REG 0xA008
  206. #define YTPHY_WOL_MACADDR0_REG 0xA009
  207. #define YTPHY_WOL_CONFIG_REG 0xA00A
  208. #define YTPHY_WCR_INTR_SEL BIT(6)
  209. #define YTPHY_WCR_ENABLE BIT(3)
  210. /* 2b00 84ms
  211. * 2b01 168ms *default*
  212. * 2b10 336ms
  213. * 2b11 672ms
  214. */
  215. #define YTPHY_WCR_PULSE_WIDTH_MASK (BIT(2) | BIT(1))
  216. #define YTPHY_WCR_PULSE_WIDTH_672MS (BIT(2) | BIT(1))
  217. /* 1b0 Interrupt and WOL events is level triggered and active LOW *default*
  218. * 1b1 Interrupt and WOL events is pulse triggered and active LOW
  219. */
  220. #define YTPHY_WCR_TYPE_PULSE BIT(0)
  221. #define YTPHY_PAD_DRIVE_STRENGTH_REG 0xA010
  222. #define YT8531_RGMII_RXC_DS_MASK GENMASK(15, 13)
  223. #define YT8531_RGMII_RXD_DS_HI_MASK BIT(12) /* Bit 2 of rxd_ds */
  224. #define YT8531_RGMII_RXD_DS_LOW_MASK GENMASK(5, 4) /* Bit 1/0 of rxd_ds */
  225. #define YT8531_RGMII_RX_DS_DEFAULT 0x3
  226. #define YTPHY_SYNCE_CFG_REG 0xA012
  227. #define YT8521_SCR_SYNCE_ENABLE BIT(5)
  228. /* 1b0 output 25m clock
  229. * 1b1 output 125m clock *default*
  230. */
  231. #define YT8521_SCR_CLK_FRE_SEL_125M BIT(3)
  232. #define YT8521_SCR_CLK_SRC_MASK GENMASK(2, 1)
  233. #define YT8521_SCR_CLK_SRC_PLL_125M 0
  234. #define YT8521_SCR_CLK_SRC_UTP_RX 1
  235. #define YT8521_SCR_CLK_SRC_SDS_RX 2
  236. #define YT8521_SCR_CLK_SRC_REF_25M 3
  237. #define YT8531_SCR_SYNCE_ENABLE BIT(6)
  238. /* 1b0 output 25m clock *default*
  239. * 1b1 output 125m clock
  240. */
  241. #define YT8531_SCR_CLK_FRE_SEL_125M BIT(4)
  242. #define YT8531_SCR_CLK_SRC_MASK GENMASK(3, 1)
  243. #define YT8531_SCR_CLK_SRC_PLL_125M 0
  244. #define YT8531_SCR_CLK_SRC_UTP_RX 1
  245. #define YT8531_SCR_CLK_SRC_SDS_RX 2
  246. #define YT8531_SCR_CLK_SRC_CLOCK_FROM_DIGITAL 3
  247. #define YT8531_SCR_CLK_SRC_REF_25M 4
  248. #define YT8531_SCR_CLK_SRC_SSC_25M 5
  249. #define YT8821_SDS_EXT_CSR_CTRL_REG 0x23
  250. #define YT8821_SDS_EXT_CSR_VCO_LDO_EN BIT(15)
  251. #define YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN BIT(8)
  252. #define YT8821_UTP_EXT_PI_CTRL_REG 0x56
  253. #define YT8821_UTP_EXT_PI_RST_N_FIFO BIT(5)
  254. #define YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE BIT(4)
  255. #define YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE BIT(3)
  256. #define YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE BIT(2)
  257. #define YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE BIT(1)
  258. #define YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE BIT(0)
  259. #define YT8821_UTP_EXT_VCT_CFG6_CTRL_REG 0x97
  260. #define YT8821_UTP_EXT_FECHO_AMP_TH_HUGE GENMASK(15, 8)
  261. #define YT8821_UTP_EXT_ECHO_CTRL_REG 0x336
  262. #define YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000 GENMASK(14, 8)
  263. #define YT8821_UTP_EXT_GAIN_CTRL_REG 0x340
  264. #define YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000 GENMASK(6, 0)
  265. #define YT8821_UTP_EXT_RPDN_CTRL_REG 0x34E
  266. #define YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 BIT(15)
  267. #define YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 BIT(7)
  268. #define YT8821_UTP_EXT_RPDN_IPR_SHT_2500 GENMASK(6, 0)
  269. #define YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG 0x36A
  270. #define YT8821_UTP_EXT_TH_20DB_2500 GENMASK(15, 0)
  271. #define YT8821_UTP_EXT_TRACE_CTRL_REG 0x372
  272. #define YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 GENMASK(14, 8)
  273. #define YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500 GENMASK(6, 0)
  274. #define YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG 0x374
  275. #define YT8821_UTP_EXT_ALPHA_SHT_2500 GENMASK(14, 8)
  276. #define YT8821_UTP_EXT_IPR_LNG_2500 GENMASK(6, 0)
  277. #define YT8821_UTP_EXT_PLL_CTRL_REG 0x450
  278. #define YT8821_UTP_EXT_PLL_SPARE_CFG GENMASK(7, 0)
  279. #define YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG 0x466
  280. #define YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG GENMASK(14, 8)
  281. #define YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG GENMASK(6, 0)
  282. #define YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG 0x467
  283. #define YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG GENMASK(14, 8)
  284. #define YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG GENMASK(6, 0)
  285. #define YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG 0x468
  286. #define YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG GENMASK(14, 8)
  287. #define YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG GENMASK(6, 0)
  288. #define YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG 0x469
  289. #define YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG GENMASK(14, 8)
  290. #define YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG GENMASK(6, 0)
  291. #define YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG 0x4B3
  292. #define YT8821_UTP_EXT_MU_COARSE_FR_F_FFE GENMASK(14, 12)
  293. #define YT8821_UTP_EXT_MU_COARSE_FR_F_FBE GENMASK(10, 8)
  294. #define YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG 0x4B5
  295. #define YT8821_UTP_EXT_MU_FINE_FR_F_FFE GENMASK(14, 12)
  296. #define YT8821_UTP_EXT_MU_FINE_FR_F_FBE GENMASK(10, 8)
  297. #define YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG 0x4D2
  298. #define YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER GENMASK(7, 4)
  299. #define YT8821_UTP_EXT_VGA_LPF1_CAP_2500 GENMASK(3, 0)
  300. #define YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG 0x4D3
  301. #define YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER GENMASK(7, 4)
  302. #define YT8821_UTP_EXT_VGA_LPF2_CAP_2500 GENMASK(3, 0)
  303. #define YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG 0x660
  304. #define YT8821_UTP_EXT_NFR_TX_ABILITY BIT(3)
  305. /* Extended Register end */
  306. #define YTPHY_DTS_OUTPUT_CLK_DIS 0
  307. #define YTPHY_DTS_OUTPUT_CLK_25M 25000000
  308. #define YTPHY_DTS_OUTPUT_CLK_125M 125000000
  309. #define YT8821_CHIP_MODE_AUTO_BX2500_SGMII 0
  310. #define YT8821_CHIP_MODE_FORCE_BX2500 1
  311. struct yt8521_priv {
  312. /* combo_advertising is used for case of YT8521 in combo mode,
  313. * this means that yt8521 may work in utp or fiber mode which depends
  314. * on which media is connected (YT8521_RSSR_TO_BE_ARBITRATED).
  315. */
  316. __ETHTOOL_DECLARE_LINK_MODE_MASK(combo_advertising);
  317. /* YT8521_MODE_FIBER / YT8521_MODE_UTP / YT8521_MODE_POLL*/
  318. u8 polling_mode;
  319. u8 strap_mode; /* 8 working modes */
  320. /* current reg page of yt8521 phy:
  321. * YT8521_RSSR_UTP_SPACE
  322. * YT8521_RSSR_FIBER_SPACE
  323. * YT8521_RSSR_TO_BE_ARBITRATED
  324. */
  325. u8 reg_page;
  326. };
  327. /**
  328. * ytphy_read_ext() - read a PHY's extended register
  329. * @phydev: a pointer to a &struct phy_device
  330. * @regnum: register number to read
  331. *
  332. * NOTE:The caller must have taken the MDIO bus lock.
  333. *
  334. * returns the value of regnum reg or negative error code
  335. */
  336. static int ytphy_read_ext(struct phy_device *phydev, u16 regnum)
  337. {
  338. int ret;
  339. ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
  340. if (ret < 0)
  341. return ret;
  342. return __phy_read(phydev, YTPHY_PAGE_DATA);
  343. }
  344. /**
  345. * ytphy_read_ext_with_lock() - read a PHY's extended register
  346. * @phydev: a pointer to a &struct phy_device
  347. * @regnum: register number to read
  348. *
  349. * returns the value of regnum reg or negative error code
  350. */
  351. static int ytphy_read_ext_with_lock(struct phy_device *phydev, u16 regnum)
  352. {
  353. int ret;
  354. phy_lock_mdio_bus(phydev);
  355. ret = ytphy_read_ext(phydev, regnum);
  356. phy_unlock_mdio_bus(phydev);
  357. return ret;
  358. }
  359. /**
  360. * ytphy_write_ext() - write a PHY's extended register
  361. * @phydev: a pointer to a &struct phy_device
  362. * @regnum: register number to write
  363. * @val: value to write to @regnum
  364. *
  365. * NOTE:The caller must have taken the MDIO bus lock.
  366. *
  367. * returns 0 or negative error code
  368. */
  369. static int ytphy_write_ext(struct phy_device *phydev, u16 regnum, u16 val)
  370. {
  371. int ret;
  372. ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
  373. if (ret < 0)
  374. return ret;
  375. return __phy_write(phydev, YTPHY_PAGE_DATA, val);
  376. }
  377. /**
  378. * ytphy_write_ext_with_lock() - write a PHY's extended register
  379. * @phydev: a pointer to a &struct phy_device
  380. * @regnum: register number to write
  381. * @val: value to write to @regnum
  382. *
  383. * returns 0 or negative error code
  384. */
  385. static int ytphy_write_ext_with_lock(struct phy_device *phydev, u16 regnum,
  386. u16 val)
  387. {
  388. int ret;
  389. phy_lock_mdio_bus(phydev);
  390. ret = ytphy_write_ext(phydev, regnum, val);
  391. phy_unlock_mdio_bus(phydev);
  392. return ret;
  393. }
  394. /**
  395. * ytphy_modify_ext() - bits modify a PHY's extended register
  396. * @phydev: a pointer to a &struct phy_device
  397. * @regnum: register number to write
  398. * @mask: bit mask of bits to clear
  399. * @set: bit mask of bits to set
  400. *
  401. * NOTE: Convenience function which allows a PHY's extended register to be
  402. * modified as new register value = (old register value & ~mask) | set.
  403. * The caller must have taken the MDIO bus lock.
  404. *
  405. * returns 0 or negative error code
  406. */
  407. static int ytphy_modify_ext(struct phy_device *phydev, u16 regnum, u16 mask,
  408. u16 set)
  409. {
  410. int ret;
  411. ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
  412. if (ret < 0)
  413. return ret;
  414. return __phy_modify(phydev, YTPHY_PAGE_DATA, mask, set);
  415. }
  416. /**
  417. * ytphy_modify_ext_with_lock() - bits modify a PHY's extended register
  418. * @phydev: a pointer to a &struct phy_device
  419. * @regnum: register number to write
  420. * @mask: bit mask of bits to clear
  421. * @set: bit mask of bits to set
  422. *
  423. * NOTE: Convenience function which allows a PHY's extended register to be
  424. * modified as new register value = (old register value & ~mask) | set.
  425. *
  426. * returns 0 or negative error code
  427. */
  428. static int ytphy_modify_ext_with_lock(struct phy_device *phydev, u16 regnum,
  429. u16 mask, u16 set)
  430. {
  431. int ret;
  432. phy_lock_mdio_bus(phydev);
  433. ret = ytphy_modify_ext(phydev, regnum, mask, set);
  434. phy_unlock_mdio_bus(phydev);
  435. return ret;
  436. }
  437. /**
  438. * ytphy_get_wol() - report whether wake-on-lan is enabled
  439. * @phydev: a pointer to a &struct phy_device
  440. * @wol: a pointer to a &struct ethtool_wolinfo
  441. *
  442. * NOTE: YTPHY_WOL_CONFIG_REG is common ext reg.
  443. */
  444. static void ytphy_get_wol(struct phy_device *phydev,
  445. struct ethtool_wolinfo *wol)
  446. {
  447. int wol_config;
  448. wol->supported = WAKE_MAGIC;
  449. wol->wolopts = 0;
  450. wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
  451. if (wol_config < 0)
  452. return;
  453. if (wol_config & YTPHY_WCR_ENABLE)
  454. wol->wolopts |= WAKE_MAGIC;
  455. }
  456. /**
  457. * ytphy_set_wol() - turn wake-on-lan on or off
  458. * @phydev: a pointer to a &struct phy_device
  459. * @wol: a pointer to a &struct ethtool_wolinfo
  460. *
  461. * NOTE: YTPHY_WOL_CONFIG_REG, YTPHY_WOL_MACADDR2_REG, YTPHY_WOL_MACADDR1_REG
  462. * and YTPHY_WOL_MACADDR0_REG are common ext reg. The
  463. * YTPHY_INTERRUPT_ENABLE_REG of UTP is special, fiber also use this register.
  464. *
  465. * returns 0 or negative errno code
  466. */
  467. static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
  468. {
  469. struct net_device *p_attached_dev;
  470. const u16 mac_addr_reg[] = {
  471. YTPHY_WOL_MACADDR2_REG,
  472. YTPHY_WOL_MACADDR1_REG,
  473. YTPHY_WOL_MACADDR0_REG,
  474. };
  475. const u8 *mac_addr;
  476. int old_page;
  477. int ret = 0;
  478. u16 mask;
  479. u16 val;
  480. u8 i;
  481. if (wol->wolopts & WAKE_MAGIC) {
  482. p_attached_dev = phydev->attached_dev;
  483. if (!p_attached_dev)
  484. return -ENODEV;
  485. mac_addr = (const u8 *)p_attached_dev->dev_addr;
  486. if (!is_valid_ether_addr(mac_addr))
  487. return -EINVAL;
  488. /* lock mdio bus then switch to utp reg space */
  489. old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
  490. if (old_page < 0)
  491. goto err_restore_page;
  492. /* Store the device address for the magic packet */
  493. for (i = 0; i < 3; i++) {
  494. ret = ytphy_write_ext(phydev, mac_addr_reg[i],
  495. ((mac_addr[i * 2] << 8)) |
  496. (mac_addr[i * 2 + 1]));
  497. if (ret < 0)
  498. goto err_restore_page;
  499. }
  500. /* Enable WOL feature */
  501. mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL;
  502. val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
  503. val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS;
  504. ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, val);
  505. if (ret < 0)
  506. goto err_restore_page;
  507. /* Enable WOL interrupt */
  508. ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0,
  509. YTPHY_IER_WOL);
  510. if (ret < 0)
  511. goto err_restore_page;
  512. } else {
  513. old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
  514. if (old_page < 0)
  515. goto err_restore_page;
  516. /* Disable WOL feature */
  517. mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
  518. ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, 0);
  519. /* Disable WOL interrupt */
  520. ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG,
  521. YTPHY_IER_WOL, 0);
  522. if (ret < 0)
  523. goto err_restore_page;
  524. }
  525. err_restore_page:
  526. return phy_restore_page(phydev, old_page, ret);
  527. }
  528. static int yt8531_set_wol(struct phy_device *phydev,
  529. struct ethtool_wolinfo *wol)
  530. {
  531. const u16 mac_addr_reg[] = {
  532. YTPHY_WOL_MACADDR2_REG,
  533. YTPHY_WOL_MACADDR1_REG,
  534. YTPHY_WOL_MACADDR0_REG,
  535. };
  536. const u8 *mac_addr;
  537. u16 mask, val;
  538. int ret;
  539. u8 i;
  540. if (wol->wolopts & WAKE_MAGIC) {
  541. mac_addr = phydev->attached_dev->dev_addr;
  542. /* Store the device address for the magic packet */
  543. for (i = 0; i < 3; i++) {
  544. ret = ytphy_write_ext_with_lock(phydev, mac_addr_reg[i],
  545. ((mac_addr[i * 2] << 8)) |
  546. (mac_addr[i * 2 + 1]));
  547. if (ret < 0)
  548. return ret;
  549. }
  550. /* Enable WOL feature */
  551. mask = YTPHY_WCR_PULSE_WIDTH_MASK | YTPHY_WCR_INTR_SEL;
  552. val = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
  553. val |= YTPHY_WCR_TYPE_PULSE | YTPHY_WCR_PULSE_WIDTH_672MS;
  554. ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG,
  555. mask, val);
  556. if (ret < 0)
  557. return ret;
  558. /* Enable WOL interrupt */
  559. ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0,
  560. YTPHY_IER_WOL);
  561. if (ret < 0)
  562. return ret;
  563. } else {
  564. /* Disable WOL feature */
  565. mask = YTPHY_WCR_ENABLE | YTPHY_WCR_INTR_SEL;
  566. ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG,
  567. mask, 0);
  568. /* Disable WOL interrupt */
  569. ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG,
  570. YTPHY_IER_WOL, 0);
  571. if (ret < 0)
  572. return ret;
  573. }
  574. return 0;
  575. }
  576. static int yt8511_read_page(struct phy_device *phydev)
  577. {
  578. return __phy_read(phydev, YT8511_PAGE_SELECT);
  579. };
  580. static int yt8511_write_page(struct phy_device *phydev, int page)
  581. {
  582. return __phy_write(phydev, YT8511_PAGE_SELECT, page);
  583. };
  584. static int yt8511_config_init(struct phy_device *phydev)
  585. {
  586. int oldpage, ret = 0;
  587. unsigned int ge, fe;
  588. oldpage = phy_select_page(phydev, YT8511_EXT_CLK_GATE);
  589. if (oldpage < 0)
  590. goto err_restore_page;
  591. /* set rgmii delay mode */
  592. switch (phydev->interface) {
  593. case PHY_INTERFACE_MODE_RGMII:
  594. ge = YT8511_DELAY_GE_TX_DIS;
  595. fe = YT8511_DELAY_FE_TX_DIS;
  596. break;
  597. case PHY_INTERFACE_MODE_RGMII_RXID:
  598. ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_DIS;
  599. fe = YT8511_DELAY_FE_TX_DIS;
  600. break;
  601. case PHY_INTERFACE_MODE_RGMII_TXID:
  602. ge = YT8511_DELAY_GE_TX_EN;
  603. fe = YT8511_DELAY_FE_TX_EN;
  604. break;
  605. case PHY_INTERFACE_MODE_RGMII_ID:
  606. ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN;
  607. fe = YT8511_DELAY_FE_TX_EN;
  608. break;
  609. default: /* do not support other modes */
  610. ret = -EOPNOTSUPP;
  611. goto err_restore_page;
  612. }
  613. ret = __phy_modify(phydev, YT8511_PAGE, (YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN), ge);
  614. if (ret < 0)
  615. goto err_restore_page;
  616. /* set clock mode to 125mhz */
  617. ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_CLK_125M);
  618. if (ret < 0)
  619. goto err_restore_page;
  620. /* fast ethernet delay is in a separate page */
  621. ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_DELAY_DRIVE);
  622. if (ret < 0)
  623. goto err_restore_page;
  624. ret = __phy_modify(phydev, YT8511_PAGE, YT8511_DELAY_FE_TX_EN, fe);
  625. if (ret < 0)
  626. goto err_restore_page;
  627. /* leave pll enabled in sleep */
  628. ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_SLEEP_CTRL);
  629. if (ret < 0)
  630. goto err_restore_page;
  631. ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_PLLON_SLP);
  632. if (ret < 0)
  633. goto err_restore_page;
  634. err_restore_page:
  635. return phy_restore_page(phydev, oldpage, ret);
  636. }
  637. /**
  638. * yt8521_read_page() - read reg page
  639. * @phydev: a pointer to a &struct phy_device
  640. *
  641. * returns current reg space of yt8521 (YT8521_RSSR_FIBER_SPACE/
  642. * YT8521_RSSR_UTP_SPACE) or negative errno code
  643. */
  644. static int yt8521_read_page(struct phy_device *phydev)
  645. {
  646. int old_page;
  647. old_page = ytphy_read_ext(phydev, YT8521_REG_SPACE_SELECT_REG);
  648. if (old_page < 0)
  649. return old_page;
  650. if ((old_page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE)
  651. return YT8521_RSSR_FIBER_SPACE;
  652. return YT8521_RSSR_UTP_SPACE;
  653. };
  654. /**
  655. * yt8521_write_page() - write reg page
  656. * @phydev: a pointer to a &struct phy_device
  657. * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to write.
  658. *
  659. * returns 0 or negative errno code
  660. */
  661. static int yt8521_write_page(struct phy_device *phydev, int page)
  662. {
  663. int mask = YT8521_RSSR_SPACE_MASK;
  664. int set;
  665. if ((page & YT8521_RSSR_SPACE_MASK) == YT8521_RSSR_FIBER_SPACE)
  666. set = YT8521_RSSR_FIBER_SPACE;
  667. else
  668. set = YT8521_RSSR_UTP_SPACE;
  669. return ytphy_modify_ext(phydev, YT8521_REG_SPACE_SELECT_REG, mask, set);
  670. };
  671. /**
  672. * struct ytphy_cfg_reg_map - map a config value to a register value
  673. * @cfg: value in device configuration
  674. * @reg: value in the register
  675. */
  676. struct ytphy_cfg_reg_map {
  677. u32 cfg;
  678. u32 reg;
  679. };
  680. static const struct ytphy_cfg_reg_map ytphy_rgmii_delays[] = {
  681. /* for tx delay / rx delay with YT8521_CCR_RXC_DLY_EN is not set. */
  682. { 0, YT8521_RC1R_RGMII_0_000_NS },
  683. { 150, YT8521_RC1R_RGMII_0_150_NS },
  684. { 300, YT8521_RC1R_RGMII_0_300_NS },
  685. { 450, YT8521_RC1R_RGMII_0_450_NS },
  686. { 600, YT8521_RC1R_RGMII_0_600_NS },
  687. { 750, YT8521_RC1R_RGMII_0_750_NS },
  688. { 900, YT8521_RC1R_RGMII_0_900_NS },
  689. { 1050, YT8521_RC1R_RGMII_1_050_NS },
  690. { 1200, YT8521_RC1R_RGMII_1_200_NS },
  691. { 1350, YT8521_RC1R_RGMII_1_350_NS },
  692. { 1500, YT8521_RC1R_RGMII_1_500_NS },
  693. { 1650, YT8521_RC1R_RGMII_1_650_NS },
  694. { 1800, YT8521_RC1R_RGMII_1_800_NS },
  695. { 1950, YT8521_RC1R_RGMII_1_950_NS }, /* default tx/rx delay */
  696. { 2100, YT8521_RC1R_RGMII_2_100_NS },
  697. { 2250, YT8521_RC1R_RGMII_2_250_NS },
  698. /* only for rx delay with YT8521_CCR_RXC_DLY_EN is set. */
  699. { 0 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_000_NS },
  700. { 150 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_150_NS },
  701. { 300 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_300_NS },
  702. { 450 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_450_NS },
  703. { 600 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_600_NS },
  704. { 750 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_750_NS },
  705. { 900 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_0_900_NS },
  706. { 1050 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_050_NS },
  707. { 1200 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_200_NS },
  708. { 1350 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_350_NS },
  709. { 1500 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_500_NS },
  710. { 1650 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_650_NS },
  711. { 1800 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_800_NS },
  712. { 1950 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_1_950_NS },
  713. { 2100 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_2_100_NS },
  714. { 2250 + YT8521_CCR_RXC_DLY_1_900_NS, YT8521_RC1R_RGMII_2_250_NS }
  715. };
  716. static u32 ytphy_get_delay_reg_value(struct phy_device *phydev,
  717. const char *prop_name,
  718. const struct ytphy_cfg_reg_map *tbl,
  719. int tb_size,
  720. u16 *rxc_dly_en,
  721. u32 dflt)
  722. {
  723. struct device_node *node = phydev->mdio.dev.of_node;
  724. int tb_size_half = tb_size / 2;
  725. u32 val;
  726. int i;
  727. if (of_property_read_u32(node, prop_name, &val))
  728. goto err_dts_val;
  729. /* when rxc_dly_en is NULL, it is get the delay for tx, only half of
  730. * tb_size is valid.
  731. */
  732. if (!rxc_dly_en)
  733. tb_size = tb_size_half;
  734. for (i = 0; i < tb_size; i++) {
  735. if (tbl[i].cfg == val) {
  736. if (rxc_dly_en && i < tb_size_half)
  737. *rxc_dly_en = 0;
  738. return tbl[i].reg;
  739. }
  740. }
  741. phydev_warn(phydev, "Unsupported value %d for %s using default (%u)\n",
  742. val, prop_name, dflt);
  743. err_dts_val:
  744. /* when rxc_dly_en is not NULL, it is get the delay for rx.
  745. * The rx default in dts and ytphy_rgmii_clk_delay_config is 1950 ps,
  746. * so YT8521_CCR_RXC_DLY_EN should not be set.
  747. */
  748. if (rxc_dly_en)
  749. *rxc_dly_en = 0;
  750. return dflt;
  751. }
  752. static int ytphy_rgmii_clk_delay_config(struct phy_device *phydev)
  753. {
  754. int tb_size = ARRAY_SIZE(ytphy_rgmii_delays);
  755. u16 rxc_dly_en = YT8521_CCR_RXC_DLY_EN;
  756. u32 rx_reg, tx_reg;
  757. u16 mask, val = 0;
  758. int ret;
  759. rx_reg = ytphy_get_delay_reg_value(phydev, "rx-internal-delay-ps",
  760. ytphy_rgmii_delays, tb_size,
  761. &rxc_dly_en,
  762. YT8521_RC1R_RGMII_1_950_NS);
  763. tx_reg = ytphy_get_delay_reg_value(phydev, "tx-internal-delay-ps",
  764. ytphy_rgmii_delays, tb_size, NULL,
  765. YT8521_RC1R_RGMII_1_950_NS);
  766. switch (phydev->interface) {
  767. case PHY_INTERFACE_MODE_RGMII:
  768. rxc_dly_en = 0;
  769. break;
  770. case PHY_INTERFACE_MODE_RGMII_RXID:
  771. val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg);
  772. break;
  773. case PHY_INTERFACE_MODE_RGMII_TXID:
  774. rxc_dly_en = 0;
  775. val |= FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg);
  776. break;
  777. case PHY_INTERFACE_MODE_RGMII_ID:
  778. val |= FIELD_PREP(YT8521_RC1R_RX_DELAY_MASK, rx_reg) |
  779. FIELD_PREP(YT8521_RC1R_GE_TX_DELAY_MASK, tx_reg);
  780. break;
  781. case PHY_INTERFACE_MODE_GMII:
  782. if (phydev->drv->phy_id != PHY_ID_YT8531S)
  783. return -EOPNOTSUPP;
  784. return 0;
  785. default: /* do not support other modes */
  786. return -EOPNOTSUPP;
  787. }
  788. ret = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
  789. YT8521_CCR_RXC_DLY_EN, rxc_dly_en);
  790. if (ret < 0)
  791. return ret;
  792. /* Generally, it is not necessary to adjust YT8521_RC1R_FE_TX_DELAY */
  793. mask = YT8521_RC1R_RX_DELAY_MASK | YT8521_RC1R_GE_TX_DELAY_MASK;
  794. return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val);
  795. }
  796. static int ytphy_rgmii_clk_delay_config_with_lock(struct phy_device *phydev)
  797. {
  798. int ret;
  799. phy_lock_mdio_bus(phydev);
  800. ret = ytphy_rgmii_clk_delay_config(phydev);
  801. phy_unlock_mdio_bus(phydev);
  802. return ret;
  803. }
  804. /**
  805. * struct ytphy_ldo_vol_map - map a current value to a register value
  806. * @vol: ldo voltage
  807. * @ds: value in the register
  808. * @cur: value in device configuration
  809. */
  810. struct ytphy_ldo_vol_map {
  811. u32 vol;
  812. u32 ds;
  813. u32 cur;
  814. };
  815. static const struct ytphy_ldo_vol_map yt8531_ldo_vol[] = {
  816. {.vol = YT8531_LDO_VOL_1V8, .ds = 0, .cur = 1200},
  817. {.vol = YT8531_LDO_VOL_1V8, .ds = 1, .cur = 2100},
  818. {.vol = YT8531_LDO_VOL_1V8, .ds = 2, .cur = 2700},
  819. {.vol = YT8531_LDO_VOL_1V8, .ds = 3, .cur = 2910},
  820. {.vol = YT8531_LDO_VOL_1V8, .ds = 4, .cur = 3110},
  821. {.vol = YT8531_LDO_VOL_1V8, .ds = 5, .cur = 3600},
  822. {.vol = YT8531_LDO_VOL_1V8, .ds = 6, .cur = 3970},
  823. {.vol = YT8531_LDO_VOL_1V8, .ds = 7, .cur = 4350},
  824. {.vol = YT8531_LDO_VOL_3V3, .ds = 0, .cur = 3070},
  825. {.vol = YT8531_LDO_VOL_3V3, .ds = 1, .cur = 4080},
  826. {.vol = YT8531_LDO_VOL_3V3, .ds = 2, .cur = 4370},
  827. {.vol = YT8531_LDO_VOL_3V3, .ds = 3, .cur = 4680},
  828. {.vol = YT8531_LDO_VOL_3V3, .ds = 4, .cur = 5020},
  829. {.vol = YT8531_LDO_VOL_3V3, .ds = 5, .cur = 5450},
  830. {.vol = YT8531_LDO_VOL_3V3, .ds = 6, .cur = 5740},
  831. {.vol = YT8531_LDO_VOL_3V3, .ds = 7, .cur = 6140},
  832. };
  833. static u32 yt8531_get_ldo_vol(struct phy_device *phydev)
  834. {
  835. u32 val;
  836. val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
  837. val = FIELD_GET(YT8531_RGMII_LDO_VOL_MASK, val);
  838. return val <= YT8531_LDO_VOL_1V8 ? val : YT8531_LDO_VOL_1V8;
  839. }
  840. static int yt8531_get_ds_map(struct phy_device *phydev, u32 cur)
  841. {
  842. u32 vol;
  843. int i;
  844. vol = yt8531_get_ldo_vol(phydev);
  845. for (i = 0; i < ARRAY_SIZE(yt8531_ldo_vol); i++) {
  846. if (yt8531_ldo_vol[i].vol == vol && yt8531_ldo_vol[i].cur == cur)
  847. return yt8531_ldo_vol[i].ds;
  848. }
  849. return -EINVAL;
  850. }
  851. static int yt8531_set_ds(struct phy_device *phydev)
  852. {
  853. struct device_node *node = phydev->mdio.dev.of_node;
  854. u32 ds_field_low, ds_field_hi, val;
  855. int ret, ds;
  856. /* set rgmii rx clk driver strength */
  857. if (!of_property_read_u32(node, "motorcomm,rx-clk-drv-microamp", &val)) {
  858. ds = yt8531_get_ds_map(phydev, val);
  859. if (ds < 0)
  860. return dev_err_probe(&phydev->mdio.dev, ds,
  861. "No matching current value was found.\n");
  862. } else {
  863. ds = YT8531_RGMII_RX_DS_DEFAULT;
  864. }
  865. ret = ytphy_modify_ext_with_lock(phydev,
  866. YTPHY_PAD_DRIVE_STRENGTH_REG,
  867. YT8531_RGMII_RXC_DS_MASK,
  868. FIELD_PREP(YT8531_RGMII_RXC_DS_MASK, ds));
  869. if (ret < 0)
  870. return ret;
  871. /* set rgmii rx data driver strength */
  872. if (!of_property_read_u32(node, "motorcomm,rx-data-drv-microamp", &val)) {
  873. ds = yt8531_get_ds_map(phydev, val);
  874. if (ds < 0)
  875. return dev_err_probe(&phydev->mdio.dev, ds,
  876. "No matching current value was found.\n");
  877. } else {
  878. ds = YT8531_RGMII_RX_DS_DEFAULT;
  879. }
  880. ds_field_hi = FIELD_GET(BIT(2), ds);
  881. ds_field_hi = FIELD_PREP(YT8531_RGMII_RXD_DS_HI_MASK, ds_field_hi);
  882. ds_field_low = FIELD_GET(GENMASK(1, 0), ds);
  883. ds_field_low = FIELD_PREP(YT8531_RGMII_RXD_DS_LOW_MASK, ds_field_low);
  884. ret = ytphy_modify_ext_with_lock(phydev,
  885. YTPHY_PAD_DRIVE_STRENGTH_REG,
  886. YT8531_RGMII_RXD_DS_LOW_MASK | YT8531_RGMII_RXD_DS_HI_MASK,
  887. ds_field_low | ds_field_hi);
  888. if (ret < 0)
  889. return ret;
  890. return 0;
  891. }
  892. /**
  893. * yt8521_probe() - read chip config then set suitable polling_mode
  894. * @phydev: a pointer to a &struct phy_device
  895. *
  896. * returns 0 or negative errno code
  897. */
  898. static int yt8521_probe(struct phy_device *phydev)
  899. {
  900. struct device_node *node = phydev->mdio.dev.of_node;
  901. struct device *dev = &phydev->mdio.dev;
  902. struct yt8521_priv *priv;
  903. int chip_config;
  904. u16 mask, val;
  905. u32 freq;
  906. int ret;
  907. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  908. if (!priv)
  909. return -ENOMEM;
  910. phydev->priv = priv;
  911. chip_config = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
  912. if (chip_config < 0)
  913. return chip_config;
  914. priv->strap_mode = chip_config & YT8521_CCR_MODE_SEL_MASK;
  915. switch (priv->strap_mode) {
  916. case YT8521_CCR_MODE_FIBER_TO_RGMII:
  917. case YT8521_CCR_MODE_SGPHY_TO_RGMAC:
  918. case YT8521_CCR_MODE_SGMAC_TO_RGPHY:
  919. priv->polling_mode = YT8521_MODE_FIBER;
  920. priv->reg_page = YT8521_RSSR_FIBER_SPACE;
  921. phydev->port = PORT_FIBRE;
  922. break;
  923. case YT8521_CCR_MODE_UTP_FIBER_TO_RGMII:
  924. case YT8521_CCR_MODE_UTP_TO_FIBER_AUTO:
  925. case YT8521_CCR_MODE_UTP_TO_FIBER_FORCE:
  926. priv->polling_mode = YT8521_MODE_POLL;
  927. priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
  928. phydev->port = PORT_NONE;
  929. break;
  930. case YT8521_CCR_MODE_UTP_TO_SGMII:
  931. case YT8521_CCR_MODE_UTP_TO_RGMII:
  932. priv->polling_mode = YT8521_MODE_UTP;
  933. priv->reg_page = YT8521_RSSR_UTP_SPACE;
  934. phydev->port = PORT_TP;
  935. break;
  936. }
  937. /* set default reg space */
  938. if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
  939. ret = ytphy_write_ext_with_lock(phydev,
  940. YT8521_REG_SPACE_SELECT_REG,
  941. priv->reg_page);
  942. if (ret < 0)
  943. return ret;
  944. }
  945. if (of_property_read_u32(node, "motorcomm,clk-out-frequency-hz", &freq))
  946. freq = YTPHY_DTS_OUTPUT_CLK_DIS;
  947. if (phydev->drv->phy_id == PHY_ID_YT8521) {
  948. switch (freq) {
  949. case YTPHY_DTS_OUTPUT_CLK_DIS:
  950. mask = YT8521_SCR_SYNCE_ENABLE;
  951. val = 0;
  952. break;
  953. case YTPHY_DTS_OUTPUT_CLK_25M:
  954. mask = YT8521_SCR_SYNCE_ENABLE |
  955. YT8521_SCR_CLK_SRC_MASK |
  956. YT8521_SCR_CLK_FRE_SEL_125M;
  957. val = YT8521_SCR_SYNCE_ENABLE |
  958. FIELD_PREP(YT8521_SCR_CLK_SRC_MASK,
  959. YT8521_SCR_CLK_SRC_REF_25M);
  960. break;
  961. case YTPHY_DTS_OUTPUT_CLK_125M:
  962. mask = YT8521_SCR_SYNCE_ENABLE |
  963. YT8521_SCR_CLK_SRC_MASK |
  964. YT8521_SCR_CLK_FRE_SEL_125M;
  965. val = YT8521_SCR_SYNCE_ENABLE |
  966. YT8521_SCR_CLK_FRE_SEL_125M |
  967. FIELD_PREP(YT8521_SCR_CLK_SRC_MASK,
  968. YT8521_SCR_CLK_SRC_PLL_125M);
  969. break;
  970. default:
  971. phydev_warn(phydev, "Freq err:%u\n", freq);
  972. return -EINVAL;
  973. }
  974. } else if (phydev->drv->phy_id == PHY_ID_YT8531S) {
  975. switch (freq) {
  976. case YTPHY_DTS_OUTPUT_CLK_DIS:
  977. mask = YT8531_SCR_SYNCE_ENABLE;
  978. val = 0;
  979. break;
  980. case YTPHY_DTS_OUTPUT_CLK_25M:
  981. mask = YT8531_SCR_SYNCE_ENABLE |
  982. YT8531_SCR_CLK_SRC_MASK |
  983. YT8531_SCR_CLK_FRE_SEL_125M;
  984. val = YT8531_SCR_SYNCE_ENABLE |
  985. FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
  986. YT8531_SCR_CLK_SRC_REF_25M);
  987. break;
  988. case YTPHY_DTS_OUTPUT_CLK_125M:
  989. mask = YT8531_SCR_SYNCE_ENABLE |
  990. YT8531_SCR_CLK_SRC_MASK |
  991. YT8531_SCR_CLK_FRE_SEL_125M;
  992. val = YT8531_SCR_SYNCE_ENABLE |
  993. YT8531_SCR_CLK_FRE_SEL_125M |
  994. FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
  995. YT8531_SCR_CLK_SRC_PLL_125M);
  996. break;
  997. default:
  998. phydev_warn(phydev, "Freq err:%u\n", freq);
  999. return -EINVAL;
  1000. }
  1001. } else {
  1002. phydev_warn(phydev, "PHY id err\n");
  1003. return -EINVAL;
  1004. }
  1005. return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
  1006. val);
  1007. }
  1008. static int yt8531_probe(struct phy_device *phydev)
  1009. {
  1010. struct device_node *node = phydev->mdio.dev.of_node;
  1011. u16 mask, val;
  1012. u32 freq;
  1013. if (of_property_read_u32(node, "motorcomm,clk-out-frequency-hz", &freq))
  1014. freq = YTPHY_DTS_OUTPUT_CLK_DIS;
  1015. switch (freq) {
  1016. case YTPHY_DTS_OUTPUT_CLK_DIS:
  1017. mask = YT8531_SCR_SYNCE_ENABLE;
  1018. val = 0;
  1019. break;
  1020. case YTPHY_DTS_OUTPUT_CLK_25M:
  1021. mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK |
  1022. YT8531_SCR_CLK_FRE_SEL_125M;
  1023. val = YT8531_SCR_SYNCE_ENABLE |
  1024. FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
  1025. YT8531_SCR_CLK_SRC_REF_25M);
  1026. break;
  1027. case YTPHY_DTS_OUTPUT_CLK_125M:
  1028. mask = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_SRC_MASK |
  1029. YT8531_SCR_CLK_FRE_SEL_125M;
  1030. val = YT8531_SCR_SYNCE_ENABLE | YT8531_SCR_CLK_FRE_SEL_125M |
  1031. FIELD_PREP(YT8531_SCR_CLK_SRC_MASK,
  1032. YT8531_SCR_CLK_SRC_PLL_125M);
  1033. break;
  1034. default:
  1035. phydev_warn(phydev, "Freq err:%u\n", freq);
  1036. return -EINVAL;
  1037. }
  1038. return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
  1039. val);
  1040. }
  1041. /**
  1042. * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp
  1043. * @phydev: a pointer to a &struct phy_device
  1044. *
  1045. * NOTE:The caller must have taken the MDIO bus lock.
  1046. *
  1047. * returns 0 or negative errno code
  1048. */
  1049. static int ytphy_utp_read_lpa(struct phy_device *phydev)
  1050. {
  1051. int lpa, lpagb;
  1052. if (phydev->autoneg == AUTONEG_ENABLE) {
  1053. if (!phydev->autoneg_complete) {
  1054. mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
  1055. 0);
  1056. mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
  1057. return 0;
  1058. }
  1059. if (phydev->is_gigabit_capable) {
  1060. lpagb = __phy_read(phydev, MII_STAT1000);
  1061. if (lpagb < 0)
  1062. return lpagb;
  1063. if (lpagb & LPA_1000MSFAIL) {
  1064. int adv = __phy_read(phydev, MII_CTRL1000);
  1065. if (adv < 0)
  1066. return adv;
  1067. if (adv & CTL1000_ENABLE_MASTER)
  1068. phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n");
  1069. else
  1070. phydev_err(phydev, "Master/Slave resolution failed\n");
  1071. return -ENOLINK;
  1072. }
  1073. mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
  1074. lpagb);
  1075. }
  1076. lpa = __phy_read(phydev, MII_LPA);
  1077. if (lpa < 0)
  1078. return lpa;
  1079. mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);
  1080. } else {
  1081. linkmode_zero(phydev->lp_advertising);
  1082. }
  1083. return 0;
  1084. }
  1085. /**
  1086. * yt8521_adjust_status() - update speed and duplex to phydev. when in fiber
  1087. * mode, adjust speed and duplex.
  1088. * @phydev: a pointer to a &struct phy_device
  1089. * @status: yt8521 status read from YTPHY_SPECIFIC_STATUS_REG
  1090. * @is_utp: false(yt8521 work in fiber mode) or true(yt8521 work in utp mode)
  1091. *
  1092. * NOTE:The caller must have taken the MDIO bus lock.
  1093. *
  1094. * returns 0
  1095. */
  1096. static int yt8521_adjust_status(struct phy_device *phydev, int status,
  1097. bool is_utp)
  1098. {
  1099. int speed_mode, duplex;
  1100. int speed;
  1101. int err;
  1102. int lpa;
  1103. if (is_utp)
  1104. duplex = (status & YTPHY_SSR_DUPLEX) >> YTPHY_SSR_DUPLEX_OFFSET;
  1105. else
  1106. duplex = DUPLEX_FULL; /* for fiber, it always DUPLEX_FULL */
  1107. speed_mode = status & YTPHY_SSR_SPEED_MASK;
  1108. switch (speed_mode) {
  1109. case YTPHY_SSR_SPEED_10M:
  1110. if (is_utp)
  1111. speed = SPEED_10;
  1112. else
  1113. /* for fiber, it will never run here, default to
  1114. * SPEED_UNKNOWN
  1115. */
  1116. speed = SPEED_UNKNOWN;
  1117. break;
  1118. case YTPHY_SSR_SPEED_100M:
  1119. speed = SPEED_100;
  1120. break;
  1121. case YTPHY_SSR_SPEED_1000M:
  1122. speed = SPEED_1000;
  1123. break;
  1124. default:
  1125. speed = SPEED_UNKNOWN;
  1126. break;
  1127. }
  1128. phydev->speed = speed;
  1129. phydev->duplex = duplex;
  1130. if (is_utp) {
  1131. err = ytphy_utp_read_lpa(phydev);
  1132. if (err < 0)
  1133. return err;
  1134. phy_resolve_aneg_pause(phydev);
  1135. } else {
  1136. lpa = __phy_read(phydev, MII_LPA);
  1137. if (lpa < 0)
  1138. return lpa;
  1139. /* only support 1000baseX Full */
  1140. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
  1141. phydev->lp_advertising, lpa & LPA_1000XFULL);
  1142. if (!(lpa & YTPHY_FLPA_PAUSE)) {
  1143. phydev->pause = 0;
  1144. phydev->asym_pause = 0;
  1145. } else if ((lpa & YTPHY_FLPA_ASYM_PAUSE)) {
  1146. phydev->pause = 1;
  1147. phydev->asym_pause = 1;
  1148. } else {
  1149. phydev->pause = 1;
  1150. phydev->asym_pause = 0;
  1151. }
  1152. }
  1153. return 0;
  1154. }
  1155. /**
  1156. * yt8521_read_status_paged() - determines the speed and duplex of one page
  1157. * @phydev: a pointer to a &struct phy_device
  1158. * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
  1159. * operate.
  1160. *
  1161. * returns 1 (utp or fiber link),0 (no link) or negative errno code
  1162. */
  1163. static int yt8521_read_status_paged(struct phy_device *phydev, int page)
  1164. {
  1165. int fiber_latch_val;
  1166. int fiber_curr_val;
  1167. int old_page;
  1168. int ret = 0;
  1169. int status;
  1170. int link;
  1171. linkmode_zero(phydev->lp_advertising);
  1172. phydev->duplex = DUPLEX_UNKNOWN;
  1173. phydev->speed = SPEED_UNKNOWN;
  1174. phydev->asym_pause = 0;
  1175. phydev->pause = 0;
  1176. /* YT8521 has two reg space (utp/fiber) for linkup with utp/fiber
  1177. * respectively. but for utp/fiber combo mode, reg space should be
  1178. * arbitrated based on media priority. by default, utp takes
  1179. * priority. reg space should be properly set before read
  1180. * YTPHY_SPECIFIC_STATUS_REG.
  1181. */
  1182. page &= YT8521_RSSR_SPACE_MASK;
  1183. old_page = phy_select_page(phydev, page);
  1184. if (old_page < 0)
  1185. goto err_restore_page;
  1186. /* Read YTPHY_SPECIFIC_STATUS_REG, which indicates the speed and duplex
  1187. * of the PHY is actually using.
  1188. */
  1189. ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
  1190. if (ret < 0)
  1191. goto err_restore_page;
  1192. status = ret;
  1193. link = !!(status & YTPHY_SSR_LINK);
  1194. /* When PHY is in fiber mode, speed transferred from 1000Mbps to
  1195. * 100Mbps,there is not link down from YTPHY_SPECIFIC_STATUS_REG, so
  1196. * we need check MII_BMSR to identify such case.
  1197. */
  1198. if (page == YT8521_RSSR_FIBER_SPACE) {
  1199. ret = __phy_read(phydev, MII_BMSR);
  1200. if (ret < 0)
  1201. goto err_restore_page;
  1202. fiber_latch_val = ret;
  1203. ret = __phy_read(phydev, MII_BMSR);
  1204. if (ret < 0)
  1205. goto err_restore_page;
  1206. fiber_curr_val = ret;
  1207. if (link && fiber_latch_val != fiber_curr_val) {
  1208. link = 0;
  1209. phydev_info(phydev,
  1210. "%s, fiber link down detect, latch = %04x, curr = %04x\n",
  1211. __func__, fiber_latch_val, fiber_curr_val);
  1212. }
  1213. } else {
  1214. /* Read autonegotiation status */
  1215. ret = __phy_read(phydev, MII_BMSR);
  1216. if (ret < 0)
  1217. goto err_restore_page;
  1218. phydev->autoneg_complete = ret & BMSR_ANEGCOMPLETE ? 1 : 0;
  1219. }
  1220. if (link) {
  1221. if (page == YT8521_RSSR_UTP_SPACE)
  1222. yt8521_adjust_status(phydev, status, true);
  1223. else
  1224. yt8521_adjust_status(phydev, status, false);
  1225. }
  1226. return phy_restore_page(phydev, old_page, link);
  1227. err_restore_page:
  1228. return phy_restore_page(phydev, old_page, ret);
  1229. }
  1230. /**
  1231. * yt8521_read_status() - determines the negotiated speed and duplex
  1232. * @phydev: a pointer to a &struct phy_device
  1233. *
  1234. * returns 0 or negative errno code
  1235. */
  1236. static int yt8521_read_status(struct phy_device *phydev)
  1237. {
  1238. struct yt8521_priv *priv = phydev->priv;
  1239. int link_fiber = 0;
  1240. int link_utp;
  1241. int link;
  1242. int ret;
  1243. if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
  1244. link = yt8521_read_status_paged(phydev, priv->reg_page);
  1245. if (link < 0)
  1246. return link;
  1247. } else {
  1248. /* when page is YT8521_RSSR_TO_BE_ARBITRATED, arbitration is
  1249. * needed. by default, utp is higher priority.
  1250. */
  1251. link_utp = yt8521_read_status_paged(phydev,
  1252. YT8521_RSSR_UTP_SPACE);
  1253. if (link_utp < 0)
  1254. return link_utp;
  1255. if (!link_utp) {
  1256. link_fiber = yt8521_read_status_paged(phydev,
  1257. YT8521_RSSR_FIBER_SPACE);
  1258. if (link_fiber < 0)
  1259. return link_fiber;
  1260. }
  1261. link = link_utp || link_fiber;
  1262. }
  1263. if (link) {
  1264. if (phydev->link == 0) {
  1265. /* arbitrate reg space based on linkup media type. */
  1266. if (priv->polling_mode == YT8521_MODE_POLL &&
  1267. priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
  1268. if (link_fiber)
  1269. priv->reg_page =
  1270. YT8521_RSSR_FIBER_SPACE;
  1271. else
  1272. priv->reg_page = YT8521_RSSR_UTP_SPACE;
  1273. ret = ytphy_write_ext_with_lock(phydev,
  1274. YT8521_REG_SPACE_SELECT_REG,
  1275. priv->reg_page);
  1276. if (ret < 0)
  1277. return ret;
  1278. phydev->port = link_fiber ? PORT_FIBRE : PORT_TP;
  1279. phydev_info(phydev, "%s, link up, media: %s\n",
  1280. __func__,
  1281. (phydev->port == PORT_TP) ?
  1282. "UTP" : "Fiber");
  1283. }
  1284. }
  1285. phydev->link = 1;
  1286. } else {
  1287. if (phydev->link == 1) {
  1288. phydev_info(phydev, "%s, link down, media: %s\n",
  1289. __func__, (phydev->port == PORT_TP) ?
  1290. "UTP" : "Fiber");
  1291. /* When in YT8521_MODE_POLL mode, need prepare for next
  1292. * arbitration.
  1293. */
  1294. if (priv->polling_mode == YT8521_MODE_POLL) {
  1295. priv->reg_page = YT8521_RSSR_TO_BE_ARBITRATED;
  1296. phydev->port = PORT_NONE;
  1297. }
  1298. }
  1299. phydev->link = 0;
  1300. }
  1301. return 0;
  1302. }
  1303. /**
  1304. * yt8521_modify_bmcr_paged - bits modify a PHY's BMCR register of one page
  1305. * @phydev: the phy_device struct
  1306. * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to operate
  1307. * @mask: bit mask of bits to clear
  1308. * @set: bit mask of bits to set
  1309. *
  1310. * NOTE: Convenience function which allows a PHY's BMCR register to be
  1311. * modified as new register value = (old register value & ~mask) | set.
  1312. * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
  1313. * has MII_BMCR. poll mode combines utp and faber,so need do both.
  1314. * If it is reset, it will wait for completion.
  1315. *
  1316. * returns 0 or negative errno code
  1317. */
  1318. static int yt8521_modify_bmcr_paged(struct phy_device *phydev, int page,
  1319. u16 mask, u16 set)
  1320. {
  1321. int max_cnt = 500; /* the max wait time of reset ~ 500 ms */
  1322. int old_page;
  1323. int ret = 0;
  1324. old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
  1325. if (old_page < 0)
  1326. goto err_restore_page;
  1327. ret = __phy_modify(phydev, MII_BMCR, mask, set);
  1328. if (ret < 0)
  1329. goto err_restore_page;
  1330. /* If it is reset, need to wait for the reset to complete */
  1331. if (set == BMCR_RESET) {
  1332. while (max_cnt--) {
  1333. usleep_range(1000, 1100);
  1334. ret = __phy_read(phydev, MII_BMCR);
  1335. if (ret < 0)
  1336. goto err_restore_page;
  1337. if (!(ret & BMCR_RESET))
  1338. return phy_restore_page(phydev, old_page, 0);
  1339. }
  1340. }
  1341. err_restore_page:
  1342. return phy_restore_page(phydev, old_page, ret);
  1343. }
  1344. /**
  1345. * yt8521_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
  1346. * @phydev: the phy_device struct
  1347. * @mask: bit mask of bits to clear
  1348. * @set: bit mask of bits to set
  1349. *
  1350. * NOTE: Convenience function which allows a PHY's BMCR register to be
  1351. * modified as new register value = (old register value & ~mask) | set.
  1352. * YT8521 has two space (utp/fiber) and three mode (utp/fiber/poll), each space
  1353. * has MII_BMCR. poll mode combines utp and faber,so need do both.
  1354. *
  1355. * returns 0 or negative errno code
  1356. */
  1357. static int yt8521_modify_utp_fiber_bmcr(struct phy_device *phydev, u16 mask,
  1358. u16 set)
  1359. {
  1360. struct yt8521_priv *priv = phydev->priv;
  1361. int ret;
  1362. if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
  1363. ret = yt8521_modify_bmcr_paged(phydev, priv->reg_page, mask,
  1364. set);
  1365. if (ret < 0)
  1366. return ret;
  1367. } else {
  1368. ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
  1369. mask, set);
  1370. if (ret < 0)
  1371. return ret;
  1372. ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
  1373. mask, set);
  1374. if (ret < 0)
  1375. return ret;
  1376. }
  1377. return 0;
  1378. }
  1379. /**
  1380. * yt8521_soft_reset() - called to issue a PHY software reset
  1381. * @phydev: a pointer to a &struct phy_device
  1382. *
  1383. * returns 0 or negative errno code
  1384. */
  1385. static int yt8521_soft_reset(struct phy_device *phydev)
  1386. {
  1387. return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_RESET);
  1388. }
  1389. /**
  1390. * yt8521_suspend() - suspend the hardware
  1391. * @phydev: a pointer to a &struct phy_device
  1392. *
  1393. * returns 0 or negative errno code
  1394. */
  1395. static int yt8521_suspend(struct phy_device *phydev)
  1396. {
  1397. int wol_config;
  1398. /* YTPHY_WOL_CONFIG_REG is common ext reg */
  1399. wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
  1400. if (wol_config < 0)
  1401. return wol_config;
  1402. /* if wol enable, do nothing */
  1403. if (wol_config & YTPHY_WCR_ENABLE)
  1404. return 0;
  1405. return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
  1406. }
  1407. /**
  1408. * yt8521_resume() - resume the hardware
  1409. * @phydev: a pointer to a &struct phy_device
  1410. *
  1411. * returns 0 or negative errno code
  1412. */
  1413. static int yt8521_resume(struct phy_device *phydev)
  1414. {
  1415. int ret;
  1416. int wol_config;
  1417. /* disable auto sleep */
  1418. ret = ytphy_modify_ext_with_lock(phydev,
  1419. YT8521_EXTREG_SLEEP_CONTROL1_REG,
  1420. YT8521_ESC1R_SLEEP_SW, 0);
  1421. if (ret < 0)
  1422. return ret;
  1423. wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
  1424. if (wol_config < 0)
  1425. return wol_config;
  1426. /* if wol enable, do nothing */
  1427. if (wol_config & YTPHY_WCR_ENABLE)
  1428. return 0;
  1429. return yt8521_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
  1430. }
  1431. /**
  1432. * yt8521_config_init() - called to initialize the PHY
  1433. * @phydev: a pointer to a &struct phy_device
  1434. *
  1435. * returns 0 or negative errno code
  1436. */
  1437. static int yt8521_config_init(struct phy_device *phydev)
  1438. {
  1439. struct device_node *node = phydev->mdio.dev.of_node;
  1440. int old_page;
  1441. int ret = 0;
  1442. old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
  1443. if (old_page < 0)
  1444. goto err_restore_page;
  1445. /* set rgmii delay mode */
  1446. if (phydev->interface != PHY_INTERFACE_MODE_SGMII) {
  1447. ret = ytphy_rgmii_clk_delay_config(phydev);
  1448. if (ret < 0)
  1449. goto err_restore_page;
  1450. }
  1451. if (of_property_read_bool(node, "motorcomm,auto-sleep-disabled")) {
  1452. /* disable auto sleep */
  1453. ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG,
  1454. YT8521_ESC1R_SLEEP_SW, 0);
  1455. if (ret < 0)
  1456. goto err_restore_page;
  1457. }
  1458. if (of_property_read_bool(node, "motorcomm,keep-pll-enabled")) {
  1459. /* enable RXC clock when no wire plug */
  1460. ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG,
  1461. YT8521_CGR_RX_CLK_EN, 0);
  1462. if (ret < 0)
  1463. goto err_restore_page;
  1464. }
  1465. err_restore_page:
  1466. return phy_restore_page(phydev, old_page, ret);
  1467. }
  1468. static const unsigned long supported_trgs = (BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
  1469. BIT(TRIGGER_NETDEV_HALF_DUPLEX) |
  1470. BIT(TRIGGER_NETDEV_LINK) |
  1471. BIT(TRIGGER_NETDEV_LINK_10) |
  1472. BIT(TRIGGER_NETDEV_LINK_100) |
  1473. BIT(TRIGGER_NETDEV_LINK_1000) |
  1474. BIT(TRIGGER_NETDEV_RX) |
  1475. BIT(TRIGGER_NETDEV_TX));
  1476. static int yt8521_led_hw_is_supported(struct phy_device *phydev, u8 index,
  1477. unsigned long rules)
  1478. {
  1479. if (index >= YT8521_MAX_LEDS)
  1480. return -EINVAL;
  1481. /* All combinations of the supported triggers are allowed */
  1482. if (rules & ~supported_trgs)
  1483. return -EOPNOTSUPP;
  1484. return 0;
  1485. }
  1486. static int yt8521_led_hw_control_set(struct phy_device *phydev, u8 index,
  1487. unsigned long rules)
  1488. {
  1489. u16 val = 0;
  1490. if (index >= YT8521_MAX_LEDS)
  1491. return -EINVAL;
  1492. if (test_bit(TRIGGER_NETDEV_LINK, &rules)) {
  1493. val |= YT8521_LED_10_ON_EN;
  1494. val |= YT8521_LED_100_ON_EN;
  1495. val |= YT8521_LED_1000_ON_EN;
  1496. }
  1497. if (test_bit(TRIGGER_NETDEV_LINK_10, &rules))
  1498. val |= YT8521_LED_10_ON_EN;
  1499. if (test_bit(TRIGGER_NETDEV_LINK_100, &rules))
  1500. val |= YT8521_LED_100_ON_EN;
  1501. if (test_bit(TRIGGER_NETDEV_LINK_1000, &rules))
  1502. val |= YT8521_LED_1000_ON_EN;
  1503. if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &rules))
  1504. val |= YT8521_LED_FDX_ON_EN;
  1505. if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &rules))
  1506. val |= YT8521_LED_HDX_ON_EN;
  1507. if (test_bit(TRIGGER_NETDEV_TX, &rules) ||
  1508. test_bit(TRIGGER_NETDEV_RX, &rules))
  1509. val |= YT8521_LED_ACT_BLK_IND;
  1510. if (test_bit(TRIGGER_NETDEV_TX, &rules))
  1511. val |= YT8521_LED_TXACT_BLK_EN;
  1512. if (test_bit(TRIGGER_NETDEV_RX, &rules))
  1513. val |= YT8521_LED_RXACT_BLK_EN;
  1514. return ytphy_write_ext(phydev, YT8521_LED0_CFG_REG + index, val);
  1515. }
  1516. static int yt8521_led_hw_control_get(struct phy_device *phydev, u8 index,
  1517. unsigned long *rules)
  1518. {
  1519. int val;
  1520. if (index >= YT8521_MAX_LEDS)
  1521. return -EINVAL;
  1522. val = ytphy_read_ext(phydev, YT8521_LED0_CFG_REG + index);
  1523. if (val < 0)
  1524. return val;
  1525. if (val & YT8521_LED_TXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND)
  1526. __set_bit(TRIGGER_NETDEV_TX, rules);
  1527. if (val & YT8521_LED_RXACT_BLK_EN || val & YT8521_LED_ACT_BLK_IND)
  1528. __set_bit(TRIGGER_NETDEV_RX, rules);
  1529. if (val & YT8521_LED_FDX_ON_EN)
  1530. __set_bit(TRIGGER_NETDEV_FULL_DUPLEX, rules);
  1531. if (val & YT8521_LED_HDX_ON_EN)
  1532. __set_bit(TRIGGER_NETDEV_HALF_DUPLEX, rules);
  1533. if (val & YT8521_LED_1000_ON_EN)
  1534. __set_bit(TRIGGER_NETDEV_LINK_1000, rules);
  1535. if (val & YT8521_LED_100_ON_EN)
  1536. __set_bit(TRIGGER_NETDEV_LINK_100, rules);
  1537. if (val & YT8521_LED_10_ON_EN)
  1538. __set_bit(TRIGGER_NETDEV_LINK_10, rules);
  1539. return 0;
  1540. }
  1541. static int yt8531_config_init(struct phy_device *phydev)
  1542. {
  1543. struct device_node *node = phydev->mdio.dev.of_node;
  1544. int ret;
  1545. ret = ytphy_rgmii_clk_delay_config_with_lock(phydev);
  1546. if (ret < 0)
  1547. return ret;
  1548. if (of_property_read_bool(node, "motorcomm,auto-sleep-disabled")) {
  1549. /* disable auto sleep */
  1550. ret = ytphy_modify_ext_with_lock(phydev,
  1551. YT8521_EXTREG_SLEEP_CONTROL1_REG,
  1552. YT8521_ESC1R_SLEEP_SW, 0);
  1553. if (ret < 0)
  1554. return ret;
  1555. }
  1556. if (of_property_read_bool(node, "motorcomm,keep-pll-enabled")) {
  1557. /* enable RXC clock when no wire plug */
  1558. ret = ytphy_modify_ext_with_lock(phydev,
  1559. YT8521_CLOCK_GATING_REG,
  1560. YT8521_CGR_RX_CLK_EN, 0);
  1561. if (ret < 0)
  1562. return ret;
  1563. }
  1564. ret = yt8531_set_ds(phydev);
  1565. if (ret < 0)
  1566. return ret;
  1567. return 0;
  1568. }
  1569. /**
  1570. * yt8531_link_change_notify() - Adjust the tx clock direction according to
  1571. * the current speed and dts config.
  1572. * @phydev: a pointer to a &struct phy_device
  1573. *
  1574. * NOTE: This function is only used to adapt to VF2 with JH7110 SoC. Please
  1575. * keep "motorcomm,tx-clk-adj-enabled" not exist in dts when the soc is not
  1576. * JH7110.
  1577. */
  1578. static void yt8531_link_change_notify(struct phy_device *phydev)
  1579. {
  1580. struct device_node *node = phydev->mdio.dev.of_node;
  1581. bool tx_clk_1000_inverted = false;
  1582. bool tx_clk_100_inverted = false;
  1583. bool tx_clk_10_inverted = false;
  1584. bool tx_clk_adj_enabled = false;
  1585. u16 val = 0;
  1586. int ret;
  1587. if (of_property_read_bool(node, "motorcomm,tx-clk-adj-enabled"))
  1588. tx_clk_adj_enabled = true;
  1589. if (!tx_clk_adj_enabled)
  1590. return;
  1591. if (of_property_read_bool(node, "motorcomm,tx-clk-10-inverted"))
  1592. tx_clk_10_inverted = true;
  1593. if (of_property_read_bool(node, "motorcomm,tx-clk-100-inverted"))
  1594. tx_clk_100_inverted = true;
  1595. if (of_property_read_bool(node, "motorcomm,tx-clk-1000-inverted"))
  1596. tx_clk_1000_inverted = true;
  1597. if (phydev->speed < 0)
  1598. return;
  1599. switch (phydev->speed) {
  1600. case SPEED_1000:
  1601. if (tx_clk_1000_inverted)
  1602. val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
  1603. break;
  1604. case SPEED_100:
  1605. if (tx_clk_100_inverted)
  1606. val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
  1607. break;
  1608. case SPEED_10:
  1609. if (tx_clk_10_inverted)
  1610. val = YT8521_RC1R_TX_CLK_SEL_INVERTED;
  1611. break;
  1612. default:
  1613. return;
  1614. }
  1615. ret = ytphy_modify_ext_with_lock(phydev, YT8521_RGMII_CONFIG1_REG,
  1616. YT8521_RC1R_TX_CLK_SEL_INVERTED, val);
  1617. if (ret < 0)
  1618. phydev_warn(phydev, "Modify TX_CLK_SEL err:%d\n", ret);
  1619. }
  1620. /**
  1621. * yt8521_prepare_fiber_features() - A small helper function that setup
  1622. * fiber's features.
  1623. * @phydev: a pointer to a &struct phy_device
  1624. * @dst: a pointer to store fiber's features
  1625. */
  1626. static void yt8521_prepare_fiber_features(struct phy_device *phydev,
  1627. unsigned long *dst)
  1628. {
  1629. linkmode_set_bit(ETHTOOL_LINK_MODE_100baseFX_Full_BIT, dst);
  1630. linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, dst);
  1631. linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, dst);
  1632. linkmode_set_bit(ETHTOOL_LINK_MODE_FIBRE_BIT, dst);
  1633. }
  1634. /**
  1635. * yt8521_fiber_setup_forced - configures/forces speed from @phydev
  1636. * @phydev: target phy_device struct
  1637. *
  1638. * NOTE:The caller must have taken the MDIO bus lock.
  1639. *
  1640. * returns 0 or negative errno code
  1641. */
  1642. static int yt8521_fiber_setup_forced(struct phy_device *phydev)
  1643. {
  1644. u16 val;
  1645. int ret;
  1646. if (phydev->speed == SPEED_1000)
  1647. val = YTPHY_MCR_FIBER_1000BX;
  1648. else if (phydev->speed == SPEED_100)
  1649. val = YTPHY_MCR_FIBER_100FX;
  1650. else
  1651. return -EINVAL;
  1652. ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
  1653. if (ret < 0)
  1654. return ret;
  1655. /* disable Fiber auto sensing */
  1656. ret = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
  1657. YT8521_LTCR_EN_AUTOSEN, 0);
  1658. if (ret < 0)
  1659. return ret;
  1660. ret = ytphy_modify_ext(phydev, YTPHY_MISC_CONFIG_REG,
  1661. YTPHY_MCR_FIBER_SPEED_MASK, val);
  1662. if (ret < 0)
  1663. return ret;
  1664. return ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
  1665. YT8521_CCR_SW_RST, 0);
  1666. }
  1667. /**
  1668. * ytphy_check_and_restart_aneg - Enable and restart auto-negotiation
  1669. * @phydev: target phy_device struct
  1670. * @restart: whether aneg restart is requested
  1671. *
  1672. * NOTE:The caller must have taken the MDIO bus lock.
  1673. *
  1674. * returns 0 or negative errno code
  1675. */
  1676. static int ytphy_check_and_restart_aneg(struct phy_device *phydev, bool restart)
  1677. {
  1678. int ret;
  1679. if (!restart) {
  1680. /* Advertisement hasn't changed, but maybe aneg was never on to
  1681. * begin with? Or maybe phy was isolated?
  1682. */
  1683. ret = __phy_read(phydev, MII_BMCR);
  1684. if (ret < 0)
  1685. return ret;
  1686. if (!(ret & BMCR_ANENABLE) || (ret & BMCR_ISOLATE))
  1687. restart = true;
  1688. }
  1689. /* Enable and Restart Autonegotiation
  1690. * Don't isolate the PHY if we're negotiating
  1691. */
  1692. if (restart)
  1693. return __phy_modify(phydev, MII_BMCR, BMCR_ISOLATE,
  1694. BMCR_ANENABLE | BMCR_ANRESTART);
  1695. return 0;
  1696. }
  1697. /**
  1698. * yt8521_fiber_config_aneg - restart auto-negotiation or write
  1699. * YTPHY_MISC_CONFIG_REG.
  1700. * @phydev: target phy_device struct
  1701. *
  1702. * NOTE:The caller must have taken the MDIO bus lock.
  1703. *
  1704. * returns 0 or negative errno code
  1705. */
  1706. static int yt8521_fiber_config_aneg(struct phy_device *phydev)
  1707. {
  1708. int err, changed = 0;
  1709. int bmcr;
  1710. u16 adv;
  1711. if (phydev->autoneg != AUTONEG_ENABLE)
  1712. return yt8521_fiber_setup_forced(phydev);
  1713. /* enable Fiber auto sensing */
  1714. err = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
  1715. 0, YT8521_LTCR_EN_AUTOSEN);
  1716. if (err < 0)
  1717. return err;
  1718. err = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
  1719. YT8521_CCR_SW_RST, 0);
  1720. if (err < 0)
  1721. return err;
  1722. bmcr = __phy_read(phydev, MII_BMCR);
  1723. if (bmcr < 0)
  1724. return bmcr;
  1725. /* When it is coming from fiber forced mode, add bmcr power down
  1726. * and power up to let aneg work fine.
  1727. */
  1728. if (!(bmcr & BMCR_ANENABLE)) {
  1729. __phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN);
  1730. usleep_range(1000, 1100);
  1731. __phy_modify(phydev, MII_BMCR, BMCR_PDOWN, 0);
  1732. }
  1733. adv = linkmode_adv_to_mii_adv_x(phydev->advertising,
  1734. ETHTOOL_LINK_MODE_1000baseX_Full_BIT);
  1735. /* Setup fiber advertisement */
  1736. err = __phy_modify_changed(phydev, MII_ADVERTISE,
  1737. ADVERTISE_1000XHALF | ADVERTISE_1000XFULL |
  1738. ADVERTISE_1000XPAUSE |
  1739. ADVERTISE_1000XPSE_ASYM,
  1740. adv);
  1741. if (err < 0)
  1742. return err;
  1743. if (err > 0)
  1744. changed = 1;
  1745. return ytphy_check_and_restart_aneg(phydev, changed);
  1746. }
  1747. /**
  1748. * ytphy_setup_master_slave
  1749. * @phydev: target phy_device struct
  1750. *
  1751. * NOTE: The caller must have taken the MDIO bus lock.
  1752. *
  1753. * returns 0 or negative errno code
  1754. */
  1755. static int ytphy_setup_master_slave(struct phy_device *phydev)
  1756. {
  1757. u16 ctl = 0;
  1758. if (!phydev->is_gigabit_capable)
  1759. return 0;
  1760. switch (phydev->master_slave_set) {
  1761. case MASTER_SLAVE_CFG_MASTER_PREFERRED:
  1762. ctl |= CTL1000_PREFER_MASTER;
  1763. break;
  1764. case MASTER_SLAVE_CFG_SLAVE_PREFERRED:
  1765. break;
  1766. case MASTER_SLAVE_CFG_MASTER_FORCE:
  1767. ctl |= CTL1000_AS_MASTER;
  1768. fallthrough;
  1769. case MASTER_SLAVE_CFG_SLAVE_FORCE:
  1770. ctl |= CTL1000_ENABLE_MASTER;
  1771. break;
  1772. case MASTER_SLAVE_CFG_UNKNOWN:
  1773. case MASTER_SLAVE_CFG_UNSUPPORTED:
  1774. return 0;
  1775. default:
  1776. phydev_warn(phydev, "Unsupported Master/Slave mode\n");
  1777. return -EOPNOTSUPP;
  1778. }
  1779. return __phy_modify_changed(phydev, MII_CTRL1000,
  1780. (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER |
  1781. CTL1000_PREFER_MASTER), ctl);
  1782. }
  1783. /**
  1784. * ytphy_utp_config_advert - sanitize and advertise auto-negotiation parameters
  1785. * @phydev: target phy_device struct
  1786. *
  1787. * NOTE: Writes MII_ADVERTISE with the appropriate values,
  1788. * after sanitizing the values to make sure we only advertise
  1789. * what is supported. Returns < 0 on error, 0 if the PHY's advertisement
  1790. * hasn't changed, and > 0 if it has changed.
  1791. * The caller must have taken the MDIO bus lock.
  1792. *
  1793. * returns 0 or negative errno code
  1794. */
  1795. static int ytphy_utp_config_advert(struct phy_device *phydev)
  1796. {
  1797. int err, bmsr, changed = 0;
  1798. u32 adv;
  1799. /* Only allow advertising what this PHY supports */
  1800. linkmode_and(phydev->advertising, phydev->advertising,
  1801. phydev->supported);
  1802. adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
  1803. /* Setup standard advertisement */
  1804. err = __phy_modify_changed(phydev, MII_ADVERTISE,
  1805. ADVERTISE_ALL | ADVERTISE_100BASE4 |
  1806. ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM,
  1807. adv);
  1808. if (err < 0)
  1809. return err;
  1810. if (err > 0)
  1811. changed = 1;
  1812. bmsr = __phy_read(phydev, MII_BMSR);
  1813. if (bmsr < 0)
  1814. return bmsr;
  1815. /* Per 802.3-2008, Section 22.2.4.2.16 Extended status all
  1816. * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a
  1817. * logical 1.
  1818. */
  1819. if (!(bmsr & BMSR_ESTATEN))
  1820. return changed;
  1821. adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
  1822. err = __phy_modify_changed(phydev, MII_CTRL1000,
  1823. ADVERTISE_1000FULL | ADVERTISE_1000HALF,
  1824. adv);
  1825. if (err < 0)
  1826. return err;
  1827. if (err > 0)
  1828. changed = 1;
  1829. return changed;
  1830. }
  1831. /**
  1832. * ytphy_utp_config_aneg - restart auto-negotiation or write BMCR
  1833. * @phydev: target phy_device struct
  1834. * @changed: whether autoneg is requested
  1835. *
  1836. * NOTE: If auto-negotiation is enabled, we configure the
  1837. * advertising, and then restart auto-negotiation. If it is not
  1838. * enabled, then we write the BMCR.
  1839. * The caller must have taken the MDIO bus lock.
  1840. *
  1841. * returns 0 or negative errno code
  1842. */
  1843. static int ytphy_utp_config_aneg(struct phy_device *phydev, bool changed)
  1844. {
  1845. int err;
  1846. u16 ctl;
  1847. err = ytphy_setup_master_slave(phydev);
  1848. if (err < 0)
  1849. return err;
  1850. else if (err)
  1851. changed = true;
  1852. if (phydev->autoneg != AUTONEG_ENABLE) {
  1853. /* configures/forces speed/duplex from @phydev */
  1854. ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);
  1855. return __phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK |
  1856. BMCR_ISOLATE | BMCR_PDOWN), ctl);
  1857. }
  1858. err = ytphy_utp_config_advert(phydev);
  1859. if (err < 0) /* error */
  1860. return err;
  1861. else if (err)
  1862. changed = true;
  1863. return ytphy_check_and_restart_aneg(phydev, changed);
  1864. }
  1865. /**
  1866. * yt8521_config_aneg_paged() - switch reg space then call genphy_config_aneg
  1867. * of one page
  1868. * @phydev: a pointer to a &struct phy_device
  1869. * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
  1870. * operate.
  1871. *
  1872. * returns 0 or negative errno code
  1873. */
  1874. static int yt8521_config_aneg_paged(struct phy_device *phydev, int page)
  1875. {
  1876. __ETHTOOL_DECLARE_LINK_MODE_MASK(fiber_supported);
  1877. struct yt8521_priv *priv = phydev->priv;
  1878. int old_page;
  1879. int ret = 0;
  1880. page &= YT8521_RSSR_SPACE_MASK;
  1881. old_page = phy_select_page(phydev, page);
  1882. if (old_page < 0)
  1883. goto err_restore_page;
  1884. /* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
  1885. * phydev->advertising should be updated.
  1886. */
  1887. if (priv->reg_page == YT8521_RSSR_TO_BE_ARBITRATED) {
  1888. linkmode_zero(fiber_supported);
  1889. yt8521_prepare_fiber_features(phydev, fiber_supported);
  1890. /* prepare fiber_supported, then setup advertising. */
  1891. if (page == YT8521_RSSR_FIBER_SPACE) {
  1892. linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT,
  1893. fiber_supported);
  1894. linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
  1895. fiber_supported);
  1896. linkmode_and(phydev->advertising,
  1897. priv->combo_advertising, fiber_supported);
  1898. } else {
  1899. /* ETHTOOL_LINK_MODE_Autoneg_BIT is also used in utp */
  1900. linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
  1901. fiber_supported);
  1902. linkmode_andnot(phydev->advertising,
  1903. priv->combo_advertising,
  1904. fiber_supported);
  1905. }
  1906. }
  1907. if (page == YT8521_RSSR_FIBER_SPACE)
  1908. ret = yt8521_fiber_config_aneg(phydev);
  1909. else
  1910. ret = ytphy_utp_config_aneg(phydev, false);
  1911. err_restore_page:
  1912. return phy_restore_page(phydev, old_page, ret);
  1913. }
  1914. /**
  1915. * yt8521_config_aneg() - change reg space then call yt8521_config_aneg_paged
  1916. * @phydev: a pointer to a &struct phy_device
  1917. *
  1918. * returns 0 or negative errno code
  1919. */
  1920. static int yt8521_config_aneg(struct phy_device *phydev)
  1921. {
  1922. struct yt8521_priv *priv = phydev->priv;
  1923. int ret;
  1924. if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
  1925. ret = yt8521_config_aneg_paged(phydev, priv->reg_page);
  1926. if (ret < 0)
  1927. return ret;
  1928. } else {
  1929. /* If reg_page is YT8521_RSSR_TO_BE_ARBITRATED,
  1930. * phydev->advertising need to be saved at first run.
  1931. * Because it contains the advertising which supported by both
  1932. * mac and yt8521(utp and fiber).
  1933. */
  1934. if (linkmode_empty(priv->combo_advertising)) {
  1935. linkmode_copy(priv->combo_advertising,
  1936. phydev->advertising);
  1937. }
  1938. ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_UTP_SPACE);
  1939. if (ret < 0)
  1940. return ret;
  1941. ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_FIBER_SPACE);
  1942. if (ret < 0)
  1943. return ret;
  1944. /* we don't known which will be link, so restore
  1945. * phydev->advertising as default value.
  1946. */
  1947. linkmode_copy(phydev->advertising, priv->combo_advertising);
  1948. }
  1949. return 0;
  1950. }
  1951. /**
  1952. * yt8521_aneg_done_paged() - determines the auto negotiation result of one
  1953. * page.
  1954. * @phydev: a pointer to a &struct phy_device
  1955. * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
  1956. * operate.
  1957. *
  1958. * returns 0(no link)or 1(fiber or utp link) or negative errno code
  1959. */
  1960. static int yt8521_aneg_done_paged(struct phy_device *phydev, int page)
  1961. {
  1962. int old_page;
  1963. int ret = 0;
  1964. int link;
  1965. old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
  1966. if (old_page < 0)
  1967. goto err_restore_page;
  1968. ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
  1969. if (ret < 0)
  1970. goto err_restore_page;
  1971. link = !!(ret & YTPHY_SSR_LINK);
  1972. ret = link;
  1973. err_restore_page:
  1974. return phy_restore_page(phydev, old_page, ret);
  1975. }
  1976. /**
  1977. * yt8521_aneg_done() - determines the auto negotiation result
  1978. * @phydev: a pointer to a &struct phy_device
  1979. *
  1980. * returns 0(no link)or 1(fiber or utp link) or negative errno code
  1981. */
  1982. static int yt8521_aneg_done(struct phy_device *phydev)
  1983. {
  1984. struct yt8521_priv *priv = phydev->priv;
  1985. int link_fiber = 0;
  1986. int link_utp;
  1987. int link;
  1988. if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
  1989. link = yt8521_aneg_done_paged(phydev, priv->reg_page);
  1990. } else {
  1991. link_utp = yt8521_aneg_done_paged(phydev,
  1992. YT8521_RSSR_UTP_SPACE);
  1993. if (link_utp < 0)
  1994. return link_utp;
  1995. if (!link_utp) {
  1996. link_fiber = yt8521_aneg_done_paged(phydev,
  1997. YT8521_RSSR_FIBER_SPACE);
  1998. if (link_fiber < 0)
  1999. return link_fiber;
  2000. }
  2001. link = link_fiber || link_utp;
  2002. phydev_info(phydev, "%s, link_fiber: %d, link_utp: %d\n",
  2003. __func__, link_fiber, link_utp);
  2004. }
  2005. return link;
  2006. }
  2007. /**
  2008. * ytphy_utp_read_abilities - read PHY abilities from Clause 22 registers
  2009. * @phydev: target phy_device struct
  2010. *
  2011. * NOTE: Reads the PHY's abilities and populates
  2012. * phydev->supported accordingly.
  2013. * The caller must have taken the MDIO bus lock.
  2014. *
  2015. * returns 0 or negative errno code
  2016. */
  2017. static int ytphy_utp_read_abilities(struct phy_device *phydev)
  2018. {
  2019. int val;
  2020. linkmode_set_bit_array(phy_basic_ports_array,
  2021. ARRAY_SIZE(phy_basic_ports_array),
  2022. phydev->supported);
  2023. val = __phy_read(phydev, MII_BMSR);
  2024. if (val < 0)
  2025. return val;
  2026. linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
  2027. val & BMSR_ANEGCAPABLE);
  2028. linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
  2029. val & BMSR_100FULL);
  2030. linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
  2031. val & BMSR_100HALF);
  2032. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
  2033. val & BMSR_10FULL);
  2034. linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
  2035. val & BMSR_10HALF);
  2036. if (val & BMSR_ESTATEN) {
  2037. val = __phy_read(phydev, MII_ESTATUS);
  2038. if (val < 0)
  2039. return val;
  2040. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  2041. phydev->supported, val & ESTATUS_1000_TFULL);
  2042. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
  2043. phydev->supported, val & ESTATUS_1000_THALF);
  2044. linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT,
  2045. phydev->supported, val & ESTATUS_1000_XFULL);
  2046. }
  2047. return 0;
  2048. }
  2049. /**
  2050. * yt8521_get_features_paged() - read supported link modes for one page
  2051. * @phydev: a pointer to a &struct phy_device
  2052. * @page: The reg page(YT8521_RSSR_FIBER_SPACE/YT8521_RSSR_UTP_SPACE) to
  2053. * operate.
  2054. *
  2055. * returns 0 or negative errno code
  2056. */
  2057. static int yt8521_get_features_paged(struct phy_device *phydev, int page)
  2058. {
  2059. int old_page;
  2060. int ret = 0;
  2061. page &= YT8521_RSSR_SPACE_MASK;
  2062. old_page = phy_select_page(phydev, page);
  2063. if (old_page < 0)
  2064. goto err_restore_page;
  2065. if (page == YT8521_RSSR_FIBER_SPACE) {
  2066. linkmode_zero(phydev->supported);
  2067. yt8521_prepare_fiber_features(phydev, phydev->supported);
  2068. } else {
  2069. ret = ytphy_utp_read_abilities(phydev);
  2070. if (ret < 0)
  2071. goto err_restore_page;
  2072. }
  2073. err_restore_page:
  2074. return phy_restore_page(phydev, old_page, ret);
  2075. }
  2076. /**
  2077. * yt8521_get_features - switch reg space then call yt8521_get_features_paged
  2078. * @phydev: target phy_device struct
  2079. *
  2080. * returns 0 or negative errno code
  2081. */
  2082. static int yt8521_get_features(struct phy_device *phydev)
  2083. {
  2084. struct yt8521_priv *priv = phydev->priv;
  2085. int ret;
  2086. if (priv->reg_page != YT8521_RSSR_TO_BE_ARBITRATED) {
  2087. ret = yt8521_get_features_paged(phydev, priv->reg_page);
  2088. } else {
  2089. ret = yt8521_get_features_paged(phydev,
  2090. YT8521_RSSR_UTP_SPACE);
  2091. if (ret < 0)
  2092. return ret;
  2093. /* add fiber's features to phydev->supported */
  2094. yt8521_prepare_fiber_features(phydev, phydev->supported);
  2095. }
  2096. return ret;
  2097. }
  2098. /**
  2099. * yt8821_get_features - read mmd register to get 2.5G capability
  2100. * @phydev: target phy_device struct
  2101. *
  2102. * Returns: 0 or negative errno code
  2103. */
  2104. static int yt8821_get_features(struct phy_device *phydev)
  2105. {
  2106. int ret;
  2107. ret = genphy_c45_pma_read_ext_abilities(phydev);
  2108. if (ret < 0)
  2109. return ret;
  2110. return genphy_read_abilities(phydev);
  2111. }
  2112. /**
  2113. * yt8821_get_rate_matching - read register to get phy chip mode
  2114. * @phydev: target phy_device struct
  2115. * @iface: PHY data interface type
  2116. *
  2117. * Returns: rate matching type or negative errno code
  2118. */
  2119. static int yt8821_get_rate_matching(struct phy_device *phydev,
  2120. phy_interface_t iface)
  2121. {
  2122. int val;
  2123. val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
  2124. if (val < 0)
  2125. return val;
  2126. if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
  2127. YT8821_CHIP_MODE_FORCE_BX2500)
  2128. return RATE_MATCH_PAUSE;
  2129. return RATE_MATCH_NONE;
  2130. }
  2131. /**
  2132. * yt8821_aneg_done() - determines the auto negotiation result
  2133. * @phydev: a pointer to a &struct phy_device
  2134. *
  2135. * Returns: 0(no link)or 1(utp link) or negative errno code
  2136. */
  2137. static int yt8821_aneg_done(struct phy_device *phydev)
  2138. {
  2139. return yt8521_aneg_done_paged(phydev, YT8521_RSSR_UTP_SPACE);
  2140. }
  2141. /**
  2142. * yt8821_serdes_init() - serdes init
  2143. * @phydev: a pointer to a &struct phy_device
  2144. *
  2145. * Returns: 0 or negative errno code
  2146. */
  2147. static int yt8821_serdes_init(struct phy_device *phydev)
  2148. {
  2149. int old_page;
  2150. int ret = 0;
  2151. u16 mask;
  2152. u16 set;
  2153. old_page = phy_select_page(phydev, YT8521_RSSR_FIBER_SPACE);
  2154. if (old_page < 0) {
  2155. phydev_err(phydev, "Failed to select page: %d\n",
  2156. old_page);
  2157. goto err_restore_page;
  2158. }
  2159. ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
  2160. if (ret < 0)
  2161. goto err_restore_page;
  2162. mask = YT8821_SDS_EXT_CSR_VCO_LDO_EN |
  2163. YT8821_SDS_EXT_CSR_VCO_BIAS_LPF_EN;
  2164. set = YT8821_SDS_EXT_CSR_VCO_LDO_EN;
  2165. ret = ytphy_modify_ext(phydev, YT8821_SDS_EXT_CSR_CTRL_REG, mask,
  2166. set);
  2167. err_restore_page:
  2168. return phy_restore_page(phydev, old_page, ret);
  2169. }
  2170. /**
  2171. * yt8821_utp_init() - utp init
  2172. * @phydev: a pointer to a &struct phy_device
  2173. *
  2174. * Returns: 0 or negative errno code
  2175. */
  2176. static int yt8821_utp_init(struct phy_device *phydev)
  2177. {
  2178. int old_page;
  2179. int ret = 0;
  2180. u16 mask;
  2181. u16 save;
  2182. u16 set;
  2183. old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
  2184. if (old_page < 0) {
  2185. phydev_err(phydev, "Failed to select page: %d\n",
  2186. old_page);
  2187. goto err_restore_page;
  2188. }
  2189. mask = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
  2190. YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500 |
  2191. YT8821_UTP_EXT_RPDN_IPR_SHT_2500;
  2192. set = YT8821_UTP_EXT_RPDN_BP_FFE_LNG_2500 |
  2193. YT8821_UTP_EXT_RPDN_BP_FFE_SHT_2500;
  2194. ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_RPDN_CTRL_REG,
  2195. mask, set);
  2196. if (ret < 0)
  2197. goto err_restore_page;
  2198. mask = YT8821_UTP_EXT_VGA_LPF1_CAP_OTHER |
  2199. YT8821_UTP_EXT_VGA_LPF1_CAP_2500;
  2200. ret = ytphy_modify_ext(phydev,
  2201. YT8821_UTP_EXT_VGA_LPF1_CAP_CTRL_REG,
  2202. mask, 0);
  2203. if (ret < 0)
  2204. goto err_restore_page;
  2205. mask = YT8821_UTP_EXT_VGA_LPF2_CAP_OTHER |
  2206. YT8821_UTP_EXT_VGA_LPF2_CAP_2500;
  2207. ret = ytphy_modify_ext(phydev,
  2208. YT8821_UTP_EXT_VGA_LPF2_CAP_CTRL_REG,
  2209. mask, 0);
  2210. if (ret < 0)
  2211. goto err_restore_page;
  2212. mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500 |
  2213. YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500;
  2214. set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THE_2500, 0x5a) |
  2215. FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THE_2500, 0x3c);
  2216. ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_TRACE_CTRL_REG,
  2217. mask, set);
  2218. if (ret < 0)
  2219. goto err_restore_page;
  2220. mask = YT8821_UTP_EXT_IPR_LNG_2500;
  2221. set = FIELD_PREP(YT8821_UTP_EXT_IPR_LNG_2500, 0x6c);
  2222. ret = ytphy_modify_ext(phydev,
  2223. YT8821_UTP_EXT_ALPHA_IPR_CTRL_REG,
  2224. mask, set);
  2225. if (ret < 0)
  2226. goto err_restore_page;
  2227. mask = YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000;
  2228. set = FIELD_PREP(YT8821_UTP_EXT_TRACE_LNG_GAIN_THR_1000, 0x2a);
  2229. ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_ECHO_CTRL_REG,
  2230. mask, set);
  2231. if (ret < 0)
  2232. goto err_restore_page;
  2233. mask = YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000;
  2234. set = FIELD_PREP(YT8821_UTP_EXT_TRACE_MED_GAIN_THR_1000, 0x22);
  2235. ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_GAIN_CTRL_REG,
  2236. mask, set);
  2237. if (ret < 0)
  2238. goto err_restore_page;
  2239. mask = YT8821_UTP_EXT_TH_20DB_2500;
  2240. set = FIELD_PREP(YT8821_UTP_EXT_TH_20DB_2500, 0x8000);
  2241. ret = ytphy_modify_ext(phydev,
  2242. YT8821_UTP_EXT_TH_20DB_2500_CTRL_REG,
  2243. mask, set);
  2244. if (ret < 0)
  2245. goto err_restore_page;
  2246. mask = YT8821_UTP_EXT_MU_COARSE_FR_F_FFE |
  2247. YT8821_UTP_EXT_MU_COARSE_FR_F_FBE;
  2248. set = FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FFE, 0x7) |
  2249. FIELD_PREP(YT8821_UTP_EXT_MU_COARSE_FR_F_FBE, 0x7);
  2250. ret = ytphy_modify_ext(phydev,
  2251. YT8821_UTP_EXT_MU_COARSE_FR_CTRL_REG,
  2252. mask, set);
  2253. if (ret < 0)
  2254. goto err_restore_page;
  2255. mask = YT8821_UTP_EXT_MU_FINE_FR_F_FFE |
  2256. YT8821_UTP_EXT_MU_FINE_FR_F_FBE;
  2257. set = FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FFE, 0x2) |
  2258. FIELD_PREP(YT8821_UTP_EXT_MU_FINE_FR_F_FBE, 0x2);
  2259. ret = ytphy_modify_ext(phydev,
  2260. YT8821_UTP_EXT_MU_FINE_FR_CTRL_REG,
  2261. mask, set);
  2262. if (ret < 0)
  2263. goto err_restore_page;
  2264. /* save YT8821_UTP_EXT_PI_CTRL_REG's val for use later */
  2265. ret = ytphy_read_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG);
  2266. if (ret < 0)
  2267. goto err_restore_page;
  2268. save = ret;
  2269. mask = YT8821_UTP_EXT_PI_TX_CLK_SEL_AFE |
  2270. YT8821_UTP_EXT_PI_RX_CLK_3_SEL_AFE |
  2271. YT8821_UTP_EXT_PI_RX_CLK_2_SEL_AFE |
  2272. YT8821_UTP_EXT_PI_RX_CLK_1_SEL_AFE |
  2273. YT8821_UTP_EXT_PI_RX_CLK_0_SEL_AFE;
  2274. ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG,
  2275. mask, 0);
  2276. if (ret < 0)
  2277. goto err_restore_page;
  2278. /* restore YT8821_UTP_EXT_PI_CTRL_REG's val */
  2279. ret = ytphy_write_ext(phydev, YT8821_UTP_EXT_PI_CTRL_REG, save);
  2280. if (ret < 0)
  2281. goto err_restore_page;
  2282. mask = YT8821_UTP_EXT_FECHO_AMP_TH_HUGE;
  2283. set = FIELD_PREP(YT8821_UTP_EXT_FECHO_AMP_TH_HUGE, 0x38);
  2284. ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_VCT_CFG6_CTRL_REG,
  2285. mask, set);
  2286. if (ret < 0)
  2287. goto err_restore_page;
  2288. mask = YT8821_UTP_EXT_NFR_TX_ABILITY;
  2289. set = YT8821_UTP_EXT_NFR_TX_ABILITY;
  2290. ret = ytphy_modify_ext(phydev,
  2291. YT8821_UTP_EXT_TXGE_NFR_FR_THP_CTRL_REG,
  2292. mask, set);
  2293. if (ret < 0)
  2294. goto err_restore_page;
  2295. mask = YT8821_UTP_EXT_PLL_SPARE_CFG;
  2296. set = FIELD_PREP(YT8821_UTP_EXT_PLL_SPARE_CFG, 0xe9);
  2297. ret = ytphy_modify_ext(phydev, YT8821_UTP_EXT_PLL_CTRL_REG,
  2298. mask, set);
  2299. if (ret < 0)
  2300. goto err_restore_page;
  2301. mask = YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG |
  2302. YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG;
  2303. set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_3_10_ORG, 0x64) |
  2304. FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_2_10_ORG, 0x64);
  2305. ret = ytphy_modify_ext(phydev,
  2306. YT8821_UTP_EXT_DAC_IMID_CH_2_3_CTRL_REG,
  2307. mask, set);
  2308. if (ret < 0)
  2309. goto err_restore_page;
  2310. mask = YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG |
  2311. YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG;
  2312. set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_1_10_ORG, 0x64) |
  2313. FIELD_PREP(YT8821_UTP_EXT_DAC_IMID_CH_0_10_ORG, 0x64);
  2314. ret = ytphy_modify_ext(phydev,
  2315. YT8821_UTP_EXT_DAC_IMID_CH_0_1_CTRL_REG,
  2316. mask, set);
  2317. if (ret < 0)
  2318. goto err_restore_page;
  2319. mask = YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG |
  2320. YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG;
  2321. set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_3_10_ORG, 0x64) |
  2322. FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_2_10_ORG, 0x64);
  2323. ret = ytphy_modify_ext(phydev,
  2324. YT8821_UTP_EXT_DAC_IMSB_CH_2_3_CTRL_REG,
  2325. mask, set);
  2326. if (ret < 0)
  2327. goto err_restore_page;
  2328. mask = YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG |
  2329. YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG;
  2330. set = FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_1_10_ORG, 0x64) |
  2331. FIELD_PREP(YT8821_UTP_EXT_DAC_IMSB_CH_0_10_ORG, 0x64);
  2332. ret = ytphy_modify_ext(phydev,
  2333. YT8821_UTP_EXT_DAC_IMSB_CH_0_1_CTRL_REG,
  2334. mask, set);
  2335. err_restore_page:
  2336. return phy_restore_page(phydev, old_page, ret);
  2337. }
  2338. /**
  2339. * yt8821_auto_sleep_config() - phy auto sleep config
  2340. * @phydev: a pointer to a &struct phy_device
  2341. * @enable: true enable auto sleep, false disable auto sleep
  2342. *
  2343. * Returns: 0 or negative errno code
  2344. */
  2345. static int yt8821_auto_sleep_config(struct phy_device *phydev,
  2346. bool enable)
  2347. {
  2348. int old_page;
  2349. int ret = 0;
  2350. old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
  2351. if (old_page < 0) {
  2352. phydev_err(phydev, "Failed to select page: %d\n",
  2353. old_page);
  2354. goto err_restore_page;
  2355. }
  2356. ret = ytphy_modify_ext(phydev,
  2357. YT8521_EXTREG_SLEEP_CONTROL1_REG,
  2358. YT8521_ESC1R_SLEEP_SW,
  2359. enable ? 1 : 0);
  2360. err_restore_page:
  2361. return phy_restore_page(phydev, old_page, ret);
  2362. }
  2363. /**
  2364. * yt8821_soft_reset() - soft reset utp and serdes
  2365. * @phydev: a pointer to a &struct phy_device
  2366. *
  2367. * Returns: 0 or negative errno code
  2368. */
  2369. static int yt8821_soft_reset(struct phy_device *phydev)
  2370. {
  2371. return ytphy_modify_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG,
  2372. YT8521_CCR_SW_RST, 0);
  2373. }
  2374. /**
  2375. * yt8821_config_init() - phy initializatioin
  2376. * @phydev: a pointer to a &struct phy_device
  2377. *
  2378. * Returns: 0 or negative errno code
  2379. */
  2380. static int yt8821_config_init(struct phy_device *phydev)
  2381. {
  2382. u8 mode = YT8821_CHIP_MODE_AUTO_BX2500_SGMII;
  2383. int ret;
  2384. u16 set;
  2385. if (phydev->interface == PHY_INTERFACE_MODE_2500BASEX)
  2386. mode = YT8821_CHIP_MODE_FORCE_BX2500;
  2387. set = FIELD_PREP(YT8521_CCR_MODE_SEL_MASK, mode);
  2388. ret = ytphy_modify_ext_with_lock(phydev,
  2389. YT8521_CHIP_CONFIG_REG,
  2390. YT8521_CCR_MODE_SEL_MASK,
  2391. set);
  2392. if (ret < 0)
  2393. return ret;
  2394. __set_bit(PHY_INTERFACE_MODE_2500BASEX,
  2395. phydev->possible_interfaces);
  2396. if (mode == YT8821_CHIP_MODE_AUTO_BX2500_SGMII) {
  2397. __set_bit(PHY_INTERFACE_MODE_SGMII,
  2398. phydev->possible_interfaces);
  2399. phydev->rate_matching = RATE_MATCH_NONE;
  2400. } else if (mode == YT8821_CHIP_MODE_FORCE_BX2500) {
  2401. phydev->rate_matching = RATE_MATCH_PAUSE;
  2402. }
  2403. ret = yt8821_serdes_init(phydev);
  2404. if (ret < 0)
  2405. return ret;
  2406. ret = yt8821_utp_init(phydev);
  2407. if (ret < 0)
  2408. return ret;
  2409. /* disable auto sleep */
  2410. ret = yt8821_auto_sleep_config(phydev, false);
  2411. if (ret < 0)
  2412. return ret;
  2413. /* soft reset */
  2414. return yt8821_soft_reset(phydev);
  2415. }
  2416. /**
  2417. * yt8821_adjust_status() - update speed and duplex to phydev
  2418. * @phydev: a pointer to a &struct phy_device
  2419. * @val: read from YTPHY_SPECIFIC_STATUS_REG
  2420. */
  2421. static void yt8821_adjust_status(struct phy_device *phydev, int val)
  2422. {
  2423. int speed, duplex;
  2424. int speed_mode;
  2425. duplex = FIELD_GET(YTPHY_SSR_DUPLEX, val);
  2426. speed_mode = val & YTPHY_SSR_SPEED_MASK;
  2427. switch (speed_mode) {
  2428. case YTPHY_SSR_SPEED_10M:
  2429. speed = SPEED_10;
  2430. break;
  2431. case YTPHY_SSR_SPEED_100M:
  2432. speed = SPEED_100;
  2433. break;
  2434. case YTPHY_SSR_SPEED_1000M:
  2435. speed = SPEED_1000;
  2436. break;
  2437. case YTPHY_SSR_SPEED_2500M:
  2438. speed = SPEED_2500;
  2439. break;
  2440. default:
  2441. speed = SPEED_UNKNOWN;
  2442. break;
  2443. }
  2444. phydev->speed = speed;
  2445. phydev->duplex = duplex;
  2446. }
  2447. /**
  2448. * yt8821_update_interface() - update interface per current speed
  2449. * @phydev: a pointer to a &struct phy_device
  2450. */
  2451. static void yt8821_update_interface(struct phy_device *phydev)
  2452. {
  2453. if (!phydev->link)
  2454. return;
  2455. switch (phydev->speed) {
  2456. case SPEED_2500:
  2457. phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
  2458. break;
  2459. case SPEED_1000:
  2460. case SPEED_100:
  2461. case SPEED_10:
  2462. phydev->interface = PHY_INTERFACE_MODE_SGMII;
  2463. break;
  2464. default:
  2465. phydev_warn(phydev, "phy speed err :%d\n", phydev->speed);
  2466. break;
  2467. }
  2468. }
  2469. /**
  2470. * yt8821_read_status() - determines the negotiated speed and duplex
  2471. * @phydev: a pointer to a &struct phy_device
  2472. *
  2473. * Returns: 0 or negative errno code
  2474. */
  2475. static int yt8821_read_status(struct phy_device *phydev)
  2476. {
  2477. int link;
  2478. int ret;
  2479. int val;
  2480. ret = ytphy_write_ext_with_lock(phydev,
  2481. YT8521_REG_SPACE_SELECT_REG,
  2482. YT8521_RSSR_UTP_SPACE);
  2483. if (ret < 0)
  2484. return ret;
  2485. ret = genphy_read_status(phydev);
  2486. if (ret < 0)
  2487. return ret;
  2488. if (phydev->autoneg_complete) {
  2489. ret = genphy_c45_read_lpa(phydev);
  2490. if (ret < 0)
  2491. return ret;
  2492. }
  2493. ret = phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
  2494. if (ret < 0)
  2495. return ret;
  2496. val = ret;
  2497. link = val & YTPHY_SSR_LINK;
  2498. if (link)
  2499. yt8821_adjust_status(phydev, val);
  2500. if (link) {
  2501. if (phydev->link == 0)
  2502. phydev_dbg(phydev,
  2503. "%s, phy addr: %d, link up\n",
  2504. __func__, phydev->mdio.addr);
  2505. phydev->link = 1;
  2506. } else {
  2507. if (phydev->link == 1)
  2508. phydev_dbg(phydev,
  2509. "%s, phy addr: %d, link down\n",
  2510. __func__, phydev->mdio.addr);
  2511. phydev->link = 0;
  2512. }
  2513. val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
  2514. if (val < 0)
  2515. return val;
  2516. if (FIELD_GET(YT8521_CCR_MODE_SEL_MASK, val) ==
  2517. YT8821_CHIP_MODE_AUTO_BX2500_SGMII)
  2518. yt8821_update_interface(phydev);
  2519. return 0;
  2520. }
  2521. /**
  2522. * yt8821_modify_utp_fiber_bmcr - bits modify a PHY's BMCR register
  2523. * @phydev: the phy_device struct
  2524. * @mask: bit mask of bits to clear
  2525. * @set: bit mask of bits to set
  2526. *
  2527. * NOTE: Convenience function which allows a PHY's BMCR register to be
  2528. * modified as new register value = (old register value & ~mask) | set.
  2529. *
  2530. * Returns: 0 or negative errno code
  2531. */
  2532. static int yt8821_modify_utp_fiber_bmcr(struct phy_device *phydev,
  2533. u16 mask, u16 set)
  2534. {
  2535. int ret;
  2536. ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
  2537. mask, set);
  2538. if (ret < 0)
  2539. return ret;
  2540. return yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
  2541. mask, set);
  2542. }
  2543. /**
  2544. * yt8821_suspend() - suspend the hardware
  2545. * @phydev: a pointer to a &struct phy_device
  2546. *
  2547. * Returns: 0 or negative errno code
  2548. */
  2549. static int yt8821_suspend(struct phy_device *phydev)
  2550. {
  2551. int wol_config;
  2552. wol_config = ytphy_read_ext_with_lock(phydev,
  2553. YTPHY_WOL_CONFIG_REG);
  2554. if (wol_config < 0)
  2555. return wol_config;
  2556. /* if wol enable, do nothing */
  2557. if (wol_config & YTPHY_WCR_ENABLE)
  2558. return 0;
  2559. return yt8821_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
  2560. }
  2561. /**
  2562. * yt8821_resume() - resume the hardware
  2563. * @phydev: a pointer to a &struct phy_device
  2564. *
  2565. * Returns: 0 or negative errno code
  2566. */
  2567. static int yt8821_resume(struct phy_device *phydev)
  2568. {
  2569. int wol_config;
  2570. int ret;
  2571. /* disable auto sleep */
  2572. ret = yt8821_auto_sleep_config(phydev, false);
  2573. if (ret < 0)
  2574. return ret;
  2575. wol_config = ytphy_read_ext_with_lock(phydev,
  2576. YTPHY_WOL_CONFIG_REG);
  2577. if (wol_config < 0)
  2578. return wol_config;
  2579. /* if wol enable, do nothing */
  2580. if (wol_config & YTPHY_WCR_ENABLE)
  2581. return 0;
  2582. return yt8821_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
  2583. }
  2584. static struct phy_driver motorcomm_phy_drvs[] = {
  2585. {
  2586. PHY_ID_MATCH_EXACT(PHY_ID_YT8511),
  2587. .name = "YT8511 Gigabit Ethernet",
  2588. .config_init = yt8511_config_init,
  2589. .suspend = genphy_suspend,
  2590. .resume = genphy_resume,
  2591. .read_page = yt8511_read_page,
  2592. .write_page = yt8511_write_page,
  2593. },
  2594. {
  2595. PHY_ID_MATCH_EXACT(PHY_ID_YT8521),
  2596. .name = "YT8521 Gigabit Ethernet",
  2597. .get_features = yt8521_get_features,
  2598. .probe = yt8521_probe,
  2599. .read_page = yt8521_read_page,
  2600. .write_page = yt8521_write_page,
  2601. .get_wol = ytphy_get_wol,
  2602. .set_wol = ytphy_set_wol,
  2603. .config_aneg = yt8521_config_aneg,
  2604. .aneg_done = yt8521_aneg_done,
  2605. .config_init = yt8521_config_init,
  2606. .read_status = yt8521_read_status,
  2607. .soft_reset = yt8521_soft_reset,
  2608. .suspend = yt8521_suspend,
  2609. .resume = yt8521_resume,
  2610. .led_hw_is_supported = yt8521_led_hw_is_supported,
  2611. .led_hw_control_set = yt8521_led_hw_control_set,
  2612. .led_hw_control_get = yt8521_led_hw_control_get,
  2613. },
  2614. {
  2615. PHY_ID_MATCH_EXACT(PHY_ID_YT8531),
  2616. .name = "YT8531 Gigabit Ethernet",
  2617. .probe = yt8531_probe,
  2618. .config_init = yt8531_config_init,
  2619. .suspend = genphy_suspend,
  2620. .resume = genphy_resume,
  2621. .get_wol = ytphy_get_wol,
  2622. .set_wol = yt8531_set_wol,
  2623. .link_change_notify = yt8531_link_change_notify,
  2624. .led_hw_is_supported = yt8521_led_hw_is_supported,
  2625. .led_hw_control_set = yt8521_led_hw_control_set,
  2626. .led_hw_control_get = yt8521_led_hw_control_get,
  2627. },
  2628. {
  2629. PHY_ID_MATCH_EXACT(PHY_ID_YT8531S),
  2630. .name = "YT8531S Gigabit Ethernet",
  2631. .get_features = yt8521_get_features,
  2632. .probe = yt8521_probe,
  2633. .read_page = yt8521_read_page,
  2634. .write_page = yt8521_write_page,
  2635. .get_wol = ytphy_get_wol,
  2636. .set_wol = ytphy_set_wol,
  2637. .config_aneg = yt8521_config_aneg,
  2638. .aneg_done = yt8521_aneg_done,
  2639. .config_init = yt8521_config_init,
  2640. .read_status = yt8521_read_status,
  2641. .soft_reset = yt8521_soft_reset,
  2642. .suspend = yt8521_suspend,
  2643. .resume = yt8521_resume,
  2644. },
  2645. {
  2646. PHY_ID_MATCH_EXACT(PHY_ID_YT8821),
  2647. .name = "YT8821 2.5Gbps PHY",
  2648. .get_features = yt8821_get_features,
  2649. .read_page = yt8521_read_page,
  2650. .write_page = yt8521_write_page,
  2651. .get_wol = ytphy_get_wol,
  2652. .set_wol = ytphy_set_wol,
  2653. .config_aneg = genphy_config_aneg,
  2654. .aneg_done = yt8821_aneg_done,
  2655. .config_init = yt8821_config_init,
  2656. .get_rate_matching = yt8821_get_rate_matching,
  2657. .read_status = yt8821_read_status,
  2658. .soft_reset = yt8821_soft_reset,
  2659. .suspend = yt8821_suspend,
  2660. .resume = yt8821_resume,
  2661. },
  2662. };
  2663. module_phy_driver(motorcomm_phy_drvs);
  2664. MODULE_DESCRIPTION("Motorcomm 8511/8521/8531/8531S/8821 PHY driver");
  2665. MODULE_AUTHOR("Peter Geis");
  2666. MODULE_AUTHOR("Frank");
  2667. MODULE_LICENSE("GPL");
  2668. static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
  2669. { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
  2670. { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) },
  2671. { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
  2672. { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) },
  2673. { PHY_ID_MATCH_EXACT(PHY_ID_YT8821) },
  2674. { /* sentinel */ }
  2675. };
  2676. MODULE_DEVICE_TABLE(mdio, motorcomm_tbl);