Skip to content

Commit

Permalink
ARM: S3C2443: handle unset armdiv values gracefully
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Heiko Stuebner authored and Kukjin Kim committed Oct 14, 2011
1 parent 5f33bd7 commit f9f7c75
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions arch/arm/plat-s3c24xx/s3c2443-clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
}
}
}

Expand Down

0 comments on commit f9f7c75

Please sign in to comment.