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

Commit 4a48af3a authored by David Dai's avatar David Dai Committed by Gerrit - the friendly Code Review server
Browse files

clk: qcom: clk-debug: Add bandwidth voting for MM clock measures



Due to a new requirement to disconnect configuration space for
multimedia clients when MMCX is power collapsed, the debug driver
needs to reconnect the ports before trying to access any of the
multimedia config slaves. Add bandwidth voting before attempting
to access any of the MM clock controller to satisfy this requirement.

Change-Id: I17ac1fc605da884d51a00b731cc0462bb222c5c2
Signed-off-by: default avatarDavid Dai <daidavid1@codeaurora.org>
parent 47cb4b24
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/clk-provider.h>
#include <linux/of.h>
#include <linux/bitops.h>
#include <linux/msm-bus.h>

#include "clk-regmap.h"
#include "clk-debug.h"
@@ -253,6 +254,13 @@ static int clk_debug_measure_get(void *data, u64 *val)

	mutex_lock(&clk_debug_lock);

	/*
	 * Vote for bandwidth to re-connect config ports
	 * to multimedia clock controllers.
	 */
	if (meas->bus_cl_id)
		msm_bus_scale_client_update_request(meas->bus_cl_id, 1);

	ret = clk_set_parent(measure->clk, hw->clk);
	if (!ret) {
		par = measure;
@@ -290,6 +298,8 @@ static int clk_debug_measure_get(void *data, u64 *val)
exit1:
	disable_debug_clks(meas, index);
exit:
	if (meas->bus_cl_id)
		msm_bus_scale_client_update_request(meas->bus_cl_id, 0);
	mutex_unlock(&clk_debug_lock);
	return ret;
}
@@ -345,11 +355,13 @@ int clk_debug_measure_add(struct clk_hw *hw, struct dentry *dentry)
	}

	meas = to_clk_measure(measure);
	if (meas->bus_cl_id)
		msm_bus_scale_client_update_request(meas->bus_cl_id, 1);
	ret = clk_set_parent(measure->clk, hw->clk);
	if (ret) {
		pr_debug("Unable to set %s as %s's parent, ret=%d\n",
			clk_hw_get_name(hw), clk_hw_get_name(measure), ret);
		return 0;
		goto err;
	}

	index = clk_debug_mux_get_parent(measure);
@@ -359,6 +371,9 @@ int clk_debug_measure_add(struct clk_hw *hw, struct dentry *dentry)
	else
		debugfs_create_file("clk_measure", 0444, dentry, hw,
					&clk_measure_fops);
err:
	if (meas->bus_cl_id)
		msm_bus_scale_client_update_request(meas->bus_cl_id, 0);
	return 0;
}
EXPORT_SYMBOL(clk_debug_measure_add);
+1 −0
Original line number Diff line number Diff line
@@ -130,6 +130,7 @@ struct clk_debug_mux {
	u32 post_div_mask;
	u32 post_div_shift;
	u32 period_offset;
	u32 bus_cl_id;
	struct clk_hw hw;
};

+48 −0
Original line number Diff line number Diff line
@@ -23,9 +23,51 @@
#include <linux/clk-provider.h>
#include <linux/regmap.h>
#include <linux/mfd/syscon.h>
#include <linux/msm-bus.h>
#include <dt-bindings/msm/msm-bus-ids.h>

#include "clk-debug.h"

#define MSM_BUS_VECTOR(_src, _dst, _ab, _ib)	\
{						\
	.src = _src,				\
	.dst = _dst,				\
	.ab = _ab,				\
	.ib = _ib,				\
}

static struct msm_bus_vectors clk_measure_vectors[] = {
	MSM_BUS_VECTOR(MSM_BUS_MASTER_AMPSS_M0,
			MSM_BUS_SLAVE_CAMERA_CFG, 0, 0),
	MSM_BUS_VECTOR(MSM_BUS_MASTER_AMPSS_M0,
			MSM_BUS_SLAVE_VENUS_CFG, 0, 0),
	MSM_BUS_VECTOR(MSM_BUS_MASTER_AMPSS_M0,
			MSM_BUS_SLAVE_DISPLAY_CFG, 0, 0),
	MSM_BUS_VECTOR(MSM_BUS_MASTER_AMPSS_M0,
			MSM_BUS_SLAVE_CAMERA_CFG, 0, 1),
	MSM_BUS_VECTOR(MSM_BUS_MASTER_AMPSS_M0,
			MSM_BUS_SLAVE_VENUS_CFG, 0, 1),
	MSM_BUS_VECTOR(MSM_BUS_MASTER_AMPSS_M0,
			MSM_BUS_SLAVE_DISPLAY_CFG, 0, 1),
};

static struct msm_bus_paths clk_measure_usecases[] = {
	{
		.num_paths = 3,
		.vectors = &clk_measure_vectors[0],
	},
	{
		.num_paths = 3,
		.vectors = &clk_measure_vectors[3],
	}
};

static struct msm_bus_scale_pdata clk_measure_scale_table = {
	.usecase = clk_measure_usecases,
	.num_usecases = ARRAY_SIZE(clk_measure_usecases),
	.name = "clk_measure",
};

static struct measure_clk_data debug_mux_priv = {
	.ctl_reg = 0x62038,
	.status_reg = 0x6203C,
@@ -878,6 +920,12 @@ static int clk_debug_sm8150_probe(struct platform_device *pdev)
	if (ret)
		return ret;

	gcc_debug_mux.bus_cl_id =
		msm_bus_scale_register_client(&clk_measure_scale_table);

	if (!gcc_debug_mux.bus_cl_id)
		return -EPROBE_DEFER;

	clk = devm_clk_register(&pdev->dev, &gcc_debug_mux.hw);
	if (IS_ERR(clk)) {
		dev_err(&pdev->dev, "Unable to register GCC debug mux\n");