phy-mtk-tphy.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  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/delay.h>
  10. #include <linux/io.h>
  11. #include <linux/iopoll.h>
  12. #include <linux/module.h>
  13. #include <linux/of_address.h>
  14. #include <linux/of_device.h>
  15. #include <linux/phy/phy.h>
  16. #include <linux/platform_device.h>
  17. /* version V1 sub-banks offset base address */
  18. /* banks shared by multiple phys */
  19. #define SSUSB_SIFSLV_V1_SPLLC 0x000 /* shared by u3 phys */
  20. #define SSUSB_SIFSLV_V1_U2FREQ 0x100 /* shared by u2 phys */
  21. #define SSUSB_SIFSLV_V1_CHIP 0x300 /* shared by u3 phys */
  22. /* u2 phy bank */
  23. #define SSUSB_SIFSLV_V1_U2PHY_COM 0x000
  24. /* u3/pcie/sata phy banks */
  25. #define SSUSB_SIFSLV_V1_U3PHYD 0x000
  26. #define SSUSB_SIFSLV_V1_U3PHYA 0x200
  27. /* version V2 sub-banks offset base address */
  28. /* u2 phy banks */
  29. #define SSUSB_SIFSLV_V2_MISC 0x000
  30. #define SSUSB_SIFSLV_V2_U2FREQ 0x100
  31. #define SSUSB_SIFSLV_V2_U2PHY_COM 0x300
  32. /* u3/pcie/sata phy banks */
  33. #define SSUSB_SIFSLV_V2_SPLLC 0x000
  34. #define SSUSB_SIFSLV_V2_CHIP 0x100
  35. #define SSUSB_SIFSLV_V2_U3PHYD 0x200
  36. #define SSUSB_SIFSLV_V2_U3PHYA 0x400
  37. #define U3P_USBPHYACR0 0x000
  38. #define PA0_RG_U2PLL_FORCE_ON BIT(15)
  39. #define PA0_RG_USB20_INTR_EN BIT(5)
  40. #define U3P_USBPHYACR1 0x004
  41. #define PA1_RG_VRT_SEL GENMASK(14, 12)
  42. #define PA1_RG_VRT_SEL_VAL(x) ((0x7 & (x)) << 12)
  43. #define PA1_RG_TERM_SEL GENMASK(10, 8)
  44. #define PA1_RG_TERM_SEL_VAL(x) ((0x7 & (x)) << 8)
  45. #define U3P_USBPHYACR2 0x008
  46. #define PA2_RG_SIF_U2PLL_FORCE_EN BIT(18)
  47. #define U3P_USBPHYACR5 0x014
  48. #define PA5_RG_U2_HSTX_SRCAL_EN BIT(15)
  49. #define PA5_RG_U2_HSTX_SRCTRL GENMASK(14, 12)
  50. #define PA5_RG_U2_HSTX_SRCTRL_VAL(x) ((0x7 & (x)) << 12)
  51. #define PA5_RG_U2_HS_100U_U3_EN BIT(11)
  52. #define U3P_USBPHYACR6 0x018
  53. #define PA6_RG_U2_BC11_SW_EN BIT(23)
  54. #define PA6_RG_U2_OTG_VBUSCMP_EN BIT(20)
  55. #define PA6_RG_U2_SQTH GENMASK(3, 0)
  56. #define PA6_RG_U2_SQTH_VAL(x) (0xf & (x))
  57. #define U3P_U2PHYACR4 0x020
  58. #define P2C_RG_USB20_GPIO_CTL BIT(9)
  59. #define P2C_USB20_GPIO_MODE BIT(8)
  60. #define P2C_U2_GPIO_CTR_MSK (P2C_RG_USB20_GPIO_CTL | P2C_USB20_GPIO_MODE)
  61. #define U3D_U2PHYDCR0 0x060
  62. #define P2C_RG_SIF_U2PLL_FORCE_ON BIT(24)
  63. #define U3P_U2PHYDTM0 0x068
  64. #define P2C_FORCE_UART_EN BIT(26)
  65. #define P2C_FORCE_DATAIN BIT(23)
  66. #define P2C_FORCE_DM_PULLDOWN BIT(21)
  67. #define P2C_FORCE_DP_PULLDOWN BIT(20)
  68. #define P2C_FORCE_XCVRSEL BIT(19)
  69. #define P2C_FORCE_SUSPENDM BIT(18)
  70. #define P2C_FORCE_TERMSEL BIT(17)
  71. #define P2C_RG_DATAIN GENMASK(13, 10)
  72. #define P2C_RG_DATAIN_VAL(x) ((0xf & (x)) << 10)
  73. #define P2C_RG_DMPULLDOWN BIT(7)
  74. #define P2C_RG_DPPULLDOWN BIT(6)
  75. #define P2C_RG_XCVRSEL GENMASK(5, 4)
  76. #define P2C_RG_XCVRSEL_VAL(x) ((0x3 & (x)) << 4)
  77. #define P2C_RG_SUSPENDM BIT(3)
  78. #define P2C_RG_TERMSEL BIT(2)
  79. #define P2C_DTM0_PART_MASK \
  80. (P2C_FORCE_DATAIN | P2C_FORCE_DM_PULLDOWN | \
  81. P2C_FORCE_DP_PULLDOWN | P2C_FORCE_XCVRSEL | \
  82. P2C_FORCE_TERMSEL | P2C_RG_DMPULLDOWN | \
  83. P2C_RG_DPPULLDOWN | P2C_RG_TERMSEL)
  84. #define U3P_U2PHYDTM1 0x06C
  85. #define P2C_RG_UART_EN BIT(16)
  86. #define P2C_FORCE_IDDIG BIT(9)
  87. #define P2C_RG_VBUSVALID BIT(5)
  88. #define P2C_RG_SESSEND BIT(4)
  89. #define P2C_RG_AVALID BIT(2)
  90. #define P2C_RG_IDDIG BIT(1)
  91. #define U3P_U3_CHIP_GPIO_CTLD 0x0c
  92. #define P3C_REG_IP_SW_RST BIT(31)
  93. #define P3C_MCU_BUS_CK_GATE_EN BIT(30)
  94. #define P3C_FORCE_IP_SW_RST BIT(29)
  95. #define U3P_U3_CHIP_GPIO_CTLE 0x10
  96. #define P3C_RG_SWRST_U3_PHYD BIT(25)
  97. #define P3C_RG_SWRST_U3_PHYD_FORCE_EN BIT(24)
  98. #define U3P_U3_PHYA_REG0 0x000
  99. #define P3A_RG_CLKDRV_OFF GENMASK(3, 2)
  100. #define P3A_RG_CLKDRV_OFF_VAL(x) ((0x3 & (x)) << 2)
  101. #define U3P_U3_PHYA_REG1 0x004
  102. #define P3A_RG_CLKDRV_AMP GENMASK(31, 29)
  103. #define P3A_RG_CLKDRV_AMP_VAL(x) ((0x7 & (x)) << 29)
  104. #define U3P_U3_PHYA_REG6 0x018
  105. #define P3A_RG_TX_EIDLE_CM GENMASK(31, 28)
  106. #define P3A_RG_TX_EIDLE_CM_VAL(x) ((0xf & (x)) << 28)
  107. #define U3P_U3_PHYA_REG9 0x024
  108. #define P3A_RG_RX_DAC_MUX GENMASK(5, 1)
  109. #define P3A_RG_RX_DAC_MUX_VAL(x) ((0x1f & (x)) << 1)
  110. #define U3P_U3_PHYA_DA_REG0 0x100
  111. #define P3A_RG_XTAL_EXT_PE2H GENMASK(17, 16)
  112. #define P3A_RG_XTAL_EXT_PE2H_VAL(x) ((0x3 & (x)) << 16)
  113. #define P3A_RG_XTAL_EXT_PE1H GENMASK(13, 12)
  114. #define P3A_RG_XTAL_EXT_PE1H_VAL(x) ((0x3 & (x)) << 12)
  115. #define P3A_RG_XTAL_EXT_EN_U3 GENMASK(11, 10)
  116. #define P3A_RG_XTAL_EXT_EN_U3_VAL(x) ((0x3 & (x)) << 10)
  117. #define U3P_U3_PHYA_DA_REG4 0x108
  118. #define P3A_RG_PLL_DIVEN_PE2H GENMASK(21, 19)
  119. #define P3A_RG_PLL_BC_PE2H GENMASK(7, 6)
  120. #define P3A_RG_PLL_BC_PE2H_VAL(x) ((0x3 & (x)) << 6)
  121. #define U3P_U3_PHYA_DA_REG5 0x10c
  122. #define P3A_RG_PLL_BR_PE2H GENMASK(29, 28)
  123. #define P3A_RG_PLL_BR_PE2H_VAL(x) ((0x3 & (x)) << 28)
  124. #define P3A_RG_PLL_IC_PE2H GENMASK(15, 12)
  125. #define P3A_RG_PLL_IC_PE2H_VAL(x) ((0xf & (x)) << 12)
  126. #define U3P_U3_PHYA_DA_REG6 0x110
  127. #define P3A_RG_PLL_IR_PE2H GENMASK(19, 16)
  128. #define P3A_RG_PLL_IR_PE2H_VAL(x) ((0xf & (x)) << 16)
  129. #define U3P_U3_PHYA_DA_REG7 0x114
  130. #define P3A_RG_PLL_BP_PE2H GENMASK(19, 16)
  131. #define P3A_RG_PLL_BP_PE2H_VAL(x) ((0xf & (x)) << 16)
  132. #define U3P_U3_PHYA_DA_REG20 0x13c
  133. #define P3A_RG_PLL_DELTA1_PE2H GENMASK(31, 16)
  134. #define P3A_RG_PLL_DELTA1_PE2H_VAL(x) ((0xffff & (x)) << 16)
  135. #define U3P_U3_PHYA_DA_REG25 0x148
  136. #define P3A_RG_PLL_DELTA_PE2H GENMASK(15, 0)
  137. #define P3A_RG_PLL_DELTA_PE2H_VAL(x) (0xffff & (x))
  138. #define U3P_U3_PHYD_LFPS1 0x00c
  139. #define P3D_RG_FWAKE_TH GENMASK(21, 16)
  140. #define P3D_RG_FWAKE_TH_VAL(x) ((0x3f & (x)) << 16)
  141. #define U3P_U3_PHYD_CDR1 0x05c
  142. #define P3D_RG_CDR_BIR_LTD1 GENMASK(28, 24)
  143. #define P3D_RG_CDR_BIR_LTD1_VAL(x) ((0x1f & (x)) << 24)
  144. #define P3D_RG_CDR_BIR_LTD0 GENMASK(12, 8)
  145. #define P3D_RG_CDR_BIR_LTD0_VAL(x) ((0x1f & (x)) << 8)
  146. #define U3P_U3_PHYD_RXDET1 0x128
  147. #define P3D_RG_RXDET_STB2_SET GENMASK(17, 9)
  148. #define P3D_RG_RXDET_STB2_SET_VAL(x) ((0x1ff & (x)) << 9)
  149. #define U3P_U3_PHYD_RXDET2 0x12c
  150. #define P3D_RG_RXDET_STB2_SET_P3 GENMASK(8, 0)
  151. #define P3D_RG_RXDET_STB2_SET_P3_VAL(x) (0x1ff & (x))
  152. #define U3P_SPLLC_XTALCTL3 0x018
  153. #define XC3_RG_U3_XTAL_RX_PWD BIT(9)
  154. #define XC3_RG_U3_FRC_XTAL_RX_PWD BIT(8)
  155. #define U3P_U2FREQ_FMCR0 0x00
  156. #define P2F_RG_MONCLK_SEL GENMASK(27, 26)
  157. #define P2F_RG_MONCLK_SEL_VAL(x) ((0x3 & (x)) << 26)
  158. #define P2F_RG_FREQDET_EN BIT(24)
  159. #define P2F_RG_CYCLECNT GENMASK(23, 0)
  160. #define P2F_RG_CYCLECNT_VAL(x) ((P2F_RG_CYCLECNT) & (x))
  161. #define U3P_U2FREQ_VALUE 0x0c
  162. #define U3P_U2FREQ_FMMONR1 0x10
  163. #define P2F_USB_FM_VALID BIT(0)
  164. #define P2F_RG_FRCK_EN BIT(8)
  165. #define U3P_REF_CLK 26 /* MHZ */
  166. #define U3P_SLEW_RATE_COEF 28
  167. #define U3P_SR_COEF_DIVISOR 1000
  168. #define U3P_FM_DET_CYCLE_CNT 1024
  169. /* SATA register setting */
  170. #define PHYD_CTRL_SIGNAL_MODE4 0x1c
  171. /* CDR Charge Pump P-path current adjustment */
  172. #define RG_CDR_BICLTD1_GEN1_MSK GENMASK(23, 20)
  173. #define RG_CDR_BICLTD1_GEN1_VAL(x) ((0xf & (x)) << 20)
  174. #define RG_CDR_BICLTD0_GEN1_MSK GENMASK(11, 8)
  175. #define RG_CDR_BICLTD0_GEN1_VAL(x) ((0xf & (x)) << 8)
  176. #define PHYD_DESIGN_OPTION2 0x24
  177. /* Symbol lock count selection */
  178. #define RG_LOCK_CNT_SEL_MSK GENMASK(5, 4)
  179. #define RG_LOCK_CNT_SEL_VAL(x) ((0x3 & (x)) << 4)
  180. #define PHYD_DESIGN_OPTION9 0x40
  181. /* COMWAK GAP width window */
  182. #define RG_TG_MAX_MSK GENMASK(20, 16)
  183. #define RG_TG_MAX_VAL(x) ((0x1f & (x)) << 16)
  184. /* COMINIT GAP width window */
  185. #define RG_T2_MAX_MSK GENMASK(13, 8)
  186. #define RG_T2_MAX_VAL(x) ((0x3f & (x)) << 8)
  187. /* COMWAK GAP width window */
  188. #define RG_TG_MIN_MSK GENMASK(7, 5)
  189. #define RG_TG_MIN_VAL(x) ((0x7 & (x)) << 5)
  190. /* COMINIT GAP width window */
  191. #define RG_T2_MIN_MSK GENMASK(4, 0)
  192. #define RG_T2_MIN_VAL(x) (0x1f & (x))
  193. #define ANA_RG_CTRL_SIGNAL1 0x4c
  194. /* TX driver tail current control for 0dB de-empahsis mdoe for Gen1 speed */
  195. #define RG_IDRV_0DB_GEN1_MSK GENMASK(13, 8)
  196. #define RG_IDRV_0DB_GEN1_VAL(x) ((0x3f & (x)) << 8)
  197. #define ANA_RG_CTRL_SIGNAL4 0x58
  198. #define RG_CDR_BICLTR_GEN1_MSK GENMASK(23, 20)
  199. #define RG_CDR_BICLTR_GEN1_VAL(x) ((0xf & (x)) << 20)
  200. /* Loop filter R1 resistance adjustment for Gen1 speed */
  201. #define RG_CDR_BR_GEN2_MSK GENMASK(10, 8)
  202. #define RG_CDR_BR_GEN2_VAL(x) ((0x7 & (x)) << 8)
  203. #define ANA_RG_CTRL_SIGNAL6 0x60
  204. /* I-path capacitance adjustment for Gen1 */
  205. #define RG_CDR_BC_GEN1_MSK GENMASK(28, 24)
  206. #define RG_CDR_BC_GEN1_VAL(x) ((0x1f & (x)) << 24)
  207. #define RG_CDR_BIRLTR_GEN1_MSK GENMASK(4, 0)
  208. #define RG_CDR_BIRLTR_GEN1_VAL(x) (0x1f & (x))
  209. #define ANA_EQ_EYE_CTRL_SIGNAL1 0x6c
  210. /* RX Gen1 LEQ tuning step */
  211. #define RG_EQ_DLEQ_LFI_GEN1_MSK GENMASK(11, 8)
  212. #define RG_EQ_DLEQ_LFI_GEN1_VAL(x) ((0xf & (x)) << 8)
  213. #define ANA_EQ_EYE_CTRL_SIGNAL4 0xd8
  214. #define RG_CDR_BIRLTD0_GEN1_MSK GENMASK(20, 16)
  215. #define RG_CDR_BIRLTD0_GEN1_VAL(x) ((0x1f & (x)) << 16)
  216. #define ANA_EQ_EYE_CTRL_SIGNAL5 0xdc
  217. #define RG_CDR_BIRLTD0_GEN3_MSK GENMASK(4, 0)
  218. #define RG_CDR_BIRLTD0_GEN3_VAL(x) (0x1f & (x))
  219. enum mtk_phy_version {
  220. MTK_PHY_V1 = 1,
  221. MTK_PHY_V2,
  222. };
  223. struct mtk_phy_pdata {
  224. /* avoid RX sensitivity level degradation only for mt8173 */
  225. bool avoid_rx_sen_degradation;
  226. enum mtk_phy_version version;
  227. };
  228. struct u2phy_banks {
  229. void __iomem *misc;
  230. void __iomem *fmreg;
  231. void __iomem *com;
  232. };
  233. struct u3phy_banks {
  234. void __iomem *spllc;
  235. void __iomem *chip;
  236. void __iomem *phyd; /* include u3phyd_bank2 */
  237. void __iomem *phya; /* include u3phya_da */
  238. };
  239. struct mtk_phy_instance {
  240. struct phy *phy;
  241. void __iomem *port_base;
  242. union {
  243. struct u2phy_banks u2_banks;
  244. struct u3phy_banks u3_banks;
  245. };
  246. struct clk *ref_clk; /* reference clock of anolog phy */
  247. u32 index;
  248. u8 type;
  249. int eye_src;
  250. int eye_vrt;
  251. int eye_term;
  252. };
  253. struct mtk_tphy {
  254. struct device *dev;
  255. void __iomem *sif_base; /* only shared sif */
  256. /* deprecated, use @ref_clk instead in phy instance */
  257. struct clk *u3phya_ref; /* reference clock of usb3 anolog phy */
  258. const struct mtk_phy_pdata *pdata;
  259. struct mtk_phy_instance **phys;
  260. int nphys;
  261. int src_ref_clk; /* MHZ, reference clock for slew rate calibrate */
  262. int src_coef; /* coefficient for slew rate calibrate */
  263. };
  264. static void hs_slew_rate_calibrate(struct mtk_tphy *tphy,
  265. struct mtk_phy_instance *instance)
  266. {
  267. struct u2phy_banks *u2_banks = &instance->u2_banks;
  268. void __iomem *fmreg = u2_banks->fmreg;
  269. void __iomem *com = u2_banks->com;
  270. int calibration_val;
  271. int fm_out;
  272. u32 tmp;
  273. /* use force value */
  274. if (instance->eye_src)
  275. return;
  276. /* enable USB ring oscillator */
  277. tmp = readl(com + U3P_USBPHYACR5);
  278. tmp |= PA5_RG_U2_HSTX_SRCAL_EN;
  279. writel(tmp, com + U3P_USBPHYACR5);
  280. udelay(1);
  281. /*enable free run clock */
  282. tmp = readl(fmreg + U3P_U2FREQ_FMMONR1);
  283. tmp |= P2F_RG_FRCK_EN;
  284. writel(tmp, fmreg + U3P_U2FREQ_FMMONR1);
  285. /* set cycle count as 1024, and select u2 channel */
  286. tmp = readl(fmreg + U3P_U2FREQ_FMCR0);
  287. tmp &= ~(P2F_RG_CYCLECNT | P2F_RG_MONCLK_SEL);
  288. tmp |= P2F_RG_CYCLECNT_VAL(U3P_FM_DET_CYCLE_CNT);
  289. if (tphy->pdata->version == MTK_PHY_V1)
  290. tmp |= P2F_RG_MONCLK_SEL_VAL(instance->index >> 1);
  291. writel(tmp, fmreg + U3P_U2FREQ_FMCR0);
  292. /* enable frequency meter */
  293. tmp = readl(fmreg + U3P_U2FREQ_FMCR0);
  294. tmp |= P2F_RG_FREQDET_EN;
  295. writel(tmp, fmreg + U3P_U2FREQ_FMCR0);
  296. /* ignore return value */
  297. readl_poll_timeout(fmreg + U3P_U2FREQ_FMMONR1, tmp,
  298. (tmp & P2F_USB_FM_VALID), 10, 200);
  299. fm_out = readl(fmreg + U3P_U2FREQ_VALUE);
  300. /* disable frequency meter */
  301. tmp = readl(fmreg + U3P_U2FREQ_FMCR0);
  302. tmp &= ~P2F_RG_FREQDET_EN;
  303. writel(tmp, fmreg + U3P_U2FREQ_FMCR0);
  304. /*disable free run clock */
  305. tmp = readl(fmreg + U3P_U2FREQ_FMMONR1);
  306. tmp &= ~P2F_RG_FRCK_EN;
  307. writel(tmp, fmreg + U3P_U2FREQ_FMMONR1);
  308. if (fm_out) {
  309. /* ( 1024 / FM_OUT ) x reference clock frequency x coef */
  310. tmp = tphy->src_ref_clk * tphy->src_coef;
  311. tmp = (tmp * U3P_FM_DET_CYCLE_CNT) / fm_out;
  312. calibration_val = DIV_ROUND_CLOSEST(tmp, U3P_SR_COEF_DIVISOR);
  313. } else {
  314. /* if FM detection fail, set default value */
  315. calibration_val = 4;
  316. }
  317. dev_dbg(tphy->dev, "phy:%d, fm_out:%d, calib:%d (clk:%d, coef:%d)\n",
  318. instance->index, fm_out, calibration_val,
  319. tphy->src_ref_clk, tphy->src_coef);
  320. /* set HS slew rate */
  321. tmp = readl(com + U3P_USBPHYACR5);
  322. tmp &= ~PA5_RG_U2_HSTX_SRCTRL;
  323. tmp |= PA5_RG_U2_HSTX_SRCTRL_VAL(calibration_val);
  324. writel(tmp, com + U3P_USBPHYACR5);
  325. /* disable USB ring oscillator */
  326. tmp = readl(com + U3P_USBPHYACR5);
  327. tmp &= ~PA5_RG_U2_HSTX_SRCAL_EN;
  328. writel(tmp, com + U3P_USBPHYACR5);
  329. }
  330. static void u3_phy_instance_init(struct mtk_tphy *tphy,
  331. struct mtk_phy_instance *instance)
  332. {
  333. struct u3phy_banks *u3_banks = &instance->u3_banks;
  334. u32 tmp;
  335. /* gating PCIe Analog XTAL clock */
  336. tmp = readl(u3_banks->spllc + U3P_SPLLC_XTALCTL3);
  337. tmp |= XC3_RG_U3_XTAL_RX_PWD | XC3_RG_U3_FRC_XTAL_RX_PWD;
  338. writel(tmp, u3_banks->spllc + U3P_SPLLC_XTALCTL3);
  339. /* gating XSQ */
  340. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG0);
  341. tmp &= ~P3A_RG_XTAL_EXT_EN_U3;
  342. tmp |= P3A_RG_XTAL_EXT_EN_U3_VAL(2);
  343. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG0);
  344. tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG9);
  345. tmp &= ~P3A_RG_RX_DAC_MUX;
  346. tmp |= P3A_RG_RX_DAC_MUX_VAL(4);
  347. writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG9);
  348. tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG6);
  349. tmp &= ~P3A_RG_TX_EIDLE_CM;
  350. tmp |= P3A_RG_TX_EIDLE_CM_VAL(0xe);
  351. writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG6);
  352. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_CDR1);
  353. tmp &= ~(P3D_RG_CDR_BIR_LTD0 | P3D_RG_CDR_BIR_LTD1);
  354. tmp |= P3D_RG_CDR_BIR_LTD0_VAL(0xc) | P3D_RG_CDR_BIR_LTD1_VAL(0x3);
  355. writel(tmp, u3_banks->phyd + U3P_U3_PHYD_CDR1);
  356. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_LFPS1);
  357. tmp &= ~P3D_RG_FWAKE_TH;
  358. tmp |= P3D_RG_FWAKE_TH_VAL(0x34);
  359. writel(tmp, u3_banks->phyd + U3P_U3_PHYD_LFPS1);
  360. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET1);
  361. tmp &= ~P3D_RG_RXDET_STB2_SET;
  362. tmp |= P3D_RG_RXDET_STB2_SET_VAL(0x10);
  363. writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET1);
  364. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET2);
  365. tmp &= ~P3D_RG_RXDET_STB2_SET_P3;
  366. tmp |= P3D_RG_RXDET_STB2_SET_P3_VAL(0x10);
  367. writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET2);
  368. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  369. }
  370. static void u2_phy_instance_init(struct mtk_tphy *tphy,
  371. struct mtk_phy_instance *instance)
  372. {
  373. struct u2phy_banks *u2_banks = &instance->u2_banks;
  374. void __iomem *com = u2_banks->com;
  375. u32 index = instance->index;
  376. u32 tmp;
  377. /* switch to USB function, and enable usb pll */
  378. tmp = readl(com + U3P_U2PHYDTM0);
  379. tmp &= ~(P2C_FORCE_UART_EN | P2C_FORCE_SUSPENDM);
  380. tmp |= P2C_RG_XCVRSEL_VAL(1) | P2C_RG_DATAIN_VAL(0);
  381. writel(tmp, com + U3P_U2PHYDTM0);
  382. tmp = readl(com + U3P_U2PHYDTM1);
  383. tmp &= ~P2C_RG_UART_EN;
  384. writel(tmp, com + U3P_U2PHYDTM1);
  385. tmp = readl(com + U3P_USBPHYACR0);
  386. tmp |= PA0_RG_USB20_INTR_EN;
  387. writel(tmp, com + U3P_USBPHYACR0);
  388. /* disable switch 100uA current to SSUSB */
  389. tmp = readl(com + U3P_USBPHYACR5);
  390. tmp &= ~PA5_RG_U2_HS_100U_U3_EN;
  391. writel(tmp, com + U3P_USBPHYACR5);
  392. if (!index) {
  393. tmp = readl(com + U3P_U2PHYACR4);
  394. tmp &= ~P2C_U2_GPIO_CTR_MSK;
  395. writel(tmp, com + U3P_U2PHYACR4);
  396. }
  397. if (tphy->pdata->avoid_rx_sen_degradation) {
  398. if (!index) {
  399. tmp = readl(com + U3P_USBPHYACR2);
  400. tmp |= PA2_RG_SIF_U2PLL_FORCE_EN;
  401. writel(tmp, com + U3P_USBPHYACR2);
  402. tmp = readl(com + U3D_U2PHYDCR0);
  403. tmp &= ~P2C_RG_SIF_U2PLL_FORCE_ON;
  404. writel(tmp, com + U3D_U2PHYDCR0);
  405. } else {
  406. tmp = readl(com + U3D_U2PHYDCR0);
  407. tmp |= P2C_RG_SIF_U2PLL_FORCE_ON;
  408. writel(tmp, com + U3D_U2PHYDCR0);
  409. tmp = readl(com + U3P_U2PHYDTM0);
  410. tmp |= P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM;
  411. writel(tmp, com + U3P_U2PHYDTM0);
  412. }
  413. }
  414. tmp = readl(com + U3P_USBPHYACR6);
  415. tmp &= ~PA6_RG_U2_BC11_SW_EN; /* DP/DM BC1.1 path Disable */
  416. tmp &= ~PA6_RG_U2_SQTH;
  417. tmp |= PA6_RG_U2_SQTH_VAL(2);
  418. writel(tmp, com + U3P_USBPHYACR6);
  419. dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
  420. }
  421. static void u2_phy_instance_power_on(struct mtk_tphy *tphy,
  422. struct mtk_phy_instance *instance)
  423. {
  424. struct u2phy_banks *u2_banks = &instance->u2_banks;
  425. void __iomem *com = u2_banks->com;
  426. u32 index = instance->index;
  427. u32 tmp;
  428. tmp = readl(com + U3P_U2PHYDTM0);
  429. tmp &= ~(P2C_RG_XCVRSEL | P2C_RG_DATAIN | P2C_DTM0_PART_MASK);
  430. writel(tmp, com + U3P_U2PHYDTM0);
  431. /* OTG Enable */
  432. tmp = readl(com + U3P_USBPHYACR6);
  433. tmp |= PA6_RG_U2_OTG_VBUSCMP_EN;
  434. writel(tmp, com + U3P_USBPHYACR6);
  435. tmp = readl(com + U3P_U2PHYDTM1);
  436. tmp |= P2C_RG_VBUSVALID | P2C_RG_AVALID;
  437. tmp &= ~P2C_RG_SESSEND;
  438. writel(tmp, com + U3P_U2PHYDTM1);
  439. if (tphy->pdata->avoid_rx_sen_degradation && index) {
  440. tmp = readl(com + U3D_U2PHYDCR0);
  441. tmp |= P2C_RG_SIF_U2PLL_FORCE_ON;
  442. writel(tmp, com + U3D_U2PHYDCR0);
  443. tmp = readl(com + U3P_U2PHYDTM0);
  444. tmp |= P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM;
  445. writel(tmp, com + U3P_U2PHYDTM0);
  446. }
  447. dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
  448. }
  449. static void u2_phy_instance_power_off(struct mtk_tphy *tphy,
  450. struct mtk_phy_instance *instance)
  451. {
  452. struct u2phy_banks *u2_banks = &instance->u2_banks;
  453. void __iomem *com = u2_banks->com;
  454. u32 index = instance->index;
  455. u32 tmp;
  456. tmp = readl(com + U3P_U2PHYDTM0);
  457. tmp &= ~(P2C_RG_XCVRSEL | P2C_RG_DATAIN);
  458. writel(tmp, com + U3P_U2PHYDTM0);
  459. /* OTG Disable */
  460. tmp = readl(com + U3P_USBPHYACR6);
  461. tmp &= ~PA6_RG_U2_OTG_VBUSCMP_EN;
  462. writel(tmp, com + U3P_USBPHYACR6);
  463. tmp = readl(com + U3P_U2PHYDTM1);
  464. tmp &= ~(P2C_RG_VBUSVALID | P2C_RG_AVALID);
  465. tmp |= P2C_RG_SESSEND;
  466. writel(tmp, com + U3P_U2PHYDTM1);
  467. if (tphy->pdata->avoid_rx_sen_degradation && index) {
  468. tmp = readl(com + U3P_U2PHYDTM0);
  469. tmp &= ~(P2C_RG_SUSPENDM | P2C_FORCE_SUSPENDM);
  470. writel(tmp, com + U3P_U2PHYDTM0);
  471. tmp = readl(com + U3D_U2PHYDCR0);
  472. tmp &= ~P2C_RG_SIF_U2PLL_FORCE_ON;
  473. writel(tmp, com + U3D_U2PHYDCR0);
  474. }
  475. dev_dbg(tphy->dev, "%s(%d)\n", __func__, index);
  476. }
  477. static void u2_phy_instance_exit(struct mtk_tphy *tphy,
  478. struct mtk_phy_instance *instance)
  479. {
  480. struct u2phy_banks *u2_banks = &instance->u2_banks;
  481. void __iomem *com = u2_banks->com;
  482. u32 index = instance->index;
  483. u32 tmp;
  484. if (tphy->pdata->avoid_rx_sen_degradation && index) {
  485. tmp = readl(com + U3D_U2PHYDCR0);
  486. tmp &= ~P2C_RG_SIF_U2PLL_FORCE_ON;
  487. writel(tmp, com + U3D_U2PHYDCR0);
  488. tmp = readl(com + U3P_U2PHYDTM0);
  489. tmp &= ~P2C_FORCE_SUSPENDM;
  490. writel(tmp, com + U3P_U2PHYDTM0);
  491. }
  492. }
  493. static void u2_phy_instance_set_mode(struct mtk_tphy *tphy,
  494. struct mtk_phy_instance *instance,
  495. enum phy_mode mode)
  496. {
  497. struct u2phy_banks *u2_banks = &instance->u2_banks;
  498. u32 tmp;
  499. tmp = readl(u2_banks->com + U3P_U2PHYDTM1);
  500. switch (mode) {
  501. case PHY_MODE_USB_DEVICE:
  502. tmp |= P2C_FORCE_IDDIG | P2C_RG_IDDIG;
  503. break;
  504. case PHY_MODE_USB_HOST:
  505. tmp |= P2C_FORCE_IDDIG;
  506. tmp &= ~P2C_RG_IDDIG;
  507. break;
  508. case PHY_MODE_USB_OTG:
  509. tmp &= ~(P2C_FORCE_IDDIG | P2C_RG_IDDIG);
  510. break;
  511. default:
  512. return;
  513. }
  514. writel(tmp, u2_banks->com + U3P_U2PHYDTM1);
  515. }
  516. static void pcie_phy_instance_init(struct mtk_tphy *tphy,
  517. struct mtk_phy_instance *instance)
  518. {
  519. struct u3phy_banks *u3_banks = &instance->u3_banks;
  520. u32 tmp;
  521. if (tphy->pdata->version != MTK_PHY_V1)
  522. return;
  523. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG0);
  524. tmp &= ~(P3A_RG_XTAL_EXT_PE1H | P3A_RG_XTAL_EXT_PE2H);
  525. tmp |= P3A_RG_XTAL_EXT_PE1H_VAL(0x2) | P3A_RG_XTAL_EXT_PE2H_VAL(0x2);
  526. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG0);
  527. /* ref clk drive */
  528. tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG1);
  529. tmp &= ~P3A_RG_CLKDRV_AMP;
  530. tmp |= P3A_RG_CLKDRV_AMP_VAL(0x4);
  531. writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG1);
  532. tmp = readl(u3_banks->phya + U3P_U3_PHYA_REG0);
  533. tmp &= ~P3A_RG_CLKDRV_OFF;
  534. tmp |= P3A_RG_CLKDRV_OFF_VAL(0x1);
  535. writel(tmp, u3_banks->phya + U3P_U3_PHYA_REG0);
  536. /* SSC delta -5000ppm */
  537. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG20);
  538. tmp &= ~P3A_RG_PLL_DELTA1_PE2H;
  539. tmp |= P3A_RG_PLL_DELTA1_PE2H_VAL(0x3c);
  540. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG20);
  541. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG25);
  542. tmp &= ~P3A_RG_PLL_DELTA_PE2H;
  543. tmp |= P3A_RG_PLL_DELTA_PE2H_VAL(0x36);
  544. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG25);
  545. /* change pll BW 0.6M */
  546. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG5);
  547. tmp &= ~(P3A_RG_PLL_BR_PE2H | P3A_RG_PLL_IC_PE2H);
  548. tmp |= P3A_RG_PLL_BR_PE2H_VAL(0x1) | P3A_RG_PLL_IC_PE2H_VAL(0x1);
  549. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG5);
  550. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG4);
  551. tmp &= ~(P3A_RG_PLL_DIVEN_PE2H | P3A_RG_PLL_BC_PE2H);
  552. tmp |= P3A_RG_PLL_BC_PE2H_VAL(0x3);
  553. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG4);
  554. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG6);
  555. tmp &= ~P3A_RG_PLL_IR_PE2H;
  556. tmp |= P3A_RG_PLL_IR_PE2H_VAL(0x2);
  557. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG6);
  558. tmp = readl(u3_banks->phya + U3P_U3_PHYA_DA_REG7);
  559. tmp &= ~P3A_RG_PLL_BP_PE2H;
  560. tmp |= P3A_RG_PLL_BP_PE2H_VAL(0xa);
  561. writel(tmp, u3_banks->phya + U3P_U3_PHYA_DA_REG7);
  562. /* Tx Detect Rx Timing: 10us -> 5us */
  563. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET1);
  564. tmp &= ~P3D_RG_RXDET_STB2_SET;
  565. tmp |= P3D_RG_RXDET_STB2_SET_VAL(0x10);
  566. writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET1);
  567. tmp = readl(u3_banks->phyd + U3P_U3_PHYD_RXDET2);
  568. tmp &= ~P3D_RG_RXDET_STB2_SET_P3;
  569. tmp |= P3D_RG_RXDET_STB2_SET_P3_VAL(0x10);
  570. writel(tmp, u3_banks->phyd + U3P_U3_PHYD_RXDET2);
  571. /* wait for PCIe subsys register to active */
  572. usleep_range(2500, 3000);
  573. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  574. }
  575. static void pcie_phy_instance_power_on(struct mtk_tphy *tphy,
  576. struct mtk_phy_instance *instance)
  577. {
  578. struct u3phy_banks *bank = &instance->u3_banks;
  579. u32 tmp;
  580. tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLD);
  581. tmp &= ~(P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST);
  582. writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLD);
  583. tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLE);
  584. tmp &= ~(P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD);
  585. writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLE);
  586. }
  587. static void pcie_phy_instance_power_off(struct mtk_tphy *tphy,
  588. struct mtk_phy_instance *instance)
  589. {
  590. struct u3phy_banks *bank = &instance->u3_banks;
  591. u32 tmp;
  592. tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLD);
  593. tmp |= P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST;
  594. writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLD);
  595. tmp = readl(bank->chip + U3P_U3_CHIP_GPIO_CTLE);
  596. tmp |= P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD;
  597. writel(tmp, bank->chip + U3P_U3_CHIP_GPIO_CTLE);
  598. }
  599. static void sata_phy_instance_init(struct mtk_tphy *tphy,
  600. struct mtk_phy_instance *instance)
  601. {
  602. struct u3phy_banks *u3_banks = &instance->u3_banks;
  603. void __iomem *phyd = u3_banks->phyd;
  604. u32 tmp;
  605. /* charge current adjustment */
  606. tmp = readl(phyd + ANA_RG_CTRL_SIGNAL6);
  607. tmp &= ~(RG_CDR_BIRLTR_GEN1_MSK | RG_CDR_BC_GEN1_MSK);
  608. tmp |= RG_CDR_BIRLTR_GEN1_VAL(0x6) | RG_CDR_BC_GEN1_VAL(0x1a);
  609. writel(tmp, phyd + ANA_RG_CTRL_SIGNAL6);
  610. tmp = readl(phyd + ANA_EQ_EYE_CTRL_SIGNAL4);
  611. tmp &= ~RG_CDR_BIRLTD0_GEN1_MSK;
  612. tmp |= RG_CDR_BIRLTD0_GEN1_VAL(0x18);
  613. writel(tmp, phyd + ANA_EQ_EYE_CTRL_SIGNAL4);
  614. tmp = readl(phyd + ANA_EQ_EYE_CTRL_SIGNAL5);
  615. tmp &= ~RG_CDR_BIRLTD0_GEN3_MSK;
  616. tmp |= RG_CDR_BIRLTD0_GEN3_VAL(0x06);
  617. writel(tmp, phyd + ANA_EQ_EYE_CTRL_SIGNAL5);
  618. tmp = readl(phyd + ANA_RG_CTRL_SIGNAL4);
  619. tmp &= ~(RG_CDR_BICLTR_GEN1_MSK | RG_CDR_BR_GEN2_MSK);
  620. tmp |= RG_CDR_BICLTR_GEN1_VAL(0x0c) | RG_CDR_BR_GEN2_VAL(0x07);
  621. writel(tmp, phyd + ANA_RG_CTRL_SIGNAL4);
  622. tmp = readl(phyd + PHYD_CTRL_SIGNAL_MODE4);
  623. tmp &= ~(RG_CDR_BICLTD0_GEN1_MSK | RG_CDR_BICLTD1_GEN1_MSK);
  624. tmp |= RG_CDR_BICLTD0_GEN1_VAL(0x08) | RG_CDR_BICLTD1_GEN1_VAL(0x02);
  625. writel(tmp, phyd + PHYD_CTRL_SIGNAL_MODE4);
  626. tmp = readl(phyd + PHYD_DESIGN_OPTION2);
  627. tmp &= ~RG_LOCK_CNT_SEL_MSK;
  628. tmp |= RG_LOCK_CNT_SEL_VAL(0x02);
  629. writel(tmp, phyd + PHYD_DESIGN_OPTION2);
  630. tmp = readl(phyd + PHYD_DESIGN_OPTION9);
  631. tmp &= ~(RG_T2_MIN_MSK | RG_TG_MIN_MSK |
  632. RG_T2_MAX_MSK | RG_TG_MAX_MSK);
  633. tmp |= RG_T2_MIN_VAL(0x12) | RG_TG_MIN_VAL(0x04) |
  634. RG_T2_MAX_VAL(0x31) | RG_TG_MAX_VAL(0x0e);
  635. writel(tmp, phyd + PHYD_DESIGN_OPTION9);
  636. tmp = readl(phyd + ANA_RG_CTRL_SIGNAL1);
  637. tmp &= ~RG_IDRV_0DB_GEN1_MSK;
  638. tmp |= RG_IDRV_0DB_GEN1_VAL(0x20);
  639. writel(tmp, phyd + ANA_RG_CTRL_SIGNAL1);
  640. tmp = readl(phyd + ANA_EQ_EYE_CTRL_SIGNAL1);
  641. tmp &= ~RG_EQ_DLEQ_LFI_GEN1_MSK;
  642. tmp |= RG_EQ_DLEQ_LFI_GEN1_VAL(0x03);
  643. writel(tmp, phyd + ANA_EQ_EYE_CTRL_SIGNAL1);
  644. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  645. }
  646. static void phy_v1_banks_init(struct mtk_tphy *tphy,
  647. struct mtk_phy_instance *instance)
  648. {
  649. struct u2phy_banks *u2_banks = &instance->u2_banks;
  650. struct u3phy_banks *u3_banks = &instance->u3_banks;
  651. switch (instance->type) {
  652. case PHY_TYPE_USB2:
  653. u2_banks->misc = NULL;
  654. u2_banks->fmreg = tphy->sif_base + SSUSB_SIFSLV_V1_U2FREQ;
  655. u2_banks->com = instance->port_base + SSUSB_SIFSLV_V1_U2PHY_COM;
  656. break;
  657. case PHY_TYPE_USB3:
  658. case PHY_TYPE_PCIE:
  659. u3_banks->spllc = tphy->sif_base + SSUSB_SIFSLV_V1_SPLLC;
  660. u3_banks->chip = tphy->sif_base + SSUSB_SIFSLV_V1_CHIP;
  661. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
  662. u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V1_U3PHYA;
  663. break;
  664. case PHY_TYPE_SATA:
  665. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
  666. break;
  667. default:
  668. dev_err(tphy->dev, "incompatible PHY type\n");
  669. return;
  670. }
  671. }
  672. static void phy_v2_banks_init(struct mtk_tphy *tphy,
  673. struct mtk_phy_instance *instance)
  674. {
  675. struct u2phy_banks *u2_banks = &instance->u2_banks;
  676. struct u3phy_banks *u3_banks = &instance->u3_banks;
  677. switch (instance->type) {
  678. case PHY_TYPE_USB2:
  679. u2_banks->misc = instance->port_base + SSUSB_SIFSLV_V2_MISC;
  680. u2_banks->fmreg = instance->port_base + SSUSB_SIFSLV_V2_U2FREQ;
  681. u2_banks->com = instance->port_base + SSUSB_SIFSLV_V2_U2PHY_COM;
  682. break;
  683. case PHY_TYPE_USB3:
  684. case PHY_TYPE_PCIE:
  685. u3_banks->spllc = instance->port_base + SSUSB_SIFSLV_V2_SPLLC;
  686. u3_banks->chip = instance->port_base + SSUSB_SIFSLV_V2_CHIP;
  687. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V2_U3PHYD;
  688. u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V2_U3PHYA;
  689. break;
  690. default:
  691. dev_err(tphy->dev, "incompatible PHY type\n");
  692. return;
  693. }
  694. }
  695. static void phy_parse_property(struct mtk_tphy *tphy,
  696. struct mtk_phy_instance *instance)
  697. {
  698. struct device *dev = &instance->phy->dev;
  699. if (instance->type != PHY_TYPE_USB2)
  700. return;
  701. device_property_read_u32(dev, "mediatek,eye-src",
  702. &instance->eye_src);
  703. device_property_read_u32(dev, "mediatek,eye-vrt",
  704. &instance->eye_vrt);
  705. device_property_read_u32(dev, "mediatek,eye-term",
  706. &instance->eye_term);
  707. }
  708. static void u2_phy_props_set(struct mtk_tphy *tphy,
  709. struct mtk_phy_instance *instance)
  710. {
  711. struct u2phy_banks *u2_banks = &instance->u2_banks;
  712. void __iomem *com = u2_banks->com;
  713. u32 tmp;
  714. if (instance->eye_src) {
  715. tmp = readl(com + U3P_USBPHYACR5);
  716. tmp &= ~PA5_RG_U2_HSTX_SRCTRL;
  717. tmp |= PA5_RG_U2_HSTX_SRCTRL_VAL(instance->eye_src);
  718. writel(tmp, com + U3P_USBPHYACR5);
  719. }
  720. if (instance->eye_vrt) {
  721. tmp = readl(com + U3P_USBPHYACR1);
  722. tmp &= ~PA1_RG_VRT_SEL;
  723. tmp |= PA1_RG_VRT_SEL_VAL(instance->eye_vrt);
  724. writel(tmp, com + U3P_USBPHYACR1);
  725. }
  726. if (instance->eye_term) {
  727. tmp = readl(com + U3P_USBPHYACR1);
  728. tmp &= ~PA1_RG_TERM_SEL;
  729. tmp |= PA1_RG_TERM_SEL_VAL(instance->eye_term);
  730. writel(tmp, com + U3P_USBPHYACR1);
  731. }
  732. }
  733. static int mtk_phy_init(struct phy *phy)
  734. {
  735. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  736. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  737. int ret;
  738. ret = clk_prepare_enable(tphy->u3phya_ref);
  739. if (ret) {
  740. dev_err(tphy->dev, "failed to enable u3phya_ref\n");
  741. return ret;
  742. }
  743. ret = clk_prepare_enable(instance->ref_clk);
  744. if (ret) {
  745. dev_err(tphy->dev, "failed to enable ref_clk\n");
  746. return ret;
  747. }
  748. switch (instance->type) {
  749. case PHY_TYPE_USB2:
  750. u2_phy_instance_init(tphy, instance);
  751. u2_phy_props_set(tphy, instance);
  752. break;
  753. case PHY_TYPE_USB3:
  754. u3_phy_instance_init(tphy, instance);
  755. break;
  756. case PHY_TYPE_PCIE:
  757. pcie_phy_instance_init(tphy, instance);
  758. break;
  759. case PHY_TYPE_SATA:
  760. sata_phy_instance_init(tphy, instance);
  761. break;
  762. default:
  763. dev_err(tphy->dev, "incompatible PHY type\n");
  764. return -EINVAL;
  765. }
  766. return 0;
  767. }
  768. static int mtk_phy_power_on(struct phy *phy)
  769. {
  770. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  771. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  772. if (instance->type == PHY_TYPE_USB2) {
  773. u2_phy_instance_power_on(tphy, instance);
  774. hs_slew_rate_calibrate(tphy, instance);
  775. } else if (instance->type == PHY_TYPE_PCIE) {
  776. pcie_phy_instance_power_on(tphy, instance);
  777. }
  778. return 0;
  779. }
  780. static int mtk_phy_power_off(struct phy *phy)
  781. {
  782. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  783. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  784. if (instance->type == PHY_TYPE_USB2)
  785. u2_phy_instance_power_off(tphy, instance);
  786. else if (instance->type == PHY_TYPE_PCIE)
  787. pcie_phy_instance_power_off(tphy, instance);
  788. return 0;
  789. }
  790. static int mtk_phy_exit(struct phy *phy)
  791. {
  792. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  793. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  794. if (instance->type == PHY_TYPE_USB2)
  795. u2_phy_instance_exit(tphy, instance);
  796. clk_disable_unprepare(instance->ref_clk);
  797. clk_disable_unprepare(tphy->u3phya_ref);
  798. return 0;
  799. }
  800. static int mtk_phy_set_mode(struct phy *phy, enum phy_mode mode)
  801. {
  802. struct mtk_phy_instance *instance = phy_get_drvdata(phy);
  803. struct mtk_tphy *tphy = dev_get_drvdata(phy->dev.parent);
  804. if (instance->type == PHY_TYPE_USB2)
  805. u2_phy_instance_set_mode(tphy, instance, mode);
  806. return 0;
  807. }
  808. static struct phy *mtk_phy_xlate(struct device *dev,
  809. struct of_phandle_args *args)
  810. {
  811. struct mtk_tphy *tphy = dev_get_drvdata(dev);
  812. struct mtk_phy_instance *instance = NULL;
  813. struct device_node *phy_np = args->np;
  814. int index;
  815. if (args->args_count != 1) {
  816. dev_err(dev, "invalid number of cells in 'phy' property\n");
  817. return ERR_PTR(-EINVAL);
  818. }
  819. for (index = 0; index < tphy->nphys; index++)
  820. if (phy_np == tphy->phys[index]->phy->dev.of_node) {
  821. instance = tphy->phys[index];
  822. break;
  823. }
  824. if (!instance) {
  825. dev_err(dev, "failed to find appropriate phy\n");
  826. return ERR_PTR(-EINVAL);
  827. }
  828. instance->type = args->args[0];
  829. if (!(instance->type == PHY_TYPE_USB2 ||
  830. instance->type == PHY_TYPE_USB3 ||
  831. instance->type == PHY_TYPE_PCIE ||
  832. instance->type == PHY_TYPE_SATA)) {
  833. dev_err(dev, "unsupported device type: %d\n", instance->type);
  834. return ERR_PTR(-EINVAL);
  835. }
  836. if (tphy->pdata->version == MTK_PHY_V1) {
  837. phy_v1_banks_init(tphy, instance);
  838. } else if (tphy->pdata->version == MTK_PHY_V2) {
  839. phy_v2_banks_init(tphy, instance);
  840. } else {
  841. dev_err(dev, "phy version is not supported\n");
  842. return ERR_PTR(-EINVAL);
  843. }
  844. phy_parse_property(tphy, instance);
  845. return instance->phy;
  846. }
  847. static const struct phy_ops mtk_tphy_ops = {
  848. .init = mtk_phy_init,
  849. .exit = mtk_phy_exit,
  850. .power_on = mtk_phy_power_on,
  851. .power_off = mtk_phy_power_off,
  852. .set_mode = mtk_phy_set_mode,
  853. .owner = THIS_MODULE,
  854. };
  855. static const struct mtk_phy_pdata tphy_v1_pdata = {
  856. .avoid_rx_sen_degradation = false,
  857. .version = MTK_PHY_V1,
  858. };
  859. static const struct mtk_phy_pdata tphy_v2_pdata = {
  860. .avoid_rx_sen_degradation = false,
  861. .version = MTK_PHY_V2,
  862. };
  863. static const struct mtk_phy_pdata mt8173_pdata = {
  864. .avoid_rx_sen_degradation = true,
  865. .version = MTK_PHY_V1,
  866. };
  867. static const struct of_device_id mtk_tphy_id_table[] = {
  868. { .compatible = "mediatek,mt2701-u3phy", .data = &tphy_v1_pdata },
  869. { .compatible = "mediatek,mt2712-u3phy", .data = &tphy_v2_pdata },
  870. { .compatible = "mediatek,mt8173-u3phy", .data = &mt8173_pdata },
  871. { .compatible = "mediatek,generic-tphy-v1", .data = &tphy_v1_pdata },
  872. { .compatible = "mediatek,generic-tphy-v2", .data = &tphy_v2_pdata },
  873. { },
  874. };
  875. MODULE_DEVICE_TABLE(of, mtk_tphy_id_table);
  876. static int mtk_tphy_probe(struct platform_device *pdev)
  877. {
  878. struct device *dev = &pdev->dev;
  879. struct device_node *np = dev->of_node;
  880. struct device_node *child_np;
  881. struct phy_provider *provider;
  882. struct resource *sif_res;
  883. struct mtk_tphy *tphy;
  884. struct resource res;
  885. int port, retval;
  886. tphy = devm_kzalloc(dev, sizeof(*tphy), GFP_KERNEL);
  887. if (!tphy)
  888. return -ENOMEM;
  889. tphy->pdata = of_device_get_match_data(dev);
  890. if (!tphy->pdata)
  891. return -EINVAL;
  892. tphy->nphys = of_get_child_count(np);
  893. tphy->phys = devm_kcalloc(dev, tphy->nphys,
  894. sizeof(*tphy->phys), GFP_KERNEL);
  895. if (!tphy->phys)
  896. return -ENOMEM;
  897. tphy->dev = dev;
  898. platform_set_drvdata(pdev, tphy);
  899. sif_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  900. /* SATA phy of V1 needn't it if not shared with PCIe or USB */
  901. if (sif_res && tphy->pdata->version == MTK_PHY_V1) {
  902. /* get banks shared by multiple phys */
  903. tphy->sif_base = devm_ioremap_resource(dev, sif_res);
  904. if (IS_ERR(tphy->sif_base)) {
  905. dev_err(dev, "failed to remap sif regs\n");
  906. return PTR_ERR(tphy->sif_base);
  907. }
  908. }
  909. /* it's deprecated, make it optional for backward compatibility */
  910. tphy->u3phya_ref = devm_clk_get(dev, "u3phya_ref");
  911. if (IS_ERR(tphy->u3phya_ref)) {
  912. if (PTR_ERR(tphy->u3phya_ref) == -EPROBE_DEFER)
  913. return -EPROBE_DEFER;
  914. tphy->u3phya_ref = NULL;
  915. }
  916. tphy->src_ref_clk = U3P_REF_CLK;
  917. tphy->src_coef = U3P_SLEW_RATE_COEF;
  918. /* update parameters of slew rate calibrate if exist */
  919. device_property_read_u32(dev, "mediatek,src-ref-clk-mhz",
  920. &tphy->src_ref_clk);
  921. device_property_read_u32(dev, "mediatek,src-coef", &tphy->src_coef);
  922. port = 0;
  923. for_each_child_of_node(np, child_np) {
  924. struct mtk_phy_instance *instance;
  925. struct phy *phy;
  926. instance = devm_kzalloc(dev, sizeof(*instance), GFP_KERNEL);
  927. if (!instance) {
  928. retval = -ENOMEM;
  929. goto put_child;
  930. }
  931. tphy->phys[port] = instance;
  932. phy = devm_phy_create(dev, child_np, &mtk_tphy_ops);
  933. if (IS_ERR(phy)) {
  934. dev_err(dev, "failed to create phy\n");
  935. retval = PTR_ERR(phy);
  936. goto put_child;
  937. }
  938. retval = of_address_to_resource(child_np, 0, &res);
  939. if (retval) {
  940. dev_err(dev, "failed to get address resource(id-%d)\n",
  941. port);
  942. goto put_child;
  943. }
  944. instance->port_base = devm_ioremap_resource(&phy->dev, &res);
  945. if (IS_ERR(instance->port_base)) {
  946. dev_err(dev, "failed to remap phy regs\n");
  947. retval = PTR_ERR(instance->port_base);
  948. goto put_child;
  949. }
  950. instance->phy = phy;
  951. instance->index = port;
  952. phy_set_drvdata(phy, instance);
  953. port++;
  954. /* if deprecated clock is provided, ignore instance's one */
  955. if (tphy->u3phya_ref)
  956. continue;
  957. instance->ref_clk = devm_clk_get(&phy->dev, "ref");
  958. if (IS_ERR(instance->ref_clk)) {
  959. dev_err(dev, "failed to get ref_clk(id-%d)\n", port);
  960. retval = PTR_ERR(instance->ref_clk);
  961. goto put_child;
  962. }
  963. }
  964. provider = devm_of_phy_provider_register(dev, mtk_phy_xlate);
  965. return PTR_ERR_OR_ZERO(provider);
  966. put_child:
  967. of_node_put(child_np);
  968. return retval;
  969. }
  970. static struct platform_driver mtk_tphy_driver = {
  971. .probe = mtk_tphy_probe,
  972. .driver = {
  973. .name = "mtk-tphy",
  974. .of_match_table = mtk_tphy_id_table,
  975. },
  976. };
  977. module_platform_driver(mtk_tphy_driver);
  978. MODULE_AUTHOR("Chunfeng Yun <chunfeng.yun@mediatek.com>");
  979. MODULE_DESCRIPTION("MediaTek T-PHY driver");
  980. MODULE_LICENSE("GPL v2");