mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
f75622f467
commit
bf4289cba0
|
@ -138,6 +138,7 @@ static struct atmel_nand_data __initdata afeb9260_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.bus_width_16 = 0,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = afeb9260_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(afeb9260_nand_partition),
|
||||
.det_pin = -EINVAL,
|
||||
|
|
|
@ -140,6 +140,7 @@ static struct atmel_nand_data __initdata cam60_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PA9,
|
||||
.enable_pin = AT91_PIN_PA7,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = cam60_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(cam60_nand_partition),
|
||||
};
|
||||
|
|
|
@ -117,6 +117,7 @@ static struct atmel_nand_data __initdata cpu9krea_nand_data = {
|
|||
.enable_pin = AT91_PIN_PC14,
|
||||
.bus_width_16 = 0,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MACH_CPU9260
|
||||
|
|
|
@ -47,6 +47,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC8,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
};
|
||||
|
||||
static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
||||
|
|
|
@ -108,6 +108,7 @@ static struct atmel_nand_data __initdata kb9202_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC29,
|
||||
.enable_pin = AT91_PIN_PC28,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = kb9202_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(kb9202_nand_partition),
|
||||
};
|
||||
|
|
|
@ -190,6 +190,7 @@ static struct atmel_nand_data __initdata neocore926_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PB19,
|
||||
.rdy_pin_active_low = 1,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = neocore926_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(neocore926_nand_partition),
|
||||
.det_pin = -EINVAL,
|
||||
|
|
|
@ -138,6 +138,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -150,6 +150,7 @@ static struct atmel_nand_data __initdata dk_nand_data = {
|
|||
.det_pin = AT91_PIN_PB1,
|
||||
.rdy_pin = AT91_PIN_PC2,
|
||||
.enable_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = dk_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(dk_nand_partition),
|
||||
};
|
||||
|
|
|
@ -139,6 +139,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -181,6 +181,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -187,6 +187,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC15,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -187,6 +187,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PA22,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -166,6 +166,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -148,6 +148,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC8,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -94,6 +94,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PD17,
|
||||
.enable_pin = AT91_PIN_PB6,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -110,6 +110,7 @@ static struct atmel_nand_data __initdata snapper9260_nand_data = {
|
|||
.bus_width_16 = 0,
|
||||
.enable_pin = -EINVAL,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
};
|
||||
|
||||
static struct sam9_smc_config __initdata snapper9260_nand_smc_config = {
|
||||
|
|
|
@ -86,6 +86,7 @@ static struct atmel_nand_data __initdata nand_data = {
|
|||
.enable_pin = AT91_PIN_PC14,
|
||||
.bus_width_16 = 0,
|
||||
.det_pin = -EINVAL,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
};
|
||||
|
||||
static struct sam9_smc_config __initdata nand_smc_config = {
|
||||
|
|
|
@ -198,6 +198,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PA22,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = ek_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(ek_nand_partition),
|
||||
};
|
||||
|
|
|
@ -182,6 +182,7 @@ static struct atmel_nand_data __initdata yl9200_nand_data = {
|
|||
.det_pin = -EINVAL,
|
||||
.rdy_pin = AT91_PIN_PC14, /* R/!B (Sheet10) */
|
||||
.enable_pin = AT91_PIN_PC15, /* !CE (Sheet10) */
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = yl9200_nand_partition,
|
||||
.num_parts = ARRAY_SIZE(yl9200_nand_partition),
|
||||
};
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include <sound/atmel-ac97c.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/platform_data/macb.h>
|
||||
#include <linux/platform_data/atmel.h>
|
||||
|
||||
/* USB Device */
|
||||
struct at91_udc_data {
|
||||
|
@ -98,20 +99,6 @@ extern void __init at91_add_device_usbh(struct at91_usbh_data *data);
|
|||
extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);
|
||||
extern void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data);
|
||||
|
||||
/* NAND / SmartMedia */
|
||||
struct atmel_nand_data {
|
||||
int enable_pin; /* chip enable */
|
||||
int det_pin; /* card detect */
|
||||
int rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
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 correction_cap; /* PMECC correction capability */
|
||||
u16 sector_size; /* Sector size for PMECC */
|
||||
struct mtd_partition *parts;
|
||||
unsigned int num_parts;
|
||||
};
|
||||
extern void __init at91_add_device_nand(struct atmel_nand_data *data);
|
||||
|
||||
/* I2C*/
|
||||
|
|
|
@ -97,6 +97,7 @@ static struct atmel_nand_data atngw100mkii_nand_data __initdata = {
|
|||
.rdy_pin = GPIO_PIN_PB(28),
|
||||
.enable_pin = GPIO_PIN_PE(23),
|
||||
.bus_width_16 = true,
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = nand_partitions,
|
||||
.num_parts = ARRAY_SIZE(nand_partitions),
|
||||
};
|
||||
|
|
|
@ -95,6 +95,7 @@ static struct atmel_nand_data atstk1006_nand_data __initdata = {
|
|||
.ale = 22,
|
||||
.rdy_pin = GPIO_PIN_PB(30),
|
||||
.enable_pin = GPIO_PIN_PB(29),
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = nand_partitions,
|
||||
.num_parts = ARRAY_SIZE(num_partitions),
|
||||
};
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/platform_data/macb.h>
|
||||
#include <linux/platform_data/atmel_nand.h>
|
||||
|
||||
#define GPIO_PIN_NONE (-1)
|
||||
|
||||
|
@ -116,18 +117,6 @@ struct platform_device *
|
|||
at32_add_device_cf(unsigned int id, unsigned int extint,
|
||||
struct cf_platform_data *data);
|
||||
|
||||
/* NAND / SmartMedia */
|
||||
struct atmel_nand_data {
|
||||
int enable_pin; /* chip enable */
|
||||
int det_pin; /* card detect */
|
||||
int rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
u8 ale; /* address line number connected to ALE */
|
||||
u8 cle; /* address line number connected to CLE */
|
||||
u8 bus_width_16; /* buswidth is 16 bit */
|
||||
struct mtd_partition *parts;
|
||||
unsigned int num_parts;
|
||||
};
|
||||
struct platform_device *
|
||||
at32_add_device_nand(unsigned int id, struct atmel_nand_data *data);
|
||||
|
||||
|
|
|
@ -34,22 +34,10 @@
|
|||
#include <linux/dmaengine.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/platform_data/atmel.h>
|
||||
|
||||
#include <mach/board.h>
|
||||
#include <mach/cpu.h>
|
||||
|
||||
#ifdef CONFIG_MTD_NAND_ATMEL_ECC_HW
|
||||
#define hard_ecc 1
|
||||
#else
|
||||
#define hard_ecc 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MTD_NAND_ATMEL_ECC_NONE
|
||||
#define no_ecc 1
|
||||
#else
|
||||
#define no_ecc 0
|
||||
#endif
|
||||
|
||||
static int use_dma = 1;
|
||||
module_param(use_dma, int, 0);
|
||||
|
||||
|
@ -532,23 +520,22 @@ static int __init atmel_nand_probe(struct platform_device *pdev)
|
|||
if (gpio_is_valid(host->board->rdy_pin))
|
||||
nand_chip->dev_ready = atmel_nand_device_ready;
|
||||
|
||||
nand_chip->ecc.mode = host->board->ecc_mode;
|
||||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (!regs && hard_ecc) {
|
||||
if (!regs && nand_chip->ecc.mode == NAND_ECC_HW) {
|
||||
printk(KERN_ERR "atmel_nand: can't get I/O resource "
|
||||
"regs\nFalling back on software ECC\n");
|
||||
nand_chip->ecc.mode = NAND_ECC_SOFT;
|
||||
}
|
||||
|
||||
nand_chip->ecc.mode = NAND_ECC_SOFT; /* enable ECC */
|
||||
if (no_ecc)
|
||||
nand_chip->ecc.mode = NAND_ECC_NONE;
|
||||
if (hard_ecc && regs) {
|
||||
if (nand_chip->ecc.mode == NAND_ECC_HW) {
|
||||
host->ecc = ioremap(regs->start, resource_size(regs));
|
||||
if (host->ecc == NULL) {
|
||||
printk(KERN_ERR "atmel_nand: ioremap failed\n");
|
||||
res = -EIO;
|
||||
goto err_ecc_ioremap;
|
||||
}
|
||||
nand_chip->ecc.mode = NAND_ECC_HW;
|
||||
nand_chip->ecc.calculate = atmel_nand_calculate;
|
||||
nand_chip->ecc.correct = atmel_nand_correct;
|
||||
nand_chip->ecc.hwctl = atmel_nand_hwctl;
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* atmel platform data
|
||||
*
|
||||
* GPL v2 Only
|
||||
*/
|
||||
|
||||
#ifndef __ATMEL_NAND_H__
|
||||
#define __ATMEL_NAND_H__
|
||||
|
||||
#include <linux/mtd/nand.h>
|
||||
|
||||
/* NAND / SmartMedia */
|
||||
struct atmel_nand_data {
|
||||
int enable_pin; /* chip enable */
|
||||
int det_pin; /* card detect */
|
||||
int rdy_pin; /* ready/busy */
|
||||
u8 rdy_pin_active_low; /* rdy_pin value is inverted */
|
||||
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; /* ecc mode */
|
||||
struct mtd_partition *parts;
|
||||
unsigned int num_parts;
|
||||
};
|
||||
|
||||
#endif /* __ATMEL_NAND_H__ */
|
Loading…
Reference in New Issue