Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28d443c0 authored by Alan Kwong's avatar Alan Kwong Committed by Narendra Muppalla
Browse files

msm: sde: correct rotator unload sequence upon error



This patch corrects rotator driver unload sequence to
release memory with proper deallocator and deallocate smmu
resource in reverse allocation order.

CRs-Fixed: 1096831
Change-Id: Ia067c6969d1f323e4b40f553a786b9af0c4aee47
Signed-off-by: default avatarAlan Kwong <akwong@codeaurora.org>
parent 42db2c99
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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)
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->rot_clk = NULL;
	mgr->num_rot_clk = 0;
	mgr->num_rot_clk = 0;
}
}
+37 −18
Original line number Original line Diff line number Diff line
@@ -214,10 +214,9 @@ static int sde_smmu_attach(struct sde_rot_data_type *mdata)
				SDEROT_DBG("iommu v2 domain[%i] attached\n", i);
				SDEROT_DBG("iommu v2 domain[%i] attached\n", i);
			}
			}
		} else {
		} else {
			SDEROT_ERR(
			SDEROT_DBG(
				"iommu device not attached for domain[%d]\n",
				"iommu device not attached for domain[%d]\n",
				i);
				i);
			return -ENODEV;
		}
		}
	}
	}
	return 0;
	return 0;
@@ -493,11 +492,13 @@ int sde_smmu_probe(struct platform_device *pdev)
		mp->num_vreg = 1;
		mp->num_vreg = 1;
	}
	}


	if (mp->vreg_config) {
		rc = sde_rot_config_vreg(&pdev->dev, mp->vreg_config,
		rc = sde_rot_config_vreg(&pdev->dev, mp->vreg_config,
			mp->num_vreg, true);
			mp->num_vreg, true);
		if (rc) {
		if (rc) {
			SDEROT_ERR("vreg config failed rc=%d\n", rc);
			SDEROT_ERR("vreg config failed rc=%d\n", rc);
		return rc;
			goto release_vreg;
		}
	}
	}


	rc = sde_smmu_clk_register(pdev, mp);
	rc = sde_smmu_clk_register(pdev, mp);
@@ -505,18 +506,16 @@ int sde_smmu_probe(struct platform_device *pdev)
		SDEROT_ERR(
		SDEROT_ERR(
			"smmu clk register failed for domain[%d] with err:%d\n",
			"smmu clk register failed for domain[%d] with err:%d\n",
			smmu_domain.domain, rc);
			smmu_domain.domain, rc);
		sde_rot_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg,
		goto disable_vreg;
			false);
		return rc;
	}
	}


	snprintf(name, MAX_CLIENT_NAME_LEN, "smmu:%u", smmu_domain.domain);
	snprintf(name, MAX_CLIENT_NAME_LEN, "smmu:%u", smmu_domain.domain);
	sde_smmu->reg_bus_clt = sde_reg_bus_vote_client_create(name);
	sde_smmu->reg_bus_clt = sde_reg_bus_vote_client_create(name);
	if (IS_ERR_OR_NULL(sde_smmu->reg_bus_clt)) {
	if (IS_ERR_OR_NULL(sde_smmu->reg_bus_clt)) {
		SDEROT_ERR("mdss bus client register failed\n");
		SDEROT_ERR("mdss bus client register failed\n");
		sde_rot_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg,
		rc = PTR_ERR(sde_smmu->reg_bus_clt);
			false);
		sde_smmu->reg_bus_clt = NULL;
		return PTR_ERR(sde_smmu->reg_bus_clt);
		goto unregister_clk;
	}
	}


	rc = sde_smmu_enable_power(sde_smmu, true);
	rc = sde_smmu_enable_power(sde_smmu, true);
@@ -532,6 +531,7 @@ int sde_smmu_probe(struct platform_device *pdev)
		SDEROT_ERR("iommu create mapping failed for domain[%d]\n",
		SDEROT_ERR("iommu create mapping failed for domain[%d]\n",
			smmu_domain.domain);
			smmu_domain.domain);
		rc = PTR_ERR(sde_smmu->mmu_mapping);
		rc = PTR_ERR(sde_smmu->mmu_mapping);
		sde_smmu->mmu_mapping = NULL;
		goto disable_power;
		goto disable_power;
	}
	}


@@ -566,13 +566,20 @@ int sde_smmu_probe(struct platform_device *pdev)


release_mapping:
release_mapping:
	arm_iommu_release_mapping(sde_smmu->mmu_mapping);
	arm_iommu_release_mapping(sde_smmu->mmu_mapping);
	sde_smmu->mmu_mapping = NULL;
disable_power:
disable_power:
	sde_smmu_enable_power(sde_smmu, false);
	sde_smmu_enable_power(sde_smmu, false);
bus_client_destroy:
bus_client_destroy:
	sde_reg_bus_vote_client_destroy(sde_smmu->reg_bus_clt);
	sde_reg_bus_vote_client_destroy(sde_smmu->reg_bus_clt);
	sde_smmu->reg_bus_clt = NULL;
	sde_smmu->reg_bus_clt = NULL;
	sde_rot_config_vreg(&pdev->dev, mp->vreg_config, mp->num_vreg,
unregister_clk:
			false);
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;
	return rc;
}
}


@@ -583,9 +590,21 @@ int sde_smmu_remove(struct platform_device *pdev)


	for (i = 0; i < SDE_IOMMU_MAX_DOMAIN; i++) {
	for (i = 0; i < SDE_IOMMU_MAX_DOMAIN; i++) {
		sde_smmu = sde_smmu_get_cb(i);
		sde_smmu = sde_smmu_get_cb(i);
		if (sde_smmu && sde_smmu->dev &&
		if (!sde_smmu || !sde_smmu->dev ||
			(sde_smmu->dev == &pdev->dev))
			(sde_smmu->dev != &pdev->dev))
			continue;

		sde_smmu->dev = NULL;
		arm_iommu_release_mapping(sde_smmu->mmu_mapping);
		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;
	return 0;
}
}