#include <linux/property.h>
  #include <linux/slab.h>
  
- #include "irq-msi-lib.h"
+ #include <linux/irqchip/irq-msi-lib.h>
  
 -#define SG2042_MAX_MSI_VECTOR 32
 +struct sg204x_msi_chip_info {
 +      const struct irq_chip           *irqchip;
 +      const struct msi_parent_ops     *parent_ops;
 +};
 +
 +/**
 + * struct sg204x_msi_chipdata - chip data for the SG204x MSI IRQ controller
 + * @reg_clr:          clear reg, see TRM, 10.1.33, GP_INTR0_CLR
 + * @doorbell_addr:    see TRM, 10.1.32, GP_INTR0_SET
 + * @irq_first:                First vectors number that MSIs starts
 + * @num_irqs:         Number of vectors for MSIs
 + * @msi_map:          mapping for allocated MSI vectors.
 + * @msi_map_lock:     Lock for msi_map
 + * @chip_info:                chip specific infomations
 + */
 +struct sg204x_msi_chipdata {
 +      void __iomem                            *reg_clr;
  
 -struct sg2042_msi_chipdata {
 -      void __iomem    *reg_clr;       // clear reg, see TRM, 10.1.33, GP_INTR0_CLR
 +      phys_addr_t                             doorbell_addr;
  
 -      phys_addr_t     doorbell_addr;  // see TRM, 10.1.32, GP_INTR0_SET
 +      u32                                     irq_first;
 +      u32                                     num_irqs;
  
 -      u32             irq_first;      // The vector number that MSIs starts
 -      u32             num_irqs;       // The number of vectors for MSIs
 +      unsigned long                           *msi_map;
 +      struct mutex                            msi_map_lock;
  
 -      DECLARE_BITMAP(msi_map, SG2042_MAX_MSI_VECTOR);
 -      struct mutex    msi_map_lock;   // lock for msi_map
 +      const struct sg204x_msi_chip_info       *chip_info;
  };
  
 -static int sg2042_msi_allocate_hwirq(struct sg2042_msi_chipdata *data, int num_req)
 +static int sg204x_msi_allocate_hwirq(struct sg204x_msi_chipdata *data, int num_req)
  {
        int first;
  
 
        return domain->flags & IRQ_DOMAIN_FLAG_MSI_DEVICE;
  }
  
+ static inline bool irq_domain_is_msi_immutable(struct irq_domain *domain)
+ {
+       return domain->flags & IRQ_DOMAIN_FLAG_MSI_IMMUTABLE;
+ }
  #else /* CONFIG_IRQ_DOMAIN_HIERARCHY */
 -static inline int irq_domain_alloc_irqs(struct irq_domain *domain,
 -                      unsigned int nr_irqs, int node, void *arg)
 +static inline int irq_domain_alloc_irqs(struct irq_domain *domain, unsigned int nr_irqs,
 +                                      int node, void *arg)
  {
        return -1;
  }