|
@@ -33,6 +33,7 @@
|
|
|
#include <linux/io.h>
|
|
|
|
|
|
#include <asm/arch/board.h>
|
|
|
+#include <asm/arch/cpu.h>
|
|
|
|
|
|
#ifdef CONFIG_MTD_NAND_ATMEL_ECC_HW
|
|
|
#define hard_ecc 1
|
|
@@ -264,6 +265,19 @@ static int atmel_nand_read_page(struct mtd_info *mtd,
|
|
|
uint8_t *ecc_pos;
|
|
|
int stat;
|
|
|
|
|
|
+ /*
|
|
|
+ * Errata: ALE is incorrectly wired up to the ECC controller
|
|
|
+ * on the AP7000, so it will include the address cycles in the
|
|
|
+ * ECC calculation.
|
|
|
+ *
|
|
|
+ * Workaround: Reset the parity registers before reading the
|
|
|
+ * actual data.
|
|
|
+ */
|
|
|
+ if (cpu_is_at32ap7000()) {
|
|
|
+ struct atmel_nand_host *host = chip->priv;
|
|
|
+ ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
|
|
|
+ }
|
|
|
+
|
|
|
/* read the page */
|
|
|
chip->read_buf(mtd, p, eccsize);
|
|
|
|
|
@@ -377,9 +391,16 @@ static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Enable HW ECC : unsused
|
|
|
+ * Enable HW ECC : unused on most chips
|
|
|
*/
|
|
|
-static void atmel_nand_hwctl(struct mtd_info *mtd, int mode) { ; }
|
|
|
+static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)
|
|
|
+{
|
|
|
+ if (cpu_is_at32ap7000()) {
|
|
|
+ struct nand_chip *nand_chip = mtd->priv;
|
|
|
+ struct atmel_nand_host *host = nand_chip->priv;
|
|
|
+ ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
#ifdef CONFIG_MTD_PARTITIONS
|
|
|
static const char *part_probes[] = { "cmdlinepart", NULL };
|