diff options
author | Robin Murphy <robin.murphy@arm.com> | 2021-04-01 14:56:26 +0100 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2021-04-16 17:20:45 +0200 |
commit | 2d471b20c55e13c98d1dba413bf2de618e89cdac (patch) | |
tree | fe16cf7ce737c7c60d0cd414199cab0bfb4aea47 /drivers/iommu/iommu.c | |
parent | c0aec6680b6c82fe893a546e322e1130cd5cf21e (diff) | |
download | linux-stable-2d471b20c55e13c98d1dba413bf2de618e89cdac.tar.gz linux-stable-2d471b20c55e13c98d1dba413bf2de618e89cdac.tar.bz2 linux-stable-2d471b20c55e13c98d1dba413bf2de618e89cdac.zip |
iommu: Streamline registration interface
Rather than have separate opaque setter functions that are easy to
overlook and lead to repetitive boilerplate in drivers, let's pass the
relevant initialisation parameters directly to iommu_device_register().
Acked-by: Will Deacon <will@kernel.org>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/ab001b87c533b6f4db71eb90db6f888953986c36.1617285386.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu/iommu.c')
-rw-r--r-- | drivers/iommu/iommu.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index c4ad9c644802..808ab70d5df5 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -142,8 +142,25 @@ static int __init iommu_subsys_init(void) } subsys_initcall(iommu_subsys_init); -int iommu_device_register(struct iommu_device *iommu) +/** + * iommu_device_register() - Register an IOMMU hardware instance + * @iommu: IOMMU handle for the instance + * @ops: IOMMU ops to associate with the instance + * @hwdev: (optional) actual instance device, used for fwnode lookup + * + * Return: 0 on success, or an error. + */ +int iommu_device_register(struct iommu_device *iommu, + const struct iommu_ops *ops, struct device *hwdev) { + /* We need to be able to take module references appropriately */ + if (WARN_ON(is_module_address((unsigned long)ops) && !ops->owner)) + return -EINVAL; + + iommu->ops = ops; + if (hwdev) + iommu->fwnode = hwdev->fwnode; + spin_lock(&iommu_device_lock); list_add_tail(&iommu->list, &iommu_device_list); spin_unlock(&iommu_device_lock); |