diff options
author | Rohit Hagargundgi <h.rohit@samsung.com> | 2009-05-12 16:46:57 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-05 13:59:21 -0400 |
commit | 5988af2319781bc8e0ce418affec4e09cfa77907 (patch) | |
tree | 7de04259b49ab0b50b98e9dae6a5fe61d3de67bc /include/linux/mtd/onenand.h | |
parent | 67ce04bf2746f8a1f8c2a104b313d20c63f68378 (diff) |
mtd: Flex-OneNAND support
Add support for Samsung Flex-OneNAND devices.
Flex-OneNAND combines SLC and MLC technologies into a single device.
SLC area provides increased reliability and speed, suitable for storing
code such as bootloader, kernel and root file system. MLC area
provides high density and is suitable for storing user data.
SLC and MLC regions can be configured through kernel parameter.
[akpm@linux-foundation.org: export flexoand_region and onenand_addr]
Signed-off-by: Rohit Hagargundgi <h.rohit@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Vishak G <vishak.g@samsung.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'include/linux/mtd/onenand.h')
-rw-r--r-- | include/linux/mtd/onenand.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/mtd/onenand.h b/include/linux/mtd/onenand.h index 0fa3ac4ad576..9aab82c1c743 100644 --- a/include/linux/mtd/onenand.h +++ b/include/linux/mtd/onenand.h | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/mtd/onenand_regs.h> | 17 | #include <linux/mtd/onenand_regs.h> |
18 | #include <linux/mtd/bbm.h> | 18 | #include <linux/mtd/bbm.h> |
19 | 19 | ||
20 | #define MAX_DIES 2 | ||
20 | #define MAX_BUFFERRAM 2 | 21 | #define MAX_BUFFERRAM 2 |
21 | 22 | ||
22 | /* Scan and identify a OneNAND device */ | 23 | /* Scan and identify a OneNAND device */ |
@@ -51,7 +52,12 @@ struct onenand_bufferram { | |||
51 | /** | 52 | /** |
52 | * struct onenand_chip - OneNAND Private Flash Chip Data | 53 | * struct onenand_chip - OneNAND Private Flash Chip Data |
53 | * @base: [BOARDSPECIFIC] address to access OneNAND | 54 | * @base: [BOARDSPECIFIC] address to access OneNAND |
55 | * @dies: [INTERN][FLEX-ONENAND] number of dies on chip | ||
56 | * @boundary: [INTERN][FLEX-ONENAND] Boundary of the dies | ||
57 | * @diesize: [INTERN][FLEX-ONENAND] Size of the dies | ||
54 | * @chipsize: [INTERN] the size of one chip for multichip arrays | 58 | * @chipsize: [INTERN] the size of one chip for multichip arrays |
59 | * FIXME For Flex-OneNAND, chipsize holds maximum possible | ||
60 | * device size ie when all blocks are considered MLC | ||
55 | * @device_id: [INTERN] device ID | 61 | * @device_id: [INTERN] device ID |
56 | * @density_mask: chip density, used for DDP devices | 62 | * @density_mask: chip density, used for DDP devices |
57 | * @verstion_id: [INTERN] version ID | 63 | * @verstion_id: [INTERN] version ID |
@@ -92,9 +98,13 @@ struct onenand_bufferram { | |||
92 | */ | 98 | */ |
93 | struct onenand_chip { | 99 | struct onenand_chip { |
94 | void __iomem *base; | 100 | void __iomem *base; |
101 | unsigned dies; | ||
102 | unsigned boundary[MAX_DIES]; | ||
103 | loff_t diesize[MAX_DIES]; | ||
95 | unsigned int chipsize; | 104 | unsigned int chipsize; |
96 | unsigned int device_id; | 105 | unsigned int device_id; |
97 | unsigned int version_id; | 106 | unsigned int version_id; |
107 | unsigned int technology; | ||
98 | unsigned int density_mask; | 108 | unsigned int density_mask; |
99 | unsigned int options; | 109 | unsigned int options; |
100 | 110 | ||
@@ -145,6 +155,8 @@ struct onenand_chip { | |||
145 | #define ONENAND_SET_BUFFERRAM0(this) (this->bufferram_index = 0) | 155 | #define ONENAND_SET_BUFFERRAM0(this) (this->bufferram_index = 0) |
146 | #define ONENAND_SET_BUFFERRAM1(this) (this->bufferram_index = 1) | 156 | #define ONENAND_SET_BUFFERRAM1(this) (this->bufferram_index = 1) |
147 | 157 | ||
158 | #define FLEXONENAND(this) \ | ||
159 | (this->device_id & DEVICE_IS_FLEXONENAND) | ||
148 | #define ONENAND_GET_SYS_CFG1(this) \ | 160 | #define ONENAND_GET_SYS_CFG1(this) \ |
149 | (this->read_word(this->base + ONENAND_REG_SYS_CFG1)) | 161 | (this->read_word(this->base + ONENAND_REG_SYS_CFG1)) |
150 | #define ONENAND_SET_SYS_CFG1(v, this) \ | 162 | #define ONENAND_SET_SYS_CFG1(v, this) \ |
@@ -153,6 +165,9 @@ struct onenand_chip { | |||
153 | #define ONENAND_IS_DDP(this) \ | 165 | #define ONENAND_IS_DDP(this) \ |
154 | (this->device_id & ONENAND_DEVICE_IS_DDP) | 166 | (this->device_id & ONENAND_DEVICE_IS_DDP) |
155 | 167 | ||
168 | #define ONENAND_IS_MLC(this) \ | ||
169 | (this->technology & ONENAND_TECHNOLOGY_IS_MLC) | ||
170 | |||
156 | #ifdef CONFIG_MTD_ONENAND_2X_PROGRAM | 171 | #ifdef CONFIG_MTD_ONENAND_2X_PROGRAM |
157 | #define ONENAND_IS_2PLANE(this) \ | 172 | #define ONENAND_IS_2PLANE(this) \ |
158 | (this->options & ONENAND_HAS_2PLANE) | 173 | (this->options & ONENAND_HAS_2PLANE) |
@@ -190,5 +205,8 @@ struct onenand_manufacturers { | |||
190 | 205 | ||
191 | int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, | 206 | int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, |
192 | struct mtd_oob_ops *ops); | 207 | struct mtd_oob_ops *ops); |
208 | unsigned onenand_block(struct onenand_chip *this, loff_t addr); | ||
209 | loff_t onenand_addr(struct onenand_chip *this, int block); | ||
210 | int flexonenand_region(struct mtd_info *mtd, loff_t addr); | ||
193 | 211 | ||
194 | #endif /* __LINUX_MTD_ONENAND_H */ | 212 | #endif /* __LINUX_MTD_ONENAND_H */ |