@@ -69,6 +69,22 @@ struct bcm_kona_gpio {
69
69
struct bcm_kona_gpio_bank {
70
70
int id ;
71
71
int irq ;
72
+ /*
73
+ * Used to keep track of lock/unlock operations for each GPIO in the
74
+ * bank.
75
+ *
76
+ * All GPIOs are locked by default (see bcm_kona_gpio_reset), and the
77
+ * unlock count for all GPIOs is 0 by default. Each unlock increments
78
+ * the counter, and each lock decrements the counter.
79
+ *
80
+ * The lock function only locks the GPIO once its unlock counter is
81
+ * down to 0. This is necessary because the GPIO is unlocked in two
82
+ * places in this driver: once for requested GPIOs, and once for
83
+ * requested IRQs. Since it is possible for a GPIO to be requested
84
+ * as both a GPIO and an IRQ, we need to ensure that we don't lock it
85
+ * too early.
86
+ */
87
+ u8 gpio_unlock_count [GPIO_PER_BANK ];
72
88
/* Used in the interrupt handler */
73
89
struct bcm_kona_gpio * kona_gpio ;
74
90
};
@@ -86,14 +102,24 @@ static void bcm_kona_gpio_lock_gpio(struct bcm_kona_gpio *kona_gpio,
86
102
u32 val ;
87
103
unsigned long flags ;
88
104
int bank_id = GPIO_BANK (gpio );
105
+ int bit = GPIO_BIT (gpio );
106
+ struct bcm_kona_gpio_bank * bank = & kona_gpio -> banks [bank_id ];
89
107
90
- raw_spin_lock_irqsave (& kona_gpio -> lock , flags );
108
+ if (bank -> gpio_unlock_count [bit ] == 0 ) {
109
+ dev_err (kona_gpio -> gpio_chip .parent ,
110
+ "Unbalanced locks for GPIO %u\n" , gpio );
111
+ return ;
112
+ }
91
113
92
- val = readl (kona_gpio -> reg_base + GPIO_PWD_STATUS (bank_id ));
93
- val |= BIT (gpio );
94
- bcm_kona_gpio_write_lock_regs (kona_gpio -> reg_base , bank_id , val );
114
+ if (-- bank -> gpio_unlock_count [bit ] == 0 ) {
115
+ raw_spin_lock_irqsave (& kona_gpio -> lock , flags );
95
116
96
- raw_spin_unlock_irqrestore (& kona_gpio -> lock , flags );
117
+ val = readl (kona_gpio -> reg_base + GPIO_PWD_STATUS (bank_id ));
118
+ val |= BIT (bit );
119
+ bcm_kona_gpio_write_lock_regs (kona_gpio -> reg_base , bank_id , val );
120
+
121
+ raw_spin_unlock_irqrestore (& kona_gpio -> lock , flags );
122
+ }
97
123
}
98
124
99
125
static void bcm_kona_gpio_unlock_gpio (struct bcm_kona_gpio * kona_gpio ,
@@ -102,14 +128,20 @@ static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio,
102
128
u32 val ;
103
129
unsigned long flags ;
104
130
int bank_id = GPIO_BANK (gpio );
131
+ int bit = GPIO_BIT (gpio );
132
+ struct bcm_kona_gpio_bank * bank = & kona_gpio -> banks [bank_id ];
105
133
106
- raw_spin_lock_irqsave (& kona_gpio -> lock , flags );
134
+ if (bank -> gpio_unlock_count [bit ] == 0 ) {
135
+ raw_spin_lock_irqsave (& kona_gpio -> lock , flags );
107
136
108
- val = readl (kona_gpio -> reg_base + GPIO_PWD_STATUS (bank_id ));
109
- val &= ~BIT (gpio );
110
- bcm_kona_gpio_write_lock_regs (kona_gpio -> reg_base , bank_id , val );
137
+ val = readl (kona_gpio -> reg_base + GPIO_PWD_STATUS (bank_id ));
138
+ val &= ~BIT (bit );
139
+ bcm_kona_gpio_write_lock_regs (kona_gpio -> reg_base , bank_id , val );
111
140
112
- raw_spin_unlock_irqrestore (& kona_gpio -> lock , flags );
141
+ raw_spin_unlock_irqrestore (& kona_gpio -> lock , flags );
142
+ }
143
+
144
+ ++ bank -> gpio_unlock_count [bit ];
113
145
}
114
146
115
147
static int bcm_kona_gpio_get_dir (struct gpio_chip * chip , unsigned gpio )
@@ -360,6 +392,7 @@ static void bcm_kona_gpio_irq_mask(struct irq_data *d)
360
392
361
393
kona_gpio = irq_data_get_irq_chip_data (d );
362
394
reg_base = kona_gpio -> reg_base ;
395
+
363
396
raw_spin_lock_irqsave (& kona_gpio -> lock , flags );
364
397
365
398
val = readl (reg_base + GPIO_INT_MASK (bank_id ));
@@ -382,6 +415,7 @@ static void bcm_kona_gpio_irq_unmask(struct irq_data *d)
382
415
383
416
kona_gpio = irq_data_get_irq_chip_data (d );
384
417
reg_base = kona_gpio -> reg_base ;
418
+
385
419
raw_spin_lock_irqsave (& kona_gpio -> lock , flags );
386
420
387
421
val = readl (reg_base + GPIO_INT_MSKCLR (bank_id ));
@@ -477,15 +511,26 @@ static void bcm_kona_gpio_irq_handler(struct irq_desc *desc)
477
511
static int bcm_kona_gpio_irq_reqres (struct irq_data * d )
478
512
{
479
513
struct bcm_kona_gpio * kona_gpio = irq_data_get_irq_chip_data (d );
514
+ unsigned int gpio = d -> hwirq ;
480
515
481
- return gpiochip_reqres_irq (& kona_gpio -> gpio_chip , d -> hwirq );
516
+ /*
517
+ * We need to unlock the GPIO before any other operations are performed
518
+ * on the relevant GPIO configuration registers
519
+ */
520
+ bcm_kona_gpio_unlock_gpio (kona_gpio , gpio );
521
+
522
+ return gpiochip_reqres_irq (& kona_gpio -> gpio_chip , gpio );
482
523
}
483
524
484
525
static void bcm_kona_gpio_irq_relres (struct irq_data * d )
485
526
{
486
527
struct bcm_kona_gpio * kona_gpio = irq_data_get_irq_chip_data (d );
528
+ unsigned int gpio = d -> hwirq ;
529
+
530
+ /* Once we no longer use it, lock the GPIO again */
531
+ bcm_kona_gpio_lock_gpio (kona_gpio , gpio );
487
532
488
- gpiochip_relres_irq (& kona_gpio -> gpio_chip , d -> hwirq );
533
+ gpiochip_relres_irq (& kona_gpio -> gpio_chip , gpio );
489
534
}
490
535
491
536
static struct irq_chip bcm_gpio_irq_chip = {
@@ -614,7 +659,7 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
614
659
bank -> irq = platform_get_irq (pdev , i );
615
660
bank -> kona_gpio = kona_gpio ;
616
661
if (bank -> irq < 0 ) {
617
- dev_err (dev , "Couldn't get IRQ for bank %d" , i );
662
+ dev_err (dev , "Couldn't get IRQ for bank %d\n " , i );
618
663
ret = - ENOENT ;
619
664
goto err_irq_domain ;
620
665
}
0 commit comments