Commit 623fa579 authored by Linus Torvalds's avatar Linus Torvalds

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
parents d65f5c58 e4c094a5
...@@ -170,7 +170,7 @@ CONFIG_MACH_AT91CAP9ADK=y ...@@ -170,7 +170,7 @@ CONFIG_MACH_AT91CAP9ADK=y
# AT91 Board Options # AT91 Board Options
# #
CONFIG_MTD_AT91_DATAFLASH_CARD=y 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 # AT91 Feature Selections
...@@ -442,7 +442,7 @@ CONFIG_MTD_NAND=y ...@@ -442,7 +442,7 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # 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_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -176,7 +176,7 @@ CONFIG_MACH_AT91SAM9260EK=y ...@@ -176,7 +176,7 @@ CONFIG_MACH_AT91SAM9260EK=y
# AT91 Board Options # AT91 Board Options
# #
# CONFIG_MTD_AT91_DATAFLASH_CARD is not set # 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 # AT91 Feature Selections
......
...@@ -169,7 +169,7 @@ CONFIG_MACH_AT91SAM9261EK=y ...@@ -169,7 +169,7 @@ CONFIG_MACH_AT91SAM9261EK=y
# AT91 Board Options # AT91 Board Options
# #
# CONFIG_MTD_AT91_DATAFLASH_CARD is not set # 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 # AT91 Feature Selections
...@@ -433,7 +433,7 @@ CONFIG_MTD_NAND=y ...@@ -433,7 +433,7 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # 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_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -169,7 +169,7 @@ CONFIG_MACH_AT91SAM9263EK=y ...@@ -169,7 +169,7 @@ CONFIG_MACH_AT91SAM9263EK=y
# AT91 Board Options # AT91 Board Options
# #
CONFIG_MTD_AT91_DATAFLASH_CARD=y 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 # AT91 Feature Selections
...@@ -428,7 +428,7 @@ CONFIG_MTD_NAND=y ...@@ -428,7 +428,7 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # 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_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -168,7 +168,7 @@ CONFIG_MACH_AT91SAM9G20EK=y ...@@ -168,7 +168,7 @@ CONFIG_MACH_AT91SAM9G20EK=y
# AT91 Board Options # AT91 Board Options
# #
# CONFIG_MTD_AT91_DATAFLASH_CARD is not set # 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 # AT91 Feature Selections
...@@ -442,10 +442,10 @@ CONFIG_MTD_NAND=y ...@@ -442,10 +442,10 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DISKONCHIP is not set
CONFIG_MTD_NAND_AT91=y CONFIG_MTD_NAND_ATMEL=y
CONFIG_MTD_NAND_AT91_ECC_SOFT=y CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
# CONFIG_MTD_NAND_AT91_ECC_HW is not set # CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set # CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
# CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -392,7 +392,7 @@ CONFIG_MTD_NAND=y ...@@ -392,7 +392,7 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # 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_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ONENAND is not set # CONFIG_MTD_ONENAND is not set
......
...@@ -466,10 +466,10 @@ CONFIG_MTD_NAND_VERIFY_WRITE=y ...@@ -466,10 +466,10 @@ CONFIG_MTD_NAND_VERIFY_WRITE=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DISKONCHIP is not set
CONFIG_MTD_NAND_AT91=y CONFIG_MTD_NAND_ATMEL=y
# CONFIG_MTD_NAND_AT91_ECC_SOFT is not set # CONFIG_MTD_NAND_ATMEL_ECC_SOFT is not set
CONFIG_MTD_NAND_AT91_ECC_HW=y CONFIG_MTD_NAND_ATMEL_ECC_HW=y
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set # CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
# CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -458,10 +458,10 @@ CONFIG_MTD_NAND=y ...@@ -458,10 +458,10 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DISKONCHIP is not set
CONFIG_MTD_NAND_AT91=y CONFIG_MTD_NAND_ATMEL=y
CONFIG_MTD_NAND_AT91_ECC_SOFT=y CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
# CONFIG_MTD_NAND_AT91_ECC_HW is not set # CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set # CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
# CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -429,7 +429,7 @@ CONFIG_MTD_NAND=y ...@@ -429,7 +429,7 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # 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_NANDSIM is not set
CONFIG_MTD_NAND_PLATFORM=y CONFIG_MTD_NAND_PLATFORM=y
# CONFIG_MTD_ONENAND is not set # CONFIG_MTD_ONENAND is not set
......
...@@ -458,10 +458,10 @@ CONFIG_MTD_NAND=y ...@@ -458,10 +458,10 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DISKONCHIP is not set
CONFIG_MTD_NAND_AT91=y CONFIG_MTD_NAND_ATMEL=y
CONFIG_MTD_NAND_AT91_ECC_SOFT=y CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
# CONFIG_MTD_NAND_AT91_ECC_HW is not set # CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set # CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
# CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -450,10 +450,10 @@ CONFIG_MTD_NAND=y ...@@ -450,10 +450,10 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_DISKONCHIP is not set
CONFIG_MTD_NAND_AT91=y CONFIG_MTD_NAND_ATMEL=y
CONFIG_MTD_NAND_AT91_ECC_SOFT=y CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
# CONFIG_MTD_NAND_AT91_ECC_HW is not set # CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
# CONFIG_MTD_NAND_AT91_ECC_NONE is not set # CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
# CONFIG_MTD_NAND_NANDSIM is not set # CONFIG_MTD_NAND_NANDSIM is not set
# CONFIG_MTD_NAND_PLATFORM is not set # CONFIG_MTD_NAND_PLATFORM is not set
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -421,7 +421,7 @@ CONFIG_MTD_NAND=y ...@@ -421,7 +421,7 @@ CONFIG_MTD_NAND=y
# CONFIG_MTD_NAND_ECC_SMC is not set # CONFIG_MTD_NAND_ECC_SMC is not set
# CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_IDS=y 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_NANDSIM is not set
CONFIG_MTD_NAND_PLATFORM=y CONFIG_MTD_NAND_PLATFORM=y
# CONFIG_MTD_ALAUDA is not set # CONFIG_MTD_ALAUDA is not set
......
...@@ -297,7 +297,7 @@ config MTD_AT91_DATAFLASH_CARD ...@@ -297,7 +297,7 @@ config MTD_AT91_DATAFLASH_CARD
help help
Enable support for the DataFlash card. 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" bool "Enable 16-bit data bus interface to NAND flash"
depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91CAP9ADK) depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91CAP9ADK)
help help
......
...@@ -376,7 +376,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} ...@@ -376,7 +376,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
* NAND / SmartMedia * 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; static struct atmel_nand_data nand_data;
#define NAND_BASE AT91_CHIPSELECT_3 #define NAND_BASE AT91_CHIPSELECT_3
......
...@@ -368,7 +368,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} ...@@ -368,7 +368,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
* NAND / SmartMedia * 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; static struct atmel_nand_data nand_data;
#define NAND_BASE AT91_CHIPSELECT_3 #define NAND_BASE AT91_CHIPSELECT_3
......
...@@ -283,7 +283,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} ...@@ -283,7 +283,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
* NAND / SmartMedia * 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; static struct atmel_nand_data nand_data;
#define NAND_BASE AT91_CHIPSELECT_3 #define NAND_BASE AT91_CHIPSELECT_3
......
...@@ -198,7 +198,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} ...@@ -198,7 +198,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
* NAND / SmartMedia * 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; static struct atmel_nand_data nand_data;
#define NAND_BASE AT91_CHIPSELECT_3 #define NAND_BASE AT91_CHIPSELECT_3
......
...@@ -352,7 +352,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} ...@@ -352,7 +352,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
* NAND / SmartMedia * 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; static struct atmel_nand_data nand_data;
#define NAND_BASE AT91_CHIPSELECT_3 #define NAND_BASE AT91_CHIPSELECT_3
......
...@@ -194,7 +194,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} ...@@ -194,7 +194,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
* NAND / SmartMedia * 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; static struct atmel_nand_data nand_data;
#define NAND_BASE AT91_CHIPSELECT_3 #define NAND_BASE AT91_CHIPSELECT_3
......
...@@ -188,7 +188,7 @@ static struct atmel_nand_data __initdata cap9adk_nand_data = { ...@@ -188,7 +188,7 @@ static struct atmel_nand_data __initdata cap9adk_nand_data = {
// .rdy_pin = ... not connected // .rdy_pin = ... not connected
.enable_pin = AT91_PIN_PD15, .enable_pin = AT91_PIN_PD15,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -140,14 +140,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio ...@@ -140,14 +140,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
return ek_nand_partition; return ek_nand_partition;
} }
static struct at91_nand_data __initdata ek_nand_data = { static struct atmel_nand_data __initdata ek_nand_data = {
.ale = 21, .ale = 21,
.cle = 22, .cle = 22,
// .det_pin = ... not connected // .det_pin = ... not connected
.rdy_pin = AT91_PIN_PC13, .rdy_pin = AT91_PIN_PC13,
.enable_pin = AT91_PIN_PC14, .enable_pin = AT91_PIN_PC14,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -148,7 +148,7 @@ static struct atmel_nand_data __initdata ek_nand_data = { ...@@ -148,7 +148,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
.rdy_pin = AT91_PIN_PC13, .rdy_pin = AT91_PIN_PC13,
.enable_pin = AT91_PIN_PC14, .enable_pin = AT91_PIN_PC14,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -185,7 +185,7 @@ static struct atmel_nand_data __initdata ek_nand_data = { ...@@ -185,7 +185,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
.rdy_pin = AT91_PIN_PC13, .rdy_pin = AT91_PIN_PC13,
.enable_pin = AT91_PIN_PC14, .enable_pin = AT91_PIN_PC14,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -190,7 +190,7 @@ static struct atmel_nand_data __initdata ek_nand_data = { ...@@ -190,7 +190,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
.rdy_pin = AT91_PIN_PC15, .rdy_pin = AT91_PIN_PC15,
.enable_pin = AT91_PIN_PC14, .enable_pin = AT91_PIN_PC14,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -194,7 +194,7 @@ static struct atmel_nand_data __initdata ek_nand_data = { ...@@ -194,7 +194,7 @@ static struct atmel_nand_data __initdata ek_nand_data = {
.rdy_pin = AT91_PIN_PA22, .rdy_pin = AT91_PIN_PA22,
.enable_pin = AT91_PIN_PD15, .enable_pin = AT91_PIN_PD15,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -143,13 +143,13 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio ...@@ -143,13 +143,13 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
} }
/* det_pin is not connected */ /* 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, .ale = 21,
.cle = 22, .cle = 22,
.rdy_pin = AT91_PIN_PC13, .rdy_pin = AT91_PIN_PC13,
.enable_pin = AT91_PIN_PC14, .enable_pin = AT91_PIN_PC14,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -114,14 +114,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio ...@@ -114,14 +114,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
return ek_nand_partition; return ek_nand_partition;
} }
static struct at91_nand_data __initdata ek_nand_data = { static struct atmel_nand_data __initdata ek_nand_data = {
.ale = 21, .ale = 21,
.cle = 22, .cle = 22,
// .det_pin = ... not connected // .det_pin = ... not connected
.rdy_pin = AT91_PIN_PC13, .rdy_pin = AT91_PIN_PC13,
.enable_pin = AT91_PIN_PC14, .enable_pin = AT91_PIN_PC14,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -127,14 +127,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio ...@@ -127,14 +127,14 @@ static struct mtd_partition * __init nand_partitions(int size, int *num_partitio
return ek_nand_partition; return ek_nand_partition;
} }
static struct at91_nand_data __initdata ek_nand_data = { static struct atmel_nand_data __initdata ek_nand_data = {
.ale = 21, .ale = 21,
.cle = 22, .cle = 22,
// .det_pin = ... not connected // .det_pin = ... not connected
.rdy_pin = AT91_PIN_PA22, .rdy_pin = AT91_PIN_PA22,
.enable_pin = AT91_PIN_PD15, .enable_pin = AT91_PIN_PD15,
.partition_info = nand_partitions, .partition_info = nand_partitions,
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) #if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
.bus_width_16 = 1, .bus_width_16 = 1,
#else #else
.bus_width_16 = 0, .bus_width_16 = 0,
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
/* AMD */ /* AMD */
#define AM29DL800BB 0x22C8 #define AM29DL800BB 0x22CB
#define AM29DL800BT 0x224A #define AM29DL800BT 0x224A
#define AM29F800BB 0x2258 #define AM29F800BB 0x2258
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/err.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/flash.h> #include <linux/spi/flash.h>
...@@ -487,9 +489,8 @@ add_dataflash(struct spi_device *spi, char *name, ...@@ -487,9 +489,8 @@ add_dataflash(struct spi_device *spi, char *name,
device->write = dataflash_write; device->write = dataflash_write;
device->priv = priv; device->priv = priv;
dev_info(&spi->dev, "%s (%d KBytes) pagesize %d bytes, " dev_info(&spi->dev, "%s (%d KBytes) pagesize %d bytes\n",
"erasesize %d bytes\n", name, device->size/1024, name, DIV_ROUND_UP(device->size, 1024), pagesize);
pagesize, pagesize * 8); /* 8 pages = 1 block */
dev_set_drvdata(&spi->dev, priv); dev_set_drvdata(&spi->dev, priv);
if (mtd_has_partitions()) { if (mtd_has_partitions()) {
...@@ -518,65 +519,57 @@ add_dataflash(struct spi_device *spi, char *name, ...@@ -518,65 +519,57 @@ add_dataflash(struct spi_device *spi, char *name,
return add_mtd_device(device) == 1 ? -ENODEV : 0; 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 { struct flash_info {
char *name; char *name;
/* JEDEC id zero means "no ID" (most older chips); otherwise it has /* JEDEC id has a high byte of zero plus three data bytes:
* a high byte of zero plus three data bytes: the manufacturer id, * the manufacturer id, then a two byte device id.
* then a two byte device id.
*/ */
uint32_t jedec_id; uint32_t jedec_id;
/* The size listed here is what works with OPCODE_SE, which isn't /* The size listed here is what works with OP_ERASE_PAGE. */
* necessarily called a "sector" by the vendor.
*/
unsigned nr_pages; unsigned nr_pages;
uint16_t pagesize; uint16_t pagesize;
uint16_t pageoffset; uint16_t pageoffset;
uint16_t flags; uint16_t flags;
#define SUP_POW2PS 0x02 #define SUP_POW2PS 0x0002 /* supports 2^N byte pages */
#define IS_POW2PS 0x01 #define IS_POW2PS 0x0001 /* uses 2^N byte pages */
}; };
static struct flash_info __devinitdata dataflash_data [] = { 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}, { "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}, { "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}, { "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}, { "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}, { "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}, { "at45db321d", 0x1f2701, 8192, 512, 9, SUP_POW2PS | IS_POW2PS},
{ "at45db641d", 0x1f2800, 8192, 1056, 11, SUP_POW2PS}, { "AT45DB642x", 0x1f2800, 8192, 1056, 11, SUP_POW2PS},
{ "at45db641d", 0x1f2800, 8192, 1024, 10, SUP_POW2PS | IS_POW2PS}, { "at45db642d", 0x1f2800, 8192, 1024, 10, SUP_POW2PS | IS_POW2PS},
}; };
static struct flash_info *__devinit jedec_probe(struct spi_device *spi) 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) ...@@ -588,17 +581,23 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
struct flash_info *info; struct flash_info *info;
int status; int status;
/* JEDEC also defines an optional "extended device information" /* JEDEC also defines an optional "extended device information"
* string for after vendor-specific data, after the three bytes * string for after vendor-specific data, after the three bytes
* we use here. Supporting some chips might require using it. * 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); tmp = spi_write_then_read(spi, &code, 1, id, 3);
if (tmp < 0) { if (tmp < 0) {
DEBUG(MTD_DEBUG_LEVEL0, "%s: error %d reading JEDEC ID\n", DEBUG(MTD_DEBUG_LEVEL0, "%s: error %d reading JEDEC ID\n",
spi->dev.bus_id, tmp); spi->dev.bus_id, tmp);
return NULL; return ERR_PTR(tmp);
} }
if (id[0] != 0x1f)
return NULL;
jedec = id[0]; jedec = id[0];
jedec = jedec << 8; jedec = jedec << 8;
jedec |= id[1]; jedec |= id[1];
...@@ -609,19 +608,53 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi) ...@@ -609,19 +608,53 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
tmp < ARRAY_SIZE(dataflash_data); tmp < ARRAY_SIZE(dataflash_data);
tmp++, info++) { tmp++, info++) {
if (info->jedec_id == jedec) { 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) { if (info->flags & SUP_POW2PS) {
status = dataflash_status(spi); status = dataflash_status(spi);
if (status & 0x1) if (status < 0) {
/* return power of 2 pagesize */ DEBUG(MTD_DEBUG_LEVEL1,
return ++info; "%s: status error %d\n",
else dev_name(&spi->dev), status);
return info; 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) static int __devinit dataflash_probe(struct spi_device *spi)
{ {
int status; int status;
...@@ -632,14 +665,17 @@ static int __devinit dataflash_probe(struct spi_device *spi) ...@@ -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. * If it succeeds we know we have either a C or D part.
* D will support power of 2 pagesize option. * D will support power of 2 pagesize option.
*/ */
info = jedec_probe(spi); info = jedec_probe(spi);
if (IS_ERR(info))
return PTR_ERR(info);
if (info != NULL) if (info != NULL)
return add_dataflash(spi, info->name, info->nr_pages, return add_dataflash(spi, info->name, info->nr_pages,
info->pagesize, info->pageoffset); info->pagesize, info->pageoffset);
/*
* Older chips support only legacy commands, identifing
* capacity using bits in the status byte.
*/
status = dataflash_status(spi); status = dataflash_status(spi);
if (status <= 0 || status == 0xff) { if (status <= 0 || status == 0xff) {
DEBUG(MTD_DEBUG_LEVEL1, "%s: status error %d\n", DEBUG(MTD_DEBUG_LEVEL1, "%s: status error %d\n",
...@@ -661,13 +697,13 @@ static int __devinit dataflash_probe(struct spi_device *spi) ...@@ -661,13 +697,13 @@ static int __devinit dataflash_probe(struct spi_device *spi)
status = add_dataflash(spi, "AT45DB021B", 1024, 264, 9); status = add_dataflash(spi, "AT45DB021B", 1024, 264, 9);
break; break;
case 0x1c: /* 0 1 1 1 x x */ 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; break;
case 0x24: /* 1 0 0 1 x x */ case 0x24: /* 1 0 0 1 x x */
status = add_dataflash(spi, "AT45DB081B", 4096, 264, 9); status = add_dataflash(spi, "AT45DB081B", 4096, 264, 9);
break; break;
case 0x2c: /* 1 0 1 1 x x */ 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; break;
case 0x34: /* 1 1 0 1 x x */ case 0x34: /* 1 1 0 1 x x */
status = add_dataflash(spi, "AT45DB321x", 8192, 528, 10); status = add_dataflash(spi, "AT45DB321x", 8192, 528, 10);
......
...@@ -104,11 +104,24 @@ config MTD_NAND_BF5XX ...@@ -104,11 +104,24 @@ config MTD_NAND_BF5XX
config MTD_NAND_BF5XX_HWECC config MTD_NAND_BF5XX_HWECC
bool "BF5XX NAND Hardware ECC" bool "BF5XX NAND Hardware ECC"
default y
depends on MTD_NAND_BF5XX depends on MTD_NAND_BF5XX
help help
Enable the use of the BF5XX's internal ECC generator when Enable the use of the BF5XX's internal ECC generator when
using NAND. 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 config MTD_NAND_RTC_FROM4
tristate "Renesas Flash ROM 4-slot interface board (FROM_BOARD4)" tristate "Renesas Flash ROM 4-slot interface board (FROM_BOARD4)"
depends on SH_SOLUTION_ENGINE depends on SH_SOLUTION_ENGINE
......
...@@ -91,6 +91,41 @@ static const unsigned short bfin_nfc_pin_req[] = ...@@ -91,6 +91,41 @@ static const unsigned short bfin_nfc_pin_req[] =
P_NAND_ALE, P_NAND_ALE,
0}; 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 * 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, ...@@ -273,7 +308,7 @@ static int bf5xx_nand_correct_data(struct mtd_info *mtd, u_char *dat,
dat += 256; dat += 256;
read_ecc += 8; read_ecc += 8;
calc_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; return ret;
...@@ -298,7 +333,7 @@ static int bf5xx_nand_calculate_ecc(struct mtd_info *mtd, ...@@ -298,7 +333,7 @@ static int bf5xx_nand_calculate_ecc(struct mtd_info *mtd,
ecc0 = bfin_read_NFC_ECC0(); ecc0 = bfin_read_NFC_ECC0();
ecc1 = bfin_read_NFC_ECC1(); 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]); 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, ...@@ -310,7 +345,7 @@ static int bf5xx_nand_calculate_ecc(struct mtd_info *mtd,
if (page_size == 512) { if (page_size == 512) {
ecc0 = bfin_read_NFC_ECC2(); ecc0 = bfin_read_NFC_ECC2();
ecc1 = bfin_read_NFC_ECC3(); 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 /* second 3 bytes in ecc_code for second 256
* bytes of 512 page size * bytes of 512 page size
...@@ -514,7 +549,6 @@ static void bf5xx_nand_dma_write_buf(struct mtd_info *mtd, ...@@ -514,7 +549,6 @@ static void bf5xx_nand_dma_write_buf(struct mtd_info *mtd,
/* /*
* System initialization functions * System initialization functions
*/ */
static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info) static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info)
{ {
int ret; int ret;
...@@ -547,6 +581,13 @@ static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info) ...@@ -547,6 +581,13 @@ static int bf5xx_nand_dma_init(struct bf5xx_nand_info *info)
return 0; 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 * BF5XX NFC hardware initialization
* - pin mux setup * - pin mux setup
...@@ -605,7 +646,7 @@ static int bf5xx_nand_add_partition(struct bf5xx_nand_info *info) ...@@ -605,7 +646,7 @@ static int bf5xx_nand_add_partition(struct bf5xx_nand_info *info)
#endif #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 bf5xx_nand_info *info = to_nand_info(pdev);
struct mtd_info *mtd = NULL; struct mtd_info *mtd = NULL;
...@@ -623,6 +664,7 @@ static int bf5xx_nand_remove(struct platform_device *pdev) ...@@ -623,6 +664,7 @@ static int bf5xx_nand_remove(struct platform_device *pdev)
} }
peripheral_free_list(bfin_nfc_pin_req); peripheral_free_list(bfin_nfc_pin_req);
bf5xx_nand_dma_remove(info);
/* free the common resources */ /* free the common resources */
kfree(info); kfree(info);
...@@ -638,7 +680,7 @@ static int bf5xx_nand_remove(struct platform_device *pdev) ...@@ -638,7 +680,7 @@ static int bf5xx_nand_remove(struct platform_device *pdev)
* it can allocate all necessary resources then calls the * it can allocate all necessary resources then calls the
* nand layer to look for devices * 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_platform *plat = to_nand_plat(pdev);
struct bf5xx_nand_info *info = NULL; struct bf5xx_nand_info *info = NULL;
...@@ -648,22 +690,21 @@ static int bf5xx_nand_probe(struct platform_device *pdev) ...@@ -648,22 +690,21 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "(%p)\n", 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) { if (!plat) {
dev_err(&pdev->dev, "no platform specific information\n"); 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); info = kzalloc(sizeof(*info), GFP_KERNEL);
if (info == NULL) { if (info == NULL) {
dev_err(&pdev->dev, "no memory for flash info\n"); dev_err(&pdev->dev, "no memory for flash info\n");
err = -ENOMEM; err = -ENOMEM;
goto exit_error; goto out_err_kzalloc;
} }
platform_set_drvdata(pdev, info); platform_set_drvdata(pdev, info);
...@@ -707,11 +748,16 @@ static int bf5xx_nand_probe(struct platform_device *pdev) ...@@ -707,11 +748,16 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
/* initialise the hardware */ /* initialise the hardware */
err = bf5xx_nand_hw_init(info); err = bf5xx_nand_hw_init(info);
if (err != 0) if (err)
goto exit_error; goto out_err_hw_init;
/* setup hardware ECC data struct */ /* setup hardware ECC data struct */
if (hardware_ecc) { 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) { if (plat->page_size == NFC_PG_SIZE_256) {
chip->ecc.bytes = 3; chip->ecc.bytes = 3;
chip->ecc.size = 256; chip->ecc.size = 256;
...@@ -733,7 +779,7 @@ static int bf5xx_nand_probe(struct platform_device *pdev) ...@@ -733,7 +779,7 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
/* scan hardware nand chip and setup mtd info data struct */ /* scan hardware nand chip and setup mtd info data struct */
if (nand_scan(mtd, 1)) { if (nand_scan(mtd, 1)) {
err = -ENXIO; err = -ENXIO;
goto exit_error; goto out_err_nand_scan;
} }
/* add NAND partition */ /* add NAND partition */
...@@ -742,11 +788,14 @@ static int bf5xx_nand_probe(struct platform_device *pdev) ...@@ -742,11 +788,14 @@ static int bf5xx_nand_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "initialised ok\n"); dev_dbg(&pdev->dev, "initialised ok\n");
return 0; return 0;
exit_error: out_err_nand_scan:
bf5xx_nand_remove(pdev); 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; return err;
} }
...@@ -775,7 +824,7 @@ static int bf5xx_nand_resume(struct platform_device *dev) ...@@ -775,7 +824,7 @@ static int bf5xx_nand_resume(struct platform_device *dev)
/* driver device registration */ /* driver device registration */
static struct platform_driver bf5xx_nand_driver = { static struct platform_driver bf5xx_nand_driver = {
.probe = bf5xx_nand_probe, .probe = bf5xx_nand_probe,
.remove = bf5xx_nand_remove, .remove = __devexit_p(bf5xx_nand_remove),
.suspend = bf5xx_nand_suspend, .suspend = bf5xx_nand_suspend,
.resume = bf5xx_nand_resume, .resume = bf5xx_nand_resume,
.driver = { .driver = {
......
...@@ -1125,9 +1125,9 @@ static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partitio ...@@ -1125,9 +1125,9 @@ static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partitio
goto out; goto out;
mh = (struct NFTLMediaHeader *)buf; mh = (struct NFTLMediaHeader *)buf;
mh->NumEraseUnits = le16_to_cpu(mh->NumEraseUnits); le16_to_cpus(&mh->NumEraseUnits);
mh->FirstPhysicalEUN = le16_to_cpu(mh->FirstPhysicalEUN); le16_to_cpus(&mh->FirstPhysicalEUN);
mh->FormattedSize = le32_to_cpu(mh->FormattedSize); le32_to_cpus(&mh->FormattedSize);
printk(KERN_INFO " DataOrgID = %s\n" printk(KERN_INFO " DataOrgID = %s\n"
" NumEraseUnits = %d\n" " NumEraseUnits = %d\n"
...@@ -1235,12 +1235,12 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti ...@@ -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); doc->mh1_page = doc->mh0_page + (4096 >> this->page_shift);
mh = (struct INFTLMediaHeader *)buf; mh = (struct INFTLMediaHeader *)buf;
mh->NoOfBootImageBlocks = le32_to_cpu(mh->NoOfBootImageBlocks); le32_to_cpus(&mh->NoOfBootImageBlocks);
mh->NoOfBinaryPartitions = le32_to_cpu(mh->NoOfBinaryPartitions); le32_to_cpus(&mh->NoOfBinaryPartitions);
mh->NoOfBDTLPartitions = le32_to_cpu(mh->NoOfBDTLPartitions); le32_to_cpus(&mh->NoOfBDTLPartitions);
mh->BlockMultiplierBits = le32_to_cpu(mh->BlockMultiplierBits); le32_to_cpus(&mh->BlockMultiplierBits);
mh->FormatFlags = le32_to_cpu(mh->FormatFlags); le32_to_cpus(&mh->FormatFlags);
mh->PercentUsed = le32_to_cpu(mh->PercentUsed); le32_to_cpus(&mh->PercentUsed);
printk(KERN_INFO " bootRecordID = %s\n" printk(KERN_INFO " bootRecordID = %s\n"
" NoOfBootImageBlocks = %d\n" " NoOfBootImageBlocks = %d\n"
...@@ -1277,12 +1277,12 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti ...@@ -1277,12 +1277,12 @@ static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partiti
/* Scan the partitions */ /* Scan the partitions */
for (i = 0; (i < 4); i++) { for (i = 0; (i < 4); i++) {
ip = &(mh->Partitions[i]); ip = &(mh->Partitions[i]);
ip->virtualUnits = le32_to_cpu(ip->virtualUnits); le32_to_cpus(&ip->virtualUnits);
ip->firstUnit = le32_to_cpu(ip->firstUnit); le32_to_cpus(&ip->firstUnit);
ip->lastUnit = le32_to_cpu(ip->lastUnit); le32_to_cpus(&ip->lastUnit);
ip->flags = le32_to_cpu(ip->flags); le32_to_cpus(&ip->flags);
ip->spareUnits = le32_to_cpu(ip->spareUnits); le32_to_cpus(&ip->spareUnits);
ip->Reserved0 = le32_to_cpu(ip->Reserved0); le32_to_cpus(&ip->Reserved0);
printk(KERN_INFO " PARTITION[%d] ->\n" printk(KERN_INFO " PARTITION[%d] ->\n"
" virtualUnits = %d\n" " virtualUnits = %d\n"
......
...@@ -887,7 +887,7 @@ static int __devinit fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl, ...@@ -887,7 +887,7 @@ static int __devinit fsl_elbc_chip_probe(struct fsl_elbc_ctrl *ctrl,
goto err; 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) { if (!priv->mtd.name) {
ret = -ENOMEM; ret = -ENOMEM;
goto err; goto err;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <asm/div64.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/string.h> #include <linux/string.h>
...@@ -207,13 +208,16 @@ MODULE_PARM_DESC(overridesize, "Specifies the NAND Flash size overriding the I ...@@ -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_READID 0x0000000A /* read ID */
#define STATE_CMD_ERASE2 0x0000000B /* sector erase second command */ #define STATE_CMD_ERASE2 0x0000000B /* sector erase second command */
#define STATE_CMD_RESET 0x0000000C /* reset */ #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 */ #define STATE_CMD_MASK 0x0000000F /* command states mask */
/* After an address is input, the simulator goes to one of these states */ /* 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_PAGE 0x00000010 /* full (row, column) address is accepted */
#define STATE_ADDR_SEC 0x00000020 /* sector address was accepted */ #define STATE_ADDR_SEC 0x00000020 /* sector address was accepted */
#define STATE_ADDR_ZERO 0x00000030 /* one byte zero address was accepted */ #define STATE_ADDR_COLUMN 0x00000030 /* column address was accepted */
#define STATE_ADDR_MASK 0x00000030 /* address states mask */ #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 */ /* Durind data input/output the simulator is in these states */
#define STATE_DATAIN 0x00000100 /* waiting for data input */ #define STATE_DATAIN 0x00000100 /* waiting for data input */
...@@ -240,7 +244,7 @@ MODULE_PARM_DESC(overridesize, "Specifies the NAND Flash size overriding the I ...@@ -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_OOBOFF 0x00600000 /* add to address OOB offset */
#define ACTION_MASK 0x00700000 /* action mask */ #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 NS_OPER_STATES 6 /* Maximum number of states in operation */
#define OPT_ANY 0xFFFFFFFF /* any chip supports this operation */ #define OPT_ANY 0xFFFFFFFF /* any chip supports this operation */
...@@ -373,7 +377,10 @@ static struct nandsim_operations { ...@@ -373,7 +377,10 @@ static struct nandsim_operations {
{OPT_ANY, {STATE_CMD_READID, STATE_ADDR_ZERO, STATE_DATAOUT_ID, STATE_READY}}, {OPT_ANY, {STATE_CMD_READID, STATE_ADDR_ZERO, STATE_DATAOUT_ID, STATE_READY}},
/* Large page devices read page */ /* Large page devices read page */
{OPT_LARGEPAGE, {STATE_CMD_READ0, STATE_ADDR_PAGE, STATE_CMD_READSTART | ACTION_CPY, {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 { struct weak_block {
...@@ -579,7 +586,8 @@ static int init_nandsim(struct mtd_info *mtd) ...@@ -579,7 +586,8 @@ static int init_nandsim(struct mtd_info *mtd)
if (ns->busw == 16) if (ns->busw == 16)
NS_WARN("16-bit flashes support wasn't tested\n"); 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("page size: %u bytes\n", ns->geom.pgsz);
printk("OOB area size: %u bytes\n", ns->geom.oobsz); printk("OOB area size: %u bytes\n", ns->geom.oobsz);
printk("sector size: %u KiB\n", ns->geom.secsz >> 10); printk("sector size: %u KiB\n", ns->geom.secsz >> 10);
...@@ -588,8 +596,9 @@ static int init_nandsim(struct mtd_info *mtd) ...@@ -588,8 +596,9 @@ static int init_nandsim(struct mtd_info *mtd)
printk("bus width: %u\n", ns->busw); printk("bus width: %u\n", ns->busw);
printk("bits in sector size: %u\n", ns->geom.secshift); printk("bits in sector size: %u\n", ns->geom.secshift);
printk("bits in page size: %u\n", ns->geom.pgshift); printk("bits in page size: %u\n", ns->geom.pgshift);
printk("bits in OOB size: %u\n", ns->geom.oobshift); printk("bits in OOB size: %u\n", ns->geom.oobshift);
printk("flash size with OOB: %llu KiB\n", ns->geom.totszoob >> 10); 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("page address bytes: %u\n", ns->geom.pgaddrbytes);
printk("sector address bytes: %u\n", ns->geom.secaddrbytes); printk("sector address bytes: %u\n", ns->geom.secaddrbytes);
printk("options: %#x\n", ns->options); printk("options: %#x\n", ns->options);
...@@ -937,12 +946,18 @@ static char *get_state_name(uint32_t state) ...@@ -937,12 +946,18 @@ static char *get_state_name(uint32_t state)
return "STATE_CMD_ERASE2"; return "STATE_CMD_ERASE2";
case STATE_CMD_RESET: case STATE_CMD_RESET:
return "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: case STATE_ADDR_PAGE:
return "STATE_ADDR_PAGE"; return "STATE_ADDR_PAGE";
case STATE_ADDR_SEC: case STATE_ADDR_SEC:
return "STATE_ADDR_SEC"; return "STATE_ADDR_SEC";
case STATE_ADDR_ZERO: case STATE_ADDR_ZERO:
return "STATE_ADDR_ZERO"; return "STATE_ADDR_ZERO";
case STATE_ADDR_COLUMN:
return "STATE_ADDR_COLUMN";
case STATE_DATAIN: case STATE_DATAIN:
return "STATE_DATAIN"; return "STATE_DATAIN";
case STATE_DATAOUT: case STATE_DATAOUT:
...@@ -973,6 +988,7 @@ static int check_command(int cmd) ...@@ -973,6 +988,7 @@ static int check_command(int cmd)
switch (cmd) { switch (cmd) {
case NAND_CMD_READ0: case NAND_CMD_READ0:
case NAND_CMD_READ1:
case NAND_CMD_READSTART: case NAND_CMD_READSTART:
case NAND_CMD_PAGEPROG: case NAND_CMD_PAGEPROG:
case NAND_CMD_READOOB: case NAND_CMD_READOOB:
...@@ -982,7 +998,8 @@ static int check_command(int cmd) ...@@ -982,7 +998,8 @@ static int check_command(int cmd)
case NAND_CMD_READID: case NAND_CMD_READID:
case NAND_CMD_ERASE2: case NAND_CMD_ERASE2:
case NAND_CMD_RESET: case NAND_CMD_RESET:
case NAND_CMD_READ1: case NAND_CMD_RNDOUT:
case NAND_CMD_RNDOUTSTART:
return 0; return 0;
case NAND_CMD_STATUS_MULTI: case NAND_CMD_STATUS_MULTI:
...@@ -1021,6 +1038,10 @@ static uint32_t get_state_by_command(unsigned command) ...@@ -1021,6 +1038,10 @@ static uint32_t get_state_by_command(unsigned command)
return STATE_CMD_ERASE2; return STATE_CMD_ERASE2;
case NAND_CMD_RESET: case NAND_CMD_RESET:
return STATE_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"); NS_ERR("get_state_by_command: unknown command, BUG\n");
...@@ -1582,6 +1603,11 @@ static void switch_state(struct nandsim *ns) ...@@ -1582,6 +1603,11 @@ static void switch_state(struct nandsim *ns)
ns->regs.num = 1; ns->regs.num = 1;
break; break;
case STATE_ADDR_COLUMN:
/* Column address is always 2 bytes */
ns->regs.num = ns->geom.pgaddrbytes - ns->geom.secaddrbytes;
break;
default: default:
NS_ERR("switch_state: BUG! unknown address state\n"); 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) ...@@ -1693,15 +1719,21 @@ static void ns_nand_write_byte(struct mtd_info *mtd, u_char byte)
return; return;
} }
/* /* Check that the command byte is correct */
* Chip might still be in STATE_DATAOUT if (check_command(byte)) {
* (if OPT_AUTOINCR feature is supported), STATE_DATAOUT_STATUS or NS_ERR("write_byte: unknown command %#x\n", (uint)byte);
* STATE_DATAOUT_STATUS_M state. If so, switch state. return;
*/ }
if (NS_STATE(ns->state) == STATE_DATAOUT_STATUS if (NS_STATE(ns->state) == STATE_DATAOUT_STATUS
|| NS_STATE(ns->state) == STATE_DATAOUT_STATUS_M || 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); switch_state(ns);
if (byte == NAND_CMD_RNDOUT)
ns->regs.row = row;
}
/* Check if chip is expecting command */ /* Check if chip is expecting command */
if (NS_STATE(ns->nxstate) != STATE_UNKNOWN && !(ns->nxstate & STATE_CMD_MASK)) { 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) ...@@ -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)); 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", NS_DBG("command byte corresponding to %s state accepted\n",
get_state_name(get_state_by_command(byte))); get_state_name(get_state_by_command(byte)));
ns->regs.command = byte; ns->regs.command = byte;
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
int jffs2_sum_init(struct jffs2_sb_info *c) 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); c->summary = kzalloc(sizeof(struct jffs2_summary), GFP_KERNEL);
if (!c->summary) { if (!c->summary) {
...@@ -30,7 +32,7 @@ int jffs2_sum_init(struct jffs2_sb_info *c) ...@@ -30,7 +32,7 @@ int jffs2_sum_init(struct jffs2_sb_info *c)
return -ENOMEM; return -ENOMEM;
} }
c->summary->sum_buf = vmalloc(c->sector_size); c->summary->sum_buf = kmalloc(sum_size, GFP_KERNEL);
if (!c->summary->sum_buf) { if (!c->summary->sum_buf) {
JFFS2_WARNING("Can't allocate buffer for writing out summary information!\n"); 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) ...@@ -49,7 +51,7 @@ void jffs2_sum_exit(struct jffs2_sb_info *c)
jffs2_sum_disable_collecting(c->summary); jffs2_sum_disable_collecting(c->summary);
vfree(c->summary->sum_buf); kfree(c->summary->sum_buf);
c->summary->sum_buf = NULL; c->summary->sum_buf = NULL;
kfree(c->summary); kfree(c->summary);
...@@ -665,7 +667,7 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb ...@@ -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() */ /* 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, 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; struct jffs2_raw_summary isum;
union jffs2_sum_mem *temp; union jffs2_sum_mem *temp;
...@@ -676,6 +678,26 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock ...@@ -676,6 +678,26 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock
int ret; int ret;
size_t retlen; 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(c->summary->sum_buf, 0xff, datasize);
memset(&isum, 0, sizeof(isum)); memset(&isum, 0, sizeof(isum));
...@@ -821,7 +843,7 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) ...@@ -821,7 +843,7 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
{ {
int datasize, infosize, padsize; int datasize, infosize, padsize;
struct jffs2_eraseblock *jeb; struct jffs2_eraseblock *jeb;
int ret; int ret = 0;
dbg_summary("called\n"); dbg_summary("called\n");
...@@ -841,16 +863,6 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c) ...@@ -841,16 +863,6 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
infosize += padsize; infosize += padsize;
datasize += 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); ret = jffs2_sum_write_data(c, jeb, infosize, datasize, padsize);
spin_lock(&c->erase_completion_lock); spin_lock(&c->erase_completion_lock);
return ret; return ret;
......
...@@ -13,6 +13,12 @@ ...@@ -13,6 +13,12 @@
#ifndef JFFS2_SUMMARY_H #ifndef JFFS2_SUMMARY_H
#define 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/uio.h>
#include <linux/jffs2.h> #include <linux/jffs2.h>
......
...@@ -272,7 +272,11 @@ static inline void mtd_erase_callback(struct erase_info *instr) ...@@ -272,7 +272,11 @@ static inline void mtd_erase_callback(struct erase_info *instr)
printk(KERN_INFO args); \ printk(KERN_INFO args); \
} while(0) } while(0)
#else /* CONFIG_MTD_DEBUG */ #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 */ #endif /* CONFIG_MTD_DEBUG */
......
...@@ -177,7 +177,9 @@ typedef enum { ...@@ -177,7 +177,9 @@ typedef enum {
#define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING)) #define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING))
#define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG)) #define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))
#define NAND_HAS_COPYBACK(chip) ((chip->options & NAND_COPYBACK)) #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 */ /* Mask to zero out the chip options, which come from the id table */
#define NAND_CHIPOPTIONS_MSK (0x0000ffff & ~NAND_NO_AUTOINCR) #define NAND_CHIPOPTIONS_MSK (0x0000ffff & ~NAND_NO_AUTOINCR)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment