phy-mtk-tphy.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2015 MediaTek Inc.
  4. * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
  5. *
  6. */
  7. #include <dt-bindings/phy/phy.h>
  8. #include <linux/clk.h>
  9. #include <linux/debugfs.h>
  10. #include <linux/delay.h>
  11. #include <linux/iopoll.h>
  12. #include <linux/mfd/syscon.h>
  13. #include <linux/module.h>
  14. #include <linux/nvmem-consumer.h>
  15. #include <linux/of.h>
  16. #include <linux/of_address.h>
  17. #include <linux/phy/phy.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/regmap.h>
  20. #include "phy-mtk-io.h"
  21. /* version V1 sub-banks offset base address */
  22. /* banks shared by multiple phys */
  23. #define SSUSB_SIFSLV_V1_SPLLC 0x000 /* shared by u3 phys */
  24. #define SSUSB_SIFSLV_V1_U2FREQ 0x100 /* shared by u2 phys */
  25. #define SSUSB_SIFSLV_V1_CHIP 0x300 /* shared by u3 phys */
  26. /* u2 phy bank */
  27. #define SSUSB_SIFSLV_V1_U2PHY_COM 0x000
  28. /* u3/pcie/sata phy banks */
  29. #define SSUSB_SIFSLV_V1_U3PHYD 0x000
  30. #define SSUSB_SIFSLV_V1_U3PHYA 0x200
  31. /* version V2/V3 sub-banks offset base address */
  32. /* V3: U2FREQ is not used anymore, but reserved */
  33. /* u2 phy banks */
  34. #define SSUSB_SIFSLV_V2_MISC 0x000
  35. #define SSUSB_SIFSLV_V2_U2FREQ 0x100
  36. #define SSUSB_SIFSLV_V2_U2PHY_COM 0x300
  37. /* u3/pcie/sata phy banks */
  38. #define SSUSB_SIFSLV_V2_SPLLC 0x000
  39. #define SSUSB_SIFSLV_V2_CHIP 0x100
  40. #define SSUSB_SIFSLV_V2_U3PHYD 0x200
  41. #define SSUSB_SIFSLV_V2_U3PHYA 0x400
  42. #define U3P_MISC_REG1 0x04
  43. #define MR1_EFUSE_AUTO_LOAD_DIS BIT(6)
  44. #define U3P_USBPHYACR0 0x000
  45. #define PA0_RG_U2PLL_FORCE_ON BIT(15)
  46. #define PA0_USB20_PLL_PREDIV GENMASK(7, 6)
  47. #define PA0_RG_USB20_INTR_EN BIT(5)
  48. #define U3P_USBPHYACR1 0x004
  49. #define PA1_RG_INTR_CAL GENMASK(23, 19)
  50. #define PA1_RG_VRT_SEL GENMASK(14, 12)
  51. #define PA1_RG_TERM_SEL GENMASK(10, 8)
  52. #define U3P_USBPHYACR2 0x008
  53. #define PA2_RG_U2PLL_BW GENMASK(21, 19)
  54. #define PA2_RG_SIF_U2PLL_FORCE_EN BIT(18)
  55. #define U3P_USBPHYACR5 0x014
  56. #define PA5_RG_U2_HSTX_SRCAL_EN BIT(15)
  57. #define PA5_RG_U2_HSTX_SRCTRL GENMASK(14, 12)
  58. #define PA5_RG_U2_HS_100U_U3_EN BIT(11)
  59. #define U3P_USBPHYACR6 0x018
  60. #define PA6_RG_U2_PRE_EMP GENMASK(31, 30)
  61. #define PA6_RG_U2_BC11_SW_EN BIT(23)
  62. #define PA6_RG_U2_OTG_VBUSCMP_EN BIT(20)
  63. #define PA6_RG_U2_DISCTH GENMASK(7, 4)
  64. #define PA6_RG_U2_SQTH GENMASK(3, 0)
  65. #define U3P_U2PHYACR4 0x020
  66. #define P2C_RG_USB20_GPIO_CTL BIT(9)
  67. #define P2C_USB20_GPIO_MODE BIT(8)
  68. #define P2C_U2_GPIO_CTR_MSK (P2C_RG_USB20_GPIO_CTL | P2C_USB20_GPIO_MODE)
  69. #define U3P_U2PHYA_RESV 0x030
  70. #define P2R_RG_U2PLL_FBDIV_26M 0x1bb13b
  71. #define P2R_RG_U2PLL_FBDIV_48M 0x3c0000
  72. #define U3P_U2PHYA_RESV1 0x044
  73. #define P2R_RG_U2PLL_REFCLK_SEL BIT(5)
  74. #define P2R_RG_U2PLL_FRA_EN BIT(3)
  75. #define U3D_U2PHYDCR0 0x060
  76. #define P2C_RG_SIF_U2PLL_FORCE_ON BIT(24)
  77. #define U3P_U2PHYDTM0 0x068
  78. #define P2C_FORCE_UART_EN BIT(26)
  79. #define P2C_FORCE_DATAIN BIT(23)
  80. #define P2C_FORCE_DM_PULLDOWN BIT(21)
  81. #define P2C_FORCE_DP_PULLDOWN BIT(20)
  82. #define P2C_FORCE_XCVRSEL BIT(19)
  83. #define P2C_FORCE_SUSPENDM BIT(18)
  84. #define P2C_FORCE_TERMSEL BIT(17)
  85. #define P2C_RG_DATAIN GENMASK(13, 10)
  86. #define P2C_RG_DMPULLDOWN BIT(7)
  87. #define P2C_RG_DPPULLDOWN BIT(6)
  88. #define P2C_RG_XCVRSEL GENMASK(5, 4)
  89. #define P2C_RG_SUSPENDM BIT(3)
  90. #define P2C_RG_TERMSEL BIT(2)
  91. #define P2C_DTM0_PART_MASK \
  92. (P2C_FORCE_DATAIN | P2C_FORCE_DM_PULLDOWN | \
  93. P2C_FORCE_DP_PULLDOWN | P2C_FORCE_XCVRSEL | \
  94. P2C_FORCE_TERMSEL | P2C_RG_DMPULLDOWN | \
  95. P2C_RG_DPPULLDOWN | P2C_RG_TERMSEL)
  96. #define U3P_U2PHYDTM1 0x06C
  97. #define P2C_RG_UART_EN BIT(16)
  98. #define P2C_FORCE_IDDIG BIT(9)
  99. #define P2C_RG_VBUSVALID BIT(5)
  100. #define P2C_RG_SESSEND BIT(4)
  101. #define P2C_RG_AVALID BIT(2)
  102. #define P2C_RG_IDDIG BIT(1)
  103. #define U3P_U2PHYBC12C 0x080
  104. #define P2C_RG_CHGDT_EN BIT(0)
  105. #define U3P_U3_CHIP_GPIO_CTLD 0x0c
  106. #define P3C_REG_IP_SW_RST BIT(31)
  107. #define P3C_MCU_BUS_CK_GATE_EN BIT(30)
  108. #define P3C_FORCE_IP_SW_RST BIT(29)
  109. #define U3P_U3_CHIP_GPIO_CTLE 0x10
  110. #define P3C_RG_SWRST_U3_PHYD BIT(25)
  111. #define P3C_RG_SWRST_U3_PHYD_FORCE_EN BIT(24)
  112. #define U3P_U3_PHYA_REG0 0x000
  113. #define P3A_RG_IEXT_INTR GENMASK(15, 10)
  114. #define P3A_RG_CLKDRV_OFF GENMASK(3, 2)
  115. #define U3P_U3_PHYA_REG1 0x004
  116. #define P3A_RG_CLKDRV_AMP GENMASK(31, 29)
  117. #define U3P_U3_PHYA_REG6 0x018
  118. #define P3A_RG_TX_EIDLE_CM GENMASK(31, 28)
  119. #define U3P_U3_PHYA_REG9 0x024
  120. #define P3A_RG_RX_DAC_MUX GENMASK(5, 1)
  121. #define U3P_U3_PHYA_DA_REG0 0x100
  122. #define P3A_RG_XTAL_EXT_PE2H GENMASK(17, 16)
  123. #define P3A_RG_XTAL_EXT_PE1H GENMASK(13, 12)
  124. #define P3A_RG_XTAL_EXT_EN_U3 GENMASK(11, 10)
  125. #define U3P_U3_PHYA_DA_REG4 0x108
  126. #define P3A_RG_PLL_DIVEN_PE2H GENMASK(21, 19)
  127. #define P3A_RG_PLL_BC_PE2H GENMASK(7, 6)
  128. #define U3P_U3_PHYA_DA_REG5 0x10c
  129. #define P3A_RG_PLL_BR_PE2H GENMASK(29, 28)
  130. #define P3A_RG_PLL_IC_PE2H GENMASK(15, 12)
  131. #define U3P_U3_PHYA_DA_REG6 0x110
  132. #define P3A_RG_PLL_IR_PE2H GENMASK(19, 16)
  133. #define U3P_U3_PHYA_DA_REG7 0x114
  134. #define P3A_RG_PLL_BP_PE2H GENMASK(19, 16)
  135. #define U3P_U3_PHYA_DA_REG20 0x13c
  136. #define P3A_RG_PLL_DELTA1_PE2H GENMASK(31, 16)
  137. #define U3P_U3_PHYA_DA_REG25 0x148
  138. #define P3A_RG_PLL_DELTA_PE2H GENMASK(15, 0)
  139. #define U3P_U3_PHYD_LFPS1 0x00c
  140. #define P3D_RG_FWAKE_TH GENMASK(21, 16)
  141. #define U3P_U3_PHYD_IMPCAL0 0x010
  142. #define P3D_RG_FORCE_TX_IMPEL BIT(31)
  143. #define P3D_RG_TX_IMPEL GENMASK(28, 24)
  144. #define U3P_U3_PHYD_IMPCAL1 0x014
  145. #define P3D_RG_FORCE_RX_IMPEL BIT(31)
  146. #define P3D_RG_RX_IMPEL GENMASK(28, 24)
  147. #define U3P_U3_PHYD_RSV 0x054
  148. #define P3D_RG_EFUSE_AUTO_LOAD_DIS BIT(12)
  149. #define U3P_U3_PHYD_CDR1 0x05c
  150. #define P3D_RG_CDR_BIR_LTD1 GENMASK(28, 24)
  151. #define P3D_RG_CDR_BIR_LTD0 GENMASK(12, 8)
  152. #define U3P_U3_PHYD_TOP1 0x100
  153. #define P3D_RG_PHY_MODE GENMASK(2, 1)
  154. #define P3D_RG_FORCE_PHY_MODE BIT(0)
  155. #define U3P_U3_PHYD_RXDET1 0x128
  156. #define P3D_RG_RXDET_STB2_SET GENMASK(17, 9)
  157. #define U3P_U3_PHYD_RXDET2 0x12c
  158. #define P3D_RG_RXDET_STB2_SET_P3 GENMASK(8, 0)
  159. #define U3P_SPLLC_XTALCTL3 0x018
  160. #define XC3_RG_U3_XTAL_RX_PWD BIT(9)
  161. #define XC3_RG_U3_FRC_XTAL_RX_PWD BIT(8)
  162. #define U3P_U2FREQ_FMCR0 0x00
  163. #define P2F_RG_MONCLK_SEL GENMASK(27, 26)
  164. #define P2F_RG_FREQDET_EN BIT(24)
  165. #define P2F_RG_CYCLECNT GENMASK(23, 0)
  166. #define U3P_U2FREQ_VALUE 0x0c
  167. #define U3P_U2FREQ_FMMONR1 0x10
  168. #define P2F_USB_FM_VALID BIT(0)
  169. #define P2F_RG_FRCK_EN BIT(8)
  170. #define U3P_REF_CLK 26 /* MHZ */
  171. #define U3P_SLEW_RATE_COEF 28
  172. #define U3P_SR_COEF_DIVISOR 1000
  173. #define U3P_FM_DET_CYCLE_CNT 1024
  174. /* SATA register setting */
  175. #define PHYD_CTRL_SIGNAL_MODE4 0x1c
  176. /* CDR Charge Pump P-path current adjustment */
  177. #define RG_CDR_BICLTD1_GEN1_MSK GENMASK(23, 20)
  178. #define RG_CDR_BICLTD0_GEN1_MSK GENMASK(11, 8)
  179. #define PHYD_DESIGN_OPTION2 0x24
  180. /* Symbol lock count selection */
  181. #define RG_LOCK_CNT_SEL_MSK GENMASK(5, 4)
  182. #define PHYD_DESIGN_OPTION9 0x40
  183. /* COMWAK GAP width window */
  184. #define RG_TG_MAX_MSK GENMASK(20, 16)
  185. /* COMINIT GAP width window */
  186. #define RG_T2_MAX_MSK GENMASK(13, 8)
  187. /* COMWAK GAP width window */
  188. #define RG_TG_MIN_MSK GENMASK(7, 5)
  189. /* COMINIT GAP width window */
  190. #define RG_T2_MIN_MSK GENMASK(4, 0)
  191. #define ANA_RG_CTRL_SIGNAL1 0x4c
  192. /* TX driver tail current control for 0dB de-empahsis mdoe for Gen1 speed */
  193. #define RG_IDRV_0DB_GEN1_MSK GENMASK(13, 8)
  194. #define ANA_RG_CTRL_SIGNAL4 0x58
  195. #define RG_CDR_BICLTR_GEN1_MSK GENMASK(23, 20)
  196. /* Loop filter R1 resistance adjustment for Gen1 speed */
  197. #define RG_CDR_BR_GEN2_MSK GENMASK(10, 8)
  198. #define ANA_RG_CTRL_SIGNAL6 0x60
  199. /* I-path capacitance adjustment for Gen1 */
  200. #define RG_CDR_BC_GEN1_MSK GENMASK(28, 24)
  201. #define RG_CDR_BIRLTR_GEN1_MSK GENMASK(4, 0)
  202. #define ANA_EQ_EYE_CTRL_SIGNAL1 0x6c
  203. /* RX Gen1 LEQ tuning step */
  204. #define RG_EQ_DLEQ_LFI_GEN1_MSK GENMASK(11, 8)
  205. #define ANA_EQ_EYE_CTRL_SIGNAL4 0xd8
  206. #define RG_CDR_BIRLTD0_GEN1_MSK GENMASK(20, 16)
  207. #define ANA_EQ_EYE_CTRL_SIGNAL5 0xdc
  208. #define RG_CDR_BIRLTD0_GEN3_MSK GENMASK(4, 0)
  209. /* PHY switch between pcie/usb3/sgmii/sata */
  210. #define USB_PHY_SWITCH_CTRL 0x0
  211. #define RG_PHY_SW_TYPE GENMASK(3, 0)
  212. #define RG_PHY_SW_PCIE 0x0
  213. #define RG_PHY_SW_USB3 0x1
  214. #define RG_PHY_SW_SGMII 0x2
  215. #define RG_PHY_SW_SATA 0x3
  216. #define TPHY_CLKS_CNT 2
  217. #define USER_BUF_LEN(count) min_t(size_t, 8, (count))
  218. enum mtk_phy_version {
  219. MTK_PHY_V1 = 1,
  220. MTK_PHY_V2,
  221. MTK_PHY_V3,
  222. };
  223. struct mtk_phy_pdata {
  224. /* avoid RX sensitivity level degradation only for mt8173 */
  225. bool avoid_rx_sen_degradation;
  226. /*
  227. * workaround only for mt8195, HW fix it for others of V3,
  228. * u2phy should use integer mode instead of fractional mode of
  229. * 48M PLL, fix it by switching PLL to 26M from default 48M
  230. */
  231. bool sw_pll_48m_to_26m;
  232. /*
  233. * Some SoCs (e.g. mt8195) drop a bit when use auto load efuse,
  234. * support sw way, also support it for v2/v3 optionally.
  235. */
  236. bool sw_efuse_supported;
  237. enum mtk_phy_version version;
  238. };
  239. struct u2phy_banks {
  240. void __iomem *misc;
  241. void __iomem *fmreg;
  242. void __iomem *com;
  243. };
  244. struct u3phy_banks {
  245. void __iomem *spllc;
  246. void __iomem *chip;
  247. void __iomem *phyd; /* include u3phyd_bank2 */
  248. void __iomem *phya; /* include u3phya_da */
  249. };
  250. struct mtk_phy_instance {
  251. struct phy *phy;
  252. void __iomem *port_base;
  253. union {
  254. struct u2phy_banks u2_banks;
  255. struct u3phy_banks u3_banks;
  256. };
  257. struct clk_bulk_data clks[TPHY_CLKS_CNT];
  258. u32 index;
  259. u32 type;
  260. struct regmap *type_sw;
  261. u32 type_sw_reg;
  262. u32 type_sw_index;
  263. u32 efuse_sw_en;
  264. u32 efuse_intr;
  265. u32 efuse_tx_imp;
  266. u32 efuse_rx_imp;
  267. int eye_src;
  268. int eye_vrt;
  269. int eye_term;
  270. int intr;
  271. int discth;
  272. int pre_emphasis;
  273. bool bc12_en;
  274. bool type_force_mode;
  275. };
  276. struct mtk_tphy {
  277. struct device *dev;
  278. void __iomem *sif_base; /* only shared sif */
  279. const struct mtk_phy_pdata *pdata;
  280. struct mtk_phy_instance **phys;
  281. int nphys;
  282. int src_ref_clk; /* MHZ, reference clock for slew rate calibrate */
  283. int src_coef; /* coefficient for slew rate calibrate */
  284. };
  285. #if IS_ENABLED(CONFIG_DEBUG_FS)
  286. enum u2_phy_params {
  287. U2P_EYE_VRT = 0,
  288. U2P_EYE_TERM,
  289. U2P_EFUSE_EN,
  290. U2P_EFUSE_INTR,
  291. U2P_DISCTH,
  292. U2P_PRE_EMPHASIS,
  293. };
  294. enum u3_phy_params {
  295. U3P_EFUSE_EN = 0,
  296. U3P_EFUSE_INTR,
  297. U3P_EFUSE_TX_IMP,
  298. U3P_EFUSE_RX_IMP,
  299. };
  300. static const char *const u2_phy_files[] = {
  301. [U2P_EYE_VRT] = "vrt",
  302. [U2P_EYE_TERM] = "term",
  303. [U2P_EFUSE_EN] = "efuse",
  304. [U2P_EFUSE_INTR] = "intr",
  305. [U2P_DISCTH] = "discth",
  306. [U2P_PRE_EMPHASIS] = "preemph",
  307. };
  308. static const char *const u3_phy_files[] = {
  309. [U3P_EFUSE_EN] = "efuse",
  310. [U3P_EFUSE_INTR] = "intr",
  311. [U3P_EFUSE_TX_IMP] = "tx-imp",
  312. [U3P_EFUSE_RX_IMP] = "rx-imp",
  313. };
  314. static int u2_phy_params_show(struct seq_file *sf, void *unused)
  315. {
  316. struct mtk_phy_instance *inst = sf->private;
  317. const char *fname = file_dentry(sf->file)->d_iname;
  318. struct u2phy_banks *u2_banks = &inst->u2_banks;
  319. void __iomem *com = u2_banks->com;
  320. u32 max = 0;
  321. u32 tmp = 0;
  322. u32 val = 0;
  323. int ret;
  324. ret = match_string(u2_phy_files, ARRAY_SIZE(u2_phy_files), fname);
  325. if (ret < 0)
  326. return ret;
  327. switch (ret) {
  328. case U2P_EYE_VRT:
  329. tmp = readl(com + U3P_USBPHYACR1);
  330. val = FIELD_GET(PA1_RG_VRT_SEL, tmp);
  331. max = FIELD_MAX(PA1_RG_VRT_SEL);
  332. break;
  333. case U2P_EYE_TERM:
  334. tmp = readl(com + U3P_USBPHYACR1);
  335. val = FIELD_GET(PA1_RG_TERM_SEL, tmp);
  336. max = FIELD_MAX(PA1_RG_TERM_SEL);
  337. break;
  338. case U2P_EFUSE_EN:
  339. if (u2_banks->misc) {
  340. tmp = readl(u2_banks->misc + U3P_MISC_REG1);
  341. max = 1;
  342. }
  343. val = !!(tmp & MR1_EFUSE_AUTO_LOAD_DIS);
  344. break;
  345. case U2P_EFUSE_INTR:
  346. tmp = readl(com + U3P_USBPHYACR1);
  347. val = FIELD_GET(PA1_RG_INTR_CAL, tmp);
  348. max = FIELD_MAX(PA1_RG_INTR_CAL);
  349. break;
  350. case U2P_DISCTH:
  351. tmp = readl(com + U3P_USBPHYACR6);
  352. val = FIELD_GET(PA6_RG_U2_DISCTH, tmp);
  353. max = FIELD_MAX(PA6_RG_U2_DISCTH);
  354. break;
  355. case U2P_PRE_EMPHASIS:
  356. tmp = readl(com + U3P_USBPHYACR6);
  357. val = FIELD_GET(PA6_RG_U2_PRE_EMP, tmp);
  358. max = FIELD_MAX(PA6_RG_U2_PRE_EMP);
  359. break;
  360. default:
  361. seq_printf(sf, "invalid, %d\n", ret);
  362. break;
  363. }
  364. seq_printf(sf, "%s : %d [0, %d]\n", fname, val, max);
  365. return 0;
  366. }
  367. static int u2_phy_params_open(struct inode *inode, struct file *file)
  368. {
  369. return single_open(file, u2_phy_params_show, inode->i_private);
  370. }
  371. static ssize_t u2_phy_params_write(struct file *file, const char __user *ubuf,
  372. size_t count, loff_t *ppos)
  373. {
  374. const char *fname = file_dentry(file)->d_iname;
  375. struct seq_file *sf = file->private_data;
  376. struct mtk_phy_instance *inst = sf->private;
  377. struct u2phy_banks *u2_banks = &inst->u2_banks;
  378. void __iomem *com = u2_banks->com;
  379. ssize_t rc;
  380. u32 val;
  381. int ret;
  382. rc = kstrtouint_from_user(ubuf, USER_BUF_LEN(count), 0, &val);
  383. if (rc)
  384. return rc;
  385. ret = match_string(u2_phy_files, ARRAY_SIZE(u2_phy_files), fname);
  386. if (ret < 0)
  387. return (ssize_t)ret;
  388. switch (ret) {
  389. case U2P_EYE_VRT:
  390. mtk_phy_update_field(com + U3P_USBPHYACR1, PA1_RG_VRT_SEL, val);
  391. break;
  392. case U2P_EYE_TERM:
  393. mtk_phy_update_field(com + U3P_USBPHYACR1, PA1_RG_TERM_SEL, val);
  394. break;
  395. case U2P_EFUSE_EN:
  396. if (u2_banks->misc)
  397. mtk_phy_update_field(u2_banks->misc + U3P_MISC_REG1,
  398. MR1_EFUSE_AUTO_LOAD_DIS, !!val);
  399. break;
  400. case U2P_EFUSE_INTR:
  401. mtk_phy_update_field(com + U3P_USBPHYACR1, PA1_RG_INTR_CAL, val);
  402. break;
  403. case U2P_DISCTH:
  404. mtk_phy_update_field(com + U3P_USBPHYACR6, PA6_RG_U2_DISCTH, val);
  405. break;
  406. case U2P_PRE_EMPHASIS:
  407. mtk_phy_update_field(com + U3P_USBPHYACR6, PA6_RG_U2_PRE_EMP, val);
  408. break;
  409. default:
  410. break;
  411. }
  412. return count;
  413. }
  414. static const struct file_operations u2_phy_fops = {
  415. .open = u2_phy_params_open,
  416. .write = u2_phy_params_write,
  417. .read = seq_read,
  418. .llseek = seq_lseek,
  419. .release = single_release,
  420. };
  421. static void u2_phy_dbgfs_files_create(struct mtk_phy_instance *inst)
  422. {
  423. u32 count = ARRAY_SIZE(u2_phy_files);
  424. int i;
  425. for (i = 0; i < count; i++)
  426. debugfs_create_file(u2_phy_files[i], 0644, inst->phy->debugfs,
  427. inst, &u2_phy_fops);
  428. }
  429. static int u3_phy_params_show(struct seq_file *sf, void *unused)
  430. {
  431. struct mtk_phy_instance *inst = sf->private;
  432. const char *fname = file_dentry(sf->file)->d_iname;
  433. struct u3phy_banks *u3_banks = &inst->u3_banks;
  434. u32 val = 0;
  435. u32 max = 0;
  436. u32 tmp;
  437. int ret;
  438. ret = match_string(u3_phy_files, ARRAY_SIZE(u3_phy_files), fname);
  439. if (ret < 0)
  440. return ret;
  441. switch (ret) {
  442. case U3P_EFUSE_EN:
  443. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RSV);
  444. val = !!(tmp & P3D_RG_EFUSE_AUTO_LOAD_DIS);
  445. max = 1;
  446. break;
  447. case U3P_EFUSE_INTR:
  448. tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG0);
  449. val = FIELD_GET(P3A_RG_IEXT_INTR, tmp);
  450. max = FIELD_MAX(P3A_RG_IEXT_INTR);
  451. break;
  452. case U3P_EFUSE_TX_IMP:
  453. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_IMPCAL0);
  454. val = FIELD_GET(P3D_RG_TX_IMPEL, tmp);
  455. max = FIELD_MAX(P3D_RG_TX_IMPEL);
  456. break;
  457. case U3P_EFUSE_RX_IMP:
  458. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_IMPCAL1);
  459. val = FIELD_GET(P3D_RG_RX_IMPEL, tmp);
  460. max = FIELD_MAX(P3D_RG_RX_IMPEL);
  461. break;
  462. default:
  463. seq_printf(sf, "invalid, %d\n", ret);
  464. break;
  465. }
  466. seq_printf(sf, "%s : %d [0, %d]\n", fname, val, max);
  467. return 0;
  468. }
  469. static int u3_phy_params_open(struct inode *inode, struct file *file)
  470. {
  471. return single_open(file, u3_phy_params_show, inode->i_private);
  472. }
  473. static ssize_t u3_phy_params_write(struct file *file, const char __user *ubuf,
  474. size_t count, loff_t *ppos)
  475. {
  476. const char *fname = file_dentry(file)->d_iname;
  477. struct seq_file *sf = file->private_data;
  478. struct mtk_phy_instance *inst = sf->private;
  479. struct u3phy_banks *u3_banks = &inst->u3_banks;
  480. void __iomem *phyd = u3_banks->phyd;
  481. ssize_t rc;
  482. u32 val;
  483. int ret;
  484. rc = kstrtouint_from_user(ubuf, USER_BUF_LEN(count), 0, &val);
  485. if (rc)
  486. return rc;
  487. ret = match_string(u3_phy_files, ARRAY_SIZE(u3_phy_files), fname);
  488. if (ret < 0)
  489. return (ssize_t)ret;
  490. switch (ret) {
  491. case U3P_EFUSE_EN:
  492. mtk_phy_update_field(phyd + U3P_U3_PHYD_RSV,
  493. P3D_RG_EFUSE_AUTO_LOAD_DIS, !!val);
  494. break;
  495. case U3P_EFUSE_INTR:
  496. mtk_phy_update_field(u3_banks->phya + U3P_U3_PHYA_REG0,
  497. P3A_RG_IEXT_INTR, val);
  498. break;
  499. case U3P_EFUSE_TX_IMP:
  500. mtk_phy_update_field(phyd + U3P_U3_PHYD_IMPCAL0, P3D_RG_TX_IMPEL, val);
  501. mtk_phy_set_bits(phyd + U3P_U3_PHYD_IMPCAL0, P3D_RG_FORCE_TX_IMPEL);
  502. break;
  503. case U3P_EFUSE_RX_IMP:
  504. mtk_phy_update_field(phyd + U3P_U3_PHYD_IMPCAL1, P3D_RG_RX_IMPEL, val);
  505. mtk_phy_set_bits(phyd + U3P_U3_PHYD_IMPCAL1, P3D_RG_FORCE_RX_IMPEL);
  506. break;
  507. default:
  508. break;
  509. }
  510. return count;
  511. }
  512. static const struct file_operations u3_phy_fops = {
  513. .open = u3_phy_params_open,
  514. .write = u3_phy_params_write,
  515. .read = seq_read,
  516. .llseek = seq_lseek,
  517. .release = single_release,
  518. };
  519. static void u3_phy_dbgfs_files_create(struct mtk_phy_instance *inst)
  520. {
  521. u32 count = ARRAY_SIZE(u3_phy_files);
  522. int i;
  523. for (i = 0; i < count; i++)
  524. debugfs_create_file(u3_phy_files[i], 0644, inst->phy->debugfs,
  525. inst, &u3_phy_fops);
  526. }
  527. static int phy_type_show(struct seq_file *sf, void *unused)
  528. {
  529. struct mtk_phy_instance *inst = sf->private;
  530. const char *type;
  531. switch (inst->type) {
  532. case PHY_TYPE_USB2:
  533. type = "USB2";
  534. break;
  535. case PHY_TYPE_USB3:
  536. type = "USB3";
  537. break;
  538. case PHY_TYPE_PCIE:
  539. type = "PCIe";
  540. break;
  541. case PHY_TYPE_SGMII:
  542. type = "SGMII";
  543. break;
  544. case PHY_TYPE_SATA:
  545. type = "SATA";
  546. break;
  547. default:
  548. type = "";
  549. }
  550. seq_printf(sf, "%s\n", type);
  551. return 0;
  552. }
  553. DEFINE_SHOW_ATTRIBUTE(phy_type);
  554. /* these files will be removed when phy is released by phy core */
  555. static void phy_debugfs_init(struct mtk_phy_instance *inst)
  556. {
  557. debugfs_create_file("type", 0444, inst->phy->debugfs, inst, &phy_type_fops);
  558. switch (inst->type) {
  559. case PHY_TYPE_USB2:
  560. u2_phy_dbgfs_files_create(inst);
  561. break;
  562. case PHY_TYPE_USB3:
  563. case PHY_TYPE_PCIE:
  564. u3_phy_dbgfs_files_create(inst);
  565. break;
  566. default:
  567. break;
  568. }
  569. }
  570. #else
  571. static void phy_debugfs_init(struct mtk_phy_instance *inst)
  572. {}
  573. #endif
  574. static void hs_slew_rate_calibrate(struct mtk_tphy *tphy,
  575. struct mtk_phy_instance *instance)
  576. {
  577. struct u2phy_banks *u2_banks = &instance->u2_banks;
  578. void __iomem *fmreg = u2_banks->fmreg;
  579. void __iomem *com = u2_banks->com;
  580. int calibration_val;
  581. int fm_out;
  582. u32 tmp;
  583. /* HW V3 doesn't support slew rate cal anymore */
  584. if (tphy->pdata->version == MTK_PHY_V3)
  585. return;
  586. /* use force value */
  587. if (instance->eye_src)
  588. return;
  589. /* enable USB ring oscillator */
  590. mtk_phy_set_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCAL_EN);
  591. udelay(1);
  592. /*enable free run clock */
  593. mtk_phy_set_bits(fmreg + U3P_U2FREQ_FMMONR1, P2F_RG_FRCK_EN);
  594. /* set cycle count as 1024, and select u2 channel */
  595. tmp = readl(fmreg + U3P_U2FREQ_FMCR0);
  596. tmp &= ~(P2F_RG_CYCLECNT | P2F_RG_MONCLK_SEL);
  597. tmp |= FIELD_PREP(P2F_RG_CYCLECNT, U3P_FM_DET_CYCLE_CNT);
  598. if (tphy->pdata->version == MTK_PHY_V1)
  599. tmp |= FIELD_PREP(P2F_RG_MONCLK_SEL, instance->index >> 1);
  600. writel(tmp, fmreg + U3P_U2FREQ_FMCR0);
  601. /* enable frequency meter */
  602. mtk_phy_set_bits(fmreg + U3P_U2FREQ_FMCR0, P2F_RG_FREQDET_EN);
  603. /* ignore return value */
  604. readl_poll_timeout(fmreg + U3P_U2FREQ_FMMONR1, tmp,
  605. (tmp & P2F_USB_FM_VALID), 10, 200);
  606. fm_out = readl(fmreg + U3P_U2FREQ_VALUE);
  607. /* disable frequency meter */
  608. mtk_phy_clear_bits(fmreg + U3P_U2FREQ_FMCR0, P2F_RG_FREQDET_EN);
  609. /*disable free run clock */
  610. mtk_phy_clear_bits(fmreg + U3P_U2FREQ_FMMONR1, P2F_RG_FRCK_EN);
  611. if (fm_out) {
  612. /* ( 1024 / FM_OUT ) x reference clock frequency x coef */
  613. tmp = tphy->src_ref_clk * tphy->src_coef;
  614. tmp = (tmp * U3P_FM_DET_CYCLE_CNT) / fm_out;
  615. calibration_val = DIV_ROUND_CLOSEST(tmp, U3P_SR_COEF_DIVISOR);
  616. } else {
  617. /* if FM detection fail, set default value */
  618. calibration_val = 4;
  619. }
  620. dev_dbg(tphy->dev, "phy:%d, fm_out:%d, calib:%d (clk:%d, coef:%d)\n",
  621. instance->index, fm_out, calibration_val,
  622. tphy->src_ref_clk, tphy->src_coef);
  623. /* set HS slew rate */
  624. mtk_phy_update_field(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCTRL,
  625. calibration_val);
  626. /* disable USB ring oscillator */
  627. mtk_phy_clear_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCAL_EN);
  628. }
  629. static void u3_phy_instance_init(struct mtk_tphy *tphy,
  630. struct mtk_phy_instance *instance)
  631. {
  632. struct u3phy_banks *u3_banks = &instance->u3_banks;
  633. void __iomem *phya = u3_banks->phya;
  634. void __iomem *phyd = u3_banks->phyd;
  635. if (instance->type_force_mode) {
  636. /* force phy as usb mode, default is pcie rc mode */
  637. mtk_phy_update_field(phyd + U3P_U3_PHYD_TOP1, P3D_RG_PHY_MODE, 1);
  638. mtk_phy_set_bits(phyd + U3P_U3_PHYD_TOP1, P3D_RG_FORCE_PHY_MODE);
  639. /* power down phy by ip and pipe reset */
  640. mtk_phy_set_bits(u3_banks->chip + U3P_U3_CHIP_GPIO_CTLD,
  641. P3C_FORCE_IP_SW_RST | P3C_MCU_BUS_CK_GATE_EN);
  642. mtk_phy_set_bits(u3_banks->chip + U3P_U3_CHIP_GPIO_CTLE,
  643. P3C_RG_SWRST_U3_PHYD | P3C_RG_SWRST_U3_PHYD_FORCE_EN);
  644. udelay(10);
  645. /* power on phy again */
  646. mtk_phy_clear_bits(u3_banks->chip + U3P_U3_CHIP_GPIO_CTLD,
  647. P3C_FORCE_IP_SW_RST | P3C_MCU_BUS_CK_GATE_EN);
  648. mtk_phy_clear_bits(u3_banks->chip + U3P_U3_CHIP_GPIO_CTLE,
  649. P3C_RG_SWRST_U3_PHYD | P3C_RG_SWRST_U3_PHYD_FORCE_EN);
  650. }
  651. /* gating PCIe Analog XTAL clock */
  652. mtk_phy_set_bits(u3_banks->spllc + U3P_SPLLC_XTALCTL3,
  653. XC3_RG_U3_XTAL_RX_PWD | XC3_RG_U3_FRC_XTAL_RX_PWD);
  654. /* gating XSQ */
  655. mtk_phy_update_field(phya + U3P_U3_PHYA_DA_REG0, P3A_RG_XTAL_EXT_EN_U3, 2);
  656. mtk_phy_update_field(phya + U3P_U3_PHYA_REG9, P3A_RG_RX_DAC_MUX, 4);
  657. mtk_phy_update_field(phya + U3P_U3_PHYA_REG6, P3A_RG_TX_EIDLE_CM, 0xe);
  658. mtk_phy_update_bits(u3_banks->phyd + U3P_U3_PHYD_CDR1,
  659. P3D_RG_CDR_BIR_LTD0 | P3D_RG_CDR_BIR_LTD1,
  660. FIELD_PREP(P3D_RG_CDR_BIR_LTD0, 0xc) |
  661. FIELD_PREP(P3D_RG_CDR_BIR_LTD1, 0x3));
  662. mtk_phy_update_field(phyd + U3P_U3_PHYD_LFPS1, P3D_RG_FWAKE_TH, 0x34);
  663. mtk_phy_update_field(phyd + U3P_U3_PHYD_RXDET1, P3D_RG_RXDET_STB2_SET, 0x10);
  664. mtk_phy_update_field(phyd + U3P_U3_PHYD_RXDET2, P3D_RG_RXDET_STB2_SET_P3, 0x10);
  665. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  666. }
  667. static void u2_phy_pll_26m_set(struct mtk_tphy *tphy,
  668. struct mtk_phy_instance *instance)
  669. {
  670. struct u2phy_banks *u2_banks = &instance->u2_banks;
  671. void __iomem *com = u2_banks->com;
  672. if (!tphy->pdata->sw_pll_48m_to_26m)
  673. return;
  674. mtk_phy_update_field(com + U3P_USBPHYACR0, PA0_USB20_PLL_PREDIV, 0);
  675. mtk_phy_update_field(com + U3P_USBPHYACR2, PA2_RG_U2PLL_BW, 3);
  676. writel(P2R_RG_U2PLL_FBDIV_26M, com + U3P_U2PHYA_RESV);
  677. mtk_phy_set_bits(com + U3P_U2PHYA_RESV1,
  678. P2R_RG_U2PLL_FRA_EN | P2R_RG_U2PLL_REFCLK_SEL);
  679. }
  680. static void u2_phy_instance_init(struct mtk_tphy *tphy,
  681. struct mtk_phy_instance *instance)
  682. {
  683. struct u2phy_banks *u2_banks = &instance->u2_banks;
  684. void __iomem *com = u2_banks->com;
  685. u32 index = instance->index;
  686. /* switch to USB function, and enable usb pll */
  687. mtk_phy_clear_bits(com + U3P_U2PHYDTM0, P2C_FORCE_UART_EN | P2C_FORCE_SUSPENDM);
  688. mtk_phy_clear_bits(com + U3P_U2PHYDTM0,
  689. P2C_RG_XCVRSEL | P2C_RG_DATAIN | P2C_DTM0_PART_MASK);
  690. mtk_phy_clear_bits(com + U3P_U2PHYDTM1, P2C_RG_UART_EN);
  691. mtk_phy_set_bits(com + U3P_USBPHYACR0, PA0_RG_USB20_INTR_EN);
  692. /* disable switch 100uA current to SSUSB */
  693. mtk_phy_clear_bits(com + U3P_USBPHYACR5, PA5_RG_U2_HS_100U_U3_EN);
  694. mtk_phy_clear_bits(com + U3P_U2PHYACR4, P2C_U2_GPIO_CTR_MSK);
  695. if (tphy->pdata->avoid_rx_sen_degradation) {
  696. if (!index) {
  697. mtk_phy_set_bits(com + U3P_USBPHYACR2, PA2_RG_SIF_U2PLL_FORCE_EN);
  698. mtk_phy_clear_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
  699. } else {
  700. mtk_phy_set_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
  701. mtk_phy_set_bits(com + U3P_U2PHYDTM0,
  702. P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM);
  703. }
  704. }
  705. /* DP/DM BC1.1 path Disable */
  706. mtk_phy_clear_bits(com + U3P_USBPHYACR6, PA6_RG_U2_BC11_SW_EN);
  707. mtk_phy_update_field(com + U3P_USBPHYACR6, PA6_RG_U2_SQTH, 2);
  708. /* Workaround only for mt8195, HW fix it for others (V3) */
  709. u2_phy_pll_26m_set(tphy, instance);
  710. dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
  711. }
  712. static void u2_phy_instance_power_on(struct mtk_tphy *tphy,
  713. struct mtk_phy_instance *instance)
  714. {
  715. struct u2phy_banks *u2_banks = &instance->u2_banks;
  716. void __iomem *com = u2_banks->com;
  717. u32 index = instance->index;
  718. /* OTG Enable */
  719. mtk_phy_set_bits(com + U3P_USBPHYACR6, PA6_RG_U2_OTG_VBUSCMP_EN);
  720. mtk_phy_set_bits(com + U3P_U2PHYDTM1, P2C_RG_VBUSVALID | P2C_RG_AVALID);
  721. mtk_phy_clear_bits(com + U3P_U2PHYDTM1, P2C_RG_SESSEND);
  722. if (tphy->pdata->avoid_rx_sen_degradation && index) {
  723. mtk_phy_set_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
  724. mtk_phy_set_bits(com + U3P_U2PHYDTM0, P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM);
  725. }
  726. dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
  727. }
  728. static void u2_phy_instance_power_off(struct mtk_tphy *tphy,
  729. struct mtk_phy_instance *instance)
  730. {
  731. struct u2phy_banks *u2_banks = &instance->u2_banks;
  732. void __iomem *com = u2_banks->com;
  733. u32 index = instance->index;
  734. /* OTG Disable */
  735. mtk_phy_clear_bits(com + U3P_USBPHYACR6, PA6_RG_U2_OTG_VBUSCMP_EN);
  736. mtk_phy_clear_bits(com + U3P_U2PHYDTM1, P2C_RG_VBUSVALID | P2C_RG_AVALID);
  737. mtk_phy_set_bits(com + U3P_U2PHYDTM1, P2C_RG_SESSEND);
  738. if (tphy->pdata->avoid_rx_sen_degradation && index) {
  739. mtk_phy_clear_bits(com + U3P_U2PHYDTM0, P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM);
  740. mtk_phy_clear_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
  741. }
  742. dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
  743. }
  744. static void u2_phy_instance_exit(struct mtk_tphy *tphy,
  745. struct mtk_phy_instance *instance)
  746. {
  747. struct u2phy_banks *u2_banks = &instance->u2_banks;
  748. void __iomem *com = u2_banks->com;
  749. u32 index = instance->index;
  750. if (tphy->pdata->avoid_rx_sen_degradation && index) {
  751. mtk_phy_clear_bits(com + U3D_U2PHYDCR0, P2C_RG_SIF_U2PLL_FORCE_ON);
  752. mtk_phy_clear_bits(com + U3P_U2PHYDTM0, P2C_FORCE_SUSPENDM);
  753. }
  754. }
  755. static void u2_phy_instance_set_mode(struct mtk_tphy *tphy,
  756. struct mtk_phy_instance *instance,
  757. enum phy_mode mode)
  758. {
  759. struct u2phy_banks *u2_banks = &instance->u2_banks;
  760. u32 tmp;
  761. tmp = readl(u2_banks->com + U3P_U2PHYDTM1);
  762. switch (mode) {
  763. case PHY_MODE_USB_DEVICE:
  764. tmp |= P2C_FORCE_IDDIG | P2C_RG_IDDIG;
  765. break;
  766. case PHY_MODE_USB_HOST:
  767. tmp |= P2C_FORCE_IDDIG;
  768. tmp &= ~P2C_RG_IDDIG;
  769. break;
  770. case PHY_MODE_USB_OTG:
  771. tmp &= ~(P2C_FORCE_IDDIG | P2C_RG_IDDIG);
  772. break;
  773. default:
  774. return;
  775. }
  776. writel(tmp, u2_banks->com + U3P_U2PHYDTM1);
  777. }
  778. static void pcie_phy_instance_init(struct mtk_tphy *tphy,
  779. struct mtk_phy_instance *instance)
  780. {
  781. struct u3phy_banks *u3_banks = &instance->u3_banks;
  782. void __iomem *phya = u3_banks->phya;
  783. if (tphy->pdata->version != MTK_PHY_V1)
  784. return;
  785. mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG0,
  786. P3A_RG_XTAL_EXT_PE1H | P3A_RG_XTAL_EXT_PE2H,
  787. FIELD_PREP(P3A_RG_XTAL_EXT_PE1H, 0x2) |
  788. FIELD_PREP(P3A_RG_XTAL_EXT_PE2H, 0x2));
  789. /* ref clk drive */
  790. mtk_phy_update_field(phya + U3P_U3_PHYA_REG1, P3A_RG_CLKDRV_AMP, 0x4);
  791. mtk_phy_update_field(phya + U3P_U3_PHYA_REG0, P3A_RG_CLKDRV_OFF, 0x1);
  792. /* SSC delta -5000ppm */
  793. mtk_phy_update_field(phya + U3P_U3_PHYA_DA_REG20, P3A_RG_PLL_DELTA1_PE2H, 0x3c);
  794. mtk_phy_update_field(phya + U3P_U3_PHYA_DA_REG25, P3A_RG_PLL_DELTA_PE2H, 0x36);
  795. /* change pll BW 0.6M */
  796. mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG5,
  797. P3A_RG_PLL_BR_PE2H | P3A_RG_PLL_IC_PE2H,
  798. FIELD_PREP(P3A_RG_PLL_BR_PE2H, 0x1) |
  799. FIELD_PREP(P3A_RG_PLL_IC_PE2H, 0x1));
  800. mtk_phy_update_bits(phya + U3P_U3_PHYA_DA_REG4,
  801. P3A_RG_PLL_DIVEN_PE2H | P3A_RG_PLL_BC_PE2H,
  802. FIELD_PREP(P3A_RG_PLL_BC_PE2H, 0x3));
  803. mtk_phy_update_field(phya + U3P_U3_PHYA_DA_REG6, P3A_RG_PLL_IR_PE2H, 0x2);
  804. mtk_phy_update_field(phya + U3P_U3_PHYA_DA_REG7, P3A_RG_PLL_BP_PE2H, 0xa);
  805. /* Tx Detect Rx Timing: 10us -> 5us */
  806. mtk_phy_update_field(u3_banks->phyd + U3P_U3_PHYD_RXDET1,
  807. P3D_RG_RXDET_STB2_SET, 0x10);
  808. mtk_phy_update_field(u3_banks->phyd + U3P_U3_PHYD_RXDET2,
  809. P3D_RG_RXDET_STB2_SET_P3, 0x10);
  810. /* wait for PCIe subsys register to active */
  811. usleep_range(2500, 3000);
  812. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  813. }
  814. static void pcie_phy_instance_power_on(struct mtk_tphy *tphy,
  815. struct mtk_phy_instance *instance)
  816. {
  817. struct u3phy_banks *bank = &instance->u3_banks;
  818. mtk_phy_clear_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLD,
  819. P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST);
  820. mtk_phy_clear_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLE,
  821. P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD);
  822. }
  823. static void pcie_phy_instance_power_off(struct mtk_tphy *tphy,
  824. struct mtk_phy_instance *instance)
  825. {
  826. struct u3phy_banks *bank = &instance->u3_banks;
  827. mtk_phy_set_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLD,
  828. P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST);
  829. mtk_phy_set_bits(bank->chip + U3P_U3_CHIP_GPIO_CTLE,
  830. P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD);
  831. }
  832. static void sata_phy_instance_init(struct mtk_tphy *tphy,
  833. struct mtk_phy_instance *instance)
  834. {
  835. struct u3phy_banks *u3_banks = &instance->u3_banks;
  836. void __iomem *phyd = u3_banks->phyd;
  837. /* charge current adjustment */
  838. mtk_phy_update_bits(phyd + ANA_RG_CTRL_SIGNAL6,
  839. RG_CDR_BIRLTR_GEN1_MSK | RG_CDR_BC_GEN1_MSK,
  840. FIELD_PREP(RG_CDR_BIRLTR_GEN1_MSK, 0x6) |
  841. FIELD_PREP(RG_CDR_BC_GEN1_MSK, 0x1a));
  842. mtk_phy_update_field(phyd + ANA_EQ_EYE_CTRL_SIGNAL4, RG_CDR_BIRLTD0_GEN1_MSK, 0x18);
  843. mtk_phy_update_field(phyd + ANA_EQ_EYE_CTRL_SIGNAL5, RG_CDR_BIRLTD0_GEN3_MSK, 0x06);
  844. mtk_phy_update_bits(phyd + ANA_RG_CTRL_SIGNAL4,
  845. RG_CDR_BICLTR_GEN1_MSK | RG_CDR_BR_GEN2_MSK,
  846. FIELD_PREP(RG_CDR_BICLTR_GEN1_MSK, 0x0c) |
  847. FIELD_PREP(RG_CDR_BR_GEN2_MSK, 0x07));
  848. mtk_phy_update_bits(phyd + PHYD_CTRL_SIGNAL_MODE4,
  849. RG_CDR_BICLTD0_GEN1_MSK | RG_CDR_BICLTD1_GEN1_MSK,
  850. FIELD_PREP(RG_CDR_BICLTD0_GEN1_MSK, 0x08) |
  851. FIELD_PREP(RG_CDR_BICLTD1_GEN1_MSK, 0x02));
  852. mtk_phy_update_field(phyd + PHYD_DESIGN_OPTION2, RG_LOCK_CNT_SEL_MSK, 0x02);
  853. mtk_phy_update_bits(phyd + PHYD_DESIGN_OPTION9,
  854. RG_T2_MIN_MSK | RG_TG_MIN_MSK,
  855. FIELD_PREP(RG_T2_MIN_MSK, 0x12) |
  856. FIELD_PREP(RG_TG_MIN_MSK, 0x04));
  857. mtk_phy_update_bits(phyd + PHYD_DESIGN_OPTION9,
  858. RG_T2_MAX_MSK | RG_TG_MAX_MSK,
  859. FIELD_PREP(RG_T2_MAX_MSK, 0x31) |
  860. FIELD_PREP(RG_TG_MAX_MSK, 0x0e));
  861. mtk_phy_update_field(phyd + ANA_RG_CTRL_SIGNAL1, RG_IDRV_0DB_GEN1_MSK, 0x20);
  862. mtk_phy_update_field(phyd + ANA_EQ_EYE_CTRL_SIGNAL1, RG_EQ_DLEQ_LFI_GEN1_MSK, 0x03);
  863. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  864. }
  865. static void phy_v1_banks_init(struct mtk_tphy *tphy,
  866. struct mtk_phy_instance *instance)
  867. {
  868. struct u2phy_banks *u2_banks = &instance->u2_banks;
  869. struct u3phy_banks *u3_banks = &instance->u3_banks;
  870. switch (instance->type) {
  871. case PHY_TYPE_USB2:
  872. u2_banks->misc = NULL;
  873. u2_banks->fmreg = tphy->sif_base + SSUSB_SIFSLV_V1_U2FREQ;
  874. u2_banks->com = instance->port_base + SSUSB_SIFSLV_V1_U2PHY_COM;
  875. break;
  876. case PHY_TYPE_USB3:
  877. case PHY_TYPE_PCIE:
  878. u3_banks->spllc = tphy->sif_base + SSUSB_SIFSLV_V1_SPLLC;
  879. u3_banks->chip = tphy->sif_base + SSUSB_SIFSLV_V1_CHIP;
  880. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
  881. u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V1_U3PHYA;
  882. break;
  883. case PHY_TYPE_SATA:
  884. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
  885. break;
  886. default:
  887. dev_err(tphy->dev, "incompatible PHY type\n");
  888. return;
  889. }
  890. }
  891. static void phy_v2_banks_init(struct mtk_tphy *tphy,
  892. struct mtk_phy_instance *instance)
  893. {
  894. struct u2phy_banks *u2_banks = &instance->u2_banks;
  895. struct u3phy_banks *u3_banks = &instance->u3_banks;
  896. switch (instance->type) {
  897. case PHY_TYPE_USB2:
  898. u2_banks->misc = instance->port_base + SSUSB_SIFSLV_V2_MISC;
  899. u2_banks->fmreg = instance->port_base + SSUSB_SIFSLV_V2_U2FREQ;
  900. u2_banks->com = instance->port_base + SSUSB_SIFSLV_V2_U2PHY_COM;
  901. break;
  902. case PHY_TYPE_USB3:
  903. case PHY_TYPE_PCIE:
  904. u3_banks->spllc = instance->port_base + SSUSB_SIFSLV_V2_SPLLC;
  905. u3_banks->chip = instance->port_base + SSUSB_SIFSLV_V2_CHIP;
  906. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V2_U3PHYD;
  907. u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V2_U3PHYA;
  908. break;
  909. default:
  910. dev_err(tphy->dev, "incompatible PHY type\n");
  911. return;
  912. }
  913. }
  914. static void phy_parse_property(struct mtk_tphy *tphy,
  915. struct mtk_phy_instance *instance)
  916. {
  917. struct device *dev = &instance->phy->dev;
  918. if (instance->type == PHY_TYPE_USB3)
  919. instance->type_force_mode = device_property_read_bool(dev, "mediatek,force-mode");
  920. if (instance->type != PHY_TYPE_USB2)
  921. return;
  922. instance->bc12_en = device_property_read_bool(dev, "mediatek,bc12");
  923. device_property_read_u32(dev, "mediatek,eye-src",
  924. &instance->eye_src);
  925. device_property_read_u32(dev, "mediatek,eye-vrt",
  926. &instance->eye_vrt);
  927. device_property_read_u32(dev, "mediatek,eye-term",
  928. &instance->eye_term);
  929. device_property_read_u32(dev, "mediatek,intr",
  930. &instance->intr);
  931. device_property_read_u32(dev, "mediatek,discth",
  932. &instance->discth);
  933. device_property_read_u32(dev, "mediatek,pre-emphasis",
  934. &instance->pre_emphasis);
  935. dev_dbg(dev, "bc12:%d, src:%d, vrt:%d, term:%d, intr:%d, disc:%d\n",
  936. instance->bc12_en, instance->eye_src,
  937. instance->eye_vrt, instance->eye_term,
  938. instance->intr, instance->discth);
  939. dev_dbg(dev, "pre-emp:%d\n", instance->pre_emphasis);
  940. }
  941. static void u2_phy_props_set(struct mtk_tphy *tphy,
  942. struct mtk_phy_instance *instance)
  943. {
  944. struct u2phy_banks *u2_banks = &instance->u2_banks;
  945. void __iomem *com = u2_banks->com;
  946. if (instance->bc12_en) /* BC1.2 path Enable */
  947. mtk_phy_set_bits(com + U3P_U2PHYBC12C, P2C_RG_CHGDT_EN);
  948. if (tphy->pdata->version < MTK_PHY_V3 && instance->eye_src)
  949. mtk_phy_update_field(com + U3P_USBPHYACR5, PA5_RG_U2_HSTX_SRCTRL,
  950. instance->eye_src);
  951. if (instance->eye_vrt)
  952. mtk_phy_update_field(com + U3P_USBPHYACR1, PA1_RG_VRT_SEL,
  953. instance->eye_vrt);
  954. if (instance->eye_term)
  955. mtk_phy_update_field(com + U3P_USBPHYACR1, PA1_RG_TERM_SEL,
  956. instance->eye_term);
  957. if (instance->intr) {
  958. if (u2_banks->misc)
  959. mtk_phy_set_bits(u2_banks->misc + U3P_MISC_REG1,
  960. MR1_EFUSE_AUTO_LOAD_DIS);
  961. mtk_phy_update_field(com + U3P_USBPHYACR1, PA1_RG_INTR_CAL,
  962. instance->intr);
  963. }
  964. if (instance->discth)
  965. mtk_phy_update_field(com + U3P_USBPHYACR6, PA6_RG_U2_DISCTH,
  966. instance->discth);
  967. if (instance->pre_emphasis)
  968. mtk_phy_update_field(com + U3P_USBPHYACR6, PA6_RG_U2_PRE_EMP,
  969. instance->pre_emphasis);
  970. }
  971. /* type switch for usb3/pcie/sgmii/sata */
  972. static int phy_type_syscon_get(struct mtk_phy_instance *instance,
  973. struct device_node *dn)
  974. {
  975. struct of_phandle_args args;
  976. int ret;
  977. /* type switch function is optional */
  978. if (!of_property_read_bool(dn, "mediatek,syscon-type"))
  979. return 0;
  980. ret = of_parse_phandle_with_fixed_args(dn, "mediatek,syscon-type",
  981. 2, 0, &args);
  982. if (ret)
  983. return ret;
  984. instance->type_sw_reg = args.args[0];
  985. instance->type_sw_index = args.args[1] & 0x3; /* <=3 */
  986. instance->type_sw = syscon_node_to_regmap(args.np);
  987. of_node_put(args.np);
  988. dev_info(&instance->phy->dev, "type_sw - reg %#x, index %d\n",
  989. instance->type_sw_reg, instance->type_sw_index);
  990. return PTR_ERR_OR_ZERO(instance->type_sw);
  991. }
  992. static int phy_type_set(struct mtk_phy_instance *instance)
  993. {
  994. int type;
  995. u32 offset;
  996. if (!instance->type_sw)
  997. return 0;
  998. switch (instance->type) {
  999. case PHY_TYPE_USB3:
  1000. type = RG_PHY_SW_USB3;
  1001. break;
  1002. case PHY_TYPE_PCIE:
  1003. type = RG_PHY_SW_PCIE;
  1004. break;
  1005. case PHY_TYPE_SGMII:
  1006. type = RG_PHY_SW_SGMII;
  1007. break;
  1008. case PHY_TYPE_SATA:
  1009. type = RG_PHY_SW_SATA;
  1010. break;
  1011. case PHY_TYPE_USB2:
  1012. default:
  1013. return 0;
  1014. }
  1015. offset = instance->type_sw_index * BITS_PER_BYTE;
  1016. regmap_update_bits(instance->type_sw, instance->type_sw_reg,
  1017. RG_PHY_SW_TYPE << offset, type << offset);
  1018. return 0;
  1019. }
  1020. static int phy_efuse_get(struct mtk_tphy *tphy, struct mtk_phy_instance *instance)
  1021. {
  1022. struct device *dev = &instance->phy->dev;
  1023. int ret = 0;
  1024. /* tphy v1 doesn't support sw efuse, skip it */
  1025. if (!tphy->pdata->sw_efuse_supported) {
  1026. instance->efuse_sw_en = 0;
  1027. return 0;
  1028. }
  1029. /* software efuse is optional */
  1030. instance->efuse_sw_en = device_property_read_bool(dev, "nvmem-cells");
  1031. if (!instance->efuse_sw_en)
  1032. return 0;
  1033. switch (instance->type) {
  1034. case PHY_TYPE_USB2:
  1035. ret = nvmem_cell_read_variable_le_u32(dev, "intr", &instance->efuse_intr);
  1036. if (ret) {
  1037. dev_err(dev, "fail to get u2 intr efuse, %d\n", ret);
  1038. break;
  1039. }
  1040. /* no efuse, ignore it */
  1041. if (!instance->efuse_intr) {
  1042. dev_warn(dev, "no u2 intr efuse, but dts enable it\n");
  1043. instance->efuse_sw_en = 0;
  1044. break;
  1045. }
  1046. dev_dbg(dev, "u2 efuse - intr %x\n", instance->efuse_intr);
  1047. break;
  1048. case PHY_TYPE_USB3:
  1049. case PHY_TYPE_PCIE:
  1050. ret = nvmem_cell_read_variable_le_u32(dev, "intr", &instance->efuse_intr);
  1051. if (ret) {
  1052. dev_err(dev, "fail to get u3 intr efuse, %d\n", ret);
  1053. break;
  1054. }
  1055. ret = nvmem_cell_read_variable_le_u32(dev, "rx_imp", &instance->efuse_rx_imp);
  1056. if (ret) {
  1057. dev_err(dev, "fail to get u3 rx_imp efuse, %d\n", ret);
  1058. break;
  1059. }
  1060. ret = nvmem_cell_read_variable_le_u32(dev, "tx_imp", &instance->efuse_tx_imp);
  1061. if (ret) {
  1062. dev_err(dev, "fail to get u3 tx_imp efuse, %d\n", ret);
  1063. break;
  1064. }
  1065. /* no efuse, ignore it */
  1066. if (!instance->efuse_intr &&
  1067. !instance->efuse_rx_imp &&
  1068. !instance->efuse_tx_imp) {
  1069. dev_warn(dev, "no u3 intr efuse, but dts enable it\n");
  1070. instance->efuse_sw_en = 0;
  1071. break;
  1072. }
  1073. dev_dbg(dev, "u3 efuse - intr %x, rx_imp %x, tx_imp %x\n",
  1074. instance->efuse_intr, instance->efuse_rx_imp,instance->efuse_tx_imp);
  1075. break;
  1076. default:
  1077. dev_err(dev, "no sw efuse for type %d\n", instance->type);
  1078. ret = -EINVAL;
  1079. }
  1080. return ret;
  1081. }
  1082. static void phy_efuse_set(struct mtk_phy_instance *instance)
  1083. {
  1084. struct device *dev = &instance->phy->dev;
  1085. struct u2phy_banks *u2_banks = &instance->u2_banks;
  1086. struct u3phy_banks *u3_banks = &instance->u3_banks;
  1087. if (!instance->efuse_sw_en)
  1088. return;
  1089. switch (instance->type) {
  1090. case PHY_TYPE_USB2:
  1091. mtk_phy_set_bits(u2_banks->misc + U3P_MISC_REG1, MR1_EFUSE_AUTO_LOAD_DIS);
  1092. mtk_phy_update_field(u2_banks->com + U3P_USBPHYACR1, PA1_RG_INTR_CAL,
  1093. instance->efuse_intr);
  1094. break;
  1095. case PHY_TYPE_USB3:
  1096. case PHY_TYPE_PCIE:
  1097. mtk_phy_set_bits(u3_banks->phyd + U3P_U3_PHYD_RSV, P3D_RG_EFUSE_AUTO_LOAD_DIS);
  1098. mtk_phy_update_field(u3_banks->phyd + U3P_U3_PHYD_IMPCAL0, P3D_RG_TX_IMPEL,
  1099. instance->efuse_tx_imp);
  1100. mtk_phy_set_bits(u3_banks->phyd + U3P_U3_PHYD_IMPCAL0, P3D_RG_FORCE_TX_IMPEL);
  1101. mtk_phy_update_field(u3_banks->phyd + U3P_U3_PHYD_IMPCAL1, P3D_RG_RX_IMPEL,
  1102. instance->efuse_rx_imp);
  1103. mtk_phy_set_bits(u3_banks->phyd + U3P_U3_PHYD_IMPCAL1, P3D_RG_FORCE_RX_IMPEL);
  1104. mtk_phy_update_field(u3_banks->phya + U3P_U3_PHYA_REG0, P3A_RG_IEXT_INTR,
  1105. instance->efuse_intr);
  1106. break;
  1107. default:
  1108. dev_warn(dev, "no sw efuse for type %d\n", instance->type);
  1109. break;
  1110. }
  1111. }
  1112. static int mtk_phy_init(struct phy *phy)
  1113. {
  1114. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  1115. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  1116. int ret;
  1117. ret = clk_bulk_prepare_enable(TPHY_CLKS_CNT, instance->clks);
  1118. if (ret)
  1119. return ret;
  1120. phy_efuse_set(instance);
  1121. switch (instance->type) {
  1122. case PHY_TYPE_USB2:
  1123. u2_phy_instance_init(tphy, instance);
  1124. u2_phy_props_set(tphy, instance);
  1125. break;
  1126. case PHY_TYPE_USB3:
  1127. u3_phy_instance_init(tphy, instance);
  1128. break;
  1129. case PHY_TYPE_PCIE:
  1130. pcie_phy_instance_init(tphy, instance);
  1131. break;
  1132. case PHY_TYPE_SATA:
  1133. sata_phy_instance_init(tphy, instance);
  1134. break;
  1135. case PHY_TYPE_SGMII:
  1136. /* nothing to do, only used to set type */
  1137. break;
  1138. default:
  1139. dev_err(tphy->dev, "incompatible PHY type\n");
  1140. clk_bulk_disable_unprepare(TPHY_CLKS_CNT, instance->clks);
  1141. return -EINVAL;
  1142. }
  1143. return 0;
  1144. }
  1145. static int mtk_phy_power_on(struct phy *phy)
  1146. {
  1147. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  1148. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  1149. if (instance->type == PHY_TYPE_USB2) {
  1150. u2_phy_instance_power_on(tphy, instance);
  1151. hs_slew_rate_calibrate(tphy, instance);
  1152. } else if (instance->type == PHY_TYPE_PCIE) {
  1153. pcie_phy_instance_power_on(tphy, instance);
  1154. }
  1155. return 0;
  1156. }
  1157. static int mtk_phy_power_off(struct phy *phy)
  1158. {
  1159. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  1160. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  1161. if (instance->type == PHY_TYPE_USB2)
  1162. u2_phy_instance_power_off(tphy, instance);
  1163. else if (instance->type == PHY_TYPE_PCIE)
  1164. pcie_phy_instance_power_off(tphy, instance);
  1165. return 0;
  1166. }
  1167. static int mtk_phy_exit(struct phy *phy)
  1168. {
  1169. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  1170. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  1171. if (instance->type == PHY_TYPE_USB2)
  1172. u2_phy_instance_exit(tphy, instance);
  1173. clk_bulk_disable_unprepare(TPHY_CLKS_CNT, instance->clks);
  1174. return 0;
  1175. }
  1176. static int mtk_phy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
  1177. {
  1178. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  1179. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  1180. if (instance->type == PHY_TYPE_USB2)
  1181. u2_phy_instance_set_mode(tphy, instance, mode);
  1182. return 0;
  1183. }
  1184. static struct phy *mtk_phy_xlate(struct device *dev,
  1185. const struct of_phandle_args *args)
  1186. {
  1187. struct mtk_tphy *tphy = dev_get_drvdata(dev);
  1188. struct mtk_phy_instance *instance = NULL;
  1189. struct device_node *phy_np = args->np;
  1190. int index;
  1191. int ret;
  1192. if (args->args_count != 1) {
  1193. dev_err(dev, "invalid number of cells in 'phy' property\n");
  1194. return ERR_PTR(-EINVAL);
  1195. }
  1196. for (index = 0; index < tphy->nphys; index++)
  1197. if (phy_np == tphy->phys[index]->phy->dev.of_node) {
  1198. instance = tphy->phys[index];
  1199. break;
  1200. }
  1201. if (!instance) {
  1202. dev_err(dev, "failed to find appropriate phy\n");
  1203. return ERR_PTR(-EINVAL);
  1204. }
  1205. instance->type = args->args[0];
  1206. if (!(instance->type == PHY_TYPE_USB2 ||
  1207. instance->type == PHY_TYPE_USB3 ||
  1208. instance->type == PHY_TYPE_PCIE ||
  1209. instance->type == PHY_TYPE_SATA ||
  1210. instance->type == PHY_TYPE_SGMII)) {
  1211. dev_err(dev, "unsupported device type: %d\n", instance->type);
  1212. return ERR_PTR(-EINVAL);
  1213. }
  1214. switch (tphy->pdata->version) {
  1215. case MTK_PHY_V1:
  1216. phy_v1_banks_init(tphy, instance);
  1217. break;
  1218. case MTK_PHY_V2:
  1219. case MTK_PHY_V3:
  1220. phy_v2_banks_init(tphy, instance);
  1221. break;
  1222. default:
  1223. dev_err(dev, "phy version is not supported\n");
  1224. return ERR_PTR(-EINVAL);
  1225. }
  1226. ret = phy_efuse_get(tphy, instance);
  1227. if (ret)
  1228. return ERR_PTR(ret);
  1229. phy_parse_property(tphy, instance);
  1230. phy_type_set(instance);
  1231. phy_debugfs_init(instance);
  1232. return instance->phy;
  1233. }
  1234. static const struct phy_ops mtk_tphy_ops = {
  1235. .init = mtk_phy_init,
  1236. .exit = mtk_phy_exit,
  1237. .power_on = mtk_phy_power_on,
  1238. .power_off = mtk_phy_power_off,
  1239. .set_mode = mtk_phy_set_mode,
  1240. .owner = THIS_MODULE,
  1241. };
  1242. static const struct mtk_phy_pdata tphy_v1_pdata = {
  1243. .avoid_rx_sen_degradation = false,
  1244. .version = MTK_PHY_V1,
  1245. };
  1246. static const struct mtk_phy_pdata tphy_v2_pdata = {
  1247. .avoid_rx_sen_degradation = false,
  1248. .sw_efuse_supported = true,
  1249. .version = MTK_PHY_V2,
  1250. };
  1251. static const struct mtk_phy_pdata tphy_v3_pdata = {
  1252. .sw_efuse_supported = true,
  1253. .version = MTK_PHY_V3,
  1254. };
  1255. static const struct mtk_phy_pdata mt8173_pdata = {
  1256. .avoid_rx_sen_degradation = true,
  1257. .version = MTK_PHY_V1,
  1258. };
  1259. static const struct mtk_phy_pdata mt8195_pdata = {
  1260. .sw_pll_48m_to_26m = true,
  1261. .sw_efuse_supported = true,
  1262. .version = MTK_PHY_V3,
  1263. };
  1264. static const struct of_device_id mtk_tphy_id_table[] = {
  1265. { .compatible = "mediatek,mt2701-u3phy", .data = &tphy_v1_pdata },
  1266. { .compatible = "mediatek,mt2712-u3phy", .data = &tphy_v2_pdata },
  1267. { .compatible = "mediatek,mt8173-u3phy", .data = &mt8173_pdata },
  1268. { .compatible = "mediatek,mt8195-tphy", .data = &mt8195_pdata },
  1269. { .compatible = "mediatek,generic-tphy-v1", .data = &tphy_v1_pdata },
  1270. { .compatible = "mediatek,generic-tphy-v2", .data = &tphy_v2_pdata },
  1271. { .compatible = "mediatek,generic-tphy-v3", .data = &tphy_v3_pdata },
  1272. { },
  1273. };
  1274. MODULE_DEVICE_TABLE(of, mtk_tphy_id_table);
  1275. static int mtk_tphy_probe(struct platform_device *pdev)
  1276. {
  1277. struct device *dev = &pdev->dev;
  1278. struct device_node *np = dev->of_node;
  1279. struct phy_provider *provider;
  1280. struct resource *sif_res;
  1281. struct mtk_tphy *tphy;
  1282. struct resource res;
  1283. int port;
  1284. tphy = devm_kzalloc(dev, sizeof(*tphy), GFP_KERNEL);
  1285. if (!tphy)
  1286. return -ENOMEM;
  1287. tphy->pdata = of_device_get_match_data(dev);
  1288. if (!tphy->pdata)
  1289. return -EINVAL;
  1290. tphy->nphys = of_get_child_count(np);
  1291. tphy->phys = devm_kcalloc(dev, tphy->nphys,
  1292. sizeof(*tphy->phys), GFP_KERNEL);
  1293. if (!tphy->phys)
  1294. return -ENOMEM;
  1295. tphy->dev = dev;
  1296. platform_set_drvdata(pdev, tphy);
  1297. sif_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1298. /* SATA phy of V1 needn't it if not shared with PCIe or USB */
  1299. if (sif_res && tphy->pdata->version == MTK_PHY_V1) {
  1300. /* get banks shared by multiple phys */
  1301. tphy->sif_base = devm_ioremap_resource(dev, sif_res);
  1302. if (IS_ERR(tphy->sif_base)) {
  1303. dev_err(dev, "failed to remap sif regs\n");
  1304. return PTR_ERR(tphy->sif_base);
  1305. }
  1306. }
  1307. if (tphy->pdata->version < MTK_PHY_V3) {
  1308. tphy->src_ref_clk = U3P_REF_CLK;
  1309. tphy->src_coef = U3P_SLEW_RATE_COEF;
  1310. /* update parameters of slew rate calibrate if exist */
  1311. device_property_read_u32(dev, "mediatek,src-ref-clk-mhz",
  1312. &tphy->src_ref_clk);
  1313. device_property_read_u32(dev, "mediatek,src-coef",
  1314. &tphy->src_coef);
  1315. }
  1316. port = 0;
  1317. for_each_child_of_node_scoped(np, child_np) {
  1318. struct mtk_phy_instance *instance;
  1319. struct clk_bulk_data *clks;
  1320. struct device *subdev;
  1321. struct phy *phy;
  1322. int retval;
  1323. instance = devm_kzalloc(dev, sizeof(*instance), GFP_KERNEL);
  1324. if (!instance)
  1325. return -ENOMEM;
  1326. tphy->phys[port] = instance;
  1327. phy = devm_phy_create(dev, child_np, &mtk_tphy_ops);
  1328. if (IS_ERR(phy)) {
  1329. dev_err(dev, "failed to create phy\n");
  1330. return PTR_ERR(phy);
  1331. }
  1332. subdev = &phy->dev;
  1333. retval = of_address_to_resource(child_np, 0, &res);
  1334. if (retval) {
  1335. dev_err(subdev, "failed to get address resource(id-%d)\n",
  1336. port);
  1337. return retval;
  1338. }
  1339. instance->port_base = devm_ioremap_resource(subdev, &res);
  1340. if (IS_ERR(instance->port_base))
  1341. return PTR_ERR(instance->port_base);
  1342. instance->phy = phy;
  1343. instance->index = port;
  1344. phy_set_drvdata(phy, instance);
  1345. port++;
  1346. clks = instance->clks;
  1347. clks[0].id = "ref"; /* digital (& analog) clock */
  1348. clks[1].id = "da_ref"; /* analog clock */
  1349. retval = devm_clk_bulk_get_optional(subdev, TPHY_CLKS_CNT, clks);
  1350. if (retval)
  1351. return retval;
  1352. retval = phy_type_syscon_get(instance, child_np);
  1353. if (retval)
  1354. return retval;
  1355. }
  1356. provider = devm_of_phy_provider_register(dev, mtk_phy_xlate);
  1357. return PTR_ERR_OR_ZERO(provider);
  1358. }
  1359. static struct platform_driver mtk_tphy_driver = {
  1360. .probe = mtk_tphy_probe,
  1361. .driver = {
  1362. .name = "mtk-tphy",
  1363. .of_match_table = mtk_tphy_id_table,
  1364. },
  1365. };
  1366. module_platform_driver(mtk_tphy_driver);
  1367. MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun@mediatek.com>");
  1368. MODULE_DESCRIPTION("MediaTek T-PHY driver");
  1369. MODULE_LICENSE("GPL v2");