
On Sat, 2020-05-02 at 11:35 +0200, Frank Wunderlich wrote:
From: Chunfeng Yun chunfeng.yun@mediatek.com
Get a group of phys by the phy bulk API
Signed-off-by: Chunfeng Yun chunfeng.yun@mediatek.com Signed-off-by: Frank Wunderlich frank-w@public-files.de Reviewed-by: Weijie Gao weijie.gao@mediatek.com
v8: fix build-error for xilinx-board
v7: use new API of phy bulk
v6: add Reviewed-by Weijie
v5: no changes
v4: new patch
drivers/usb/dwc3/core.c | 87 ++++++--------------------------- drivers/usb/dwc3/dwc3-generic.c | 7 ++- drivers/usb/host/xhci-dwc3.c | 7 ++- include/dwc3-uboot.h | 11 ++--- 4 files changed, 27 insertions(+), 85 deletions(-)
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 4ec3f6df6a..a8982bdc09 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -838,87 +838,32 @@ MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");
#if CONFIG_IS_ENABLED(PHY) && CONFIG_IS_ENABLED(DM_USB) -int dwc3_setup_phy(struct udevice *dev, struct phy **array, int *num_phys) +int dwc3_setup_phy(struct udevice *dev, struct phy_bulk *phys) {
- int i, ret, count;
- struct phy *usb_phys;
- /* Return if no phy declared */
- if (!dev_read_prop(dev, "phys", NULL))
return 0;
- count = dev_count_phandle_with_args(dev, "phys", "#phy-cells");
- if (count <= 0)
return count;
- usb_phys = devm_kcalloc(dev, count, sizeof(struct phy),
GFP_KERNEL);
- if (!usb_phys)
return -ENOMEM;
- for (i = 0; i < count; i++) {
ret = generic_phy_get_by_index(dev, i, &usb_phys[i]);
if (ret && ret != -ENOENT) {
pr_err("Failed to get USB PHY%d for %s\n",
i, dev->name);
return ret;
}
- }
- for (i = 0; i < count; i++) {
ret = generic_phy_init(&usb_phys[i]);
if (ret) {
pr_err("Can't init USB PHY%d for %s\n",
i, dev->name);
goto phys_init_err;
}
- }
- for (i = 0; i < count; i++) {
ret = generic_phy_power_on(&usb_phys[i]);
if (ret) {
pr_err("Can't power USB PHY%d for %s\n",
i, dev->name);
goto phys_poweron_err;
}
- }
- *array = usb_phys;
- *num_phys = count;
- return 0;
-phys_poweron_err:
- for (i = count - 1; i >= 0; i--)
generic_phy_power_off(&usb_phys[i]);
- int ret;
- for (i = 0; i < count; i++)
generic_phy_exit(&usb_phys[i]);
- ret = generic_phy_get_bulk(dev, phys);
- if (ret)
return ret;
- return ret;
- ret = generic_phy_init_bulk(phys);
- if (ret)
return ret;
-phys_init_err:
- for (; i >= 0; i--)
generic_phy_exit(&usb_phys[i]);
ret = generic_phy_power_on_bulk(phys);
if (ret)
generic_phy_exit_bulk(phys);
return ret;
}
-int dwc3_shutdown_phy(struct udevice *dev, struct phy *usb_phys, int num_phys) +int dwc3_shutdown_phy(struct udevice *dev, struct phy_bulk *phys) {
- int i, ret;
- for (i = 0; i < num_phys; i++) {
if (!generic_phy_valid(&usb_phys[i]))
continue;
ret = generic_phy_power_off(&usb_phys[i]);
ret |= generic_phy_exit(&usb_phys[i]);
if (ret) {
pr_err("Can't shutdown USB PHY%d for %s\n",
i, dev->name);
}
- }
- int ret;
- return 0;
- ret = generic_phy_power_off_bulk(phys);
- ret |= generic_phy_exit_bulk(phys);
- return ret;
} #endif
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c index febcfc0f54..eabd53a36d 100644 --- a/drivers/usb/dwc3/dwc3-generic.c +++ b/drivers/usb/dwc3/dwc3-generic.c @@ -33,8 +33,7 @@ struct dwc3_generic_plat { struct dwc3_generic_priv { void *base; struct dwc3 dwc3;
- struct phy *phys;
- int num_phys;
- struct phy_bulk phys;
};
struct dwc3_generic_host_priv { @@ -56,7 +55,7 @@ static int dwc3_generic_probe(struct udevice *dev, dwc3_of_parse(dwc3); #endif
- rc = dwc3_setup_phy(dev, &priv->phys, &priv->num_phys);
- rc = dwc3_setup_phy(dev, &priv->phys); if (rc) return rc;
@@ -79,7 +78,7 @@ static int dwc3_generic_remove(struct udevice *dev, struct dwc3 *dwc3 = &priv->dwc3;
dwc3_remove(dwc3);
- dwc3_shutdown_phy(dev, priv->phys, priv->num_phys);
dwc3_shutdown_phy(dev, &priv->phys); unmap_physmem(dwc3->regs, MAP_NOCACHE);
return 0;
diff --git a/drivers/usb/host/xhci-dwc3.c b/drivers/usb/host/xhci-dwc3.c index 9fcfa39d4b..563db1a426 100644 --- a/drivers/usb/host/xhci-dwc3.c +++ b/drivers/usb/host/xhci-dwc3.c @@ -19,8 +19,7 @@ #include <linux/usb/otg.h>
struct xhci_dwc3_platdata {
- struct phy *usb_phys;
- int num_phys;
- struct phy_bulk *usb_phys;
I cant access github, so don't know why you build fail, but I build pass https://gitlab.denx.de/u-boot/custodians/u-boot-usb/pipelines/3054
here *usb_phys is not allocated before used, this is why I usb "struct phy_bulk usb_phys".
Would you please help to test the function on xilinx-board? due to I just build it pass, no board to test it.
Thank you for sending out the v8 series of pathes
};
void dwc3_set_mode(struct dwc3 *dwc3_reg, u32 mode) @@ -125,7 +124,7 @@ static int xhci_dwc3_probe(struct udevice *dev) hcor = (struct xhci_hcor *)((uintptr_t)hccr + HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));
- ret = dwc3_setup_phy(dev, &plat->usb_phys, &plat->num_phys);
- ret = dwc3_setup_phy(dev, plat->usb_phys); if (ret && (ret != -ENOTSUPP)) return ret;
@@ -168,7 +167,7 @@ static int xhci_dwc3_remove(struct udevice *dev) { struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
- dwc3_shutdown_phy(dev, plat->usb_phys, plat->num_phys);
dwc3_shutdown_phy(dev, plat->usb_phys);
return xhci_deregister(dev);
} diff --git a/include/dwc3-uboot.h b/include/dwc3-uboot.h index 3c9e204cf0..ce835fd1b2 100644 --- a/include/dwc3-uboot.h +++ b/include/dwc3-uboot.h @@ -9,6 +9,7 @@ #ifndef __DWC3_UBOOT_H_ #define __DWC3_UBOOT_H_
+#include <generic-phy.h> #include <linux/usb/otg.h> #include <linux/usb/phy.h>
@@ -43,17 +44,15 @@ void dwc3_uboot_handle_interrupt(int index);
struct phy; #if CONFIG_IS_ENABLED(PHY) && CONFIG_IS_ENABLED(DM_USB) -int dwc3_setup_phy(struct udevice *dev, struct phy **array, int *num_phys); -int dwc3_shutdown_phy(struct udevice *dev, struct phy *usb_phys, int num_phys); +int dwc3_setup_phy(struct udevice *dev, struct phy_bulk *phys); +int dwc3_shutdown_phy(struct udevice *dev, struct phy_bulk *phys); #else -static inline int dwc3_setup_phy(struct udevice *dev, struct phy **array,
int *num_phys)
+static inline int dwc3_setup_phy(struct udevice *dev, struct phy_bulk *phys) { return -ENOTSUPP; }
-static inline int dwc3_shutdown_phy(struct udevice *dev, struct phy *usb_phys,
int num_phys)
+static inline int dwc3_shutdown_phy(struct udevice *dev, struct phy_bulk *phys) { return -ENOTSUPP; }