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 /drivers/mtd/mtdpart.c | |
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 'drivers/mtd/mtdpart.c')
-rw-r--r-- | drivers/mtd/mtdpart.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c index 96ebb52f24b1..b92e6bfffaf2 100644 --- a/drivers/mtd/mtdpart.c +++ b/drivers/mtd/mtdpart.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * This code is GPL | 6 | * This code is GPL |
7 | * | 7 | * |
8 | * $Id: mtdpart.c,v 1.51 2004/11/16 18:28:59 dwmw2 Exp $ | 8 | * $Id: mtdpart.c,v 1.53 2005/02/08 17:11:13 nico Exp $ |
9 | * | 9 | * |
10 | * 02-21-2002 Thomas Gleixner <gleixner@autronix.de> | 10 | * 02-21-2002 Thomas Gleixner <gleixner@autronix.de> |
11 | * added support for read_oob, write_oob | 11 | * added support for read_oob, write_oob |
@@ -116,6 +116,13 @@ static int part_read_user_prot_reg (struct mtd_info *mtd, loff_t from, size_t le | |||
116 | len, retlen, buf); | 116 | len, retlen, buf); |
117 | } | 117 | } |
118 | 118 | ||
119 | static int part_get_user_prot_info (struct mtd_info *mtd, | ||
120 | struct otp_info *buf, size_t len) | ||
121 | { | ||
122 | struct mtd_part *part = PART(mtd); | ||
123 | return part->master->get_user_prot_info (part->master, buf, len); | ||
124 | } | ||
125 | |||
119 | static int part_read_fact_prot_reg (struct mtd_info *mtd, loff_t from, size_t len, | 126 | static int part_read_fact_prot_reg (struct mtd_info *mtd, loff_t from, size_t len, |
120 | size_t *retlen, u_char *buf) | 127 | size_t *retlen, u_char *buf) |
121 | { | 128 | { |
@@ -124,6 +131,13 @@ static int part_read_fact_prot_reg (struct mtd_info *mtd, loff_t from, size_t le | |||
124 | len, retlen, buf); | 131 | len, retlen, buf); |
125 | } | 132 | } |
126 | 133 | ||
134 | static int part_get_fact_prot_info (struct mtd_info *mtd, | ||
135 | struct otp_info *buf, size_t len) | ||
136 | { | ||
137 | struct mtd_part *part = PART(mtd); | ||
138 | return part->master->get_fact_prot_info (part->master, buf, len); | ||
139 | } | ||
140 | |||
127 | static int part_write (struct mtd_info *mtd, loff_t to, size_t len, | 141 | static int part_write (struct mtd_info *mtd, loff_t to, size_t len, |
128 | size_t *retlen, const u_char *buf) | 142 | size_t *retlen, const u_char *buf) |
129 | { | 143 | { |
@@ -182,6 +196,12 @@ static int part_write_user_prot_reg (struct mtd_info *mtd, loff_t from, size_t l | |||
182 | len, retlen, buf); | 196 | len, retlen, buf); |
183 | } | 197 | } |
184 | 198 | ||
199 | static int part_lock_user_prot_reg (struct mtd_info *mtd, loff_t from, size_t len) | ||
200 | { | ||
201 | struct mtd_part *part = PART(mtd); | ||
202 | return part->master->lock_user_prot_reg (part->master, from, len); | ||
203 | } | ||
204 | |||
185 | static int part_writev (struct mtd_info *mtd, const struct kvec *vecs, | 205 | static int part_writev (struct mtd_info *mtd, const struct kvec *vecs, |
186 | unsigned long count, loff_t to, size_t *retlen) | 206 | unsigned long count, loff_t to, size_t *retlen) |
187 | { | 207 | { |
@@ -409,6 +429,12 @@ int add_mtd_partitions(struct mtd_info *master, | |||
409 | slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg; | 429 | slave->mtd.read_fact_prot_reg = part_read_fact_prot_reg; |
410 | if(master->write_user_prot_reg) | 430 | if(master->write_user_prot_reg) |
411 | slave->mtd.write_user_prot_reg = part_write_user_prot_reg; | 431 | slave->mtd.write_user_prot_reg = part_write_user_prot_reg; |
432 | if(master->lock_user_prot_reg) | ||
433 | slave->mtd.lock_user_prot_reg = part_lock_user_prot_reg; | ||
434 | if(master->get_user_prot_info) | ||
435 | slave->mtd.get_user_prot_info = part_get_user_prot_info; | ||
436 | if(master->get_fact_prot_info) | ||
437 | slave->mtd.get_fact_prot_info = part_get_fact_prot_info; | ||
412 | if (master->sync) | 438 | if (master->sync) |
413 | slave->mtd.sync = part_sync; | 439 | slave->mtd.sync = part_sync; |
414 | if (!i && master->suspend && master->resume) { | 440 | if (!i && master->suspend && master->resume) { |