提交 065cd795 编写于 作者: T Tarun Kanti DebBarma

gpio/omap: optimize suspend and resume functions

There is no need to operate on all the banks every time the function is called.
Just operate on the current bank passed by the framework.
Signed-off-by: NTarun Kanti DebBarma <tarun.kanti@ti.com>
Reviewed-by: NSantosh Shilimkar <santosh.shilimkar@ti.com>
Reviewed-by: NKevin Hilman <khilman@ti.com>
Signed-off-by: NKevin Hilman <khilman@ti.com>
上级 55b93c32
...@@ -1052,6 +1052,8 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev) ...@@ -1052,6 +1052,8 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
goto err_free; goto err_free;
} }
platform_set_drvdata(pdev, bank);
pm_runtime_enable(bank->dev); pm_runtime_enable(bank->dev);
pm_runtime_irq_safe(bank->dev); pm_runtime_irq_safe(bank->dev);
pm_runtime_get_sync(bank->dev); pm_runtime_get_sync(bank->dev);
...@@ -1080,44 +1082,46 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev) ...@@ -1080,44 +1082,46 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
#if defined(CONFIG_PM_SLEEP) #if defined(CONFIG_PM_SLEEP)
static int omap_gpio_suspend(struct device *dev) static int omap_gpio_suspend(struct device *dev)
{ {
struct gpio_bank *bank; struct platform_device *pdev = to_platform_device(dev);
struct gpio_bank *bank = platform_get_drvdata(pdev);
void __iomem *base = bank->base;
void __iomem *wakeup_enable;
unsigned long flags;
list_for_each_entry(bank, &omap_gpio_list, node) { if (!bank->mod_usage || !bank->loses_context)
void __iomem *base = bank->base; return 0;
void __iomem *wake_status;
unsigned long flags;
if (!bank->regs->wkup_en) if (!bank->regs->wkup_en || !bank->suspend_wakeup)
return 0; return 0;
wake_status = bank->base + bank->regs->wkup_en; wakeup_enable = bank->base + bank->regs->wkup_en;
spin_lock_irqsave(&bank->lock, flags); spin_lock_irqsave(&bank->lock, flags);
bank->saved_wakeup = __raw_readl(wake_status); bank->saved_wakeup = __raw_readl(wakeup_enable);
_gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0); _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
_gpio_rmw(base, bank->regs->wkup_en, bank->suspend_wakeup, 1); _gpio_rmw(base, bank->regs->wkup_en, bank->suspend_wakeup, 1);
spin_unlock_irqrestore(&bank->lock, flags); spin_unlock_irqrestore(&bank->lock, flags);
}
return 0; return 0;
} }
static int omap_gpio_resume(struct device *dev) static int omap_gpio_resume(struct device *dev)
{ {
struct gpio_bank *bank; struct platform_device *pdev = to_platform_device(dev);
struct gpio_bank *bank = platform_get_drvdata(pdev);
void __iomem *base = bank->base;
unsigned long flags;
list_for_each_entry(bank, &omap_gpio_list, node) { if (!bank->mod_usage || !bank->loses_context)
void __iomem *base = bank->base; return 0;
unsigned long flags;
if (!bank->regs->wkup_en) if (!bank->regs->wkup_en || !bank->saved_wakeup)
return 0; return 0;
spin_lock_irqsave(&bank->lock, flags); spin_lock_irqsave(&bank->lock, flags);
_gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0); _gpio_rmw(base, bank->regs->wkup_en, 0xffffffff, 0);
_gpio_rmw(base, bank->regs->wkup_en, bank->saved_wakeup, 1); _gpio_rmw(base, bank->regs->wkup_en, bank->saved_wakeup, 1);
spin_unlock_irqrestore(&bank->lock, flags); spin_unlock_irqrestore(&bank->lock, flags);
}
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册