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

Commit c4a365c5 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "iommu/arm-smmu: ref count clocks and regulators"

parents b7043833 3e4f2027
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -386,6 +386,8 @@ struct arm_smmu_device {
	unsigned int			num_impl_def_attach_registers;

	struct mutex			atos_lock;
	atomic_t			clock_refs_count;
	atomic_t			regulator_refs_count;
};

struct arm_smmu_cfg {
@@ -699,6 +701,9 @@ static int arm_smmu_disable_regulators(struct arm_smmu_device *smmu)
	if (!smmu->gdsc)
		return 0;

	if (atomic_dec_return(&smmu->regulator_refs_count) > 0)
		return 0;

	arm_smmu_unprepare_clocks(smmu);
	return regulator_disable(smmu->gdsc);
}
@@ -710,6 +715,9 @@ static int arm_smmu_enable_regulators(struct arm_smmu_device *smmu)
	if (!smmu->gdsc)
		return 0;

	if (atomic_inc_return(&smmu->regulator_refs_count) > 1)
		return 0;

	ret = regulator_enable(smmu->gdsc);
	if (ret)
		return ret;
@@ -745,6 +753,9 @@ static int arm_smmu_enable_clocks_atomic(struct arm_smmu_device *smmu)
{
	int i, ret = 0;

	if (atomic_inc_return(&smmu->clock_refs_count) > 1)
		return 0;

	for (i = 0; i < smmu->num_clocks; ++i) {
		ret = clk_enable(smmu->clocks[i]);
		if (ret) {
@@ -761,6 +772,8 @@ static int arm_smmu_enable_clocks_atomic(struct arm_smmu_device *smmu)
static void arm_smmu_disable_clocks_atomic(struct arm_smmu_device *smmu)
{
	int i;
	if (atomic_dec_return(&smmu->clock_refs_count) > 0)
		return;

	for (i = 0; i < smmu->num_clocks; ++i)
		clk_disable(smmu->clocks[i]);