On some SoC (such as RZ/N1) it is necessary to enable clocks prior to
using the register interface.

Signed-off-by: Ralph Siemsen <[email protected]>
---
 drivers/gpio/dwapb_gpio.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c
index 7ab48780332..6fa50a2c2af 100644
--- a/drivers/gpio/dwapb_gpio.c
+++ b/drivers/gpio/dwapb_gpio.c
@@ -7,6 +7,7 @@
 
 #include <asm/gpio.h>
 #include <asm/io.h>
+#include <clk.h>
 #include <dm/device.h>
 #include <dm/device-internal.h>
 #include <dm/device_compat.h>
@@ -28,6 +29,7 @@
 
 struct gpio_dwapb_priv {
        struct reset_ctl_bulk   resets;
+       struct clk_bulk         clks;
 };
 
 struct gpio_dwapb_plat {
@@ -136,8 +138,13 @@ static int gpio_dwapb_probe(struct udevice *dev)
 {
        struct gpio_dev_priv *priv = dev_get_uclass_priv(dev);
        struct gpio_dwapb_plat *plat = dev_get_plat(dev);
+       struct gpio_dwapb_priv *dw_priv = dev_get_priv(dev);
 
        if (!plat) {
+               /* Enable clocks on parent device only */
+               if (clk_get_bulk(dev, &dw_priv->clks) == 0)
+                       clk_enable_bulk(&dw_priv->clks);
+
                /* Reset on parent device only */
                return gpio_dwapb_reset(dev);
        }
@@ -214,8 +221,10 @@ static int gpio_dwapb_remove(struct udevice *dev)
        struct gpio_dwapb_plat *plat = dev_get_plat(dev);
        struct gpio_dwapb_priv *priv = dev_get_priv(dev);
 
-       if (!plat && priv)
+       if (!plat && priv) {
+               clk_release_bulk(&priv->clks);
                return reset_release_bulk(&priv->resets);
+       }
 
        return 0;
 }

-- 
2.55.0

Reply via email to