aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm4908/patches-5.4/084-v5.6-0008-phy-usb-Add-support-for-new-Synopsys-USB-controller-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm4908/patches-5.4/084-v5.6-0008-phy-usb-Add-support-for-new-Synopsys-USB-controller-.patch')
-rw-r--r--target/linux/bcm4908/patches-5.4/084-v5.6-0008-phy-usb-Add-support-for-new-Synopsys-USB-controller-.patch680
1 files changed, 0 insertions, 680 deletions
diff --git a/target/linux/bcm4908/patches-5.4/084-v5.6-0008-phy-usb-Add-support-for-new-Synopsys-USB-controller-.patch b/target/linux/bcm4908/patches-5.4/084-v5.6-0008-phy-usb-Add-support-for-new-Synopsys-USB-controller-.patch
deleted file mode 100644
index 008108c589..0000000000
--- a/target/linux/bcm4908/patches-5.4/084-v5.6-0008-phy-usb-Add-support-for-new-Synopsys-USB-controller-.patch
+++ /dev/null
@@ -1,680 +0,0 @@
-From 9d5f51dcdb646c2ed21649d379fbb703994f1ec9 Mon Sep 17 00:00:00 2001
-From: Al Cooper <alcooperx@gmail.com>
-Date: Fri, 3 Jan 2020 13:18:06 -0500
-Subject: [PATCH] phy: usb: Add support for new Synopsys USB controller on the
- 7211b0
-
-The 7211b0 has added the STB XHCI Synopsys controller and it
-will be used instead of the RPi based DWC USB controller. The new
-Synopsys XHCI controller core is the same one that is used on the
-7216, but because of the way the STB USB PHY is used on both the A0
-and B0, some of the PHY control is different.
-
-Signed-off-by: Al Cooper <alcooperx@gmail.com>
-Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
----
- .../phy/broadcom/phy-brcm-usb-init-synopsys.c | 163 +++++++++++++++++-
- drivers/phy/broadcom/phy-brcm-usb-init.c | 31 ++--
- drivers/phy/broadcom/phy-brcm-usb-init.h | 17 +-
- drivers/phy/broadcom/phy-brcm-usb.c | 162 +++++++++++------
- 4 files changed, 295 insertions(+), 78 deletions(-)
-
---- a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
-+++ b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
-@@ -12,10 +12,33 @@
- #include <linux/soc/brcmstb/brcmstb.h>
- #include "phy-brcm-usb-init.h"
-
-+#define PHY_LOCK_TIMEOUT_MS 200
-+
-+/* Register definitions for syscon piarbctl registers */
-+#define PIARBCTL_CAM 0x00
-+#define PIARBCTL_SPLITTER 0x04
-+#define PIARBCTL_MISC 0x08
-+#define PIARBCTL_MISC_SECURE_MASK 0x80000000
-+#define PIARBCTL_MISC_USB_SELECT_MASK 0x40000000
-+#define PIARBCTL_MISC_USB_4G_SDRAM_MASK 0x20000000
-+#define PIARBCTL_MISC_USB_PRIORITY_MASK 0x000f0000
-+#define PIARBCTL_MISC_USB_MEM_PAGE_MASK 0x0000f000
-+#define PIARBCTL_MISC_CAM1_MEM_PAGE_MASK 0x00000f00
-+#define PIARBCTL_MISC_CAM0_MEM_PAGE_MASK 0x000000f0
-+#define PIARBCTL_MISC_SATA_PRIORITY_MASK 0x0000000f
-+#define PIARBCTL_USB_M_ASB_CTRL 0x10
-+
-+#define PIARBCTL_MISC_USB_ONLY_MASK \
-+ (PIARBCTL_MISC_USB_SELECT_MASK | \
-+ PIARBCTL_MISC_USB_4G_SDRAM_MASK | \
-+ PIARBCTL_MISC_USB_PRIORITY_MASK | \
-+ PIARBCTL_MISC_USB_MEM_PAGE_MASK)
-+
- /* Register definitions for the USB CTRL block */
- #define USB_CTRL_SETUP 0x00
- #define USB_CTRL_SETUP_STRAP_IPP_SEL_MASK 0x02000000
- #define USB_CTRL_SETUP_SCB2_EN_MASK 0x00008000
-+#define USB_CTRL_SETUP_tca_drv_sel_MASK 0x01000000
- #define USB_CTRL_SETUP_SCB1_EN_MASK 0x00004000
- #define USB_CTRL_SETUP_SOFT_SHUTDOWN_MASK 0x00000200
- #define USB_CTRL_SETUP_IPP_MASK 0x00000020
-@@ -29,11 +52,73 @@
- #define USB_CTRL_USB_DEVICE_CTL1 0x10
- #define USB_CTRL_USB_DEVICE_CTL1_PORT_MODE_MASK 0x00000003
-
-+/* Register definitions for the USB_PHY block in 7211b0 */
-+#define USB_PHY_PLL_LDO_CTL 0x08
-+#define USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK 0x00000004
-+#define USB_PHY_UTMI_CTL_1 0x04
-+#define USB_PHY_UTMI_CTL_1_PHY_MODE_MASK 0x0000000c
-+#define USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT 2
-+#define USB_PHY_STATUS 0x20
-+#define USB_PHY_STATUS_pll_lock_MASK 0x00000001
-+
-+/* Register definitions for the MDIO registers in the DWC2 block of
-+ * the 7211b0.
-+ * NOTE: The PHY's MDIO registers are only accessible through the
-+ * legacy DesignWare USB controller even though it's not being used.
-+ */
-+#define USB_GMDIOCSR 0
-+#define USB_GMDIOGEN 4
-+
-+
-+static void usb_mdio_write_7211b0(struct brcm_usb_init_params *params,
-+ uint8_t addr, uint16_t data)
-+{
-+ void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
-+
-+ addr &= 0x1f; /* 5-bit address */
-+ brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
-+ while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
-+ ;
-+ brcm_usb_writel(0x59020000 | (addr << 18) | data,
-+ usb_mdio + USB_GMDIOGEN);
-+ while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
-+ ;
-+ brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
-+ while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
-+ ;
-+}
-+
-+static uint16_t __maybe_unused usb_mdio_read_7211b0(
-+ struct brcm_usb_init_params *params, uint8_t addr)
-+{
-+ void __iomem *usb_mdio = params->regs[BRCM_REGS_USB_MDIO];
-+
-+ addr &= 0x1f; /* 5-bit address */
-+ brcm_usb_writel(0xffffffff, usb_mdio + USB_GMDIOGEN);
-+ while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
-+ ;
-+ brcm_usb_writel(0x69020000 | (addr << 18), usb_mdio + USB_GMDIOGEN);
-+ while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
-+ ;
-+ brcm_usb_writel(0x00000000, usb_mdio + USB_GMDIOGEN);
-+ while (brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & (1<<31))
-+ ;
-+ return brcm_usb_readl(usb_mdio + USB_GMDIOCSR) & 0xffff;
-+}
-+
-+static void usb2_eye_fix_7211b0(struct brcm_usb_init_params *params)
-+{
-+ /* select bank */
-+ usb_mdio_write_7211b0(params, 0x1f, 0x80a0);
-+
-+ /* Set the eye */
-+ usb_mdio_write_7211b0(params, 0x0a, 0xc6a0);
-+}
-
- static void xhci_soft_reset(struct brcm_usb_init_params *params,
- int on_off)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-
- /* Assert reset */
- if (on_off)
-@@ -45,7 +130,7 @@ static void xhci_soft_reset(struct brcm_
-
- static void usb_init_ipp(struct brcm_usb_init_params *params)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
- u32 reg;
- u32 orig_reg;
-
-@@ -72,10 +157,18 @@ static void usb_init_ipp(struct brcm_usb
- msleep(50);
- }
-
-+static void syscon_piarbctl_init(struct regmap *rmap)
-+{
-+ /* Switch from legacy USB OTG controller to new STB USB controller */
-+ regmap_update_bits(rmap, PIARBCTL_MISC, PIARBCTL_MISC_USB_ONLY_MASK,
-+ PIARBCTL_MISC_USB_SELECT_MASK |
-+ PIARBCTL_MISC_USB_4G_SDRAM_MASK);
-+}
-+
- static void usb_init_common(struct brcm_usb_init_params *params)
- {
- u32 reg;
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-
- pr_debug("%s\n", __func__);
-
-@@ -100,6 +193,45 @@ static void usb_init_common(struct brcm_
- }
- }
-
-+static void usb_init_common_7211b0(struct brcm_usb_init_params *params)
-+{
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-+ void __iomem *usb_phy = params->regs[BRCM_REGS_USB_PHY];
-+ int timeout_ms = PHY_LOCK_TIMEOUT_MS;
-+ u32 reg;
-+
-+ if (params->syscon_piarbctl)
-+ syscon_piarbctl_init(params->syscon_piarbctl);
-+
-+ /* Init the PHY */
-+ reg = brcm_usb_readl(usb_phy + USB_PHY_PLL_LDO_CTL);
-+ reg |= USB_PHY_PLL_LDO_CTL_AFE_CORERDY_MASK;
-+ brcm_usb_writel(reg, usb_phy + USB_PHY_PLL_LDO_CTL);
-+
-+ /* wait for lock */
-+ while (timeout_ms-- > 0) {
-+ reg = brcm_usb_readl(usb_phy + USB_PHY_STATUS);
-+ if (reg & USB_PHY_STATUS_pll_lock_MASK)
-+ break;
-+ usleep_range(1000, 2000);
-+ }
-+
-+ /* Set the PHY_MODE */
-+ reg = brcm_usb_readl(usb_phy + USB_PHY_UTMI_CTL_1);
-+ reg &= ~USB_PHY_UTMI_CTL_1_PHY_MODE_MASK;
-+ reg |= params->mode << USB_PHY_UTMI_CTL_1_PHY_MODE_SHIFT;
-+ brcm_usb_writel(reg, usb_phy + USB_PHY_UTMI_CTL_1);
-+
-+ /* Fix the incorrect default */
-+ reg = brcm_usb_readl(ctrl + USB_CTRL_SETUP);
-+ reg &= ~USB_CTRL_SETUP_tca_drv_sel_MASK;
-+ brcm_usb_writel(reg, ctrl + USB_CTRL_SETUP);
-+
-+ usb_init_common(params);
-+
-+ usb2_eye_fix_7211b0(params);
-+}
-+
- static void usb_init_xhci(struct brcm_usb_init_params *params)
- {
- pr_debug("%s\n", __func__);
-@@ -109,7 +241,7 @@ static void usb_init_xhci(struct brcm_us
-
- static void usb_uninit_common(struct brcm_usb_init_params *params)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-
- pr_debug("%s\n", __func__);
-
-@@ -127,7 +259,7 @@ static void usb_uninit_xhci(struct brcm_
-
- static int usb_get_dual_select(struct brcm_usb_init_params *params)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
- u32 reg = 0;
-
- pr_debug("%s\n", __func__);
-@@ -139,7 +271,7 @@ static int usb_get_dual_select(struct br
-
- static void usb_set_dual_select(struct brcm_usb_init_params *params, int mode)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
- u32 reg;
-
- pr_debug("%s\n", __func__);
-@@ -161,6 +293,16 @@ static const struct brcm_usb_init_ops bc
- .set_dual_select = usb_set_dual_select,
- };
-
-+static const struct brcm_usb_init_ops bcm7211b0_ops = {
-+ .init_ipp = usb_init_ipp,
-+ .init_common = usb_init_common_7211b0,
-+ .init_xhci = usb_init_xhci,
-+ .uninit_common = usb_uninit_common,
-+ .uninit_xhci = usb_uninit_xhci,
-+ .get_dual_select = usb_get_dual_select,
-+ .set_dual_select = usb_set_dual_select,
-+};
-+
- void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params)
- {
-
-@@ -169,3 +311,12 @@ void brcm_usb_dvr_init_7216(struct brcm_
- params->family_name = "7216";
- params->ops = &bcm7216_ops;
- }
-+
-+void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params)
-+{
-+
-+ pr_debug("%s\n", __func__);
-+
-+ params->family_name = "7211";
-+ params->ops = &bcm7211b0_ops;
-+}
---- a/drivers/phy/broadcom/phy-brcm-usb-init.c
-+++ b/drivers/phy/broadcom/phy-brcm-usb-init.c
-@@ -401,7 +401,7 @@ void usb_ctrl_unset_family(struct brcm_u
- u32 mask;
-
- mask = params->usb_reg_bits_map[field];
-- brcm_usb_ctrl_unset(params->ctrl_regs + reg_offset, mask);
-+ brcm_usb_ctrl_unset(params->regs[BRCM_REGS_CTRL] + reg_offset, mask);
- };
-
- static inline
-@@ -411,7 +411,7 @@ void usb_ctrl_set_family(struct brcm_usb
- u32 mask;
-
- mask = params->usb_reg_bits_map[field];
-- brcm_usb_ctrl_set(params->ctrl_regs + reg_offset, mask);
-+ brcm_usb_ctrl_set(params->regs[BRCM_REGS_CTRL] + reg_offset, mask);
- };
-
- static u32 brcmusb_usb_mdio_read(void __iomem *ctrl_base, u32 reg, int mode)
-@@ -544,7 +544,7 @@ static void brcmusb_usb3_pll_54mhz(struc
- {
- u32 ofs;
- int ii;
-- void __iomem *ctrl_base = params->ctrl_regs;
-+ void __iomem *ctrl_base = params->regs[BRCM_REGS_CTRL];
-
- /*
- * On newer B53 based SoC's, the reference clock for the
-@@ -625,7 +625,7 @@ static void brcmusb_usb3_ssc_enable(void
-
- static void brcmusb_usb3_phy_workarounds(struct brcm_usb_init_params *params)
- {
-- void __iomem *ctrl_base = params->ctrl_regs;
-+ void __iomem *ctrl_base = params->regs[BRCM_REGS_CTRL];
-
- brcmusb_usb3_pll_fix(ctrl_base);
- brcmusb_usb3_pll_54mhz(params);
-@@ -667,7 +667,7 @@ static void brcmusb_memc_fix(struct brcm
-
- static void brcmusb_usb3_otp_fix(struct brcm_usb_init_params *params)
- {
-- void __iomem *xhci_ec_base = params->xhci_ec_regs;
-+ void __iomem *xhci_ec_base = params->regs[BRCM_REGS_XHCI_EC];
- u32 val;
-
- if (params->family_id != 0x74371000 || !xhci_ec_base)
-@@ -680,8 +680,8 @@ static void brcmusb_usb3_otp_fix(struct
- brcm_usb_writel(val, USB_XHCI_EC_REG(xhci_ec_base, IRADAT));
-
- /* Reset USB 3.0 PHY for workaround to take effect */
-- USB_CTRL_UNSET(params->ctrl_regs, USB30_CTL1, PHY3_RESETB);
-- USB_CTRL_SET(params->ctrl_regs, USB30_CTL1, PHY3_RESETB);
-+ USB_CTRL_UNSET(params->regs[BRCM_REGS_CTRL], USB30_CTL1, PHY3_RESETB);
-+ USB_CTRL_SET(params->regs[BRCM_REGS_CTRL], USB30_CTL1, PHY3_RESETB);
- }
-
- static void brcmusb_xhci_soft_reset(struct brcm_usb_init_params *params,
-@@ -740,7 +740,7 @@ static enum brcm_family_type get_family_
-
- static void usb_init_ipp(struct brcm_usb_init_params *params)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
- u32 reg;
- u32 orig_reg;
-
-@@ -786,7 +786,7 @@ static void usb_init_ipp(struct brcm_usb
- static void usb_init_common(struct brcm_usb_init_params *params)
- {
- u32 reg;
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-
- /* Clear any pending wake conditions */
- reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM_STATUS));
-@@ -866,7 +866,7 @@ static void usb_init_common(struct brcm_
- static void usb_init_eohci(struct brcm_usb_init_params *params)
- {
- u32 reg;
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-
- if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB20_HC_RESETB))
- USB_CTRL_SET_FAMILY(params, USB_PM, USB20_HC_RESETB);
-@@ -902,7 +902,7 @@ static void usb_init_eohci(struct brcm_u
-
- static void usb_init_xhci(struct brcm_usb_init_params *params)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-
- USB_CTRL_UNSET(ctrl, USB30_PCTL, PHY3_IDDQ_OVERRIDE);
- /* 1 millisecond - for USB clocks to settle down */
-@@ -944,12 +944,13 @@ static void usb_uninit_eohci(struct brcm
- static void usb_uninit_xhci(struct brcm_usb_init_params *params)
- {
- brcmusb_xhci_soft_reset(params, 1);
-- USB_CTRL_SET(params->ctrl_regs, USB30_PCTL, PHY3_IDDQ_OVERRIDE);
-+ USB_CTRL_SET(params->regs[BRCM_REGS_CTRL], USB30_PCTL,
-+ PHY3_IDDQ_OVERRIDE);
- }
-
- static int usb_get_dual_select(struct brcm_usb_init_params *params)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
- u32 reg = 0;
-
- pr_debug("%s\n", __func__);
-@@ -963,7 +964,7 @@ static int usb_get_dual_select(struct br
-
- static void usb_set_dual_select(struct brcm_usb_init_params *params, int mode)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
- u32 reg;
-
- pr_debug("%s\n", __func__);
-@@ -980,7 +981,7 @@ static void usb_set_dual_select(struct b
- static void usb_wake_enable(struct brcm_usb_init_params *params,
- int enable)
- {
-- void __iomem *ctrl = params->ctrl_regs;
-+ void __iomem *ctrl = params->regs[BRCM_REGS_CTRL];
-
- if (enable)
- USB_CTRL_SET(ctrl, USB_PM, RMTWKUP_EN);
---- a/drivers/phy/broadcom/phy-brcm-usb-init.h
-+++ b/drivers/phy/broadcom/phy-brcm-usb-init.h
-@@ -6,12 +6,21 @@
- #ifndef _USB_BRCM_COMMON_INIT_H
- #define _USB_BRCM_COMMON_INIT_H
-
-+#include <linux/regmap.h>
-+
- #define USB_CTLR_MODE_HOST 0
- #define USB_CTLR_MODE_DEVICE 1
- #define USB_CTLR_MODE_DRD 2
- #define USB_CTLR_MODE_TYPEC_PD 3
-
--struct brcm_usb_init_params;
-+enum brcmusb_reg_sel {
-+ BRCM_REGS_CTRL = 0,
-+ BRCM_REGS_XHCI_EC,
-+ BRCM_REGS_XHCI_GBL,
-+ BRCM_REGS_USB_PHY,
-+ BRCM_REGS_USB_MDIO,
-+ BRCM_REGS_MAX
-+};
-
- #define USB_CTRL_REG(base, reg) ((void __iomem *)base + USB_CTRL_##reg)
- #define USB_XHCI_EC_REG(base, reg) ((void __iomem *)base + USB_XHCI_EC_##reg)
-@@ -41,9 +50,7 @@ struct brcm_usb_init_ops {
- };
-
- struct brcm_usb_init_params {
-- void __iomem *ctrl_regs;
-- void __iomem *xhci_ec_regs;
-- void __iomem *xhci_gbl_regs;
-+ void __iomem *regs[BRCM_REGS_MAX];
- int ioc;
- int ipp;
- int mode;
-@@ -53,10 +60,12 @@ struct brcm_usb_init_params {
- const char *family_name;
- const u32 *usb_reg_bits_map;
- const struct brcm_usb_init_ops *ops;
-+ struct regmap *syscon_piarbctl;
- };
-
- 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);
-
- static inline u32 brcm_usb_readl(void __iomem *addr)
- {
---- a/drivers/phy/broadcom/phy-brcm-usb.c
-+++ b/drivers/phy/broadcom/phy-brcm-usb.c
-@@ -16,6 +16,7 @@
- #include <linux/interrupt.h>
- #include <linux/soc/brcmstb/brcmstb.h>
- #include <dt-bindings/phy/phy.h>
-+#include <linux/mfd/syscon.h>
-
- #include "phy-brcm-usb-init.h"
-
-@@ -32,6 +33,11 @@ struct value_to_name_map {
- const char *name;
- };
-
-+struct match_chip_info {
-+ void *init_func;
-+ u8 required_regs[BRCM_REGS_MAX + 1];
-+};
-+
- static struct value_to_name_map brcm_dr_mode_to_name[] = {
- { USB_CTLR_MODE_HOST, "host" },
- { USB_CTLR_MODE_DEVICE, "peripheral" },
-@@ -64,6 +70,10 @@ struct brcm_usb_phy_data {
- struct brcm_usb_phy phys[BRCM_USB_PHY_ID_MAX];
- };
-
-+static s8 *node_reg_names[BRCM_REGS_MAX] = {
-+ "crtl", "xhci_ec", "xhci_gbl", "usb_phy", "usb_mdio"
-+};
-+
- static irqreturn_t brcm_usb_phy_wake_isr(int irq, void *dev_id)
- {
- struct phy *gphy = dev_id;
-@@ -241,15 +251,86 @@ static const struct attribute_group brcm
- .attrs = brcm_usb_phy_attrs,
- };
-
-+static struct match_chip_info chip_info_7216 = {
-+ .init_func = &brcm_usb_dvr_init_7216,
-+ .required_regs = {
-+ BRCM_REGS_CTRL,
-+ BRCM_REGS_XHCI_EC,
-+ BRCM_REGS_XHCI_GBL,
-+ -1,
-+ },
-+};
-+
-+static struct match_chip_info chip_info_7211b0 = {
-+ .init_func = &brcm_usb_dvr_init_7211b0,
-+ .required_regs = {
-+ BRCM_REGS_CTRL,
-+ BRCM_REGS_XHCI_EC,
-+ BRCM_REGS_XHCI_GBL,
-+ BRCM_REGS_USB_PHY,
-+ BRCM_REGS_USB_MDIO,
-+ -1,
-+ },
-+};
-+
-+static struct match_chip_info chip_info_7445 = {
-+ .init_func = &brcm_usb_dvr_init_7445,
-+ .required_regs = {
-+ BRCM_REGS_CTRL,
-+ BRCM_REGS_XHCI_EC,
-+ -1,
-+ },
-+};
-+
- static const struct of_device_id brcm_usb_dt_ids[] = {
- {
- .compatible = "brcm,bcm7216-usb-phy",
-- .data = &brcm_usb_dvr_init_7216,
-+ .data = &chip_info_7216,
-+ },
-+ {
-+ .compatible = "brcm,bcm7211-usb-phy",
-+ .data = &chip_info_7211b0,
-+ },
-+ {
-+ .compatible = "brcm,brcmstb-usb-phy",
-+ .data = &chip_info_7445,
- },
-- { .compatible = "brcm,brcmstb-usb-phy" },
- { /* sentinel */ }
- };
-
-+static int brcm_usb_get_regs(struct platform_device *pdev,
-+ enum brcmusb_reg_sel regs,
-+ struct brcm_usb_init_params *ini)
-+{
-+ struct resource *res;
-+
-+ /* Older DT nodes have ctrl and optional xhci_ec by index only */
-+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-+ node_reg_names[regs]);
-+ if (res == NULL) {
-+ if (regs == BRCM_REGS_CTRL) {
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ } else if (regs == BRCM_REGS_XHCI_EC) {
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-+ /* XHCI_EC registers are optional */
-+ if (res == NULL)
-+ return 0;
-+ }
-+ if (res == NULL) {
-+ dev_err(&pdev->dev, "can't get %s base address\n",
-+ node_reg_names[regs]);
-+ return 1;
-+ }
-+ }
-+ ini->regs[regs] = devm_ioremap_resource(&pdev->dev, res);
-+ if (IS_ERR(ini->regs[regs])) {
-+ dev_err(&pdev->dev, "can't map %s register space\n",
-+ node_reg_names[regs]);
-+ return 1;
-+ }
-+ return 0;
-+}
-+
- static int brcm_usb_phy_dvr_init(struct platform_device *pdev,
- struct brcm_usb_phy_data *priv,
- struct device_node *dn)
-@@ -325,9 +406,6 @@ static int brcm_usb_phy_dvr_init(struct
-
- static int brcm_usb_phy_probe(struct platform_device *pdev)
- {
-- struct resource *res_ctrl;
-- struct resource *res_xhciec = NULL;
-- struct resource *res_xhcigbl = NULL;
- struct device *dev = &pdev->dev;
- struct brcm_usb_phy_data *priv;
- struct phy_provider *phy_provider;
-@@ -335,6 +413,10 @@ static int brcm_usb_phy_probe(struct pla
- int err;
- const char *mode;
- const struct of_device_id *match;
-+ void (*dvr_init)(struct brcm_usb_init_params *params);
-+ const struct match_chip_info *info;
-+ struct regmap *rmap;
-+ int x;
-
- priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
- if (!priv)
-@@ -345,58 +427,13 @@ static int brcm_usb_phy_probe(struct pla
- priv->ini.product_id = brcmstb_get_product_id();
-
- match = of_match_node(brcm_usb_dt_ids, dev->of_node);
-- if (match && match->data) {
-- void (*dvr_init)(struct brcm_usb_init_params *params);
--
-- dvr_init = match->data;
-- (*dvr_init)(&priv->ini);
-- } else {
-- brcm_usb_dvr_init_7445(&priv->ini);
-- }
-+ info = match->data;
-+ dvr_init = info->init_func;
-+ (*dvr_init)(&priv->ini);
-
- dev_dbg(dev, "Best mapping table is for %s\n",
- priv->ini.family_name);
-
-- /* Newer DT node has reg-names. xhci_ec and xhci_gbl are optional. */
-- res_ctrl = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl");
-- if (res_ctrl != NULL) {
-- res_xhciec = platform_get_resource_byname(pdev,
-- IORESOURCE_MEM,
-- "xhci_ec");
-- res_xhcigbl = platform_get_resource_byname(pdev,
-- IORESOURCE_MEM,
-- "xhci_gbl");
-- } else {
-- /* Older DT node without reg-names, use index */
-- res_ctrl = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-- if (res_ctrl == NULL) {
-- dev_err(dev, "can't get CTRL base address\n");
-- return -EINVAL;
-- }
-- res_xhciec = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-- }
-- priv->ini.ctrl_regs = devm_ioremap_resource(dev, res_ctrl);
-- if (IS_ERR(priv->ini.ctrl_regs)) {
-- dev_err(dev, "can't map CTRL register space\n");
-- return -EINVAL;
-- }
-- if (res_xhciec) {
-- priv->ini.xhci_ec_regs =
-- devm_ioremap_resource(dev, res_xhciec);
-- if (IS_ERR(priv->ini.xhci_ec_regs)) {
-- dev_err(dev, "can't map XHCI EC register space\n");
-- return -EINVAL;
-- }
-- }
-- if (res_xhcigbl) {
-- priv->ini.xhci_gbl_regs =
-- devm_ioremap_resource(dev, res_xhcigbl);
-- if (IS_ERR(priv->ini.xhci_gbl_regs)) {
-- dev_err(dev, "can't map XHCI Global register space\n");
-- return -EINVAL;
-- }
-- }
--
- of_property_read_u32(dn, "brcm,ipp", &priv->ini.ipp);
- of_property_read_u32(dn, "brcm,ioc", &priv->ini.ioc);
-
-@@ -412,6 +449,16 @@ static int brcm_usb_phy_probe(struct pla
- if (of_property_read_bool(dn, "brcm,has-eohci"))
- priv->has_eohci = true;
-
-+ for (x = 0; x < BRCM_REGS_MAX; x++) {
-+ if (info->required_regs[x] >= BRCM_REGS_MAX)
-+ break;
-+
-+ err = brcm_usb_get_regs(pdev, info->required_regs[x],
-+ &priv->ini);
-+ if (err)
-+ return -EINVAL;
-+ }
-+
- err = brcm_usb_phy_dvr_init(pdev, priv, dn);
- if (err)
- return err;
-@@ -431,6 +478,15 @@ static int brcm_usb_phy_probe(struct pla
- if (err)
- dev_warn(dev, "Error creating sysfs attributes\n");
-
-+ /* Get piarbctl syscon if it exists */
-+ rmap = syscon_regmap_lookup_by_phandle(dev->of_node,
-+ "syscon-piarbctl");
-+ if (IS_ERR(rmap))
-+ rmap = syscon_regmap_lookup_by_phandle(dev->of_node,
-+ "brcm,syscon-piarbctl");
-+ if (!IS_ERR(rmap))
-+ priv->ini.syscon_piarbctl = rmap;
-+
- /* start with everything off */
- if (priv->has_xhci)
- brcm_usb_uninit_xhci(&priv->ini);