[PATCH v2 7/7] genirq/chip: Constify the 'chip' field in irq_data
From: Christophe JAILLET
Date: Mon Jun 01 2026 - 16:20:05 EST
Commit 393e1280f765 ("genirq: Allow irq_chip registration functions to take
a const irq_chip") and ef6e5d61eb7a ("genirq: Allow
irq_set_chip_handler_name_locked() to take a const irq_chip") have
introduced some ugly casting to store some const parameters into non-const
struct members. [1] [2]
Correctly constify this 'chip' field in struct irq_data, update
corresponding asseccors and remove the now useless cast in
irq_set_chip_handler_name_locked() and irq_set_chip().
[1]: https://elixir.bootlin.com/linux/v7.1-rc5/source/kernel/irq/chip.c#L48
[2]: https://elixir.bootlin.com/linux/v7.1-rc5/source/include/linux/irqdesc.h#L250
Signed-off-by: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx>
---
Compile-tested only, on x86
Changes in v2:
- New patch
v1: none
---
include/linux/irq.h | 6 +++---
include/linux/irqdesc.h | 4 ++--
kernel/irq/chip.c | 2 +-
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/include/linux/irq.h b/include/linux/irq.h
index efa514ee562f..cde56cb98db3 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -183,7 +183,7 @@ struct irq_data {
unsigned int irq;
irq_hw_number_t hwirq;
struct irq_common_data *common;
- struct irq_chip *chip;
+ const struct irq_chip *chip;
struct irq_domain *domain;
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
struct irq_data *parent_data;
@@ -817,13 +817,13 @@ extern int irq_set_msi_desc_off(unsigned int irq_base, unsigned int irq_offset,
struct msi_desc *entry);
extern struct irq_data *irq_get_irq_data(unsigned int irq);
-static inline struct irq_chip *irq_get_chip(unsigned int irq)
+static inline const struct irq_chip *irq_get_chip(unsigned int irq)
{
struct irq_data *d = irq_get_irq_data(irq);
return d ? d->chip : NULL;
}
-static inline struct irq_chip *irq_data_get_irq_chip(struct irq_data *d)
+static inline const struct irq_chip *irq_data_get_irq_chip(struct irq_data *d)
{
return d->chip;
}
diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h
index dae9a9b93665..53dbed301375 100644
--- a/include/linux/irqdesc.h
+++ b/include/linux/irqdesc.h
@@ -162,7 +162,7 @@ static inline struct irq_data *irq_desc_get_irq_data(struct irq_desc *desc)
return &desc->irq_data;
}
-static inline struct irq_chip *irq_desc_get_chip(struct irq_desc *desc)
+static inline const struct irq_chip *irq_desc_get_chip(struct irq_desc *desc)
{
return desc->irq_data.chip;
}
@@ -247,7 +247,7 @@ irq_set_chip_handler_name_locked(struct irq_data *data,
desc->handle_irq = handler;
desc->name = name;
- data->chip = (struct irq_chip *)chip;
+ data->chip = chip;
}
bool irq_check_status_bit(unsigned int irq, unsigned int bitmask);
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 957e4264bf46..b97881ac7775 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -45,7 +45,7 @@ int irq_set_chip(unsigned int irq, const struct irq_chip *chip)
int ret = -EINVAL;
scoped_irqdesc_get_and_lock(irq, 0) {
- scoped_irqdesc->irq_data.chip = (struct irq_chip *)(chip ?: &no_irq_chip);
+ scoped_irqdesc->irq_data.chip = chip ?: &no_irq_chip;
ret = 0;
}
/* For !CONFIG_SPARSE_IRQ make the irq show up in allocated_irqs. */
--
2.54.0