ARM: S3C2443: handle unset armdiv values gracefully
authorHeiko Stuebner <heiko@sntech.de>
Fri, 14 Oct 2011 06:08:56 +0000 (15:08 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Fri, 14 Oct 2011 06:15:52 +0000 (15:15 +0900)
The armdiv array may contain unset divider values.
Check the relevant value to prevent division by zero
errors. Also check for set nr_armdiv and armdivmask
before meddling with clkdiv0.

Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
arch/arm/plat-s3c24xx/s3c2443-clock.c

index fea3d5c0252e2a7546a7f74e60e2b933f5b95d00..31f97f1bb36359d65d663b49757d32ef5c562847 100644 (file)
@@ -179,11 +179,16 @@ static unsigned long s3c2443_armclk_roundrate(struct clk *clk,
        unsigned div;
        int ptr;
 
+       if (!nr_armdiv)
+               return -EINVAL;
+
        for (ptr = 0; ptr < nr_armdiv; ptr++) {
                div = armdiv[ptr];
-               calc = parent / div;
-               if (calc <= rate && div < best)
-                       best = div;
+               if (div) {
+                       calc = parent / div;
+                       if (calc <= rate && div < best)
+                               best = div;
+               }
        }
 
        return parent / best;
@@ -195,6 +200,9 @@ static unsigned long s3c2443_armclk_getrate(struct clk *clk)
        unsigned long clkcon0;
        int val;
 
+       if (!nr_armdiv || !armdivmask)
+               return -EINVAL;
+
        clkcon0 = __raw_readl(S3C2443_CLKDIV0);
        clkcon0 &= armdivmask;
        val = clkcon0 >> S3C2443_CLKDIV0_ARMDIV_SHIFT;
@@ -211,12 +219,17 @@ static int s3c2443_armclk_setrate(struct clk *clk, unsigned long rate)
        int ptr;
        int val = -1;
 
+       if (!nr_armdiv || !armdivmask)
+               return -EINVAL;
+
        for (ptr = 0; ptr < nr_armdiv; ptr++) {
                div = armdiv[ptr];
-               calc = parent / div;
-               if (calc <= rate && div < best) {
-                       best = div;
-                       val = ptr;
+               if (div) {
+                       calc = parent / div;
+                       if (calc <= rate && div < best) {
+                               best = div;
+                               val = ptr;
+                       }
                }
        }