Commit 222a13c5 authored by Tomasz Figa's avatar Tomasz Figa Committed by Chris Ball

mmc: sdhci-s3c: Simplify min/max clock calculation

This patch reimplements functions calculating minimum and maximum clock
rates to leverage clock rate cache introduced by previous patches.

In addition, the calculation is simplified to just comparing input
clock rates (max case) or input clock rates divided by maximum divisor
(min case), which is basically what the original code did, but with much
more unnecessary work.
Signed-off-by: default avatarTomasz Figa <tomasz.figa@gmail.com>
Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
Acked-by: default avatarHeiko Stuebner <heiko@sntech.de>
Tested-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
Acked-by; Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: default avatarChris Ball <chris@printf.net>
parent 8f4b78d9
...@@ -112,20 +112,16 @@ static void sdhci_s3c_check_sclk(struct sdhci_host *host) ...@@ -112,20 +112,16 @@ static void sdhci_s3c_check_sclk(struct sdhci_host *host)
static unsigned int sdhci_s3c_get_max_clk(struct sdhci_host *host) static unsigned int sdhci_s3c_get_max_clk(struct sdhci_host *host)
{ {
struct sdhci_s3c *ourhost = to_s3c(host); struct sdhci_s3c *ourhost = to_s3c(host);
struct clk *busclk; unsigned long rate, max = 0;
unsigned int rate, max; int src;
int clk;
/* note, a reset will reset the clock source */ /* note, a reset will reset the clock source */
sdhci_s3c_check_sclk(host); sdhci_s3c_check_sclk(host);
for (max = 0, clk = 0; clk < MAX_BUS_CLK; clk++) {
busclk = ourhost->clk_bus[clk];
if (!busclk)
continue;
rate = clk_get_rate(busclk); for (src = 0; src < MAX_BUS_CLK; src++) {
rate = ourhost->clk_rates[src];
if (rate > max) if (rate > max)
max = rate; max = rate;
} }
...@@ -255,17 +251,17 @@ static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock) ...@@ -255,17 +251,17 @@ static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock)
static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host) static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host)
{ {
struct sdhci_s3c *ourhost = to_s3c(host); struct sdhci_s3c *ourhost = to_s3c(host);
unsigned int delta, min = UINT_MAX; unsigned long rate, min = ULONG_MAX;
int src; int src;
for (src = 0; src < MAX_BUS_CLK; src++) { for (src = 0; src < MAX_BUS_CLK; src++) {
delta = sdhci_s3c_consider_clock(ourhost, src, 0); rate = ourhost->clk_rates[src] / 256;
if (delta == UINT_MAX) if (!rate)
continue; continue;
/* delta is a negative value in this case */ if (rate < min)
if (-delta < min) min = rate;
min = -delta;
} }
return min; return min;
} }
...@@ -273,20 +269,44 @@ static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host) ...@@ -273,20 +269,44 @@ static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host)
static unsigned int sdhci_cmu_get_max_clock(struct sdhci_host *host) static unsigned int sdhci_cmu_get_max_clock(struct sdhci_host *host)
{ {
struct sdhci_s3c *ourhost = to_s3c(host); struct sdhci_s3c *ourhost = to_s3c(host);
unsigned long rate, max = 0;
int src;
for (src = 0; src < MAX_BUS_CLK; src++) {
struct clk *clk;
clk = ourhost->clk_bus[src];
if (IS_ERR(clk))
continue;
rate = clk_round_rate(clk, ULONG_MAX);
if (rate > max)
max = rate;
}
return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], UINT_MAX); return max;
} }
/* sdhci_cmu_get_min_clock - callback to get minimal supported clock value. */ /* sdhci_cmu_get_min_clock - callback to get minimal supported clock value. */
static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host) static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host)
{ {
struct sdhci_s3c *ourhost = to_s3c(host); struct sdhci_s3c *ourhost = to_s3c(host);
unsigned long rate, min = ULONG_MAX;
int src;
/* for (src = 0; src < MAX_BUS_CLK; src++) {
* initial clock can be in the frequency range of struct clk *clk;
* 100KHz-400KHz, so we set it as max value.
*/ clk = ourhost->clk_bus[src];
return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], 400000); if (IS_ERR(clk))
continue;
rate = clk_round_rate(clk, 0);
if (rate < min)
min = rate;
}
return min;
} }
/* sdhci_cmu_set_clock - callback on clock change.*/ /* sdhci_cmu_set_clock - callback on clock change.*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment