0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/delay.h>
0010 #include <linux/io.h>
0011
0012 #include <linux/soc/brcmstb/brcmstb.h>
0013 #include "phy-brcm-usb-init.h"
0014
0015 #define PHY_LOCK_TIMEOUT_MS 200
0016
0017
0018 #define PIARBCTL_CAM 0x00
0019 #define PIARBCTL_SPLITTER 0x04
0020 #define PIARBCTL_MISC 0x08
0021 #define PIARBCTL_MISC_SECURE_MASK 0x80000000
0022 #define PIARBCTL_MISC_USB_SELECT_MASK 0x40000000
0023 #define PIARBCTL_MISC_USB_4G_SDRAM_MASK 0x20000000
0024 #define PIARBCTL_MISC_USB_PRIORITY_MASK 0x000f0000
0025 #define PIARBCTL_MISC_USB_MEM_PAGE_MASK 0x0000f000
0026 #define PIARBCTL_MISC_CAM1_MEM_PAGE_MASK 0x00000f00
0027 #define PIARBCTL_MISC_CAM0_MEM_PAGE_MASK 0x000000f0
0028 #define PIARBCTL_MISC_SATA_PRIORITY_MASK 0x0000000f
0029
0030 #define PIARBCTL_MISC_USB_ONLY_MASK \
0031 (PIARBCTL_MISC_USB_SELECT_MASK | \
0032 PIARBCTL_MISC_USB_4G_SDRAM_MASK | \
0033 PIARBCTL_MISC_USB_PRIORITY_MASK | \
0034 PIARBCTL_MISC_USB_MEM_PAGE_MASK)
0035
0036
0037 #define USB_CTRL_SETUP 0x00
0038 #define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK 0x02000000
0039 #define USB_CTRL_SETUP_SCB2_EN_MASK 0x00008000
0040 #define USB_CTRL_SETUP_tca_drv_sel_MASK 0x01000000
0041 #define USB_CTRL_SETUP_SCB1_EN_MASK 0x00004000
0042 #define USB_CTRL_SETUP_SOFT_SHUTDOWN_MASK 0x00000200
0043 #define USB_CTRL_SETUP_IPP_MASK 0x00000020
0044 #define USB_CTRL_SETUP_IOC_MASK 0x00000010
0045 #define USB_CTRL_USB_PM 0x04
0046 #define USB_CTRL_USB_PM_USB_PWRDN_MASK 0x80000000
0047 #define USB_CTRL_USB_PM_SOFT_RESET_MASK 0x40000000
0048 #define USB_CTRL_USB_PM_BDC_SOFT_RESETB_MASK 0x00800000
0049 #define USB_CTRL_USB_PM_XHC_SOFT_RESETB_MASK 0x00400000
0050 #define USB_CTRL_USB_PM_XHC_PME_EN_MASK 0x00000010
0051 #define USB_CTRL_USB_PM_XHC_S2_CLK_SWITCH_EN_MASK 0x00000008
0052 #define USB_CTRL_USB_PM_STATUS 0x08
0053 #define USB_CTRL_USB_DEVICE_CTL1 0x10
0054 #define USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK 0x00000003
0055 #define USB_CTRL_TEST_PORT_CTL 0x30
0056 #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_MASK 0x000000ff
0057 #define USB_CTRL_TEST_PORT_CTL_TPOUT_SEL_PME_GEN_MASK 0x0000002e
0058 #define USB_CTRL_TP_DIAG1 0x34
0059 #define USB_CTLR_TP_DIAG1_wake_MASK 0x00000002
0060 #define USB_CTRL_CTLR_CSHCR 0x50
0061 #define USB_CTRL_CTLR_CSHCR_ctl_pme_en_MASK 0x00040000
0062
0063
0064 #define USB_PHY_PLL_CTL 0x00
0065 #define USB_PHY_PLL_CTL_PLL_RESETB_MASK 0x40000000
0066 #define USB_PHY_PLL_LDO_CTL 0x08
0067 #define USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK 0x00000004
0068 #define USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK 0x00000002
0069 #define USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK 0x00000001
0070 #define USB_PHY_UTMI_CTL_1 0x04
0071 #define USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK 0x00000800
0072 #define USB_PHY_UTMI_CTL_1_PHY_MODE_MASK 0x0000000c
0073 #define USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT 2
0074 #define USB_PHY_IDDQ 0x1c
0075 #define USB_PHY_IDDQ_phy_iddq_MASK 0x00000001
0076 #define USB_PHY_STATUS 0x20
0077 #define USB_PHY_STATUS_pll_lock_MASK 0x00000001
0078
0079
0080
0081
0082
0083
0084 #define USB_GMDIOCSR 0
0085 #define USB_GMDIOGEN 4
0086
0087
0088 #define BDC_EC_AXIRDA 0x0c
0089 #define BDC_EC_AXIRDA_RTS_MASK 0xf0000000
0090 #define BDC_EC_AXIRDA_RTS_SHIFT 28
0091
0092
0093 static void usb_mdio_write_7211b0(struct brcm_usb_init_params *params,
0094 uint8_t addr, uint16_t data)
0095 {
0096 void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
0097
0098 addr &= 0x1f;
0099 brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
0100 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
0101 ;
0102 brcm_usb_writel(0x59020000 | (addr << 18) | data,
0103 usb_mdio + USB_GMDIOGEN);
0104 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
0105 ;
0106 brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
0107 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
0108 ;
0109 }
0110
0111 static uint16_t __maybe_unused usb_mdio_read_7211b0(
0112 struct brcm_usb_init_params *params, uint8_t addr)
0113 {
0114 void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
0115
0116 addr &= 0x1f;
0117 brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
0118 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
0119 ;
0120 brcm_usb_writel(0x69020000 | (addr << 18), usb_mdio + USB_GMDIOGEN);
0121 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
0122 ;
0123 brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
0124 while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
0125 ;
0126 return brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & 0xffff;
0127 }
0128
0129 static void usb2_eye_fix_7211b0(struct brcm_usb_init_params *params)
0130 {
0131
0132 usb_mdio_write_7211b0(params, 0x1f, 0x80a0);
0133
0134
0135 usb_mdio_write_7211b0(params, 0x0a, 0xc6a0);
0136 }
0137
0138 static void xhci_soft_reset(struct brcm_usb_init_params *params,
0139 int on_off)
0140 {
0141 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0142
0143
0144 if (on_off)
0145 USB_CTRL_UNSET(ctrl, USB_PM, XHC_SOFT_RESETB);
0146
0147 else
0148 USB_CTRL_SET(ctrl, USB_PM, XHC_SOFT_RESETB);
0149 }
0150
0151 static void usb_init_ipp(struct brcm_usb_init_params *params)
0152 {
0153 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0154 u32 reg;
0155 u32 orig_reg;
0156
0157 pr_debug("%s\n", __func__);
0158
0159 orig_reg = reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP));
0160 if (params->ipp != 2)
0161
0162 reg &= ~(USB_CTRL_MASK(SETUP, STRAP_IPP_SEL));
0163
0164
0165 reg &= ~(USB_CTRL_MASK(SETUP, IPP) | USB_CTRL_MASK(SETUP, IOC));
0166 if (params->ioc)
0167 reg |= USB_CTRL_MASK(SETUP, IOC);
0168 if (params->ipp == 1)
0169 reg |= USB_CTRL_MASK(SETUP, IPP);
0170 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP));
0171
0172
0173
0174
0175
0176 if ((reg ^ orig_reg) & USB_CTRL_MASK(SETUP, IPP))
0177 msleep(50);
0178 }
0179
0180 static void syscon_piarbctl_init(struct regmap *rmap)
0181 {
0182
0183 regmap_update_bits(rmap, PIARBCTL_MISC, PIARBCTL_MISC_USB_ONLY_MASK,
0184 PIARBCTL_MISC_USB_SELECT_MASK |
0185 PIARBCTL_MISC_USB_4G_SDRAM_MASK);
0186 }
0187
0188 static void usb_init_common(struct brcm_usb_init_params *params)
0189 {
0190 u32 reg;
0191 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0192
0193 pr_debug("%s\n", __func__);
0194
0195 if (USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE)) {
0196 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
0197 reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
0198 reg |= params->mode;
0199 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
0200 }
0201 switch (params->mode) {
0202 case USB_CTLR_MODE_HOST:
0203 USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
0204 break;
0205 default:
0206 USB_CTRL_UNSET(ctrl, USB_PM, BDC_SOFT_RESETB);
0207 USB_CTRL_SET(ctrl, USB_PM, BDC_SOFT_RESETB);
0208 break;
0209 }
0210 }
0211
0212 static void usb_wake_enable_7211b0(struct brcm_usb_init_params *params,
0213 bool enable)
0214 {
0215 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0216
0217 if (enable)
0218 USB_CTRL_SET(ctrl, CTLR_CSHCR, ctl_pme_en);
0219 else
0220 USB_CTRL_UNSET(ctrl, CTLR_CSHCR, ctl_pme_en);
0221 }
0222
0223 static void usb_wake_enable_7216(struct brcm_usb_init_params *params,
0224 bool enable)
0225 {
0226 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0227
0228 if (enable)
0229 USB_CTRL_SET(ctrl, USB_PM, XHC_PME_EN);
0230 else
0231 USB_CTRL_UNSET(ctrl, USB_PM, XHC_PME_EN);
0232 }
0233
0234 static void usb_init_common_7211b0(struct brcm_usb_init_params *params)
0235 {
0236 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0237 void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
0238 void __iomem *bdc_ec = params->regs[BRCM_REGS_BDC_EC];
0239 int timeout_ms = PHY_LOCK_TIMEOUT_MS;
0240 u32 reg;
0241
0242 if (params->syscon_piarbctl)
0243 syscon_piarbctl_init(params->syscon_piarbctl);
0244
0245 USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
0246
0247 usb_wake_enable_7211b0(params, false);
0248 if (!params->wake_enabled) {
0249
0250
0251 brcm_usb_writel(0, usb_phy + USB_PHY_IDDQ);
0252 reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
0253 reg |= USB_PHY_PLL_CTL_PLL_RESETB_MASK;
0254 brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
0255
0256
0257 reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
0258 reg |= USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
0259 brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
0260 }
0261
0262
0263 reg = USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK |
0264 USB_PHY_PLL_LDO_CTL_AFE_LDO_PWRDWNB_MASK |
0265 USB_PHY_PLL_LDO_CTL_AFE_BG_PWRDWNB_MASK;
0266 brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_LDO_CTL);
0267
0268
0269 while (timeout_ms-- > 0) {
0270 reg = brcm_usb_readl(usb_phy + USB_PHY_STATUS);
0271 if (reg & USB_PHY_STATUS_pll_lock_MASK)
0272 break;
0273 usleep_range(1000, 2000);
0274 }
0275
0276
0277 reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
0278 reg &= ~USB_PHY_UTMI_CTL_1_PHY_MODE_MASK;
0279 reg |= params->mode << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT;
0280 brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
0281
0282 usb_init_common(params);
0283
0284
0285
0286
0287
0288
0289 if ((params->mode != USB_CTLR_MODE_HOST) && bdc_ec) {
0290 reg = brcm_usb_readl(bdc_ec + BDC_EC_AXIRDA);
0291 reg &= ~BDC_EC_AXIRDA_RTS_MASK;
0292 reg |= (0x4 << BDC_EC_AXIRDA_RTS_SHIFT);
0293 brcm_usb_writel(reg, bdc_ec + BDC_EC_AXIRDA);
0294 }
0295
0296
0297
0298
0299
0300 reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
0301 reg &= ~USB_PHY_UTMI_CTL_1_POWER_UP_FSM_EN_MASK;
0302 brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
0303
0304 usb2_eye_fix_7211b0(params);
0305 }
0306
0307 static void usb_init_common_7216(struct brcm_usb_init_params *params)
0308 {
0309 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0310
0311 USB_CTRL_UNSET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
0312 USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN);
0313
0314
0315 usleep_range(1000, 2000);
0316
0317 usb_wake_enable_7216(params, false);
0318 usb_init_common(params);
0319 }
0320
0321 static void usb_init_xhci(struct brcm_usb_init_params *params)
0322 {
0323 pr_debug("%s\n", __func__);
0324
0325 xhci_soft_reset(params, 0);
0326 }
0327
0328 static void usb_uninit_common_7216(struct brcm_usb_init_params *params)
0329 {
0330 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0331
0332 pr_debug("%s\n", __func__);
0333
0334 if (!params->wake_enabled) {
0335 USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
0336
0337
0338 USB_CTRL_SET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN);
0339 } else {
0340 usb_wake_enable_7216(params, true);
0341 }
0342 }
0343
0344 static void usb_uninit_common_7211b0(struct brcm_usb_init_params *params)
0345 {
0346 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0347 void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
0348 u32 reg;
0349
0350 pr_debug("%s\n", __func__);
0351
0352 if (params->wake_enabled) {
0353 USB_CTRL_SET(ctrl, TEST_PORT_CTL, TPOUT_SEL_PME_GEN);
0354 usb_wake_enable_7211b0(params, true);
0355 } else {
0356 USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN);
0357 brcm_usb_writel(0, usb_phy + USB_PHY_PLL_LDO_CTL);
0358 reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_CTL);
0359 reg &= ~USB_PHY_PLL_CTL_PLL_RESETB_MASK;
0360 brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_CTL);
0361 brcm_usb_writel(USB_PHY_IDDQ_phy_iddq_MASK,
0362 usb_phy + USB_PHY_IDDQ);
0363 }
0364
0365 }
0366
0367 static void usb_uninit_xhci(struct brcm_usb_init_params *params)
0368 {
0369
0370 pr_debug("%s\n", __func__);
0371
0372 if (!params->wake_enabled)
0373 xhci_soft_reset(params, 1);
0374 }
0375
0376 static int usb_get_dual_select(struct brcm_usb_init_params *params)
0377 {
0378 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0379 u32 reg = 0;
0380
0381 pr_debug("%s\n", __func__);
0382
0383 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
0384 reg &= USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
0385 return reg;
0386 }
0387
0388 static void usb_set_dual_select(struct brcm_usb_init_params *params, int mode)
0389 {
0390 void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
0391 u32 reg;
0392
0393 pr_debug("%s\n", __func__);
0394
0395 reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
0396 reg &= ~USB_CTRL_MASK(USB_DEVICE_CTL1, PORT_MODE);
0397 reg |= mode;
0398 brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1));
0399 }
0400
0401 static const struct brcm_usb_init_ops bcm7216_ops = {
0402 .init_ipp = usb_init_ipp,
0403 .init_common = usb_init_common_7216,
0404 .init_xhci = usb_init_xhci,
0405 .uninit_common = usb_uninit_common_7216,
0406 .uninit_xhci = usb_uninit_xhci,
0407 .get_dual_select = usb_get_dual_select,
0408 .set_dual_select = usb_set_dual_select,
0409 };
0410
0411 static const struct brcm_usb_init_ops bcm7211b0_ops = {
0412 .init_ipp = usb_init_ipp,
0413 .init_common = usb_init_common_7211b0,
0414 .init_xhci = usb_init_xhci,
0415 .uninit_common = usb_uninit_common_7211b0,
0416 .uninit_xhci = usb_uninit_xhci,
0417 .get_dual_select = usb_get_dual_select,
0418 .set_dual_select = usb_set_dual_select,
0419 };
0420
0421 void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params)
0422 {
0423
0424 pr_debug("%s\n", __func__);
0425
0426 params->family_name = "7216";
0427 params->ops = &bcm7216_ops;
0428 params->suspend_with_clocks = true;
0429 }
0430
0431 void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params)
0432 {
0433
0434 pr_debug("%s\n", __func__);
0435
0436 params->family_name = "7211";
0437 params->ops = &bcm7211b0_ops;
0438 params->suspend_with_clocks = true;
0439 }