[PATCH v2 7/7] genirq/chip: Constify the 'chip' field in irq_data

Christophe JAILLET <[email protected]>
Newsgroups org.kernel.vger.kernel-janitors,org.kernel.vger.linux-kernel
Message-ID <41b4818e14f2f6e6a7406751d65b59899bd40331.1780343698.git.christophe.jaillet@wanadoo.fr>
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 <[email protected]>
---
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.