This patchset renames at91_nand to atmel_nand and makes it usable on
AVR32. It also fixes a couple of bugs in the process.
The patchset also adds support for the ATSTK1006 daughterboard which
is currently in production, and is what I used for testing. It's
basically the same as ATSTK1002 except that it has more RAM (handled
by u-boot) and NAND flash (handled by patch #8) on board.
This patchset hopefully makes the at32_nand driver (which doesn't
support hardware ECC) obsolete. It has never been submitted for
inclusion in mainline, and I don't intend to do so. Please use this
driver instead.
I saw a lot of ECC errors when trying to use hardware ECC, but I
suspect that might be because I tested software ECC first, which uses
an incompatible oob layout.
Haavard
Haavard Skinnemoen (8):
at91_nand: Convert to generic GPIO API
rename at91_nand -> atmel_nand: file names and Kconfig
rename at91_nand -> atmel_nand: internal symbols
atmel_nand: Clean up and fix probe() error path
avr32: move hsmc_init() to core_initcall
avr32: atmel_nand platform code for AT32AP700x
atmel_nand: make available on AVR32
avr32: Add support for ATSTK1006
arch/arm/mach-at91/at91cap9_devices.c | 8 +-
arch/arm/mach-at91/at91rm9200_devices.c | 8 +-
arch/arm/mach-at91/at91sam9260_devices.c | 8 +-
arch/arm/mach-at91/at91sam9261_devices.c | 12 +-
arch/arm/mach-at91/at91sam9263_devices.c | 8 +-
arch/arm/mach-at91/at91sam9rl_devices.c | 12 +-
arch/arm/mach-at91/board-cam60.c | 2 +-
arch/arm/mach-at91/board-cap9adk.c | 2 +-
arch/arm/mach-at91/board-dk.c | 2 +-
arch/arm/mach-at91/board-kb9202.c | 2 +-
arch/arm/mach-at91/board-sam9-l9260.c | 2 +-
arch/arm/mach-at91/board-sam9260ek.c | 2 +-
arch/arm/mach-at91/board-sam9261ek.c | 2 +-
arch/arm/mach-at91/board-sam9263ek.c | ...No point in using an AT91-specific GPIO API when the generic API works
just as well.
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
---
drivers/mtd/nand/at91_nand.c | 12 +++++-------
1 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/mtd/nand/at91_nand.c b/drivers/mtd/nand/at91_nand.c
index 0adb287..2dcaeea 100644
--- a/drivers/mtd/nand/at91_nand.c
+++ b/drivers/mtd/nand/at91_nand.c
@@ -31,12 +31,10 @@
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
+#include <asm/gpio.h>
#include <asm/io.h>
-#include <asm/sizes.h>
-#include <asm/hardware.h>
#include <asm/arch/board.h>
-#include <asm/arch/gpio.h>
#ifdef CONFIG_MTD_NAND_AT91_ECC_HW
#define hard_ecc 1
@@ -99,7 +97,7 @@ struct at91_nand_host {
static void at91_nand_enable(struct at91_nand_host *host)
{
if (host->board->enable_pin)
- at91_set_gpio_value(host->board->enable_pin, 0);
+ gpio_set_value(host->board->enable_pin, 0);
}
/*
@@ -108,7 +106,7 @@ static void at91_nand_enable(struct at91_nand_host *host)
static void at91_nand_disable(struct at91_nand_host *host)
{
if (host->board->enable_pin)
- at91_set_gpio_value(host->board->enable_pin, 1);
+ gpio_set_value(host->board->enable_pin, 1);
}
/*
@@ -142,7 +140,7 @@ static int at91_nand_device_ready(struct mtd_info *mtd)
struct nand_chip *nand_chip = mtd->priv;
struct at91_nand_host *host = nand_chip->priv;
- return at91_get_gpio_value(host->board->rdy_pin);
+ return gpio_get_value(host->board->rdy_pin);
}
/*
@@ -447,7 +445,7 @@ static int __init at91_nand_probe(struct platform_device *pdev)
at91_nand_enable(host);
if (host->board->det_pin) {
- if (at91_get_gpio_value(host->board->det_pin)) {
+ if (gpio_get_value(host->board->det_pin)) {
printk ("No SmartMedia card inserted.\n");
res = ENXIO;
goto out;
--
1.5.5.1
--
The AT91 NAND driver needs just a few tiny modifications to work on
AVR32 as well. Rename it atmel_nand to reflect this.
Also move the ECC register definitions into drivers/mtd/nand since they
are only useful to the atmel_nand driver, and get rid of the useless
filename at the top of each file.
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
---
drivers/mtd/nand/Kconfig | 17 +++++++++--------
drivers/mtd/nand/Makefile | 2 +-
drivers/mtd/nand/{at91_nand.c => atmel_nand.c} | 10 ++++------
.../mtd/nand/atmel_nand_ecc.h | 6 ++----
4 files changed, 16 insertions(+), 19 deletions(-)
rename drivers/mtd/nand/{at91_nand.c => atmel_nand.c} (98%)
rename include/asm-arm/arch-at91/at91_ecc.h => drivers/mtd/nand/atmel_nand_ecc.h (93%)
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index 5076faf..7bbf386 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -272,7 +272,7 @@ config MTD_NAND_CS553X
If you say "m", the module will be called "cs553x_nand.ko".
-config MTD_NAND_AT91
+config MTD_NAND_ATMEL
bool "Support for NAND Flash / SmartMedia on AT91"
depends on ARCH_AT91
help
@@ -280,14 +280,15 @@ config MTD_NAND_AT91
on Atmel AT91 processors.
choice
prompt "ECC management for NAND Flash / SmartMedia on AT91"
- depends on MTD_NAND_AT91
+ depends on MTD_NAND_ATMEL
-config MTD_NAND_AT91_ECC_HW
+config MTD_NAND_ATMEL_ECC_HW
bool "Hardware ECC"
depends on ARCH_AT91SAM9263 || ARCH_AT91SAM9260
help
- Uses hardware ECC provided by the at91sam9260/at91sam9263 chip
- instead of software ECC.
+ Use hardware ECC instead of software ECC when the chip
+ supports it.
+
The hardware ECC controller is capable of single bit error
correction and 2-bit random detection per page.
@@ -297,16 +298,16 @@ config MTD_NAND_AT91_ECC_HW
If unsure, say Y
-config MTD_NAND_AT91_ECC_SOFT
+config ...This is basically s/at91_nand/atmel_nand/g with some manual inspection.
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
---
arch/arm/mach-at91/at91cap9_devices.c | 8 +-
arch/arm/mach-at91/at91rm9200_devices.c | 8 +-
arch/arm/mach-at91/at91sam9260_devices.c | 8 +-
arch/arm/mach-at91/at91sam9261_devices.c | 12 +-
arch/arm/mach-at91/at91sam9263_devices.c | 8 +-
arch/arm/mach-at91/at91sam9rl_devices.c | 12 +-
arch/arm/mach-at91/board-cam60.c | 2 +-
arch/arm/mach-at91/board-cap9adk.c | 2 +-
arch/arm/mach-at91/board-dk.c | 2 +-
arch/arm/mach-at91/board-kb9202.c | 2 +-
arch/arm/mach-at91/board-sam9-l9260.c | 2 +-
arch/arm/mach-at91/board-sam9260ek.c | 2 +-
arch/arm/mach-at91/board-sam9261ek.c | 2 +-
arch/arm/mach-at91/board-sam9263ek.c | 2 +-
arch/arm/mach-at91/board-sam9rlek.c | 2 +-
arch/arm/mach-at91/board-yl-9200.c | 2 +-
drivers/mtd/nand/atmel_nand.c | 152 +++++++++++++++---------------
drivers/mtd/nand/atmel_nand_ecc.h | 34 ++++----
include/asm-arm/arch-at91/board.h | 4 +-
19 files changed, 133 insertions(+), 133 deletions(-)
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c
index be52674..fe5148e 100644
--- a/arch/arm/mach-at91/at91cap9_devices.c
+++ b/arch/arm/mach-at91/at91cap9_devices.c
@@ -278,7 +278,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
* -------------------------------------------------------------------- */
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
-static struct at91_nand_data nand_data;
+static struct atmel_nand_data nand_data;
#define NAND_BASE AT91_CHIPSELECT_3
@@ -296,7 +296,7 @@ static struct resource nand_resources[] = {
};
static struct platform_device at91cap9_nand_device = {
- .name = "at91_nand",
+ .name = "atmel_nand",
.id = -1,
...This fixes several bugs in the atmel_nand_probe() error path, including
at least one memory leak.
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
---
drivers/mtd/nand/atmel_nand.c | 41 ++++++++++++++++++++++-------------------
1 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index 675a82c..325ce29 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -371,6 +371,12 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
int num_partitions = 0;
#endif
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!mem) {
+ printk(KERN_ERR "atmel_nand: can't get I/O resource mem\n");
+ return -ENXIO;
+ }
+
/* Allocate memory for the device structure (and zero it) */
host = kzalloc(sizeof(struct atmel_nand_host), GFP_KERNEL);
if (!host) {
@@ -378,17 +384,11 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
return -ENOMEM;
}
- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!mem) {
- printk(KERN_ERR "atmel_nand: can't get I/O resource mem\n");
- return -ENXIO;
- }
-
host->io_base = ioremap(mem->start, mem->end - mem->start + 1);
if (host->io_base == NULL) {
printk(KERN_ERR "atmel_nand: ioremap failed\n");
- kfree(host);
- return -EIO;
+ res = -EIO;
+ goto err_nand_ioremap;
}
mtd = &host->mtd;
@@ -446,14 +446,14 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
if (gpio_get_value(host->board->det_pin)) {
printk ("No SmartMedia card inserted.\n");
res = ENXIO;
- goto out;
+ goto err_no_card;
}
}
/* first scan to find the device and get the page size */
if (nand_scan_ident(mtd, 1)) {
res = -ENXIO;
- goto out;
+ goto err_scan_ident;
}
if (nand_chip->ecc.mode == NAND_ECC_HW_SYNDROME) {
@@ -498,7 +498,7 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
/* second phase scan */
...There is an issue with the current at91_nand driver here.
The driver currently ioremap()'s the ECC controller's registers, but
on the AT91 the ECC controller is part of the System Peripherals and
so it is already mapped at startup.
I don't think it can/should be remapped twice.
The AT91 patch (on maxim.org.za) current does:
regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
....
host->ecc = (void __force __iomem *) (AT91_VA_BASE_SYS - AT91_BASE_SYS);
host->ecc += regs->start;
instead of the ioremap(). But this is not portable to the AVR32.
Regards,
Andrew Victor
--
On Sat, 7 Jun 2008 18:08:07 +0200 I don't see why that's really a problem -- it may get a different How about sticking a "void __iomem *ecc_regs" field in struct atmel_nand_data and allow platforms to specify a pre-mapped pointer? Then the driver can do if (host->board->ecc_regs) host->ecc = host->board->ecc_regs; else if (regs) host->ecc = ioremap(regs->start, regs->end - regs->start + 1); if (hard_ecc && !host->ecc) printk("Hardware ECC not available\n"); Right? I think we use a similar trick in the atmel_serial driver too. Haavard --
Hmm, it reminds me something : It may be the best solution indeed. richard. --
> This is basically s/at91_nand/atmel_nand/g with some manual inspection. Acked-by: Andrew Victor <linux@maxim.org.za> --
Acked-by: Andrew Victor <linux@maxim.org.za> --
Acked-by: Andrew Victor <linux@maxim.org.za> --
