[U-Boot] [PATCH 0/6] Update ohci/ehci-generic drivers

From: Patrice Chotard patrice.chotard@st.com
This series updates ohci-generic and ehci-generic drivers by: _ Add generic_phy_power_on() and generic_phy_power_off() needed to work with phy driver which implement these callbacks. _ Factorize PHY operations. _ Replace pr_err() with dev_err().
Patrice Chotard (6): usb: ehci-generic: handle phy power on/off usb: ehci-generic: factorize PHY operation usb: ehci-generic: replace pr_err() by dev_err() usb: ohci-generic: handle phy power on/off usb: ohci-generic: factorize PHY operation usb: ohci-generic: replace pr_err() by dev_err()
drivers/usb/host/ehci-generic.c | 98 ++++++++++++++++++++++++++++------------- drivers/usb/host/ohci-generic.c | 95 ++++++++++++++++++++++++++------------- 2 files changed, 133 insertions(+), 60 deletions(-)

From: Patrice Chotard patrice.chotard@st.com
Add generic_phy_power_on() and generic_phy_power_off() calls to switch ON/OFF phy during probe and remove functions.
Signed-off-by: Christophe Kerello christophe.kerello@st.com Signed-off-by: Patrice Chotard patrice.chotard@st.com --- drivers/usb/host/ehci-generic.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c index 1cb92c033870..2edd6d7433e3 100644 --- a/drivers/usb/host/ehci-generic.c +++ b/drivers/usb/host/ehci-generic.c @@ -106,6 +106,12 @@ static int ehci_usb_probe(struct udevice *dev) pr_err("failed to init usb phy\n"); goto reset_err; } + + err = generic_phy_power_on(&priv->phy); + if (err) { + dev_err(dev, "failed to power on usb phy\n"); + goto phy_power_err; + } }
hccr = map_physmem(dev_read_addr(dev), 0x100, MAP_NOCACHE); @@ -120,6 +126,13 @@ static int ehci_usb_probe(struct udevice *dev)
phy_err: if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_power_off(&priv->phy); + if (ret) + dev_err(dev, "failed to power off usb phy\n"); + } + +phy_power_err: + if (generic_phy_valid(&priv->phy)) { ret = generic_phy_exit(&priv->phy); if (ret) pr_err("failed to release phy\n"); @@ -147,6 +160,10 @@ static int ehci_usb_remove(struct udevice *dev) return ret;
if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_power_off(&priv->phy); + if (ret) + return ret; + ret = generic_phy_exit(&priv->phy); if (ret) return ret;

From: Patrice Chotard patrice.chotard@st.com
Factorize PHY get/init/poweron and PHY poweroff/exit operations into separate function, it simplify the error path.
Signed-off-by: Patrice Chotard patrice.chotard@st.com --- drivers/usb/host/ehci-generic.c | 99 ++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 40 deletions(-)
diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c index 2edd6d7433e3..0926986d2737 100644 --- a/drivers/usb/host/ehci-generic.c +++ b/drivers/usb/host/ehci-generic.c @@ -27,6 +27,56 @@ struct generic_ehci { int reset_count; };
+static int ehci_setup_phy(struct udevice *dev, int index) +{ + struct generic_ehci *priv = dev_get_priv(dev); + int ret; + + ret = generic_phy_get_by_index(dev, index, &priv->phy); + if (ret) { + if (ret != -ENOENT) { + dev_err(dev, "failed to get usb phy\n"); + return ret; + } + } else { + ret = generic_phy_init(&priv->phy); + if (ret) { + dev_err(dev, "failed to init usb phy\n"); + return ret; + } + + ret = generic_phy_power_on(&priv->phy); + if (ret) { + dev_err(dev, "failed to power on usb phy\n"); + return generic_phy_exit(&priv->phy); + } + } + + return 0; +} + +static int ehci_shutdown_phy(struct udevice *dev) +{ + struct generic_ehci *priv = dev_get_priv(dev); + int ret = 0; + + if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_power_off(&priv->phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + + ret = generic_phy_exit(&priv->phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + } + + return 0; +} + static int ehci_usb_probe(struct udevice *dev) { struct generic_ehci *priv = dev_get_priv(dev); @@ -93,26 +143,10 @@ static int ehci_usb_probe(struct udevice *dev) } }
- err = generic_phy_get_by_index(dev, 0, &priv->phy); - if (err) { - if (err != -ENOENT) { - pr_err("failed to get usb phy\n"); - goto reset_err; - } - } else { - - err = generic_phy_init(&priv->phy); - if (err) { - pr_err("failed to init usb phy\n"); - goto reset_err; - } + err = ehci_setup_phy(dev, 0); + if (err)
- err = generic_phy_power_on(&priv->phy); - if (err) { - dev_err(dev, "failed to power on usb phy\n"); - goto phy_power_err; - } - } + goto reset_err;
hccr = map_physmem(dev_read_addr(dev), 0x100, MAP_NOCACHE); hcor = (struct ehci_hcor *)((uintptr_t)hccr + @@ -125,18 +159,9 @@ static int ehci_usb_probe(struct udevice *dev) return 0;
phy_err: - if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_power_off(&priv->phy); - if (ret) - dev_err(dev, "failed to power off usb phy\n"); - } - -phy_power_err: - if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_exit(&priv->phy); - if (ret) - pr_err("failed to release phy\n"); - } + ret = ehci_shutdown_phy(dev); + if (ret) + dev_err(dev, "failed to shutdown usb phy\n");
reset_err: ret = reset_release_all(priv->resets, priv->reset_count); @@ -159,15 +184,9 @@ static int ehci_usb_remove(struct udevice *dev) if (ret) return ret;
- if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_power_off(&priv->phy); - if (ret) - return ret; - - ret = generic_phy_exit(&priv->phy); - if (ret) - return ret; - } + ret = ehci_shutdown_phy(dev); + if (ret) + return ret;
ret = reset_release_all(priv->resets, priv->reset_count); if (ret)

