mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
of/irq: Fix bug in interrupt parsing refactor.
Commit 2361613206, "of/irq: Refactor interrupt-map parsing" introduced
a bug. The irq parsing will fail for some nodes that don't have a reg
property. It is fixed by deferring the check for reg until it is
actually needed. Also adjust the testcase data to catch the bug.
Signed-off-by: Grant Likely <[email protected]>
Tested-by: Stephen Warren <[email protected]>
Tested-by: Ming Lei <[email protected]>
Tested-by: Stephen Warren <[email protected]>
Cc: Rob Herring <[email protected]>
This commit is contained in:
parent
0976c946a6
commit
78119fd106
2 changed files with 14 additions and 13 deletions
|
|
@ -147,18 +147,9 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
|||
|
||||
pr_debug(" -> addrsize=%d\n", addrsize);
|
||||
|
||||
/* If we were passed no "reg" property and we attempt to parse
|
||||
* an interrupt-map, then #address-cells must be 0.
|
||||
* Fail if it's not.
|
||||
*/
|
||||
if (addr == NULL && addrsize != 0) {
|
||||
pr_debug(" -> no reg passed in when needed !\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Precalculate the match array - this simplifies match loop */
|
||||
for (i = 0; i < addrsize; i++)
|
||||
initial_match_array[i] = addr[i];
|
||||
initial_match_array[i] = addr ? addr[i] : 0;
|
||||
for (i = 0; i < intsize; i++)
|
||||
initial_match_array[addrsize + i] = cpu_to_be32(out_irq->args[i]);
|
||||
|
||||
|
|
@ -174,6 +165,15 @@ int of_irq_parse_raw(const __be32 *addr, struct of_phandle_args *out_irq)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* interrupt-map parsing does not work without a reg
|
||||
* property when #address-cells != 0
|
||||
*/
|
||||
if (addrsize && !addr) {
|
||||
pr_debug(" -> no reg passed in when needed !\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Now look for an interrupt-map */
|
||||
imap = of_get_property(ipar, "interrupt-map", &imaplen);
|
||||
/* No interrupt map, check for an interrupt parent */
|
||||
|
|
|
|||
Loading…
Reference in a new issue