--- a/drivers/mtd/nand/rb750_nand.c +++ b/drivers/mtd/nand/rb750_nand.c @@ -110,7 +110,8 @@ static void rb750_nand_write(const u8 *b __raw_readl(base + AR71XX_GPIO_REG_OE); } -static void rb750_nand_read(u8 *read_buf, unsigned len) +static int rb750_nand_read_verify(u8 *read_buf, unsigned len, + const u8 *verify_buf) { void __iomem *base = ath79_gpio_base; unsigned i; @@ -130,8 +131,13 @@ static void rb750_nand_read(u8 *read_buf /* deactivate RE line */ __raw_writel(RB750_NAND_NRE, base + AR71XX_GPIO_REG_SET); - read_buf[i] = data; + if (read_buf) + read_buf[i] = data; + else if (verify_buf && verify_buf[i] != data) + return -EFAULT; } + + return 0; } static void rb750_nand_select_chip(struct mtd_info *mtd, int chip) @@ -206,13 +212,13 @@ static void rb750_nand_cmd_ctrl(struct m static u8 rb750_nand_read_byte(struct mtd_info *mtd) { u8 data = 0; - rb750_nand_read(&data, 1); + rb750_nand_read_verify(&data, 1, NULL); return data; } static void rb750_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len) { - rb750_nand_read(buf, len); + rb750_nand_read_verify(buf, len, NULL); } static void rb750_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len) @@ -220,6 +226,11 @@ static void rb750_nand_write_buf(struct rb750_nand_write(buf, len); } +static int rb750_nand_verify_buf(struct mtd_info *mtd, const u8 *buf, int len) +{ + return rb750_nand_read_verify(NULL, len, buf); +} + static void __init rb750_nand_gpio_init(struct rb750_nand_info *info) { void __iomem *base = ath79_gpio_base; @@ -274,6 +285,7 @@ static int __devinit rb750_nand_probe(st info->chip.read_byte = rb750_nand_read_byte; info->chip.write_buf = rb750_nand_write_buf; info->chip.read_buf = rb750_nand_read_buf; + info->chip.verify_buf = rb750_nand_verify_buf; info->chip.chip_delay = 25; info->chip.ecc.mode = NAND_ECC_SOFT;