aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2015-10-13 07:51:38 -0400
committerThomas Gleixner <tglx@linutronix.de>2015-10-13 13:01:24 -0400
commit2bc6eba4a322e70eac8cde76442c4ac90699fb39 (patch)
treef6c6fa9299a061cf6b74824c291af3f5c97433ba
parentd7f8504d234450bf10bb2eb2d4565d6e9af78e5c (diff)
acpi/gsi: Add acpi_set_irq_model to initialize the GSI layer
In order to start embrassing irqdomains at the GSI level, introduce a new initializer: void acpi_set_irq_model(enum acpi_irq_model_id model, struct fwnode_handle *fwnode); where: - model is the value assigned to acpi_irq_model - fwnode is the identifier for the irqdomain mapping GSI interrupts As nobody calls this code yet, the current code is (mostly) left in place. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-and-tested-by: Hanjun Guo <hanjun.guo@linaro.org> Tested-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: <linux-arm-kernel@lists.infradead.org> Cc: Tomasz Nowicki <tomasz.nowicki@linaro.org> Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> Cc: Graeme Gregory <graeme@xora.org.uk> Cc: Jake Oshins <jakeo@microsoft.com> Cc: Jiang Liu <jiang.liu@linux.intel.com> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Rafael J. Wysocki <rjw@rjwysocki.net> Link: http://lkml.kernel.org/r/1444737105-31573-11-git-send-email-marc.zyngier@arm.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-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