Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Andrey Smirnov and committed by
Marc Zyngier
ed01edc0 fb7348ab

+29 -2
+29 -2
drivers/irqchip/irq-imx-gpcv2.c
··· 17 17 18 18 #define GPC_IMR1_CORE0 0x30 19 19 #define GPC_IMR1_CORE1 0x40 20 + #define GPC_IMR1_CORE2 0x1c0 21 + #define GPC_IMR1_CORE3 0x1d0 22 + 20 23 21 24 struct gpcv2_irqchip_data { 22 25 struct raw_spinlock rlock; ··· 195 192 .free = irq_domain_free_irqs_common, 196 193 }; 197 194 195 + static const struct of_device_id gpcv2_of_match[] = { 196 + { .compatible = "fsl,imx7d-gpc", .data = (const void *) 2 }, 197 + { .compatible = "fsl,imx8mq-gpc", .data = (const void *) 4 }, 198 + { /* END */ } 199 + }; 200 + 198 201 static int __init imx_gpcv2_irqchip_init(struct device_node *node, 199 202 struct device_node *parent) 200 203 { 201 204 struct irq_domain *parent_domain, *domain; 202 205 struct gpcv2_irqchip_data *cd; 206 + const struct of_device_id *id; 207 + unsigned long core_num; 203 208 int i; 204 209 205 210 if (!parent) { 206 211 pr_err("%pOF: no parent, giving up\n", node); 207 212 return -ENODEV; 208 213 } 214 + 215 + id = of_match_node(gpcv2_of_match, node); 216 + if (!id) { 217 + pr_err("%pOF: unknown compatibility string\n", node); 218 + return -ENODEV; 219 + } 220 + 221 + core_num = (unsigned long)id->data; 209 222 210 223 parent_domain = irq_find_host(parent); 211 224 if (!parent_domain) { ··· 255 236 256 237 /* Initially mask all interrupts */ 257 238 for (i = 0; i < IMR_NUM; i++) { 258 - writel_relaxed(~0, cd->gpc_base + GPC_IMR1_CORE0 + i * 4); 259 - writel_relaxed(~0, cd->gpc_base + GPC_IMR1_CORE1 + i * 4); 239 + void __iomem *reg = cd->gpc_base + i * 4; 240 + 241 + switch (core_num) { 242 + case 4: 243 + writel_relaxed(~0, reg + GPC_IMR1_CORE2); 244 + writel_relaxed(~0, reg + GPC_IMR1_CORE3); 245 + case 2: /* FALLTHROUGH */ 246 + writel_relaxed(~0, reg + GPC_IMR1_CORE0); 247 + writel_relaxed(~0, reg + GPC_IMR1_CORE1); 248 + } 260 249 cd->wakeup_sources[i] = ~0; 261 250 } 262 251