Implement USB reset asser, deasset, request functions for OHCI, EHCI, OTG and USBPHY reset registers.
Signed-off-by: Jagan Teki <ja...@amarulasolutions.com> --- drivers/reset/sunxi/reset_a64.c | 60 +++++++++++++++++++++++++++++---- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/drivers/reset/sunxi/reset_a64.c b/drivers/reset/sunxi/reset_a64.c index 595af5aa6e..389641c7cd 100644 --- a/drivers/reset/sunxi/reset_a64.c +++ b/drivers/reset/sunxi/reset_a64.c @@ -20,6 +20,10 @@ static int a64_reset_request(struct reset_ctl *reset_ctl) { debug("%s(#%ld)\n", __func__, reset_ctl->id); + /* check dt-bindings/reset/sun50i-a64-ccu.h for max id */ + if (reset_ctl->id > 50) + return -EINVAL; + return 0; } @@ -32,18 +36,58 @@ static int a64_reset_free(struct reset_ctl *reset_ctl) static int a64_reset_assert(struct reset_ctl *reset_ctl) { - debug("%s(#%ld)\n", __func__, reset_ctl->id); + struct a64_reset_priv *priv = dev_get_priv(reset_ctl->dev); - debug(" unhandled\n"); - return -EINVAL; + debug("%s(#%ld)\n", __func__, reset_ctl->id); + switch(reset_ctl->id) { + case RST_BUS_OTG: + case RST_BUS_EHCI0: + case RST_BUS_EHCI1: + clrbits_le32(priv->base + 0x2c0, + BIT(23 + (reset_ctl->id - RST_BUS_OTG))); + return 0; + case RST_BUS_OHCI0: + case RST_BUS_OHCI1: + clrbits_le32(priv->base + 0x2c0, + BIT(28 + (reset_ctl->id - RST_BUS_OHCI0))); + return 0; + case RST_USB_PHY0: + case RST_USB_PHY1: + clrbits_le32(priv->base + 0x0cc, + BIT(reset_ctl->id - RST_USB_PHY0)); + return 0; + default: + debug("%s (RST#%ld) unhandled\n", __func__, reset_ctl->id); + return -ENODEV; + } } static int a64_reset_deassert(struct reset_ctl *reset_ctl) { - debug("%s(#%ld)\n", __func__, reset_ctl->id); + struct a64_reset_priv *priv = dev_get_priv(reset_ctl->dev); - debug(" unhandled\n"); - return -EINVAL; + debug("%s(#%ld)\n", __func__, reset_ctl->id); + switch(reset_ctl->id) { + case RST_BUS_OTG: + case RST_BUS_EHCI0: + case RST_BUS_EHCI1: + setbits_le32(priv->base + 0x2c0, + BIT(23 + (reset_ctl->id - RST_BUS_OTG))); + return 0; + case RST_BUS_OHCI0: + case RST_BUS_OHCI1: + setbits_le32(priv->base + 0x2c0, + BIT(28 + (reset_ctl->id - RST_BUS_OHCI0))); + return 0; + case RST_USB_PHY0: + case RST_USB_PHY1: + setbits_le32(priv->base + 0x0cc, + BIT(reset_ctl->id - RST_USB_PHY0)); + return 0; + default: + debug("%s (RST#%ld) unhandled\n", __func__, reset_ctl->id); + return -ENODEV; + } } struct reset_ops a64_reset_ops = { @@ -55,6 +99,10 @@ struct reset_ops a64_reset_ops = { static int a64_reset_probe(struct udevice *dev) { + struct a64_reset_priv *priv = dev_get_priv(dev); + + priv->base = dev_read_addr_ptr(dev); + return 0; } -- 2.17.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot