Message ID | 20200502093522.3568-6-frank-w@public-files.de |
---|---|
State | New |
Headers | show |
Series | Add support for MediaTek xHCI host controller | expand |
On Sat, 2020-05-02 at 11:35 +0200, Frank Wunderlich wrote: > From: Chunfeng Yun <chunfeng.yun at mediatek.com> > > Get a group of phys by the phy bulk API > > Signed-off-by: Chunfeng Yun <chunfeng.yun at mediatek.com> > Signed-off-by: Frank Wunderlich <frank-w at public-files.de> > Reviewed-by: Weijie Gao <weijie.gao at 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; > }
Am 6. Mai 2020 05:09:55 MESZ schrieb Chunfeng Yun <chunfeng.yun at mediatek.com>: >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 Hi, I also only fixed the build-error (to get series merged into 2020-07 for further work)...have no such board...sorry for wrong fix...have you found way to reproduce the build-error? It's already in mareks tree and he send pull-request. I hope tom merges it to master and you can send a fix only (instead of full series which need all work again). regards Frank
On Wed, 2020-05-06 at 09:35 +0200, Frank Wunderlich wrote: > > Am 6. Mai 2020 05:09:55 MESZ schrieb Chunfeng Yun <chunfeng.yun at mediatek.com>: > > >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 > > Hi, > > I also only fixed the build-error (to get series merged into 2020-07 for further work)...have no such board...sorry for wrong fix...have you found way to reproduce the build-error? Yes, I can reproduce it, will send a fix patch for it, thanks > It's already in mareks tree and he send pull-request. I hope tom merges it to master and you can send a fix only (instead of full series which need all work again). > regards Frank Sorry, I found that I loss a changed file when prepare this patch, because I make a new branch for it:(
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; }; 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; }