+101
-57
drivers/gpio/gpio-omap.c
+101
-57
drivers/gpio/gpio-omap.c
···
63
63
struct gpio_chip chip;
64
64
struct clk *dbck;
65
65
u32 mod_usage;
66
+
u32 irq_usage;
66
67
u32 dbck_enable_mask;
67
68
bool dbck_enabled;
68
69
struct device *dev;
···
86
85
#define GPIO_INDEX(bank, gpio) (gpio % bank->width)
87
86
#define GPIO_BIT(bank, gpio) (1 << GPIO_INDEX(bank, gpio))
88
87
#define GPIO_MOD_CTRL_BIT BIT(0)
88
+
89
+
#define BANK_USED(bank) (bank->mod_usage || bank->irq_usage)
90
+
#define LINE_USED(line, offset) (line & (1 << offset))
89
91
90
92
static int irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq)
91
93
{
···
424
420
return 0;
425
421
}
426
422
423
+
static void _enable_gpio_module(struct gpio_bank *bank, unsigned offset)
424
+
{
425
+
if (bank->regs->pinctrl) {
426
+
void __iomem *reg = bank->base + bank->regs->pinctrl;
427
+
428
+
/* Claim the pin for MPU */
429
+
__raw_writel(__raw_readl(reg) | (1 << offset), reg);
430
+
}
431
+
432
+
if (bank->regs->ctrl && !BANK_USED(bank)) {
433
+
void __iomem *reg = bank->base + bank->regs->ctrl;
434
+
u32 ctrl;
435
+
436
+
ctrl = __raw_readl(reg);
437
+
/* Module is enabled, clocks are not gated */
438
+
ctrl &= ~GPIO_MOD_CTRL_BIT;
439
+
__raw_writel(ctrl, reg);
440
+
bank->context.ctrl = ctrl;
441
+
}
442
+
}
443
+
444
+
static void _disable_gpio_module(struct gpio_bank *bank, unsigned offset)
445
+
{
446
+
void __iomem *base = bank->base;
447
+
448
+
if (bank->regs->wkup_en &&
449
+
!LINE_USED(bank->mod_usage, offset) &&
450
+
!LINE_USED(bank->irq_usage, offset)) {
451
+
/* Disable wake-up during idle for dynamic tick */
452
+
_gpio_rmw(base, bank->regs->wkup_en, 1 << offset, 0);
453
+
bank->context.wake_en =
454
+
__raw_readl(bank->base + bank->regs->wkup_en);
455
+
}
456
+
457
+
if (bank->regs->ctrl && !BANK_USED(bank)) {
458
+
void __iomem *reg = bank->base + bank->regs->ctrl;
459
+
u32 ctrl;
460
+
461
+
ctrl = __raw_readl(reg);
462
+
/* Module is disabled, clocks are gated */
463
+
ctrl |= GPIO_MOD_CTRL_BIT;
464
+
__raw_writel(ctrl, reg);
465
+
bank->context.ctrl = ctrl;
466
+
}
467
+
}
468
+
469
+
static int gpio_is_input(struct gpio_bank *bank, int mask)
470
+
{
471
+
void __iomem *reg = bank->base + bank->regs->direction;
472
+
473
+
return __raw_readl(reg) & mask;
474
+
}
475
+
427
476
static int gpio_irq_type(struct irq_data *d, unsigned type)
428
477
{
429
478
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
430
479
unsigned gpio = 0;
431
480
int retval;
432
481
unsigned long flags;
482
+
unsigned offset;
433
483
434
-
if (WARN_ON(!bank->mod_usage))
435
-
return -EINVAL;
484
+
if (!BANK_USED(bank))
485
+
pm_runtime_get_sync(bank->dev);
436
486
437
487
#ifdef CONFIG_ARCH_OMAP1
438
488
if (d->irq > IH_MPUIO_BASE)
···
504
446
return -EINVAL;
505
447
506
448
spin_lock_irqsave(&bank->lock, flags);
507
-
retval = _set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), type);
449
+
offset = GPIO_INDEX(bank, gpio);
450
+
retval = _set_gpio_triggering(bank, offset, type);
451
+
if (!LINE_USED(bank->mod_usage, offset)) {
452
+
_enable_gpio_module(bank, offset);
453
+
_set_gpio_direction(bank, offset, 1);
454
+
} else if (!gpio_is_input(bank, 1 << offset)) {
455
+
spin_unlock_irqrestore(&bank->lock, flags);
456
+
return -EINVAL;
457
+
}
458
+
459
+
bank->irq_usage |= 1 << GPIO_INDEX(bank, gpio);
508
460
spin_unlock_irqrestore(&bank->lock, flags);
509
461
510
462
if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
···
671
603
* If this is the first gpio_request for the bank,
672
604
* enable the bank module.
673
605
*/
674
-
if (!bank->mod_usage)
606
+
if (!BANK_USED(bank))
675
607
pm_runtime_get_sync(bank->dev);
676
608
677
609
spin_lock_irqsave(&bank->lock, flags);
678
610
/* Set trigger to none. You need to enable the desired trigger with
679
-
* request_irq() or set_irq_type().
611
+
* request_irq() or set_irq_type(). Only do this if the IRQ line has
612
+
* not already been requested.
680
613
*/
681
-
_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
682
-
683
-
if (bank->regs->pinctrl) {
684
-
void __iomem *reg = bank->base + bank->regs->pinctrl;
685
-
686
-
/* Claim the pin for MPU */
687
-
__raw_writel(__raw_readl(reg) | (1 << offset), reg);
614
+
if (!LINE_USED(bank->irq_usage, offset)) {
615
+
_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE);
616
+
_enable_gpio_module(bank, offset);
688
617
}
689
-
690
-
if (bank->regs->ctrl && !bank->mod_usage) {
691
-
void __iomem *reg = bank->base + bank->regs->ctrl;
692
-
u32 ctrl;
693
-
694
-
ctrl = __raw_readl(reg);
695
-
/* Module is enabled, clocks are not gated */
696
-
ctrl &= ~GPIO_MOD_CTRL_BIT;
697
-
__raw_writel(ctrl, reg);
698
-
bank->context.ctrl = ctrl;
699
-
}
700
-
701
618
bank->mod_usage |= 1 << offset;
702
-
703
619
spin_unlock_irqrestore(&bank->lock, flags);
704
620
705
621
return 0;
···
692
640
static void omap_gpio_free(struct gpio_chip *chip, unsigned offset)
693
641
{
694
642
struct gpio_bank *bank = container_of(chip, struct gpio_bank, chip);
695
-
void __iomem *base = bank->base;
696
643
unsigned long flags;
697
644
698
645
spin_lock_irqsave(&bank->lock, flags);
699
-
700
-
if (bank->regs->wkup_en) {
701
-
/* Disable wake-up during idle for dynamic tick */
702
-
_gpio_rmw(base, bank->regs->wkup_en, 1 << offset, 0);
703
-
bank->context.wake_en =
704
-
__raw_readl(bank->base + bank->regs->wkup_en);
705
-
}
706
-
707
646
bank->mod_usage &= ~(1 << offset);
708
-
709
-
if (bank->regs->ctrl && !bank->mod_usage) {
710
-
void __iomem *reg = bank->base + bank->regs->ctrl;
711
-
u32 ctrl;
712
-
713
-
ctrl = __raw_readl(reg);
714
-
/* Module is disabled, clocks are gated */
715
-
ctrl |= GPIO_MOD_CTRL_BIT;
716
-
__raw_writel(ctrl, reg);
717
-
bank->context.ctrl = ctrl;
718
-
}
719
-
647
+
_disable_gpio_module(bank, offset);
720
648
_reset_gpio(bank, bank->chip.base + offset);
721
649
spin_unlock_irqrestore(&bank->lock, flags);
722
650
···
704
672
* If this is the last gpio to be freed in the bank,
705
673
* disable the bank module.
706
674
*/
707
-
if (!bank->mod_usage)
675
+
if (!BANK_USED(bank))
708
676
pm_runtime_put(bank->dev);
709
677
}
710
678
···
794
762
struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
795
763
unsigned int gpio = irq_to_gpio(bank, d->hwirq);
796
764
unsigned long flags;
765
+
unsigned offset = GPIO_INDEX(bank, gpio);
797
766
798
767
spin_lock_irqsave(&bank->lock, flags);
768
+
bank->irq_usage &= ~(1 << offset);
769
+
_disable_gpio_module(bank, offset);
799
770
_reset_gpio(bank, gpio);
800
771
spin_unlock_irqrestore(&bank->lock, flags);
772
+
773
+
/*
774
+
* If this is the last IRQ to be freed in the bank,
775
+
* disable the bank module.
776
+
*/
777
+
if (!BANK_USED(bank))
778
+
pm_runtime_put(bank->dev);
801
779
}
802
780
803
781
static void gpio_ack_irq(struct irq_data *d)
···
939
897
return 0;
940
898
}
941
899
942
-
static int gpio_is_input(struct gpio_bank *bank, int mask)
943
-
{
944
-
void __iomem *reg = bank->base + bank->regs->direction;
945
-
946
-
return __raw_readl(reg) & mask;
947
-
}
948
-
949
900
static int gpio_get(struct gpio_chip *chip, unsigned offset)
950
901
{
951
902
struct gpio_bank *bank;
···
957
922
{
958
923
struct gpio_bank *bank;
959
924
unsigned long flags;
925
+
int retval = 0;
960
926
961
927
bank = container_of(chip, struct gpio_bank, chip);
962
928
spin_lock_irqsave(&bank->lock, flags);
929
+
930
+
if (LINE_USED(bank->irq_usage, offset)) {
931
+
retval = -EINVAL;
932
+
goto exit;
933
+
}
934
+
963
935
bank->set_dataout(bank, offset, value);
964
936
_set_gpio_direction(bank, offset, 0);
937
+
938
+
exit:
965
939
spin_unlock_irqrestore(&bank->lock, flags);
966
-
return 0;
940
+
return retval;
967
941
}
968
942
969
943
static int gpio_debounce(struct gpio_chip *chip, unsigned offset,
···
1444
1400
struct gpio_bank *bank;
1445
1401
1446
1402
list_for_each_entry(bank, &omap_gpio_list, node) {
1447
-
if (!bank->mod_usage || !bank->loses_context)
1403
+
if (!BANK_USED(bank) || !bank->loses_context)
1448
1404
continue;
1449
1405
1450
1406
bank->power_mode = pwr_mode;
···
1458
1414
struct gpio_bank *bank;
1459
1415
1460
1416
list_for_each_entry(bank, &omap_gpio_list, node) {
1461
-
if (!bank->mod_usage || !bank->loses_context)
1417
+
if (!BANK_USED(bank) || !bank->loses_context)
1462
1418
continue;
1463
1419
1464
1420
pm_runtime_get_sync(bank->dev);