phy-mtk-tphy.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2015 - 2019 MediaTek Inc.
  4. * Author: Chunfeng Yun <chunfeng.yun@mediatek.com>
  5. * Ryder Lee <ryder.lee@mediatek.com>
  6. */
  7. #include <common.h>
  8. #include <clk.h>
  9. #include <dm.h>
  10. #include <generic-phy.h>
  11. #include <malloc.h>
  12. #include <mapmem.h>
  13. #include <asm/io.h>
  14. #include <dm/device_compat.h>
  15. #include <dm/devres.h>
  16. #include <linux/bitfield.h>
  17. #include <linux/bitops.h>
  18. #include <linux/delay.h>
  19. #include <dt-bindings/phy/phy.h>
  20. /* version V1 sub-banks offset base address */
  21. /* banks shared by multiple phys */
  22. #define SSUSB_SIFSLV_V1_SPLLC 0x000 /* shared by u3 phys */
  23. #define SSUSB_SIFSLV_V1_U2FREQ 0x100 /* shared by u2 phys */
  24. #define SSUSB_SIFSLV_V1_CHIP 0x300 /* shared by u3 phys */
  25. /* u2 phy bank */
  26. #define SSUSB_SIFSLV_V1_U2PHY_COM 0x000
  27. /* u3/pcie/sata phy banks */
  28. #define SSUSB_SIFSLV_V1_U3PHYD 0x000
  29. #define SSUSB_SIFSLV_V1_U3PHYA 0x200
  30. /* version V2 sub-banks offset base address */
  31. /* u2 phy banks */
  32. #define SSUSB_SIFSLV_V2_MISC 0x000
  33. #define SSUSB_SIFSLV_V2_U2FREQ 0x100
  34. #define SSUSB_SIFSLV_V2_U2PHY_COM 0x300
  35. /* u3/pcie/sata phy banks */
  36. #define SSUSB_SIFSLV_V2_SPLLC 0x000
  37. #define SSUSB_SIFSLV_V2_CHIP 0x100
  38. #define SSUSB_SIFSLV_V2_U3PHYD 0x200
  39. #define SSUSB_SIFSLV_V2_U3PHYA 0x400
  40. #define U3P_USBPHYACR0 0x000
  41. #define PA0_RG_U2PLL_FORCE_ON BIT(15)
  42. #define PA0_USB20_PLL_PREDIV GENMASK(7, 6)
  43. #define PA0_RG_USB20_INTR_EN BIT(5)
  44. #define U3P_USBPHYACR2 0x008
  45. #define PA2_RG_U2PLL_BW GENMASK(21, 19)
  46. #define U3P_USBPHYACR5 0x014
  47. #define PA5_RG_U2_HSTX_SRCAL_EN BIT(15)
  48. #define PA5_RG_U2_HSTX_SRCTRL GENMASK(14, 12)
  49. #define PA5_RG_U2_HS_100U_U3_EN BIT(11)
  50. #define U3P_USBPHYACR6 0x018
  51. #define PA6_RG_U2_BC11_SW_EN BIT(23)
  52. #define PA6_RG_U2_OTG_VBUSCMP_EN BIT(20)
  53. #define PA6_RG_U2_SQTH GENMASK(3, 0)
  54. #define U3P_U2PHYACR4 0x020
  55. #define P2C_RG_USB20_GPIO_CTL BIT(9)
  56. #define P2C_USB20_GPIO_MODE BIT(8)
  57. #define P2C_U2_GPIO_CTR_MSK \
  58. (P2C_RG_USB20_GPIO_CTL | P2C_USB20_GPIO_MODE)
  59. #define U3P_U2PHYA_RESV 0x030
  60. #define P2R_RG_U2PLL_FBDIV_26M 0x1bb13b
  61. #define P2R_RG_U2PLL_FBDIV_48M 0x3c0000
  62. #define U3P_U2PHYA_RESV1 0x044
  63. #define P2R_RG_U2PLL_REFCLK_SEL BIT(5)
  64. #define P2R_RG_U2PLL_FRA_EN BIT(3)
  65. #define U3P_U2PHYDTM0 0x068
  66. #define P2C_FORCE_UART_EN BIT(26)
  67. #define P2C_FORCE_DATAIN BIT(23)
  68. #define P2C_FORCE_DM_PULLDOWN BIT(21)
  69. #define P2C_FORCE_DP_PULLDOWN BIT(20)
  70. #define P2C_FORCE_XCVRSEL BIT(19)
  71. #define P2C_FORCE_SUSPENDM BIT(18)
  72. #define P2C_FORCE_TERMSEL BIT(17)
  73. #define P2C_RG_DATAIN GENMASK(13, 10)
  74. #define P2C_RG_DMPULLDOWN BIT(7)
  75. #define P2C_RG_DPPULLDOWN BIT(6)
  76. #define P2C_RG_XCVRSEL GENMASK(5, 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 U3P_U3_PHYA_REG1 0x004
  101. #define P3A_RG_CLKDRV_AMP GENMASK(31, 29)
  102. #define U3P_U3_PHYA_REG6 0x018
  103. #define P3A_RG_TX_EIDLE_CM GENMASK(31, 28)
  104. #define U3P_U3_PHYA_REG9 0x024
  105. #define P3A_RG_RX_DAC_MUX GENMASK(5, 1)
  106. #define U3P_U3_PHYA_DA_REG0 0x100
  107. #define P3A_RG_XTAL_EXT_PE2H GENMASK(17, 16)
  108. #define P3A_RG_XTAL_EXT_PE1H GENMASK(13, 12)
  109. #define P3A_RG_XTAL_EXT_EN_U3 GENMASK(11, 10)
  110. #define U3P_U3_PHYA_DA_REG4 0x108
  111. #define P3A_RG_PLL_DIVEN_PE2H GENMASK(21, 19)
  112. #define P3A_RG_PLL_BC_PE2H GENMASK(7, 6)
  113. #define U3P_U3_PHYA_DA_REG5 0x10c
  114. #define P3A_RG_PLL_BR_PE2H GENMASK(29, 28)
  115. #define P3A_RG_PLL_IC_PE2H GENMASK(15, 12)
  116. #define U3P_U3_PHYA_DA_REG6 0x110
  117. #define P3A_RG_PLL_IR_PE2H GENMASK(19, 16)
  118. #define U3P_U3_PHYA_DA_REG7 0x114
  119. #define P3A_RG_PLL_BP_PE2H GENMASK(19, 16)
  120. #define U3P_U3_PHYA_DA_REG20 0x13c
  121. #define P3A_RG_PLL_DELTA1_PE2H GENMASK(31, 16)
  122. #define U3P_U3_PHYA_DA_REG25 0x148
  123. #define P3A_RG_PLL_DELTA_PE2H GENMASK(15, 0)
  124. #define U3P_U3_PHYD_LFPS1 0x00c
  125. #define P3D_RG_FWAKE_TH GENMASK(21, 16)
  126. #define U3P_U3_PHYD_CDR1 0x05c
  127. #define P3D_RG_CDR_BIR_LTD1 GENMASK(28, 24)
  128. #define P3D_RG_CDR_BIR_LTD0 GENMASK(12, 8)
  129. #define U3P_U3_PHYD_RXDET1 0x128
  130. #define P3D_RG_RXDET_STB2_SET GENMASK(17, 9)
  131. #define U3P_U3_PHYD_RXDET2 0x12c
  132. #define P3D_RG_RXDET_STB2_SET_P3 GENMASK(8, 0)
  133. #define U3P_SPLLC_XTALCTL3 0x018
  134. #define XC3_RG_U3_XTAL_RX_PWD BIT(9)
  135. #define XC3_RG_U3_FRC_XTAL_RX_PWD BIT(8)
  136. /* SATA register setting */
  137. #define PHYD_CTRL_SIGNAL_MODE4 0x1c
  138. /* CDR Charge Pump P-path current adjustment */
  139. #define RG_CDR_BICLTD1_GEN1_MSK GENMASK(23, 20)
  140. #define RG_CDR_BICLTD0_GEN1_MSK GENMASK(11, 8)
  141. #define PHYD_DESIGN_OPTION2 0x24
  142. /* Symbol lock count selection */
  143. #define RG_LOCK_CNT_SEL_MSK GENMASK(5, 4)
  144. #define PHYD_DESIGN_OPTION9 0x40
  145. /* COMWAK GAP width window */
  146. #define RG_TG_MAX_MSK GENMASK(20, 16)
  147. /* COMINIT GAP width window */
  148. #define RG_T2_MAX_MSK GENMASK(13, 8)
  149. /* COMWAK GAP width window */
  150. #define RG_TG_MIN_MSK GENMASK(7, 5)
  151. /* COMINIT GAP width window */
  152. #define RG_T2_MIN_MSK GENMASK(4, 0)
  153. #define ANA_RG_CTRL_SIGNAL1 0x4c
  154. /* TX driver tail current control for 0dB de-empahsis mdoe for Gen1 speed */
  155. #define RG_IDRV_0DB_GEN1_MSK GENMASK(13, 8)
  156. #define ANA_RG_CTRL_SIGNAL4 0x58
  157. #define RG_CDR_BICLTR_GEN1_MSK GENMASK(23, 20)
  158. /* Loop filter R1 resistance adjustment for Gen1 speed */
  159. #define RG_CDR_BR_GEN2_MSK GENMASK(10, 8)
  160. #define ANA_RG_CTRL_SIGNAL6 0x60
  161. /* I-path capacitance adjustment for Gen1 */
  162. #define RG_CDR_BC_GEN1_MSK GENMASK(28, 24)
  163. #define RG_CDR_BIRLTR_GEN1_MSK GENMASK(4, 0)
  164. #define ANA_EQ_EYE_CTRL_SIGNAL1 0x6c
  165. /* RX Gen1 LEQ tuning step */
  166. #define RG_EQ_DLEQ_LFI_GEN1_MSK GENMASK(11, 8)
  167. #define ANA_EQ_EYE_CTRL_SIGNAL4 0xd8
  168. #define RG_CDR_BIRLTD0_GEN1_MSK GENMASK(20, 16)
  169. #define ANA_EQ_EYE_CTRL_SIGNAL5 0xdc
  170. #define RG_CDR_BIRLTD0_GEN3_MSK GENMASK(4, 0)
  171. enum mtk_phy_version {
  172. MTK_TPHY_V1 = 1,
  173. MTK_TPHY_V2,
  174. };
  175. struct tphy_pdata {
  176. enum mtk_phy_version version;
  177. /*
  178. * workaround only for mt8195:
  179. * u2phy should use integer mode instead of fractional mode of
  180. * 48M PLL, fix it by switching PLL to 26M from default 48M
  181. */
  182. bool sw_pll_48m_to_26m;
  183. };
  184. struct u2phy_banks {
  185. void __iomem *misc;
  186. void __iomem *fmreg;
  187. void __iomem *com;
  188. };
  189. struct u3phy_banks {
  190. void __iomem *spllc;
  191. void __iomem *chip;
  192. void __iomem *phyd; /* include u3phyd_bank2 */
  193. void __iomem *phya; /* include u3phya_da */
  194. };
  195. struct mtk_phy_instance {
  196. void __iomem *port_base;
  197. const struct device_node *np;
  198. union {
  199. struct u2phy_banks u2_banks;
  200. struct u3phy_banks u3_banks;
  201. };
  202. struct clk ref_clk; /* reference clock of (digital) phy */
  203. struct clk da_ref_clk; /* reference clock of analog phy */
  204. u32 index;
  205. u32 type;
  206. };
  207. struct mtk_tphy {
  208. struct udevice *dev;
  209. void __iomem *sif_base;
  210. const struct tphy_pdata *pdata;
  211. struct mtk_phy_instance **phys;
  212. int nphys;
  213. };
  214. /* workaround only for mt8195 */
  215. static void u2_phy_pll_26m_set(struct mtk_tphy *tphy,
  216. struct mtk_phy_instance *instance)
  217. {
  218. struct u2phy_banks *u2_banks = &instance->u2_banks;
  219. if (!tphy->pdata->sw_pll_48m_to_26m)
  220. return;
  221. clrsetbits_le32(u2_banks->com + U3P_USBPHYACR0, PA0_USB20_PLL_PREDIV,
  222. FIELD_PREP(PA0_USB20_PLL_PREDIV, 0));
  223. clrsetbits_le32(u2_banks->com + U3P_USBPHYACR2, PA2_RG_U2PLL_BW,
  224. FIELD_PREP(PA2_RG_U2PLL_BW, 3));
  225. writel(P2R_RG_U2PLL_FBDIV_26M, u2_banks->com + U3P_U2PHYA_RESV);
  226. setbits_le32(u2_banks->com + U3P_U2PHYA_RESV1,
  227. P2R_RG_U2PLL_FRA_EN | P2R_RG_U2PLL_REFCLK_SEL);
  228. }
  229. static void u2_phy_instance_init(struct mtk_tphy *tphy,
  230. struct mtk_phy_instance *instance)
  231. {
  232. struct u2phy_banks *u2_banks = &instance->u2_banks;
  233. /* switch to USB function, and enable usb pll */
  234. clrsetbits_le32(u2_banks->com + U3P_U2PHYDTM0,
  235. P2C_FORCE_UART_EN | P2C_FORCE_SUSPENDM,
  236. FIELD_PREP(P2C_RG_XCVRSEL, 1) |
  237. FIELD_PREP(P2C_RG_DATAIN, 0));
  238. clrbits_le32(u2_banks->com + U3P_U2PHYDTM1, P2C_RG_UART_EN);
  239. setbits_le32(u2_banks->com + U3P_USBPHYACR0, PA0_RG_USB20_INTR_EN);
  240. /* disable switch 100uA current to SSUSB */
  241. clrbits_le32(u2_banks->com + U3P_USBPHYACR5, PA5_RG_U2_HS_100U_U3_EN);
  242. clrbits_le32(u2_banks->com + U3P_U2PHYACR4, P2C_U2_GPIO_CTR_MSK);
  243. /* DP/DM BC1.1 path Disable */
  244. clrsetbits_le32(u2_banks->com + U3P_USBPHYACR6,
  245. PA6_RG_U2_BC11_SW_EN | PA6_RG_U2_SQTH,
  246. FIELD_PREP(PA6_RG_U2_SQTH, 2));
  247. /* set HS slew rate */
  248. clrsetbits_le32(u2_banks->com + U3P_USBPHYACR5,
  249. PA5_RG_U2_HSTX_SRCTRL,
  250. FIELD_PREP(PA5_RG_U2_HSTX_SRCTRL, 4));
  251. u2_phy_pll_26m_set(tphy, instance);
  252. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  253. }
  254. static void u2_phy_instance_power_on(struct mtk_tphy *tphy,
  255. struct mtk_phy_instance *instance)
  256. {
  257. struct u2phy_banks *u2_banks = &instance->u2_banks;
  258. clrbits_le32(u2_banks->com + U3P_U2PHYDTM0,
  259. P2C_RG_XCVRSEL | P2C_RG_DATAIN | P2C_DTM0_PART_MASK);
  260. /* OTG Enable */
  261. setbits_le32(u2_banks->com + U3P_USBPHYACR6,
  262. PA6_RG_U2_OTG_VBUSCMP_EN);
  263. clrsetbits_le32(u2_banks->com + U3P_U2PHYDTM1,
  264. P2C_RG_SESSEND, P2C_RG_VBUSVALID | P2C_RG_AVALID);
  265. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  266. }
  267. static void u2_phy_instance_power_off(struct mtk_tphy *tphy,
  268. struct mtk_phy_instance *instance)
  269. {
  270. struct u2phy_banks *u2_banks = &instance->u2_banks;
  271. clrbits_le32(u2_banks->com + U3P_U2PHYDTM0,
  272. P2C_RG_XCVRSEL | P2C_RG_DATAIN);
  273. /* OTG Disable */
  274. clrbits_le32(u2_banks->com + U3P_USBPHYACR6,
  275. PA6_RG_U2_OTG_VBUSCMP_EN);
  276. clrsetbits_le32(u2_banks->com + U3P_U2PHYDTM1,
  277. P2C_RG_VBUSVALID | P2C_RG_AVALID, P2C_RG_SESSEND);
  278. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  279. }
  280. static void u3_phy_instance_init(struct mtk_tphy *tphy,
  281. struct mtk_phy_instance *instance)
  282. {
  283. struct u3phy_banks *u3_banks = &instance->u3_banks;
  284. /* gating PCIe Analog XTAL clock */
  285. setbits_le32(u3_banks->spllc + U3P_SPLLC_XTALCTL3,
  286. XC3_RG_U3_XTAL_RX_PWD | XC3_RG_U3_FRC_XTAL_RX_PWD);
  287. /* gating XSQ */
  288. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG0,
  289. P3A_RG_XTAL_EXT_EN_U3,
  290. FIELD_PREP(P3A_RG_XTAL_EXT_EN_U3, 2));
  291. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_REG9,
  292. P3A_RG_RX_DAC_MUX, FIELD_PREP(P3A_RG_RX_DAC_MUX, 4));
  293. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_REG6,
  294. P3A_RG_TX_EIDLE_CM,
  295. FIELD_PREP(P3A_RG_TX_EIDLE_CM, 0xe));
  296. clrsetbits_le32(u3_banks->phyd + U3P_U3_PHYD_CDR1,
  297. P3D_RG_CDR_BIR_LTD0 | P3D_RG_CDR_BIR_LTD1,
  298. FIELD_PREP(P3D_RG_CDR_BIR_LTD0, 0xc) |
  299. FIELD_PREP(P3D_RG_CDR_BIR_LTD1, 0x3));
  300. clrsetbits_le32(u3_banks->phyd + U3P_U3_PHYD_LFPS1,
  301. P3D_RG_FWAKE_TH, FIELD_PREP(P3D_RG_FWAKE_TH, 0x34));
  302. clrsetbits_le32(u3_banks->phyd + U3P_U3_PHYD_RXDET1,
  303. P3D_RG_RXDET_STB2_SET,
  304. FIELD_PREP(P3D_RG_RXDET_STB2_SET, 0x10));
  305. clrsetbits_le32(u3_banks->phyd + U3P_U3_PHYD_RXDET2,
  306. P3D_RG_RXDET_STB2_SET_P3,
  307. FIELD_PREP(P3D_RG_RXDET_STB2_SET_P3, 0x10));
  308. dev_dbg(tphy->dev, "%s(%d)\n", __func__, instance->index);
  309. }
  310. static void pcie_phy_instance_init(struct mtk_tphy *tphy,
  311. struct mtk_phy_instance *instance)
  312. {
  313. struct u3phy_banks *u3_banks = &instance->u3_banks;
  314. if (tphy->pdata->version != MTK_TPHY_V1)
  315. return;
  316. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG0,
  317. P3A_RG_XTAL_EXT_PE1H | P3A_RG_XTAL_EXT_PE2H,
  318. FIELD_PREP(P3A_RG_XTAL_EXT_PE1H, 0x2) |
  319. FIELD_PREP(P3A_RG_XTAL_EXT_PE2H, 0x2));
  320. /* ref clk drive */
  321. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_REG1, P3A_RG_CLKDRV_AMP,
  322. FIELD_PREP(P3A_RG_CLKDRV_AMP, 0x4));
  323. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_REG0, P3A_RG_CLKDRV_OFF,
  324. FIELD_PREP(P3A_RG_CLKDRV_OFF, 0x1));
  325. /* SSC delta -5000ppm */
  326. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG20,
  327. P3A_RG_PLL_DELTA1_PE2H,
  328. FIELD_PREP(P3A_RG_PLL_DELTA1_PE2H, 0x3c));
  329. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG25,
  330. P3A_RG_PLL_DELTA_PE2H,
  331. FIELD_PREP(P3A_RG_PLL_DELTA_PE2H, 0x36));
  332. /* change pll BW 0.6M */
  333. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG5,
  334. P3A_RG_PLL_BR_PE2H | P3A_RG_PLL_IC_PE2H,
  335. FIELD_PREP(P3A_RG_PLL_BR_PE2H, 0x1) |
  336. FIELD_PREP(P3A_RG_PLL_IC_PE2H, 0x1));
  337. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG4,
  338. P3A_RG_PLL_DIVEN_PE2H | P3A_RG_PLL_BC_PE2H,
  339. FIELD_PREP(P3A_RG_PLL_BC_PE2H, 0x3));
  340. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG6,
  341. P3A_RG_PLL_IR_PE2H,
  342. FIELD_PREP(P3A_RG_PLL_IR_PE2H, 0x2));
  343. clrsetbits_le32(u3_banks->phya + U3P_U3_PHYA_DA_REG7,
  344. P3A_RG_PLL_BP_PE2H,
  345. FIELD_PREP(P3A_RG_PLL_BP_PE2H, 0xa));
  346. /* Tx Detect Rx Timing: 10us -> 5us */
  347. clrsetbits_le32(u3_banks->phyd + U3P_U3_PHYD_RXDET1,
  348. P3D_RG_RXDET_STB2_SET,
  349. FIELD_PREP(P3D_RG_RXDET_STB2_SET, 0x10));
  350. clrsetbits_le32(u3_banks->phyd + U3P_U3_PHYD_RXDET2,
  351. P3D_RG_RXDET_STB2_SET_P3,
  352. FIELD_PREP(P3D_RG_RXDET_STB2_SET_P3, 0x10));
  353. /* wait for PCIe subsys register to active */
  354. udelay(3000);
  355. }
  356. static void sata_phy_instance_init(struct mtk_tphy *tphy,
  357. struct mtk_phy_instance *instance)
  358. {
  359. struct u3phy_banks *u3_banks = &instance->u3_banks;
  360. clrsetbits_le32(u3_banks->phyd + ANA_RG_CTRL_SIGNAL6,
  361. RG_CDR_BIRLTR_GEN1_MSK | RG_CDR_BC_GEN1_MSK,
  362. FIELD_PREP(RG_CDR_BIRLTR_GEN1_MSK, 0x6) |
  363. FIELD_PREP(RG_CDR_BC_GEN1_MSK, 0x1a));
  364. clrsetbits_le32(u3_banks->phyd + ANA_EQ_EYE_CTRL_SIGNAL4,
  365. RG_CDR_BIRLTD0_GEN1_MSK,
  366. FIELD_PREP(RG_CDR_BIRLTD0_GEN1_MSK, 0x18));
  367. clrsetbits_le32(u3_banks->phyd + ANA_EQ_EYE_CTRL_SIGNAL5,
  368. RG_CDR_BIRLTD0_GEN3_MSK,
  369. FIELD_PREP(RG_CDR_BIRLTD0_GEN3_MSK, 0x06));
  370. clrsetbits_le32(u3_banks->phyd + ANA_RG_CTRL_SIGNAL4,
  371. RG_CDR_BICLTR_GEN1_MSK | RG_CDR_BR_GEN2_MSK,
  372. FIELD_PREP(RG_CDR_BICLTR_GEN1_MSK, 0x0c) |
  373. FIELD_PREP(RG_CDR_BR_GEN2_MSK, 0x07));
  374. clrsetbits_le32(u3_banks->phyd + PHYD_CTRL_SIGNAL_MODE4,
  375. RG_CDR_BICLTD0_GEN1_MSK | RG_CDR_BICLTD1_GEN1_MSK,
  376. FIELD_PREP(RG_CDR_BICLTD0_GEN1_MSK, 0x08) |
  377. FIELD_PREP(RG_CDR_BICLTD1_GEN1_MSK, 0x02));
  378. clrsetbits_le32(u3_banks->phyd + PHYD_DESIGN_OPTION2,
  379. RG_LOCK_CNT_SEL_MSK,
  380. FIELD_PREP(RG_LOCK_CNT_SEL_MSK, 0x02));
  381. clrsetbits_le32(u3_banks->phyd + PHYD_DESIGN_OPTION9,
  382. RG_T2_MIN_MSK | RG_TG_MIN_MSK |
  383. RG_T2_MAX_MSK | RG_TG_MAX_MSK,
  384. FIELD_PREP(RG_T2_MIN_MSK, 0x12) |
  385. FIELD_PREP(RG_TG_MIN_MSK, 0x04) |
  386. FIELD_PREP(RG_T2_MAX_MSK, 0x31) |
  387. FIELD_PREP(RG_TG_MAX_MSK, 0x0e));
  388. clrsetbits_le32(u3_banks->phyd + ANA_RG_CTRL_SIGNAL1,
  389. RG_IDRV_0DB_GEN1_MSK,
  390. FIELD_PREP(RG_IDRV_0DB_GEN1_MSK, 0x20));
  391. clrsetbits_le32(u3_banks->phyd + ANA_EQ_EYE_CTRL_SIGNAL1,
  392. RG_EQ_DLEQ_LFI_GEN1_MSK,
  393. FIELD_PREP(RG_EQ_DLEQ_LFI_GEN1_MSK, 0x03));
  394. }
  395. static void pcie_phy_instance_power_on(struct mtk_tphy *tphy,
  396. struct mtk_phy_instance *instance)
  397. {
  398. struct u3phy_banks *bank = &instance->u3_banks;
  399. clrbits_le32(bank->chip + U3P_U3_CHIP_GPIO_CTLD,
  400. P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST);
  401. clrbits_le32(bank->chip + U3P_U3_CHIP_GPIO_CTLE,
  402. P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD);
  403. }
  404. static void pcie_phy_instance_power_off(struct mtk_tphy *tphy,
  405. struct mtk_phy_instance *instance)
  406. {
  407. struct u3phy_banks *bank = &instance->u3_banks;
  408. setbits_le32(bank->chip + U3P_U3_CHIP_GPIO_CTLD,
  409. P3C_FORCE_IP_SW_RST | P3C_REG_IP_SW_RST);
  410. setbits_le32(bank->chip + U3P_U3_CHIP_GPIO_CTLE,
  411. P3C_RG_SWRST_U3_PHYD_FORCE_EN | P3C_RG_SWRST_U3_PHYD);
  412. }
  413. static void phy_v1_banks_init(struct mtk_tphy *tphy,
  414. struct mtk_phy_instance *instance)
  415. {
  416. struct u2phy_banks *u2_banks = &instance->u2_banks;
  417. struct u3phy_banks *u3_banks = &instance->u3_banks;
  418. switch (instance->type) {
  419. case PHY_TYPE_USB2:
  420. u2_banks->misc = NULL;
  421. u2_banks->fmreg = tphy->sif_base + SSUSB_SIFSLV_V1_U2FREQ;
  422. u2_banks->com = instance->port_base + SSUSB_SIFSLV_V1_U2PHY_COM;
  423. break;
  424. case PHY_TYPE_USB3:
  425. case PHY_TYPE_PCIE:
  426. u3_banks->spllc = tphy->sif_base + SSUSB_SIFSLV_V1_SPLLC;
  427. u3_banks->chip = tphy->sif_base + SSUSB_SIFSLV_V1_CHIP;
  428. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
  429. u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V1_U3PHYA;
  430. break;
  431. case PHY_TYPE_SATA:
  432. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V1_U3PHYD;
  433. break;
  434. default:
  435. dev_err(tphy->dev, "incompatible PHY type\n");
  436. return;
  437. }
  438. }
  439. static void phy_v2_banks_init(struct mtk_tphy *tphy,
  440. struct mtk_phy_instance *instance)
  441. {
  442. struct u2phy_banks *u2_banks = &instance->u2_banks;
  443. struct u3phy_banks *u3_banks = &instance->u3_banks;
  444. switch (instance->type) {
  445. case PHY_TYPE_USB2:
  446. u2_banks->misc = instance->port_base + SSUSB_SIFSLV_V2_MISC;
  447. u2_banks->fmreg = instance->port_base + SSUSB_SIFSLV_V2_U2FREQ;
  448. u2_banks->com = instance->port_base + SSUSB_SIFSLV_V2_U2PHY_COM;
  449. break;
  450. case PHY_TYPE_USB3:
  451. case PHY_TYPE_PCIE:
  452. u3_banks->spllc = instance->port_base + SSUSB_SIFSLV_V2_SPLLC;
  453. u3_banks->chip = instance->port_base + SSUSB_SIFSLV_V2_CHIP;
  454. u3_banks->phyd = instance->port_base + SSUSB_SIFSLV_V2_U3PHYD;
  455. u3_banks->phya = instance->port_base + SSUSB_SIFSLV_V2_U3PHYA;
  456. break;
  457. default:
  458. dev_err(tphy->dev, "incompatible PHY type\n");
  459. return;
  460. }
  461. }
  462. static int mtk_phy_init(struct phy *phy)
  463. {
  464. struct mtk_tphy *tphy = dev_get_priv(phy->dev);
  465. struct mtk_phy_instance *instance = tphy->phys[phy->id];
  466. int ret;
  467. ret = clk_enable(&instance->ref_clk);
  468. if (ret < 0) {
  469. dev_err(tphy->dev, "failed to enable ref_clk\n");
  470. return ret;
  471. }
  472. ret = clk_enable(&instance->da_ref_clk);
  473. if (ret < 0) {
  474. dev_err(tphy->dev, "failed to enable da_ref_clk %d\n", ret);
  475. clk_disable(&instance->ref_clk);
  476. return ret;
  477. }
  478. switch (instance->type) {
  479. case PHY_TYPE_USB2:
  480. u2_phy_instance_init(tphy, instance);
  481. break;
  482. case PHY_TYPE_USB3:
  483. u3_phy_instance_init(tphy, instance);
  484. break;
  485. case PHY_TYPE_PCIE:
  486. pcie_phy_instance_init(tphy, instance);
  487. break;
  488. case PHY_TYPE_SATA:
  489. sata_phy_instance_init(tphy, instance);
  490. break;
  491. default:
  492. dev_err(tphy->dev, "incompatible PHY type\n");
  493. return -EINVAL;
  494. }
  495. return 0;
  496. }
  497. static int mtk_phy_power_on(struct phy *phy)
  498. {
  499. struct mtk_tphy *tphy = dev_get_priv(phy->dev);
  500. struct mtk_phy_instance *instance = tphy->phys[phy->id];
  501. if (instance->type == PHY_TYPE_USB2)
  502. u2_phy_instance_power_on(tphy, instance);
  503. else if (instance->type == PHY_TYPE_PCIE)
  504. pcie_phy_instance_power_on(tphy, instance);
  505. return 0;
  506. }
  507. static int mtk_phy_power_off(struct phy *phy)
  508. {
  509. struct mtk_tphy *tphy = dev_get_priv(phy->dev);
  510. struct mtk_phy_instance *instance = tphy->phys[phy->id];
  511. if (instance->type == PHY_TYPE_USB2)
  512. u2_phy_instance_power_off(tphy, instance);
  513. else if (instance->type == PHY_TYPE_PCIE)
  514. pcie_phy_instance_power_off(tphy, instance);
  515. return 0;
  516. }
  517. static int mtk_phy_exit(struct phy *phy)
  518. {
  519. struct mtk_tphy *tphy = dev_get_priv(phy->dev);
  520. struct mtk_phy_instance *instance = tphy->phys[phy->id];
  521. clk_disable(&instance->da_ref_clk);
  522. clk_disable(&instance->ref_clk);
  523. return 0;
  524. }
  525. static int mtk_phy_xlate(struct phy *phy,
  526. struct ofnode_phandle_args *args)
  527. {
  528. struct mtk_tphy *tphy = dev_get_priv(phy->dev);
  529. struct mtk_phy_instance *instance = NULL;
  530. const struct device_node *phy_np = ofnode_to_np(args->node);
  531. u32 index;
  532. if (!phy_np) {
  533. dev_err(phy->dev, "null pointer phy node\n");
  534. return -EINVAL;
  535. }
  536. if (args->args_count < 1) {
  537. dev_err(phy->dev, "invalid number of cells in 'phy' property\n");
  538. return -EINVAL;
  539. }
  540. for (index = 0; index < tphy->nphys; index++)
  541. if (phy_np == tphy->phys[index]->np) {
  542. instance = tphy->phys[index];
  543. break;
  544. }
  545. if (!instance) {
  546. dev_err(phy->dev, "failed to find appropriate phy\n");
  547. return -EINVAL;
  548. }
  549. phy->id = index;
  550. instance->type = args->args[1];
  551. if (!(instance->type == PHY_TYPE_USB2 ||
  552. instance->type == PHY_TYPE_USB3 ||
  553. instance->type == PHY_TYPE_SATA ||
  554. instance->type == PHY_TYPE_PCIE)) {
  555. dev_err(phy->dev, "unsupported device type\n");
  556. return -EINVAL;
  557. }
  558. switch (tphy->pdata->version) {
  559. case MTK_TPHY_V1:
  560. phy_v1_banks_init(tphy, instance);
  561. break;
  562. case MTK_TPHY_V2:
  563. phy_v2_banks_init(tphy, instance);
  564. break;
  565. default:
  566. dev_err(phy->dev, "phy version is not supported\n");
  567. return -EINVAL;
  568. }
  569. return 0;
  570. }
  571. static const struct phy_ops mtk_tphy_ops = {
  572. .init = mtk_phy_init,
  573. .exit = mtk_phy_exit,
  574. .power_on = mtk_phy_power_on,
  575. .power_off = mtk_phy_power_off,
  576. .of_xlate = mtk_phy_xlate,
  577. };
  578. static int mtk_tphy_probe(struct udevice *dev)
  579. {
  580. struct mtk_tphy *tphy = dev_get_priv(dev);
  581. ofnode subnode;
  582. int index = 0;
  583. tphy->nphys = dev_get_child_count(dev);
  584. tphy->phys = devm_kcalloc(dev, tphy->nphys, sizeof(*tphy->phys),
  585. GFP_KERNEL);
  586. if (!tphy->phys)
  587. return -ENOMEM;
  588. tphy->dev = dev;
  589. tphy->pdata = (void *)dev_get_driver_data(dev);
  590. /* v1 has shared banks for usb/pcie mode, */
  591. /* but not for sata mode */
  592. if (tphy->pdata->version == MTK_TPHY_V1)
  593. tphy->sif_base = dev_read_addr_ptr(dev);
  594. dev_for_each_subnode(subnode, dev) {
  595. struct mtk_phy_instance *instance;
  596. fdt_addr_t addr;
  597. int err;
  598. instance = devm_kzalloc(dev, sizeof(*instance), GFP_KERNEL);
  599. if (!instance)
  600. return -ENOMEM;
  601. addr = ofnode_get_addr(subnode);
  602. if (addr == FDT_ADDR_T_NONE)
  603. return -ENOMEM;
  604. instance->port_base = map_sysmem(addr, 0);
  605. instance->index = index;
  606. instance->np = ofnode_to_np(subnode);
  607. tphy->phys[index] = instance;
  608. index++;
  609. err = clk_get_by_name_nodev_optional(subnode, "ref",
  610. &instance->ref_clk);
  611. if (err)
  612. return err;
  613. err = clk_get_by_name_nodev_optional(subnode, "da_ref",
  614. &instance->da_ref_clk);
  615. if (err)
  616. return err;
  617. }
  618. return 0;
  619. }
  620. static struct tphy_pdata tphy_v1_pdata = {
  621. .version = MTK_TPHY_V1,
  622. };
  623. static struct tphy_pdata tphy_v2_pdata = {
  624. .version = MTK_TPHY_V2,
  625. };
  626. static struct tphy_pdata mt8195_pdata = {
  627. .version = MTK_TPHY_V2,
  628. .sw_pll_48m_to_26m = true,
  629. };
  630. static const struct udevice_id mtk_tphy_id_table[] = {
  631. {
  632. .compatible = "mediatek,generic-tphy-v1",
  633. .data = (ulong)&tphy_v1_pdata,
  634. },
  635. {
  636. .compatible = "mediatek,generic-tphy-v2",
  637. .data = (ulong)&tphy_v2_pdata,
  638. },
  639. {
  640. .compatible = "mediatek,mt8195-tphy",
  641. .data = (ulong)&mt8195_pdata,
  642. },
  643. { }
  644. };
  645. U_BOOT_DRIVER(mtk_tphy) = {
  646. .name = "mtk-tphy",
  647. .id = UCLASS_PHY,
  648. .of_match = mtk_tphy_id_table,
  649. .ops = &mtk_tphy_ops,
  650. .probe = mtk_tphy_probe,
  651. .priv_auto = sizeof(struct mtk_tphy),
  652. };