diff options
| author | Eric Paris <eparis@redhat.com> | 2013-11-22 18:57:08 -0500 |
|---|---|---|
| committer | Eric Paris <eparis@redhat.com> | 2013-11-22 18:57:54 -0500 |
| commit | fc582aef7dcc27a7120cf232c1e76c569c7b6eab (patch) | |
| tree | 7d275dd4ceab6067b91e9a25a5f6338b425fbccd /include/linux/mtd | |
| parent | 9175c9d2aed528800175ef81c90569d00d23f9be (diff) | |
| parent | 5e01dc7b26d9f24f39abace5da98ccbd6a5ceb52 (diff) | |
Merge tag 'v3.12'
Linux 3.12
Conflicts:
fs/exec.c
Diffstat (limited to 'include/linux/mtd')
| -rw-r--r-- | include/linux/mtd/bbm.h | 2 | ||||
| -rw-r--r-- | include/linux/mtd/fsmc.h | 1 | ||||
| -rw-r--r-- | include/linux/mtd/mtd.h | 3 | ||||
| -rw-r--r-- | include/linux/mtd/nand.h | 83 |
4 files changed, 82 insertions, 7 deletions
diff --git a/include/linux/mtd/bbm.h b/include/linux/mtd/bbm.h index 211ff67e8b0d..95fc482cef36 100644 --- a/include/linux/mtd/bbm.h +++ b/include/linux/mtd/bbm.h | |||
| @@ -93,8 +93,6 @@ struct nand_bbt_descr { | |||
| 93 | #define NAND_BBT_CREATE_EMPTY 0x00000400 | 93 | #define NAND_BBT_CREATE_EMPTY 0x00000400 |
| 94 | /* Search good / bad pattern through all pages of a block */ | 94 | /* Search good / bad pattern through all pages of a block */ |
| 95 | #define NAND_BBT_SCANALLPAGES 0x00000800 | 95 | #define NAND_BBT_SCANALLPAGES 0x00000800 |
| 96 | /* Scan block empty during good / bad block scan */ | ||
| 97 | #define NAND_BBT_SCANEMPTY 0x00001000 | ||
| 98 | /* Write bbt if neccecary */ | 96 | /* Write bbt if neccecary */ |
| 99 | #define NAND_BBT_WRITE 0x00002000 | 97 | #define NAND_BBT_WRITE 0x00002000 |
| 100 | /* Read and write back block contents when writing bbt */ | 98 | /* Read and write back block contents when writing bbt */ |
diff --git a/include/linux/mtd/fsmc.h b/include/linux/mtd/fsmc.h index d6ed61ef451d..c8be32e9fc49 100644 --- a/include/linux/mtd/fsmc.h +++ b/include/linux/mtd/fsmc.h | |||
| @@ -137,6 +137,7 @@ enum access_mode { | |||
| 137 | 137 | ||
| 138 | /** | 138 | /** |
| 139 | * fsmc_nand_platform_data - platform specific NAND controller config | 139 | * fsmc_nand_platform_data - platform specific NAND controller config |
| 140 | * @nand_timings: timing setup for the physical NAND interface | ||
| 140 | * @partitions: partition table for the platform, use a default fallback | 141 | * @partitions: partition table for the platform, use a default fallback |
| 141 | * if this is NULL | 142 | * if this is NULL |
| 142 | * @nr_partitions: the number of partitions in the previous entry | 143 | * @nr_partitions: the number of partitions in the previous entry |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index a5cf4e8d6818..f9bfe526d310 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
| @@ -173,6 +173,9 @@ struct mtd_info { | |||
| 173 | /* ECC layout structure pointer - read only! */ | 173 | /* ECC layout structure pointer - read only! */ |
| 174 | struct nand_ecclayout *ecclayout; | 174 | struct nand_ecclayout *ecclayout; |
| 175 | 175 | ||
| 176 | /* the ecc step size. */ | ||
| 177 | unsigned int ecc_step_size; | ||
| 178 | |||
| 176 | /* max number of correctible bit errors per ecc step */ | 179 | /* max number of correctible bit errors per ecc step */ |
| 177 | unsigned int ecc_strength; | 180 | unsigned int ecc_strength; |
| 178 | 181 | ||
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index ab6363443ce8..ac8e89d5a792 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
| @@ -56,7 +56,7 @@ extern int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len); | |||
| 56 | * is supported now. If you add a chip with bigger oobsize/page | 56 | * is supported now. If you add a chip with bigger oobsize/page |
| 57 | * adjust this accordingly. | 57 | * adjust this accordingly. |
| 58 | */ | 58 | */ |
| 59 | #define NAND_MAX_OOBSIZE 640 | 59 | #define NAND_MAX_OOBSIZE 744 |
| 60 | #define NAND_MAX_PAGESIZE 8192 | 60 | #define NAND_MAX_PAGESIZE 8192 |
| 61 | 61 | ||
| 62 | /* | 62 | /* |
| @@ -202,6 +202,10 @@ typedef enum { | |||
| 202 | /* Keep gcc happy */ | 202 | /* Keep gcc happy */ |
| 203 | struct nand_chip; | 203 | struct nand_chip; |
| 204 | 204 | ||
| 205 | /* ONFI features */ | ||
| 206 | #define ONFI_FEATURE_16_BIT_BUS (1 << 0) | ||
| 207 | #define ONFI_FEATURE_EXT_PARAM_PAGE (1 << 7) | ||
| 208 | |||
| 205 | /* ONFI timing mode, used in both asynchronous and synchronous mode */ | 209 | /* ONFI timing mode, used in both asynchronous and synchronous mode */ |
| 206 | #define ONFI_TIMING_MODE_0 (1 << 0) | 210 | #define ONFI_TIMING_MODE_0 (1 << 0) |
| 207 | #define ONFI_TIMING_MODE_1 (1 << 1) | 211 | #define ONFI_TIMING_MODE_1 (1 << 1) |
| @@ -217,6 +221,9 @@ struct nand_chip; | |||
| 217 | /* ONFI subfeature parameters length */ | 221 | /* ONFI subfeature parameters length */ |
| 218 | #define ONFI_SUBFEATURE_PARAM_LEN 4 | 222 | #define ONFI_SUBFEATURE_PARAM_LEN 4 |
| 219 | 223 | ||
| 224 | /* ONFI optional commands SET/GET FEATURES supported? */ | ||
| 225 | #define ONFI_OPT_CMD_SET_GET_FEATURES (1 << 2) | ||
| 226 | |||
| 220 | struct nand_onfi_params { | 227 | struct nand_onfi_params { |
| 221 | /* rev info and features block */ | 228 | /* rev info and features block */ |
| 222 | /* 'O' 'N' 'F' 'I' */ | 229 | /* 'O' 'N' 'F' 'I' */ |
| @@ -224,7 +231,10 @@ struct nand_onfi_params { | |||
| 224 | __le16 revision; | 231 | __le16 revision; |
| 225 | __le16 features; | 232 | __le16 features; |
| 226 | __le16 opt_cmd; | 233 | __le16 opt_cmd; |
| 227 | u8 reserved[22]; | 234 | u8 reserved0[2]; |
| 235 | __le16 ext_param_page_length; /* since ONFI 2.1 */ | ||
| 236 | u8 num_of_param_pages; /* since ONFI 2.1 */ | ||
| 237 | u8 reserved1[17]; | ||
| 228 | 238 | ||
| 229 | /* manufacturer information block */ | 239 | /* manufacturer information block */ |
| 230 | char manufacturer[12]; | 240 | char manufacturer[12]; |
| @@ -281,6 +291,40 @@ struct nand_onfi_params { | |||
| 281 | 291 | ||
| 282 | #define ONFI_CRC_BASE 0x4F4E | 292 | #define ONFI_CRC_BASE 0x4F4E |
| 283 | 293 | ||
| 294 | /* Extended ECC information Block Definition (since ONFI 2.1) */ | ||
| 295 | struct onfi_ext_ecc_info { | ||
| 296 | u8 ecc_bits; | ||
| 297 | u8 codeword_size; | ||
| 298 | __le16 bb_per_lun; | ||
| 299 | __le16 block_endurance; | ||
| 300 | u8 reserved[2]; | ||
| 301 | } __packed; | ||
| 302 | |||
| 303 | #define ONFI_SECTION_TYPE_0 0 /* Unused section. */ | ||
| 304 | #define ONFI_SECTION_TYPE_1 1 /* for additional sections. */ | ||
| 305 | #define ONFI_SECTION_TYPE_2 2 /* for ECC information. */ | ||
| 306 | struct onfi_ext_section { | ||
| 307 | u8 type; | ||
| 308 | u8 length; | ||
| 309 | } __packed; | ||
| 310 | |||
| 311 | #define ONFI_EXT_SECTION_MAX 8 | ||
| 312 | |||
| 313 | /* Extended Parameter Page Definition (since ONFI 2.1) */ | ||
| 314 | struct onfi_ext_param_page { | ||
| 315 | __le16 crc; | ||
| 316 | u8 sig[4]; /* 'E' 'P' 'P' 'S' */ | ||
| 317 | u8 reserved0[10]; | ||
| 318 | struct onfi_ext_section sections[ONFI_EXT_SECTION_MAX]; | ||
| 319 | |||
| 320 | /* | ||
| 321 | * The actual size of the Extended Parameter Page is in | ||
| 322 | * @ext_param_page_length of nand_onfi_params{}. | ||
| 323 | * The following are the variable length sections. | ||
| 324 | * So we do not add any fields below. Please see the ONFI spec. | ||
| 325 | */ | ||
| 326 | } __packed; | ||
| 327 | |||
| 284 | /** | 328 | /** |
| 285 | * struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independent devices | 329 | * struct nand_hw_control - Control structure for hardware controller (e.g ECC generator) shared among independent devices |
| 286 | * @lock: protection lock | 330 | * @lock: protection lock |
| @@ -390,8 +434,8 @@ struct nand_buffers { | |||
| 390 | * @write_buf: [REPLACEABLE] write data from the buffer to the chip | 434 | * @write_buf: [REPLACEABLE] write data from the buffer to the chip |
| 391 | * @read_buf: [REPLACEABLE] read data from the chip into the buffer | 435 | * @read_buf: [REPLACEABLE] read data from the chip into the buffer |
| 392 | * @select_chip: [REPLACEABLE] select chip nr | 436 | * @select_chip: [REPLACEABLE] select chip nr |
| 393 | * @block_bad: [REPLACEABLE] check, if the block is bad | 437 | * @block_bad: [REPLACEABLE] check if a block is bad, using OOB markers |
| 394 | * @block_markbad: [REPLACEABLE] mark the block bad | 438 | * @block_markbad: [REPLACEABLE] mark a block bad |
| 395 | * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific function for controlling | 439 | * @cmd_ctrl: [BOARDSPECIFIC] hardwarespecific function for controlling |
| 396 | * ALE/CLE/nCE. Also used to write command and address | 440 | * ALE/CLE/nCE. Also used to write command and address |
| 397 | * @init_size: [BOARDSPECIFIC] hardwarespecific function for setting | 441 | * @init_size: [BOARDSPECIFIC] hardwarespecific function for setting |
| @@ -434,6 +478,12 @@ struct nand_buffers { | |||
| 434 | * bad block marker position; i.e., BBM == 11110111b is | 478 | * bad block marker position; i.e., BBM == 11110111b is |
| 435 | * not bad when badblockbits == 7 | 479 | * not bad when badblockbits == 7 |
| 436 | * @cellinfo: [INTERN] MLC/multichip data from chip ident | 480 | * @cellinfo: [INTERN] MLC/multichip data from chip ident |
| 481 | * @ecc_strength_ds: [INTERN] ECC correctability from the datasheet. | ||
| 482 | * Minimum amount of bit errors per @ecc_step_ds guaranteed | ||
| 483 | * to be correctable. If unknown, set to zero. | ||
| 484 | * @ecc_step_ds: [INTERN] ECC step required by the @ecc_strength_ds, | ||
| 485 | * also from the datasheet. It is the recommended ECC step | ||
| 486 | * size, if known; if unknown, set to zero. | ||
| 437 | * @numchips: [INTERN] number of physical chips | 487 | * @numchips: [INTERN] number of physical chips |
| 438 | * @chipsize: [INTERN] the size of one chip for multichip arrays | 488 | * @chipsize: [INTERN] the size of one chip for multichip arrays |
| 439 | * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1 | 489 | * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1 |
| @@ -510,6 +560,8 @@ struct nand_chip { | |||
| 510 | unsigned int pagebuf_bitflips; | 560 | unsigned int pagebuf_bitflips; |
| 511 | int subpagesize; | 561 | int subpagesize; |
| 512 | uint8_t cellinfo; | 562 | uint8_t cellinfo; |
| 563 | uint16_t ecc_strength_ds; | ||
| 564 | uint16_t ecc_step_ds; | ||
| 513 | int badblockpos; | 565 | int badblockpos; |
| 514 | int badblockbits; | 566 | int badblockbits; |
| 515 | 567 | ||
| @@ -576,6 +628,11 @@ struct nand_chip { | |||
| 576 | { .name = (nm), {{ .dev_id = (devid) }}, .chipsize = (chipsz), \ | 628 | { .name = (nm), {{ .dev_id = (devid) }}, .chipsize = (chipsz), \ |
| 577 | .options = (opts) } | 629 | .options = (opts) } |
| 578 | 630 | ||
| 631 | #define NAND_ECC_INFO(_strength, _step) \ | ||
| 632 | { .strength_ds = (_strength), .step_ds = (_step) } | ||
| 633 | #define NAND_ECC_STRENGTH(type) ((type)->ecc.strength_ds) | ||
| 634 | #define NAND_ECC_STEP(type) ((type)->ecc.step_ds) | ||
| 635 | |||
| 579 | /** | 636 | /** |
| 580 | * struct nand_flash_dev - NAND Flash Device ID Structure | 637 | * struct nand_flash_dev - NAND Flash Device ID Structure |
| 581 | * @name: a human-readable name of the NAND chip | 638 | * @name: a human-readable name of the NAND chip |
| @@ -593,6 +650,12 @@ struct nand_chip { | |||
| 593 | * @options: stores various chip bit options | 650 | * @options: stores various chip bit options |
| 594 | * @id_len: The valid length of the @id. | 651 | * @id_len: The valid length of the @id. |
| 595 | * @oobsize: OOB size | 652 | * @oobsize: OOB size |
| 653 | * @ecc.strength_ds: The ECC correctability from the datasheet, same as the | ||
| 654 | * @ecc_strength_ds in nand_chip{}. | ||
| 655 | * @ecc.step_ds: The ECC step required by the @ecc.strength_ds, same as the | ||
| 656 | * @ecc_step_ds in nand_chip{}, also from the datasheet. | ||
| 657 | * For example, the "4bit ECC for each 512Byte" can be set with | ||
| 658 | * NAND_ECC_INFO(4, 512). | ||
| 596 | */ | 659 | */ |
| 597 | struct nand_flash_dev { | 660 | struct nand_flash_dev { |
| 598 | char *name; | 661 | char *name; |
| @@ -609,6 +672,10 @@ struct nand_flash_dev { | |||
| 609 | unsigned int options; | 672 | unsigned int options; |
| 610 | uint16_t id_len; | 673 | uint16_t id_len; |
| 611 | uint16_t oobsize; | 674 | uint16_t oobsize; |
| 675 | struct { | ||
| 676 | uint16_t strength_ds; | ||
| 677 | uint16_t step_ds; | ||
| 678 | } ecc; | ||
| 612 | }; | 679 | }; |
| 613 | 680 | ||
| 614 | /** | 681 | /** |
| @@ -625,8 +692,8 @@ extern struct nand_flash_dev nand_flash_ids[]; | |||
| 625 | extern struct nand_manufacturers nand_manuf_ids[]; | 692 | extern struct nand_manufacturers nand_manuf_ids[]; |
| 626 | 693 | ||
| 627 | extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); | 694 | extern int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd); |
| 628 | extern int nand_update_bbt(struct mtd_info *mtd, loff_t offs); | ||
| 629 | extern int nand_default_bbt(struct mtd_info *mtd); | 695 | extern int nand_default_bbt(struct mtd_info *mtd); |
| 696 | extern int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs); | ||
| 630 | extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); | 697 | extern int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt); |
| 631 | extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, | 698 | extern int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, |
| 632 | int allowbbt); | 699 | int allowbbt); |
| @@ -708,6 +775,12 @@ struct platform_nand_chip *get_platform_nandchip(struct mtd_info *mtd) | |||
| 708 | return chip->priv; | 775 | return chip->priv; |
| 709 | } | 776 | } |
| 710 | 777 | ||
| 778 | /* return the supported features. */ | ||
| 779 | static inline int onfi_feature(struct nand_chip *chip) | ||
| 780 | { | ||
| 781 | return chip->onfi_version ? le16_to_cpu(chip->onfi_params.features) : 0; | ||
| 782 | } | ||
| 783 | |||
| 711 | /* return the supported asynchronous timing mode. */ | 784 | /* return the supported asynchronous timing mode. */ |
| 712 | static inline int onfi_get_async_timing_mode(struct nand_chip *chip) | 785 | static inline int onfi_get_async_timing_mode(struct nand_chip *chip) |
| 713 | { | 786 | { |
