Fix the missing clk_disable_unprepare() before return from v3_pci_probe() in the error handling case. Signed-off-by: Qinglang Miao <miaoqinglang@xxxxxxxxxx> --- drivers/pci/controller/pci-v3-semi.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/pci/controller/pci-v3-semi.c b/drivers/pci/controller/pci-v3-semi.c index 154a53986..e24abc5b4 100644 --- a/drivers/pci/controller/pci-v3-semi.c +++ b/drivers/pci/controller/pci-v3-semi.c @@ -739,8 +739,10 @@ static int v3_pci_probe(struct platform_device *pdev) regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); v3->base = devm_ioremap_resource(dev, regs); - if (IS_ERR(v3->base)) + if (IS_ERR(v3->base)) { + clk_disable_unprepare(clk); return PTR_ERR(v3->base); + } /* * The hardware has a register with the physical base address * of the V3 controller itself, verify that this is the same @@ -754,17 +756,22 @@ static int v3_pci_probe(struct platform_device *pdev) regs = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (resource_size(regs) != SZ_16M) { dev_err(dev, "config mem is not 16MB!\n"); + clk_disable_unprepare(clk); return -EINVAL; } v3->config_mem = regs->start; v3->config_base = devm_ioremap_resource(dev, regs); - if (IS_ERR(v3->config_base)) + if (IS_ERR(v3->config_base)) { + clk_disable_unprepare(clk); return PTR_ERR(v3->config_base); + } /* Get and request error IRQ resource */ irq = platform_get_irq(pdev, 0); - if (irq < 0) + if (irq < 0) { + clk_disable_unprepare(clk); return irq; + } ret = devm_request_irq(dev, irq, v3_irq, 0, "PCIv3 error", v3); @@ -772,6 +779,7 @@ static int v3_pci_probe(struct platform_device *pdev) dev_err(dev, "unable to request PCIv3 error IRQ %d (%d)\n", irq, ret); + clk_disable_unprepare(clk); return ret; } -- 2.23.0