]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - sitara-epos/sitara-epos-kernel.git/commitdiff
arm:omap:gpio - Handle Clocks properly in Suspend/Resume
authorHebbar, Gururaja <gururaja.hebbar@ti.com>
Thu, 12 Jan 2012 16:20:58 +0000 (21:50 +0530)
committerVaibhav Hiremath <hvaibhav@ti.com>
Mon, 23 Jan 2012 19:14:49 +0000 (00:44 +0530)
Clocks were not enabled/disabled during suspend-resume. This patch
corrects the same.

Signed-off-by: Hebbar, Gururaja <gururaja.hebbar@ti.com>
drivers/gpio/gpio-omap.c

index dd95967a5e5192d02cc9bfb21bc5787b674a5c4f..4b1724464719708cb7df1a8d8aaf06ca86322317 100644 (file)
@@ -28,6 +28,8 @@
 #include <asm/gpio.h>
 #include <asm/mach/irq.h>
 
+#include <plat/clock.h>
+
 struct gpio_bank {
        unsigned long pbase;
        void __iomem *base;
@@ -49,6 +51,7 @@ struct gpio_bank {
        spinlock_t lock;
        struct gpio_chip chip;
        struct clk *dbck;
+       struct clk *fclk;
        u32 mod_usage;
        u32 dbck_enable_mask;
        struct device *dev;
@@ -1219,6 +1222,12 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
+       bank->fclk = clk_get(bank->dev, "fclk");
+       if (IS_ERR(bank->fclk)) {
+               dev_err(bank->dev, "Could not get gpio fclk\n");
+               bank->fclk = NULL;
+       }
+
        pm_runtime_enable(bank->dev);
        pm_runtime_get_sync(bank->dev);
 
@@ -1247,6 +1256,10 @@ static int omap_gpio_suspend(void)
                void __iomem *wake_set;
                unsigned long flags;
 
+               if ((bank->fclk) && (bank->fclk->usecount <= 0))
+                       if (clk_enable(bank->fclk) < 0)
+                               dev_err(bank->dev, "Could not enable fclk\n");
+
                switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP16XX
                case METHOD_GPIO_1610:
@@ -1278,6 +1291,9 @@ static int omap_gpio_suspend(void)
                __raw_writel(0xffffffff, wake_clear);
                __raw_writel(bank->suspend_wakeup, wake_set);
                spin_unlock_irqrestore(&bank->lock, flags);
+
+               if ((bank->fclk) && (bank->fclk->usecount > 0))
+                       clk_disable(bank->fclk);
        }
 
        return 0;
@@ -1296,6 +1312,10 @@ static void omap_gpio_resume(void)
                void __iomem *wake_set;
                unsigned long flags;
 
+               if ((bank->fclk) && (bank->fclk->usecount <= 0))
+                       if (clk_enable(bank->fclk) < 0)
+                               dev_err(bank->dev, "Could not enable fclk\n");
+
                switch (bank->method) {
 #ifdef CONFIG_ARCH_OMAP16XX
                case METHOD_GPIO_1610: