summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2008-10-31 14:04:42 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2008-10-31 14:04:42 +0100
commit87d4b9ec0943ffa9087f8762a70b42387ad79fd4 (patch)
tree2f0477c7a54ca36ed51dd945f369e1ae35516272
parentc3fc1364d9ed508a59bc2127c04d7239e30d148a (diff)
downloadbarebox-87d4b9ec0943ffa9087f8762a70b42387ad79fd4.tar.gz
barebox-87d4b9ec0943ffa9087f8762a70b42387ad79fd4.tar.xz
[AT9SAM] implement different ECC modes for NAND chips
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--board/at91sam9260ek/init.c17
-rw-r--r--drivers/nand/atmel_nand.c10
-rw-r--r--include/asm-arm/arch-at91sam9/atmel_nand.h1
3 files changed, 22 insertions, 6 deletions
diff --git a/board/at91sam9260ek/init.c b/board/at91sam9260ek/init.c
index 5f35b0e3e6..37c878e6d9 100644
--- a/board/at91sam9260ek/init.c
+++ b/board/at91sam9260ek/init.c
@@ -44,6 +44,8 @@ static struct atmel_nand_data nand_pdata = {
.ale = 21,
.cle = 22,
/* .det_pin = ... not connected */
+ .ecc_base = (void __iomem *)AT91C_BASE_HECC,
+ .ecc_mode = NAND_ECC_HW,
.rdy_pin = NAND_READY_GPIO,
.enable_pin = NAND_ENABLE_GPIO,
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
@@ -86,15 +88,26 @@ static struct device_d macb_dev = {
static int at91sam9260ek_devices_init(void)
{
+ struct device_d *nand, *dev;
+
register_device(&sdram_dev);
+
+ gpio_direction_input(NAND_READY_GPIO);
+ gpio_direction_output(NAND_ENABLE_GPIO, 1);
+
register_device(&nand_dev);
register_device(&macb_dev);
armlinux_set_bootparams((void *)0x20000100);
armlinux_set_architecture(MACH_TYPE_AT91SAM9260EK);
- gpio_direction_input(NAND_READY_GPIO);
- gpio_direction_output(NAND_ENABLE_GPIO, 1);
+ nand = get_device_by_path("/dev/nand0");
+ dev = dev_add_partition(nand, 0x00000, 0x80000, PARTITION_FIXED, "self_raw");
+ dev_add_bb_dev(dev, "self0");
+ dev = dev_add_partition(nand, 0x40000, 0x40000, PARTITION_FIXED, "env_raw");
+ dev_add_bb_dev(dev, "env0");
+ dev_add_partition(nand, 0x00000, 0x80000, PARTITION_FIXED, "self");
+ dev_add_partition(nand, 0x40000, 0x40000, PARTITION_FIXED, "env");
return 0;
}
diff --git a/drivers/nand/atmel_nand.c b/drivers/nand/atmel_nand.c
index 54881980aa..40b7826098 100644
--- a/drivers/nand/atmel_nand.c
+++ b/drivers/nand/atmel_nand.c
@@ -399,10 +399,12 @@ static int __init atmel_nand_probe(struct device_d *dev)
if (host->board->rdy_pin)
nand_chip->dev_ready = atmel_nand_device_ready;
- nand_chip->ecc.mode = NAND_ECC_SOFT; /* enable ECC */
- if (no_ecc)
- nand_chip->ecc.mode = NAND_ECC_NONE;
- if (hard_ecc && pdata->ecc_base) {
+ nand_chip->ecc.mode = pdata->ecc_mode;
+
+ if (pdata->ecc_mode == NAND_ECC_HW) {
+ if (!pdata->ecc_base)
+ return -ENODEV;
+
host->ecc = pdata->ecc_base;
nand_chip->ecc.mode = NAND_ECC_HW;
diff --git a/include/asm-arm/arch-at91sam9/atmel_nand.h b/include/asm-arm/arch-at91sam9/atmel_nand.h
index 740ad5f772..0c0fbd0ee0 100644
--- a/include/asm-arm/arch-at91sam9/atmel_nand.h
+++ b/include/asm-arm/arch-at91sam9/atmel_nand.h
@@ -14,6 +14,7 @@ struct atmel_nand_data {
u8 ale; /* address line number connected to ALE */
u8 cle; /* address line number connected to CLE */
u8 bus_width_16; /* buswidth is 16 bit */
+ u8 ecc_mode; /* NAND_ECC_* */
};
#endif /* __ASM_ARCH_NAND_H */