Commit 94583a41 authored by Al Cooper's avatar Al Cooper Committed by Kishon Vijay Abraham I

phy: usb: Restructure in preparation for adding 7216 USB support

The driver is being restructured in preparation for adding support
for the new Synopsys USB conroller on the 7216. Since all the bugs
and work-arounds in previous STB chips are supposed to be fixed,
most of the code in phy-brcm-usb-init.c is not needed. Instead of
adding more complexity to the already complicated phy-brcm-usb-init.c
module, the driver will be restructured to use a vector table to
dispatch into different C modules for the different controllers.

There was also some general cleanup done including some ipp setup
code that was incorrect.
Signed-off-by: default avatarAl Cooper <alcooperx@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarKishon Vijay Abraham I <kishon@ti.com>
parent f1c0db40
This diff is collapsed.
...@@ -13,6 +13,33 @@ ...@@ -13,6 +13,33 @@
struct brcm_usb_init_params; struct brcm_usb_init_params;
#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)
#define USB_CTRL_MASK(reg, field) \
USB_CTRL_##reg##_##field##_MASK
#define USB_CTRL_SET(base, reg, field) \
brcm_usb_ctrl_set(USB_CTRL_REG(base, reg), \
USB_CTRL_##reg##_##field##_MASK)
#define USB_CTRL_UNSET(base, reg, field) \
brcm_usb_ctrl_unset(USB_CTRL_REG(base, reg), \
USB_CTRL_##reg##_##field##_MASK)
struct brcm_usb_init_params;
struct brcm_usb_init_ops {
void (*init_ipp)(struct brcm_usb_init_params *params);
void (*init_common)(struct brcm_usb_init_params *params);
void (*init_eohci)(struct brcm_usb_init_params *params);
void (*init_xhci)(struct brcm_usb_init_params *params);
void (*uninit_common)(struct brcm_usb_init_params *params);
void (*uninit_eohci)(struct brcm_usb_init_params *params);
void (*uninit_xhci)(struct brcm_usb_init_params *params);
int (*get_dual_select)(struct brcm_usb_init_params *params);
void (*set_dual_select)(struct brcm_usb_init_params *params, int mode);
void (*wake_enable)(struct brcm_usb_init_params *params,
int enable);
};
struct brcm_usb_init_params { struct brcm_usb_init_params {
void __iomem *ctrl_regs; void __iomem *ctrl_regs;
void __iomem *xhci_ec_regs; void __iomem *xhci_ec_regs;
...@@ -24,20 +51,107 @@ struct brcm_usb_init_params { ...@@ -24,20 +51,107 @@ struct brcm_usb_init_params {
int selected_family; int selected_family;
const char *family_name; const char *family_name;
const u32 *usb_reg_bits_map; const u32 *usb_reg_bits_map;
const struct brcm_usb_init_ops *ops;
}; };
void brcm_usb_set_family_map(struct brcm_usb_init_params *params); void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params);
int brcm_usb_init_get_dual_select(struct brcm_usb_init_params *params);
void brcm_usb_init_set_dual_select(struct brcm_usb_init_params *params, static inline u32 brcm_usb_readl(void __iomem *addr)
int mode); {
/*
void brcm_usb_init_ipp(struct brcm_usb_init_params *ini); * MIPS endianness is configured by boot strap, which also reverses all
void brcm_usb_init_common(struct brcm_usb_init_params *ini); * bus endianness (i.e., big-endian CPU + big endian bus ==> native
void brcm_usb_init_eohci(struct brcm_usb_init_params *ini); * endian I/O).
void brcm_usb_init_xhci(struct brcm_usb_init_params *ini); *
void brcm_usb_uninit_common(struct brcm_usb_init_params *ini); * Other architectures (e.g., ARM) either do not support big endian, or
void brcm_usb_uninit_eohci(struct brcm_usb_init_params *ini); * else leave I/O in little endian mode.
void brcm_usb_uninit_xhci(struct brcm_usb_init_params *ini); */
void brcm_usb_wake_enable(struct brcm_usb_init_params *params, int enable); if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(__BIG_ENDIAN))
return __raw_readl(addr);
else
return readl_relaxed(addr);
}
static inline void brcm_usb_writel(u32 val, void __iomem *addr)
{
/* See brcmnand_readl() comments */
if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(__BIG_ENDIAN))
__raw_writel(val, addr);
else
writel_relaxed(val, addr);
}
static inline void brcm_usb_ctrl_unset(void __iomem *reg, u32 mask)
{
brcm_usb_writel(brcm_usb_readl(reg) & ~(mask), reg);
};
static inline void brcm_usb_ctrl_set(void __iomem *reg, u32 mask)
{
brcm_usb_writel(brcm_usb_readl(reg) | (mask), reg);
};
static inline void brcm_usb_init_ipp(struct brcm_usb_init_params *ini)
{
if (ini->ops->init_ipp)
ini->ops->init_ipp(ini);
}
static inline void brcm_usb_init_common(struct brcm_usb_init_params *ini)
{
if (ini->ops->init_common)
ini->ops->init_common(ini);
}
static inline void brcm_usb_init_eohci(struct brcm_usb_init_params *ini)
{
if (ini->ops->init_eohci)
ini->ops->init_eohci(ini);
}
static inline void brcm_usb_init_xhci(struct brcm_usb_init_params *ini)
{
if (ini->ops->init_xhci)
ini->ops->init_xhci(ini);
}
static inline void brcm_usb_uninit_common(struct brcm_usb_init_params *ini)
{
if (ini->ops->uninit_common)
ini->ops->uninit_common(ini);
}
static inline void brcm_usb_uninit_eohci(struct brcm_usb_init_params *ini)
{
if (ini->ops->uninit_eohci)
ini->ops->uninit_eohci(ini);
}
static inline void brcm_usb_uninit_xhci(struct brcm_usb_init_params *ini)
{
if (ini->ops->uninit_xhci)
ini->ops->uninit_xhci(ini);
}
static inline void brcm_usb_wake_enable(struct brcm_usb_init_params *ini,
int enable)
{
if (ini->ops->wake_enable)
ini->ops->wake_enable(ini, enable);
}
static inline int brcm_usb_get_dual_select(struct brcm_usb_init_params *ini)
{
if (ini->ops->get_dual_select)
return ini->ops->get_dual_select(ini);
return 0;
}
static inline void brcm_usb_set_dual_select(struct brcm_usb_init_params *ini,
int mode)
{
if (ini->ops->set_dual_select)
ini->ops->set_dual_select(ini, mode);
}
#endif /* _USB_BRCM_COMMON_INIT_H */ #endif /* _USB_BRCM_COMMON_INIT_H */
...@@ -207,7 +207,7 @@ static ssize_t dual_select_store(struct device *dev, ...@@ -207,7 +207,7 @@ static ssize_t dual_select_store(struct device *dev,
res = name_to_value(&brcm_dual_mode_to_name[0], res = name_to_value(&brcm_dual_mode_to_name[0],
ARRAY_SIZE(brcm_dual_mode_to_name), buf, &value); ARRAY_SIZE(brcm_dual_mode_to_name), buf, &value);
if (!res) { if (!res) {
brcm_usb_init_set_dual_select(&priv->ini, value); brcm_usb_set_dual_select(&priv->ini, value);
res = len; res = len;
} }
mutex_unlock(&sysfs_lock); mutex_unlock(&sysfs_lock);
...@@ -222,7 +222,7 @@ static ssize_t dual_select_show(struct device *dev, ...@@ -222,7 +222,7 @@ static ssize_t dual_select_show(struct device *dev,
int value; int value;
mutex_lock(&sysfs_lock); mutex_lock(&sysfs_lock);
value = brcm_usb_init_get_dual_select(&priv->ini); value = brcm_usb_get_dual_select(&priv->ini);
mutex_unlock(&sysfs_lock); mutex_unlock(&sysfs_lock);
return sprintf(buf, "%s\n", return sprintf(buf, "%s\n",
value_to_name(&brcm_dual_mode_to_name[0], value_to_name(&brcm_dual_mode_to_name[0],
...@@ -331,7 +331,7 @@ static int brcm_usb_phy_probe(struct platform_device *pdev) ...@@ -331,7 +331,7 @@ static int brcm_usb_phy_probe(struct platform_device *pdev)
priv->ini.family_id = brcmstb_get_family_id(); priv->ini.family_id = brcmstb_get_family_id();
priv->ini.product_id = brcmstb_get_product_id(); priv->ini.product_id = brcmstb_get_product_id();
brcm_usb_set_family_map(&priv->ini); brcm_usb_dvr_init_7445(&priv->ini);
dev_dbg(dev, "Best mapping table is for %s\n", dev_dbg(dev, "Best mapping table is for %s\n",
priv->ini.family_name); priv->ini.family_name);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment