mmc: sdhci-s3c: Use shifts to divide by powers of two
Current implementation of sdhci_s3c_consider_clock() is highly inefficient due to multiple integer divisions by variable performed in a loop. Since only divisors that are powers of two are considered, this patch replaces them with respective shifts, removing all the integer divisions. Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com> Tested-by: Heiko Stuebner <heiko@sntech.de> Acked-by: Heiko Stuebner <heiko@sntech.de> Tested-by: Jaehoon Chung <jh80.chung@samsung.com> Acked-by; Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Chris Ball <chris@printf.net>
This commit is contained in:
parent
d9c3f5df53
commit
8880a4a526
@ -144,7 +144,7 @@ static unsigned int sdhci_s3c_consider_clock(struct sdhci_s3c *ourhost,
|
||||
{
|
||||
unsigned long rate;
|
||||
struct clk *clksrc = ourhost->clk_bus[src];
|
||||
int div;
|
||||
int shift;
|
||||
|
||||
if (!clksrc)
|
||||
return UINT_MAX;
|
||||
@ -160,15 +160,15 @@ static unsigned int sdhci_s3c_consider_clock(struct sdhci_s3c *ourhost,
|
||||
|
||||
rate = clk_get_rate(clksrc);
|
||||
|
||||
for (div = 1; div < 256; div *= 2) {
|
||||
if ((rate / div) <= wanted)
|
||||
for (shift = 0; shift < 8; ++shift) {
|
||||
if ((rate >> shift) <= wanted)
|
||||
break;
|
||||
}
|
||||
|
||||
dev_dbg(&ourhost->pdev->dev, "clk %d: rate %ld, want %d, got %ld\n",
|
||||
src, rate, wanted, rate / div);
|
||||
src, rate, wanted, rate >> shift);
|
||||
|
||||
return wanted - (rate / div);
|
||||
return wanted - (rate >> shift);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user