aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-bcm-kona.c
diff options
context:
space:
mode:
authorJulia Cartwright <julia@ni.com>2017-03-09 11:21:54 -0500
committerLinus Walleij <linus.walleij@linaro.org>2017-03-16 16:52:07 -0400
commitc69fcea57e9d2b27025235b3205861c3895fa618 (patch)
treebfc9941e4d7afe417b550aea8f7c0774ae3f0878 /drivers/gpio/gpio-bcm-kona.c
parent45897809d518c7a84b215c79b58e4add9b8a1d40 (diff)
gpio: bcm-kona: make use of raw_spinlock variants
The bcm-kona gpio driver currently implements an irq_chip for handling interrupts; due to how irq_chip handling is done, it's necessary for the irq_chip methods to be invoked from hardirq context, even on a a real-time kernel. Because the spinlock_t type becomes a "sleeping" spinlock w/ RT kernels, it is not suitable to be used with irq_chips. A quick audit of the operations under the lock reveal that they do only minimal, bounded work, and are therefore safe to do under a raw spinlock. Signed-off-by: Julia Cartwright <julia@ni.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio/gpio-bcm-kona.c')
-rw-r--r--drivers/gpio/gpio-bcm-kona.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c
index 41d0ac142580..dfcf56ee3c61 100644
--- a/drivers/gpio/gpio-bcm-kona.c
+++ b/drivers/gpio/gpio-bcm-kona.c
@@ -67,7 +67,7 @@
67struct bcm_kona_gpio { 67struct bcm_kona_gpio {
68 void __iomem *reg_base; 68 void __iomem *reg_base;
69 int num_bank; 69 int num_bank;
70 spinlock_t lock; 70 raw_spinlock_t lock;
71 struct gpio_chip gpio_chip; 71 struct gpio_chip gpio_chip;
72 struct irq_domain *irq_domain; 72 struct irq_domain *irq_domain;
73 struct bcm_kona_gpio_bank *banks; 73 struct bcm_kona_gpio_bank *banks;
@@ -95,13 +95,13 @@ static void bcm_kona_gpio_lock_gpio(struct bcm_kona_gpio *kona_gpio,
95 unsigned long flags; 95 unsigned long flags;
96 int bank_id = GPIO_BANK(gpio); 96 int bank_id = GPIO_BANK(gpio);
97 97
98 spin_lock_irqsave(&kona_gpio->lock, flags); 98 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
99 99
100 val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id)); 100 val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id));
101 val |= BIT(gpio); 101 val |= BIT(gpio);
102 bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val); 102 bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val);
103 103
104 spin_unlock_irqrestore(&kona_gpio->lock, flags); 104 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
105} 105}
106 106
107static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio, 107static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio,
@@ -111,13 +111,13 @@ static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio,
111 unsigned long flags; 111 unsigned long flags;
112 int bank_id = GPIO_BANK(gpio); 112 int bank_id = GPIO_BANK(gpio);
113 113
114 spin_lock_irqsave(&kona_gpio->lock, flags); 114 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
115 115
116 val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id)); 116 val = readl(kona_gpio->reg_base + GPIO_PWD_STATUS(bank_id));
117 val &= ~BIT(gpio); 117 val &= ~BIT(gpio);
118 bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val); 118 bcm_kona_gpio_write_lock_regs(kona_gpio->reg_base, bank_id, val);
119 119
120 spin_unlock_irqrestore(&kona_gpio->lock, flags); 120 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
121} 121}
122 122
123static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio) 123static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio)
@@ -141,7 +141,7 @@ static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
141 141
142 kona_gpio = gpiochip_get_data(chip); 142 kona_gpio = gpiochip_get_data(chip);
143 reg_base = kona_gpio->reg_base; 143 reg_base = kona_gpio->reg_base;
144 spin_lock_irqsave(&kona_gpio->lock, flags); 144 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
145 145
146 /* this function only applies to output pin */ 146 /* this function only applies to output pin */
147 if (bcm_kona_gpio_get_dir(chip, gpio) == GPIOF_DIR_IN) 147 if (bcm_kona_gpio_get_dir(chip, gpio) == GPIOF_DIR_IN)
@@ -154,7 +154,7 @@ static void bcm_kona_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
154 writel(val, reg_base + reg_offset); 154 writel(val, reg_base + reg_offset);
155 155
156out: 156out:
157 spin_unlock_irqrestore(&kona_gpio->lock, flags); 157 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
158} 158}
159 159
160static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio) 160static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio)
@@ -168,7 +168,7 @@ static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio)
168 168
169 kona_gpio = gpiochip_get_data(chip); 169 kona_gpio = gpiochip_get_data(chip);
170 reg_base = kona_gpio->reg_base; 170 reg_base = kona_gpio->reg_base;
171 spin_lock_irqsave(&kona_gpio->lock, flags); 171 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
172 172
173 if (bcm_kona_gpio_get_dir(chip, gpio) == GPIOF_DIR_IN) 173 if (bcm_kona_gpio_get_dir(chip, gpio) == GPIOF_DIR_IN)
174 reg_offset = GPIO_IN_STATUS(bank_id); 174 reg_offset = GPIO_IN_STATUS(bank_id);
@@ -178,7 +178,7 @@ static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio)
178 /* read the GPIO bank status */ 178 /* read the GPIO bank status */
179 val = readl(reg_base + reg_offset); 179 val = readl(reg_base + reg_offset);
180 180
181 spin_unlock_irqrestore(&kona_gpio->lock, flags); 181 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
182 182
183 /* return the specified bit status */ 183 /* return the specified bit status */
184 return !!(val & BIT(bit)); 184 return !!(val & BIT(bit));
@@ -208,14 +208,14 @@ static int bcm_kona_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
208 208
209 kona_gpio = gpiochip_get_data(chip); 209 kona_gpio = gpiochip_get_data(chip);
210 reg_base = kona_gpio->reg_base; 210 reg_base = kona_gpio->reg_base;
211 spin_lock_irqsave(&kona_gpio->lock, flags); 211 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
212 212
213 val = readl(reg_base + GPIO_CONTROL(gpio)); 213 val = readl(reg_base + GPIO_CONTROL(gpio));
214 val &= ~GPIO_GPCTR0_IOTR_MASK; 214 val &= ~GPIO_GPCTR0_IOTR_MASK;
215 val |= GPIO_GPCTR0_IOTR_CMD_INPUT; 215 val |= GPIO_GPCTR0_IOTR_CMD_INPUT;
216 writel(val, reg_base + GPIO_CONTROL(gpio)); 216 writel(val, reg_base + GPIO_CONTROL(gpio));
217 217
218 spin_unlock_irqrestore(&kona_gpio->lock, flags); 218 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
219 219
220 return 0; 220 return 0;
221} 221}
@@ -232,7 +232,7 @@ static int bcm_kona_gpio_direction_output(struct gpio_chip *chip,
232 232
233 kona_gpio = gpiochip_get_data(chip); 233 kona_gpio = gpiochip_get_data(chip);
234 reg_base = kona_gpio->reg_base; 234 reg_base = kona_gpio->reg_base;
235 spin_lock_irqsave(&kona_gpio->lock, flags); 235 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
236 236
237 val = readl(reg_base + GPIO_CONTROL(gpio)); 237 val = readl(reg_base + GPIO_CONTROL(gpio));
238 val &= ~GPIO_GPCTR0_IOTR_MASK; 238 val &= ~GPIO_GPCTR0_IOTR_MASK;
@@ -244,7 +244,7 @@ static int bcm_kona_gpio_direction_output(struct gpio_chip *chip,
244 val |= BIT(bit); 244 val |= BIT(bit);
245 writel(val, reg_base + reg_offset); 245 writel(val, reg_base + reg_offset);
246 246
247 spin_unlock_irqrestore(&kona_gpio->lock, flags); 247 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
248 248
249 return 0; 249 return 0;
250} 250}
@@ -288,7 +288,7 @@ static int bcm_kona_gpio_set_debounce(struct gpio_chip *chip, unsigned gpio,
288 } 288 }
289 289
290 /* spin lock for read-modify-write of the GPIO register */ 290 /* spin lock for read-modify-write of the GPIO register */
291 spin_lock_irqsave(&kona_gpio->lock, flags); 291 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
292 292
293 val = readl(reg_base + GPIO_CONTROL(gpio)); 293 val = readl(reg_base + GPIO_CONTROL(gpio));
294 val &= ~GPIO_GPCTR0_DBR_MASK; 294 val &= ~GPIO_GPCTR0_DBR_MASK;
@@ -303,7 +303,7 @@ static int bcm_kona_gpio_set_debounce(struct gpio_chip *chip, unsigned gpio,
303 303
304 writel(val, reg_base + GPIO_CONTROL(gpio)); 304 writel(val, reg_base + GPIO_CONTROL(gpio));
305 305
306 spin_unlock_irqrestore(&kona_gpio->lock, flags); 306 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
307 307
308 return 0; 308 return 0;
309} 309}
@@ -347,13 +347,13 @@ static void bcm_kona_gpio_irq_ack(struct irq_data *d)
347 347
348 kona_gpio = irq_data_get_irq_chip_data(d); 348 kona_gpio = irq_data_get_irq_chip_data(d);
349 reg_base = kona_gpio->reg_base; 349 reg_base = kona_gpio->reg_base;
350 spin_lock_irqsave(&kona_gpio->lock, flags); 350 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
351 351
352 val = readl(reg_base + GPIO_INT_STATUS(bank_id)); 352 val = readl(reg_base + GPIO_INT_STATUS(bank_id));
353 val |= BIT(bit); 353 val |= BIT(bit);
354 writel(val, reg_base + GPIO_INT_STATUS(bank_id)); 354 writel(val, reg_base + GPIO_INT_STATUS(bank_id));
355 355
356 spin_unlock_irqrestore(&kona_gpio->lock, flags); 356 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
357} 357}
358 358
359static void bcm_kona_gpio_irq_mask(struct irq_data *d) 359static void bcm_kona_gpio_irq_mask(struct irq_data *d)
@@ -368,13 +368,13 @@ static void bcm_kona_gpio_irq_mask(struct irq_data *d)
368 368
369 kona_gpio = irq_data_get_irq_chip_data(d); 369 kona_gpio = irq_data_get_irq_chip_data(d);
370 reg_base = kona_gpio->reg_base; 370 reg_base = kona_gpio->reg_base;
371 spin_lock_irqsave(&kona_gpio->lock, flags); 371 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
372 372
373 val = readl(reg_base + GPIO_INT_MASK(bank_id)); 373 val = readl(reg_base + GPIO_INT_MASK(bank_id));
374 val |= BIT(bit); 374 val |= BIT(bit);
375 writel(val, reg_base + GPIO_INT_MASK(bank_id)); 375 writel(val, reg_base + GPIO_INT_MASK(bank_id));
376 376
377 spin_unlock_irqrestore(&kona_gpio->lock, flags); 377 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
378} 378}
379 379
380static void bcm_kona_gpio_irq_unmask(struct irq_data *d) 380static void bcm_kona_gpio_irq_unmask(struct irq_data *d)
@@ -389,13 +389,13 @@ static void bcm_kona_gpio_irq_unmask(struct irq_data *d)
389 389
390 kona_gpio = irq_data_get_irq_chip_data(d); 390 kona_gpio = irq_data_get_irq_chip_data(d);
391 reg_base = kona_gpio->reg_base; 391 reg_base = kona_gpio->reg_base;
392 spin_lock_irqsave(&kona_gpio->lock, flags); 392 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
393 393
394 val = readl(reg_base + GPIO_INT_MSKCLR(bank_id)); 394 val = readl(reg_base + GPIO_INT_MSKCLR(bank_id));
395 val |= BIT(bit); 395 val |= BIT(bit);
396 writel(val, reg_base + GPIO_INT_MSKCLR(bank_id)); 396 writel(val, reg_base + GPIO_INT_MSKCLR(bank_id));
397 397
398 spin_unlock_irqrestore(&kona_gpio->lock, flags); 398 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
399} 399}
400 400
401static int bcm_kona_gpio_irq_set_type(struct irq_data *d, unsigned int type) 401static int bcm_kona_gpio_irq_set_type(struct irq_data *d, unsigned int type)
@@ -431,14 +431,14 @@ static int bcm_kona_gpio_irq_set_type(struct irq_data *d, unsigned int type)
431 return -EINVAL; 431 return -EINVAL;
432 } 432 }
433 433
434 spin_lock_irqsave(&kona_gpio->lock, flags); 434 raw_spin_lock_irqsave(&kona_gpio->lock, flags);
435 435
436 val = readl(reg_base + GPIO_CONTROL(gpio)); 436 val = readl(reg_base + GPIO_CONTROL(gpio));
437 val &= ~GPIO_GPCTR0_ITR_MASK; 437 val &= ~GPIO_GPCTR0_ITR_MASK;
438 val |= lvl_type << GPIO_GPCTR0_ITR_SHIFT; 438 val |= lvl_type << GPIO_GPCTR0_ITR_SHIFT;
439 writel(val, reg_base + GPIO_CONTROL(gpio)); 439 writel(val, reg_base + GPIO_CONTROL(gpio));
440 440
441 spin_unlock_irqrestore(&kona_gpio->lock, flags); 441 raw_spin_unlock_irqrestore(&kona_gpio->lock, flags);
442 442
443 return 0; 443 return 0;
444} 444}
@@ -655,7 +655,7 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
655 bank); 655 bank);
656 } 656 }
657 657
658 spin_lock_init(&kona_gpio->lock); 658 raw_spin_lock_init(&kona_gpio->lock);
659 659
660 return 0; 660 return 0;
661 661