From: Patrice Chotard patrice.chotard@st.com
As we get access to struct udevice, use dev_err() instead of pr_err().
Signed-off-by: Patrice Chotard patrice.chotard@st.com --- drivers/usb/host/ehci-generic.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/drivers/usb/host/ehci-generic.c b/drivers/usb/host/ehci-generic.c index 0926986d2737..b012d8651f12 100644 --- a/drivers/usb/host/ehci-generic.c +++ b/drivers/usb/host/ehci-generic.c @@ -101,7 +101,7 @@ static int ehci_usb_probe(struct udevice *dev) break; err = clk_enable(&priv->clocks[i]); if (err) { - pr_err("failed to enable clock %d\n", i); + dev_err(dev, "failed to enable clock %d\n", i); clk_free(&priv->clocks[i]); goto clk_err; } @@ -109,7 +109,8 @@ static int ehci_usb_probe(struct udevice *dev) } } else { if (clock_nb != -ENOENT) { - pr_err("failed to get clock phandle(%d)\n", clock_nb); + dev_err(dev, "failed to get clock phandle(%d)\n", + clock_nb); return clock_nb; } } @@ -130,7 +131,8 @@ static int ehci_usb_probe(struct udevice *dev) break;
if (reset_deassert(&priv->resets[i])) { - pr_err("failed to deassert reset %d\n", i); + dev_err(dev, "failed to deassert reset %d\n", + i); reset_free(&priv->resets[i]); goto reset_err; } @@ -138,14 +140,14 @@ static int ehci_usb_probe(struct udevice *dev) } } else { if (reset_nb != -ENOENT) { - pr_err("failed to get reset phandle(%d)\n", reset_nb); + dev_err(dev, "failed to get reset phandle(%d)\n", + reset_nb); goto clk_err; } }
err = ehci_setup_phy(dev, 0); if (err) - goto reset_err;
hccr = map_physmem(dev_read_addr(dev), 0x100, MAP_NOCACHE); @@ -166,11 +168,11 @@ phy_err: reset_err: ret = reset_release_all(priv->resets, priv->reset_count); if (ret) - pr_err("failed to assert all resets\n"); + dev_err(dev, "failed to assert all resets\n"); clk_err: ret = clk_release_all(priv->clocks, priv->clock_count); if (ret) - pr_err("failed to disable all clocks\n"); + dev_err(dev, "failed to disable all clocks\n");
return err; }

