phy-brcm-usb-init-synopsys.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (c) 2018, Broadcom */
  3. /*
  4. * This module contains USB PHY initialization for power up and S3 resume
  5. * for newer Synopsys based USB hardware first used on the bcm7216.
  6. */
  7. #include <linux/delay.h>
  8. #include <linux/io.h>
  9. #include <linux/soc/brcmstb/brcmstb.h>
  10. #include "phy-brcm-usb-init.h"
  11. #define PHY_LOCK_TIMEOUT_MS 200
  12. /* Register definitions for syscon piarbctl registers */
  13. #define PIARBCTL_CAM 0x00
  14. #define PIARBCTL_SPLITTER 0x04
  15. #define PIARBCTL_MISC 0x08
  16. #define PIARBCTL_MISC_SECURE_MASK 0x80000000
  17. #define PIARBCTL_MISC_USB_SELECT_MASK 0x40000000
  18. #define PIARBCTL_MISC_USB_4G_SDRAM_MASK 0x20000000
  19. #define PIARBCTL_MISC_USB_PRIORITY_MASK 0x000f0000
  20. #define PIARBCTL_MISC_USB_MEM_PAGE_MASK 0x0000f000
  21. #define PIARBCTL_MISC_CAM1_MEM_PAGE_MASK 0x00000f00
  22. #define PIARBCTL_MISC_CAM0_MEM_PAGE_MASK 0x000000f0
  23. #define PIARBCTL_MISC_SATA_PRIORITY_MASK 0x0000000f
  24. #define PIARBCTL_MISC_USB_ONLY_MASK \
  25. (PIARBCTL_MISC_USB_SELECT_MASK | \
  26. PIARBCTL_MISC_USB_4G_SDRAM_MASK | \
  27. PIARBCTL_MISC_USB_PRIORITY_MASK | \
  28. PIARBCTL_MISC_USB_MEM_PAGE_MASK)
  29. /* Register definitions for the USB CTRL block */
  30. #define USB_CTRL_SETUP 0x00
  31. #define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK 0x02000000
  32. #define USB_CTRL_SETUP_SCB2_EN_MASK 0x00008000
  33. #define USB_CTRL_SETUP_tca_drv_sel_MASK 0x01000000
  34. #define USB_CTRL_SETUP_SCB1_EN_MASK 0x00004000
  35. #define USB_CTRL_SETUP_SOFT_SHUTDOWN_MASK 0x00000200
  36. #define USB_CTRL_SETUP_IPP_MASK 0x00000020
  37. #define USB_CTRL_SETUP_IOC_MASK 0x00000010
  38. #define USB_CTRL_USB_PM 0x04
  39. #define USB_CTRL_USB_PM_USB_PWRDN_MASK 0x80000000
  40. #define USB_CTRL_USB_PM_SOFT_RESET_MASK 0x40000000
  41. #define USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK 0x00800000
  42. #define USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK 0x00400000
  43. #define USB_CTRL_USB_PM_XHC_PME_EN_MASK 0x00000010
  44. #define USB_CTRL_USB_PM_XHC_S2_CLK_SWITCH_EN_MASK 0x00000008
  45. #define USB_CTRL_USB_PM_STATUS 0x08
  46. #define USB_CTRL_USB_DEVICE_CTL1 0x10
  47. #define USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK 0x00000003
  48. #define USB_CTRL_TEST_PORT_CTL 0x30
  49. #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_MASK 0x000000ff
  50. #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_PME_GEN_MASK 0x0000002e
  51. #define USB_CTRL_TP_DIAG1 0x34
  52. #define USB_CTLR_TP_DIAG1_wake_MASK 0x00000002
  53. #define USB_CTRL_CTLR_CSHCR 0x50
  54. #define USB_CTRL_CTLR_CSHCR_ctl_pme_en_MASK 0x00040000
  55. /* Register definitions for the USB_PHY block in 7211b0 */
  56. #define USB_PHY_PLL_CTL 0x00
  57. #define USB_PHY_PLL_CTL_PLL_RESETB_MASK 0x40000000
  58. #define USB_PHY_PLL_LDO_CTL 0x08
  59. #define USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK 0x00000004
  60. #define USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK 0x00000002
  61. #define USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK 0x00000001
  62. #define USB_PHY_UTMI_CTL_1 0x04
  63. #define USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK 0x00000800
  64. #define USB_PHY_UTMI_CTL_1_PHY_MODE_MASK 0x0000000c
  65. #define USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT 2
  66. #define USB_PHY_IDDQ 0x1c
  67. #define USB_PHY_IDDQ_phy_iddq_MASK 0x00000001
  68. #define USB_PHY_STATUS 0x20
  69. #define USB_PHY_STATUS_pll_lock_MASK 0x00000001
  70. /* Register definitions for the MDIO registers in the DWC2 block of
  71. * the 7211b0.
  72. * NOTE: The PHY's MDIO registers are only accessible through the
  73. * legacy DesignWare USB controller even though it's not being used.
  74. */
  75. #define USB_GMDIOCSR 0
  76. #define USB_GMDIOGEN 4
  77. /* Register definitions for the BDC EC block in 7211b0 */
  78. #define BDC_EC_AXIRDA 0x0c
  79. #define BDC_EC_AXIRDA_RTS_MASK 0xf0000000
  80. #define BDC_EC_AXIRDA_RTS_SHIFT 28
  81. static void usb_mdio_write_7211b0(struct brcm_usb_init_params *params,
  82. uint8_t addr, uint16_t data)
  83. {
  84. void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
  85. addr &= 0x1f; /* 5-bit address */
  86. brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
  87. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  88. ;
  89. brcm_usb_writel(0x59020000 | (addr << 18) | data,
  90. usb_mdio + USB_GMDIOGEN);
  91. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  92. ;
  93. brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
  94. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  95. ;
  96. }
  97. static uint16_t __maybe_unused usb_mdio_read_7211b0(
  98. struct brcm_usb_init_params *params, uint8_t addr)
  99. {
  100. void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
  101. addr &= 0x1f; /* 5-bit address */
  102. brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
  103. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  104. ;
  105. brcm_usb_writel(0x69020000 | (addr << 18), usb_mdio + USB_GMDIOGEN);
  106. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  107. ;
  108. brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
  109. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  110. ;
  111. return brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & 0xffff;
  112. }
  113. static void usb2_eye_fix_7211b0(struct brcm_usb_init_params *params)
  114. {
  115. /* select bank */
  116. usb_mdio_write_7211b0(params, 0x1f, 0x80a0);
  117. /* Set the eye */
  118. usb_mdio_write_7211b0(params, 0x0a, 0xc6a0);
  119. }
  120. static void xhci_soft_reset(struct brcm_usb_init_params *params,
  121. int on_off)
  122. {
  123. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  124. /* Assert reset */
  125. if (on_off)
  126. USB_CTRL_UNSET(ctrl, USB_PM, XHC_SOFT_RESETB);
  127. /* De-assert reset */
  128. else
  129. USB_CTRL_SET(ctrl, USB_PM, XHC_SOFT_RESETB);
  130. }
  131. static void usb_init_ipp(struct brcm_usb_init_params *params)
  132. {
  133. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  134. u32 reg;
  135. u32 orig_reg;
  136. pr_debug("%s\n", __func__);
  137. orig_reg = reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP));
  138. if (params->ipp != 2)
  139. /* override ipp strap pin (if it exits) */
  140. reg &= ~(USB_CTRL_MASK(SETUP, STRAP_IPP_SEL));
  141. /* Override the default OC and PP polarity */
  142. reg &= ~(USB_CTRL_MASK(SETUP, IPP) | USB_CTRL_MASK(SETUP, IOC));
  143. if (params->ioc)
  144. reg |= USB_CTRL_MASK(SETUP, IOC);
  145. if (params->ipp == 1)
  146. reg |= USB_CTRL_MASK(SETUP, IPP);
  147. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP));
  148. /*
  149. * If we're changing IPP, make sure power is off long enough
  150. * to turn off any connected devices.
  151. */
  152. if ((reg ^ orig_reg) & USB_CTRL_MASK(SETUP, IPP))
  153. msleep(50);
  154. }
  155. static void syscon_piarbctl_init(struct regmap *rmap)
  156. {
  157. /* Switch from legacy USB OTG controller to new STB USB controller */
  158. regmap_update_bits(rmap, PIARBCTL_MISC, PIARBCTL_MISC_USB_ONLY_MASK,
  159. PIARBCTL_MISC_USB_SELECT_MASK |
  160. PIARBCTL_MISC_USB_4G_SDRAM_MASK);
  161. }
  162. static void usb_init_common(struct brcm_usb_init_params *params)
  163. {
  164. u32 reg;
  165. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  166. pr_debug("%s\n", __func__);
  167. if (USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE)) {
  168. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  169. reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
  170. reg |= params->mode;
  171. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  172. }
  173. switch (params->mode) {
  174. case USB_CTLR_MODE_HOST:
  175. USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
  176. break;
  177. default:
  178. USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
  179. USB_CTRL_SET(ctrl, USB_PM, BDC_SOFT_RESETB);
  180. break;
  181. }
  182. }
  183. static void usb_wake_enable_7211b0(struct brcm_usb_init_params *params,
  184. bool enable)
  185. {
  186. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  187. if (enable)
  188. USB_CTRL_SET(ctrl, CTLR_CSHCR, ctl_pme_en);
  189. else
  190. USB_CTRL_UNSET(ctrl, CTLR_CSHCR, ctl_pme_en);
  191. }
  192. static void usb_wake_enable_7216(struct brcm_usb_init_params *params,
  193. bool enable)
  194. {
  195. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  196. if (enable)
  197. USB_CTRL_SET(ctrl, USB_PM, XHC_PME_EN);
  198. else
  199. USB_CTRL_UNSET(ctrl, USB_PM, XHC_PME_EN);
  200. }
  201. static void usb_init_common_7211b0(struct brcm_usb_init_params *params)
  202. {
  203. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  204. void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
  205. void __iomem *bdc_ec = params->regs[BRCM_REGS_BDC_EC];
  206. int timeout_ms = PHY_LOCK_TIMEOUT_MS;
  207. u32 reg;
  208. if (params->syscon_piarbctl)
  209. syscon_piarbctl_init(params->syscon_piarbctl);
  210. USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
  211. usb_wake_enable_7211b0(params, false);
  212. if (!params->wake_enabled) {
  213. /* undo possible suspend settings */
  214. brcm_usb_writel(0, usb_phy + USB_PHY_IDDQ);
  215. reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
  216. reg |= USB_PHY_PLL_CTL_PLL_RESETB_MASK;
  217. brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
  218. /* temporarily enable FSM so PHY comes up properly */
  219. reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
  220. reg |= USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
  221. brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
  222. }
  223. /* Init the PHY */
  224. reg = USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK |
  225. USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK |
  226. USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK;
  227. brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_LDO_CTL);
  228. /* wait for lock */
  229. while (timeout_ms-- > 0) {
  230. reg = brcm_usb_readl(usb_phy + USB_PHY_STATUS);
  231. if (reg & USB_PHY_STATUS_pll_lock_MASK)
  232. break;
  233. usleep_range(1000, 2000);
  234. }
  235. /* Set the PHY_MODE */
  236. reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
  237. reg &= ~USB_PHY_UTMI_CTL_1_PHY_MODE_MASK;
  238. reg |= params->mode << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT;
  239. brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
  240. usb_init_common(params);
  241. /*
  242. * The BDC controller will get occasional failures with
  243. * the default "Read Transaction Size" of 6 (1024 bytes).
  244. * Set it to 4 (256 bytes).
  245. */
  246. if ((params->mode != USB_CTLR_MODE_HOST) && bdc_ec) {
  247. reg = brcm_usb_readl(bdc_ec + BDC_EC_AXIRDA);
  248. reg &= ~BDC_EC_AXIRDA_RTS_MASK;
  249. reg |= (0x4 << BDC_EC_AXIRDA_RTS_SHIFT);
  250. brcm_usb_writel(reg, bdc_ec + BDC_EC_AXIRDA);
  251. }
  252. /*
  253. * Disable FSM, otherwise the PHY will auto suspend when no
  254. * device is connected and will be reset on resume.
  255. */
  256. reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
  257. reg &= ~USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
  258. brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
  259. usb2_eye_fix_7211b0(params);
  260. }
  261. static void usb_init_common_7216(struct brcm_usb_init_params *params)
  262. {
  263. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  264. USB_CTRL_UNSET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
  265. USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
  266. /* 1 millisecond - for USB clocks to settle down */
  267. usleep_range(1000, 2000);
  268. usb_wake_enable_7216(params, false);
  269. usb_init_common(params);
  270. }
  271. static void usb_init_xhci(struct brcm_usb_init_params *params)
  272. {
  273. pr_debug("%s\n", __func__);
  274. xhci_soft_reset(params, 0);
  275. }
  276. static void usb_uninit_common_7216(struct brcm_usb_init_params *params)
  277. {
  278. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  279. pr_debug("%s\n", __func__);
  280. if (params->wake_enabled) {
  281. /* Switch to using slower clock during suspend to save power */
  282. USB_CTRL_SET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
  283. usb_wake_enable_7216(params, true);
  284. } else {
  285. USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
  286. }
  287. }
  288. static void usb_uninit_common_7211b0(struct brcm_usb_init_params *params)
  289. {
  290. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  291. void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
  292. u32 reg;
  293. pr_debug("%s\n", __func__);
  294. if (params->wake_enabled) {
  295. USB_CTRL_SET(ctrl, TEST_PORT_CTL, TPOUT_SEL_PME_GEN);
  296. usb_wake_enable_7211b0(params, true);
  297. } else {
  298. USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
  299. brcm_usb_writel(0, usb_phy + USB_PHY_PLL_LDO_CTL);
  300. reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
  301. reg &= ~USB_PHY_PLL_CTL_PLL_RESETB_MASK;
  302. brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
  303. brcm_usb_writel(USB_PHY_IDDQ_phy_iddq_MASK,
  304. usb_phy + USB_PHY_IDDQ);
  305. }
  306. }
  307. static void usb_uninit_xhci(struct brcm_usb_init_params *params)
  308. {
  309. pr_debug("%s\n", __func__);
  310. if (!params->wake_enabled)
  311. xhci_soft_reset(params, 1);
  312. }
  313. static int usb_get_dual_select(struct brcm_usb_init_params *params)
  314. {
  315. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  316. u32 reg = 0;
  317. pr_debug("%s\n", __func__);
  318. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  319. reg &= USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
  320. return reg;
  321. }
  322. static void usb_set_dual_select(struct brcm_usb_init_params *params, int mode)
  323. {
  324. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  325. u32 reg;
  326. pr_debug("%s\n", __func__);
  327. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  328. reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
  329. reg |= mode;
  330. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  331. }
  332. static const struct brcm_usb_init_ops bcm7216_ops = {
  333. .init_ipp = usb_init_ipp,
  334. .init_common = usb_init_common_7216,
  335. .init_xhci = usb_init_xhci,
  336. .uninit_common = usb_uninit_common_7216,
  337. .uninit_xhci = usb_uninit_xhci,
  338. .get_dual_select = usb_get_dual_select,
  339. .set_dual_select = usb_set_dual_select,
  340. };
  341. static const struct brcm_usb_init_ops bcm7211b0_ops = {
  342. .init_ipp = usb_init_ipp,
  343. .init_common = usb_init_common_7211b0,
  344. .init_xhci = usb_init_xhci,
  345. .uninit_common = usb_uninit_common_7211b0,
  346. .uninit_xhci = usb_uninit_xhci,
  347. .get_dual_select = usb_get_dual_select,
  348. .set_dual_select = usb_set_dual_select,
  349. };
  350. void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params)
  351. {
  352. pr_debug("%s\n", __func__);
  353. params->family_name = "7216";
  354. params->ops = &bcm7216_ops;
  355. }
  356. void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params)
  357. {
  358. pr_debug("%s\n", __func__);
  359. params->family_name = "7211";
  360. params->ops = &bcm7211b0_ops;
  361. }