diff options
Diffstat (limited to 'drivers/phy')
| -rw-r--r-- | drivers/phy/broadcom/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c | 59 | ||||
| -rw-r--r-- | drivers/phy/broadcom/phy-brcm-usb-init.h | 2 | ||||
| -rw-r--r-- | drivers/phy/broadcom/phy-brcm-usb.c | 18 |
4 files changed, 79 insertions, 2 deletions
diff --git a/drivers/phy/broadcom/Kconfig b/drivers/phy/broadcom/Kconfig index 1d89a2fd9b79..a67ac49a0d59 100644 --- a/drivers/phy/broadcom/Kconfig +++ b/drivers/phy/broadcom/Kconfig @@ -93,7 +93,7 @@ config PHY_BRCM_SATA config PHY_BRCM_USB tristate "Broadcom STB USB PHY driver" - depends on ARCH_BCMBCA || ARCH_BRCMSTB || COMPILE_TEST + depends on ARCH_BCMBCA || ARCH_BRCMSTB || ARCH_BCM2835 || COMPILE_TEST depends on OF select GENERIC_PHY select SOC_BRCMSTB if ARCH_BRCMSTB diff --git a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c index 8a5ed50f2da0..71e9c4c6dd97 100644 --- a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c +++ b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c @@ -356,6 +356,36 @@ static void usb_init_common_7216(struct brcm_usb_init_params *params) usb_init_common(params); } +static void usb_init_common_2712(struct brcm_usb_init_params *params) +{ + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; + void __iomem *bdc_ec = params->regs[BRCM_REGS_BDC_EC]; + u32 reg; + + if (params->syscon_piarbctl) + syscon_piarbctl_init(params->syscon_piarbctl); + + USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN); + + usb_wake_enable_7211b0(params, false); + + usb_init_common(params); + + /* + * The BDC controller will get occasional failures with + * the default "Read Transaction Size" of 6 (1024 bytes). + * Set it to 4 (256 bytes). + */ + if ((params->supported_port_modes != USB_CTLR_MODE_HOST) && bdc_ec) { + reg = brcm_usb_readl(bdc_ec + BDC_EC_AXIRDA); + reg &= ~BDC_EC_AXIRDA_RTS_MASK; + reg |= (0x4 << BDC_EC_AXIRDA_RTS_SHIFT); + brcm_usb_writel(reg, bdc_ec + BDC_EC_AXIRDA); + } + + usb2_eye_fix_7211b0(params); +} + static void usb_init_xhci(struct brcm_usb_init_params *params) { pr_debug("%s\n", __func__); @@ -437,6 +467,18 @@ static void usb_uninit_common_7211b0(struct brcm_usb_init_params *params) } +static void usb_uninit_common_2712(struct brcm_usb_init_params *params) +{ + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; + + if (params->wake_enabled) { + USB_CTRL_SET(ctrl, TEST_PORT_CTL, TPOUT_SEL_PME_GEN); + usb_wake_enable_7211b0(params, true); + } else { + USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN); + } +} + static void usb_uninit_xhci(struct brcm_usb_init_params *params) { @@ -501,6 +543,16 @@ static const struct brcm_usb_init_ops bcm7211b0_ops = { .set_dual_select = usb_set_dual_select, }; +static const struct brcm_usb_init_ops bcm2712_ops = { + .init_ipp = usb_init_ipp, + .init_common = usb_init_common_2712, + .init_xhci = usb_init_xhci, + .uninit_common = usb_uninit_common_2712, + .uninit_xhci = usb_uninit_xhci, + .get_dual_select = usb_get_dual_select, + .set_dual_select = usb_set_dual_select, +}; + void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params) { params->family_name = "74110"; @@ -524,3 +576,10 @@ void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params) params->family_name = "7211"; params->ops = &bcm7211b0_ops; } + +void brcm_usb_dvr_init_2712(struct brcm_usb_init_params *params) +{ + params->family_name = "2712"; + params->ops = &bcm2712_ops; + params->suspend_with_clocks = true; +} diff --git a/drivers/phy/broadcom/phy-brcm-usb-init.h b/drivers/phy/broadcom/phy-brcm-usb-init.h index 4c7be78d0b14..533c111e7cd6 100644 --- a/drivers/phy/broadcom/phy-brcm-usb-init.h +++ b/drivers/phy/broadcom/phy-brcm-usb-init.h @@ -70,6 +70,7 @@ struct brcm_usb_init_params { const struct brcm_usb_init_ops *ops; struct regmap *syscon_piarbctl; bool wake_enabled; + bool suspend_with_clocks; }; void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params); @@ -77,6 +78,7 @@ void brcm_usb_dvr_init_4908(struct brcm_usb_init_params *params); void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params); void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params); void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params); +void brcm_usb_dvr_init_2712(struct brcm_usb_init_params *params); static inline u32 brcm_usb_readl(void __iomem *addr) { diff --git a/drivers/phy/broadcom/phy-brcm-usb.c b/drivers/phy/broadcom/phy-brcm-usb.c index 59d756a10d6c..5e1ca5a24e47 100644 --- a/drivers/phy/broadcom/phy-brcm-usb.c +++ b/drivers/phy/broadcom/phy-brcm-usb.c @@ -75,7 +75,7 @@ struct brcm_usb_phy_data { }; static s8 *node_reg_names[BRCM_REGS_MAX] = { - "crtl", "xhci_ec", "xhci_gbl", "usb_phy", "usb_mdio", "bdc_ec" + "ctrl", "xhci_ec", "xhci_gbl", "usb_phy", "usb_mdio", "bdc_ec" }; static int brcm_pm_notifier(struct notifier_block *notifier, @@ -325,6 +325,18 @@ static const struct match_chip_info chip_info_7211b0 = { .optional_reg = BRCM_REGS_BDC_EC, }; +static const struct match_chip_info chip_info_2712 = { + .init_func = &brcm_usb_dvr_init_2712, + .required_regs = { + BRCM_REGS_CTRL, + BRCM_REGS_XHCI_EC, + BRCM_REGS_XHCI_GBL, + BRCM_REGS_USB_MDIO, + -1, + }, + .optional_reg = BRCM_REGS_BDC_EC, +}; + static const struct match_chip_info chip_info_7445 = { .init_func = &brcm_usb_dvr_init_7445, .required_regs = { @@ -352,6 +364,10 @@ static const struct of_device_id brcm_usb_dt_ids[] = { .data = &chip_info_7211b0, }, { + .compatible = "brcm,bcm2712-usb-phy", + .data = &chip_info_2712, + }, + { .compatible = "brcm,brcmstb-usb-phy", .data = &chip_info_7445, }, |