From: Patrice Chotard patrice.chotard@st.com
Add generic_phy_power_on() and generic_phy_power_off() calls to switch ON/OFF phy during probe and remove functions.
Signed-off-by: Patrice Chotard patrice.chotard@st.com --- drivers/usb/host/ohci-generic.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/drivers/usb/host/ohci-generic.c b/drivers/usb/host/ohci-generic.c index bf55a71d66c2..4843b4ac859f 100644 --- a/drivers/usb/host/ohci-generic.c +++ b/drivers/usb/host/ohci-generic.c @@ -98,6 +98,12 @@ static int ohci_usb_probe(struct udevice *dev) pr_err("failed to init usb phy\n"); goto reset_err; } + + err = generic_phy_power_on(&priv->phy); + if (err) { + dev_err(dev, "failed to power on usb phy\n"); + goto phy_power_err; + } }
err = ohci_register(dev, regs); @@ -108,6 +114,13 @@ static int ohci_usb_probe(struct udevice *dev)
phy_err: if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_power_off(&priv->phy); + if (ret) + dev_err(dev, "failed to power off usb phy\n"); + } + +phy_power_err: + if (generic_phy_valid(&priv->phy)) { ret = generic_phy_exit(&priv->phy); if (ret) pr_err("failed to release phy\n"); @@ -135,6 +148,10 @@ static int ohci_usb_remove(struct udevice *dev) return ret;
if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_power_off(&priv->phy); + if (ret) + return ret; + ret = generic_phy_exit(&priv->phy); if (ret) return ret;

From: Patrice Chotard patrice.chotard@st.com
Factorize PHY get/init/poweron and PHY poweroff/exit operations into separate function, it simplify the error path.
Signed-off-by: Patrice Chotard patrice.chotard@st.com --- drivers/usb/host/ohci-generic.c | 99 ++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 40 deletions(-)
diff --git a/drivers/usb/host/ohci-generic.c b/drivers/usb/host/ohci-generic.c index 4843b4ac859f..590fe4ca740f 100644 --- a/drivers/usb/host/ohci-generic.c +++ b/drivers/usb/host/ohci-generic.c @@ -25,6 +25,56 @@ struct generic_ohci { int reset_count; /* number of reset in reset list */ };
+static int ohci_setup_phy(struct udevice *dev, int index) +{ + struct generic_ohci *priv = dev_get_priv(dev); + int ret; + + ret = generic_phy_get_by_index(dev, index, &priv->phy); + if (ret) { + if (ret != -ENOENT) { + dev_err(dev, "failed to get usb phy\n"); + return ret; + } + } else { + ret = generic_phy_init(&priv->phy); + if (ret) { + dev_err(dev, "failed to init usb phy\n"); + return ret; + } + + ret = generic_phy_power_on(&priv->phy); + if (ret) { + dev_err(dev, "failed to power on usb phy\n"); + return generic_phy_exit(&priv->phy); + } + } + + return 0; +} + +static int ohci_shutdown_phy(struct udevice *dev) +{ + struct generic_ohci *priv = dev_get_priv(dev); + int ret = 0; + + if (generic_phy_valid(&priv->phy)) { + ret = generic_phy_power_off(&priv->phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + + ret = generic_phy_exit(&priv->phy); + if (ret) { + dev_err(dev, "failed to power off usb phy\n"); + return ret; + } + } + + return 0; +} + static int ohci_usb_probe(struct udevice *dev) { struct ohci_regs *regs = (struct ohci_regs *)devfdt_get_addr(dev); @@ -85,26 +135,10 @@ static int ohci_usb_probe(struct udevice *dev) goto clk_err; }
- err = generic_phy_get_by_index(dev, 0, &priv->phy); - if (err) { - if (err != -ENOENT) { - pr_err("failed to get usb phy\n"); - goto reset_err; - } - } else { - - err = generic_phy_init(&priv->phy); - if (err) { - pr_err("failed to init usb phy\n"); - goto reset_err; - } + err = ohci_setup_phy(dev, 0); + if (err)
- err = generic_phy_power_on(&priv->phy); - if (err) { - dev_err(dev, "failed to power on usb phy\n"); - goto phy_power_err; - } - } + goto reset_err;
err = ohci_register(dev, regs); if (err) @@ -113,18 +147,9 @@ static int ohci_usb_probe(struct udevice *dev) return 0;
phy_err: - if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_power_off(&priv->phy); - if (ret) - dev_err(dev, "failed to power off usb phy\n"); - } - -phy_power_err: - if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_exit(&priv->phy); - if (ret) - pr_err("failed to release phy\n"); - } + ret = ohci_shutdown_phy(dev); + if (ret) + dev_err(dev, "failed to shutdown usb phy\n");
reset_err: ret = reset_release_all(priv->resets, priv->reset_count); @@ -147,15 +172,9 @@ static int ohci_usb_remove(struct udevice *dev) if (ret) return ret;
- if (generic_phy_valid(&priv->phy)) { - ret = generic_phy_power_off(&priv->phy); - if (ret) - return ret; - - ret = generic_phy_exit(&priv->phy); - if (ret) - return ret; - } + ret = ohci_shutdown_phy(dev); + if (ret) + return ret;
ret = reset_release_all(priv->resets, priv->reset_count); if (ret)

