| From foo@baz Thu Mar 22 14:57:32 CET 2018 |
| From: Suman Anna <s-anna@ti.com> |
| Date: Wed, 12 Apr 2017 00:21:26 -0500 |
| Subject: iommu/omap: Register driver before setting IOMMU ops |
| |
| From: Suman Anna <s-anna@ti.com> |
| |
| |
| [ Upstream commit abaa7e5b054aae567861628b74dbc7fbf8ed79e8 ] |
| |
| Move the registration of the OMAP IOMMU platform driver before |
| setting the IOMMU callbacks on the platform bus. This causes |
| the IOMMU devices to be probed first before the .add_device() |
| callback is invoked for all registered devices, and allows |
| the iommu_group support to be added to the OMAP IOMMU driver. |
| |
| While at this, also check for the return status from bus_set_iommu. |
| |
| Signed-off-by: Suman Anna <s-anna@ti.com> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iommu/omap-iommu.c | 21 ++++++++++++++++++--- |
| 1 file changed, 18 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/iommu/omap-iommu.c |
| +++ b/drivers/iommu/omap-iommu.c |
| @@ -1295,6 +1295,7 @@ static int __init omap_iommu_init(void) |
| const unsigned long flags = SLAB_HWCACHE_ALIGN; |
| size_t align = 1 << 10; /* L2 pagetable alignement */ |
| struct device_node *np; |
| + int ret; |
| |
| np = of_find_matching_node(NULL, omap_iommu_of_match); |
| if (!np) |
| @@ -1308,11 +1309,25 @@ static int __init omap_iommu_init(void) |
| return -ENOMEM; |
| iopte_cachep = p; |
| |
| - bus_set_iommu(&platform_bus_type, &omap_iommu_ops); |
| - |
| omap_iommu_debugfs_init(); |
| |
| - return platform_driver_register(&omap_iommu_driver); |
| + ret = platform_driver_register(&omap_iommu_driver); |
| + if (ret) { |
| + pr_err("%s: failed to register driver\n", __func__); |
| + goto fail_driver; |
| + } |
| + |
| + ret = bus_set_iommu(&platform_bus_type, &omap_iommu_ops); |
| + if (ret) |
| + goto fail_bus; |
| + |
| + return 0; |
| + |
| +fail_bus: |
| + platform_driver_unregister(&omap_iommu_driver); |
| +fail_driver: |
| + kmem_cache_destroy(iopte_cachep); |
| + return ret; |
| } |
| subsys_initcall(omap_iommu_init); |
| /* must be ready before omap3isp is probed */ |