From dd0104905fa28e89c98512f71865f5b99c3ac280 Mon Sep 17 00:00:00 2001 From: Lin Ruizhe Date: Tue, 12 Dec 2023 09:26:34 +0800 Subject: [PATCH] amba-pl011: Fix no irq issue due to no IRQ domain found hulk inclusion category: bugfix bugzilla: 176552 https://gitee.com/openeuler/kernel/issues/I4DDEL ------------------------------------------------- If pl011 interrupt is connected to MBIGEN interrupt controller, because the mbigen initialization is too late, which will lead to no IRQ due to no IRQ domain found, logs is shown below, "irq: no irq domain found for uart0 !" When dev->irq[0] is zero, try to get IRQ by of_irq_get() again, and return -EPROBE_DEFER if the IRQ domain is not yet created. Using deferred probing mechanism to fix the issue. Signed-off-by: Kefeng Wang Signed-off-by: Lin ruizhe Signed-off-by: He Ying Signed-off-by: Chen Jun Signed-off-by: Zheng Zengkai conflicts: drivers/tty/serial/amba-pl011.c Signed-off-by: Lin Yujun --- drivers/tty/serial/amba-pl011.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 3dc9b0fcab1c..648f99d4774c 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -2815,10 +2815,20 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) uap->vendor = vendor; uap->fifosize = vendor->get_fifosize(dev); uap->port.iotype = vendor->access_32b ? UPIO_MEM32 : UPIO_MEM; - uap->port.irq = dev->irq[0]; uap->port.ops = &amba_pl011_pops; uap->port.rs485_config = pl011_rs485_config; uap->port.rs485_supported = pl011_rs485_supported; + + /* if no irq domain found, irq number is 0, try again */ + if (!dev->irq[0] && dev->dev.of_node) { + ret = of_irq_get(dev->dev.of_node, 0); + if (ret < 0) + return ret; + dev->irq[0] = ret; + } + + uap->port.irq = dev->irq[0]; + snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev)); if (device_property_read_u32(&dev->dev, "reg-io-width", &val) == 0) { -- Gitee