aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/gsi.c32
-rw-r--r--include/linux/acpi.h3
2 files changed, 30 insertions, 5 deletions
diff --git a/drivers/acpi/gsi.c b/drivers/acpi/gsi.c
index 2c39fe1216e2..202a8fee77dc 100644
--- a/drivers/acpi/gsi.c
+++ b/drivers/acpi/gsi.c
@@ -75,12 +75,21 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger,
75{ 75{
76 unsigned int irq; 76 unsigned int irq;
77 unsigned int irq_type = acpi_gsi_get_irq_type(trigger, polarity); 77 unsigned int irq_type = acpi_gsi_get_irq_type(trigger, polarity);
78 struct irq_domain *d = irq_find_matching_fwnode(acpi_gsi_domain_id,
79 DOMAIN_BUS_ANY);
80 78
81 irq = irq_create_mapping(d, gsi); 79 if (acpi_gsi_domain_id) {
82 if (!irq) 80 struct irq_fwspec fwspec;
83 return -EINVAL; 81
82 fwspec.fwnode = acpi_gsi_domain_id;
83 fwspec.param[0] = gsi;
84 fwspec.param[1] = irq_type;
85 fwspec.param_count = 2;
86
87 return irq_create_fwspec_mapping(&fwspec);
88 } else {
89 irq = irq_create_mapping(NULL, gsi);
90 if (!irq)
91 return -EINVAL;
92 }
84 93
85 /* Set irq type if specified and different than the current one */ 94 /* Set irq type if specified and different than the current one */
86 if (irq_type != IRQ_TYPE_NONE && 95 if (irq_type != IRQ_TYPE_NONE &&
@@ -103,3 +112,16 @@ void acpi_unregister_gsi(u32 gsi)
103 irq_dispose_mapping(irq); 112 irq_dispose_mapping(irq);
104} 113}
105EXPORT_SYMBOL_GPL(acpi_unregister_gsi); 114EXPORT_SYMBOL_GPL(acpi_unregister_gsi);
115
116/**
117 * acpi_set_irq_model - Setup the GSI irqdomain information
118 * @model: the value assigned to acpi_irq_model
119 * @fwnode: the irq_domain identifier for mapping and looking up
120 * GSI interrupts
121 */
122void __init acpi_set_irq_model(enum acpi_irq_model_id model,
123 struct fwnode_handle *fwnode)
124{
125 acpi_irq_model = model;
126 acpi_gsi_domain_id = fwnode;
127}
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 43856d19cf4d..d863e12bbead 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -201,6 +201,9 @@ int acpi_register_gsi (struct device *dev, u32 gsi, int triggering, int polarity
201int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); 201int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
202int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi); 202int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);
203 203
204void acpi_set_irq_model(enum acpi_irq_model_id model,
205 struct fwnode_handle *fwnode);
206
204#ifdef CONFIG_X86_IO_APIC 207#ifdef CONFIG_X86_IO_APIC
205extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity); 208extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);
206#else 209#else