From acb5e395f47c7e8a625e998900c1e336a44c93c6 Mon Sep 17 00:00:00 2001 From: Jung Zhao Date: Mon, 20 Mar 2017 11:23:29 +0800 Subject: [PATCH] iommu/rockchip: add multi irq support there are two irq in vpu_mmu on 3368 platform. Change-Id: I81d869c1ee536e31334a401a2ddb0e7f2226d4b2 Signed-off-by: Jung Zhao --- drivers/iommu/rockchip-iommu.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 60c96b570257..82ba73d74567 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -91,7 +91,8 @@ struct rk_iommu { struct device *dev; void __iomem **bases; int num_mmu; - int irq; + int *irq; + int num_irq; bool reset_disabled; /* isp iommu reset operation would failed */ struct list_head node; /* entry in rk_iommu_domain.iommus */ struct iommu_domain *domain; /* domain to which iommu is attached */ @@ -863,10 +864,12 @@ static int rk_iommu_attach_device(struct iommu_domain *domain, iommu->domain = domain; - ret = devm_request_irq(iommu->dev, iommu->irq, rk_iommu_irq, + for (i = 0; i < iommu->num_irq; i++) { + ret = devm_request_irq(iommu->dev, iommu->irq[i], rk_iommu_irq, IRQF_SHARED, dev_name(dev), iommu); - if (ret) - return ret; + if (ret) + return ret; + } for (i = 0; i < iommu->num_mmu; i++) { rk_iommu_write(iommu->bases[i], RK_MMU_DTE_ADDR, @@ -915,7 +918,9 @@ static void rk_iommu_detach_device(struct iommu_domain *domain, } rk_iommu_disable_stall(iommu); - devm_free_irq(iommu->dev, iommu->irq, iommu); + for (i = 0; i < iommu->num_irq; i++) { + devm_free_irq(iommu->dev, iommu->irq[i], iommu); + } iommu->domain = NULL; @@ -1185,10 +1190,20 @@ static int rk_iommu_probe(struct platform_device *pdev) if (iommu->num_mmu == 0) return PTR_ERR(iommu->bases[0]); - iommu->irq = platform_get_irq(pdev, 0); - if (iommu->irq < 0) { - dev_err(dev, "Failed to get IRQ, %d\n", iommu->irq); - return -ENXIO; + while (platform_get_irq(pdev, iommu->num_irq) >= 0) + iommu->num_irq++; + + iommu->irq = devm_kzalloc(dev, sizeof(*iommu->irq) * iommu->num_irq, + GFP_KERNEL); + if (!iommu->irq) + return -ENOMEM; + + for (i = 0; i < iommu->num_irq; i++) { + iommu->irq[i] = platform_get_irq(pdev, i); + if (iommu->irq[i] < 0) { + dev_err(dev, "Failed to get IRQ, %d\n", iommu->irq[i]); + return -ENXIO; + } } iommu->reset_disabled = device_property_read_bool(dev, -- 2.34.1