Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2517b32b authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Stephen Boyd
Browse files

clk: pxa: fix pxa2xx_determine_rate return



The new pxa2xx_determine_rate() function seems lacking in a few
regards:

- For an exact match or no match at all, the rate is uninitialized
  as reported by gcc -Wmaybe-unintialized:
   drivers/clk/pxa/clk-pxa.c: In function 'pxa2xx_determine_rate':
   drivers/clk/pxa/clk-pxa.c:243:5: error: 'rate' may be used uninitialized in this function

- If we get a non-exact match, the req->rate output is never set
  to the actual rate but remains at the requested rate.

- We should not attempt to print a rate if none could be found

This rewrites the logic accordingly.

Fixes: 9fe69429 ("clk: pxa: transfer CPU clock setting from pxa2xx-cpufreq")
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent 8c1ee96a
Loading
Loading
Loading
Loading
+12 −11
Original line number Original line Diff line number Diff line
@@ -211,7 +211,7 @@ void pxa2xx_cpll_change(struct pxa2xx_freq *freq,
int pxa2xx_determine_rate(struct clk_rate_request *req,
int pxa2xx_determine_rate(struct clk_rate_request *req,
			  struct pxa2xx_freq *freqs, int nb_freqs)
			  struct pxa2xx_freq *freqs, int nb_freqs)
{
{
	int i, closest_below = -1, closest_above = -1, ret = 0;
	int i, closest_below = -1, closest_above = -1;
	unsigned long rate;
	unsigned long rate;


	for (i = 0; i < nb_freqs; i++) {
	for (i = 0; i < nb_freqs; i++) {
@@ -230,18 +230,19 @@ int pxa2xx_determine_rate(struct clk_rate_request *req,


	req->best_parent_hw = NULL;
	req->best_parent_hw = NULL;


	if (i < nb_freqs)
	if (i < nb_freqs) {
		ret = 0;
		rate = req->rate;
	else if (closest_below >= 0)
	} else if (closest_below >= 0) {
		rate = freqs[closest_below].cpll;
		rate = freqs[closest_below].cpll;
	else if (closest_above >= 0)
	} else if (closest_above >= 0) {
		rate = freqs[closest_above].cpll;
		rate = freqs[closest_above].cpll;
	else
	} else {
		ret = -EINVAL;
		pr_debug("%s(rate=%lu) no match\n", __func__, req->rate);
		return -EINVAL;
	}


	pr_debug("%s(rate=%lu) rate=%lu: %d\n", __func__, req->rate, rate, ret);
	pr_debug("%s(rate=%lu) rate=%lu\n", __func__, req->rate, rate);
	if (!rate)
	req->rate = rate;
	req->rate = rate;


	return ret;
	return 0;
}
}