Skip to content

Commit ab39d69

Browse files
iklimaszbrgl
authored andcommitted
gpio: aspeed-sgpio: Convert aspeed_sgpio.lock to raw_spinlock
The gpio-aspeed-sgpio driver implements an irq_chip which need to be invoked from hardirq context. Since spin_lock() can sleep with PREEMPT_RT, it is no longer legal to invoke it while interrupts are disabled. This also causes lockdep to complain about: [ 25.919465] [ BUG: Invalid wait context ] because aspeed_sgpio.lock (spin_lock_t) is taken under irq_desc.lock (raw_spinlock_t). Let's use of raw_spinlock_t instead of spinlock_t. Signed-off-by: Iwona Winiarska <[email protected]> Signed-off-by: Bartosz Golaszewski <[email protected]>
1 parent 61a7904 commit ab39d69

File tree

1 file changed

+16
-16
lines changed

1 file changed

+16
-16
lines changed

drivers/gpio/gpio-aspeed-sgpio.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ struct aspeed_sgpio {
3131
struct gpio_chip chip;
3232
struct irq_chip intc;
3333
struct clk *pclk;
34-
spinlock_t lock;
34+
raw_spinlock_t lock;
3535
void __iomem *base;
3636
int irq;
3737
};
@@ -173,12 +173,12 @@ static int aspeed_sgpio_get(struct gpio_chip *gc, unsigned int offset)
173173
enum aspeed_sgpio_reg reg;
174174
int rc = 0;
175175

176-
spin_lock_irqsave(&gpio->lock, flags);
176+
raw_spin_lock_irqsave(&gpio->lock, flags);
177177

178178
reg = aspeed_sgpio_is_input(offset) ? reg_val : reg_rdata;
179179
rc = !!(ioread32(bank_reg(gpio, bank, reg)) & GPIO_BIT(offset));
180180

181-
spin_unlock_irqrestore(&gpio->lock, flags);
181+
raw_spin_unlock_irqrestore(&gpio->lock, flags);
182182

183183
return rc;
184184
}
@@ -215,11 +215,11 @@ static void aspeed_sgpio_set(struct gpio_chip *gc, unsigned int offset, int val)
215215
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
216216
unsigned long flags;
217217

218-
spin_lock_irqsave(&gpio->lock, flags);
218+
raw_spin_lock_irqsave(&gpio->lock, flags);
219219

220220
sgpio_set_value(gc, offset, val);
221221

222-
spin_unlock_irqrestore(&gpio->lock, flags);
222+
raw_spin_unlock_irqrestore(&gpio->lock, flags);
223223
}
224224

225225
static int aspeed_sgpio_dir_in(struct gpio_chip *gc, unsigned int offset)
@@ -236,9 +236,9 @@ static int aspeed_sgpio_dir_out(struct gpio_chip *gc, unsigned int offset, int v
236236
/* No special action is required for setting the direction; we'll
237237
* error-out in sgpio_set_value if this isn't an output GPIO */
238238

239-
spin_lock_irqsave(&gpio->lock, flags);
239+
raw_spin_lock_irqsave(&gpio->lock, flags);
240240
rc = sgpio_set_value(gc, offset, val);
241-
spin_unlock_irqrestore(&gpio->lock, flags);
241+
raw_spin_unlock_irqrestore(&gpio->lock, flags);
242242

243243
return rc;
244244
}
@@ -277,11 +277,11 @@ static void aspeed_sgpio_irq_ack(struct irq_data *d)
277277

278278
status_addr = bank_reg(gpio, bank, reg_irq_status);
279279

280-
spin_lock_irqsave(&gpio->lock, flags);
280+
raw_spin_lock_irqsave(&gpio->lock, flags);
281281

282282
iowrite32(bit, status_addr);
283283

284-
spin_unlock_irqrestore(&gpio->lock, flags);
284+
raw_spin_unlock_irqrestore(&gpio->lock, flags);
285285
}
286286

287287
static void aspeed_sgpio_irq_set_mask(struct irq_data *d, bool set)
@@ -296,7 +296,7 @@ static void aspeed_sgpio_irq_set_mask(struct irq_data *d, bool set)
296296
irqd_to_aspeed_sgpio_data(d, &gpio, &bank, &bit, &offset);
297297
addr = bank_reg(gpio, bank, reg_irq_enable);
298298

299-
spin_lock_irqsave(&gpio->lock, flags);
299+
raw_spin_lock_irqsave(&gpio->lock, flags);
300300

301301
reg = ioread32(addr);
302302
if (set)
@@ -306,7 +306,7 @@ static void aspeed_sgpio_irq_set_mask(struct irq_data *d, bool set)
306306

307307
iowrite32(reg, addr);
308308

309-
spin_unlock_irqrestore(&gpio->lock, flags);
309+
raw_spin_unlock_irqrestore(&gpio->lock, flags);
310310
}
311311

312312
static void aspeed_sgpio_irq_mask(struct irq_data *d)
@@ -355,7 +355,7 @@ static int aspeed_sgpio_set_type(struct irq_data *d, unsigned int type)
355355
return -EINVAL;
356356
}
357357

358-
spin_lock_irqsave(&gpio->lock, flags);
358+
raw_spin_lock_irqsave(&gpio->lock, flags);
359359

360360
addr = bank_reg(gpio, bank, reg_irq_type0);
361361
reg = ioread32(addr);
@@ -372,7 +372,7 @@ static int aspeed_sgpio_set_type(struct irq_data *d, unsigned int type)
372372
reg = (reg & ~bit) | type2;
373373
iowrite32(reg, addr);
374374

375-
spin_unlock_irqrestore(&gpio->lock, flags);
375+
raw_spin_unlock_irqrestore(&gpio->lock, flags);
376376

377377
irq_set_handler_locked(d, handler);
378378

@@ -467,7 +467,7 @@ static int aspeed_sgpio_reset_tolerance(struct gpio_chip *chip,
467467

468468
reg = bank_reg(gpio, to_bank(offset), reg_tolerance);
469469

470-
spin_lock_irqsave(&gpio->lock, flags);
470+
raw_spin_lock_irqsave(&gpio->lock, flags);
471471

472472
val = readl(reg);
473473

@@ -478,7 +478,7 @@ static int aspeed_sgpio_reset_tolerance(struct gpio_chip *chip,
478478

479479
writel(val, reg);
480480

481-
spin_unlock_irqrestore(&gpio->lock, flags);
481+
raw_spin_unlock_irqrestore(&gpio->lock, flags);
482482

483483
return 0;
484484
}
@@ -575,7 +575,7 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev)
575575
iowrite32(FIELD_PREP(ASPEED_SGPIO_CLK_DIV_MASK, sgpio_clk_div) | gpio_cnt_regval |
576576
ASPEED_SGPIO_ENABLE, gpio->base + ASPEED_SGPIO_CTRL);
577577

578-
spin_lock_init(&gpio->lock);
578+
raw_spin_lock_init(&gpio->lock);
579579

580580
gpio->chip.parent = &pdev->dev;
581581
gpio->chip.ngpio = nr_gpios * 2;

0 commit comments

Comments
 (0)