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

Commit 41aac78d authored by Dinesh K Garg's avatar Dinesh K Garg
Browse files

msm: mink: Fix clock refcounting



SMCInvoke driver has incorrect logic to update refcount for clocks
that is disabling clocks incorrectly. Updating logic to have correct
behaviour.

Change-Id: I7beadbc39c4d858473aaf9a85ce2e41ec61b5385
Signed-off-by: default avatarDinesh K Garg <dineshg@codeaurora.org>
parent 83339054
Loading
Loading
Loading
Loading
+26 −28
Original line number Diff line number Diff line
@@ -140,13 +140,19 @@ static void disable_clocks(void)
{
	int i;

	if (g_clk.clk_access_cnt == 0 || --g_clk.clk_access_cnt > 0)
		return;

	for (i = CE_MAX_CLK; i > 0; i--)
		SMCINVOKE_DISABLE_CLK(g_clk.clks[i-1]);
}

static int enable_clocks(void)
{
	int rc = 0, i;
	int rc = 0, i, j;

	if (g_clk.clk_access_cnt > 0)
		goto out;

	for (i = 0; i < CE_MAX_CLK; i++) {
		if (g_clk.clks[i]) {
@@ -158,9 +164,12 @@ static int enable_clocks(void)
		}
	}
	if (rc) {
		for ( ; i >= 0; i--)
			SMCINVOKE_DISABLE_CLK(g_clk.clks[i]);
		for (j = i-1; j >= 0; j--)
			SMCINVOKE_DISABLE_CLK(g_clk.clks[j]);
		return rc;
	}
out:
	g_clk.clk_access_cnt++;
	return rc;
}

@@ -176,16 +185,6 @@ static int set_msm_bus_request_locked(enum bandwidth_request_mode mode)
		return ret;
	}

	if (current_mode == mode) {
		if (mode == BW_INACTIVE) {
			if (g_clk.clk_access_cnt)
				g_clk.clk_access_cnt--;
		} else {
			g_clk.clk_access_cnt++;
		}
		return ret;
	}

	if (mode == BW_INACTIVE) {
		disable_clocks();
	} else {
@@ -194,7 +193,9 @@ static int set_msm_bus_request_locked(enum bandwidth_request_mode mode)
			goto out;
	}

	ret = msm_bus_scale_client_update_request(qsee_perf_client, mode);
	if (current_mode != mode) {
		ret = msm_bus_scale_client_update_request(
					qsee_perf_client, mode);
		if (ret) {
			pr_err("BW req failed(%d) MODE (%d)\n", ret, mode);
			if (mode == BW_INACTIVE)
@@ -204,11 +205,6 @@ static int set_msm_bus_request_locked(enum bandwidth_request_mode mode)
			goto out;
		}
		current_mode = mode;
	if (mode == BW_INACTIVE) {
		if (g_clk.clk_access_cnt)
			g_clk.clk_access_cnt--;
	} else {
		g_clk.clk_access_cnt++;
	}
out:
	return ret;
@@ -220,6 +216,8 @@ static void deinit_clocks(void)

	for (i = CE_MAX_CLK; i > 0; i--)
		SMCINVOKE_DEINIT_CLK(g_clk.clks[i-1])

	g_clk.clk_access_cnt = 0;
}

static struct clk *get_clk(const char *clk_name)