aboutsummaryrefslogtreecommitdiff
path: root/drivers/mtd
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/nand/s3c2410.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
index 04750ee2d0f..e14520091b2 100644
--- a/drivers/mtd/nand/s3c2410.c
+++ b/drivers/mtd/nand/s3c2410.c
@@ -149,6 +149,10 @@ static int s3c_nand_calc_rate(int wanted, unsigned long clk, int max)
{
int result;
+ /* Tacls can be 0ns in some cases */
+ if (wanted == 0)
+ return 0;
+
result = (wanted * clk) / NS_IN_KHZ;
result++;
@@ -159,9 +163,6 @@ static int s3c_nand_calc_rate(int wanted, unsigned long clk, int max)
return -1;
}
- if (result < 1)
- result = 1;
-
return result;
}
@@ -194,7 +195,7 @@ static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)
twrph1 = 8;
}
- if (tacls < 0 || twrph0 < 0 || twrph1 < 0) {
+ if (tacls < 0 || twrph0 < 1 || twrph1 < 1) {
dev_err(info->device, "cannot get suitable timings\n");
return -EINVAL;
}
@@ -255,11 +256,18 @@ static int s3c2410_nand_inithw(struct s3c2410_nand_info *info)
switch (info->cpu_type) {
case TYPE_S3C2410:
- default:
+ cfg = S3C2410_NFCONF_EN;
+ cfg |= S3C2410_NFCONF_TACLS(tacls);
+ cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
+ cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
break;
case TYPE_S3C2440:
case TYPE_S3C2412:
+ cfg = S3C2440_NFCONF_TACLS(tacls);
+ cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
+ cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
+
/* enable the controller and de-assert nFCE */
writel(S3C2440_NFCONT_ENABLE, info->regs + S3C2440_NFCONT);