diff --git a/board/at91sam9260ek/init.c b/board/at91sam9260ek/init.c index 5f35b0e..37c878e 100644 --- a/board/at91sam9260ek/init.c +++ b/board/at91sam9260ek/init.c @@ -44,6 +44,8 @@ .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 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 5488198..40b7826 100644 --- a/drivers/nand/atmel_nand.c +++ b/drivers/nand/atmel_nand.c @@ -399,10 +399,12 @@ 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 740ad5f..0c0fbd0 100644 --- a/include/asm-arm/arch-at91sam9/atmel_nand.h +++ b/include/asm-arm/arch-at91sam9/atmel_nand.h @@ -14,6 +14,7 @@ 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 */