Skip to content

Commit

Permalink
clk: at91: clk-generated: create function to find best_diff
Browse files Browse the repository at this point in the history
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: Quentin Schulz <[email protected]>
Acked-by: Boris Brezillon <[email protected]>
Acked-by: Nicolas Ferre <[email protected]>
Signed-off-by: Stephen Boyd <[email protected]>
  • Loading branch information
QSchulz authored and bebarino committed Sep 1, 2017
1 parent 0865805 commit 8a8f4bf
Showing 1 changed file with 27 additions and 14 deletions.
41 changes: 27 additions & 14 deletions drivers/clk/at91/clk-generated.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand All @@ -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;
Expand Down

0 comments on commit 8a8f4bf

Please sign in to comment.