u64 phys;
        unsigned long va, flags;
        int ret, idx = cfg->cbndx;
+       phys_addr_t addr = 0;
 
        ret = arm_smmu_rpm_get(smmu);
        if (ret < 0)
                dev_err(dev,
                        "iova to phys timed out on %pad. Falling back to software table walk.\n",
                        &iova);
+               arm_smmu_rpm_put(smmu);
                return ops->iova_to_phys(ops, iova);
        }
 
        if (phys & ARM_SMMU_CB_PAR_F) {
                dev_err(dev, "translation fault!\n");
                dev_err(dev, "PAR = 0x%llx\n", phys);
-               return 0;
+               goto out;
        }
 
+       addr = (phys & GENMASK_ULL(39, 12)) | (iova & 0xfff);
+out:
        arm_smmu_rpm_put(smmu);
 
-       return (phys & GENMASK_ULL(39, 12)) | (iova & 0xfff);
+       return addr;
 }
 
 static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain,