Skip to content

Commit

Permalink
spi/pl022: Fix calculate_effective_freq()
Browse files Browse the repository at this point in the history
calculate_effective_freq() was still not optimized and there were cases when it
returned without error and with values of cpsr and scr as zero.

Also, the variable named found is not used well.

This patch targets to optimize and correct this routine. Tested for SPEAr.

Signed-off-by: Viresh Kumar <[email protected]>
Tested-by: Vinit Kamalaksha Shenoy <[email protected]>
Acked-by: Linus Walleij <[email protected]>
Signed-off-by: Grant Likely <[email protected]>
  • Loading branch information
Viresh Kumar authored and glikely committed Apr 27, 2012
1 parent eb798c6 commit 5eb806a
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions drivers/spi/spi-pl022.c
Original file line number Diff line number Diff line change
Expand Up @@ -1681,26 +1681,37 @@ static int calculate_effective_freq(struct pl022 *pl022, int freq, struct
while (scr <= SCR_MAX) {
tmp = spi_rate(rate, cpsdvsr, scr);

if (tmp > freq)
if (tmp > freq) {
/* we need lower freq */
scr++;
continue;
}

/*
* If found exact value, update and break.
* If found more closer value, update and continue.
* If found exact value, mark found and break.
* If found more closer value, update and break.
*/
else if ((tmp == freq) || (tmp > best_freq)) {
if (tmp > best_freq) {
best_freq = tmp;
best_cpsdvsr = cpsdvsr;
best_scr = scr;

if (tmp == freq)
break;
found = 1;
}
scr++;
/*
* increased scr will give lower rates, which are not
* required
*/
break;
}
cpsdvsr += 2;
scr = SCR_MIN;
}

WARN(!best_freq, "pl022: Matching cpsdvsr and scr not found for %d Hz rate \n",
freq);

clk_freq->cpsdvsr = (u8) (best_cpsdvsr & 0xFF);
clk_freq->scr = (u8) (best_scr & 0xFF);
dev_dbg(&pl022->adev->dev,
Expand Down

0 comments on commit 5eb806a

Please sign in to comment.