diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2018-12-06 02:31:25 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2018-12-13 04:35:55 -0500 |
commit | ed01edc0ab6fec0ff675a6b16ccf7069bde98769 (patch) | |
tree | 73b1944369f277aa532353ad35f051ab7a4a2c5b | |
parent | fb7348abb119e9ac497c95bec6615c6e56619c2e (diff) |
irqchip/irq-imx-gpcv2: Add support for i.MX8MQ
Add code needed to support i.MX8MQ.
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: cphealy@gmail.com
Cc: l.stach@pengutronix.de
Cc: Leonard Crestez <leonard.crestez@nxp.com>
Cc: "A.s. Dong" <aisheng.dong@nxp.com>
Cc: Richard Zhu <hongxing.zhu@nxp.com>
Cc: linux-imx@nxp.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r-- | drivers/irqchip/irq-imx-gpcv2.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/drivers/irqchip/irq-imx-gpcv2.c b/drivers/irqchip/irq-imx-gpcv2.c index c2b2b3128ddd..17a2dad2d4c2 100644 --- a/drivers/irqchip/irq-imx-gpcv2.c +++ b/drivers/irqchip/irq-imx-gpcv2.c | |||
@@ -17,6 +17,9 @@ | |||
17 | 17 | ||
18 | #define GPC_IMR1_CORE0 0x30 | 18 | #define GPC_IMR1_CORE0 0x30 |
19 | #define GPC_IMR1_CORE1 0x40 | 19 | #define GPC_IMR1_CORE1 0x40 |
20 | #define GPC_IMR1_CORE2 0x1c0 | ||
21 | #define GPC_IMR1_CORE3 0x1d0 | ||
22 | |||
20 | 23 | ||
21 | struct gpcv2_irqchip_data { | 24 | struct gpcv2_irqchip_data { |
22 | struct raw_spinlock rlock; | 25 | struct raw_spinlock rlock; |
@@ -192,11 +195,19 @@ static const struct irq_domain_ops gpcv2_irqchip_data_domain_ops = { | |||
192 | .free = irq_domain_free_irqs_common, | 195 | .free = irq_domain_free_irqs_common, |
193 | }; | 196 | }; |
194 | 197 | ||
198 | static const struct of_device_id gpcv2_of_match[] = { | ||
199 | { .compatible = "fsl,imx7d-gpc", .data = (const void *) 2 }, | ||
200 | { .compatible = "fsl,imx8mq-gpc", .data = (const void *) 4 }, | ||
201 | { /* END */ } | ||
202 | }; | ||
203 | |||
195 | static int __init imx_gpcv2_irqchip_init(struct device_node *node, | 204 | static int __init imx_gpcv2_irqchip_init(struct device_node *node, |
196 | struct device_node *parent) | 205 | struct device_node *parent) |
197 | { | 206 | { |
198 | struct irq_domain *parent_domain, *domain; | 207 | struct irq_domain *parent_domain, *domain; |
199 | struct gpcv2_irqchip_data *cd; | 208 | struct gpcv2_irqchip_data *cd; |
209 | const struct of_device_id *id; | ||
210 | unsigned long core_num; | ||
200 | int i; | 211 | int i; |
201 | 212 | ||
202 | if (!parent) { | 213 | if (!parent) { |
@@ -204,6 +215,14 @@ static int __init imx_gpcv2_irqchip_init(struct device_node *node, | |||
204 | return -ENODEV; | 215 | return -ENODEV; |
205 | } | 216 | } |
206 | 217 | ||
218 | id = of_match_node(gpcv2_of_match, node); | ||
219 | if (!id) { | ||
220 | pr_err("%pOF: unknown compatibility string\n", node); | ||
221 | return -ENODEV; | ||
222 | } | ||
223 | |||
224 | core_num = (unsigned long)id->data; | ||
225 | |||
207 | parent_domain = irq_find_host(parent); | 226 | parent_domain = irq_find_host(parent); |
208 | if (!parent_domain) { | 227 | if (!parent_domain) { |
209 | pr_err("%pOF: unable to get parent domain\n", node); | 228 | pr_err("%pOF: unable to get parent domain\n", node); |
@@ -236,8 +255,16 @@ static int __init imx_gpcv2_irqchip_init(struct device_node *node, | |||
236 | 255 | ||
237 | /* Initially mask all interrupts */ | 256 | /* Initially mask all interrupts */ |
238 | for (i = 0; i < IMR_NUM; i++) { | 257 | for (i = 0; i < IMR_NUM; i++) { |
239 | writel_relaxed(~0, cd->gpc_base + GPC_IMR1_CORE0 + i * 4); | 258 | void __iomem *reg = cd->gpc_base + i * 4; |
240 | writel_relaxed(~0, cd->gpc_base + GPC_IMR1_CORE1 + i * 4); | 259 | |
260 | switch (core_num) { | ||
261 | case 4: | ||
262 | writel_relaxed(~0, reg + GPC_IMR1_CORE2); | ||
263 | writel_relaxed(~0, reg + GPC_IMR1_CORE3); | ||
264 | case 2: /* FALLTHROUGH */ | ||
265 | writel_relaxed(~0, reg + GPC_IMR1_CORE0); | ||
266 | writel_relaxed(~0, reg + GPC_IMR1_CORE1); | ||
267 | } | ||
241 | cd->wakeup_sources[i] = ~0; | 268 | cd->wakeup_sources[i] = ~0; |
242 | } | 269 | } |
243 | 270 | ||