mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
spi/pl022: Fix calculate_effective_freq()
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]>
This commit is contained in:
parent
eb798c641a
commit
5eb806a3a6
1 changed files with 17 additions and 6 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue