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

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

clk: qcom: clk-debug: Add custom measure operators for mccc_clk



Since the generic way of using testclock to measure ddr mc clock
is not available, rely on reading the period of the current mc clock
frequency written to by DDRSS software. This does not provide the
physical rate at which the clock is running, but a snapshot of the
current configuration.

Change-Id: I37ce2927be7712adc2b722ed0a26c8eaf4596dd2
Signed-off-by: default avatarDavid Dai <daidavid1@codeaurora.org>
parent d0b42d51
Loading
Loading
Loading
Loading
+45 −1
Original line number Diff line number Diff line
@@ -287,15 +287,54 @@ static int clk_debug_measure_get(void *data, u64 *val)
DEFINE_DEBUGFS_ATTRIBUTE(clk_measure_fops, clk_debug_measure_get,
							NULL, "%lld\n");

static int clk_debug_read_period(void *data, u64 *val)
{
	struct clk_hw *hw = data;
	struct clk_debug_mux *meas = to_clk_measure(measure);
	int index;
	int dbg_cc;
	int ret = 0;
	u32 regval;

	mutex_lock(&clk_debug_lock);

	ret = clk_set_parent(measure->clk, hw->clk);
	if (!ret) {
		index = clk_debug_mux_get_parent(measure);
		dbg_cc = meas->parent[index].dbg_cc;

		regmap_read(meas->regmap[dbg_cc], meas->period_offset, &regval);
		if (!regval) {
			pr_err("Error reading mccc period register, ret = %d\n",
			       ret);
			mutex_unlock(&clk_debug_lock);
			return 0;
		}
		*val = 1000000000000UL;
		do_div(*val, regval);
	} else {
		pr_err("Failed to set the debug mux's parent.\n");
	}

	mutex_unlock(&clk_debug_lock);
	return ret;
}

DEFINE_SIMPLE_ATTRIBUTE(clk_read_period_fops, clk_debug_read_period,
							NULL, "%lld\n");

void clk_debug_measure_add(struct clk_hw *hw, struct dentry *dentry)
{
	int ret;
	int index;
	struct clk_debug_mux *meas;

	if (IS_ERR_OR_NULL(measure)) {
		pr_err_once("Please check if `measure` clk is registered.\n");
		return;
	}

	meas = to_clk_measure(measure);
	ret = clk_set_parent(measure->clk, hw->clk);
	if (ret) {
		pr_debug("Unable to set %s as %s's parent, ret=%d\n",
@@ -303,6 +342,11 @@ void clk_debug_measure_add(struct clk_hw *hw, struct dentry *dentry)
		return;
	}

	index = clk_debug_mux_get_parent(measure);
	if (meas->parent[index].dbg_cc == MC_CC)
		debugfs_create_file("clk_measure", 0444, dentry, hw,
					&clk_read_period_fops);
	else
		debugfs_create_file("clk_measure", 0444, dentry, hw,
					&clk_measure_fops);
}
+4 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ enum debug_cc {
	GPU_CC,
	VIDEO_CC,
	CPU_CC,
	MC_CC,
	MAX_NUM_CC,
};

@@ -101,6 +102,8 @@ struct clk_src {
			mux.
 * @post_div_shift:	indicates the shift required for post divider
			selection in primary mux.
 * @period_offset:	offset of the period register used to read to determine
			the mc clock period
 * @hw:			handle between common and hardware-specific interfaces.
 */
struct clk_debug_mux {
@@ -116,6 +119,7 @@ struct clk_debug_mux {
	u32 src_sel_shift;
	u32 post_div_mask;
	u32 post_div_shift;
	u32 period_offset;
	struct clk_hw hw;
};