diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index ff3b441d8605..fdc7a48cca24 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -1217,21 +1217,32 @@ static int rk_iommu_probe(struct platform_device *pdev) "rockchip,skip-mmu-read"); iommu->num_clocks = ARRAY_SIZE(rk_iommu_clocks); + + /* RK1808 isp iommu has an extra sclk */ + err = of_property_match_string(dev->of_node, "clock-names", "sclk"); + if (err >= 0) + iommu->num_clocks++; + iommu->clocks = devm_kcalloc(iommu->dev, iommu->num_clocks, sizeof(*iommu->clocks), GFP_KERNEL); if (!iommu->clocks) return -ENOMEM; for (i = 0; i < iommu->num_clocks; ++i) { - err = of_property_match_string(dev->of_node, "clock-names", - rk_iommu_clocks[i]); - if (err < 0) { - if (!strcmp(rk_iommu_clocks[i], "iface")) { - iommu->clocks[i].id = "hclk"; - dev_warn(dev, "iommu hclk need to update to iface\n"); - } + if (i == 2) { + iommu->clocks[i].id = "sclk"; } else { - iommu->clocks[i].id = rk_iommu_clocks[i]; + err = of_property_match_string(dev->of_node, + "clock-names", + rk_iommu_clocks[i]); + if (err < 0) { + if (!strcmp(rk_iommu_clocks[i], "iface")) { + iommu->clocks[i].id = "hclk"; + dev_warn(dev, "iommu hclk need to update to iface\n"); + } + } else { + iommu->clocks[i].id = rk_iommu_clocks[i]; + } } } /*