Skip to content

Commit de4addd

Browse files
Marc Zyngierrobherring
authored andcommitted
of/irq: Add a quirk for controllers with their own definition of interrupt-map
Since commit 0412841 ("of/irq: Allow matching of an interrupt-map local to an interrupt controller"), a handful of interrupt controllers have stopped working correctly. This is due to the DT exposing a non-sensical interrupt-map property, and their drivers relying on the kernel ignoring this property. Since we cannot realistically fix this terrible behaviour, add a quirk for the limited set of devices that have implemented this monster, and document that this is a pretty bad practice. Fixes: 0412841 ("of/irq: Allow matching of an interrupt-map local to an interrupt controller") Cc: Rob Herring <[email protected]> Cc: John Crispin <[email protected]> Cc: Biwen Li <[email protected]> Cc: Chris Brandt <[email protected]> Cc: Geert Uytterhoeven <[email protected]> Cc: Sander Vanheule <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Tested-by: Geert Uytterhoeven <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Rob Herring <[email protected]>
1 parent cc5faf2 commit de4addd

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

drivers/of/irq.c

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,26 @@ struct device_node *of_irq_find_parent(struct device_node *child)
7676
}
7777
EXPORT_SYMBOL_GPL(of_irq_find_parent);
7878

79+
/*
80+
* These interrupt controllers abuse interrupt-map for unspeakable
81+
* reasons and rely on the core code to *ignore* it (the drivers do
82+
* their own parsing of the property).
83+
*
84+
* If you think of adding to the list for something *new*, think
85+
* again. There is a high chance that you will be sent back to the
86+
* drawing board.
87+
*/
88+
static const char * const of_irq_imap_abusers[] = {
89+
"CBEA,platform-spider-pic",
90+
"sti,platform-spider-pic",
91+
"realtek,rtl-intc",
92+
"fsl,ls1021a-extirq",
93+
"fsl,ls1043a-extirq",
94+
"fsl,ls1088a-extirq",
95+
"renesas,rza1-irqc",
96+
NULL,
97+
};
98+
7999
/**
80100
* of_irq_parse_raw - Low level interrupt tree parsing
81101
* @addr: address specifier (start of "reg" property of the device) in be32 format
@@ -159,12 +179,15 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
159179
/*
160180
* Now check if cursor is an interrupt-controller and
161181
* if it is then we are done, unless there is an
162-
* interrupt-map which takes precedence.
182+
* interrupt-map which takes precedence except on one
183+
* of these broken platforms that want to parse
184+
* interrupt-map themselves for $reason.
163185
*/
164186
bool intc = of_property_read_bool(ipar, "interrupt-controller");
165187

166188
imap = of_get_property(ipar, "interrupt-map", &imaplen);
167-
if (imap == NULL && intc) {
189+
if (intc &&
190+
(!imap || of_device_compatible_match(ipar, of_irq_imap_abusers))) {
168191
pr_debug(" -> got it !\n");
169192
return 0;
170193
}

0 commit comments

Comments
 (0)