[PATCH 2/2] serial: 8250_dw: fall back to poll if there's no interrupt

Jisheng Zhang posted 2 patches 2 years, 6 months ago
There is a newer version of this series
[PATCH 2/2] serial: 8250_dw: fall back to poll if there's no interrupt
Posted by Jisheng Zhang 2 years, 6 months ago
When there's no irq(this can be due to various reasons, for example,
no irq from HW support, or we just want to use poll solution, and so
on), falling back to poll is still better than no support at all.

Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
---
 drivers/tty/serial/8250/8250_dw.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
index 7db51781289e..39db768517eb 100644
--- a/drivers/tty/serial/8250/8250_dw.c
+++ b/drivers/tty/serial/8250/8250_dw.c
@@ -524,8 +524,12 @@ static int dw8250_probe(struct platform_device *pdev)
 		return dev_err_probe(dev, -EINVAL, "no registers defined\n");
 
 	irq = platform_get_irq(pdev, 0);
-	if (irq < 0)
-		return irq;
+	if (irq < 0) {
+		if (irq != -ENXIO)
+			return irq;
+		/* no interrupt -> fall back to polling */
+		irq = 0;
+	}
 
 	spin_lock_init(&p->lock);
 	p->mapbase	= regs->start;
-- 
2.40.1
Re: [PATCH 2/2] serial: 8250_dw: fall back to poll if there's no interrupt
Posted by Andy Shevchenko 2 years, 6 months ago
On Wed, Aug 02, 2023 at 11:05:45PM +0800, Jisheng Zhang wrote:
> When there's no irq(this can be due to various reasons, for example,
> no irq from HW support, or we just want to use poll solution, and so
> on), falling back to poll is still better than no support at all.

...

>  	irq = platform_get_irq(pdev, 0);

You will still have an error message. Perhaps you need to replace it with

	irq = platform_get_irq_optional(pdev, 0);

> -	if (irq < 0)
> -		return irq;
> +	if (irq < 0) {
> +		if (irq != -ENXIO)
> +			return irq;
> +		/* no interrupt -> fall back to polling */
> +		irq = 0;
> +	}

This can be slightly modified:

	/* no interrupt -> fall back to polling */
	if (irq == -ENXIO)
		irq = 0;
	if (irq < 0)
		return irq;

-- 
With Best Regards,
Andy Shevchenko