S3C2412 fix hw ecc
Subsystems (3)
PATCH 1/1 S3C2412 fix hw ecc
Hi,
S3C2412 use differents registers than s3c2440 for hw ecc handling.
Signed-off-by Matthieu CASTET <[email protected]>
drivers/mtd/nand/s3c2410.c +27 -0
@@ -419,6 +419,15 @@writel (ctrl, info->regs +S3C2410_NFCONF ); } +static void s3c2412_nand_enable_hwecc (struct mtd_info *mtd,int mode) +{ +struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd); +unsigned long ctrl; + + ctrl =readl (info->regs +S3C2440_NFCONT ); +writel (ctrl |S3C2412_NFCONT_INIT_MAIN_ECC , info->regs +S3C2440_NFCONT ); +} +static void s3c2440_nand_enable_hwecc (struct mtd_info *mtd,int mode) {struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd);
@@ -442,6 +451,20 @@return 0 ; } +static int s3c2412_nand_calculate_ecc (struct mtd_info *mtd,const u_char *dat,u_char *ecc_code) +{ +struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd); +unsigned long ecc =readl (info->regs +S3C2412_NFMECC0 ); + + ecc_code[0 ] = ecc; + ecc_code[1 ] = ecc >>8 ; + ecc_code[2 ] = ecc >>16 ; + +pr_debug ("calculate_ecc: returning ecc %02x,%02x,%02x\n" , ecc_code[0 ], ecc_code[1 ], ecc_code[2 ]); + +return 0 ; +} +static int s3c2440_nand_calculate_ecc (struct mtd_info *mtd,const u_char *dat,u_char *ecc_code) {struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd);
@@ -619,6 +642,10 @@break ;case TYPE_S3C2412 : + chip->ecc.hwctl = s3c2412_nand_enable_hwecc; + chip->ecc.calculate = s3c2412_nand_calculate_ecc; +break ; +case TYPE_S3C2440 : chip->ecc.hwctl = s3c2440_nand_enable_hwecc; chip->ecc.calculate = s3c2440_nand_calculate_ecc;
Quoted 5 lines · Matthieu CASTET
Hi,
S3C2412 use differents registers than s3c2440 for hw ecc handling.
Signed-off-by Matthieu CASTET <[email protected]>
Acked-by Ben Dooks <[email protected]>
Quoted 57 lines
Index:
linux-2.6.20/drivers/mtd/nand/s3c2410.c
===================================================================drivers/mtd/nand/s3c2410.c +27
-0@@ -419,6 +419,15 @@writel (ctrl, info->regs +S3C2410_NFCONF ); } +static void s3c2412_nand_enable_hwecc (struct mtd_info *mtd,int mode) +{ +struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd); +unsigned long ctrl; + + ctrl =readl (info->regs +S3C2440_NFCONT ); +writel (ctrl |S3C2412_NFCONT_INIT_MAIN_ECC , info->regs +S3C2440_NFCONT ); +} +static void s3c2440_nand_enable_hwecc (struct mtd_info *mtd,int mode) {struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd);@@ -442,6 +451,20 @@return 0 ; } +static int s3c2412_nand_calculate_ecc (struct mtd_info *mtd,const u_char *dat,u_char *ecc_code) +{ +struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd); +unsigned long ecc =readl (info->regs +S3C2412_NFMECC0 ); + + ecc_code[0 ] = ecc; + ecc_code[1 ] = ecc >>8 ; + ecc_code[2 ] = ecc >>16 ; + +pr_debug ("calculate_ecc: returning ecc %02x,%02x,%02x\n" , ecc_code[0 ], ecc_code[1 ], ecc_code[2 ]); + +return 0 ; +} +static int s3c2440_nand_calculate_ecc (struct mtd_info *mtd,const u_char *dat,u_char *ecc_code) {struct s3c2410_nand_info *info =s3c2410_nand_mtd_toinfo (mtd);@@ -619,6 +642,10 @@break ;case TYPE_S3C2412 : + chip->ecc.hwctl = s3c2412_nand_enable_hwecc; + chip->ecc.calculate = s3c2412_nand_calculate_ecc; +break ; +case TYPE_S3C2440 : chip->ecc.hwctl = s3c2440_nand_enable_hwecc; chip->ecc.calculate = s3c2440_nand_calculate_ecc;______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
Signature · 3 lines
Ben ([email protected], http://www.fluff.org/) 'a smiley only costs 4 bytes'