ARM: tegra: clock: Fix round rate error checking
Alex Frid [Sun, 10 Mar 2013 07:53:31 +0000 (23:53 -0800)]
Some callers of clk_round_rate() API assume that return signed value
is negative in case of error, and positive if API succeeded. The latter
is not true when the clock rate crosses ~2.1 GHz (2,147,483,647 Hz)
boundary on 32-bit machine. To prevent false bailing out on 2.1GHz and
above rates callers of round rate API should cast the rounded rate as
unsigned, and use IS_ERR_VALUE() macro to detect errors instead of
checking sign of the returned value.

This commit fixed round rate error checking for callers in mach-tegra
directory.

Change-Id: Ic1d09f8ba9aa6f95132b63ad15760270c44e9814
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/207912
Reviewed-by: Harshada Kale <hkale@nvidia.com>
Tested-by: Harshada Kale <hkale@nvidia.com>

arch/arm/mach-tegra/clock.c
arch/arm/mach-tegra/tegra11_clocks.c
arch/arm/mach-tegra/tegra14_clocks.c

index c550b72..b543241 100644 (file)
@@ -504,7 +504,7 @@ int clk_set_rate_locked(struct clk *c, unsigned long rate)
 {
        int ret = 0;
        unsigned long old_rate, max_rate;
-       long new_rate;
+       unsigned long new_rate;
        bool disable = false;
 
        if (!c->ops || !c->ops->set_rate)
@@ -519,7 +519,7 @@ int clk_set_rate_locked(struct clk *c, unsigned long rate)
        if (c->ops && c->ops->round_rate) {
                new_rate = c->ops->round_rate(c, rate);
 
-               if (new_rate < 0) {
+               if (IS_ERR_VALUE(new_rate)) {
                        ret = new_rate;
                        return ret;
                }
@@ -1439,7 +1439,7 @@ static int possible_rates_show(struct seq_file *s, void *data)
 
        /* shared bus clock must round up, unless top of range reached */
        while (rate <= c->max_rate) {
-               long rounded_rate = c->ops->round_rate(c, rate);
+               unsigned long rounded_rate = c->ops->round_rate(c, rate);
                if (IS_ERR_VALUE(rounded_rate) || (rounded_rate <= rate))
                        break;
 
index eb412a8..86533d5 100644 (file)
@@ -4397,10 +4397,10 @@ static void tegra11_emc_clk_init(struct clk *c)
 static long tegra11_emc_clk_round_updown(struct clk *c, unsigned long rate,
                                         bool up)
 {
-       long new_rate = max(rate, c->min_rate);
+       unsigned long new_rate = max(rate, c->min_rate);
 
        new_rate = tegra_emc_round_rate_updown(new_rate, up);
-       if (new_rate < 0)
+       if (IS_ERR_VALUE(new_rate))
                new_rate = c->max_rate;
 
        return new_rate;
index e1e82fa..ac3bc33 100644 (file)
@@ -3824,11 +3824,11 @@ static void tegra14_emc_clk_init(struct clk *c)
 static long tegra14_emc_clk_round_updown(struct clk *c, unsigned long rate,
                                         bool up)
 {
-       long new_rate = max(rate, c->min_rate);
+       unsigned long new_rate = max(rate, c->min_rate);
 
        /* FIXME: emc updown rounding */
        new_rate = tegra_emc_round_rate(new_rate);
-       if (new_rate < 0)
+       if (IS_ERR_VALUE(new_rate))
                new_rate = c->max_rate;
 
        return new_rate;