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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  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_SATA_PRIORITY_MASK GENMASK(3, 0)
  17. #define PIARBCTL_MISC_CAM0_MEM_PAGE_MASK GENMASK(7, 4)
  18. #define PIARBCTL_MISC_CAM1_MEM_PAGE_MASK GENMASK(11, 8)
  19. #define PIARBCTL_MISC_USB_MEM_PAGE_MASK GENMASK(15, 12)
  20. #define PIARBCTL_MISC_USB_PRIORITY_MASK GENMASK(19, 16)
  21. #define PIARBCTL_MISC_USB_4G_SDRAM_MASK BIT(29)
  22. #define PIARBCTL_MISC_USB_SELECT_MASK BIT(30)
  23. #define PIARBCTL_MISC_SECURE_MASK BIT(31)
  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_IOC_MASK BIT(4)
  32. #define USB_CTRL_SETUP_IPP_MASK BIT(5)
  33. #define USB_CTRL_SETUP_SOFT_SHUTDOWN_MASK BIT(9)
  34. #define USB_CTRL_SETUP_SCB1_EN_MASK BIT(14)
  35. #define USB_CTRL_SETUP_SCB2_EN_MASK BIT(15)
  36. #define USB_CTRL_SETUP_tca_drv_sel_MASK BIT(24)
  37. #define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK BIT(25)
  38. #define USB_CTRL_USB_PM 0x04
  39. #define USB_CTRL_USB_PM_REF_S2_CLK_SWITCH_EN_MASK BIT(1)
  40. #define USB_CTRL_USB_PM_UTMI_S2_CLK_SWITCH_EN_MASK BIT(2)
  41. #define USB_CTRL_USB_PM_XHC_S2_CLK_SWITCH_EN_MASK BIT(3)
  42. #define USB_CTRL_USB_PM_XHC_PME_EN_MASK BIT(4)
  43. #define USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK BIT(22)
  44. #define USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK BIT(23)
  45. #define USB_CTRL_USB_PM_SOFT_RESET_MASK BIT(30)
  46. #define USB_CTRL_USB_PM_USB_PWRDN_MASK BIT(31)
  47. #define USB_CTRL_USB_PM_STATUS 0x08
  48. #define USB_CTRL_USB_DEVICE_CTL1 0x10
  49. #define USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK GENMASK(1, 0)
  50. #define USB_CTRL_TEST_PORT_CTL 0x30
  51. #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_MASK GENMASK(7, 0)
  52. #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_PME_GEN_MASK 0x0000002e
  53. #define USB_CTRL_TP_DIAG1 0x34
  54. #define USB_CTLR_TP_DIAG1_wake_MASK BIT(1)
  55. #define USB_CTRL_CTLR_CSHCR 0x50
  56. #define USB_CTRL_CTLR_CSHCR_ctl_pme_en_MASK BIT(18)
  57. #define USB_CTRL_P0_U2PHY_CFG1 0x68
  58. #define USB_CTRL_P0_U2PHY_CFG1_COMMONONN_MASK BIT(10)
  59. #define USB_CTRL_P0_U2PHY_CFG2 0x6c
  60. #define USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_MASK GENMASK(20, 17)
  61. #define USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_SHIFT 17
  62. #define USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_MASK GENMASK(24, 23)
  63. #define USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_SHIFT 23
  64. #define USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_MASK GENMASK(26, 25)
  65. #define USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_SHIFT 25
  66. /* Register definitions for the USB_PHY block in 7211b0 */
  67. #define USB_PHY_PLL_CTL 0x00
  68. #define USB_PHY_PLL_CTL_PLL_SUSPEND_MASK BIT(27)
  69. #define USB_PHY_PLL_CTL_PLL_RESETB_MASK BIT(30)
  70. #define USB_PHY_PLL_LDO_CTL 0x08
  71. #define USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK BIT(0)
  72. #define USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK BIT(1)
  73. #define USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK BIT(2)
  74. #define USB_PHY_UTMI_CTL_1 0x04
  75. #define USB_PHY_UTMI_CTL_1_PHY_MODE_MASK GENMASK(3, 2)
  76. #define USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT 2
  77. #define USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK BIT(11)
  78. #define USB_PHY_IDDQ 0x1c
  79. #define USB_PHY_IDDQ_phy_iddq_MASK BIT(0)
  80. #define USB_PHY_STATUS 0x20
  81. #define USB_PHY_STATUS_pll_lock_MASK BIT(0)
  82. /* Register definitions for the MDIO registers in the DWC2 block of
  83. * the 7211b0.
  84. * NOTE: The PHY's MDIO registers are only accessible through the
  85. * legacy DesignWare USB controller even though it's not being used.
  86. */
  87. #define USB_GMDIOCSR 0
  88. #define USB_GMDIOGEN 4
  89. /* Register definitions for the BDC EC block in 7211b0 */
  90. #define BDC_EC_AXIRDA 0x0c
  91. #define BDC_EC_AXIRDA_RTS_MASK GENMASK(31, 28)
  92. #define BDC_EC_AXIRDA_RTS_SHIFT 28
  93. #define USB_XHCI_GBL_GUSB2PHYCFG 0x100
  94. #define USB_XHCI_GBL_GUSB2PHYCFG_U2_FREECLK_EXISTS_MASK BIT(30)
  95. static void usb_mdio_write_7211b0(struct brcm_usb_init_params *params,
  96. uint8_t addr, uint16_t data)
  97. {
  98. void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
  99. addr &= 0x1f; /* 5-bit address */
  100. brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
  101. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  102. ;
  103. brcm_usb_writel(0x59020000 | (addr << 18) | data,
  104. usb_mdio + USB_GMDIOGEN);
  105. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  106. ;
  107. brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
  108. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  109. ;
  110. }
  111. static uint16_t __maybe_unused usb_mdio_read_7211b0(
  112. struct brcm_usb_init_params *params, uint8_t addr)
  113. {
  114. void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
  115. addr &= 0x1f; /* 5-bit address */
  116. brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
  117. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  118. ;
  119. brcm_usb_writel(0x69020000 | (addr << 18), usb_mdio + USB_GMDIOGEN);
  120. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  121. ;
  122. brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
  123. while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
  124. ;
  125. return brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & 0xffff;
  126. }
  127. static void usb2_eye_fix_7211b0(struct brcm_usb_init_params *params)
  128. {
  129. /* select bank */
  130. usb_mdio_write_7211b0(params, 0x1f, 0x80a0);
  131. /* Set the eye */
  132. usb_mdio_write_7211b0(params, 0x0a, 0xc6a0);
  133. }
  134. static void xhci_soft_reset(struct brcm_usb_init_params *params,
  135. int on_off)
  136. {
  137. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  138. void __iomem *xhci_gbl = params->regs[BRCM_REGS_XHCI_GBL];
  139. /* Assert reset */
  140. if (on_off) {
  141. USB_CTRL_UNSET(ctrl, USB_PM, XHC_SOFT_RESETB);
  142. /* De-assert reset */
  143. } else {
  144. USB_CTRL_SET(ctrl, USB_PM, XHC_SOFT_RESETB);
  145. /* Required for COMMONONN to be set */
  146. if (params->supported_port_modes != USB_CTLR_MODE_DRD)
  147. USB_XHCI_GBL_UNSET(xhci_gbl, GUSB2PHYCFG,
  148. U2_FREECLK_EXISTS);
  149. }
  150. }
  151. static void usb_init_ipp(struct brcm_usb_init_params *params)
  152. {
  153. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  154. u32 reg;
  155. u32 orig_reg;
  156. pr_debug("%s\n", __func__);
  157. orig_reg = reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP));
  158. if (params->ipp != 2)
  159. /* override ipp strap pin (if it exits) */
  160. reg &= ~(USB_CTRL_MASK(SETUP, STRAP_IPP_SEL));
  161. /* Override the default OC and PP polarity */
  162. reg &= ~(USB_CTRL_MASK(SETUP, IPP) | USB_CTRL_MASK(SETUP, IOC));
  163. if (params->ioc)
  164. reg |= USB_CTRL_MASK(SETUP, IOC);
  165. if (params->ipp == 1)
  166. reg |= USB_CTRL_MASK(SETUP, IPP);
  167. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP));
  168. /*
  169. * If we're changing IPP, make sure power is off long enough
  170. * to turn off any connected devices.
  171. */
  172. if ((reg ^ orig_reg) & USB_CTRL_MASK(SETUP, IPP))
  173. msleep(50);
  174. }
  175. static void syscon_piarbctl_init(struct regmap *rmap)
  176. {
  177. /* Switch from legacy USB OTG controller to new STB USB controller */
  178. regmap_update_bits(rmap, PIARBCTL_MISC, PIARBCTL_MISC_USB_ONLY_MASK,
  179. PIARBCTL_MISC_USB_SELECT_MASK |
  180. PIARBCTL_MISC_USB_4G_SDRAM_MASK);
  181. }
  182. static void usb_init_common(struct brcm_usb_init_params *params)
  183. {
  184. u32 reg;
  185. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  186. pr_debug("%s\n", __func__);
  187. if (USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE)) {
  188. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  189. reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
  190. reg |= params->port_mode;
  191. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  192. }
  193. switch (params->supported_port_modes) {
  194. case USB_CTLR_MODE_HOST:
  195. USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
  196. break;
  197. default:
  198. USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
  199. USB_CTRL_SET(ctrl, USB_PM, BDC_SOFT_RESETB);
  200. break;
  201. }
  202. }
  203. static void usb_wake_enable_7211b0(struct brcm_usb_init_params *params,
  204. bool enable)
  205. {
  206. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  207. if (enable)
  208. USB_CTRL_SET(ctrl, CTLR_CSHCR, ctl_pme_en);
  209. else
  210. USB_CTRL_UNSET(ctrl, CTLR_CSHCR, ctl_pme_en);
  211. }
  212. static void usb_wake_enable_7216(struct brcm_usb_init_params *params,
  213. bool enable)
  214. {
  215. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  216. if (enable)
  217. USB_CTRL_SET(ctrl, USB_PM, XHC_PME_EN);
  218. else
  219. USB_CTRL_UNSET(ctrl, USB_PM, XHC_PME_EN);
  220. }
  221. static void usb_init_common_7211b0(struct brcm_usb_init_params *params)
  222. {
  223. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  224. void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
  225. void __iomem *bdc_ec = params->regs[BRCM_REGS_BDC_EC];
  226. int timeout_ms = PHY_LOCK_TIMEOUT_MS;
  227. u32 reg;
  228. if (params->syscon_piarbctl)
  229. syscon_piarbctl_init(params->syscon_piarbctl);
  230. USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
  231. usb_wake_enable_7211b0(params, false);
  232. if (!params->wake_enabled) {
  233. /* undo possible suspend settings */
  234. brcm_usb_writel(0, usb_phy + USB_PHY_IDDQ);
  235. reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
  236. reg |= USB_PHY_PLL_CTL_PLL_RESETB_MASK;
  237. brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
  238. /* temporarily enable FSM so PHY comes up properly */
  239. reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
  240. reg |= USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
  241. brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
  242. }
  243. /* Disable PLL auto suspend */
  244. reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
  245. reg |= USB_PHY_PLL_CTL_PLL_SUSPEND_MASK;
  246. brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
  247. /* Init the PHY */
  248. reg = USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK |
  249. USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK |
  250. USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK;
  251. brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_LDO_CTL);
  252. /* wait for lock */
  253. while (timeout_ms-- > 0) {
  254. reg = brcm_usb_readl(usb_phy + USB_PHY_STATUS);
  255. if (reg & USB_PHY_STATUS_pll_lock_MASK)
  256. break;
  257. usleep_range(1000, 2000);
  258. }
  259. /* Set the PHY_MODE */
  260. reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
  261. reg &= ~USB_PHY_UTMI_CTL_1_PHY_MODE_MASK;
  262. reg |= params->supported_port_modes << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT;
  263. brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
  264. usb_init_common(params);
  265. /*
  266. * The BDC controller will get occasional failures with
  267. * the default "Read Transaction Size" of 6 (1024 bytes).
  268. * Set it to 4 (256 bytes).
  269. */
  270. if ((params->supported_port_modes != USB_CTLR_MODE_HOST) && bdc_ec) {
  271. reg = brcm_usb_readl(bdc_ec + BDC_EC_AXIRDA);
  272. reg &= ~BDC_EC_AXIRDA_RTS_MASK;
  273. reg |= (0x4 << BDC_EC_AXIRDA_RTS_SHIFT);
  274. brcm_usb_writel(reg, bdc_ec + BDC_EC_AXIRDA);
  275. }
  276. /*
  277. * Disable FSM, otherwise the PHY will auto suspend when no
  278. * device is connected and will be reset on resume.
  279. */
  280. reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
  281. reg &= ~USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
  282. brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
  283. usb2_eye_fix_7211b0(params);
  284. }
  285. static void usb_init_common_7216(struct brcm_usb_init_params *params)
  286. {
  287. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  288. USB_CTRL_UNSET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
  289. /*
  290. * The PHY might be in a bad state if it is already powered
  291. * up. Toggle the power just in case.
  292. */
  293. USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
  294. USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
  295. /* 1 millisecond - for USB clocks to settle down */
  296. usleep_range(1000, 2000);
  297. /*
  298. * Disable PHY when port is suspended
  299. * Does not work in DRD mode
  300. */
  301. if (params->supported_port_modes != USB_CTLR_MODE_DRD)
  302. USB_CTRL_SET(ctrl, P0_U2PHY_CFG1, COMMONONN);
  303. usb_wake_enable_7216(params, false);
  304. usb_init_common(params);
  305. }
  306. static void usb_init_xhci(struct brcm_usb_init_params *params)
  307. {
  308. pr_debug("%s\n", __func__);
  309. xhci_soft_reset(params, 0);
  310. }
  311. static void usb_uninit_common_7216(struct brcm_usb_init_params *params)
  312. {
  313. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  314. pr_debug("%s\n", __func__);
  315. if (params->wake_enabled) {
  316. /* Switch to using slower clock during suspend to save power */
  317. USB_CTRL_SET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
  318. usb_wake_enable_7216(params, true);
  319. } else {
  320. USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
  321. }
  322. }
  323. static void usb_init_common_74110(struct brcm_usb_init_params *params)
  324. {
  325. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  326. u32 reg;
  327. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM));
  328. reg &= ~(USB_CTRL_MASK(USB_PM, REF_S2_CLK_SWITCH_EN) |
  329. USB_CTRL_MASK(USB_PM, UTMI_S2_CLK_SWITCH_EN));
  330. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM));
  331. usb_init_common_7216(params);
  332. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, P0_U2PHY_CFG2));
  333. reg &= ~(USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_MASK |
  334. USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_MASK |
  335. USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_MASK);
  336. reg |= (0x6 << USB_CTRL_P0_U2PHY_CFG2_TXVREFTUNE0_SHIFT) |
  337. (0x3 << USB_CTRL_P0_U2PHY_CFG2_TXRESTUNE0_SHIFT) |
  338. (0x2 << USB_CTRL_P0_U2PHY_CFG2_TXPREEMPAMPTUNE0_SHIFT);
  339. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, P0_U2PHY_CFG2));
  340. }
  341. static void usb_uninit_common_74110(struct brcm_usb_init_params *params)
  342. {
  343. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  344. u32 reg;
  345. if (params->wake_enabled) {
  346. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM));
  347. reg |= (USB_CTRL_MASK(USB_PM, REF_S2_CLK_SWITCH_EN) |
  348. USB_CTRL_MASK(USB_PM, UTMI_S2_CLK_SWITCH_EN));
  349. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM));
  350. }
  351. usb_uninit_common_7216(params);
  352. }
  353. static void usb_uninit_common_7211b0(struct brcm_usb_init_params *params)
  354. {
  355. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  356. void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
  357. u32 reg;
  358. pr_debug("%s\n", __func__);
  359. if (params->wake_enabled) {
  360. USB_CTRL_SET(ctrl, TEST_PORT_CTL, TPOUT_SEL_PME_GEN);
  361. usb_wake_enable_7211b0(params, true);
  362. } else {
  363. USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
  364. brcm_usb_writel(0, usb_phy + USB_PHY_PLL_LDO_CTL);
  365. reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
  366. reg &= ~USB_PHY_PLL_CTL_PLL_RESETB_MASK;
  367. brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
  368. brcm_usb_writel(USB_PHY_IDDQ_phy_iddq_MASK,
  369. usb_phy + USB_PHY_IDDQ);
  370. }
  371. }
  372. static void usb_uninit_xhci(struct brcm_usb_init_params *params)
  373. {
  374. pr_debug("%s\n", __func__);
  375. if (!params->wake_enabled)
  376. xhci_soft_reset(params, 1);
  377. }
  378. static int usb_get_dual_select(struct brcm_usb_init_params *params)
  379. {
  380. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  381. u32 reg = 0;
  382. pr_debug("%s\n", __func__);
  383. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  384. reg &= USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
  385. return reg;
  386. }
  387. static void usb_set_dual_select(struct brcm_usb_init_params *params)
  388. {
  389. void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
  390. u32 reg;
  391. pr_debug("%s\n", __func__);
  392. reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  393. reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
  394. reg |= params->port_mode;
  395. brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
  396. }
  397. static const struct brcm_usb_init_ops bcm74110_ops = {
  398. .init_ipp = usb_init_ipp,
  399. .init_common = usb_init_common_74110,
  400. .init_xhci = usb_init_xhci,
  401. .uninit_common = usb_uninit_common_74110,
  402. .uninit_xhci = usb_uninit_xhci,
  403. .get_dual_select = usb_get_dual_select,
  404. .set_dual_select = usb_set_dual_select,
  405. };
  406. static const struct brcm_usb_init_ops bcm7216_ops = {
  407. .init_ipp = usb_init_ipp,
  408. .init_common = usb_init_common_7216,
  409. .init_xhci = usb_init_xhci,
  410. .uninit_common = usb_uninit_common_7216,
  411. .uninit_xhci = usb_uninit_xhci,
  412. .get_dual_select = usb_get_dual_select,
  413. .set_dual_select = usb_set_dual_select,
  414. };
  415. static const struct brcm_usb_init_ops bcm7211b0_ops = {
  416. .init_ipp = usb_init_ipp,
  417. .init_common = usb_init_common_7211b0,
  418. .init_xhci = usb_init_xhci,
  419. .uninit_common = usb_uninit_common_7211b0,
  420. .uninit_xhci = usb_uninit_xhci,
  421. .get_dual_select = usb_get_dual_select,
  422. .set_dual_select = usb_set_dual_select,
  423. };
  424. void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params)
  425. {
  426. params->family_name = "74110";
  427. params->ops = &bcm74110_ops;
  428. }
  429. void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params)
  430. {
  431. pr_debug("%s\n", __func__);
  432. params->family_name = "7216";
  433. params->ops = &bcm7216_ops;
  434. }
  435. void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params)
  436. {
  437. pr_debug("%s\n", __func__);
  438. params->family_name = "7211";
  439. params->ops = &bcm7211b0_ops;
  440. }