Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: [MTD] [NAND] drivers/mtd/nand/nandsim.c: fix printk warnings [MTD] [NAND] Blackfin NFC Driver: Cleanup the error exit path of bf5xx_nand_probe function [MTD] [NAND] Blackfin NFC Driver: use standard dev_err() rather than printk() [MTD] [NAND] Blackfin NFC Driver: enable Blackfin nand HWECC support by default [MTD] [NAND] Blackfin NFC Driver: add proper devinit/devexit markings to probe/remove functions [MTD] [NAND] Blackfin NFC Driver: add support for the ECC layout the Blackfin bootrom uses [MTD] [NAND] Blackfin NFC Driver: fix bug - hw ecc calc by making sure we extract 11 bits from each register instead of 10 [MTD] [NAND] Blackfin NFC Driver: fix bug - do not clobber the status from the first 256 bytes if operating on 512 pages [MTD] [NAND] diskonchip.c fix sparse endian warnings [MTD] [NAND] drivers/mtd/nand/nandsim.c needs div64.h [JFFS2] Fix allocation of summary buffer Fix rename of at91_nand -> atmel_nand [MTD] [NOR] drivers/mtd/chips/jedec_probe.c: fix Am29DL800BB device ID [MTD] MTD_DEBUG always does compile-time typechecks [MTD] DataFlash: bugfix, binary page sizes now handled [MTD] [NAND] fsl_elbc_nand.c: fix printk warning [MTD] [NAND] nandsim: support random page read command [MTD] [NAND] fix subpage read for small page NAND
This commit is contained in:
commit
623fa579e6
39 changed files with 321 additions and 173 deletions
|
@ -170,7 +170,7 @@ CONFIG_MACH_AT91CAP9ADK=y
|
|||
# AT91 Board Options
|
||||
#
|
||||
CONFIG_MTD_AT91_DATAFLASH_CARD=y
|
||||
# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set
|
||||
|
||||
#
|
||||
# AT91 Feature Selections
|
||||
|
@ -442,7 +442,7 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -176,7 +176,7 @@ CONFIG_MACH_AT91SAM9260EK=y
|
|||
# AT91 Board Options
|
||||
#
|
||||
# CONFIG_MTD_AT91_DATAFLASH_CARD is not set
|
||||
# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set
|
||||
|
||||
#
|
||||
# AT91 Feature Selections
|
||||
|
|
|
@ -169,7 +169,7 @@ CONFIG_MACH_AT91SAM9261EK=y
|
|||
# AT91 Board Options
|
||||
#
|
||||
# CONFIG_MTD_AT91_DATAFLASH_CARD is not set
|
||||
# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set
|
||||
|
||||
#
|
||||
# AT91 Feature Selections
|
||||
|
@ -433,7 +433,7 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -169,7 +169,7 @@ CONFIG_MACH_AT91SAM9263EK=y
|
|||
# AT91 Board Options
|
||||
#
|
||||
CONFIG_MTD_AT91_DATAFLASH_CARD=y
|
||||
# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set
|
||||
|
||||
#
|
||||
# AT91 Feature Selections
|
||||
|
@ -428,7 +428,7 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -168,7 +168,7 @@ CONFIG_MACH_AT91SAM9G20EK=y
|
|||
# AT91 Board Options
|
||||
#
|
||||
# CONFIG_MTD_AT91_DATAFLASH_CARD is not set
|
||||
# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set
|
||||
|
||||
#
|
||||
# AT91 Feature Selections
|
||||
|
@ -442,10 +442,10 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_AT91_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_AT91_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -392,7 +392,7 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
|
|
@ -466,10 +466,10 @@ CONFIG_MTD_NAND_VERIFY_WRITE=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
# CONFIG_MTD_NAND_AT91_ECC_SOFT is not set
|
||||
CONFIG_MTD_NAND_AT91_ECC_HW=y
|
||||
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_SOFT is not set
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_HW=y
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -458,10 +458,10 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_AT91_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_AT91_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -429,7 +429,7 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
CONFIG_MTD_NAND_PLATFORM=y
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
|
|
@ -458,10 +458,10 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_AT91_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_AT91_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -450,10 +450,10 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_AT91_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_AT91_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
|
||||
# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND_PLATFORM is not set
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -421,7 +421,7 @@ CONFIG_MTD_NAND=y
|
|||
# CONFIG_MTD_NAND_ECC_SMC is not set
|
||||
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
CONFIG_MTD_NAND_AT91=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
CONFIG_MTD_NAND_PLATFORM=y
|
||||
# CONFIG_MTD_ALAUDA is not set
|
||||
|
|
|
@ -297,7 +297,7 @@ config MTD_AT91_DATAFLASH_CARD
|
|||
help
|
||||
Enable support for the DataFlash card.
|
||||
|
||||
config MTD_NAND_AT91_BUSWIDTH_16
|
||||
config MTD_NAND_ATMEL_BUSWIDTH_16
|
||||
bool "Enable 16-bit data bus interface to NAND flash"
|
||||
depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91CAP9ADK)
|
||||
help
|
||||
|
|
|
@ -376,7 +376,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|||
* NAND / SmartMedia
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
||||
static struct atmel_nand_data nand_data;
|
||||
|
||||
#define NAND_BASE AT91_CHIPSELECT_3
|
||||
|
|
|
@ -368,7 +368,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|||
* NAND / SmartMedia
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
||||
static struct atmel_nand_data nand_data;
|
||||
|
||||
#define NAND_BASE AT91_CHIPSELECT_3
|
||||
|
|
|
@ -283,7 +283,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|||
* NAND / SmartMedia
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
||||
static struct atmel_nand_data nand_data;
|
||||
|
||||
#define NAND_BASE AT91_CHIPSELECT_3
|
||||
|
|
|
@ -198,7 +198,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|||
* NAND / SmartMedia
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
||||
static struct atmel_nand_data nand_data;
|
||||
|
||||
#define NAND_BASE AT91_CHIPSELECT_3
|
||||
|
|
|
@ -352,7 +352,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|||
* NAND / SmartMedia
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
||||
static struct atmel_nand_data nand_data;
|
||||
|
||||
#define NAND_BASE AT91_CHIPSELECT_3
|
||||
|
|
|
@ -194,7 +194,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
|
|||
* NAND / SmartMedia
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
||||
static struct atmel_nand_data nand_data;
|
||||
|
||||
#define NAND_BASE AT91_CHIPSELECT_3
|
||||
|
|
|
@ -188,7 +188,7 @@ static struct atmel_nand_data __initdata cap9adk_nand_data = {
|
|||
// .rdy_pin = ... not connected
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -140,14 +140,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
|
|||
return ek_nand_partition;
|
||||
}
|
||||
|
||||
static struct at91_nand_data __initdata ek_nand_data = {
|
||||
static struct atmel_nand_data __initdata ek_nand_data = {
|
||||
.ale = 21,
|
||||
.cle = 22,
|
||||
// .det_pin = ... not connected
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -148,7 +148,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -185,7 +185,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -190,7 +190,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PC15,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -194,7 +194,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
|
|||
.rdy_pin = AT91_PIN_PA22,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -143,13 +143,13 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
|
|||
}
|
||||
|
||||
/* det_pin is not connected */
|
||||
static struct at91_nand_data __initdata ek_nand_data = {
|
||||
static struct atmel_nand_data __initdata ek_nand_data = {
|
||||
.ale = 21,
|
||||
.cle = 22,
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -114,14 +114,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
|
|||
return ek_nand_partition;
|
||||
}
|
||||
|
||||
static struct at91_nand_data __initdata ek_nand_data = {
|
||||
static struct atmel_nand_data __initdata ek_nand_data = {
|
||||
.ale = 21,
|
||||
.cle = 22,
|
||||
// .det_pin = ... not connected
|
||||
.rdy_pin = AT91_PIN_PC13,
|
||||
.enable_pin = AT91_PIN_PC14,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -127,14 +127,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
|
|||
return ek_nand_partition;
|
||||
}
|
||||
|
||||
static struct at91_nand_data __initdata ek_nand_data = {
|
||||
static struct atmel_nand_data __initdata ek_nand_data = {
|
||||
.ale = 21,
|
||||
.cle = 22,
|
||||
// .det_pin = ... not connected
|
||||
.rdy_pin = AT91_PIN_PA22,
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
|
||||
|
||||
/* AMD */
|
||||
#define AM29DL800BB 0x22C8
|
||||
#define AM29DL800BB 0x22CB
|
||||
#define AM29DL800BT 0x224A
|
||||
|
||||
#define AM29F800BB 0x2258
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/flash.h>
|
||||
|
||||
|
@ -487,9 +489,8 @@ add_dataflash(struct spi_device *spi, char *name,
|
|||
device->write = dataflash_write;
|
||||
device->priv = priv;
|
||||
|
||||
dev_info(&spi->dev, "%s (%d KBytes) pagesize %d bytes, "
|
||||
"erasesize %d bytes\n", name, device->size/1024,
|
||||
pagesize, pagesize * 8); /* 8 pages = 1 block */
|
||||
dev_info(&spi->dev, "%s (%d KBytes) pagesize %d bytes\n",
|
||||
name, DIV_ROUND_UP(device->size, 1024), pagesize);
|
||||
dev_set_drvdata(&spi->dev, priv);
|
||||
|
||||
if (mtd_has_partitions()) {
|
||||
|
@ -518,65 +519,57 @@ add_dataflash(struct spi_device *spi, char *name,
|
|||
return add_mtd_device(device) == 1 ? -ENODEV : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Detect and initialize DataFlash device:
|
||||
*
|
||||
* Device Density ID code #Pages PageSize Offset
|
||||
* AT45DB011B 1Mbit (128K) xx0011xx (0x0c) 512 264 9
|
||||
* AT45DB021B 2Mbit (256K) xx0101xx (0x14) 1024 264 9
|
||||
* AT45DB041B 4Mbit (512K) xx0111xx (0x1c) 2048 264 9
|
||||
* AT45DB081B 8Mbit (1M) xx1001xx (0x24) 4096 264 9
|
||||
* AT45DB0161B 16Mbit (2M) xx1011xx (0x2c) 4096 528 10
|
||||
* AT45DB0321B 32Mbit (4M) xx1101xx (0x34) 8192 528 10
|
||||
* AT45DB0642 64Mbit (8M) xx111xxx (0x3c) 8192 1056 11
|
||||
* AT45DB1282 128Mbit (16M) xx0100xx (0x10) 16384 1056 11
|
||||
*/
|
||||
|
||||
struct flash_info {
|
||||
char *name;
|
||||
|
||||
/* JEDEC id zero means "no ID" (most older chips); otherwise it has
|
||||
* a high byte of zero plus three data bytes: the manufacturer id,
|
||||
* then a two byte device id.
|
||||
/* JEDEC id has a high byte of zero plus three data bytes:
|
||||
* the manufacturer id, then a two byte device id.
|
||||
*/
|
||||
uint32_t jedec_id;
|
||||
|
||||
/* The size listed here is what works with OPCODE_SE, which isn't
|
||||
* necessarily called a "sector" by the vendor.
|
||||
*/
|
||||
/* The size listed here is what works with OP_ERASE_PAGE. */
|
||||
unsigned nr_pages;
|
||||
uint16_t pagesize;
|
||||
uint16_t pageoffset;
|
||||
|
||||
uint16_t flags;
|
||||
#define SUP_POW2PS 0x02
|
||||
#define IS_POW2PS 0x01
|
||||
#define SUP_POW2PS 0x0002 /* supports 2^N byte pages */
|
||||
#define IS_POW2PS 0x0001 /* uses 2^N byte pages */
|
||||
};
|
||||
|
||||
static struct flash_info __devinitdata dataflash_data [] = {
|
||||
|
||||
{ "at45db011d", 0x1f2200, 512, 264, 9, SUP_POW2PS},
|
||||
/*
|
||||
* NOTE: chips with SUP_POW2PS (rev D and up) need two entries,
|
||||
* one with IS_POW2PS and the other without. The entry with the
|
||||
* non-2^N byte page size can't name exact chip revisions without
|
||||
* losing backwards compatibility for cmdlinepart.
|
||||
*
|
||||
* These newer chips also support 128-byte security registers (with
|
||||
* 64 bytes one-time-programmable) and software write-protection.
|
||||
*/
|
||||
{ "AT45DB011B", 0x1f2200, 512, 264, 9, SUP_POW2PS},
|
||||
{ "at45db011d", 0x1f2200, 512, 256, 8, SUP_POW2PS | IS_POW2PS},
|
||||
|
||||
{ "at45db021d", 0x1f2300, 1024, 264, 9, SUP_POW2PS},
|
||||
{ "AT45DB021B", 0x1f2300, 1024, 264, 9, SUP_POW2PS},
|
||||
{ "at45db021d", 0x1f2300, 1024, 256, 8, SUP_POW2PS | IS_POW2PS},
|
||||
|
||||
{ "at45db041d", 0x1f2400, 2048, 264, 9, SUP_POW2PS},
|
||||
{ "AT45DB041x", 0x1f2400, 2048, 264, 9, SUP_POW2PS},
|
||||
{ "at45db041d", 0x1f2400, 2048, 256, 8, SUP_POW2PS | IS_POW2PS},
|
||||
|
||||
{ "at45db081d", 0x1f2500, 4096, 264, 9, SUP_POW2PS},
|
||||
{ "AT45DB081B", 0x1f2500, 4096, 264, 9, SUP_POW2PS},
|
||||
{ "at45db081d", 0x1f2500, 4096, 256, 8, SUP_POW2PS | IS_POW2PS},
|
||||
|
||||
{ "at45db161d", 0x1f2600, 4096, 528, 10, SUP_POW2PS},
|
||||
{ "AT45DB161x", 0x1f2600, 4096, 528, 10, SUP_POW2PS},
|
||||
{ "at45db161d", 0x1f2600, 4096, 512, 9, SUP_POW2PS | IS_POW2PS},
|
||||
|
||||
{ "at45db321c", 0x1f2700, 8192, 528, 10, },
|
||||
{ "AT45DB321x", 0x1f2700, 8192, 528, 10, 0}, /* rev C */
|
||||
|
||||
{ "at45db321d", 0x1f2701, 8192, 528, 10, SUP_POW2PS},
|
||||
{ "AT45DB321x", 0x1f2701, 8192, 528, 10, SUP_POW2PS},
|
||||
{ "at45db321d", 0x1f2701, 8192, 512, 9, SUP_POW2PS | IS_POW2PS},
|
||||
|
||||
{ "at45db641d", 0x1f2800, 8192, 1056, 11, SUP_POW2PS},
|
||||
{ "at45db641d", 0x1f2800, 8192, 1024, 10, SUP_POW2PS | IS_POW2PS},
|
||||
{ "AT45DB642x", 0x1f2800, 8192, 1056, 11, SUP_POW2PS},
|
||||
{ "at45db642d", 0x1f2800, 8192, 1024, 10, SUP_POW2PS | IS_POW2PS},
|
||||
};
|
||||
|
||||
static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
|
||||
|
@ -588,17 +581,23 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
|
|||
struct flash_info *info;
|
||||
int status;
|
||||
|
||||
|
||||
/* JEDEC also defines an optional "extended device information"
|
||||
* string for after vendor-specific data, after the three bytes
|
||||
* we use here. Supporting some chips might require using it.
|
||||
*
|
||||
* If the vendor ID isn't Atmel's (0x1f), assume this call failed.
|
||||
* That's not an error; only rev C and newer chips handle it, and
|
||||
* only Atmel sells these chips.
|
||||
*/
|
||||
tmp = spi_write_then_read(spi, &code, 1, id, 3);
|
||||
if (tmp < 0) {
|
||||
DEBUG(MTD_DEBUG_LEVEL0, "%s: error %d reading JEDEC ID\n",
|
||||
spi->dev.bus_id, tmp);
|
||||
return NULL;
|
||||
return ERR_PTR(tmp);
|
||||
}
|
||||
if (id[0] != 0x1f)
|
||||
return NULL;
|
||||
|
||||
jedec = id[0];
|
||||
jedec = jedec << 8;
|
||||
jedec |= id[1];
|
||||
|
@ -609,19 +608,53 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
|
|||
tmp < ARRAY_SIZE(dataflash_data);
|
||||
tmp++, info++) {
|
||||
if (info->jedec_id == jedec) {
|
||||
DEBUG(MTD_DEBUG_LEVEL1, "%s: OTP, sector protect%s\n",
|
||||
dev_name(&spi->dev),
|
||||
(info->flags & SUP_POW2PS)
|
||||
? ", binary pagesize" : ""
|
||||
);
|
||||
if (info->flags & SUP_POW2PS) {
|
||||
status = dataflash_status(spi);
|
||||
if (status & 0x1)
|
||||
/* return power of 2 pagesize */
|
||||
return ++info;
|
||||
else
|
||||
return info;
|
||||
if (status < 0) {
|
||||
DEBUG(MTD_DEBUG_LEVEL1,
|
||||
"%s: status error %d\n",
|
||||
dev_name(&spi->dev), status);
|
||||
return ERR_PTR(status);
|
||||
}
|
||||
if (status & 0x1) {
|
||||
if (info->flags & IS_POW2PS)
|
||||
return info;
|
||||
} else {
|
||||
if (!(info->flags & IS_POW2PS))
|
||||
return info;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Treat other chips as errors ... we won't know the right page
|
||||
* size (it might be binary) even when we can tell which density
|
||||
* class is involved (legacy chip id scheme).
|
||||
*/
|
||||
dev_warn(&spi->dev, "JEDEC id %06x not handled\n", jedec);
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
/*
|
||||
* Detect and initialize DataFlash device, using JEDEC IDs on newer chips
|
||||
* or else the ID code embedded in the status bits:
|
||||
*
|
||||
* Device Density ID code #Pages PageSize Offset
|
||||
* AT45DB011B 1Mbit (128K) xx0011xx (0x0c) 512 264 9
|
||||
* AT45DB021B 2Mbit (256K) xx0101xx (0x14) 1024 264 9
|
||||
* AT45DB041B 4Mbit (512K) xx0111xx (0x1c) 2048 264 9
|
||||
* AT45DB081B 8Mbit (1M) xx1001xx (0x24) 4096 264 9
|
||||
* AT45DB0161B 16Mbit (2M) xx1011xx (0x2c) 4096 528 10
|
||||
* AT45DB0321B 32Mbit (4M) xx1101xx (0x34) 8192 528 10
|
||||
* AT45DB0642 64Mbit (8M) xx111xxx (0x3c) 8192 1056 11
|
||||
* AT45DB1282 128Mbit (16M) xx0100xx (0x10) 16384 1056 11
|
||||
*/
|
||||
static int __devinit dataflash_probe(struct spi_device *spi)
|
||||
{
|
||||
int status;
|
||||
|
@ -632,14 +665,17 @@ static int __devinit dataflash_probe(struct spi_device *spi)
|
|||
* If it succeeds we know we have either a C or D part.
|
||||
* D will support power of 2 pagesize option.
|
||||
*/
|
||||
|
||||
info = jedec_probe(spi);
|
||||
|
||||
if (IS_ERR(info))
|
||||
return PTR_ERR(info);
|
||||
if (info != NULL)
|
||||
return add_dataflash(spi, info->name, info->nr_pages,
|
||||
info->pagesize, info->pageoffset);
|
||||
|
||||
|
||||
/*
|
||||
* Older chips support only legacy commands, identifing
|
||||
* capacity using bits in the status byte.
|
||||
*/
|
||||
status = dataflash_status(spi);
|
||||
if (status <= 0 || status == 0xff) {
|
||||
DEBUG(MTD_DEBUG_LEVEL1, "%s: status error %d\n",
|
||||
|
@ -661,13 +697,13 @@ static int __devinit dataflash_probe(struct spi_device *spi)
|
|||
status = add_dataflash(spi, "AT45DB021B", 1024, 264, 9);
|
||||
break;
|
||||
case 0x1c: /* 0 1 1 1 x x */
|
||||
status = add_dataflash(spi, "AT45DB041B", 2048, 264, 9);
|
||||
status = add_dataflash(spi, "AT45DB041x", 2048, 264, 9);
|
||||
break;
|
||||
case 0x24: /* 1 0 0 1 x x */
|
||||
status = add_dataflash(spi, "AT45DB081B", 4096, 264, 9);
|
||||
break;
|
||||
case 0x2c: /* 1 0 1 1 x x */
|
||||
status = add_dataflash(spi, "AT45DB161B", 4096, 528, 10);
|
||||
status = add_dataflash(spi, "AT45DB161x", 4096, 528, 10);
|
||||
break;
|
||||
case 0x34: /* 1 1 0 1 x x */
|
||||
status = add_dataflash(spi, "AT45DB321x", 8192, 528, 10);
|
||||
|
|
|
@ -104,11 +104,24 @@ config MTD_NAND_BF5XX
|
|||
|
||||
config MTD_NAND_BF5XX_HWECC
|
||||
bool "BF5XX NAND Hardware ECC"
|
||||
default y
|
||||
depends on MTD_NAND_BF5XX
|
||||
help
|
||||
Enable the use of the BF5XX's internal ECC generator when
|
||||
using NAND.
|
||||
|
||||
config MTD_NAND_BF5XX_BOOTROM_ECC
|
||||
bool "Use Blackfin BootROM ECC Layout"
|
||||
default n
|
||||
depends on MTD_NAND_BF5XX_HWECC
|
||||
help
|
||||
If you wish to modify NAND pages and allow the Blackfin on-chip
|
||||
BootROM to boot from them, say Y here. This is only necessary
|
||||
if you are booting U-Boot out of NAND and you wish to update
|
||||
U-Boot from Linux' userspace. Otherwise, you should say N here.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MTD_NAND_RTC_FROM4
|
||||
tristate "Renesas Flash ROM 4-slot interface board (FROM_BOARD4)"
|
||||
depends on SH_SOLUTION_ENGINE
|
||||
|
|
|
@ -91,6 +91,41 @@ static const unsigned short bfin_nfc_pin_req[] =
|
|||
P_NAND_ALE,
|
||||
0};
|
||||
|
||||
#ifdef CONFIG_MTD_NAND_BF5XX_BOOTROM_ECC
|
||||
static uint8_t bbt_pattern[] = { 0xff };
|
||||
|
||||
static struct nand_bbt_descr bootrom_bbt = {
|
||||
.options = 0,
|
||||
.offs = 63,
|
||||
.len = 1,
|
||||
.pattern = bbt_pattern,
|
||||
};
|
||||
|
||||
static struct nand_ecclayout bootrom_ecclayout = {
|
||||
.eccbytes = 24,
|
||||
.eccpos = {
|
||||
0x8 * 0, 0x8 * 0 + 1, 0x8 * 0 + 2,
|
||||
0x8 * 1, 0x8 * 1 + 1, 0x8 * 1 + 2,
|
||||
0x8 * 2, 0x8 * 2 + 1, 0x8 * 2 + 2,
|
||||
0x8 * 3, 0x8 * 3 + 1, 0x8 * 3 + 2,
|
||||
0x8 * 4, 0x8 * 4 + 1, 0x8 * 4 + 2,
|
||||
0x8 * 5, 0x8 * 5 + 1, 0x8 * 5 + 2,
|
||||
0x8 * 6, 0x8 * 6 + 1, 0x8 * 6 + 2,
|
||||
0x8 * 7, 0x8 * 7 + 1, 0x8 * 7 + 2
|
||||
},
|
||||
.oobfree = {
|
||||
{ 0x8 * 0 + 3, 5 },
|
||||
{ 0x8 * 1 + 3, 5 },
|
||||
{ 0x8 * 2 + 3, 5 },
|
||||
{ 0x8 * 3 + 3, 5 },
|
||||
{ 0x8 * 4 + 3, 5 },
|
||||
{ 0x8 * 5 + 3, 5 },
|
||||
{ 0x8 * 6 + 3, 5 },
|
||||
{ 0x8 * 7 + 3, 5 },
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Data structures for bf5xx nand flash controller driver
|
||||
*/
|
||||
|
@ -273,7 +308,7 @@ static int bf5xx_nand_correct_data(struct mtd_info *mtd, u_char *dat,
|
|||
dat += 256;
|
||||
read_ecc += 8;
|
||||
calc_ecc += 8;
|
||||
ret = bf5xx_nand_correct_data_256(mtd, dat, read_ecc, calc_ecc);
|
||||
ret |= bf5xx_nand_correct_data_256(mtd, dat, read_ecc, calc_ecc);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -298,7 +333,7 @@ static int bf5xx_nand_calculate_ecc(struct mtd_info *mtd,
|
|||
ecc0 = bfin_read_NFC_ECC0();
|
||||
ecc1 = bfin_read_NFC_ECC1();
|
||||
|
||||
code[0] = (ecc0 & 0x3FF) | ((ecc1 & 0x3FF) << 11);
|
||||
code[0] = (ecc0 & 0x7ff) | ((ecc1 & 0x7ff) << 11);
|
||||
|
||||
dev_dbg(info->device, "returning ecc 0x%08x\n", code[0]);
|
||||
|
||||
|
@ -310,7 +345,7 @@ static int bf5xx_nand_calculate_ecc(struct mtd_info *mtd,
|
|||
if (page_size == 512) {
|
||||
ecc0 = bfin_read_NFC_ECC2();
|
||||
ecc1 = bfin_read_NFC_ECC3();
|
||||
code[1] = (ecc0 & 0x3FF) | ((ecc1 & 0x3FF) << 11);
|
||||
code[1] = (ecc0 & 0x7ff) | ((ecc1 & 0x7ff) << 11);
|
||||
|
||||
/* second 3 bytes in ecc_code for second 256
|
||||
* bytes of 512 page size
|
||||
|
@ -514,7 +549,6 @@ static void bf5xx_nand_dma_write_buf(struct mtd_info *mtd,
|
|||
/*
|
||||
* System initialization functions
|
||||
*/
|
||||
|
||||
static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info)
|
||||
{
|
||||
int ret;
|
||||
|
@ -547,6 +581,13 @@ static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void bf5xx_nand_dma_remove(struct bf5xx_nand_info *info)
|
||||
{
|
||||
/* Free NFC DMA channel */
|
||||
if (hardware_ecc)
|
||||
free_dma(CH_NFC);
|
||||
}
|
||||
|
||||
/*
|
||||
* BF5XX NFC hardware initialization
|
||||
* - pin mux setup
|
||||
|
@ -605,7 +646,7 @@ static int bf5xx_nand_add_partition(struct bf5xx_nand_info *info)
|
|||
#endif
|
||||
}
|
||||
|
||||
static int bf5xx_nand_remove(struct platform_device *pdev)
|
||||
static int __devexit bf5xx_nand_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct bf5xx_nand_info *info = to_nand_info(pdev);
|
||||
struct mtd_info *mtd = NULL;
|
||||
|
@ -623,6 +664,7 @@ static int bf5xx_nand_remove(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
peripheral_free_list(bfin_nfc_pin_req);
|
||||
bf5xx_nand_dma_remove(info);
|
||||
|
||||
/* free the common resources */
|
||||
kfree(info);
|
||||
|
@ -638,7 +680,7 @@ static int bf5xx_nand_remove(struct platform_device *pdev)
|
|||
* it can allocate all necessary resources then calls the
|
||||
* nand layer to look for devices
|
||||
*/
|
||||
static int bf5xx_nand_probe(struct platform_device *pdev)
|
||||
static int __devinit bf5xx_nand_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct bf5xx_nand_platform *plat = to_nand_plat(pdev);
|
||||
struct bf5xx_nand_info *info = NULL;
|
||||
|
@ -648,22 +690,21 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
|
|||
|
||||
dev_dbg(&pdev->dev, "(%p)\n", pdev);
|
||||
|
||||
if (peripheral_request_list(bfin_nfc_pin_req, DRV_NAME)) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": Requesting Peripherals failed\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (!plat) {
|
||||
dev_err(&pdev->dev, "no platform specific information\n");
|
||||
goto exit_error;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (peripheral_request_list(bfin_nfc_pin_req, DRV_NAME)) {
|
||||
dev_err(&pdev->dev, "requesting Peripherals failed\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (info == NULL) {
|
||||
dev_err(&pdev->dev, "no memory for flash info\n");
|
||||
err = -ENOMEM;
|
||||
goto exit_error;
|
||||
goto out_err_kzalloc;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, info);
|
||||
|
@ -707,11 +748,16 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
|
|||
|
||||
/* initialise the hardware */
|
||||
err = bf5xx_nand_hw_init(info);
|
||||
if (err != 0)
|
||||
goto exit_error;
|
||||
if (err)
|
||||
goto out_err_hw_init;
|
||||
|
||||
/* setup hardware ECC data struct */
|
||||
if (hardware_ecc) {
|
||||
#ifdef CONFIG_MTD_NAND_BF5XX_BOOTROM_ECC
|
||||
chip->badblock_pattern = &bootrom_bbt;
|
||||
chip->ecc.layout = &bootrom_ecclayout;
|
||||
#endif
|
||||
|
||||
if (plat->page_size == NFC_PG_SIZE_256) {
|
||||
chip->ecc.bytes = 3;
|
||||
chip->ecc.size = 256;
|
||||
|
@ -733,7 +779,7 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
|
|||
/* scan hardware nand chip and setup mtd info data struct */
|
||||
if (nand_scan(mtd, 1)) {
|
||||
err = -ENXIO;
|
||||
goto exit_error;
|
||||
goto out_err_nand_scan;
|
||||
}
|
||||
|
||||
/* add NAND partition */
|
||||
|
@ -742,11 +788,14 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
|
|||
dev_dbg(&pdev->dev, "initialised ok\n");
|
||||
return 0;
|
||||
|
||||
exit_error:
|
||||
bf5xx_nand_remove(pdev);
|
||||
out_err_nand_scan:
|
||||
bf5xx_nand_dma_remove(info);
|
||||
out_err_hw_init:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(info);
|
||||
out_err_kzalloc:
|
||||
peripheral_free_list(bfin_nfc_pin_req);
|
||||
|
||||
if (err == 0)
|
||||
err = -EINVAL;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -775,7 +824,7 @@ static int bf5xx_nand_resume(struct platform_device *dev)
|
|||
/* driver device registration */
|
||||
static struct platform_driver bf5xx_nand_driver = {
|
||||
.probe = bf5xx_nand_probe,
|
||||
.remove = bf5xx_nand_remove,
|
||||
.remove = __devexit_p(bf5xx_nand_remove),
|
||||
.suspend = bf5xx_nand_suspend,
|
||||
.resume = bf5xx_nand_resume,
|
||||
.driver = {
|
||||
|
|
|
@ -1125,9 +1125,9 @@ static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partitio
|
|||
goto out;
|
||||
mh = (struct NFTLMediaHeader *)buf;
|
||||
|
||||
mh->NumEraseUnits = le16_to_cpu(mh->NumEraseUnits);
|
||||
mh->FirstPhysicalEUN = le16_to_cpu(mh->FirstPhysicalEUN);
|
||||
mh->FormattedSize = le32_to_cpu(mh->FormattedSize);
|
||||
le16_to_cpus(&mh->NumEraseUnits);
|
||||
le16_to_cpus(&mh->FirstPhysicalEUN);
|
||||
le32_to_cpus(&mh->FormattedSize);
|
||||
|
||||
printk(KERN_INFO " DataOrgID = %s\n"
|
||||
" NumEraseUnits = %d\n"
|
||||
|
@ -1235,12 +1235,12 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti
|
|||
doc->mh1_page = doc->mh0_page + (4096 >> this->page_shift);
|
||||
mh = (struct INFTLMediaHeader *)buf;
|
||||
|
||||
mh->NoOfBootImageBlocks = le32_to_cpu(mh->NoOfBootImageBlocks);
|
||||
mh->NoOfBinaryPartitions = le32_to_cpu(mh->NoOfBinaryPartitions);
|
||||
mh->NoOfBDTLPartitions = le32_to_cpu(mh->NoOfBDTLPartitions);
|
||||
mh->BlockMultiplierBits = le32_to_cpu(mh->BlockMultiplierBits);
|
||||
mh->FormatFlags = le32_to_cpu(mh->FormatFlags);
|
||||
mh->PercentUsed = le32_to_cpu(mh->PercentUsed);
|
||||
le32_to_cpus(&mh->NoOfBootImageBlocks);
|
||||
le32_to_cpus(&mh->NoOfBinaryPartitions);
|
||||
le32_to_cpus(&mh->NoOfBDTLPartitions);
|
||||
le32_to_cpus(&mh->BlockMultiplierBits);
|
||||
le32_to_cpus(&mh->FormatFlags);
|
||||
le32_to_cpus(&mh->PercentUsed);
|
||||
|
||||
printk(KERN_INFO " bootRecordID = %s\n"
|
||||
" NoOfBootImageBlocks = %d\n"
|
||||
|
@ -1277,12 +1277,12 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti
|
|||
/* Scan the partitions */
|
||||
for (i = 0; (i < 4); i++) {
|
||||
ip = &(mh->Partitions[i]);
|
||||
ip->virtualUnits = le32_to_cpu(ip->virtualUnits);
|
||||
ip->firstUnit = le32_to_cpu(ip->firstUnit);
|
||||
ip->lastUnit = le32_to_cpu(ip->lastUnit);
|
||||
ip->flags = le32_to_cpu(ip->flags);
|
||||
ip->spareUnits = le32_to_cpu(ip->spareUnits);
|
||||
ip->Reserved0 = le32_to_cpu(ip->Reserved0);
|
||||
le32_to_cpus(&ip->virtualUnits);
|
||||
le32_to_cpus(&ip->firstUnit);
|
||||
le32_to_cpus(&ip->lastUnit);
|
||||
le32_to_cpus(&ip->flags);
|
||||
le32_to_cpus(&ip->spareUnits);
|
||||
le32_to_cpus(&ip->Reserved0);
|
||||
|
||||
printk(KERN_INFO " PARTITION[%d] ->\n"
|
||||
" virtualUnits = %d\n"
|
||||
|
|
|
@ -887,7 +887,7 @@ static int __devinit fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl,
|
|||
goto err;
|
||||
}
|
||||
|
||||
priv->mtd.name = kasprintf(GFP_KERNEL, "%x.flash", res.start);
|
||||
priv->mtd.name = kasprintf(GFP_KERNEL, "%x.flash", (unsigned)res.start);
|
||||
if (!priv->mtd.name) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <asm/div64.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/string.h>
|
||||
|
@ -207,13 +208,16 @@ MODULE_PARM_DESC(overridesize, "Specifies the NAND Flash size overriding the I
|
|||
#define STATE_CMD_READID 0x0000000A /* read ID */
|
||||
#define STATE_CMD_ERASE2 0x0000000B /* sector erase second command */
|
||||
#define STATE_CMD_RESET 0x0000000C /* reset */
|
||||
#define STATE_CMD_RNDOUT 0x0000000D /* random output command */
|
||||
#define STATE_CMD_RNDOUTSTART 0x0000000E /* random output start command */
|
||||
#define STATE_CMD_MASK 0x0000000F /* command states mask */
|
||||
|
||||
/* After an address is input, the simulator goes to one of these states */
|
||||
#define STATE_ADDR_PAGE 0x00000010 /* full (row, column) address is accepted */
|
||||
#define STATE_ADDR_SEC 0x00000020 /* sector address was accepted */
|
||||
#define STATE_ADDR_ZERO 0x00000030 /* one byte zero address was accepted */
|
||||
#define STATE_ADDR_MASK 0x00000030 /* address states mask */
|
||||
#define STATE_ADDR_COLUMN 0x00000030 /* column address was accepted */
|
||||
#define STATE_ADDR_ZERO 0x00000040 /* one byte zero address was accepted */
|
||||
#define STATE_ADDR_MASK 0x00000070 /* address states mask */
|
||||
|
||||
/* Durind data input/output the simulator is in these states */
|
||||
#define STATE_DATAIN 0x00000100 /* waiting for data input */
|
||||
|
@ -240,7 +244,7 @@ MODULE_PARM_DESC(overridesize, "Specifies the NAND Flash size overriding the I
|
|||
#define ACTION_OOBOFF 0x00600000 /* add to address OOB offset */
|
||||
#define ACTION_MASK 0x00700000 /* action mask */
|
||||
|
||||
#define NS_OPER_NUM 12 /* Number of operations supported by the simulator */
|
||||
#define NS_OPER_NUM 13 /* Number of operations supported by the simulator */
|
||||
#define NS_OPER_STATES 6 /* Maximum number of states in operation */
|
||||
|
||||
#define OPT_ANY 0xFFFFFFFF /* any chip supports this operation */
|
||||
|
@ -373,7 +377,10 @@ static struct nandsim_operations {
|
|||
{OPT_ANY, {STATE_CMD_READID, STATE_ADDR_ZERO, STATE_DATAOUT_ID, STATE_READY}},
|
||||
/* Large page devices read page */
|
||||
{OPT_LARGEPAGE, {STATE_CMD_READ0, STATE_ADDR_PAGE, STATE_CMD_READSTART | ACTION_CPY,
|
||||
STATE_DATAOUT, STATE_READY}}
|
||||
STATE_DATAOUT, STATE_READY}},
|
||||
/* Large page devices random page read */
|
||||
{OPT_LARGEPAGE, {STATE_CMD_RNDOUT, STATE_ADDR_COLUMN, STATE_CMD_RNDOUTSTART | ACTION_CPY,
|
||||
STATE_DATAOUT, STATE_READY}},
|
||||
};
|
||||
|
||||
struct weak_block {
|
||||
|
@ -579,7 +586,8 @@ static int init_nandsim(struct mtd_info *mtd)
|
|||
if (ns->busw == 16)
|
||||
NS_WARN("16-bit flashes support wasn't tested\n");
|
||||
|
||||
printk("flash size: %llu MiB\n", ns->geom.totsz >> 20);
|
||||
printk("flash size: %llu MiB\n",
|
||||
(unsigned long long)ns->geom.totsz >> 20);
|
||||
printk("page size: %u bytes\n", ns->geom.pgsz);
|
||||
printk("OOB area size: %u bytes\n", ns->geom.oobsz);
|
||||
printk("sector size: %u KiB\n", ns->geom.secsz >> 10);
|
||||
|
@ -588,8 +596,9 @@ static int init_nandsim(struct mtd_info *mtd)
|
|||
printk("bus width: %u\n", ns->busw);
|
||||
printk("bits in sector size: %u\n", ns->geom.secshift);
|
||||
printk("bits in page size: %u\n", ns->geom.pgshift);
|
||||
printk("bits in OOB size: %u\n", ns->geom.oobshift);
|
||||
printk("flash size with OOB: %llu KiB\n", ns->geom.totszoob >> 10);
|
||||
printk("bits in OOB size: %u\n", ns->geom.oobshift);
|
||||
printk("flash size with OOB: %llu KiB\n",
|
||||
(unsigned long long)ns->geom.totszoob >> 10);
|
||||
printk("page address bytes: %u\n", ns->geom.pgaddrbytes);
|
||||
printk("sector address bytes: %u\n", ns->geom.secaddrbytes);
|
||||
printk("options: %#x\n", ns->options);
|
||||
|
@ -937,12 +946,18 @@ static char *get_state_name(uint32_t state)
|
|||
return "STATE_CMD_ERASE2";
|
||||
case STATE_CMD_RESET:
|
||||
return "STATE_CMD_RESET";
|
||||
case STATE_CMD_RNDOUT:
|
||||
return "STATE_CMD_RNDOUT";
|
||||
case STATE_CMD_RNDOUTSTART:
|
||||
return "STATE_CMD_RNDOUTSTART";
|
||||
case STATE_ADDR_PAGE:
|
||||
return "STATE_ADDR_PAGE";
|
||||
case STATE_ADDR_SEC:
|
||||
return "STATE_ADDR_SEC";
|
||||
case STATE_ADDR_ZERO:
|
||||
return "STATE_ADDR_ZERO";
|
||||
case STATE_ADDR_COLUMN:
|
||||
return "STATE_ADDR_COLUMN";
|
||||
case STATE_DATAIN:
|
||||
return "STATE_DATAIN";
|
||||
case STATE_DATAOUT:
|
||||
|
@ -973,6 +988,7 @@ static int check_command(int cmd)
|
|||
switch (cmd) {
|
||||
|
||||
case NAND_CMD_READ0:
|
||||
case NAND_CMD_READ1:
|
||||
case NAND_CMD_READSTART:
|
||||
case NAND_CMD_PAGEPROG:
|
||||
case NAND_CMD_READOOB:
|
||||
|
@ -982,7 +998,8 @@ static int check_command(int cmd)
|
|||
case NAND_CMD_READID:
|
||||
case NAND_CMD_ERASE2:
|
||||
case NAND_CMD_RESET:
|
||||
case NAND_CMD_READ1:
|
||||
case NAND_CMD_RNDOUT:
|
||||
case NAND_CMD_RNDOUTSTART:
|
||||
return 0;
|
||||
|
||||
case NAND_CMD_STATUS_MULTI:
|
||||
|
@ -1021,6 +1038,10 @@ static uint32_t get_state_by_command(unsigned command)
|
|||
return STATE_CMD_ERASE2;
|
||||
case NAND_CMD_RESET:
|
||||
return STATE_CMD_RESET;
|
||||
case NAND_CMD_RNDOUT:
|
||||
return STATE_CMD_RNDOUT;
|
||||
case NAND_CMD_RNDOUTSTART:
|
||||
return STATE_CMD_RNDOUTSTART;
|
||||
}
|
||||
|
||||
NS_ERR("get_state_by_command: unknown command, BUG\n");
|
||||
|
@ -1582,6 +1603,11 @@ static void switch_state(struct nandsim *ns)
|
|||
ns->regs.num = 1;
|
||||
break;
|
||||
|
||||
case STATE_ADDR_COLUMN:
|
||||
/* Column address is always 2 bytes */
|
||||
ns->regs.num = ns->geom.pgaddrbytes - ns->geom.secaddrbytes;
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_ERR("switch_state: BUG! unknown address state\n");
|
||||
}
|
||||
|
@ -1693,15 +1719,21 @@ static void ns_nand_write_byte(struct mtd_info *mtd, u_char byte)
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Chip might still be in STATE_DATAOUT
|
||||
* (if OPT_AUTOINCR feature is supported), STATE_DATAOUT_STATUS or
|
||||
* STATE_DATAOUT_STATUS_M state. If so, switch state.
|
||||
*/
|
||||
/* Check that the command byte is correct */
|
||||
if (check_command(byte)) {
|
||||
NS_ERR("write_byte: unknown command %#x\n", (uint)byte);
|
||||
return;
|
||||
}
|
||||
|
||||
if (NS_STATE(ns->state) == STATE_DATAOUT_STATUS
|
||||
|| NS_STATE(ns->state) == STATE_DATAOUT_STATUS_M
|
||||
|| ((ns->options & OPT_AUTOINCR) && NS_STATE(ns->state) == STATE_DATAOUT))
|
||||
|| NS_STATE(ns->state) == STATE_DATAOUT) {
|
||||
int row = ns->regs.row;
|
||||
|
||||
switch_state(ns);
|
||||
if (byte == NAND_CMD_RNDOUT)
|
||||
ns->regs.row = row;
|
||||
}
|
||||
|
||||
/* Check if chip is expecting command */
|
||||
if (NS_STATE(ns->nxstate) != STATE_UNKNOWN && !(ns->nxstate & STATE_CMD_MASK)) {
|
||||
|
@ -1715,12 +1747,6 @@ static void ns_nand_write_byte(struct mtd_info *mtd, u_char byte)
|
|||
switch_to_ready_state(ns, NS_STATUS_FAILED(ns));
|
||||
}
|
||||
|
||||
/* Check that the command byte is correct */
|
||||
if (check_command(byte)) {
|
||||
NS_ERR("write_byte: unknown command %#x\n", (uint)byte);
|
||||
return;
|
||||
}
|
||||
|
||||
NS_DBG("command byte corresponding to %s state accepted\n",
|
||||
get_state_name(get_state_by_command(byte)));
|
||||
ns->regs.command = byte;
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
int jffs2_sum_init(struct jffs2_sb_info *c)
|
||||
{
|
||||
uint32_t sum_size = max_t(uint32_t, c->sector_size, MAX_SUMMARY_SIZE);
|
||||
|
||||
c->summary = kzalloc(sizeof(struct jffs2_summary), GFP_KERNEL);
|
||||
|
||||
if (!c->summary) {
|
||||
|
@ -30,7 +32,7 @@ int jffs2_sum_init(struct jffs2_sb_info *c)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
c->summary->sum_buf = vmalloc(c->sector_size);
|
||||
c->summary->sum_buf = kmalloc(sum_size, GFP_KERNEL);
|
||||
|
||||
if (!c->summary->sum_buf) {
|
||||
JFFS2_WARNING("Can't allocate buffer for writing out summary information!\n");
|
||||
|
@ -49,7 +51,7 @@ void jffs2_sum_exit(struct jffs2_sb_info *c)
|
|||
|
||||
jffs2_sum_disable_collecting(c->summary);
|
||||
|
||||
vfree(c->summary->sum_buf);
|
||||
kfree(c->summary->sum_buf);
|
||||
c->summary->sum_buf = NULL;
|
||||
|
||||
kfree(c->summary);
|
||||
|
@ -665,7 +667,7 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
|
|||
/* Write summary data to flash - helper function for jffs2_sum_write_sumnode() */
|
||||
|
||||
static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
|
||||
uint32_t infosize, uint32_t datasize, int padsize)
|
||||
uint32_t infosize, uint32_t datasize, int padsize)
|
||||
{
|
||||
struct jffs2_raw_summary isum;
|
||||
union jffs2_sum_mem *temp;
|
||||
|
@ -676,6 +678,26 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock
|
|||
int ret;
|
||||
size_t retlen;
|
||||
|
||||
if (padsize + datasize > MAX_SUMMARY_SIZE) {
|
||||
/* It won't fit in the buffer. Abort summary for this jeb */
|
||||
jffs2_sum_disable_collecting(c->summary);
|
||||
|
||||
JFFS2_WARNING("Summary too big (%d data, %d pad) in eraseblock at %08x\n",
|
||||
datasize, padsize, jeb->offset);
|
||||
/* Non-fatal */
|
||||
return 0;
|
||||
}
|
||||
/* Is there enough space for summary? */
|
||||
if (padsize < 0) {
|
||||
/* don't try to write out summary for this jeb */
|
||||
jffs2_sum_disable_collecting(c->summary);
|
||||
|
||||
JFFS2_WARNING("Not enough space for summary, padsize = %d\n",
|
||||
padsize);
|
||||
/* Non-fatal */
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(c->summary->sum_buf, 0xff, datasize);
|
||||
memset(&isum, 0, sizeof(isum));
|
||||
|
||||
|
@ -821,7 +843,7 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
|
|||
{
|
||||
int datasize, infosize, padsize;
|
||||
struct jffs2_eraseblock *jeb;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
dbg_summary("called\n");
|
||||
|
||||
|
@ -841,16 +863,6 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
|
|||
infosize += padsize;
|
||||
datasize += padsize;
|
||||
|
||||
/* Is there enough space for summary? */
|
||||
if (padsize < 0) {
|
||||
/* don't try to write out summary for this jeb */
|
||||
jffs2_sum_disable_collecting(c->summary);
|
||||
|
||||
JFFS2_WARNING("Not enough space for summary, padsize = %d\n", padsize);
|
||||
spin_lock(&c->erase_completion_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = jffs2_sum_write_data(c, jeb, infosize, datasize, padsize);
|
||||
spin_lock(&c->erase_completion_lock);
|
||||
return ret;
|
||||
|
|
|
@ -13,6 +13,12 @@
|
|||
#ifndef JFFS2_SUMMARY_H
|
||||
#define JFFS2_SUMMARY_H
|
||||
|
||||
/* Limit summary size to 64KiB so that we can kmalloc it. If the summary
|
||||
is larger than that, we have to just ditch it and avoid using summary
|
||||
for the eraseblock in question... and it probably doesn't hurt us much
|
||||
anyway. */
|
||||
#define MAX_SUMMARY_SIZE 65536
|
||||
|
||||
#include <linux/uio.h>
|
||||
#include <linux/jffs2.h>
|
||||
|
||||
|
|
|
@ -272,7 +272,11 @@ static inline void mtd_erase_callback(struct erase_info *instr)
|
|||
printk(KERN_INFO args); \
|
||||
} while(0)
|
||||
#else /* CONFIG_MTD_DEBUG */
|
||||
#define DEBUG(n, args...) do { } while(0)
|
||||
#define DEBUG(n, args...) \
|
||||
do { \
|
||||
if (0) \
|
||||
printk(KERN_INFO args); \
|
||||
} while(0)
|
||||
|
||||
#endif /* CONFIG_MTD_DEBUG */
|
||||
|
||||
|
|
|
@ -177,7 +177,9 @@ typedef enum {
|
|||
#define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING))
|
||||
#define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))
|
||||
#define NAND_HAS_COPYBACK(chip) ((chip->options & NAND_COPYBACK))
|
||||
#define NAND_SUBPAGE_READ(chip) ((chip->ecc.mode == NAND_ECC_SOFT))
|
||||
/* Large page NAND with SOFT_ECC should support subpage reads */
|
||||
#define NAND_SUBPAGE_READ(chip) ((chip->ecc.mode == NAND_ECC_SOFT) \
|
||||
&& (chip->page_shift > 9))
|
||||
|
||||
/* Mask to zero out the chip options, which come from the id table */
|
||||
#define NAND_CHIPOPTIONS_MSK (0x0000ffff & ~NAND_NO_AUTOINCR)
|
||||
|
|
Loading…
Reference in a new issue