diff options
author | Rob Herring <robh@kernel.org> | 2017-07-21 16:56:12 -0500 |
---|---|---|
committer | Rob Herring <robh@kernel.org> | 2017-08-01 12:24:06 -0500 |
commit | b47fe22d82e39551a5049f4bd02eb71f7d497762 (patch) | |
tree | fb3c8df039c71b6ee78b06537d1279f5eb2f322e /drivers/of/irq.c | |
parent | bc575064d688c8933a6ca51429bea9bc63628d3b (diff) |
of/irq: use of_property_read_u32_index to parse interrupts property
Convert the interrupts property parsing to use the OF property API
instead of open coding the parsing of the raw property value. This saves
a number of LoC, and the result is easier to read.
Signed-off-by: Rob Herring <robh@kernel.org>
Diffstat (limited to 'drivers/of/irq.c')
-rw-r--r-- | drivers/of/irq.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/drivers/of/irq.c b/drivers/of/irq.c index abbd252fe25b..aa2a60c8868e 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c @@ -292,8 +292,8 @@ EXPORT_SYMBOL_GPL(of_irq_parse_raw); int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_args *out_irq) { struct device_node *p; - const __be32 *intspec, *addr; - u32 intsize, intlen; + const __be32 *addr; + u32 intsize; int i, res; pr_debug("of_irq_parse_one: dev=%pOF, index=%d\n", device, index); @@ -311,15 +311,6 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar if (!res) return of_irq_parse_raw(addr, out_irq); - /* Get the interrupts property */ - intspec = of_get_property(device, "interrupts", &intlen); - if (intspec == NULL) - return -EINVAL; - - intlen /= sizeof(*intspec); - - pr_debug(" intspec=%d intlen=%d\n", be32_to_cpup(intspec), intlen); - /* Look for the interrupt parent. */ p = of_irq_find_parent(device); if (p == NULL) @@ -331,20 +322,21 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar goto out; } - pr_debug(" intsize=%d intlen=%d\n", intsize, intlen); - - /* Check index */ - if ((index + 1) * intsize > intlen) { - res = -EINVAL; - goto out; - } + pr_debug(" parent=%pOF, intsize=%d\n", p, intsize); /* Copy intspec into irq structure */ - intspec += index * intsize; out_irq->np = p; out_irq->args_count = intsize; - for (i = 0; i < intsize; i++) - out_irq->args[i] = be32_to_cpup(intspec++); + for (i = 0; i < intsize; i++) { + res = of_property_read_u32_index(device, "interrupts", + (index * intsize) + i, + out_irq->args + i); + if (res) + goto out; + } + + pr_debug(" intspec=%d\n", *out_irq->args); + /* Check if there are any interrupt-map translations to process */ res = of_irq_parse_raw(addr, out_irq); |