diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c index 33077ef22932..54a943dd98ad 100644 --- a/drivers/media/platform/rockchip/cif/hw.c +++ b/drivers/media/platform/rockchip/cif/hw.c @@ -764,17 +764,17 @@ err: static void rkcif_iommu_cleanup(struct rkcif_hw *cif_hw) { - struct iommu_domain *domain; + if (cif_hw->domain) + cif_hw->domain->ops->detach_dev(cif_hw->domain, cif_hw->dev); +} - dev_err(cif_hw->dev, "%s enter\n", __func__); +static void rkcif_iommu_enable(struct rkcif_hw *cif_hw) +{ + if (!cif_hw->domain) + cif_hw->domain = iommu_get_domain_for_dev(cif_hw->dev); - domain = iommu_get_domain_for_dev(cif_hw->dev); - if (domain) { -#ifdef CONFIG_IOMMU_API - domain->ops->detach_dev(domain, cif_hw->dev); - domain->ops->attach_dev(domain, cif_hw->dev); -#endif - } + if (cif_hw->domain) + cif_hw->domain->ops->attach_dev(cif_hw->domain, cif_hw->dev); } static inline bool is_iommu_enable(struct device *dev) @@ -809,6 +809,9 @@ void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu) for (i = 0; i < ARRAY_SIZE(cif_hw->cif_rst); i++) if (cif_hw->cif_rst[i]) reset_control_deassert(cif_hw->cif_rst[i]); + + if (cif_hw->iommu_en && is_rst_iommu) + rkcif_iommu_enable(cif_hw); } static int rkcif_plat_hw_probe(struct platform_device *pdev)