diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-12-20 14:04:52 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-12-20 14:04:51 -0800 |
| commit | 47f15848c33280bbe2545d01fcebcf33c3f46d31 (patch) | |
| tree | 59f3c131e1323d6cefcc64fbfe0979f1ceed6ec5 | |
| parent | b34026a22050f4dbddaa408029abb9ee60430e21 (diff) | |
| parent | 7c2a73d37ad115b39d203cf6fce32370a991266e (diff) | |
Merge "msm: sde: correct rotator unload sequence upon error"
| -rw-r--r-- | drivers/media/platform/msm/sde/rotator/sde_rotator_core.c | 2 | ||||
| -rw-r--r-- | drivers/media/platform/msm/sde/rotator/sde_rotator_smmu.c | 55 |
2 files changed, 38 insertions, 19 deletions
diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_core.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_core.c index 7015a089aa6f..4e695fc774f6 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_core.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_core.c @@ -2415,7 +2415,7 @@ static int sde_rotator_register_clk(struct platform_device *pdev, static void sde_rotator_unregister_clk(struct sde_rot_mgr *mgr) { - kfree(mgr->rot_clk); + devm_kfree(mgr->device, mgr->rot_clk); mgr->rot_clk = NULL; mgr->num_rot_clk = 0; } diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_smmu.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_smmu.c index c11c4b61d832..da9845e35fde 100644 --- a/drivers/media/platform/msm/sde/rotator/sde_rotator_smmu.c +++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_smmu.c @@ -214,10 +214,9 @@ static int sde_smmu_attach(struct sde_rot_data_type *mdata) SDEROT_DBG("iommu v2 domain[%i] attached\n", i); } } else { - SDEROT_ERR( + SDEROT_DBG( "iommu device not attached for domain[%d]\n", i); - return -ENODEV; } } return 0; @@ -492,11 +491,13 @@ int sde_smmu_probe(struct platform_device *pdev) mp->num_vreg = 1; } - rc = sde_rot_config_vreg(&pdev->dev, mp->vreg_config, - mp->num_vreg, true); - if (rc) { - SDEROT_ERR("vreg config failed rc=%d\n", rc); - return rc; + if (mp->vreg_config) { + rc = sde_rot_config_vreg(&pdev->dev, mp->vreg_config, + mp->num_vreg, true); + if (rc) { + SDEROT_ERR("vreg config failed rc=%d\n", rc); + goto release_vreg; + } } rc = sde_smmu_clk_register(pdev, mp); @@ -504,18 +505,16 @@ int sde_smmu_probe(struct platform_device *pdev) SDEROT_ERR( "smmu clk register failed for domain[%d] with err:%d\n", smmu_domain.domain, rc); - sde_rot_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg, - false); - return rc; + goto disable_vreg; } snprintf(name, MAX_CLIENT_NAME_LEN, "smmu:%u", smmu_domain.domain); sde_smmu->reg_bus_clt = sde_reg_bus_vote_client_create(name); if (IS_ERR_OR_NULL(sde_smmu->reg_bus_clt)) { SDEROT_ERR("mdss bus client register failed\n"); - sde_rot_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg, - false); - return PTR_ERR(sde_smmu->reg_bus_clt); + rc = PTR_ERR(sde_smmu->reg_bus_clt); + sde_smmu->reg_bus_clt = NULL; + goto unregister_clk; } rc = sde_smmu_enable_power(sde_smmu, true); @@ -531,6 +530,7 @@ int sde_smmu_probe(struct platform_device *pdev) SDEROT_ERR("iommu create mapping failed for domain[%d]\n", smmu_domain.domain); rc = PTR_ERR(sde_smmu->mmu_mapping); + sde_smmu->mmu_mapping = NULL; goto disable_power; } @@ -558,13 +558,20 @@ int sde_smmu_probe(struct platform_device *pdev) release_mapping: arm_iommu_release_mapping(sde_smmu->mmu_mapping); + sde_smmu->mmu_mapping = NULL; disable_power: sde_smmu_enable_power(sde_smmu, false); bus_client_destroy: sde_reg_bus_vote_client_destroy(sde_smmu->reg_bus_clt); sde_smmu->reg_bus_clt = NULL; - sde_rot_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg, - false); +unregister_clk: +disable_vreg: + sde_rot_config_vreg(&pdev->dev, sde_smmu->mp.vreg_config, + sde_smmu->mp.num_vreg, false); +release_vreg: + devm_kfree(&pdev->dev, sde_smmu->mp.vreg_config); + sde_smmu->mp.vreg_config = NULL; + sde_smmu->mp.num_vreg = 0; return rc; } @@ -575,9 +582,21 @@ int sde_smmu_remove(struct platform_device *pdev) for (i = 0; i < SDE_IOMMU_MAX_DOMAIN; i++) { sde_smmu = sde_smmu_get_cb(i); - if (sde_smmu && sde_smmu->dev && - (sde_smmu->dev == &pdev->dev)) - arm_iommu_release_mapping(sde_smmu->mmu_mapping); + if (!sde_smmu || !sde_smmu->dev || + (sde_smmu->dev != &pdev->dev)) + continue; + + sde_smmu->dev = NULL; + arm_iommu_release_mapping(sde_smmu->mmu_mapping); + sde_smmu->mmu_mapping = NULL; + sde_smmu_enable_power(sde_smmu, false); + sde_reg_bus_vote_client_destroy(sde_smmu->reg_bus_clt); + sde_smmu->reg_bus_clt = NULL; + sde_rot_config_vreg(&pdev->dev, sde_smmu->mp.vreg_config, + sde_smmu->mp.num_vreg, false); + devm_kfree(&pdev->dev, sde_smmu->mp.vreg_config); + sde_smmu->mp.vreg_config = NULL; + sde_smmu->mp.num_vreg = 0; } return 0; } |
