aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-omap.c
diff options
context:
space:
mode:
authorTarun Kanti DebBarma <tarun.kanti@ti.com>2011-08-30 05:35:44 -0400
committerTarun Kanti DebBarma <tarun.kanti@ti.com>2012-02-06 03:43:41 -0500
commit9ea14d8cbbf1c8fc941e8e8a12aa0a3edc5c336e (patch)
treee31c48539315249da6ee68b16452d1f5abf2e6cb /drivers/gpio/gpio-omap.c
parent6ed87c5b66ca81996fae2dae6d1e702d66b9832b (diff)
gpio/omap: use level/edge detect reg offsets
By adding level and edge detection register offsets and then initializing them correctly according to OMAP versions during device registrations we can now remove lot of revision checks in these functions. Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com> Signed-off-by: Charulatha V <charu@ti.com> Reviewed-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Acked-by: Tony Lindgren <tony@atomide.com> Reviewed-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'drivers/gpio/gpio-omap.c')
-rw-r--r--drivers/gpio/gpio-omap.c114
1 files changed, 32 insertions, 82 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 3daedffbd707..991dd39f6eda 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -257,15 +257,9 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
257 bank->enabled_non_wakeup_gpios &= ~gpio_bit; 257 bank->enabled_non_wakeup_gpios &= ~gpio_bit;
258 } 258 }
259 259
260 if (cpu_is_omap44xx()) { 260 bank->level_mask =
261 bank->level_mask = 261 __raw_readl(bank->base + bank->regs->leveldetect0) |
262 __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT0) | 262 __raw_readl(bank->base + bank->regs->leveldetect1);
263 __raw_readl(bank->base + OMAP4_GPIO_LEVELDETECT1);
264 } else {
265 bank->level_mask =
266 __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) |
267 __raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1);
268 }
269} 263}
270#endif 264#endif
271 265
@@ -405,12 +399,12 @@ static int gpio_irq_type(struct irq_data *d, unsigned type)
405 if (type & ~IRQ_TYPE_SENSE_MASK) 399 if (type & ~IRQ_TYPE_SENSE_MASK)
406 return -EINVAL; 400 return -EINVAL;
407 401
408 /* OMAP1 allows only only edge triggering */ 402 bank = irq_data_get_irq_chip_data(d);
409 if (!cpu_class_is_omap2() 403
410 && (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH))) 404 if (!bank->regs->leveldetect0 &&
405 (type & (IRQ_TYPE_LEVEL_LOW|IRQ_TYPE_LEVEL_HIGH)))
411 return -EINVAL; 406 return -EINVAL;
412 407
413 bank = irq_data_get_irq_chip_data(d);
414 spin_lock_irqsave(&bank->lock, flags); 408 spin_lock_irqsave(&bank->lock, flags);
415 retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type); 409 retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type);
416 spin_unlock_irqrestore(&bank->lock, flags); 410 spin_unlock_irqrestore(&bank->lock, flags);
@@ -658,9 +652,8 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
658 if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO)) 652 if (cpu_is_omap15xx() && (bank->method == METHOD_MPUIO))
659 isr &= 0x0000ffff; 653 isr &= 0x0000ffff;
660 654
661 if (cpu_class_is_omap2()) { 655 if (bank->level_mask)
662 level_mask = bank->level_mask & enabled; 656 level_mask = bank->level_mask & enabled;
663 }
664 657
665 /* clear edge sensitive interrupts before handler(s) are 658 /* clear edge sensitive interrupts before handler(s) are
666 called so that we don't miss any interrupt occurred while 659 called so that we don't miss any interrupt occurred while
@@ -1271,40 +1264,18 @@ void omap2_gpio_prepare_for_idle(int off_mode)
1271 if (!(bank->enabled_non_wakeup_gpios)) 1264 if (!(bank->enabled_non_wakeup_gpios))
1272 goto save_gpio_context; 1265 goto save_gpio_context;
1273 1266
1274 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 1267 bank->saved_datain = __raw_readl(bank->base +
1275 bank->saved_datain = __raw_readl(bank->base + 1268 bank->regs->datain);
1276 OMAP24XX_GPIO_DATAIN); 1269 l1 = __raw_readl(bank->base + bank->regs->fallingdetect);
1277 l1 = __raw_readl(bank->base + 1270 l2 = __raw_readl(bank->base + bank->regs->risingdetect);
1278 OMAP24XX_GPIO_FALLINGDETECT);
1279 l2 = __raw_readl(bank->base +
1280 OMAP24XX_GPIO_RISINGDETECT);
1281 }
1282
1283 if (cpu_is_omap44xx()) {
1284 bank->saved_datain = __raw_readl(bank->base +
1285 OMAP4_GPIO_DATAIN);
1286 l1 = __raw_readl(bank->base +
1287 OMAP4_GPIO_FALLINGDETECT);
1288 l2 = __raw_readl(bank->base +
1289 OMAP4_GPIO_RISINGDETECT);
1290 }
1291 1271
1292 bank->saved_fallingdetect = l1; 1272 bank->saved_fallingdetect = l1;
1293 bank->saved_risingdetect = l2; 1273 bank->saved_risingdetect = l2;
1294 l1 &= ~bank->enabled_non_wakeup_gpios; 1274 l1 &= ~bank->enabled_non_wakeup_gpios;
1295 l2 &= ~bank->enabled_non_wakeup_gpios; 1275 l2 &= ~bank->enabled_non_wakeup_gpios;
1296 1276
1297 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 1277 __raw_writel(l1, bank->base + bank->regs->fallingdetect);
1298 __raw_writel(l1, bank->base + 1278 __raw_writel(l2, bank->base + bank->regs->risingdetect);
1299 OMAP24XX_GPIO_FALLINGDETECT);
1300 __raw_writel(l2, bank->base +
1301 OMAP24XX_GPIO_RISINGDETECT);
1302 }
1303
1304 if (cpu_is_omap44xx()) {
1305 __raw_writel(l1, bank->base + OMAP4_GPIO_FALLINGDETECT);
1306 __raw_writel(l2, bank->base + OMAP4_GPIO_RISINGDETECT);
1307 }
1308 1279
1309save_gpio_context: 1280save_gpio_context:
1310 if (bank->get_context_loss_count) 1281 if (bank->get_context_loss_count)
@@ -1341,21 +1312,11 @@ void omap2_gpio_resume_after_idle(void)
1341 if (!(bank->enabled_non_wakeup_gpios)) 1312 if (!(bank->enabled_non_wakeup_gpios))
1342 continue; 1313 continue;
1343 1314
1344 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 1315 __raw_writel(bank->saved_fallingdetect,
1345 __raw_writel(bank->saved_fallingdetect, 1316 bank->base + bank->regs->fallingdetect);
1346 bank->base + OMAP24XX_GPIO_FALLINGDETECT); 1317 __raw_writel(bank->saved_risingdetect,
1347 __raw_writel(bank->saved_risingdetect, 1318 bank->base + bank->regs->risingdetect);
1348 bank->base + OMAP24XX_GPIO_RISINGDETECT); 1319 l = __raw_readl(bank->base + bank->regs->datain);
1349 l = __raw_readl(bank->base + OMAP24XX_GPIO_DATAIN);
1350 }
1351
1352 if (cpu_is_omap44xx()) {
1353 __raw_writel(bank->saved_fallingdetect,
1354 bank->base + OMAP4_GPIO_FALLINGDETECT);
1355 __raw_writel(bank->saved_risingdetect,
1356 bank->base + OMAP4_GPIO_RISINGDETECT);
1357 l = __raw_readl(bank->base + OMAP4_GPIO_DATAIN);
1358 }
1359 1320
1360 /* Check if any of the non-wakeup interrupt GPIOs have changed 1321 /* Check if any of the non-wakeup interrupt GPIOs have changed
1361 * state. If so, generate an IRQ by software. This is 1322 * state. If so, generate an IRQ by software. This is
@@ -1383,35 +1344,24 @@ void omap2_gpio_resume_after_idle(void)
1383 if (gen) { 1344 if (gen) {
1384 u32 old0, old1; 1345 u32 old0, old1;
1385 1346
1347 old0 = __raw_readl(bank->base +
1348 bank->regs->leveldetect0);
1349 old1 = __raw_readl(bank->base +
1350 bank->regs->leveldetect1);
1351
1386 if (cpu_is_omap24xx() || cpu_is_omap34xx()) { 1352 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
1387 old0 = __raw_readl(bank->base + 1353 old0 |= gen;
1388 OMAP24XX_GPIO_LEVELDETECT0); 1354 old1 |= gen;
1389 old1 = __raw_readl(bank->base +
1390 OMAP24XX_GPIO_LEVELDETECT1);
1391 __raw_writel(old0 | gen, bank->base +
1392 OMAP24XX_GPIO_LEVELDETECT0);
1393 __raw_writel(old1 | gen, bank->base +
1394 OMAP24XX_GPIO_LEVELDETECT1);
1395 __raw_writel(old0, bank->base +
1396 OMAP24XX_GPIO_LEVELDETECT0);
1397 __raw_writel(old1, bank->base +
1398 OMAP24XX_GPIO_LEVELDETECT1);
1399 } 1355 }
1400 1356
1401 if (cpu_is_omap44xx()) { 1357 if (cpu_is_omap44xx()) {
1402 old0 = __raw_readl(bank->base + 1358 old0 |= l;
1403 OMAP4_GPIO_LEVELDETECT0); 1359 old1 |= l;
1404 old1 = __raw_readl(bank->base +
1405 OMAP4_GPIO_LEVELDETECT1);
1406 __raw_writel(old0 | l, bank->base +
1407 OMAP4_GPIO_LEVELDETECT0);
1408 __raw_writel(old1 | l, bank->base +
1409 OMAP4_GPIO_LEVELDETECT1);
1410 __raw_writel(old0, bank->base +
1411 OMAP4_GPIO_LEVELDETECT0);
1412 __raw_writel(old1, bank->base +
1413 OMAP4_GPIO_LEVELDETECT1);
1414 } 1360 }
1361 __raw_writel(old0, bank->base +
1362 bank->regs->leveldetect0);
1363 __raw_writel(old1, bank->base +
1364 bank->regs->leveldetect1);
1415 } 1365 }
1416 } 1366 }
1417} 1367}