gpio: sch: make irq_chip immutable
Subsystems (2)
PATCH 1/1 gpio: sch: make irq_chip immutable
Since recently, the kernel is nagging about mutable irq_chips:
"not an immutable chip, please consider fixing it!"
Drop the unneeded copy, flag it as IRQCHIP_IMMUTABLE, add the new helper functions and call the appropriate gpiolib functions.
--- drivers/gpio/gpio-sch.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-)
drivers/gpio/gpio-sch.c +22 -13
@@ -38,7 +38,6 @@struct sch_gpio {struct gpio_chip chip; -struct irq_chip irqchip;spinlock_t lock;unsigned short iobase;unsigned short resume_base;
@@ -218,11 +217,9 @@ static void sch_irq_ack(struct irq_data *d)spin_unlock_irqrestore (&sch->lock, flags); } -static void sch_irq_mask_unmask (struct irq_data *d,int val) +static void sch_irq_mask_unmask (struct gpio_chip *gc,irq_hw_number_t gpio_num,int val) { -struct gpio_chip *gc =irq_data_get_irq_chip_data (d);struct sch_gpio *sch =gpiochip_get_data (gc); -irq_hw_number_t gpio_num =irqd_to_hwirq (d);unsigned long flags;spin_lock_irqsave (&sch->lock, flags);
@@ -232,14 +229,32 @@ static void sch_irq_mask_unmask(struct irq_data *d, int val)static void sch_irq_mask (struct irq_data *d) { -sch_irq_mask_unmask (d,0 ); +struct gpio_chip *gc =irq_data_get_irq_chip_data (d); +irq_hw_number_t gpio_num =irqd_to_hwirq (d); + +sch_irq_mask_unmask (gc, gpio_num,0 ); +gpiochip_disable_irq (gc, gpio_num); }static void sch_irq_unmask (struct irq_data *d) { -sch_irq_mask_unmask (d,1 ); +struct gpio_chip *gc =irq_data_get_irq_chip_data (d); +irq_hw_number_t gpio_num =irqd_to_hwirq (d); + +gpiochip_enable_irq (gc, gpio_num); +sch_irq_mask_unmask (gc, gpio_num,1 ); } +static const struct irq_chip sch_irqchip = { + .name ="sch_gpio" , + .irq_ack = sch_irq_ack, + .irq_mask = sch_irq_mask, + .irq_unmask = sch_irq_unmask, + .irq_set_type = sch_irq_type, + .flags =IRQCHIP_IMMUTABLE , +GPIOCHIP_IRQ_RESOURCE_HELPERS , +}; +static u32 sch_gpio_gpe_handler (acpi_handle gpe_device,u32 gpe,void *context) {struct sch_gpio *sch = context;
@@ -367,14 +382,8 @@ static int sch_gpio_probe(struct platform_device *pdev)platform_set_drvdata (pdev, sch); - sch->irqchip.name ="sch_gpio" ; - sch->irqchip.irq_ack = sch_irq_ack; - sch->irqchip.irq_mask = sch_irq_mask; - sch->irqchip.irq_unmask = sch_irq_unmask; - sch->irqchip.irq_set_type = sch_irq_type; - girq = &sch->chip.irq; - girq->chip = &sch->irqchip; +gpio_irq_chip_set_chip (girq, &sch_irqchip); girq->num_parents =0 ; girq->parents =NULL ; girq->parent_handler =NULL ;
Signature · 1 line
2.35.1
Quoted 90 lines · Andy Shevchenko
Since recently, the kernel is nagging about mutable
irq_chips:"not an immutable chip, please consider fixing it!"
Drop the unneeded copy, flag it as
IRQCHIP_IMMUTABLE, add the new helper functions and call the appropriate gpiolib functions.Signed-off-by Andy Shevchenko <[email protected]>--- drivers/gpio/gpio-sch.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-)drivers/gpio/gpio-sch.c +22
-14@@ -38,7 +38,6 @@struct sch_gpio {struct gpio_chip chip; -struct irq_chip irqchip;spinlock_t lock;unsigned short iobase;unsigned short resume_base;@@ -218,11 +217,9 @@ static void sch_irq_ack(struct irq_data *d)spin_unlock_irqrestore (&sch->lock, flags); } -static void sch_irq_mask_unmask (struct irq_data *d,int val) +static void sch_irq_mask_unmask (struct gpio_chip *gc,irq_hw_number_t gpio_num,int val) { -struct gpio_chip *gc =irq_data_get_irq_chip_data (d);struct sch_gpio *sch =gpiochip_get_data (gc); -irq_hw_number_t gpio_num =irqd_to_hwirq (d);unsigned long flags;spin_lock_irqsave (&sch->lock, flags);@@ -232,14 +229,32 @@ static void sch_irq_mask_unmask(struct irq_data *d, int val)static void sch_irq_mask (struct irq_data *d) { -sch_irq_mask_unmask (d,0 ); +struct gpio_chip *gc =irq_data_get_irq_chip_data (d); +irq_hw_number_t gpio_num =irqd_to_hwirq (d); + +sch_irq_mask_unmask (gc, gpio_num,0 ); +gpiochip_disable_irq (gc, gpio_num); }static void sch_irq_unmask (struct irq_data *d) { -sch_irq_mask_unmask (d,1 ); +struct gpio_chip *gc =irq_data_get_irq_chip_data (d); +irq_hw_number_t gpio_num =irqd_to_hwirq (d); + +gpiochip_enable_irq (gc, gpio_num); +sch_irq_mask_unmask (gc, gpio_num,1 ); } +static const struct irq_chip sch_irqchip = { + .name ="sch_gpio" , + .irq_ack = sch_irq_ack, + .irq_mask = sch_irq_mask, + .irq_unmask = sch_irq_unmask, + .irq_set_type = sch_irq_type, + .flags =IRQCHIP_IMMUTABLE , +GPIOCHIP_IRQ_RESOURCE_HELPERS , +}; +static u32 sch_gpio_gpe_handler (acpi_handle gpe_device,u32 gpe,void *context) {struct sch_gpio *sch = context;@@ -367,14 +382,8 @@ static int sch_gpio_probe(struct platform_device *pdev)platform_set_drvdata (pdev, sch); - sch->irqchip.name ="sch_gpio" ; - sch->irqchip.irq_ack = sch_irq_ack; - sch->irqchip.irq_mask = sch_irq_mask; - sch->irqchip.irq_unmask = sch_irq_unmask; - sch->irqchip.irq_set_type = sch_irq_type; - girq = &sch->chip.irq; - girq->chip = &sch->irqchip; +gpio_irq_chip_set_chip (girq, &sch_irqchip); girq->num_parents =0 ; girq->parents =NULL ; girq->parent_handler =NULL ; --
Quoted 2 lines
2.35.1
Quoted 11 lines · Bartosz Golaszewski
Quoted 7 lines · Andy Shevchenko
Since recently, the kernel is nagging about mutable
irq_chips:"not an immutable chip, please consider fixing it!"
Drop the unneeded copy, flag it as
IRQCHIP_IMMUTABLE, add the new helper functions and call the appropriate gpiolib functions.Reviewed-by Bartosz Golaszewski <[email protected]>
Thanks!
I think I will collect all of these and send a PR after v5.19-rc1 to be included into v5.19-rc2+. Tell me if you think differently.
Signature · 2 lines
With Best Regards, Andy Shevchenko