diff options
| author | Nicolas Pitre <nico@cam.org> | 2005-02-08 12:11:19 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@mtd.linutronix.de> | 2005-05-23 06:25:23 -0400 |
| commit | f77814dd5728edaf1239d19755d2aa0d8c33d861 (patch) | |
| tree | 5cf7f73aa367bf152e5fbd16b5173e18bb787dd5 /include/linux/mtd | |
| parent | 67d9e95c393d23c229836e28b262dc73d71da784 (diff) | |
[MTD] Support for protection register support on Intel FLASH chips
This enables support for reading, writing and locking so called
"Protection Registers" present on some flash chips.
A subset of them are pre-programmed at the factory with a
unique set of values. The rest is user-programmable.
Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/mtd')
| -rw-r--r-- | include/linux/mtd/cfi.h | 4 | ||||
| -rw-r--r-- | include/linux/mtd/flashchip.h | 3 | ||||
| -rw-r--r-- | include/linux/mtd/map.h | 15 | ||||
| -rw-r--r-- | include/linux/mtd/mtd.h | 10 |
4 files changed, 23 insertions, 9 deletions
diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h index d87dc3fbd4ba..76255474a27c 100644 --- a/include/linux/mtd/cfi.h +++ b/include/linux/mtd/cfi.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | /* Common Flash Interface structures | 2 | /* Common Flash Interface structures |
| 3 | * See http://support.intel.com/design/flash/technote/index.htm | 3 | * See http://support.intel.com/design/flash/technote/index.htm |
| 4 | * $Id: cfi.h,v 1.51 2005/02/05 02:06:16 nico Exp $ | 4 | * $Id: cfi.h,v 1.52 2005/02/08 17:11:15 nico Exp $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #ifndef __MTD_CFI_H__ | 7 | #ifndef __MTD_CFI_H__ |
| @@ -252,7 +252,7 @@ static inline uint32_t cfi_build_cmd_addr(uint32_t cmd_ofs, int interleave, int | |||
| 252 | * It looks too long to be inline, but in the common case it should almost all | 252 | * It looks too long to be inline, but in the common case it should almost all |
| 253 | * get optimised away. | 253 | * get optimised away. |
| 254 | */ | 254 | */ |
| 255 | static inline map_word cfi_build_cmd(u_char cmd, struct map_info *map, struct cfi_private *cfi) | 255 | static inline map_word cfi_build_cmd(u_long cmd, struct map_info *map, struct cfi_private *cfi) |
| 256 | { | 256 | { |
| 257 | map_word val = { {0} }; | 257 | map_word val = { {0} }; |
| 258 | int wordwidth, words_per_bus, chip_mode, chips_per_word; | 258 | int wordwidth, words_per_bus, chip_mode, chips_per_word; |
diff --git a/include/linux/mtd/flashchip.h b/include/linux/mtd/flashchip.h index c66ba812bf90..e778a1ab23c4 100644 --- a/include/linux/mtd/flashchip.h +++ b/include/linux/mtd/flashchip.h | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * | 6 | * |
| 7 | * (C) 2000 Red Hat. GPLd. | 7 | * (C) 2000 Red Hat. GPLd. |
| 8 | * | 8 | * |
| 9 | * $Id: flashchip.h,v 1.15 2004/11/05 22:41:06 nico Exp $ | 9 | * $Id: flashchip.h,v 1.16 2005/02/08 17:11:15 nico Exp $ |
| 10 | * | 10 | * |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| @@ -29,6 +29,7 @@ typedef enum { | |||
| 29 | FL_ERASE_SUSPENDED, | 29 | FL_ERASE_SUSPENDED, |
| 30 | FL_WRITING, | 30 | FL_WRITING, |
| 31 | FL_WRITING_TO_BUFFER, | 31 | FL_WRITING_TO_BUFFER, |
| 32 | FL_OTP_WRITE, | ||
| 32 | FL_WRITE_SUSPENDING, | 33 | FL_WRITE_SUSPENDING, |
| 33 | FL_WRITE_SUSPENDED, | 34 | FL_WRITE_SUSPENDED, |
| 34 | FL_PM_SUSPENDED, | 35 | FL_PM_SUSPENDED, |
diff --git a/include/linux/mtd/map.h b/include/linux/mtd/map.h index f0268b99c900..8fc6679aa9b1 100644 --- a/include/linux/mtd/map.h +++ b/include/linux/mtd/map.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | 1 | ||
| 2 | /* Overhauled routines for dealing with different mmap regions of flash */ | 2 | /* Overhauled routines for dealing with different mmap regions of flash */ |
| 3 | /* $Id: map.h,v 1.46 2005/01/05 17:09:44 dwmw2 Exp $ */ | 3 | /* $Id: map.h,v 1.47 2005/02/08 17:11:15 nico Exp $ */ |
| 4 | 4 | ||
| 5 | #ifndef __LINUX_MTD_MAP_H__ | 5 | #ifndef __LINUX_MTD_MAP_H__ |
| 6 | #define __LINUX_MTD_MAP_H__ | 6 | #define __LINUX_MTD_MAP_H__ |
| @@ -263,6 +263,17 @@ static inline map_word map_word_and(struct map_info *map, map_word val1, map_wor | |||
| 263 | return r; | 263 | return r; |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | static inline map_word map_word_clr(struct map_info *map, map_word val1, map_word val2) | ||
| 267 | { | ||
| 268 | map_word r; | ||
| 269 | int i; | ||
| 270 | |||
| 271 | for (i=0; i<map_words(map); i++) { | ||
| 272 | r.x[i] = val1.x[i] & ~val2.x[i]; | ||
| 273 | } | ||
| 274 | return r; | ||
| 275 | } | ||
| 276 | |||
| 266 | static inline map_word map_word_or(struct map_info *map, map_word val1, map_word val2) | 277 | static inline map_word map_word_or(struct map_info *map, map_word val1, map_word val2) |
| 267 | { | 278 | { |
| 268 | map_word r; | 279 | map_word r; |
| @@ -273,6 +284,7 @@ static inline map_word map_word_or(struct map_info *map, map_word val1, map_word | |||
| 273 | } | 284 | } |
| 274 | return r; | 285 | return r; |
| 275 | } | 286 | } |
| 287 | |||
| 276 | #define map_word_andequal(m, a, b, z) map_word_equal(m, z, map_word_and(m, a, b)) | 288 | #define map_word_andequal(m, a, b, z) map_word_equal(m, z, map_word_and(m, a, b)) |
| 277 | 289 | ||
| 278 | static inline int map_word_bitsset(struct map_info *map, map_word val1, map_word val2) | 290 | static inline int map_word_bitsset(struct map_info *map, map_word val1, map_word val2) |
| @@ -338,6 +350,7 @@ static inline map_word map_word_ff(struct map_info *map) | |||
| 338 | } | 350 | } |
| 339 | return r; | 351 | return r; |
| 340 | } | 352 | } |
| 353 | |||
| 341 | static inline map_word inline_map_read(struct map_info *map, unsigned long ofs) | 354 | static inline map_word inline_map_read(struct map_info *map, unsigned long ofs) |
| 342 | { | 355 | { |
| 343 | map_word r; | 356 | map_word r; |
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index b3d134392b31..3aab1b8729e0 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * $Id: mtd.h,v 1.56 2004/08/09 18:46:04 dmarlin Exp $ | 2 | * $Id: mtd.h,v 1.57 2005/02/08 17:11:15 nico Exp $ |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al. | 4 | * Copyright (C) 1999-2003 David Woodhouse <dwmw2@infradead.org> et al. |
| 5 | * | 5 | * |
| @@ -113,12 +113,12 @@ struct mtd_info { | |||
| 113 | * flash devices. The user data is one time programmable but the | 113 | * flash devices. The user data is one time programmable but the |
| 114 | * factory data is read only. | 114 | * factory data is read only. |
| 115 | */ | 115 | */ |
| 116 | int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | 116 | int (*get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len); |
| 117 | |||
| 118 | int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | 117 | int (*read_fact_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); |
| 119 | 118 | int (*get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf, size_t len); | |
| 120 | /* This function is not yet implemented */ | 119 | int (*read_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); |
| 121 | int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); | 120 | int (*write_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf); |
| 121 | int (*lock_user_prot_reg) (struct mtd_info *mtd, loff_t from, size_t len); | ||
| 122 | 122 | ||
| 123 | /* kvec-based read/write methods. We need these especially for NAND flash, | 123 | /* kvec-based read/write methods. We need these especially for NAND flash, |
| 124 | with its limited number of write cycles per erase. | 124 | with its limited number of write cycles per erase. |
