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

Commit dd88106d authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 69c8dde3 4a48af3a
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");