Use platform_get_irq_optional() to be able to handle potential -EPROBE_DEFER and other errors. Move it earlier to avoid having to call kfree() on the global array.
Signed-off-by: Rosen Penev <[email protected]> --- drivers/tty/hvc/hvc_opal.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/tty/hvc/hvc_opal.c b/drivers/tty/hvc/hvc_opal.c index 402da9e7c534..fb9a566ca213 100644 --- a/drivers/tty/hvc/hvc_opal.c +++ b/drivers/tty/hvc/hvc_opal.c @@ -13,7 +13,6 @@ #include <linux/slab.h> #include <linux/console.h> #include <linux/of.h> -#include <linux/of_irq.h> #include <linux/platform_device.h> #include <linux/export.h> #include <linux/interrupt.h> @@ -157,8 +156,9 @@ static int hvc_opal_probe(struct platform_device *dev) struct hvc_struct *hp; struct hvc_opal_priv *pv; hv_protocol_t proto; - unsigned int termno, irq, boot = 0; + unsigned int termno, boot = 0; const __be32 *reg; + int irq; if (of_device_is_compatible(dev->dev.of_node, "ibm,opal-console-raw")) { proto = HV_PROTOCOL_RAW; @@ -176,6 +176,10 @@ static int hvc_opal_probe(struct platform_device *dev) reg = of_get_property(dev->dev.of_node, "reg", NULL); termno = reg ? be32_to_cpup(reg) : 0; + irq = platform_get_irq_optional(dev, 0); + if (irq == -EPROBE_DEFER) + return irq; + /* Is it our boot one ? */ if (hvc_opal_privs[termno] == &hvc_opal_boot_priv) { pv = hvc_opal_privs[termno]; @@ -209,8 +213,7 @@ static int hvc_opal_probe(struct platform_device *dev) dev->dev.of_node, boot ? " (boot console)" : ""); - irq = irq_of_parse_and_map(dev->dev.of_node, 0); - if (!irq) { + if (irq < 0) { pr_info("hvc%d: No interrupts property, using OPAL event\n", termno); irq = opal_event_request(ilog2(OPAL_EVENT_CONSOLE_INPUT)); -- 2.55.0
