extern struct irq_chip dummy_irq_chip;
 
 extern void
-irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
+irq_set_chip_and_handler_name(unsigned int irq, const struct irq_chip *chip,
                              irq_flow_handler_t handle, const char *name);
 
-static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *chip,
+static inline void irq_set_chip_and_handler(unsigned int irq,
+                                           const struct irq_chip *chip,
                                            irq_flow_handler_t handle)
 {
        irq_set_chip_and_handler_name(irq, chip, handle, NULL);
 }
 
 /* Set/get chip/data for an IRQ: */
-extern int irq_set_chip(unsigned int irq, struct irq_chip *chip);
+extern int irq_set_chip(unsigned int irq, const struct irq_chip *chip);
 extern int irq_set_handler_data(unsigned int irq, void *data);
 extern int irq_set_chip_data(unsigned int irq, void *data);
 extern int irq_set_irq_type(unsigned int irq, unsigned int type);
 
  *     @irq:   irq number
  *     @chip:  pointer to irq chip description structure
  */
-int irq_set_chip(unsigned int irq, struct irq_chip *chip)
+int irq_set_chip(unsigned int irq, const struct irq_chip *chip)
 {
        unsigned long flags;
        struct irq_desc *desc = irq_get_desc_lock(irq, &flags, 0);
        if (!desc)
                return -EINVAL;
 
-       if (!chip)
-               chip = &no_irq_chip;
-
-       desc->irq_data.chip = chip;
+       desc->irq_data.chip = (struct irq_chip *)(chip ?: &no_irq_chip);
        irq_put_desc_unlock(desc, flags);
        /*
         * For !CONFIG_SPARSE_IRQ make the irq show up in
 EXPORT_SYMBOL_GPL(irq_set_chained_handler_and_data);
 
 void
-irq_set_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,
+irq_set_chip_and_handler_name(unsigned int irq, const struct irq_chip *chip,
                              irq_flow_handler_t handle, const char *name)
 {
        irq_set_chip(irq, chip);