diff options
author | Julia Cartwright <julia@ni.com> | 2017-03-09 11:21:54 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2017-03-16 16:52:07 -0400 |
commit | c69fcea57e9d2b27025235b3205861c3895fa618 (patch) | |
tree | bfc9941e4d7afe417b550aea8f7c0774ae3f0878 /drivers/gpio/gpio-bcm-kona.c | |
parent | 45897809d518c7a84b215c79b58e4add9b8a1d40 (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.c | 48 |
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 @@ | |||
67 | struct bcm_kona_gpio { | 67 | struct 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 | ||
107 | static void bcm_kona_gpio_unlock_gpio(struct bcm_kona_gpio *kona_gpio, | 107 | static 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 | ||
123 | static int bcm_kona_gpio_get_dir(struct gpio_chip *chip, unsigned gpio) | 123 | static 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 | ||
156 | out: | 156 | out: |
157 | spin_unlock_irqrestore(&kona_gpio->lock, flags); | 157 | raw_spin_unlock_irqrestore(&kona_gpio->lock, flags); |
158 | } | 158 | } |
159 | 159 | ||
160 | static int bcm_kona_gpio_get(struct gpio_chip *chip, unsigned gpio) | 160 | static 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 | ||
359 | static void bcm_kona_gpio_irq_mask(struct irq_data *d) | 359 | static 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 | ||
380 | static void bcm_kona_gpio_irq_unmask(struct irq_data *d) | 380 | static 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 | ||
401 | static int bcm_kona_gpio_irq_set_type(struct irq_data *d, unsigned int type) | 401 | static 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 | ||