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

Commit d0f6f583 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

iommu: Remove iommu_register_instance interface



And also move its remaining functionality to
iommu_device_register() and 'struct iommu_device'.

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <frowand.list@gmail.com>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: devicetree@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent d2c302b6
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -2702,8 +2702,6 @@ static int arm_smmu_device_probe(struct platform_device *pdev)

	ret = iommu_device_register(&smmu->iommu);

	iommu_register_instance(dev->fwnode, &arm_smmu_ops);

#ifdef CONFIG_PCI
	if (pci_bus_type.iommu_ops != &arm_smmu_ops) {
		pci_request_acs();
+0 −1
Original line number Diff line number Diff line
@@ -2121,7 +2121,6 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
		return err;
	}

	iommu_register_instance(dev->fwnode, &arm_smmu_ops);
	platform_set_drvdata(pdev, smmu);
	arm_smmu_device_reset(smmu);

+0 −2
Original line number Diff line number Diff line
@@ -642,8 +642,6 @@ static int __init exynos_sysmmu_probe(struct platform_device *pdev)

	pm_runtime_enable(dev);

	of_iommu_set_ops(dev->of_node, &exynos_iommu_ops);

	return 0;
}

+6 −31
Original line number Diff line number Diff line
@@ -1658,43 +1658,18 @@ int iommu_request_dm_for_dev(struct device *dev)
	return ret;
}

struct iommu_instance {
	struct list_head list;
	struct fwnode_handle *fwnode;
	const struct iommu_ops *ops;
};
static LIST_HEAD(iommu_instance_list);
static DEFINE_SPINLOCK(iommu_instance_lock);

void iommu_register_instance(struct fwnode_handle *fwnode,
			     const struct iommu_ops *ops)
{
	struct iommu_instance *iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);

	if (WARN_ON(!iommu))
		return;

	of_node_get(to_of_node(fwnode));
	INIT_LIST_HEAD(&iommu->list);
	iommu->fwnode = fwnode;
	iommu->ops = ops;
	spin_lock(&iommu_instance_lock);
	list_add_tail(&iommu->list, &iommu_instance_list);
	spin_unlock(&iommu_instance_lock);
}

const struct iommu_ops *iommu_ops_from_fwnode(struct fwnode_handle *fwnode)
{
	struct iommu_instance *instance;
	const struct iommu_ops *ops = NULL;
	struct iommu_device *iommu;

	spin_lock(&iommu_instance_lock);
	list_for_each_entry(instance, &iommu_instance_list, list)
		if (instance->fwnode == fwnode) {
			ops = instance->ops;
	spin_lock(&iommu_device_lock);
	list_for_each_entry(iommu, &iommu_device_list, list)
		if (iommu->fwnode == fwnode) {
			ops = iommu->ops;
			break;
		}
	spin_unlock(&iommu_instance_lock);
	spin_unlock(&iommu_device_lock);
	return ops;
}

+0 −2
Original line number Diff line number Diff line
@@ -810,8 +810,6 @@ static int msm_iommu_probe(struct platform_device *pdev)
		goto fail;
	}

	of_iommu_set_ops(pdev->dev.of_node, &msm_iommu_ops);

	pr_info("device mapped at %p, irq %d with %d ctx banks\n",
		iommu->base, iommu->irq, iommu->ncb);

Loading