gpio: pca953x: Switch to bitops in IRQ callbacks
Since we have driver converted to use bitmap API we must use
traditional bit operations (set_bit(), clear_bit(), etc.)
against it.
Currently IRQ callbacks are missed in the conversion and
thus broken.
Let's fix it right here right now.
Fixes: 35d13d9489
("gpio: pca953x: convert to use bitmap API")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
This commit is contained in:
parent
256efaea1f
commit
2688302bf1
|
@ -568,16 +568,18 @@ static void pca953x_irq_mask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
chip->irq_mask[d->hwirq / BANK_SZ] &= ~BIT(d->hwirq % BANK_SZ);
|
clear_bit(hwirq, chip->irq_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pca953x_irq_unmask(struct irq_data *d)
|
static void pca953x_irq_unmask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
chip->irq_mask[d->hwirq / BANK_SZ] |= BIT(d->hwirq % BANK_SZ);
|
set_bit(hwirq, chip->irq_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pca953x_irq_set_wake(struct irq_data *d, unsigned int on)
|
static int pca953x_irq_set_wake(struct irq_data *d, unsigned int on)
|
||||||
|
@ -635,8 +637,7 @@ static int pca953x_irq_set_type(struct irq_data *d, unsigned int type)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
int bank_nb = d->hwirq / BANK_SZ;
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
u8 mask = BIT(d->hwirq % BANK_SZ);
|
|
||||||
|
|
||||||
if (!(type & IRQ_TYPE_EDGE_BOTH)) {
|
if (!(type & IRQ_TYPE_EDGE_BOTH)) {
|
||||||
dev_err(&chip->client->dev, "irq %d: unsupported type %d\n",
|
dev_err(&chip->client->dev, "irq %d: unsupported type %d\n",
|
||||||
|
@ -644,15 +645,8 @@ static int pca953x_irq_set_type(struct irq_data *d, unsigned int type)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type & IRQ_TYPE_EDGE_FALLING)
|
assign_bit(hwirq, chip->irq_trig_fall, type & IRQ_TYPE_EDGE_FALLING);
|
||||||
chip->irq_trig_fall[bank_nb] |= mask;
|
assign_bit(hwirq, chip->irq_trig_raise, type & IRQ_TYPE_EDGE_RISING);
|
||||||
else
|
|
||||||
chip->irq_trig_fall[bank_nb] &= ~mask;
|
|
||||||
|
|
||||||
if (type & IRQ_TYPE_EDGE_RISING)
|
|
||||||
chip->irq_trig_raise[bank_nb] |= mask;
|
|
||||||
else
|
|
||||||
chip->irq_trig_raise[bank_nb] &= ~mask;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -661,10 +655,10 @@ static void pca953x_irq_shutdown(struct irq_data *d)
|
||||||
{
|
{
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||||
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
struct pca953x_chip *chip = gpiochip_get_data(gc);
|
||||||
u8 mask = BIT(d->hwirq % BANK_SZ);
|
irq_hw_number_t hwirq = irqd_to_hwirq(d);
|
||||||
|
|
||||||
chip->irq_trig_raise[d->hwirq / BANK_SZ] &= ~mask;
|
clear_bit(hwirq, chip->irq_trig_raise);
|
||||||
chip->irq_trig_fall[d->hwirq / BANK_SZ] &= ~mask;
|
clear_bit(hwirq, chip->irq_trig_fall);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pending)
|
static bool pca953x_irq_pending(struct pca953x_chip *chip, unsigned long *pending)
|
||||||
|
|
Loading…
Reference in New Issue