[PATCH V4] phy: nop-phy: Enable reset-gpios support

Some usb-nop-xceiv devices use a gpio take them out of reset. Add a reset function to put them into that state. This is similar to how Linux handles the usb-nop-xceiv driver.
Signed-off-by: Adam Ford aford173@gmail.com --- V4: Fix build errors on k2e_evm
V3: Encapsulate the nop_phy_ops reference to nop_phy_reset in an if-def so it doesn't appear when DM_GPIO is not enabled.
V2: Only use the GPIO functions when DM_GPIO is enabled Add error handling so if the GPIO fails, it will shutdown the clocks and return with the error code. Call nop_phy_reset() instead of repeating the same code.
diff --git a/drivers/phy/nop-phy.c b/drivers/phy/nop-phy.c index 9f12ebc062..b08eedd4d4 100644 --- a/drivers/phy/nop-phy.c +++ b/drivers/phy/nop-phy.c @@ -10,25 +10,54 @@ #include <dm/device.h> #include <dm/device_compat.h> #include <generic-phy.h> +#include <asm-generic/gpio.h>
struct nop_phy_priv { struct clk_bulk bulk; +#if CONFIG_IS_ENABLED(DM_GPIO) + struct gpio_desc reset_gpio; +#endif };
+#if CONFIG_IS_ENABLED(DM_GPIO) +static int nop_phy_reset(struct phy *phy) +{ + struct nop_phy_priv *priv = dev_get_priv(phy->dev); + + /* Return if there is no gpio since it's optional */ + if (!dm_gpio_is_valid(&priv->reset_gpio)) + return 0; + + return dm_gpio_set_value(&priv->reset_gpio, false); +} +#endif + static int nop_phy_init(struct phy *phy) { struct nop_phy_priv *priv = dev_get_priv(phy->dev); + int ret = 0;
- if (CONFIG_IS_ENABLED(CLK)) - return clk_enable_bulk(&priv->bulk); + if (CONFIG_IS_ENABLED(CLK)) { + ret = clk_enable_bulk(&priv->bulk); + if (ret) + return ret; + }
+#if CONFIG_IS_ENABLED(DM_GPIO) + ret = nop_phy_reset(phy); + if (ret) { + if (CONFIG_IS_ENABLED(CLK)) + clk_disable_bulk(&priv->bulk); + return ret; + } +#endif return 0; }
static int nop_phy_probe(struct udevice *dev) { struct nop_phy_priv *priv = dev_get_priv(dev); - int ret; + int ret = 0;
if (CONFIG_IS_ENABLED(CLK)) { ret = clk_get_bulk(dev, &priv->bulk); @@ -37,6 +66,13 @@ static int nop_phy_probe(struct udevice *dev) return ret; } } +#if CONFIG_IS_ENABLED(DM_GPIO) + ret = gpio_request_by_name(dev, "reset-gpios", 0, + &priv->reset_gpio, + GPIOD_IS_OUT); +#endif + if (ret != -ENOENT) + return ret;
return 0; } @@ -49,6 +85,9 @@ static const struct udevice_id nop_phy_ids[] = {
static struct phy_ops nop_phy_ops = { .init = nop_phy_init, +#if CONFIG_IS_ENABLED(DM_GPIO) + .reset = nop_phy_reset, +#endif };
U_BOOT_DRIVER(nop_phy) = {

On Sat, Jan 29, 2022 at 07:27:47AM -0600, Adam Ford wrote:
Some usb-nop-xceiv devices use a gpio take them out of reset. Add a reset function to put them into that state. This is similar to how Linux handles the usb-nop-xceiv driver.
Signed-off-by: Adam Ford aford173@gmail.com
Applied to u-boot/master, thanks!
participants (2)
-
Adam Ford
-
Tom Rini