diff --git a/drivers/media/platform/rockchip/isp1/dev.c b/drivers/media/platform/rockchip/isp1/dev.c index 71b1947cab8b..23f69c7373bc 100644 --- a/drivers/media/platform/rockchip/isp1/dev.c +++ b/drivers/media/platform/rockchip/isp1/dev.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -914,6 +915,24 @@ err: return ret; } +static inline bool is_iommu_enable(struct device *dev) +{ + struct device_node *iommu; + + iommu = of_parse_phandle(dev->of_node, "iommus", 0); + if (!iommu) { + dev_info(dev, "no iommu attached, using non-iommu buffers\n"); + return false; + } else if (!of_device_is_available(iommu)) { + dev_info(dev, "iommu is disabled, using non-iommu buffers\n"); + of_node_put(iommu); + return false; + } + of_node_put(iommu); + + return true; +} + static int rkisp1_vs_irq_parse(struct platform_device *pdev) { int ret; @@ -1105,6 +1124,13 @@ static int rkisp1_plat_probe(struct platform_device *pdev) if (ret < 0) goto err_unreg_media_dev; + if (!is_iommu_enable(dev)) { + ret = of_reserved_mem_device_init(dev); + if (ret) + v4l2_warn(v4l2_dev, + "No reserved memory region assign to isp\n"); + } + pm_runtime_enable(&pdev->dev); ret = rkisp1_vs_irq_parse(pdev);