1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2018, Broadcom */
5 * This module contains USB PHY initialization for power up and S3 resume
6 * for newer Synopsys based USB hardware first used on the bcm7216.
9 #include <linux/delay.h>
12 #include <linux/soc/brcmstb/brcmstb.h>
13 #include "phy-brcm-usb-init.h"
15 #define PHY_LOCK_TIMEOUT_MS 200
17 /* Register definitions for syscon piarbctl registers */
18 #define PIARBCTL_CAM 0x00
19 #define PIARBCTL_SPLITTER 0x04
20 #define PIARBCTL_MISC 0x08
21 #define PIARBCTL_MISC_SATA_PRIORITY_MASK GENMASK(3, 0)
22 #define PIARBCTL_MISC_CAM0_MEM_PAGE_MASK GENMASK(7, 4)
23 #define PIARBCTL_MISC_CAM1_MEM_PAGE_MASK GENMASK(11, 8)
24 #define PIARBCTL_MISC_USB_MEM_PAGE_MASK GENMASK(15, 12)
25 #define PIARBCTL_MISC_USB_PRIORITY_MASK GENMASK(19, 16)
26 #define PIARBCTL_MISC_USB_4G_SDRAM_MASK BIT(29)
27 #define PIARBCTL_MISC_USB_SELECT_MASK BIT(30)
28 #define PIARBCTL_MISC_SECURE_MASK BIT(31)
30 #define PIARBCTL_MISC_USB_ONLY_MASK \
31 (PIARBCTL_MISC_USB_SELECT_MASK | \
32 PIARBCTL_MISC_USB_4G_SDRAM_MASK | \
33 PIARBCTL_MISC_USB_PRIORITY_MASK | \
34 PIARBCTL_MISC_USB_MEM_PAGE_MASK)
36 /* Register definitions for the USB CTRL block */
37 #define USB_CTRL_SETUP 0x00
38 #define USB_CTRL_SETUP_IOC_MASK BIT(4)
39 #define USB_CTRL_SETUP_IPP_MASK BIT(5)
40 #define USB_CTRL_SETUP_SOFT_SHUTDOWN_MASK BIT(9)
41 #define USB_CTRL_SETUP_SCB1_EN_MASK BIT(14)
42 #define USB_CTRL_SETUP_SCB2_EN_MASK BIT(15)
43 #define USB_CTRL_SETUP_tca_drv_sel_MASK BIT(24)
44 #define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK BIT(25)
45 #define USB_CTRL_USB_PM 0x04
46 #define USB_CTRL_USB_PM_XHC_S2_CLK_SWITCH_EN_MASK BIT(3)
47 #define USB_CTRL_USB_PM_XHC_PME_EN_MASK BIT(4)
48 #define USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK BIT(22)
49 #define USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK BIT(23)
50 #define USB_CTRL_USB_PM_SOFT_RESET_MASK BIT(30)
51 #define USB_CTRL_USB_PM_USB_PWRDN_MASK BIT(31)
52 #define USB_CTRL_USB_PM_STATUS 0x08
53 #define USB_CTRL_USB_DEVICE_CTL1 0x10
54 #define USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK GENMASK(1, 0)
55 #define USB_CTRL_TEST_PORT_CTL 0x30
56 #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_MASK GENMASK(7, 0)
57 #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_PME_GEN_MASK 0x0000002e
58 #define USB_CTRL_TP_DIAG1 0x34
59 #define USB_CTLR_TP_DIAG1_wake_MASK BIT(1)
60 #define USB_CTRL_CTLR_CSHCR 0x50
61 #define USB_CTRL_CTLR_CSHCR_ctl_pme_en_MASK BIT(18)
62 #define USB_CTRL_P0_U2PHY_CFG1 0x68
63 #define USB_CTRL_P0_U2PHY_CFG1_COMMONONN_MASK BIT(10)
65 /* Register definitions for the USB_PHY block in 7211b0 */
66 #define USB_PHY_PLL_CTL 0x00
67 #define USB_PHY_PLL_CTL_PLL_SUSPEND_MASK BIT(27)
68 #define USB_PHY_PLL_CTL_PLL_RESETB_MASK BIT(30)
69 #define USB_PHY_PLL_LDO_CTL 0x08
70 #define USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK BIT(0)
71 #define USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK BIT(1)
72 #define USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK BIT(2)
73 #define USB_PHY_UTMI_CTL_1 0x04
74 #define USB_PHY_UTMI_CTL_1_PHY_MODE_MASK GENMASK(3, 2)
75 #define USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT 2
76 #define USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK BIT(11)
77 #define USB_PHY_IDDQ 0x1c
78 #define USB_PHY_IDDQ_phy_iddq_MASK BIT(0)
79 #define USB_PHY_STATUS 0x20
80 #define USB_PHY_STATUS_pll_lock_MASK BIT(0)
82 /* Register definitions for the MDIO registers in the DWC2 block of
84 * NOTE: The PHY's MDIO registers are only accessible through the
85 * legacy DesignWare USB controller even though it's not being used.
87 #define USB_GMDIOCSR 0
88 #define USB_GMDIOGEN 4
90 /* Register definitions for the BDC EC block in 7211b0 */
91 #define BDC_EC_AXIRDA 0x0c
92 #define BDC_EC_AXIRDA_RTS_MASK GENMASK(31, 28)
93 #define BDC_EC_AXIRDA_RTS_SHIFT 28
95 #define USB_XHCI_GBL_GUSB2PHYCFG 0x100
96 #define USB_XHCI_GBL_GUSB2PHYCFG_U2_FREECLK_EXISTS_MASK BIT(30)
98 static void usb_mdio_write_7211b0(struct brcm_usb_init_params *params,
99 uint8_t addr, uint16_t data)
101 void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
103 addr &= 0x1f; /* 5-bit address */
104 brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
105 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
107 brcm_usb_writel(0x59020000 | (addr << 18) | data,
108 usb_mdio + USB_GMDIOGEN);
109 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
111 brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
112 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
116 static uint16_t __maybe_unused usb_mdio_read_7211b0(
117 struct brcm_usb_init_params *params, uint8_t addr)
119 void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
121 addr &= 0x1f; /* 5-bit address */
122 brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
123 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
125 brcm_usb_writel(0x69020000 | (addr << 18), usb_mdio + USB_GMDIOGEN);
126 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
128 brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
129 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
131 return brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & 0xffff;
134 static void usb2_eye_fix_7211b0(struct brcm_usb_init_params *params)
137 usb_mdio_write_7211b0(params, 0x1f, 0x80a0);
140 usb_mdio_write_7211b0(params, 0x0a, 0xc6a0);
143 static void xhci_soft_reset(struct brcm_usb_init_params *params,
146 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
147 void __iomem *xhci_gbl = params->regs[BRCM_REGS_XHCI_GBL];
151 USB_CTRL_UNSET(ctrl, USB_PM, XHC_SOFT_RESETB);
152 /* De-assert reset */
154 USB_CTRL_SET(ctrl, USB_PM, XHC_SOFT_RESETB);
155 /* Required for COMMONONN to be set */
156 USB_XHCI_GBL_UNSET(xhci_gbl, GUSB2PHYCFG, U2_FREECLK_EXISTS);
160 static void usb_init_ipp(struct brcm_usb_init_params *params)
162 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
166 pr_debug("%s\n", __func__);
168 orig_reg = reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP));
169 if (params->ipp != 2)
170 /* override ipp strap pin (if it exits) */
171 reg &= ~(USB_CTRL_MASK(SETUP, STRAP_IPP_SEL));
173 /* Override the default OC and PP polarity */
174 reg &= ~(USB_CTRL_MASK(SETUP, IPP) | USB_CTRL_MASK(SETUP, IOC));
176 reg |= USB_CTRL_MASK(SETUP, IOC);
177 if (params->ipp == 1)
178 reg |= USB_CTRL_MASK(SETUP, IPP);
179 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP));
182 * If we're changing IPP, make sure power is off long enough
183 * to turn off any connected devices.
185 if ((reg ^ orig_reg) & USB_CTRL_MASK(SETUP, IPP))
189 static void syscon_piarbctl_init(struct regmap *rmap)
191 /* Switch from legacy USB OTG controller to new STB USB controller */
192 regmap_update_bits(rmap, PIARBCTL_MISC, PIARBCTL_MISC_USB_ONLY_MASK,
193 PIARBCTL_MISC_USB_SELECT_MASK |
194 PIARBCTL_MISC_USB_4G_SDRAM_MASK);
197 static void usb_init_common(struct brcm_usb_init_params *params)
200 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
202 pr_debug("%s\n", __func__);
204 if (USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE)) {
205 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
206 reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
207 reg |= params->port_mode;
208 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
210 switch (params->supported_port_modes) {
211 case USB_CTLR_MODE_HOST:
212 USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
215 USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
216 USB_CTRL_SET(ctrl, USB_PM, BDC_SOFT_RESETB);
221 static void usb_wake_enable_7211b0(struct brcm_usb_init_params *params,
224 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
227 USB_CTRL_SET(ctrl, CTLR_CSHCR, ctl_pme_en);
229 USB_CTRL_UNSET(ctrl, CTLR_CSHCR, ctl_pme_en);
232 static void usb_wake_enable_7216(struct brcm_usb_init_params *params,
235 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
238 USB_CTRL_SET(ctrl, USB_PM, XHC_PME_EN);
240 USB_CTRL_UNSET(ctrl, USB_PM, XHC_PME_EN);
243 static void usb_init_common_7211b0(struct brcm_usb_init_params *params)
245 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
246 void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
247 void __iomem *bdc_ec = params->regs[BRCM_REGS_BDC_EC];
248 int timeout_ms = PHY_LOCK_TIMEOUT_MS;
251 if (params->syscon_piarbctl)
252 syscon_piarbctl_init(params->syscon_piarbctl);
254 USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
256 usb_wake_enable_7211b0(params, false);
257 if (!params->wake_enabled) {
259 /* undo possible suspend settings */
260 brcm_usb_writel(0, usb_phy + USB_PHY_IDDQ);
261 reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
262 reg |= USB_PHY_PLL_CTL_PLL_RESETB_MASK;
263 brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
265 /* temporarily enable FSM so PHY comes up properly */
266 reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
267 reg |= USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
268 brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
271 /* Disable PLL auto suspend */
272 reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
273 reg |= USB_PHY_PLL_CTL_PLL_SUSPEND_MASK;
274 brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
277 reg = USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK |
278 USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK |
279 USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK;
280 brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_LDO_CTL);
283 while (timeout_ms-- > 0) {
284 reg = brcm_usb_readl(usb_phy + USB_PHY_STATUS);
285 if (reg & USB_PHY_STATUS_pll_lock_MASK)
287 usleep_range(1000, 2000);
290 /* Set the PHY_MODE */
291 reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
292 reg &= ~USB_PHY_UTMI_CTL_1_PHY_MODE_MASK;
293 reg |= params->supported_port_modes << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT;
294 brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
296 usb_init_common(params);
299 * The BDC controller will get occasional failures with
300 * the default "Read Transaction Size" of 6 (1024 bytes).
301 * Set it to 4 (256 bytes).
303 if ((params->supported_port_modes != USB_CTLR_MODE_HOST) && bdc_ec) {
304 reg = brcm_usb_readl(bdc_ec + BDC_EC_AXIRDA);
305 reg &= ~BDC_EC_AXIRDA_RTS_MASK;
306 reg |= (0x4 << BDC_EC_AXIRDA_RTS_SHIFT);
307 brcm_usb_writel(reg, bdc_ec + BDC_EC_AXIRDA);
311 * Disable FSM, otherwise the PHY will auto suspend when no
312 * device is connected and will be reset on resume.
314 reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
315 reg &= ~USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
316 brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
318 usb2_eye_fix_7211b0(params);
321 static void usb_init_common_7216(struct brcm_usb_init_params *params)
323 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
325 USB_CTRL_UNSET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
326 USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
328 /* 1 millisecond - for USB clocks to settle down */
329 usleep_range(1000, 2000);
331 /* Disable PHY when port is suspended */
332 USB_CTRL_SET(ctrl, P0_U2PHY_CFG1, COMMONONN);
334 usb_wake_enable_7216(params, false);
335 usb_init_common(params);
338 static void usb_init_xhci(struct brcm_usb_init_params *params)
340 pr_debug("%s\n", __func__);
342 xhci_soft_reset(params, 0);
345 static void usb_uninit_common_7216(struct brcm_usb_init_params *params)
347 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
349 pr_debug("%s\n", __func__);
351 if (params->wake_enabled) {
352 /* Switch to using slower clock during suspend to save power */
353 USB_CTRL_SET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
354 usb_wake_enable_7216(params, true);
356 USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
360 static void usb_uninit_common_7211b0(struct brcm_usb_init_params *params)
362 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
363 void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
366 pr_debug("%s\n", __func__);
368 if (params->wake_enabled) {
369 USB_CTRL_SET(ctrl, TEST_PORT_CTL, TPOUT_SEL_PME_GEN);
370 usb_wake_enable_7211b0(params, true);
372 USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
373 brcm_usb_writel(0, usb_phy + USB_PHY_PLL_LDO_CTL);
374 reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
375 reg &= ~USB_PHY_PLL_CTL_PLL_RESETB_MASK;
376 brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
377 brcm_usb_writel(USB_PHY_IDDQ_phy_iddq_MASK,
378 usb_phy + USB_PHY_IDDQ);
383 static void usb_uninit_xhci(struct brcm_usb_init_params *params)
386 pr_debug("%s\n", __func__);
388 if (!params->wake_enabled)
389 xhci_soft_reset(params, 1);
392 static int usb_get_dual_select(struct brcm_usb_init_params *params)
394 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
397 pr_debug("%s\n", __func__);
399 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
400 reg &= USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
404 static void usb_set_dual_select(struct brcm_usb_init_params *params)
406 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
409 pr_debug("%s\n", __func__);
411 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
412 reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
413 reg |= params->port_mode;
414 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
417 static const struct brcm_usb_init_ops bcm7216_ops = {
418 .init_ipp = usb_init_ipp,
419 .init_common = usb_init_common_7216,
420 .init_xhci = usb_init_xhci,
421 .uninit_common = usb_uninit_common_7216,
422 .uninit_xhci = usb_uninit_xhci,
423 .get_dual_select = usb_get_dual_select,
424 .set_dual_select = usb_set_dual_select,
427 static const struct brcm_usb_init_ops bcm7211b0_ops = {
428 .init_ipp = usb_init_ipp,
429 .init_common = usb_init_common_7211b0,
430 .init_xhci = usb_init_xhci,
431 .uninit_common = usb_uninit_common_7211b0,
432 .uninit_xhci = usb_uninit_xhci,
433 .get_dual_select = usb_get_dual_select,
434 .set_dual_select = usb_set_dual_select,
437 void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params)
440 pr_debug("%s\n", __func__);
442 params->family_name = "7216";
443 params->ops = &bcm7216_ops;
446 void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params)
449 pr_debug("%s\n", __func__);
451 params->family_name = "7211";
452 params->ops = &bcm7211b0_ops;