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

Commit 8a8f4bf0 authored by Quentin Schulz's avatar Quentin Schulz Committed by Stephen Boyd
Browse files

clk: at91: clk-generated: create function to find best_diff



The way to find the best_diff and do the appropriate process afterwards
can be re-used.

This patch prepares the driver for an upcoming patch that will allow
clk_generated to determine the rate of the audio_pll.

Signed-off-by: default avatarQuentin Schulz <quentin.schulz@free-electrons.com>
Acked-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@microchip.com>
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent 0865805d
Loading
Loading
Loading
Loading
+27 −14
Original line number Diff line number Diff line
@@ -99,15 +99,36 @@ clk_generated_recalc_rate(struct clk_hw *hw,
	return DIV_ROUND_CLOSEST(parent_rate, gck->gckdiv + 1);
}

static void clk_generated_best_diff(struct clk_rate_request *req,
				    struct clk_hw *parent,
				    unsigned long parent_rate, u32 div,
				    int *best_diff, long *best_rate)
{
	unsigned long tmp_rate;
	int tmp_diff;

	if (!div)
		tmp_rate = parent_rate;
	else
		tmp_rate = parent_rate / div;
	tmp_diff = abs(req->rate - tmp_rate);

	if (*best_diff < 0 || *best_diff > tmp_diff) {
		*best_rate = tmp_rate;
		*best_diff = tmp_diff;
		req->best_parent_rate = parent_rate;
		req->best_parent_hw = parent;
	}
}

static int clk_generated_determine_rate(struct clk_hw *hw,
					struct clk_rate_request *req)
{
	struct clk_generated *gck = to_clk_generated(hw);
	struct clk_hw *parent = NULL;
	long best_rate = -EINVAL;
	unsigned long tmp_rate, min_rate;
	unsigned long min_rate;
	int best_diff = -1;
	int tmp_diff;
	int i;

	for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
@@ -125,18 +146,10 @@ static int clk_generated_determine_rate(struct clk_hw *hw,
			continue;

		div = DIV_ROUND_CLOSEST(parent_rate, req->rate);
		if (!div)
			tmp_rate = parent_rate;
		else
			tmp_rate = parent_rate / div;
		tmp_diff = abs(req->rate - tmp_rate);

		if (best_diff < 0 || best_diff > tmp_diff) {
			best_rate = tmp_rate;
			best_diff = tmp_diff;
			req->best_parent_rate = parent_rate;
			req->best_parent_hw = parent;
		}
		clk_generated_best_diff(req, parent, parent_rate, div,
					&best_diff, &best_rate);


		if (!best_diff)
			break;