Implement USB clock enable and disble functions for
OHCI, EHCI, OTG and USBPHY gate and clock registers.

Signed-off-by: Jagan Teki <ja...@amarulasolutions.com>
---
 drivers/clk/sunxi/clk_a64.c | 62 ++++++++++++++++++++++++++++++++++---
 1 file changed, 58 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/sunxi/clk_a64.c b/drivers/clk/sunxi/clk_a64.c
index fb9dec3173..3997432260 100644
--- a/drivers/clk/sunxi/clk_a64.c
+++ b/drivers/clk/sunxi/clk_a64.c
@@ -35,18 +35,72 @@ static ulong a64_clk_set_rate(struct clk *clk, ulong rate)
 
 static int a64_clk_enable(struct clk *clk)
 {
+       struct a64_clk_priv *priv = dev_get_priv(clk->dev);
+
        debug("%s(#%ld)\n", __func__, clk->id);
 
-       debug("  unhandled\n");
-       return -EINVAL;
+       switch (clk->id) {
+       case CLK_BUS_OTG:
+       case CLK_BUS_EHCI0:
+       case CLK_BUS_EHCI1:
+               setbits_le32(priv->base + 0x60,
+                            BIT(23 + (clk->id - CLK_BUS_OTG)));
+               return 0;
+       case CLK_BUS_OHCI0:
+       case CLK_BUS_OHCI1:
+               setbits_le32(priv->base + 0x60,
+                            BIT(28 + (clk->id - CLK_BUS_OHCI0)));
+               return 0;
+       case CLK_USB_PHY0:
+       case CLK_USB_PHY1:
+               setbits_le32(priv->base + 0xcc,
+                            BIT(8 + (clk->id - CLK_USB_PHY0)));
+               return 0;
+       case CLK_USB_OHCI0:
+               setbits_le32(priv->base + 0xcc, BIT(16));
+               return 0;
+       case CLK_USB_OHCI1:
+               setbits_le32(priv->base + 0xcc, BIT(17));
+               return 0;
+       default:
+               debug("  unhandled\n");
+               return -ENODEV;
+       }
 }
 
 static int a64_clk_disable(struct clk *clk)
 {
+       struct a64_clk_priv *priv = dev_get_priv(clk->dev);
+
        debug("%s(#%ld)\n", __func__, clk->id);
 
-       debug("  unhandled\n");
-       return -EINVAL;
+       switch (clk->id) {
+       case CLK_BUS_OTG:
+       case CLK_BUS_EHCI0:
+       case CLK_BUS_EHCI1:
+               clrbits_le32(priv->base + 0x60,
+                            BIT(23 + (clk->id - CLK_BUS_OTG)));
+               return 0;
+       case CLK_BUS_OHCI0:
+       case CLK_BUS_OHCI1:
+               clrbits_le32(priv->base + 0x60,
+                            BIT(28 + (clk->id - CLK_BUS_OHCI0)));
+               return 0;
+       case CLK_USB_PHY0:
+       case CLK_USB_PHY1:
+               clrbits_le32(priv->base + 0xcc,
+                            BIT(8 + (clk->id - CLK_USB_PHY0)));
+               return 0;
+       case CLK_USB_OHCI0:
+               clrbits_le32(priv->base + 0xcc, BIT(16));
+               return 0;
+       case CLK_USB_OHCI1:
+               clrbits_le32(priv->base + 0xcc, BIT(17));
+               return 0;
+       default:
+               debug("  unhandled\n");
+               return -ENODEV;
+       }
 }
 
 static struct clk_ops a64_clk_ops = {
-- 
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to