On 03/14/2018 05:48 PM, patrice.chotard@st.com wrote:
From: Patrice Chotard patrice.chotard@st.com
Factorize PHY get/init/poweron and PHY poweroff/exit operations into separate function, it simplify the error path.
FYI, it's "factor out", not "factorize" .
Signed-off-by: Patrice Chotard patrice.chotard@st.com
drivers/usb/host/ohci-generic.c | 99 ++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 40 deletions(-)
diff --git a/drivers/usb/host/ohci-generic.c b/drivers/usb/host/ohci-generic.c index 4843b4ac859f..590fe4ca740f 100644 --- a/drivers/usb/host/ohci-generic.c +++ b/drivers/usb/host/ohci-generic.c @@ -25,6 +25,56 @@ struct generic_ohci { int reset_count; /* number of reset in reset list */ };
+static int ohci_setup_phy(struct udevice *dev, int index) +{
- struct generic_ohci *priv = dev_get_priv(dev);
- int ret;
- ret = generic_phy_get_by_index(dev, index, &priv->phy);
- if (ret) {
if (ret != -ENOENT) {
dev_err(dev, "failed to get usb phy\n");
return ret;
}
- } else {
ret = generic_phy_init(&priv->phy);
if (ret) {
dev_err(dev, "failed to init usb phy\n");
return ret;
}
ret = generic_phy_power_on(&priv->phy);
if (ret) {
dev_err(dev, "failed to power on usb phy\n");
return generic_phy_exit(&priv->phy);
}
- }
- return 0;
+}
+static int ohci_shutdown_phy(struct udevice *dev) +{
- struct generic_ohci *priv = dev_get_priv(dev);
- int ret = 0;
- if (generic_phy_valid(&priv->phy)) {
ret = generic_phy_power_off(&priv->phy);
if (ret) {
dev_err(dev, "failed to power off usb phy\n");
return ret;
}
ret = generic_phy_exit(&priv->phy);
if (ret) {
dev_err(dev, "failed to power off usb phy\n");
return ret;
}
- }
- return 0;
+}
static int ohci_usb_probe(struct udevice *dev) { struct ohci_regs *regs = (struct ohci_regs *)devfdt_get_addr(dev); @@ -85,26 +135,10 @@ static int ohci_usb_probe(struct udevice *dev) goto clk_err; }
- err = generic_phy_get_by_index(dev, 0, &priv->phy);
- if (err) {
if (err != -ENOENT) {
pr_err("failed to get usb phy\n");
goto reset_err;
}
- } else {
err = generic_phy_init(&priv->phy);
if (err) {
pr_err("failed to init usb phy\n");
goto reset_err;
}
- err = ohci_setup_phy(dev, 0);
- if (err)
err = generic_phy_power_on(&priv->phy);
if (err) {
dev_err(dev, "failed to power on usb phy\n");
goto phy_power_err;
}
- }
goto reset_err;
err = ohci_register(dev, regs); if (err)
@@ -113,18 +147,9 @@ static int ohci_usb_probe(struct udevice *dev) return 0;
phy_err:
- if (generic_phy_valid(&priv->phy)) {
ret = generic_phy_power_off(&priv->phy);
if (ret)
dev_err(dev, "failed to power off usb phy\n");
- }
-phy_power_err:
- if (generic_phy_valid(&priv->phy)) {
ret = generic_phy_exit(&priv->phy);
if (ret)
pr_err("failed to release phy\n");
- }
- ret = ohci_shutdown_phy(dev);
- if (ret)
dev_err(dev, "failed to shutdown usb phy\n");
reset_err: ret = reset_release_all(priv->resets, priv->reset_count); @@ -147,15 +172,9 @@ static int ohci_usb_remove(struct udevice *dev) if (ret) return ret;
- if (generic_phy_valid(&priv->phy)) {
ret = generic_phy_power_off(&priv->phy);
if (ret)
return ret;
ret = generic_phy_exit(&priv->phy);
if (ret)
return ret;
- }
ret = ohci_shutdown_phy(dev);
if (ret)
return ret;
ret = reset_release_all(priv->resets, priv->reset_count); if (ret)

