Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <iwona.winiarska@intel.com>
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>

authored by

Iwona Winiarska and committed by
Bartosz Golaszewski
ab39d698 61a7904b

+16 -16
+16 -16
drivers/gpio/gpio-aspeed-sgpio.c
··· 31 31 struct gpio_chip chip; 32 32 struct irq_chip intc; 33 33 struct clk *pclk; 34 - spinlock_t lock; 34 + raw_spinlock_t lock; 35 35 void __iomem *base; 36 36 int irq; 37 37 }; ··· 173 173 enum aspeed_sgpio_reg reg; 174 174 int rc = 0; 175 175 176 - spin_lock_irqsave(&gpio->lock, flags); 176 + raw_spin_lock_irqsave(&gpio->lock, flags); 177 177 178 178 reg = aspeed_sgpio_is_input(offset) ? reg_val : reg_rdata; 179 179 rc = !!(ioread32(bank_reg(gpio, bank, reg)) & GPIO_BIT(offset)); 180 180 181 - spin_unlock_irqrestore(&gpio->lock, flags); 181 + raw_spin_unlock_irqrestore(&gpio->lock, flags); 182 182 183 183 return rc; 184 184 } ··· 215 215 struct aspeed_sgpio *gpio = gpiochip_get_data(gc); 216 216 unsigned long flags; 217 217 218 - spin_lock_irqsave(&gpio->lock, flags); 218 + raw_spin_lock_irqsave(&gpio->lock, flags); 219 219 220 220 sgpio_set_value(gc, offset, val); 221 221 222 - spin_unlock_irqrestore(&gpio->lock, flags); 222 + raw_spin_unlock_irqrestore(&gpio->lock, flags); 223 223 } 224 224 225 225 static int aspeed_sgpio_dir_in(struct gpio_chip *gc, unsigned int offset) ··· 236 236 /* No special action is required for setting the direction; we'll 237 237 * error-out in sgpio_set_value if this isn't an output GPIO */ 238 238 239 - spin_lock_irqsave(&gpio->lock, flags); 239 + raw_spin_lock_irqsave(&gpio->lock, flags); 240 240 rc = sgpio_set_value(gc, offset, val); 241 - spin_unlock_irqrestore(&gpio->lock, flags); 241 + raw_spin_unlock_irqrestore(&gpio->lock, flags); 242 242 243 243 return rc; 244 244 } ··· 277 277 278 278 status_addr = bank_reg(gpio, bank, reg_irq_status); 279 279 280 - spin_lock_irqsave(&gpio->lock, flags); 280 + raw_spin_lock_irqsave(&gpio->lock, flags); 281 281 282 282 iowrite32(bit, status_addr); 283 283 284 - spin_unlock_irqrestore(&gpio->lock, flags); 284 + raw_spin_unlock_irqrestore(&gpio->lock, flags); 285 285 } 286 286 287 287 static void aspeed_sgpio_irq_set_mask(struct irq_data *d, bool set) ··· 296 296 irqd_to_aspeed_sgpio_data(d, &gpio, &bank, &bit, &offset); 297 297 addr = bank_reg(gpio, bank, reg_irq_enable); 298 298 299 - spin_lock_irqsave(&gpio->lock, flags); 299 + raw_spin_lock_irqsave(&gpio->lock, flags); 300 300 301 301 reg = ioread32(addr); 302 302 if (set) ··· 306 306 307 307 iowrite32(reg, addr); 308 308 309 - spin_unlock_irqrestore(&gpio->lock, flags); 309 + raw_spin_unlock_irqrestore(&gpio->lock, flags); 310 310 } 311 311 312 312 static void aspeed_sgpio_irq_mask(struct irq_data *d) ··· 355 355 return -EINVAL; 356 356 } 357 357 358 - spin_lock_irqsave(&gpio->lock, flags); 358 + raw_spin_lock_irqsave(&gpio->lock, flags); 359 359 360 360 addr = bank_reg(gpio, bank, reg_irq_type0); 361 361 reg = ioread32(addr); ··· 372 372 reg = (reg & ~bit) | type2; 373 373 iowrite32(reg, addr); 374 374 375 - spin_unlock_irqrestore(&gpio->lock, flags); 375 + raw_spin_unlock_irqrestore(&gpio->lock, flags); 376 376 377 377 irq_set_handler_locked(d, handler); 378 378 ··· 467 467 468 468 reg = bank_reg(gpio, to_bank(offset), reg_tolerance); 469 469 470 - spin_lock_irqsave(&gpio->lock, flags); 470 + raw_spin_lock_irqsave(&gpio->lock, flags); 471 471 472 472 val = readl(reg); 473 473 ··· 478 478 479 479 writel(val, reg); 480 480 481 - spin_unlock_irqrestore(&gpio->lock, flags); 481 + raw_spin_unlock_irqrestore(&gpio->lock, flags); 482 482 483 483 return 0; 484 484 } ··· 575 575 iowrite32(FIELD_PREP(ASPEED_SGPIO_CLK_DIV_MASK, sgpio_clk_div) | gpio_cnt_regval | 576 576 ASPEED_SGPIO_ENABLE, gpio->base + ASPEED_SGPIO_CTRL); 577 577 578 - spin_lock_init(&gpio->lock); 578 + raw_spin_lock_init(&gpio->lock); 579 579 580 580 gpio->chip.parent = &pdev->dev; 581 581 gpio->chip.ngpio = nr_gpios * 2;