aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/gsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/gsi.c')
-rw-r--r--drivers/acpi/gsi.c32
1 files changed, 27 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}