aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2011-12-29 01:43:24 -0500
committerJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2012-03-15 11:26:32 -0400
commitbf4289cba02b8cf770ecd7959ca70839f0dd9d3c (patch)
tree12c94db33209130c12ce7c31cb2d7f36b303b651 /drivers
parentf75622f4679479d352d2fa83e0d84c6c13cfcb5f (diff)
ATMEL: fix nand ecc support
So we can now choose for the board the ecc mode (ecc soft, soft bch, no ecc and hardware). Set ecc mode in the boards to soft as currently in the driver. Move platform data to a common header include/linux/platform_data/atmel_nand.h Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Acked-by: Hans-Christian Egtvedt <egtvedt@samfundet.no> Acked-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mtd/nand/atmel_nand.c25
1 files changed, 6 insertions, 19 deletions
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 35b4fb55dbd6..fb87b03f1a25 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -34,22 +34,10 @@
34#include <linux/dmaengine.h> 34#include <linux/dmaengine.h>
35#include <linux/gpio.h> 35#include <linux/gpio.h>
36#include <linux/io.h> 36#include <linux/io.h>
37#include <linux/platform_data/atmel.h>
37 38
38#include <mach/board.h>
39#include <mach/cpu.h> 39#include <mach/cpu.h>
40 40
41#ifdef CONFIG_MTD_NAND_ATMEL_ECC_HW
42#define hard_ecc 1
43#else
44#define hard_ecc 0
45#endif
46
47#ifdef CONFIG_MTD_NAND_ATMEL_ECC_NONE
48#define no_ecc 1
49#else
50#define no_ecc 0
51#endif
52
53static int use_dma = 1; 41static int use_dma = 1;
54module_param(use_dma, int, 0); 42module_param(use_dma, int, 0);
55 43
@@ -532,23 +520,22 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
532 if (gpio_is_valid(host->board->rdy_pin)) 520 if (gpio_is_valid(host->board->rdy_pin))
533 nand_chip->dev_ready = atmel_nand_device_ready; 521 nand_chip->dev_ready = atmel_nand_device_ready;
534 522
523 nand_chip->ecc.mode = host->board->ecc_mode;
524
535 regs = platform_get_resource(pdev, IORESOURCE_MEM, 1); 525 regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
536 if (!regs && hard_ecc) { 526 if (!regs && nand_chip->ecc.mode == NAND_ECC_HW) {
537 printk(KERN_ERR "atmel_nand: can't get I/O resource " 527 printk(KERN_ERR "atmel_nand: can't get I/O resource "
538 "regs\nFalling back on software ECC\n"); 528 "regs\nFalling back on software ECC\n");
529 nand_chip->ecc.mode = NAND_ECC_SOFT;
539 } 530 }
540 531
541 nand_chip->ecc.mode = NAND_ECC_SOFT; /* enable ECC */ 532 if (nand_chip->ecc.mode == NAND_ECC_HW) {
542 if (no_ecc)
543 nand_chip->ecc.mode = NAND_ECC_NONE;
544 if (hard_ecc && regs) {
545 host->ecc = ioremap(regs->start, resource_size(regs)); 533 host->ecc = ioremap(regs->start, resource_size(regs));
546 if (host->ecc == NULL) { 534 if (host->ecc == NULL) {
547 printk(KERN_ERR "atmel_nand: ioremap failed\n"); 535 printk(KERN_ERR "atmel_nand: ioremap failed\n");
548 res = -EIO; 536 res = -EIO;
549 goto err_ecc_ioremap; 537 goto err_ecc_ioremap;
550 } 538 }
551 nand_chip->ecc.mode = NAND_ECC_HW;
552 nand_chip->ecc.calculate = atmel_nand_calculate; 539 nand_chip->ecc.calculate = atmel_nand_calculate;
553 nand_chip->ecc.correct = atmel_nand_correct; 540 nand_chip->ecc.correct = atmel_nand_correct;
554 nand_chip->ecc.hwctl = atmel_nand_hwctl; 541 nand_chip->ecc.hwctl = atmel_nand_hwctl;