diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2015-10-13 07:51:33 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2015-10-13 13:01:23 -0400 |
commit | f833f57ff25450b7161798dceaf8575a48d80249 (patch) | |
tree | d1d8af957f01065cbfbf76c5f4975a0e90d013fb /drivers/irqchip/irq-vf610-mscm-ir.c | |
parent | 11e4438ee330fab0f216ee7cc1b651cb2ddceb5d (diff) |
irqchip: Convert all alloc/xlate users from of_node to fwnode
Since we now have a generic data structure to express an
interrupt specifier, convert all hierarchical irqchips that
are OF based to use a fwnode_handle as part of their alloc
and xlate (which becomes translate) callbacks.
As most of these drivers have dependencies (they exchange IRQ
specifiers), change them all in a single, massive patch...
Signed-off-by: Marc Zyngier <marc.zyngier@arm.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-6-git-send-email-marc.zyngier@arm.com
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/irqchip/irq-vf610-mscm-ir.c')
-rw-r--r-- | drivers/irqchip/irq-vf610-mscm-ir.c | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/drivers/irqchip/irq-vf610-mscm-ir.c b/drivers/irqchip/irq-vf610-mscm-ir.c index ae82d7e15c63..56b5e3cb9de2 100644 --- a/drivers/irqchip/irq-vf610-mscm-ir.c +++ b/drivers/irqchip/irq-vf610-mscm-ir.c | |||
@@ -130,35 +130,51 @@ static int vf610_mscm_ir_domain_alloc(struct irq_domain *domain, unsigned int vi | |||
130 | { | 130 | { |
131 | int i; | 131 | int i; |
132 | irq_hw_number_t hwirq; | 132 | irq_hw_number_t hwirq; |
133 | struct of_phandle_args *irq_data = arg; | 133 | struct irq_fwspec *fwspec = arg; |
134 | struct of_phandle_args gic_data; | 134 | struct irq_fwspec parent_fwspec; |
135 | 135 | ||
136 | if (irq_data->args_count != 2) | 136 | if (!irq_domain_get_of_node(domain->parent)) |
137 | return -EINVAL; | 137 | return -EINVAL; |
138 | 138 | ||
139 | hwirq = irq_data->args[0]; | 139 | if (fwspec->param_count != 2) |
140 | return -EINVAL; | ||
141 | |||
142 | hwirq = fwspec->param[0]; | ||
140 | for (i = 0; i < nr_irqs; i++) | 143 | for (i = 0; i < nr_irqs; i++) |
141 | irq_domain_set_hwirq_and_chip(domain, virq + i, hwirq + i, | 144 | irq_domain_set_hwirq_and_chip(domain, virq + i, hwirq + i, |
142 | &vf610_mscm_ir_irq_chip, | 145 | &vf610_mscm_ir_irq_chip, |
143 | domain->host_data); | 146 | domain->host_data); |
144 | 147 | ||
145 | gic_data.np = irq_domain_get_of_node(domain->parent); | 148 | parent_fwspec.fwnode = domain->parent->fwnode; |
146 | 149 | ||
147 | if (mscm_ir_data->is_nvic) { | 150 | if (mscm_ir_data->is_nvic) { |
148 | gic_data.args_count = 1; | 151 | parent_fwspec.param_count = 1; |
149 | gic_data.args[0] = irq_data->args[0]; | 152 | parent_fwspec.param[0] = fwspec->param[0]; |
150 | } else { | 153 | } else { |
151 | gic_data.args_count = 3; | 154 | parent_fwspec.param_count = 3; |
152 | gic_data.args[0] = GIC_SPI; | 155 | parent_fwspec.param[0] = GIC_SPI; |
153 | gic_data.args[1] = irq_data->args[0]; | 156 | parent_fwspec.param[1] = fwspec->param[0]; |
154 | gic_data.args[2] = irq_data->args[1]; | 157 | parent_fwspec.param[2] = fwspec->param[1]; |
155 | } | 158 | } |
156 | 159 | ||
157 | return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &gic_data); | 160 | return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, |
161 | &parent_fwspec); | ||
162 | } | ||
163 | |||
164 | static int vf610_mscm_ir_domain_translate(struct irq_domain *d, | ||
165 | struct irq_fwspec *fwspec, | ||
166 | unsigned long *hwirq, | ||
167 | unsigned int *type) | ||
168 | { | ||
169 | if (WARN_ON(fwspec->param_count < 2)) | ||
170 | return -EINVAL; | ||
171 | *hwirq = fwspec->param[0]; | ||
172 | *type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK; | ||
173 | return 0; | ||
158 | } | 174 | } |
159 | 175 | ||
160 | static const struct irq_domain_ops mscm_irq_domain_ops = { | 176 | static const struct irq_domain_ops mscm_irq_domain_ops = { |
161 | .xlate = irq_domain_xlate_twocell, | 177 | .translate = vf610_mscm_ir_domain_translate, |
162 | .alloc = vf610_mscm_ir_domain_alloc, | 178 | .alloc = vf610_mscm_ir_domain_alloc, |
163 | .free = irq_domain_free_irqs_common, | 179 | .free = irq_domain_free_irqs_common, |
164 | }; | 180 | }; |