aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharulatha V <charu@ti.com>2011-05-05 10:45:16 -0400
committerTarun Kanti DebBarma <tarun.kanti@ti.com>2012-02-06 03:43:40 -0500
commit0cde8d03dd297fa8e7e88cedeb498d0ed5b7776d (patch)
tree542a4f06bc659180898d9e9d6bc3e540ddd088f1
parent03e128ca35e5da22e9e65ec8ab158ec0e905fdea (diff)
gpio/omap: use flag to identify wakeup domain
In omap3, save/restore context is implemented for GPIO banks 2-6 as GPIO bank1 is in wakeup domain. Instead of identifying bank's power domain by bank id, use 'loses_context' flag which is filled by pwrdm_can_ever_lose_context() during dev_init. For getting the powerdomain pointer, omap_hwmod_get_pwrdm() is used. omap_device_get_pwrdm() could not be used as the pwrdm information needs to be filled in pdata, whereas omap_device_get_pwrdm() could be used only after omap_device_build() call. Signed-off-by: Charulatha V <charu@ti.com> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Reviewed-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Kevin Hilman <khilman@ti.com>
-rw-r--r--arch/arm/mach-omap2/gpio.c6
-rw-r--r--arch/arm/plat-omap/include/plat/gpio.h1
-rw-r--r--drivers/gpio/gpio-omap.c13
3 files changed, 13 insertions, 7 deletions
diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c
index 07ac64850746..076be342ad28 100644
--- a/arch/arm/mach-omap2/gpio.c
+++ b/arch/arm/mach-omap2/gpio.c
@@ -24,6 +24,8 @@
24#include <plat/omap_hwmod.h> 24#include <plat/omap_hwmod.h>
25#include <plat/omap_device.h> 25#include <plat/omap_device.h>
26 26
27#include "powerdomain.h"
28
27static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) 29static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
28{ 30{
29 struct platform_device *pdev; 31 struct platform_device *pdev;
@@ -31,6 +33,7 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
31 struct omap_gpio_dev_attr *dev_attr; 33 struct omap_gpio_dev_attr *dev_attr;
32 char *name = "omap_gpio"; 34 char *name = "omap_gpio";
33 int id; 35 int id;
36 struct powerdomain *pwrdm;
34 37
35 /* 38 /*
36 * extract the device id from name field available in the 39 * extract the device id from name field available in the
@@ -99,6 +102,9 @@ static int omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
99 return -EINVAL; 102 return -EINVAL;
100 } 103 }
101 104
105 pwrdm = omap_hwmod_get_pwrdm(oh);
106 pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm);
107
102 pdev = omap_device_build(name, id - 1, oh, pdata, 108 pdev = omap_device_build(name, id - 1, oh, pdata,
103 sizeof(*pdata), NULL, 0, false); 109 sizeof(*pdata), NULL, 0, false);
104 kfree(pdata); 110 kfree(pdata);
diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h
index acf1c779629e..6eb035c0cc16 100644
--- a/arch/arm/plat-omap/include/plat/gpio.h
+++ b/arch/arm/plat-omap/include/plat/gpio.h
@@ -198,6 +198,7 @@ struct omap_gpio_platform_data {
198 int bank_width; /* GPIO bank width */ 198 int bank_width; /* GPIO bank width */
199 int bank_stride; /* Only needed for omap1 MPUIO */ 199 int bank_stride; /* Only needed for omap1 MPUIO */
200 bool dbck_flag; /* dbck required or not - True for OMAP3&4 */ 200 bool dbck_flag; /* dbck required or not - True for OMAP3&4 */
201 bool loses_context; /* whether the bank would ever lose context */
201 202
202 struct omap_gpio_reg_offs *regs; 203 struct omap_gpio_reg_offs *regs;
203}; 204};
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 6ea7390e7801..07efa15c3549 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -56,6 +56,7 @@ struct gpio_bank {
56 u32 dbck_enable_mask; 56 u32 dbck_enable_mask;
57 struct device *dev; 57 struct device *dev;
58 bool dbck_flag; 58 bool dbck_flag;
59 bool loses_context;
59 int stride; 60 int stride;
60 u32 width; 61 u32 width;
61 u16 id; 62 u16 id;
@@ -1181,7 +1182,7 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
1181 bank->dbck_flag = pdata->dbck_flag; 1182 bank->dbck_flag = pdata->dbck_flag;
1182 bank->stride = pdata->bank_stride; 1183 bank->stride = pdata->bank_stride;
1183 bank->width = pdata->bank_width; 1184 bank->width = pdata->bank_width;
1184 1185 bank->loses_context = pdata->loses_context;
1185 bank->regs = pdata->regs; 1186 bank->regs = pdata->regs;
1186 1187
1187 if (bank->regs->set_dataout && bank->regs->clr_dataout) 1188 if (bank->regs->set_dataout && bank->regs->clr_dataout)
@@ -1337,8 +1338,7 @@ void omap2_gpio_prepare_for_idle(int off_mode)
1337 u32 l1 = 0, l2 = 0; 1338 u32 l1 = 0, l2 = 0;
1338 int j; 1339 int j;
1339 1340
1340 /* TODO: Do not use cpu_is_omap34xx */ 1341 if (!bank->loses_context)
1341 if ((cpu_is_omap34xx()) && (bank->id == 0))
1342 continue; 1342 continue;
1343 1343
1344 for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) 1344 for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
@@ -1405,8 +1405,7 @@ void omap2_gpio_resume_after_idle(void)
1405 u32 l = 0, gen, gen0, gen1; 1405 u32 l = 0, gen, gen0, gen1;
1406 int j; 1406 int j;
1407 1407
1408 /* TODO: Do not use cpu_is_omap34xx */ 1408 if (!bank->loses_context)
1409 if ((cpu_is_omap34xx()) && (bank->id == 0))
1410 continue; 1409 continue;
1411 1410
1412 for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++) 1411 for (j = 0; j < hweight_long(bank->dbck_enable_mask); j++)
@@ -1505,7 +1504,7 @@ void omap_gpio_save_context(void)
1505 list_for_each_entry(bank, &omap_gpio_list, node) { 1504 list_for_each_entry(bank, &omap_gpio_list, node) {
1506 i++; 1505 i++;
1507 1506
1508 if (bank->id == 0) 1507 if (!bank->loses_context)
1509 continue; 1508 continue;
1510 1509
1511 gpio_context[i].irqenable1 = 1510 gpio_context[i].irqenable1 =
@@ -1539,7 +1538,7 @@ void omap_gpio_restore_context(void)
1539 list_for_each_entry(bank, &omap_gpio_list, node) { 1538 list_for_each_entry(bank, &omap_gpio_list, node) {
1540 i++; 1539 i++;
1541 1540
1542 if (bank->id == 0) 1541 if (!bank->loses_context)
1543 continue; 1542 continue;
1544 1543
1545 __raw_writel(gpio_context[i].irqenable1, 1544 __raw_writel(gpio_context[i].irqenable1,