Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03f732f8 authored by Simon Xue's avatar Simon Xue Committed by Joerg Roedel
Browse files

iommu/rockchip: add multi irqs support



RK3368 vpu mmu have two irqs, this patch support multi irqs

Signed-off-by: default avatarSimon Xue <xxm@rock-chips.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 07218a4f
Loading
Loading
Loading
Loading
+26 −9
Original line number Original line Diff line number Diff line
@@ -90,7 +90,8 @@ struct rk_iommu {
	struct device *dev;
	struct device *dev;
	void __iomem **bases;
	void __iomem **bases;
	int num_mmu;
	int num_mmu;
	int irq;
	int *irq;
	int num_irq;
	struct iommu_device iommu;
	struct iommu_device iommu;
	struct list_head node; /* entry in rk_iommu_domain.iommus */
	struct list_head node; /* entry in rk_iommu_domain.iommus */
	struct iommu_domain *domain; /* domain to which iommu is attached */
	struct iommu_domain *domain; /* domain to which iommu is attached */
@@ -825,10 +826,12 @@ static int rk_iommu_attach_device(struct iommu_domain *domain,


	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);
				       IRQF_SHARED, dev_name(dev), iommu);
		if (ret)
		if (ret)
			return ret;
			return ret;
	}


	for (i = 0; i < iommu->num_mmu; i++) {
	for (i = 0; i < iommu->num_mmu; i++) {
		rk_iommu_write(iommu->bases[i], RK_MMU_DTE_ADDR,
		rk_iommu_write(iommu->bases[i], RK_MMU_DTE_ADDR,
@@ -878,7 +881,8 @@ static void rk_iommu_detach_device(struct iommu_domain *domain,
	}
	}
	rk_iommu_disable_stall(iommu);
	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;
	iommu->domain = NULL;


@@ -1157,10 +1161,23 @@ static int rk_iommu_probe(struct platform_device *pdev)
	if (iommu->num_mmu == 0)
	if (iommu->num_mmu == 0)
		return PTR_ERR(iommu->bases[0]);
		return PTR_ERR(iommu->bases[0]);


	iommu->irq = platform_get_irq(pdev, 0);
	iommu->num_irq = platform_irq_count(pdev);
	if (iommu->irq < 0) {
	if (iommu->num_irq < 0)
		dev_err(dev, "Failed to get IRQ, %d\n", iommu->irq);
		return iommu->num_irq;
	if (iommu->num_irq == 0)
		return -ENXIO;
		return -ENXIO;

	iommu->irq = devm_kcalloc(dev, iommu->num_irq, sizeof(*iommu->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;
		}
	}
	}


	err = iommu_device_sysfs_add(&iommu->iommu, dev, NULL, dev_name(dev));
	err = iommu_device_sysfs_add(&iommu->iommu, dev, NULL, dev_name(dev));