|
@@ -1120,11 +1120,17 @@ static int omap_gpio_probe(struct platform_device *pdev)
|
|
|
bank->width = pdata->bank_width;
|
|
|
bank->is_mpuio = pdata->is_mpuio;
|
|
|
bank->non_wakeup_gpios = pdata->non_wakeup_gpios;
|
|
|
- bank->loses_context = pdata->loses_context;
|
|
|
bank->regs = pdata->regs;
|
|
|
#ifdef CONFIG_OF_GPIO
|
|
|
bank->chip.of_node = of_node_get(node);
|
|
|
#endif
|
|
|
+ if (node) {
|
|
|
+ if (!of_property_read_bool(node, "ti,gpio-always-on"))
|
|
|
+ bank->loses_context = true;
|
|
|
+ } else {
|
|
|
+ bank->loses_context = pdata->loses_context;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
bank->domain = irq_domain_add_linear(node, bank->width,
|
|
|
&irq_domain_simple_ops, NULL);
|
|
@@ -1258,9 +1264,9 @@ static int omap_gpio_runtime_resume(struct device *dev)
|
|
|
{
|
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
|
struct gpio_bank *bank = platform_get_drvdata(pdev);
|
|
|
- int context_lost_cnt_after;
|
|
|
u32 l = 0, gen, gen0, gen1;
|
|
|
unsigned long flags;
|
|
|
+ int c;
|
|
|
|
|
|
spin_lock_irqsave(&bank->lock, flags);
|
|
|
_gpio_dbck_enable(bank);
|
|
@@ -1276,14 +1282,17 @@ static int omap_gpio_runtime_resume(struct device *dev)
|
|
|
__raw_writel(bank->context.risingdetect,
|
|
|
bank->base + bank->regs->risingdetect);
|
|
|
|
|
|
- if (bank->get_context_loss_count) {
|
|
|
- context_lost_cnt_after =
|
|
|
- bank->get_context_loss_count(bank->dev);
|
|
|
- if (context_lost_cnt_after != bank->context_loss_count) {
|
|
|
+ if (bank->loses_context) {
|
|
|
+ if (!bank->get_context_loss_count) {
|
|
|
omap_gpio_restore_context(bank);
|
|
|
} else {
|
|
|
- spin_unlock_irqrestore(&bank->lock, flags);
|
|
|
- return 0;
|
|
|
+ c = bank->get_context_loss_count(bank->dev);
|
|
|
+ if (c != bank->context_loss_count) {
|
|
|
+ omap_gpio_restore_context(bank);
|
|
|
+ } else {
|
|
|
+ spin_unlock_irqrestore(&bank->lock, flags);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|