ARM: S3C2443: handle unset armdiv values gracefully
[pandora-kernel.git] / arch / arm / plat-s3c24xx / s3c2443-clock.c
index fea3d5c..31f97f1 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;
+                       }
                }
        }