gpio: aspeed: Convert aspeed_gpio.lock to raw_spinlock
[ Upstream commit 61a7904b6ace99b1bde0d0e867fa3097f5c8cee2 ] The gpio-aspeed 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: [ 0.649797] [ BUG: Invalid wait context ] because aspeed_gpio.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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
743911a2bf
commit
2481ee0ce5
@ -53,7 +53,7 @@ struct aspeed_gpio_config {
|
|||||||
struct aspeed_gpio {
|
struct aspeed_gpio {
|
||||||
struct gpio_chip chip;
|
struct gpio_chip chip;
|
||||||
struct irq_chip irqc;
|
struct irq_chip irqc;
|
||||||
spinlock_t lock;
|
raw_spinlock_t lock;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int irq;
|
int irq;
|
||||||
const struct aspeed_gpio_config *config;
|
const struct aspeed_gpio_config *config;
|
||||||
@ -413,14 +413,14 @@ static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
bool copro;
|
bool copro;
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
copro = aspeed_gpio_copro_request(gpio, offset);
|
copro = aspeed_gpio_copro_request(gpio, offset);
|
||||||
|
|
||||||
__aspeed_gpio_set(gc, offset, val);
|
__aspeed_gpio_set(gc, offset, val);
|
||||||
|
|
||||||
if (copro)
|
if (copro)
|
||||||
aspeed_gpio_copro_release(gpio, offset);
|
aspeed_gpio_copro_release(gpio, offset);
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
|
static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
|
||||||
@ -435,7 +435,7 @@ static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
|
|||||||
if (!have_input(gpio, offset))
|
if (!have_input(gpio, offset))
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
|
|
||||||
reg = ioread32(addr);
|
reg = ioread32(addr);
|
||||||
reg &= ~GPIO_BIT(offset);
|
reg &= ~GPIO_BIT(offset);
|
||||||
@ -445,7 +445,7 @@ static int aspeed_gpio_dir_in(struct gpio_chip *gc, unsigned int offset)
|
|||||||
if (copro)
|
if (copro)
|
||||||
aspeed_gpio_copro_release(gpio, offset);
|
aspeed_gpio_copro_release(gpio, offset);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -463,7 +463,7 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
|
|||||||
if (!have_output(gpio, offset))
|
if (!have_output(gpio, offset))
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
|
|
||||||
reg = ioread32(addr);
|
reg = ioread32(addr);
|
||||||
reg |= GPIO_BIT(offset);
|
reg |= GPIO_BIT(offset);
|
||||||
@ -474,7 +474,7 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
|
|||||||
|
|
||||||
if (copro)
|
if (copro)
|
||||||
aspeed_gpio_copro_release(gpio, offset);
|
aspeed_gpio_copro_release(gpio, offset);
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -492,11 +492,11 @@ static int aspeed_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
|
|||||||
if (!have_output(gpio, offset))
|
if (!have_output(gpio, offset))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
|
|
||||||
val = ioread32(bank_reg(gpio, bank, reg_dir)) & GPIO_BIT(offset);
|
val = ioread32(bank_reg(gpio, bank, reg_dir)) & GPIO_BIT(offset);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
||||||
return !val;
|
return !val;
|
||||||
|
|
||||||
@ -540,14 +540,14 @@ static void aspeed_gpio_irq_ack(struct irq_data *d)
|
|||||||
|
|
||||||
status_addr = bank_reg(gpio, bank, reg_irq_status);
|
status_addr = bank_reg(gpio, bank, reg_irq_status);
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
copro = aspeed_gpio_copro_request(gpio, offset);
|
copro = aspeed_gpio_copro_request(gpio, offset);
|
||||||
|
|
||||||
iowrite32(bit, status_addr);
|
iowrite32(bit, status_addr);
|
||||||
|
|
||||||
if (copro)
|
if (copro)
|
||||||
aspeed_gpio_copro_release(gpio, offset);
|
aspeed_gpio_copro_release(gpio, offset);
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
|
static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
|
||||||
@ -566,7 +566,7 @@ static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
|
|||||||
|
|
||||||
addr = bank_reg(gpio, bank, reg_irq_enable);
|
addr = bank_reg(gpio, bank, reg_irq_enable);
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
copro = aspeed_gpio_copro_request(gpio, offset);
|
copro = aspeed_gpio_copro_request(gpio, offset);
|
||||||
|
|
||||||
reg = ioread32(addr);
|
reg = ioread32(addr);
|
||||||
@ -578,7 +578,7 @@ static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
|
|||||||
|
|
||||||
if (copro)
|
if (copro)
|
||||||
aspeed_gpio_copro_release(gpio, offset);
|
aspeed_gpio_copro_release(gpio, offset);
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void aspeed_gpio_irq_mask(struct irq_data *d)
|
static void aspeed_gpio_irq_mask(struct irq_data *d)
|
||||||
@ -630,7 +630,7 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
copro = aspeed_gpio_copro_request(gpio, offset);
|
copro = aspeed_gpio_copro_request(gpio, offset);
|
||||||
|
|
||||||
addr = bank_reg(gpio, bank, reg_irq_type0);
|
addr = bank_reg(gpio, bank, reg_irq_type0);
|
||||||
@ -650,7 +650,7 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
|
|||||||
|
|
||||||
if (copro)
|
if (copro)
|
||||||
aspeed_gpio_copro_release(gpio, offset);
|
aspeed_gpio_copro_release(gpio, offset);
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
||||||
irq_set_handler_locked(d, handler);
|
irq_set_handler_locked(d, handler);
|
||||||
|
|
||||||
@ -720,7 +720,7 @@ static int aspeed_gpio_reset_tolerance(struct gpio_chip *chip,
|
|||||||
|
|
||||||
treg = bank_reg(gpio, to_bank(offset), reg_tolerance);
|
treg = bank_reg(gpio, to_bank(offset), reg_tolerance);
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
copro = aspeed_gpio_copro_request(gpio, offset);
|
copro = aspeed_gpio_copro_request(gpio, offset);
|
||||||
|
|
||||||
val = readl(treg);
|
val = readl(treg);
|
||||||
@ -734,7 +734,7 @@ static int aspeed_gpio_reset_tolerance(struct gpio_chip *chip,
|
|||||||
|
|
||||||
if (copro)
|
if (copro)
|
||||||
aspeed_gpio_copro_release(gpio, offset);
|
aspeed_gpio_copro_release(gpio, offset);
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -860,7 +860,7 @@ static int enable_debounce(struct gpio_chip *chip, unsigned int offset,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
|
|
||||||
if (timer_allocation_registered(gpio, offset)) {
|
if (timer_allocation_registered(gpio, offset)) {
|
||||||
rc = unregister_allocated_timer(gpio, offset);
|
rc = unregister_allocated_timer(gpio, offset);
|
||||||
@ -920,7 +920,7 @@ static int enable_debounce(struct gpio_chip *chip, unsigned int offset,
|
|||||||
configure_timer(gpio, offset, i);
|
configure_timer(gpio, offset, i);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -931,13 +931,13 @@ static int disable_debounce(struct gpio_chip *chip, unsigned int offset)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
|
|
||||||
rc = unregister_allocated_timer(gpio, offset);
|
rc = unregister_allocated_timer(gpio, offset);
|
||||||
if (!rc)
|
if (!rc)
|
||||||
configure_timer(gpio, offset, 0);
|
configure_timer(gpio, offset, 0);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -1019,7 +1019,7 @@ int aspeed_gpio_copro_grab_gpio(struct gpio_desc *desc,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
bindex = offset >> 3;
|
bindex = offset >> 3;
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
|
|
||||||
/* Sanity check, this shouldn't happen */
|
/* Sanity check, this shouldn't happen */
|
||||||
if (gpio->cf_copro_bankmap[bindex] == 0xff) {
|
if (gpio->cf_copro_bankmap[bindex] == 0xff) {
|
||||||
@ -1040,7 +1040,7 @@ int aspeed_gpio_copro_grab_gpio(struct gpio_desc *desc,
|
|||||||
if (bit)
|
if (bit)
|
||||||
*bit = GPIO_OFFSET(offset);
|
*bit = GPIO_OFFSET(offset);
|
||||||
bail:
|
bail:
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(aspeed_gpio_copro_grab_gpio);
|
EXPORT_SYMBOL_GPL(aspeed_gpio_copro_grab_gpio);
|
||||||
@ -1064,7 +1064,7 @@ int aspeed_gpio_copro_release_gpio(struct gpio_desc *desc)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
bindex = offset >> 3;
|
bindex = offset >> 3;
|
||||||
|
|
||||||
spin_lock_irqsave(&gpio->lock, flags);
|
raw_spin_lock_irqsave(&gpio->lock, flags);
|
||||||
|
|
||||||
/* Sanity check, this shouldn't happen */
|
/* Sanity check, this shouldn't happen */
|
||||||
if (gpio->cf_copro_bankmap[bindex] == 0) {
|
if (gpio->cf_copro_bankmap[bindex] == 0) {
|
||||||
@ -1078,7 +1078,7 @@ int aspeed_gpio_copro_release_gpio(struct gpio_desc *desc)
|
|||||||
aspeed_gpio_change_cmd_source(gpio, bank, bindex,
|
aspeed_gpio_change_cmd_source(gpio, bank, bindex,
|
||||||
GPIO_CMDSRC_ARM);
|
GPIO_CMDSRC_ARM);
|
||||||
bail:
|
bail:
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(aspeed_gpio_copro_release_gpio);
|
EXPORT_SYMBOL_GPL(aspeed_gpio_copro_release_gpio);
|
||||||
@ -1151,7 +1151,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(gpio->base))
|
if (IS_ERR(gpio->base))
|
||||||
return PTR_ERR(gpio->base);
|
return PTR_ERR(gpio->base);
|
||||||
|
|
||||||
spin_lock_init(&gpio->lock);
|
raw_spin_lock_init(&gpio->lock);
|
||||||
|
|
||||||
gpio_id = of_match_node(aspeed_gpio_of_table, pdev->dev.of_node);
|
gpio_id = of_match_node(aspeed_gpio_of_table, pdev->dev.of_node);
|
||||||
if (!gpio_id)
|
if (!gpio_id)
|
||||||
|
Loading…
Reference in New Issue
Block a user