From: Patrice Chotard patrice.chotard@st.com
As we get access to struct udevice, use dev_err() instead of pr_err().
Signed-off-by: Patrice Chotard patrice.chotard@st.com --- drivers/usb/host/ohci-generic.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/usb/host/ohci-generic.c b/drivers/usb/host/ohci-generic.c index 590fe4ca740f..5bdd7995b905 100644 --- a/drivers/usb/host/ohci-generic.c +++ b/drivers/usb/host/ohci-generic.c @@ -97,14 +97,14 @@ static int ohci_usb_probe(struct udevice *dev)
err = clk_enable(&priv->clocks[i]); if (err) { - pr_err("failed to enable clock %d\n", i); + dev_err(dev, "failed to enable clock %d\n", i); clk_free(&priv->clocks[i]); goto clk_err; } priv->clock_count++; } } else if (clock_nb != -ENOENT) { - pr_err("failed to get clock phandle(%d)\n", clock_nb); + dev_err(dev, "failed to get clock phandle(%d)\n", clock_nb); return clock_nb; }
@@ -124,20 +124,19 @@ static int ohci_usb_probe(struct udevice *dev)
err = reset_deassert(&priv->resets[i]); if (err) { - pr_err("failed to deassert reset %d\n", i); + dev_err(dev, "failed to deassert reset %d\n", i); reset_free(&priv->resets[i]); goto reset_err; } priv->reset_count++; } } else if (reset_nb != -ENOENT) { - pr_err("failed to get reset phandle(%d)\n", reset_nb); + dev_err(dev, "failed to get reset phandle(%d)\n", reset_nb); goto clk_err; }
err = ohci_setup_phy(dev, 0); if (err) - goto reset_err;
err = ohci_register(dev, regs); @@ -154,11 +153,11 @@ phy_err: reset_err: ret = reset_release_all(priv->resets, priv->reset_count); if (ret) - pr_err("failed to assert all resets\n"); + dev_err(dev, "failed to assert all resets\n"); clk_err: ret = clk_release_all(priv->clocks, priv->clock_count); if (ret) - pr_err("failed to disable all clocks\n"); + dev_err(dev, "failed to disable all clocks\n");
return err; }

On 03/14/2018 05:48 PM, patrice.chotard@st.com wrote:
From: Patrice Chotard patrice.chotard@st.com
This series updates ohci-generic and ehci-generic drivers by: _ Add generic_phy_power_on() and generic_phy_power_off() needed to work with phy driver which implement these callbacks. _ Factorize PHY operations. _ Replace pr_err() with dev_err().
Patrice Chotard (6): usb: ehci-generic: handle phy power on/off usb: ehci-generic: factorize PHY operation usb: ehci-generic: replace pr_err() by dev_err() usb: ohci-generic: handle phy power on/off usb: ohci-generic: factorize PHY operation usb: ohci-generic: replace pr_err() by dev_err()
drivers/usb/host/ehci-generic.c | 98 ++++++++++++++++++++++++++++------------- drivers/usb/host/ohci-generic.c | 95 ++++++++++++++++++++++++++------------- 2 files changed, 133 insertions(+), 60 deletions(-)
Applied all, thanks
participants (2)
-
Marek Vasut
-
patrice.chotard@st.com