Skip to content
Snippets Groups Projects
Commit 003659bd authored by Neil Armstrong's avatar Neil Armstrong Committed by Marek Vasut
Browse files

usb: host: dwc3: fix phys init


When no PHYs are declared in the dwc3 node, the phy init fails.
This patch checks if the "phys" property is presend and reports
the error returned by dev_count_phandle_with_args().

This patchs also fixes the styles issues added in last commit.

This patch should fix the DWC3 support on the UniPhier SoC family.

Fixes: 7c839ea7 ("usb: host: dwc3: Add support for multiple PHYs")
Reported-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
parent a61f9d1f
No related branches found
No related tags found
No related merge requests found
...@@ -113,16 +113,21 @@ void dwc3_set_fladj(struct dwc3 *dwc3_reg, u32 val) ...@@ -113,16 +113,21 @@ void dwc3_set_fladj(struct dwc3 *dwc3_reg, u32 val)
} }
#ifdef CONFIG_DM_USB #ifdef CONFIG_DM_USB
static int xhci_dwc3_setup_phy(struct udevice *dev, int count) static int xhci_dwc3_setup_phy(struct udevice *dev)
{ {
struct xhci_dwc3_platdata *plat = dev_get_platdata(dev); struct xhci_dwc3_platdata *plat = dev_get_platdata(dev);
int i, ret; int i, ret, count;
if (!count) /* Return if no phy declared */
if (!dev_read_prop(dev, "phys", NULL))
return 0; return 0;
count = dev_count_phandle_with_args(dev, "phys", "#phy-cells");
if (count <= 0)
return count;
plat->usb_phys = devm_kcalloc(dev, count, sizeof(struct phy), plat->usb_phys = devm_kcalloc(dev, count, sizeof(struct phy),
GFP_KERNEL); GFP_KERNEL);
if (!plat->usb_phys) if (!plat->usb_phys)
return -ENOMEM; return -ENOMEM;
...@@ -136,7 +141,7 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count) ...@@ -136,7 +141,7 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count)
++plat->num_phys; ++plat->num_phys;
} }
for (i = 0; i < plat->num_phys; i++) { for (i = 0; i < plat->num_phys; i++) {
ret = generic_phy_init(&plat->usb_phys[i]); ret = generic_phy_init(&plat->usb_phys[i]);
if (ret) { if (ret) {
...@@ -145,7 +150,7 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count) ...@@ -145,7 +150,7 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count)
goto phys_init_err; goto phys_init_err;
} }
} }
for (i = 0; i < plat->num_phys; i++) { for (i = 0; i < plat->num_phys; i++) {
ret = generic_phy_power_on(&plat->usb_phys[i]); ret = generic_phy_power_on(&plat->usb_phys[i]);
if (ret) { if (ret) {
...@@ -157,7 +162,6 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count) ...@@ -157,7 +162,6 @@ static int xhci_dwc3_setup_phy(struct udevice *dev, int count)
return 0; return 0;
phys_poweron_err: phys_poweron_err:
for (; i >= 0; i--) for (; i >= 0; i--)
generic_phy_power_off(&plat->usb_phys[i]); generic_phy_power_off(&plat->usb_phys[i]);
...@@ -187,7 +191,7 @@ static int xhci_dwc3_shutdown_phy(struct udevice *dev) ...@@ -187,7 +191,7 @@ static int xhci_dwc3_shutdown_phy(struct udevice *dev)
ret |= generic_phy_exit(&plat->usb_phys[i]); ret |= generic_phy_exit(&plat->usb_phys[i]);
if (ret) { if (ret) {
pr_err("Can't shutdown USB PHY%d for %s\n", pr_err("Can't shutdown USB PHY%d for %s\n",
i, dev->name); i, dev->name);
} }
} }
...@@ -206,8 +210,7 @@ static int xhci_dwc3_probe(struct udevice *dev) ...@@ -206,8 +210,7 @@ static int xhci_dwc3_probe(struct udevice *dev)
hcor = (struct xhci_hcor *)((uintptr_t)hccr + hcor = (struct xhci_hcor *)((uintptr_t)hccr +
HC_LENGTH(xhci_readl(&(hccr)->cr_capbase))); HC_LENGTH(xhci_readl(&(hccr)->cr_capbase)));
ret = xhci_dwc3_setup_phy(dev, dev_count_phandle_with_args( ret = xhci_dwc3_setup_phy(dev);
dev, "phys", "#phy-cells"));
if (ret) if (ret)
return ret; return ret;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment