From: Jagan Teki Date: Mon, 16 Jul 2018 16:58:31 +0530 Subject: [U-Boot] [RFC 16/35] reset: sunxi: a64: Implement USB resets In-Reply-To: <20180716112850.3961-1-jagan@amarulasolutions.com> References: <20180716112850.3961-1-jagan@amarulasolutions.com> Message-ID: <20180716112850.3961-17-jagan@amarulasolutions.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Implement USB reset asser, deasset, request functions for OHCI, EHCI, OTG and USBPHY reset registers. Signed-off-by: Jagan Teki --- 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