diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-09 15:36:45 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-09 15:37:15 -0500 |
| commit | 7c51d57e9d7fbce89f79c41dc8da383101dbe9c6 (patch) | |
| tree | 9f45a5ac5ce627b4c6138595b23ae7f02e1ee7fb /include/linux/mtd | |
| parent | a3a798c88a14b35e5d4ca30716dbc9eb9a1ddfe2 (diff) | |
| parent | 85795dac740e63e81aeec8d49aada54ab07656b5 (diff) | |
Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: (67 commits)
[MTD] [MAPS] Fix printk format warning in nettel.c
[MTD] [NAND] add cmdline parsing (mtdparts=) support to cafe_nand
[MTD] CFI: remove major/minor version check for command set 0x0002
[MTD] [NAND] ndfc driver
[MTD] [TESTS] Fix some size_t printk format warnings
[MTD] LPDDR Makefile and KConfig
[MTD] LPDDR extended physmap driver to support LPDDR flash
[MTD] LPDDR added new pfow_base parameter
[MTD] LPDDR Command set driver
[MTD] LPDDR PFOW definition
[MTD] LPDDR QINFO records definitions
[MTD] LPDDR qinfo probing.
[MTD] [NAND] pxa3xx: convert from ns to clock ticks more accurately
[MTD] [NAND] pxa3xx: fix non-page-aligned reads
[MTD] [NAND] fix nandsim sched.h references
[MTD] [NAND] alauda: use USB API functions rather than constants
[MTD] struct device - replace bus_id with dev_name(), dev_set_name()
[MTD] fix m25p80 64-bit divisions
[MTD] fix dataflash 64-bit divisions
[MTD] [NAND] Set the fsl elbc ECCM according the settings in bootloader.
...
Fixed up trivial debug conflicts in drivers/mtd/devices/{m25p80.c,mtd_dataflash.c}
Diffstat (limited to 'include/linux/mtd')
| -rw-r--r-- | include/linux/mtd/cfi.h | 1 | ||||
| -rw-r--r-- | include/linux/mtd/ftl.h | 38 | ||||
| -rw-r--r-- | include/linux/mtd/map.h | 1 | ||||
| -rw-r--r-- | include/linux/mtd/mtd.h | 75 | ||||
| -rw-r--r-- | include/linux/mtd/nand.h | 7 | ||||
| -rw-r--r-- | include/linux/mtd/partitions.h | 6 | ||||
| -rw-r--r-- | include/linux/mtd/pfow.h | 159 | ||||
| -rw-r--r-- | include/linux/mtd/physmap.h | 1 | ||||
| -rw-r--r-- | include/linux/mtd/qinfo.h | 91 | ||||
| -rw-r--r-- | include/linux/mtd/sharpsl.h | 20 |
10 files changed, 354 insertions, 45 deletions
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index 00e2b575021..88d3d8fbf9f 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h | |||
| @@ -520,6 +520,7 @@ struct cfi_fixup { | |||
| 520 | 520 | ||
| 521 | #define CFI_MFR_AMD 0x0001 | 521 | #define CFI_MFR_AMD 0x0001 |
| 522 | #define CFI_MFR_ATMEL 0x001F | 522 | #define CFI_MFR_ATMEL 0x001F |
| 523 | #define CFI_MFR_SAMSUNG 0x00EC | ||
| 523 | #define CFI_MFR_ST 0x0020 /* STMicroelectronics */ | 524 | #define CFI_MFR_ST 0x0020 /* STMicroelectronics */ |
| 524 | 525 | ||
| 525 | void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); | 526 | void cfi_fixup(struct mtd_info *mtd, struct cfi_fixup* fixups); |
diff --git a/include/linux/mtd/ftl.h b/include/linux/mtd/ftl.h index 0be442f881d..0555f7a0b9e 100644 --- a/include/linux/mtd/ftl.h +++ b/include/linux/mtd/ftl.h | |||
| @@ -32,25 +32,25 @@ | |||
| 32 | #define _LINUX_FTL_H | 32 | #define _LINUX_FTL_H |
| 33 | 33 | ||
| 34 | typedef struct erase_unit_header_t { | 34 | typedef struct erase_unit_header_t { |
| 35 | u_int8_t LinkTargetTuple[5]; | 35 | uint8_t LinkTargetTuple[5]; |
| 36 | u_int8_t DataOrgTuple[10]; | 36 | uint8_t DataOrgTuple[10]; |
| 37 | u_int8_t NumTransferUnits; | 37 | uint8_t NumTransferUnits; |
| 38 | u_int32_t EraseCount; | 38 | uint32_t EraseCount; |
| 39 | u_int16_t LogicalEUN; | 39 | uint16_t LogicalEUN; |
| 40 | u_int8_t BlockSize; | 40 | uint8_t BlockSize; |
| 41 | u_int8_t EraseUnitSize; | 41 | uint8_t EraseUnitSize; |
| 42 | u_int16_t FirstPhysicalEUN; | 42 | uint16_t FirstPhysicalEUN; |
| 43 | u_int16_t NumEraseUnits; | 43 | uint16_t NumEraseUnits; |
| 44 | u_int32_t FormattedSize; | 44 | uint32_t FormattedSize; |
| 45 | u_int32_t FirstVMAddress; | 45 | uint32_t FirstVMAddress; |
| 46 | u_int16_t NumVMPages; | 46 | uint16_t NumVMPages; |
| 47 | u_int8_t Flags; | 47 | uint8_t Flags; |
| 48 | u_int8_t Code; | 48 | uint8_t Code; |
| 49 | u_int32_t SerialNumber; | 49 | uint32_t SerialNumber; |
| 50 | u_int32_t AltEUHOffset; | 50 | uint32_t AltEUHOffset; |
| 51 | u_int32_t BAMOffset; | 51 | uint32_t BAMOffset; |
| 52 | u_int8_t Reserved[12]; | 52 | uint8_t Reserved[12]; |
| 53 | u_int8_t EndTuple[2]; | 53 | uint8_t EndTuple[2]; |
| 54 | } erase_unit_header_t; | 54 | } erase_unit_header_t; |
| 55 | 55 | ||
| 56 | /* Flags in erase_unit_header_t */ | 56 | /* Flags in erase_unit_header_t */ |
diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index aa30244492c..b981b877221 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h | |||
| @@ -223,6 +223,7 @@ struct map_info { | |||
| 223 | must leave it enabled. */ | 223 | must leave it enabled. */ |
| 224 | void (*set_vpp)(struct map_info *, int); | 224 | void (*set_vpp)(struct map_info *, int); |
| 225 | 225 | ||
| 226 | unsigned long pfow_base; | ||
| 226 | unsigned long map_priv_1; | 227 | unsigned long map_priv_1; |
| 227 | unsigned long map_priv_2; | 228 | unsigned long map_priv_2; |
| 228 | void *fldrv_priv; | 229 | void *fldrv_priv; |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 64433eb411d..3aa5d77c2cd 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #include <linux/mtd/compatmac.h> | 15 | #include <linux/mtd/compatmac.h> |
| 16 | #include <mtd/mtd-abi.h> | 16 | #include <mtd/mtd-abi.h> |
| 17 | 17 | ||
| 18 | #include <asm/div64.h> | ||
| 19 | |||
| 18 | #define MTD_CHAR_MAJOR 90 | 20 | #define MTD_CHAR_MAJOR 90 |
| 19 | #define MTD_BLOCK_MAJOR 31 | 21 | #define MTD_BLOCK_MAJOR 31 |
| 20 | #define MAX_MTD_DEVICES 32 | 22 | #define MAX_MTD_DEVICES 32 |
| @@ -25,20 +27,20 @@ | |||
| 25 | #define MTD_ERASE_DONE 0x08 | 27 | #define MTD_ERASE_DONE 0x08 |
| 26 | #define MTD_ERASE_FAILED 0x10 | 28 | #define MTD_ERASE_FAILED 0x10 |
| 27 | 29 | ||
| 28 | #define MTD_FAIL_ADDR_UNKNOWN 0xffffffff | 30 | #define MTD_FAIL_ADDR_UNKNOWN -1LL |
| 29 | 31 | ||
| 30 | /* If the erase fails, fail_addr might indicate exactly which block failed. If | 32 | /* If the erase fails, fail_addr might indicate exactly which block failed. If |
| 31 | fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not | 33 | fail_addr = MTD_FAIL_ADDR_UNKNOWN, the failure was not at the device level or was not |
| 32 | specific to any particular block. */ | 34 | specific to any particular block. */ |
| 33 | struct erase_info { | 35 | struct erase_info { |
| 34 | struct mtd_info *mtd; | 36 | struct mtd_info *mtd; |
| 35 | u_int32_t addr; | 37 | uint64_t addr; |
| 36 | u_int32_t len; | 38 | uint64_t len; |
| 37 | u_int32_t fail_addr; | 39 | uint64_t fail_addr; |
| 38 | u_long time; | 40 | u_long time; |
| 39 | u_long retries; | 41 | u_long retries; |
| 40 | u_int dev; | 42 | unsigned dev; |
| 41 | u_int cell; | 43 | unsigned cell; |
| 42 | void (*callback) (struct erase_info *self); | 44 | void (*callback) (struct erase_info *self); |
| 43 | u_long priv; | 45 | u_long priv; |
| 44 | u_char state; | 46 | u_char state; |
| @@ -46,9 +48,9 @@ struct erase_info { | |||
| 46 | }; | 48 | }; |
| 47 | 49 | ||
| 48 | struct mtd_erase_region_info { | 50 | struct mtd_erase_region_info { |
| 49 | u_int32_t offset; /* At which this region starts, from the beginning of the MTD */ | 51 | uint64_t offset; /* At which this region starts, from the beginning of the MTD */ |
| 50 | u_int32_t erasesize; /* For this region */ | 52 | uint32_t erasesize; /* For this region */ |
| 51 | u_int32_t numblocks; /* Number of blocks of erasesize in this region */ | 53 | uint32_t numblocks; /* Number of blocks of erasesize in this region */ |
| 52 | unsigned long *lockmap; /* If keeping bitmap of locks */ | 54 | unsigned long *lockmap; /* If keeping bitmap of locks */ |
| 53 | }; | 55 | }; |
| 54 | 56 | ||
| @@ -100,14 +102,14 @@ struct mtd_oob_ops { | |||
| 100 | 102 | ||
| 101 | struct mtd_info { | 103 | struct mtd_info { |
| 102 | u_char type; | 104 | u_char type; |
| 103 | u_int32_t flags; | 105 | uint32_t flags; |
| 104 | u_int32_t size; // Total size of the MTD | 106 | uint64_t size; // Total size of the MTD |
| 105 | 107 | ||
| 106 | /* "Major" erase size for the device. Naïve users may take this | 108 | /* "Major" erase size for the device. Naïve users may take this |
| 107 | * to be the only erase size available, or may use the more detailed | 109 | * to be the only erase size available, or may use the more detailed |
| 108 | * information below if they desire | 110 | * information below if they desire |
| 109 | */ | 111 | */ |
| 110 | u_int32_t erasesize; | 112 | uint32_t erasesize; |
| 111 | /* Minimal writable flash unit size. In case of NOR flash it is 1 (even | 113 | /* Minimal writable flash unit size. In case of NOR flash it is 1 (even |
| 112 | * though individual bits can be cleared), in case of NAND flash it is | 114 | * though individual bits can be cleared), in case of NAND flash it is |
| 113 | * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR | 115 | * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR |
| @@ -115,10 +117,20 @@ struct mtd_info { | |||
| 115 | * Any driver registering a struct mtd_info must ensure a writesize of | 117 | * Any driver registering a struct mtd_info must ensure a writesize of |
| 116 | * 1 or larger. | 118 | * 1 or larger. |
| 117 | */ | 119 | */ |
| 118 | u_int32_t writesize; | 120 | uint32_t writesize; |
| 121 | |||
| 122 | uint32_t oobsize; // Amount of OOB data per block (e.g. 16) | ||
| 123 | uint32_t oobavail; // Available OOB bytes per block | ||
| 119 | 124 | ||
| 120 | u_int32_t oobsize; // Amount of OOB data per block (e.g. 16) | 125 | /* |
| 121 | u_int32_t oobavail; // Available OOB bytes per block | 126 | * If erasesize is a power of 2 then the shift is stored in |
| 127 | * erasesize_shift otherwise erasesize_shift is zero. Ditto writesize. | ||
| 128 | */ | ||
| 129 | unsigned int erasesize_shift; | ||
| 130 | unsigned int writesize_shift; | ||
| 131 | /* Masks based on erasesize_shift and writesize_shift */ | ||
| 132 | unsigned int erasesize_mask; | ||
| 133 | unsigned int writesize_mask; | ||
| 122 | 134 | ||
| 123 | // Kernel-only stuff starts here. | 135 | // Kernel-only stuff starts here. |
| 124 | const char *name; | 136 | const char *name; |
| @@ -190,8 +202,8 @@ struct mtd_info { | |||
| 190 | void (*sync) (struct mtd_info *mtd); | 202 | void (*sync) (struct mtd_info *mtd); |
| 191 | 203 | ||
| 192 | /* Chip-supported device locking */ | 204 | /* Chip-supported device locking */ |
| 193 | int (*lock) (struct mtd_info *mtd, loff_t ofs, size_t len); | 205 | int (*lock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
| 194 | int (*unlock) (struct mtd_info *mtd, loff_t ofs, size_t len); | 206 | int (*unlock) (struct mtd_info *mtd, loff_t ofs, uint64_t len); |
| 195 | 207 | ||
| 196 | /* Power Management functions */ | 208 | /* Power Management functions */ |
| 197 | int (*suspend) (struct mtd_info *mtd); | 209 | int (*suspend) (struct mtd_info *mtd); |
| @@ -221,6 +233,35 @@ struct mtd_info { | |||
| 221 | void (*put_device) (struct mtd_info *mtd); | 233 | void (*put_device) (struct mtd_info *mtd); |
| 222 | }; | 234 | }; |
| 223 | 235 | ||
| 236 | static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd) | ||
| 237 | { | ||
| 238 | if (mtd->erasesize_shift) | ||
| 239 | return sz >> mtd->erasesize_shift; | ||
| 240 | do_div(sz, mtd->erasesize); | ||
| 241 | return sz; | ||
| 242 | } | ||
| 243 | |||
| 244 | static inline uint32_t mtd_mod_by_eb(uint64_t sz, struct mtd_info *mtd) | ||
| 245 | { | ||
| 246 | if (mtd->erasesize_shift) | ||
| 247 | return sz & mtd->erasesize_mask; | ||
| 248 | return do_div(sz, mtd->erasesize); | ||
| 249 | } | ||
| 250 | |||
| 251 | static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd) | ||
| 252 | { | ||
| 253 | if (mtd->writesize_shift) | ||
| 254 | return sz >> mtd->writesize_shift; | ||
| 255 | do_div(sz, mtd->writesize); | ||
| 256 | return sz; | ||
| 257 | } | ||
| 258 | |||
| 259 | static inline uint32_t mtd_mod_by_ws(uint64_t sz, struct mtd_info *mtd) | ||
| 260 | { | ||
| 261 | if (mtd->writesize_shift) | ||
| 262 | return sz & mtd->writesize_mask; | ||
| 263 | return do_div(sz, mtd->writesize); | ||
| 264 | } | ||
| 224 | 265 | ||
| 225 | /* Kernel-side ioctl definitions */ | 266 | /* Kernel-side ioctl definitions */ |
| 226 | 267 | ||
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index 733d3f3b4eb..db5b63da2a7 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
| @@ -335,17 +335,12 @@ struct nand_buffers { | |||
| 335 | * @erase_cmd: [INTERN] erase command write function, selectable due to AND support | 335 | * @erase_cmd: [INTERN] erase command write function, selectable due to AND support |
| 336 | * @scan_bbt: [REPLACEABLE] function to scan bad block table | 336 | * @scan_bbt: [REPLACEABLE] function to scan bad block table |
| 337 | * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transfering data from array to read regs (tR) | 337 | * @chip_delay: [BOARDSPECIFIC] chip dependent delay for transfering data from array to read regs (tR) |
| 338 | * @wq: [INTERN] wait queue to sleep on if a NAND operation is in progress | ||
| 339 | * @state: [INTERN] the current state of the NAND device | 338 | * @state: [INTERN] the current state of the NAND device |
| 340 | * @oob_poi: poison value buffer | 339 | * @oob_poi: poison value buffer |
| 341 | * @page_shift: [INTERN] number of address bits in a page (column address bits) | 340 | * @page_shift: [INTERN] number of address bits in a page (column address bits) |
| 342 | * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock | 341 | * @phys_erase_shift: [INTERN] number of address bits in a physical eraseblock |
| 343 | * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry | 342 | * @bbt_erase_shift: [INTERN] number of address bits in a bbt entry |
| 344 | * @chip_shift: [INTERN] number of address bits in one chip | 343 | * @chip_shift: [INTERN] number of address bits in one chip |
| 345 | * @datbuf: [INTERN] internal buffer for one page + oob | ||
| 346 | * @oobbuf: [INTERN] oob buffer for one eraseblock | ||
| 347 | * @oobdirty: [INTERN] indicates that oob_buf must be reinitialized | ||
| 348 | * @data_poi: [INTERN] pointer to a data buffer | ||
| 349 | * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about | 344 | * @options: [BOARDSPECIFIC] various chip options. They can partly be set to inform nand_scan about |
| 350 | * special functionality. See the defines for further explanation | 345 | * special functionality. See the defines for further explanation |
| 351 | * @badblockpos: [INTERN] position of the bad block marker in the oob area | 346 | * @badblockpos: [INTERN] position of the bad block marker in the oob area |
| @@ -399,7 +394,7 @@ struct nand_chip { | |||
| 399 | int bbt_erase_shift; | 394 | int bbt_erase_shift; |
| 400 | int chip_shift; | 395 | int chip_shift; |
| 401 | int numchips; | 396 | int numchips; |
| 402 | unsigned long chipsize; | 397 | uint64_t chipsize; |
| 403 | int pagemask; | 398 | int pagemask; |
| 404 | int pagebuf; | 399 | int pagebuf; |
| 405 | int subpagesize; | 400 | int subpagesize; |
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h index c92b4d43960..a45dd831b3f 100644 --- a/include/linux/mtd/partitions.h +++ b/include/linux/mtd/partitions.h | |||
| @@ -36,9 +36,9 @@ | |||
| 36 | 36 | ||
| 37 | struct mtd_partition { | 37 | struct mtd_partition { |
| 38 | char *name; /* identifier string */ | 38 | char *name; /* identifier string */ |
| 39 | u_int32_t size; /* partition size */ | 39 | uint64_t size; /* partition size */ |
| 40 | u_int32_t offset; /* offset within the master MTD space */ | 40 | uint64_t offset; /* offset within the master MTD space */ |
| 41 | u_int32_t mask_flags; /* master MTD flags to mask out for this partition */ | 41 | uint32_t mask_flags; /* master MTD flags to mask out for this partition */ |
| 42 | struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ | 42 | struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ |
| 43 | struct mtd_info **mtdp; /* pointer to store the MTD object */ | 43 | struct mtd_info **mtdp; /* pointer to store the MTD object */ |
| 44 | }; | 44 | }; |
diff --git a/include/linux/mtd/pfow.h b/include/linux/mtd/pfow.h new file mode 100644 index 00000000000..b730d4f8465 --- /dev/null +++ b/include/linux/mtd/pfow.h | |||
| @@ -0,0 +1,159 @@ | |||
| 1 | /* Primary function overlay window definitions | ||
| 2 | * and service functions used by LPDDR chips | ||
| 3 | */ | ||
| 4 | #ifndef __LINUX_MTD_PFOW_H | ||
| 5 | #define __LINUX_MTD_PFOW_H | ||
| 6 | |||
| 7 | #include <linux/mtd/qinfo.h> | ||
| 8 | |||
| 9 | /* PFOW registers addressing */ | ||
| 10 | /* Address of symbol "P" */ | ||
| 11 | #define PFOW_QUERY_STRING_P 0x0000 | ||
| 12 | /* Address of symbol "F" */ | ||
| 13 | #define PFOW_QUERY_STRING_F 0x0002 | ||
| 14 | /* Address of symbol "O" */ | ||
| 15 | #define PFOW_QUERY_STRING_O 0x0004 | ||
| 16 | /* Address of symbol "W" */ | ||
| 17 | #define PFOW_QUERY_STRING_W 0x0006 | ||
| 18 | /* Identification info for LPDDR chip */ | ||
| 19 | #define PFOW_MANUFACTURER_ID 0x0020 | ||
| 20 | #define PFOW_DEVICE_ID 0x0022 | ||
| 21 | /* Address in PFOW where prog buffer can can be found */ | ||
| 22 | #define PFOW_PROGRAM_BUFFER_OFFSET 0x0040 | ||
| 23 | /* Size of program buffer in words */ | ||
| 24 | #define PFOW_PROGRAM_BUFFER_SIZE 0x0042 | ||
| 25 | /* Address command code register */ | ||
| 26 | #define PFOW_COMMAND_CODE 0x0080 | ||
| 27 | /* command data register */ | ||
| 28 | #define PFOW_COMMAND_DATA 0x0084 | ||
| 29 | /* command address register lower address bits */ | ||
| 30 | #define PFOW_COMMAND_ADDRESS_L 0x0088 | ||
| 31 | /* command address register upper address bits */ | ||
| 32 | #define PFOW_COMMAND_ADDRESS_H 0x008a | ||
| 33 | /* number of bytes to be proggrammed lower address bits */ | ||
| 34 | #define PFOW_DATA_COUNT_L 0x0090 | ||
| 35 | /* number of bytes to be proggrammed higher address bits */ | ||
| 36 | #define PFOW_DATA_COUNT_H 0x0092 | ||
| 37 | /* command execution register, the only possible value is 0x01 */ | ||
| 38 | #define PFOW_COMMAND_EXECUTE 0x00c0 | ||
| 39 | /* 0x01 should be written at this address to clear buffer */ | ||
| 40 | #define PFOW_CLEAR_PROGRAM_BUFFER 0x00c4 | ||
| 41 | /* device program/erase suspend register */ | ||
| 42 | #define PFOW_PROGRAM_ERASE_SUSPEND 0x00c8 | ||
| 43 | /* device status register */ | ||
| 44 | #define PFOW_DSR 0x00cc | ||
| 45 | |||
| 46 | /* LPDDR memory device command codes */ | ||
| 47 | /* They are possible values of PFOW command code register */ | ||
| 48 | #define LPDDR_WORD_PROGRAM 0x0041 | ||
| 49 | #define LPDDR_BUFF_PROGRAM 0x00E9 | ||
| 50 | #define LPDDR_BLOCK_ERASE 0x0020 | ||
| 51 | #define LPDDR_LOCK_BLOCK 0x0061 | ||
| 52 | #define LPDDR_UNLOCK_BLOCK 0x0062 | ||
| 53 | #define LPDDR_READ_BLOCK_LOCK_STATUS 0x0065 | ||
| 54 | #define LPDDR_INFO_QUERY 0x0098 | ||
| 55 | #define LPDDR_READ_OTP 0x0097 | ||
| 56 | #define LPDDR_PROG_OTP 0x00C0 | ||
| 57 | #define LPDDR_RESUME 0x00D0 | ||
| 58 | |||
| 59 | /* Defines possible value of PFOW command execution register */ | ||
| 60 | #define LPDDR_START_EXECUTION 0x0001 | ||
| 61 | |||
| 62 | /* Defines possible value of PFOW program/erase suspend register */ | ||
| 63 | #define LPDDR_SUSPEND 0x0001 | ||
| 64 | |||
| 65 | /* Possible values of PFOW device status register */ | ||
| 66 | /* access R - read; RC read & clearable */ | ||
| 67 | #define DSR_DPS (1<<1) /* RC; device protect status | ||
| 68 | * 0 - not protected 1 - locked */ | ||
| 69 | #define DSR_PSS (1<<2) /* R; program suspend status; | ||
| 70 | * 0-prog in progress/completed, | ||
| 71 | * 1- prog suspended */ | ||
| 72 | #define DSR_VPPS (1<<3) /* RC; 0-Vpp OK, * 1-Vpp low */ | ||
| 73 | #define DSR_PROGRAM_STATUS (1<<4) /* RC; 0-successful, 1-error */ | ||
| 74 | #define DSR_ERASE_STATUS (1<<5) /* RC; erase or blank check status; | ||
| 75 | * 0-success erase/blank check, | ||
| 76 | * 1 blank check error */ | ||
| 77 | #define DSR_ESS (1<<6) /* R; erase suspend status; | ||
| 78 | * 0-erase in progress/complete, | ||
| 79 | * 1 erase suspended */ | ||
| 80 | #define DSR_READY_STATUS (1<<7) /* R; Device status | ||
| 81 | * 0-busy, | ||
| 82 | * 1-ready */ | ||
| 83 | #define DSR_RPS (0x3<<8) /* RC; region program status | ||
| 84 | * 00 - Success, | ||
| 85 | * 01-re-program attempt in region with | ||
| 86 | * object mode data, | ||
| 87 | * 10-object mode program w attempt in | ||
| 88 | * region with control mode data | ||
| 89 | * 11-attempt to program invalid half | ||
| 90 | * with 0x41 command */ | ||
| 91 | #define DSR_AOS (1<<12) /* RC; 1- AO related failure */ | ||
| 92 | #define DSR_AVAILABLE (1<<15) /* R; Device availbility | ||
| 93 | * 1 - Device available | ||
| 94 | * 0 - not available */ | ||
| 95 | |||
| 96 | /* The superset of all possible error bits in DSR */ | ||
| 97 | #define DSR_ERR 0x133A | ||
| 98 | |||
| 99 | static inline void send_pfow_command(struct map_info *map, | ||
| 100 | unsigned long cmd_code, unsigned long adr, | ||
| 101 | unsigned long len, map_word *datum) | ||
| 102 | { | ||
| 103 | int bits_per_chip = map_bankwidth(map) * 8; | ||
| 104 | int chipnum; | ||
| 105 | struct lpddr_private *lpddr = map->fldrv_priv; | ||
| 106 | chipnum = adr >> lpddr->chipshift; | ||
| 107 | |||
| 108 | map_write(map, CMD(cmd_code), map->pfow_base + PFOW_COMMAND_CODE); | ||
| 109 | map_write(map, CMD(adr & ((1<<bits_per_chip) - 1)), | ||
| 110 | map->pfow_base + PFOW_COMMAND_ADDRESS_L); | ||
| 111 | map_write(map, CMD(adr>>bits_per_chip), | ||
| 112 | map->pfow_base + PFOW_COMMAND_ADDRESS_H); | ||
| 113 | if (len) { | ||
| 114 | map_write(map, CMD(len & ((1<<bits_per_chip) - 1)), | ||
| 115 | map->pfow_base + PFOW_DATA_COUNT_L); | ||
| 116 | map_write(map, CMD(len>>bits_per_chip), | ||
| 117 | map->pfow_base + PFOW_DATA_COUNT_H); | ||
| 118 | } | ||
| 119 | if (datum) | ||
| 120 | map_write(map, *datum, map->pfow_base + PFOW_COMMAND_DATA); | ||
| 121 | |||
| 122 | /* Command execution start */ | ||
| 123 | map_write(map, CMD(LPDDR_START_EXECUTION), | ||
| 124 | map->pfow_base + PFOW_COMMAND_EXECUTE); | ||
| 125 | } | ||
| 126 | |||
| 127 | static inline void print_drs_error(unsigned dsr) | ||
| 128 | { | ||
| 129 | int prog_status = (dsr & DSR_RPS) >> 8; | ||
| 130 | |||
| 131 | if (!(dsr & DSR_AVAILABLE)) | ||
| 132 | printk(KERN_NOTICE"DSR.15: (0) Device not Available\n"); | ||
| 133 | if (prog_status & 0x03) | ||
| 134 | printk(KERN_NOTICE"DSR.9,8: (11) Attempt to program invalid " | ||
| 135 | "half with 41h command\n"); | ||
| 136 | else if (prog_status & 0x02) | ||
| 137 | printk(KERN_NOTICE"DSR.9,8: (10) Object Mode Program attempt " | ||
| 138 | "in region with Control Mode data\n"); | ||
| 139 | else if (prog_status & 0x01) | ||
| 140 | printk(KERN_NOTICE"DSR.9,8: (01) Program attempt in region " | ||
| 141 | "with Object Mode data\n"); | ||
| 142 | if (!(dsr & DSR_READY_STATUS)) | ||
| 143 | printk(KERN_NOTICE"DSR.7: (0) Device is Busy\n"); | ||
| 144 | if (dsr & DSR_ESS) | ||
| 145 | printk(KERN_NOTICE"DSR.6: (1) Erase Suspended\n"); | ||
| 146 | if (dsr & DSR_ERASE_STATUS) | ||
| 147 | printk(KERN_NOTICE"DSR.5: (1) Erase/Blank check error\n"); | ||
| 148 | if (dsr & DSR_PROGRAM_STATUS) | ||
| 149 | printk(KERN_NOTICE"DSR.4: (1) Program Error\n"); | ||
| 150 | if (dsr & DSR_VPPS) | ||
| 151 | printk(KERN_NOTICE"DSR.3: (1) Vpp low detect, operation " | ||
| 152 | "aborted\n"); | ||
| 153 | if (dsr & DSR_PSS) | ||
| 154 | printk(KERN_NOTICE"DSR.2: (1) Program suspended\n"); | ||
| 155 | if (dsr & DSR_DPS) | ||
| 156 | printk(KERN_NOTICE"DSR.1: (1) Aborted Erase/Program attempt " | ||
| 157 | "on locked block\n"); | ||
| 158 | } | ||
| 159 | #endif /* __LINUX_MTD_PFOW_H */ | ||
diff --git a/include/linux/mtd/physmap.h b/include/linux/mtd/physmap.h index c8e63a5ee72..76f7cabf07d 100644 --- a/include/linux/mtd/physmap.h +++ b/include/linux/mtd/physmap.h | |||
| @@ -24,6 +24,7 @@ struct physmap_flash_data { | |||
| 24 | unsigned int width; | 24 | unsigned int width; |
| 25 | void (*set_vpp)(struct map_info *, int); | 25 | void (*set_vpp)(struct map_info *, int); |
| 26 | unsigned int nr_parts; | 26 | unsigned int nr_parts; |
| 27 | unsigned int pfow_base; | ||
| 27 | struct mtd_partition *parts; | 28 | struct mtd_partition *parts; |
| 28 | }; | 29 | }; |
| 29 | 30 | ||
diff --git a/include/linux/mtd/qinfo.h b/include/linux/mtd/qinfo.h new file mode 100644 index 00000000000..7b3d487d8b3 --- /dev/null +++ b/include/linux/mtd/qinfo.h | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | #ifndef __LINUX_MTD_QINFO_H | ||
| 2 | #define __LINUX_MTD_QINFO_H | ||
| 3 | |||
| 4 | #include <linux/mtd/map.h> | ||
| 5 | #include <linux/wait.h> | ||
| 6 | #include <linux/spinlock.h> | ||
| 7 | #include <linux/delay.h> | ||
| 8 | #include <linux/mtd/mtd.h> | ||
| 9 | #include <linux/mtd/flashchip.h> | ||
| 10 | #include <linux/mtd/partitions.h> | ||
| 11 | |||
| 12 | /* lpddr_private describes lpddr flash chip in memory map | ||
| 13 | * @ManufactId - Chip Manufacture ID | ||
| 14 | * @DevId - Chip Device ID | ||
| 15 | * @qinfo - pointer to qinfo records describing the chip | ||
| 16 | * @numchips - number of chips including virual RWW partitions | ||
| 17 | * @chipshift - Chip/partiton size 2^chipshift | ||
| 18 | * @chips - per-chip data structure | ||
| 19 | */ | ||
| 20 | struct lpddr_private { | ||
| 21 | uint16_t ManufactId; | ||
| 22 | uint16_t DevId; | ||
| 23 | struct qinfo_chip *qinfo; | ||
| 24 | int numchips; | ||
| 25 | unsigned long chipshift; | ||
| 26 | struct flchip chips[0]; | ||
| 27 | }; | ||
| 28 | |||
| 29 | /* qinfo_query_info structure contains request information for | ||
| 30 | * each qinfo record | ||
| 31 | * @major - major number of qinfo record | ||
| 32 | * @major - minor number of qinfo record | ||
| 33 | * @id_str - descriptive string to access the record | ||
| 34 | * @desc - detailed description for the qinfo record | ||
| 35 | */ | ||
| 36 | struct qinfo_query_info { | ||
| 37 | uint8_t major; | ||
| 38 | uint8_t minor; | ||
| 39 | char *id_str; | ||
| 40 | char *desc; | ||
| 41 | }; | ||
| 42 | |||
| 43 | /* | ||
| 44 | * qinfo_chip structure contains necessary qinfo records data | ||
| 45 | * @DevSizeShift - Device size 2^n bytes | ||
| 46 | * @BufSizeShift - Program buffer size 2^n bytes | ||
| 47 | * @TotalBlocksNum - Total number of blocks | ||
| 48 | * @UniformBlockSizeShift - Uniform block size 2^UniformBlockSizeShift bytes | ||
| 49 | * @HWPartsNum - Number of hardware partitions | ||
| 50 | * @SuspEraseSupp - Suspend erase supported | ||
| 51 | * @SingleWordProgTime - Single word program 2^SingleWordProgTime u-sec | ||
| 52 | * @ProgBufferTime - Program buffer write 2^ProgBufferTime u-sec | ||
| 53 | * @BlockEraseTime - Block erase 2^BlockEraseTime m-sec | ||
| 54 | */ | ||
| 55 | struct qinfo_chip { | ||
| 56 | /* General device info */ | ||
| 57 | uint16_t DevSizeShift; | ||
| 58 | uint16_t BufSizeShift; | ||
| 59 | /* Erase block information */ | ||
| 60 | uint16_t TotalBlocksNum; | ||
| 61 | uint16_t UniformBlockSizeShift; | ||
| 62 | /* Partition information */ | ||
| 63 | uint16_t HWPartsNum; | ||
| 64 | /* Optional features */ | ||
| 65 | uint16_t SuspEraseSupp; | ||
| 66 | /* Operation typical time */ | ||
| 67 | uint16_t SingleWordProgTime; | ||
| 68 | uint16_t ProgBufferTime; | ||
| 69 | uint16_t BlockEraseTime; | ||
| 70 | }; | ||
| 71 | |||
| 72 | /* defines for fixup usage */ | ||
| 73 | #define LPDDR_MFR_ANY 0xffff | ||
| 74 | #define LPDDR_ID_ANY 0xffff | ||
| 75 | #define NUMONYX_MFGR_ID 0x0089 | ||
| 76 | #define R18_DEVICE_ID_1G 0x893c | ||
| 77 | |||
| 78 | static inline map_word lpddr_build_cmd(u_long cmd, struct map_info *map) | ||
| 79 | { | ||
| 80 | map_word val = { {0} }; | ||
| 81 | val.x[0] = cmd; | ||
| 82 | return val; | ||
| 83 | } | ||
| 84 | |||
| 85 | #define CMD(x) lpddr_build_cmd(x, map) | ||
| 86 | #define CMDVAL(cmd) cmd.x[0] | ||
| 87 | |||
| 88 | struct mtd_info *lpddr_cmdset(struct map_info *); | ||
| 89 | |||
| 90 | #endif | ||
| 91 | |||
diff --git a/include/linux/mtd/sharpsl.h b/include/linux/mtd/sharpsl.h new file mode 100644 index 00000000000..25f4d2a845c --- /dev/null +++ b/include/linux/mtd/sharpsl.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | /* | ||
| 2 | * SharpSL NAND support | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008 Dmitry Baryshkov | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/mtd/nand.h> | ||
| 12 | #include <linux/mtd/nand_ecc.h> | ||
| 13 | #include <linux/mtd/partitions.h> | ||
| 14 | |||
| 15 | struct sharpsl_nand_platform_data { | ||
| 16 | struct nand_bbt_descr *badblock_pattern; | ||
| 17 | struct nand_ecclayout *ecc_layout; | ||
| 18 | struct mtd_partition *partitions; | ||
| 19 | unsigned int nr_partitions; | ||
| 20 | }; | ||
