diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index bfbe0726cbc8..f6720d0c4249 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -1214,6 +1214,28 @@ bool rockchip_iommu_is_enabled(struct device *dev) } EXPORT_SYMBOL(rockchip_iommu_is_enabled); +int rockchip_iommu_force_reset(struct device *dev) +{ + struct rk_iommu *iommu; + int ret; + + iommu = rk_iommu_from_dev(dev); + if (!iommu) + return -ENODEV; + + ret = rk_iommu_enable_stall(iommu); + if (ret) + return ret; + + ret = rk_iommu_force_reset(iommu); + + rk_iommu_disable_stall(iommu); + + return ret; + +} +EXPORT_SYMBOL(rockchip_iommu_force_reset); + static void rk_iommu_detach_device(struct iommu_domain *domain, struct device *dev) { diff --git a/include/soc/rockchip/rockchip_iommu.h b/include/soc/rockchip/rockchip_iommu.h index 10a5d62ae35d..28af038a8e9b 100644 --- a/include/soc/rockchip/rockchip_iommu.h +++ b/include/soc/rockchip/rockchip_iommu.h @@ -15,6 +15,7 @@ void __iomem *rockchip_get_iommu_base(struct device *master_dev, int idx); bool rockchip_iommu_is_enabled(struct device *dev); void rockchip_iommu_mask_irq(struct device *dev); void rockchip_iommu_unmask_irq(struct device *dev); +int rockchip_iommu_force_reset(struct device *dev); #else static inline int rockchip_iommu_enable(struct device *dev) { @@ -42,6 +43,10 @@ static inline void rockchip_iommu_mask_irq(struct device *dev) static inline void rockchip_iommu_unmask_irq(struct device *dev) { } +static inline int rockchip_iommu_force_reset(struct device *dev) +{ + return -ENODEV; +} #endif #endif