Commit aff008ad authored by Guenter Roeck's avatar Guenter Roeck Committed by Greg Kroah-Hartman

platform_get_irq: Revert to platform_get_resource if of_irq_get fails

Commits 9ec36caf (of/irq: do irq resolution in platform_get_irq)
and ad69674e (of/irq: do irq resolution in platform_get_irq_byname)
change the semantics of platform_get_irq and platform_get_irq_byname
to always rely on devicetree information if devicetree is enabled
and if a devicetree node is attached to the device. The functions
now return an error if the devicetree data does not include interrupt
information, even if the information is available as platform resource
data.

This causes mfd client drivers to fail if the interrupt number is
passed via platform resources. Therefore, if of_irq_get fails, try
platform_get_resource as method of last resort. This restores the
original functionality for drivers depending on platform resources
to get irq information.

Cc: Russell King <linux@arm.linux.org.uk>
Cc: Tony Lindgren <tony@atomide.com>
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Acked-by: default avatarRob Herring <robh@kernel.org>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent cd3de83f
...@@ -89,8 +89,13 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) ...@@ -89,8 +89,13 @@ int platform_get_irq(struct platform_device *dev, unsigned int num)
return dev->archdata.irqs[num]; return dev->archdata.irqs[num];
#else #else
struct resource *r; struct resource *r;
if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) {
return of_irq_get(dev->dev.of_node, num); int ret;
ret = of_irq_get(dev->dev.of_node, num);
if (ret >= 0 || ret == -EPROBE_DEFER)
return ret;
}
r = platform_get_resource(dev, IORESOURCE_IRQ, num); r = platform_get_resource(dev, IORESOURCE_IRQ, num);
...@@ -133,8 +138,13 @@ int platform_get_irq_byname(struct platform_device *dev, const char *name) ...@@ -133,8 +138,13 @@ int platform_get_irq_byname(struct platform_device *dev, const char *name)
{ {
struct resource *r; struct resource *r;
if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) {
return of_irq_get_byname(dev->dev.of_node, name); int ret;
ret = of_irq_get_byname(dev->dev.of_node, name);
if (ret >= 0 || ret == -EPROBE_DEFER)
return ret;
}
r = platform_get_resource_byname(dev, IORESOURCE_IRQ, name); r = platform_get_resource_byname(dev, IORESOURCE_IRQ, name);
return r ? r->start : -ENXIO; return r ? r->start : -ENXIO;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment