static struct msi_parent_ops gicv2m_msi_parent_ops = {
        .supported_flags        = GICV2M_MSI_FLAGS_SUPPORTED,
        .required_flags         = GICV2M_MSI_FLAGS_REQUIRED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_token       = DOMAIN_BUS_NEXUS,
        .bus_select_mask        = MATCH_PCI_MSI | MATCH_PLATFORM_MSI,
        .prefix                 = "GICv2m-",
 
 const struct msi_parent_ops gic_v3_its_msi_parent_ops = {
        .supported_flags        = ITS_MSI_FLAGS_SUPPORTED,
        .required_flags         = ITS_MSI_FLAGS_REQUIRED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_token       = DOMAIN_BUS_NEXUS,
        .bus_select_mask        = MATCH_PCI_MSI | MATCH_PLATFORM_MSI,
        .prefix                 = "ITS-",
 
 static const struct msi_parent_ops gic_v3_mbi_msi_parent_ops = {
        .supported_flags        = MBI_MSI_FLAGS_SUPPORTED,
        .required_flags         = MBI_MSI_FLAGS_REQUIRED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_token       = DOMAIN_BUS_NEXUS,
        .bus_select_mask        = MATCH_PCI_MSI | MATCH_PLATFORM_MSI,
        .prefix                 = "MBI-",
 
 static const struct msi_parent_ops imx_mu_msi_parent_ops = {
        .supported_flags        = IMX_MU_MSI_FLAGS_SUPPORTED,
        .required_flags         = IMX_MU_MSI_FLAGS_REQUIRED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_token       = DOMAIN_BUS_NEXUS,
        .bus_select_mask        = MATCH_PLATFORM_MSI,
        .prefix                 = "MU-MSI-",
 
 static struct msi_parent_ops pch_msi_parent_ops = {
        .required_flags         = PCH_MSI_FLAGS_REQUIRED,
        .supported_flags        = PCH_MSI_FLAGS_SUPPORTED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_mask        = MATCH_PCI_MSI,
        .bus_select_token       = DOMAIN_BUS_NEXUS,
        .prefix                 = "PCH-",
 
                               struct msi_domain_info *info)
 {
        const struct msi_parent_ops *pops = real_parent->msi_parent_ops;
+       struct irq_chip *chip = info->chip;
        u32 required_flags;
 
        /* Parent ops available? */
        info->flags                     |= required_flags;
 
        /* Chip updates for all child bus types */
-       if (!info->chip->irq_eoi)
-               info->chip->irq_eoi     = irq_chip_eoi_parent;
-       if (!info->chip->irq_ack)
-               info->chip->irq_ack     = irq_chip_ack_parent;
+       if (!chip->irq_eoi && (pops->chip_flags & MSI_CHIP_FLAG_SET_EOI))
+               chip->irq_eoi = irq_chip_eoi_parent;
+       if (!chip->irq_ack && (pops->chip_flags & MSI_CHIP_FLAG_SET_ACK))
+               chip->irq_ack = irq_chip_ack_parent;
 
        /*
         * The device MSI domain can never have a set affinity callback. It
         * device MSI domain aside of mask/unmask which is provided e.g. by
         * PCI/MSI device domains.
         */
-       info->chip->irq_set_affinity    = msi_domain_set_affinity;
+       chip->irq_set_affinity = msi_domain_set_affinity;
        return true;
 }
 EXPORT_SYMBOL_GPL(msi_lib_init_dev_msi_info);
 
 static const struct msi_parent_ops gicp_msi_parent_ops = {
        .supported_flags        = GICP_MSI_FLAGS_SUPPORTED,
        .required_flags         = GICP_MSI_FLAGS_REQUIRED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_token       = DOMAIN_BUS_GENERIC_MSI,
        .bus_select_mask        = MATCH_PLATFORM_MSI,
        .prefix                 = "GICP-",
 
 static const struct msi_parent_ops odmi_msi_parent_ops = {
        .supported_flags        = ODMI_MSI_FLAGS_SUPPORTED,
        .required_flags         = ODMI_MSI_FLAGS_REQUIRED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_token       = DOMAIN_BUS_GENERIC_MSI,
        .bus_select_mask        = MATCH_PLATFORM_MSI,
        .prefix                 = "ODMI-",
 
 static const struct msi_parent_ops sei_msi_parent_ops = {
        .supported_flags        = SEI_MSI_FLAGS_SUPPORTED,
        .required_flags         = SEI_MSI_FLAGS_REQUIRED,
+       .chip_flags             = MSI_CHIP_FLAG_SET_EOI | MSI_CHIP_FLAG_SET_ACK,
        .bus_select_mask        = MATCH_PLATFORM_MSI,
        .bus_select_token       = DOMAIN_BUS_GENERIC_MSI,
        .prefix                 = "SEI-",
 
        MSI_FLAG_NO_AFFINITY            = (1 << 21),
 };
 
+/*
+ * Flags for msi_parent_ops::chip_flags
+ */
+enum {
+       MSI_CHIP_FLAG_SET_EOI           = (1 << 0),
+       MSI_CHIP_FLAG_SET_ACK           = (1 << 1),
+};
+
 /**
  * struct msi_parent_ops - MSI parent domain callbacks and configuration info
  *
  * @supported_flags:   Required: The supported MSI flags of the parent domain
  * @required_flags:    Optional: The required MSI flags of the parent MSI domain
+ * @chip_flags:                Optional: Select MSI chip callbacks to update with defaults
+ *                     in msi_lib_init_dev_msi_info().
  * @bus_select_token:  Optional: The bus token of the real parent domain for
  *                     irq_domain::select()
  * @bus_select_mask:   Optional: A mask of supported BUS_DOMAINs for
 struct msi_parent_ops {
        u32             supported_flags;
        u32             required_flags;
+       u32             chip_flags;
        u32             bus_select_token;
        u32             bus_select_mask;
        const char      *prefix;