diff options
author | Thierry Reding <treding@nvidia.com> | 2015-02-06 11:44:07 +0100 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2015-02-25 13:42:25 +0100 |
commit | 425061b0f5074c727446b6383d0880f089ede469 (patch) | |
tree | 019835e6bbdc5c7eb52d5c4d09d6b1ea484e3a63 /drivers/iommu/rockchip-iommu.c | |
parent | f938aab2c46c906b41261629982e2a2cda9e819f (diff) | |
download | linux-stable-425061b0f5074c727446b6383d0880f089ede469.tar.gz linux-stable-425061b0f5074c727446b6383d0880f089ede469.tar.bz2 linux-stable-425061b0f5074c727446b6383d0880f089ede469.zip |
iommu/rockchip: Play nice in multi-platform builds
The Rockchip IOMMU driver unconditionally executes code and registers a
struct iommu_ops with the platform bus irrespective of whether it runs
on a Rockchip SoC or not. This causes problems in multi-platform kernels
where drivers for other SoCs will no longer be able to register their
own struct iommu_ops or even try to use a struct iommu_ops for an IOMMU
that obviously isn't there.
The smallest fix I could think of is to check for the existence of any
Rockchip IOMMU devices in the device tree and skip initialization
otherwise.
This fixes a problem on Tegra20 where the DRM driver will try to use the
obviously non-existent Rockchip IOMMU.
Reported-by: Nicolas Chauvet <kwizart@gmail.com>
Cc: Heiko Stuebner <heiko@sntech.de>
Cc: Daniel Kurtz <djkurtz@chromium.org>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu/rockchip-iommu.c')
-rw-r--r-- | drivers/iommu/rockchip-iommu.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 6a8b1ec4a48a..9f74fddcd304 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -1015,8 +1015,15 @@ static struct platform_driver rk_iommu_driver = { static int __init rk_iommu_init(void) { + struct device_node *np; int ret; + np = of_find_matching_node(NULL, rk_iommu_dt_ids); + if (!np) + return 0; + + of_node_put(np); + ret = bus_set_iommu(&platform_bus_type, &rk_iommu_ops); if (ret) return ret; |