Hi Robin,

On 01/17/2018 08:18 PM, Robin Murphy wrote:

@@ -91,7 +92,6 @@ struct rk_iommu {
      void __iomem **bases;
      int num_mmu;
      int *irq;

Nit: irq seems to be redundant now as well.
oops, will fix it.

-    int num_irq;
      bool reset_disabled;
      struct iommu_device iommu;
      struct list_head node; /* entry in rk_iommu_domain.iommus */
@@ -830,13 +830,6 @@ static int rk_iommu_attach_device(struct
iommu_domain *domain,
      iommu->domain = domain;
-    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;
-    }
-
      for (i = 0; i < iommu->num_mmu; i++) {
          rk_iommu_write(iommu->bases[i], RK_MMU_DTE_ADDR,
                     rk_domain->dt_dma);
@@ -885,9 +878,6 @@ static void rk_iommu_detach_device(struct
iommu_domain *domain,
      }
      rk_iommu_disable_stall(iommu);
-    for (i = 0; i < iommu->num_irq; i++)
-        devm_free_irq(iommu->dev, iommu->irq[i], iommu);
-
      iommu->domain = NULL;
      dev_dbg(dev, "Detached from iommu domain\n");
@@ -1138,7 +1128,7 @@ static int rk_iommu_probe(struct platform_device
*pdev)
      struct rk_iommu *iommu;
      struct resource *res;
      int num_res = pdev->num_resources;
-    int err, i;
+    int err, i, irq, num_irq;
      iommu = devm_kzalloc(dev, sizeof(*iommu), GFP_KERNEL);
      if (!iommu)
@@ -1165,23 +1155,17 @@ static int rk_iommu_probe(struct
platform_device *pdev)
      if (iommu->num_mmu == 0)
          return PTR_ERR(iommu->bases[0]);
-    iommu->num_irq = platform_irq_count(pdev);
-    if (iommu->num_irq < 0)
-        return iommu->num_irq;
-    if (iommu->num_irq == 0)
-        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]);
+    num_irq = of_irq_count(dev->of_node);

To follow up on the other reply, I'm not sure you really need to count
the IRQs beforehand at all - you're going to be looping through
platform_get_irq() and handling errors anyway, so you may as well just
start at 0 and keep going until -ENOENT (or use platform_get_resource()
to double-check whether an index should be valid, as we do in arm_smmu).
ok, will do that.

Otherwise, it looks like everything that the IRQ handler needs in the
iommu struct (dev, num_mmu and bases) is already initialised by this
point, so we should be OK with respect to races.
ok.

Robin.


_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to