mfd: kempld-core: Constify variables that point to const structure
[linux-2.6-block.git] / drivers / mtd / mtdpart.c
CommitLineData
1da177e4
LT
1/*
2 * Simple MTD partitioning layer
3 *
a1452a37
DW
4 * Copyright © 2000 Nicolas Pitre <nico@fluxnic.net>
5 * Copyright © 2002 Thomas Gleixner <gleixner@linutronix.de>
6 * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org>
1da177e4 7 *
a1452a37
DW
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1da177e4 21 *
97894cda 22 */
1da177e4
LT
23
24#include <linux/module.h>
25#include <linux/types.h>
26#include <linux/kernel.h>
27#include <linux/slab.h>
28#include <linux/list.h>
1da177e4
LT
29#include <linux/kmod.h>
30#include <linux/mtd/mtd.h>
31#include <linux/mtd/partitions.h>
5daa7b21 32#include <linux/err.h>
5b644aa0 33#include <linux/of.h>
1da177e4 34
eea72d5f
JI
35#include "mtdcore.h"
36
1da177e4
LT
37/* Our partition linked list */
38static LIST_HEAD(mtd_partitions);
5daa7b21 39static DEFINE_MUTEX(mtd_partitions_mutex);
1da177e4 40
0a9d72b6
RM
41/**
42 * struct mtd_part - our partition node structure
43 *
44 * @mtd: struct holding partition details
45 * @parent: parent mtd - flash device or another partition
46 * @offset: partition offset relative to the *flash device*
47 */
1da177e4
LT
48struct mtd_part {
49 struct mtd_info mtd;
0a9d72b6 50 struct mtd_info *parent;
69423d99 51 uint64_t offset;
1da177e4 52 struct list_head list;
1da177e4
LT
53};
54
55/*
56 * Given a pointer to the MTD object in the mtd_part structure, we can retrieve
2524534d 57 * the pointer to that structure.
1da177e4 58 */
2524534d
BN
59static inline struct mtd_part *mtd_to_part(const struct mtd_info *mtd)
60{
61 return container_of(mtd, struct mtd_part, mtd);
62}
1da177e4 63
97894cda
TG
64
65/*
1da177e4
LT
66 * MTD methods which simply translate the effective address and pass through
67 * to the _real_ device.
68 */
69
b33a2887
AN
70static int part_read(struct mtd_info *mtd, loff_t from, size_t len,
71 size_t *retlen, u_char *buf)
1da177e4 72{
2524534d 73 struct mtd_part *part = mtd_to_part(mtd);
d8877f19 74 struct mtd_ecc_stats stats;
f1a28c02
TG
75 int res;
76
0a9d72b6
RM
77 stats = part->parent->ecc_stats;
78 res = part->parent->_read(part->parent, from + part->offset, len,
994c8409 79 retlen, buf);
edbc4540
MD
80 if (unlikely(mtd_is_eccerr(res)))
81 mtd->ecc_stats.failed +=
0a9d72b6 82 part->parent->ecc_stats.failed - stats.failed;
edbc4540
MD
83 else
84 mtd->ecc_stats.corrected +=
0a9d72b6 85 part->parent->ecc_stats.corrected - stats.corrected;
f1a28c02 86 return res;
1da177e4
LT
87}
88
b33a2887
AN
89static int part_point(struct mtd_info *mtd, loff_t from, size_t len,
90 size_t *retlen, void **virt, resource_size_t *phys)
1da177e4 91{
2524534d 92 struct mtd_part *part = mtd_to_part(mtd);
5def4898 93
0a9d72b6 94 return part->parent->_point(part->parent, from + part->offset, len,
994c8409 95 retlen, virt, phys);
1da177e4 96}
9223a456 97
5e4e6e3f 98static int part_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
1da177e4 99{
2524534d 100 struct mtd_part *part = mtd_to_part(mtd);
1da177e4 101
0a9d72b6 102 return part->parent->_unpoint(part->parent, from + part->offset, len);
1da177e4
LT
103}
104
8593fbc6 105static int part_read_oob(struct mtd_info *mtd, loff_t from,
b33a2887 106 struct mtd_oob_ops *ops)
1da177e4 107{
2524534d 108 struct mtd_part *part = mtd_to_part(mtd);
d020fc8e 109 struct mtd_ecc_stats stats;
f1a28c02 110 int res;
8593fbc6 111
d020fc8e 112 stats = part->parent->ecc_stats;
0a9d72b6 113 res = part->parent->_read_oob(part->parent, from + part->offset, ops);
d020fc8e
BB
114 if (unlikely(mtd_is_eccerr(res)))
115 mtd->ecc_stats.failed +=
116 part->parent->ecc_stats.failed - stats.failed;
117 else
118 mtd->ecc_stats.corrected +=
119 part->parent->ecc_stats.corrected - stats.corrected;
f1a28c02 120 return res;
1da177e4
LT
121}
122
b33a2887
AN
123static int part_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
124 size_t len, size_t *retlen, u_char *buf)
1da177e4 125{
2524534d 126 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 127 return part->parent->_read_user_prot_reg(part->parent, from, len,
994c8409 128 retlen, buf);
1da177e4
LT
129}
130
4b78fc42
CR
131static int part_get_user_prot_info(struct mtd_info *mtd, size_t len,
132 size_t *retlen, struct otp_info *buf)
f77814dd 133{
2524534d 134 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 135 return part->parent->_get_user_prot_info(part->parent, len, retlen,
4b78fc42 136 buf);
f77814dd
NP
137}
138
b33a2887
AN
139static int part_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
140 size_t len, size_t *retlen, u_char *buf)
1da177e4 141{
2524534d 142 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 143 return part->parent->_read_fact_prot_reg(part->parent, from, len,
994c8409 144 retlen, buf);
1da177e4
LT
145}
146
4b78fc42
CR
147static int part_get_fact_prot_info(struct mtd_info *mtd, size_t len,
148 size_t *retlen, struct otp_info *buf)
f77814dd 149{
2524534d 150 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 151 return part->parent->_get_fact_prot_info(part->parent, len, retlen,
4b78fc42 152 buf);
f77814dd
NP
153}
154
b33a2887
AN
155static int part_write(struct mtd_info *mtd, loff_t to, size_t len,
156 size_t *retlen, const u_char *buf)
1da177e4 157{
2524534d 158 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 159 return part->parent->_write(part->parent, to + part->offset, len,
994c8409 160 retlen, buf);
1da177e4
LT
161}
162
b33a2887
AN
163static int part_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
164 size_t *retlen, const u_char *buf)
388bbb09 165{
2524534d 166 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 167 return part->parent->_panic_write(part->parent, to + part->offset, len,
994c8409 168 retlen, buf);
388bbb09
RP
169}
170
8593fbc6 171static int part_write_oob(struct mtd_info *mtd, loff_t to,
b33a2887 172 struct mtd_oob_ops *ops)
1da177e4 173{
2524534d 174 struct mtd_part *part = mtd_to_part(mtd);
8593fbc6 175
0a9d72b6 176 return part->parent->_write_oob(part->parent, to + part->offset, ops);
1da177e4
LT
177}
178
b33a2887
AN
179static int part_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
180 size_t len, size_t *retlen, u_char *buf)
1da177e4 181{
2524534d 182 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 183 return part->parent->_write_user_prot_reg(part->parent, from, len,
994c8409 184 retlen, buf);
1da177e4
LT
185}
186
b33a2887
AN
187static int part_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
188 size_t len)
f77814dd 189{
2524534d 190 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 191 return part->parent->_lock_user_prot_reg(part->parent, from, len);
f77814dd
NP
192}
193
b33a2887
AN
194static int part_writev(struct mtd_info *mtd, const struct kvec *vecs,
195 unsigned long count, loff_t to, size_t *retlen)
1da177e4 196{
2524534d 197 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 198 return part->parent->_writev(part->parent, vecs, count,
994c8409 199 to + part->offset, retlen);
1da177e4
LT
200}
201
b33a2887 202static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
1da177e4 203{
2524534d 204 struct mtd_part *part = mtd_to_part(mtd);
1da177e4 205 int ret;
664addc2 206
1da177e4 207 instr->addr += part->offset;
0a9d72b6 208 ret = part->parent->_erase(part->parent, instr);
8f347c42
BB
209 if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
210 instr->fail_addr -= part->offset;
211 instr->addr -= part->offset;
212
1da177e4
LT
213 return ret;
214}
215
69423d99 216static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1da177e4 217{
2524534d 218 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 219 return part->parent->_lock(part->parent, ofs + part->offset, len);
1da177e4
LT
220}
221
69423d99 222static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
1da177e4 223{
2524534d 224 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 225 return part->parent->_unlock(part->parent, ofs + part->offset, len);
1da177e4
LT
226}
227
9938424f
RC
228static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
229{
2524534d 230 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 231 return part->parent->_is_locked(part->parent, ofs + part->offset, len);
9938424f
RC
232}
233
1da177e4
LT
234static void part_sync(struct mtd_info *mtd)
235{
2524534d 236 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 237 part->parent->_sync(part->parent);
1da177e4
LT
238}
239
240static int part_suspend(struct mtd_info *mtd)
241{
2524534d 242 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 243 return part->parent->_suspend(part->parent);
1da177e4
LT
244}
245
246static void part_resume(struct mtd_info *mtd)
247{
2524534d 248 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 249 part->parent->_resume(part->parent);
1da177e4
LT
250}
251
8471bb73
EG
252static int part_block_isreserved(struct mtd_info *mtd, loff_t ofs)
253{
2524534d 254 struct mtd_part *part = mtd_to_part(mtd);
8471bb73 255 ofs += part->offset;
0a9d72b6 256 return part->parent->_block_isreserved(part->parent, ofs);
8471bb73
EG
257}
258
b33a2887 259static int part_block_isbad(struct mtd_info *mtd, loff_t ofs)
1da177e4 260{
2524534d 261 struct mtd_part *part = mtd_to_part(mtd);
1da177e4 262 ofs += part->offset;
0a9d72b6 263 return part->parent->_block_isbad(part->parent, ofs);
1da177e4
LT
264}
265
b33a2887 266static int part_block_markbad(struct mtd_info *mtd, loff_t ofs)
1da177e4 267{
2524534d 268 struct mtd_part *part = mtd_to_part(mtd);
f1a28c02
TG
269 int res;
270
1da177e4 271 ofs += part->offset;
0a9d72b6 272 res = part->parent->_block_markbad(part->parent, ofs);
f1a28c02
TG
273 if (!res)
274 mtd->ecc_stats.badblocks++;
275 return res;
1da177e4
LT
276}
277
5e149073
RW
278static int part_get_device(struct mtd_info *mtd)
279{
280 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 281 return part->parent->_get_device(part->parent);
5e149073
RW
282}
283
284static void part_put_device(struct mtd_info *mtd)
285{
286 struct mtd_part *part = mtd_to_part(mtd);
0a9d72b6 287 part->parent->_put_device(part->parent);
5e149073
RW
288}
289
adbbc3bc
BB
290static int part_ooblayout_ecc(struct mtd_info *mtd, int section,
291 struct mtd_oob_region *oobregion)
292{
293 struct mtd_part *part = mtd_to_part(mtd);
294
0a9d72b6 295 return mtd_ooblayout_ecc(part->parent, section, oobregion);
adbbc3bc
BB
296}
297
298static int part_ooblayout_free(struct mtd_info *mtd, int section,
299 struct mtd_oob_region *oobregion)
300{
301 struct mtd_part *part = mtd_to_part(mtd);
302
0a9d72b6 303 return mtd_ooblayout_free(part->parent, section, oobregion);
adbbc3bc
BB
304}
305
306static const struct mtd_ooblayout_ops part_ooblayout_ops = {
307 .ecc = part_ooblayout_ecc,
308 .free = part_ooblayout_free,
309};
310
6080ef6e
JW
311static int part_max_bad_blocks(struct mtd_info *mtd, loff_t ofs, size_t len)
312{
313 struct mtd_part *part = mtd_to_part(mtd);
314
0a9d72b6 315 return part->parent->_max_bad_blocks(part->parent,
6080ef6e
JW
316 ofs + part->offset, len);
317}
318
5daa7b21
RT
319static inline void free_partition(struct mtd_part *p)
320{
321 kfree(p->mtd.name);
322 kfree(p);
323}
324
1a0915be
RM
325/**
326 * mtd_parse_part - parse MTD partition looking for subpartitions
327 *
328 * @slave: part that is supposed to be a container and should be parsed
329 * @types: NULL-terminated array with names of partition parsers to try
330 *
331 * Some partitions are kind of containers with extra subpartitions (volumes).
332 * There can be various formats of such containers. This function tries to use
333 * specified parsers to analyze given partition and registers found
334 * subpartitions on success.
335 */
336static int mtd_parse_part(struct mtd_part *slave, const char *const *types)
337{
5ac67ce3 338 return parse_mtd_partitions(&slave->mtd, types, NULL);
1a0915be
RM
339}
340
0a9d72b6 341static struct mtd_part *allocate_partition(struct mtd_info *parent,
5daa7b21
RT
342 const struct mtd_partition *part, int partno,
343 uint64_t cur_offset)
7788ba71 344{
c169e3d3 345 int wr_alignment = (parent->flags & MTD_NO_ERASE) ? parent->writesize :
0a9d72b6 346 parent->erasesize;
7788ba71 347 struct mtd_part *slave;
1eeef2d7 348 u32 remainder;
5daa7b21 349 char *name;
1eeef2d7 350 u64 tmp;
7788ba71
AN
351
352 /* allocate the partition structure */
b33a2887 353 slave = kzalloc(sizeof(*slave), GFP_KERNEL);
5daa7b21
RT
354 name = kstrdup(part->name, GFP_KERNEL);
355 if (!name || !slave) {
b33a2887 356 printk(KERN_ERR"memory allocation error while creating partitions for \"%s\"\n",
0a9d72b6 357 parent->name);
5daa7b21
RT
358 kfree(name);
359 kfree(slave);
360 return ERR_PTR(-ENOMEM);
7788ba71 361 }
7788ba71
AN
362
363 /* set up the MTD object for this partition */
0a9d72b6
RM
364 slave->mtd.type = parent->type;
365 slave->mtd.flags = parent->flags & ~part->mask_flags;
7788ba71 366 slave->mtd.size = part->size;
0a9d72b6
RM
367 slave->mtd.writesize = parent->writesize;
368 slave->mtd.writebufsize = parent->writebufsize;
369 slave->mtd.oobsize = parent->oobsize;
370 slave->mtd.oobavail = parent->oobavail;
371 slave->mtd.subpage_sft = parent->subpage_sft;
372 slave->mtd.pairing = parent->pairing;
7788ba71 373
5daa7b21 374 slave->mtd.name = name;
0a9d72b6 375 slave->mtd.owner = parent->owner;
7788ba71 376
727dc612
DE
377 /* NOTE: Historically, we didn't arrange MTDs as a tree out of
378 * concern for showing the same data in multiple partitions.
379 * However, it is very useful to have the master node present,
380 * so the MTD_PARTITIONED_MASTER option allows that. The master
381 * will have device nodes etc only if this is set, so make the
382 * parent conditional on that option. Note, this is a way to
383 * distinguish between the master and the partition in sysfs.
1f24b5a8 384 */
97519dc5 385 slave->mtd.dev.parent = IS_ENABLED(CONFIG_MTD_PARTITIONED_MASTER) || mtd_is_partition(parent) ?
0a9d72b6
RM
386 &parent->dev :
387 parent->dev.parent;
42e9401b 388 slave->mtd.dev.of_node = part->of_node;
1f24b5a8 389
24ff1292
BB
390 if (parent->_read)
391 slave->mtd._read = part_read;
392 if (parent->_write)
393 slave->mtd._write = part_write;
7788ba71 394
0a9d72b6 395 if (parent->_panic_write)
3c3c10bb 396 slave->mtd._panic_write = part_panic_write;
7788ba71 397
0a9d72b6 398 if (parent->_point && parent->_unpoint) {
3c3c10bb
AB
399 slave->mtd._point = part_point;
400 slave->mtd._unpoint = part_unpoint;
7788ba71
AN
401 }
402
0a9d72b6 403 if (parent->_read_oob)
3c3c10bb 404 slave->mtd._read_oob = part_read_oob;
0a9d72b6 405 if (parent->_write_oob)
3c3c10bb 406 slave->mtd._write_oob = part_write_oob;
0a9d72b6 407 if (parent->_read_user_prot_reg)
3c3c10bb 408 slave->mtd._read_user_prot_reg = part_read_user_prot_reg;
0a9d72b6 409 if (parent->_read_fact_prot_reg)
3c3c10bb 410 slave->mtd._read_fact_prot_reg = part_read_fact_prot_reg;
0a9d72b6 411 if (parent->_write_user_prot_reg)
3c3c10bb 412 slave->mtd._write_user_prot_reg = part_write_user_prot_reg;
0a9d72b6 413 if (parent->_lock_user_prot_reg)
3c3c10bb 414 slave->mtd._lock_user_prot_reg = part_lock_user_prot_reg;
0a9d72b6 415 if (parent->_get_user_prot_info)
3c3c10bb 416 slave->mtd._get_user_prot_info = part_get_user_prot_info;
0a9d72b6 417 if (parent->_get_fact_prot_info)
3c3c10bb 418 slave->mtd._get_fact_prot_info = part_get_fact_prot_info;
0a9d72b6 419 if (parent->_sync)
3c3c10bb 420 slave->mtd._sync = part_sync;
0a9d72b6
RM
421 if (!partno && !parent->dev.class && parent->_suspend &&
422 parent->_resume) {
c169e3d3
BN
423 slave->mtd._suspend = part_suspend;
424 slave->mtd._resume = part_resume;
7788ba71 425 }
0a9d72b6 426 if (parent->_writev)
3c3c10bb 427 slave->mtd._writev = part_writev;
0a9d72b6 428 if (parent->_lock)
3c3c10bb 429 slave->mtd._lock = part_lock;
0a9d72b6 430 if (parent->_unlock)
3c3c10bb 431 slave->mtd._unlock = part_unlock;
0a9d72b6 432 if (parent->_is_locked)
3c3c10bb 433 slave->mtd._is_locked = part_is_locked;
0a9d72b6 434 if (parent->_block_isreserved)
8471bb73 435 slave->mtd._block_isreserved = part_block_isreserved;
0a9d72b6 436 if (parent->_block_isbad)
3c3c10bb 437 slave->mtd._block_isbad = part_block_isbad;
0a9d72b6 438 if (parent->_block_markbad)
3c3c10bb 439 slave->mtd._block_markbad = part_block_markbad;
0a9d72b6 440 if (parent->_max_bad_blocks)
6080ef6e 441 slave->mtd._max_bad_blocks = part_max_bad_blocks;
5e149073 442
0a9d72b6 443 if (parent->_get_device)
5e149073 444 slave->mtd._get_device = part_get_device;
0a9d72b6 445 if (parent->_put_device)
5e149073
RW
446 slave->mtd._put_device = part_put_device;
447
3c3c10bb 448 slave->mtd._erase = part_erase;
0a9d72b6 449 slave->parent = parent;
7788ba71 450 slave->offset = part->offset;
7788ba71
AN
451
452 if (slave->offset == MTDPART_OFS_APPEND)
453 slave->offset = cur_offset;
454 if (slave->offset == MTDPART_OFS_NXTBLK) {
1eeef2d7 455 tmp = cur_offset;
7788ba71 456 slave->offset = cur_offset;
1eeef2d7
CP
457 remainder = do_div(tmp, wr_alignment);
458 if (remainder) {
459 slave->offset += wr_alignment - remainder;
7788ba71 460 printk(KERN_NOTICE "Moving partition %d: "
69423d99
AH
461 "0x%012llx -> 0x%012llx\n", partno,
462 (unsigned long long)cur_offset, (unsigned long long)slave->offset);
7788ba71
AN
463 }
464 }
1a31368b
DES
465 if (slave->offset == MTDPART_OFS_RETAIN) {
466 slave->offset = cur_offset;
0a9d72b6
RM
467 if (parent->size - slave->offset >= slave->mtd.size) {
468 slave->mtd.size = parent->size - slave->offset
1a31368b
DES
469 - slave->mtd.size;
470 } else {
471 printk(KERN_ERR "mtd partition \"%s\" doesn't have enough space: %#llx < %#llx, disabled\n",
0a9d72b6 472 part->name, parent->size - slave->offset,
1a31368b
DES
473 slave->mtd.size);
474 /* register to preserve ordering */
475 goto out_register;
476 }
477 }
7788ba71 478 if (slave->mtd.size == MTDPART_SIZ_FULL)
0a9d72b6 479 slave->mtd.size = parent->size - slave->offset;
7788ba71 480
69423d99
AH
481 printk(KERN_NOTICE "0x%012llx-0x%012llx : \"%s\"\n", (unsigned long long)slave->offset,
482 (unsigned long long)(slave->offset + slave->mtd.size), slave->mtd.name);
7788ba71
AN
483
484 /* let's do some sanity checks */
0a9d72b6 485 if (slave->offset >= parent->size) {
f636ffb4 486 /* let's register it anyway to preserve ordering */
7788ba71
AN
487 slave->offset = 0;
488 slave->mtd.size = 0;
b33a2887 489 printk(KERN_ERR"mtd: partition \"%s\" is out of reach -- disabled\n",
7788ba71 490 part->name);
f636ffb4 491 goto out_register;
7788ba71 492 }
0a9d72b6
RM
493 if (slave->offset + slave->mtd.size > parent->size) {
494 slave->mtd.size = parent->size - slave->offset;
69423d99 495 printk(KERN_WARNING"mtd: partition \"%s\" extends beyond the end of device \"%s\" -- size truncated to %#llx\n",
0a9d72b6 496 part->name, parent->name, (unsigned long long)slave->mtd.size);
7788ba71 497 }
0a9d72b6 498 if (parent->numeraseregions > 1) {
7788ba71 499 /* Deal with variable erase size stuff */
0a9d72b6 500 int i, max = parent->numeraseregions;
69423d99 501 u64 end = slave->offset + slave->mtd.size;
0a9d72b6 502 struct mtd_erase_region_info *regions = parent->eraseregions;
7788ba71 503
6910c136
AN
504 /* Find the first erase regions which is part of this
505 * partition. */
506 for (i = 0; i < max && regions[i].offset <= slave->offset; i++)
7788ba71 507 ;
6910c136 508 /* The loop searched for the region _behind_ the first one */
a57ca046
RK
509 if (i > 0)
510 i--;
7788ba71 511
6910c136
AN
512 /* Pick biggest erasesize */
513 for (; i < max && regions[i].offset < end; i++) {
7788ba71
AN
514 if (slave->mtd.erasesize < regions[i].erasesize) {
515 slave->mtd.erasesize = regions[i].erasesize;
516 }
517 }
6910c136 518 BUG_ON(slave->mtd.erasesize == 0);
7788ba71
AN
519 } else {
520 /* Single erase size */
0a9d72b6 521 slave->mtd.erasesize = parent->erasesize;
7788ba71
AN
522 }
523
7e439681
BB
524 /*
525 * Slave erasesize might differ from the master one if the master
526 * exposes several regions with different erasesize. Adjust
527 * wr_alignment accordingly.
528 */
529 if (!(slave->mtd.flags & MTD_NO_ERASE))
530 wr_alignment = slave->mtd.erasesize;
531
1eeef2d7
CP
532 tmp = slave->offset;
533 remainder = do_div(tmp, wr_alignment);
534 if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
7788ba71 535 /* Doesn't start on a boundary of major erase size */
b33a2887
AN
536 /* FIXME: Let it be writable if it is on a boundary of
537 * _minor_ erase size though */
7788ba71 538 slave->mtd.flags &= ~MTD_WRITEABLE;
1eeef2d7 539 printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n",
7788ba71
AN
540 part->name);
541 }
1eeef2d7
CP
542
543 tmp = slave->mtd.size;
544 remainder = do_div(tmp, wr_alignment);
545 if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
7788ba71 546 slave->mtd.flags &= ~MTD_WRITEABLE;
1eeef2d7 547 printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n",
7788ba71
AN
548 part->name);
549 }
550
adbbc3bc 551 mtd_set_ooblayout(&slave->mtd, &part_ooblayout_ops);
0a9d72b6
RM
552 slave->mtd.ecc_step_size = parent->ecc_step_size;
553 slave->mtd.ecc_strength = parent->ecc_strength;
554 slave->mtd.bitflip_threshold = parent->bitflip_threshold;
d062d4ed 555
0a9d72b6 556 if (parent->_block_isbad) {
69423d99 557 uint64_t offs = 0;
7788ba71 558
b33a2887 559 while (offs < slave->mtd.size) {
0a9d72b6 560 if (mtd_block_isreserved(parent, offs + slave->offset))
fdf43a42 561 slave->mtd.ecc_stats.bbtblocks++;
0a9d72b6 562 else if (mtd_block_isbad(parent, offs + slave->offset))
7788ba71
AN
563 slave->mtd.ecc_stats.badblocks++;
564 offs += slave->mtd.erasesize;
565 }
566 }
567
f636ffb4 568out_register:
7788ba71
AN
569 return slave;
570}
571
a62c24d7
DE
572static ssize_t mtd_partition_offset_show(struct device *dev,
573 struct device_attribute *attr, char *buf)
574{
575 struct mtd_info *mtd = dev_get_drvdata(dev);
2524534d 576 struct mtd_part *part = mtd_to_part(mtd);
a62c24d7
DE
577 return snprintf(buf, PAGE_SIZE, "%lld\n", part->offset);
578}
579
580static DEVICE_ATTR(offset, S_IRUGO, mtd_partition_offset_show, NULL);
581
582static const struct attribute *mtd_partition_attrs[] = {
583 &dev_attr_offset.attr,
584 NULL
585};
586
587static int mtd_add_partition_attrs(struct mtd_part *new)
588{
589 int ret = sysfs_create_files(&new->mtd.dev.kobj, mtd_partition_attrs);
590 if (ret)
591 printk(KERN_WARNING
592 "mtd: failed to create partition attrs, err=%d\n", ret);
593 return ret;
594}
595
0a9d72b6 596int mtd_add_partition(struct mtd_info *parent, const char *name,
5daa7b21
RT
597 long long offset, long long length)
598{
599 struct mtd_partition part;
3a434f66 600 struct mtd_part *new;
5daa7b21
RT
601 int ret = 0;
602
603 /* the direct offset is expected */
604 if (offset == MTDPART_OFS_APPEND ||
605 offset == MTDPART_OFS_NXTBLK)
606 return -EINVAL;
607
608 if (length == MTDPART_SIZ_FULL)
0a9d72b6 609 length = parent->size - offset;
5daa7b21
RT
610
611 if (length <= 0)
612 return -EINVAL;
613
93867233 614 memset(&part, 0, sizeof(part));
5daa7b21
RT
615 part.name = name;
616 part.size = length;
617 part.offset = offset;
5daa7b21 618
0a9d72b6 619 new = allocate_partition(parent, &part, -1, offset);
5daa7b21
RT
620 if (IS_ERR(new))
621 return PTR_ERR(new);
622
5daa7b21 623 mutex_lock(&mtd_partitions_mutex);
5daa7b21
RT
624 list_add(&new->list, &mtd_partitions);
625 mutex_unlock(&mtd_partitions_mutex);
626
627 add_mtd_device(&new->mtd);
628
a62c24d7
DE
629 mtd_add_partition_attrs(new);
630
5daa7b21 631 return ret;
5daa7b21
RT
632}
633EXPORT_SYMBOL_GPL(mtd_add_partition);
634
08263a9a
RM
635/**
636 * __mtd_del_partition - delete MTD partition
637 *
638 * @priv: internal MTD struct for partition to be deleted
639 *
640 * This function must be called with the partitions mutex locked.
641 */
642static int __mtd_del_partition(struct mtd_part *priv)
643{
97519dc5 644 struct mtd_part *child, *next;
08263a9a
RM
645 int err;
646
97519dc5
RM
647 list_for_each_entry_safe(child, next, &mtd_partitions, list) {
648 if (child->parent == &priv->mtd) {
649 err = __mtd_del_partition(child);
650 if (err)
651 return err;
652 }
653 }
654
c5ceaba7
RM
655 sysfs_remove_files(&priv->mtd.dev.kobj, mtd_partition_attrs);
656
08263a9a
RM
657 err = del_mtd_device(&priv->mtd);
658 if (err)
659 return err;
660
661 list_del(&priv->list);
662 free_partition(priv);
663
664 return 0;
665}
666
667/*
668 * This function unregisters and destroy all slave MTD objects which are
97519dc5 669 * attached to the given MTD object.
08263a9a 670 */
97519dc5 671int del_mtd_partitions(struct mtd_info *mtd)
08263a9a
RM
672{
673 struct mtd_part *slave, *next;
674 int ret, err = 0;
675
676 mutex_lock(&mtd_partitions_mutex);
677 list_for_each_entry_safe(slave, next, &mtd_partitions, list)
97519dc5 678 if (slave->parent == mtd) {
08263a9a
RM
679 ret = __mtd_del_partition(slave);
680 if (ret < 0)
681 err = ret;
682 }
683 mutex_unlock(&mtd_partitions_mutex);
684
685 return err;
686}
687
97519dc5 688int mtd_del_partition(struct mtd_info *mtd, int partno)
5daa7b21
RT
689{
690 struct mtd_part *slave, *next;
691 int ret = -EINVAL;
692
693 mutex_lock(&mtd_partitions_mutex);
694 list_for_each_entry_safe(slave, next, &mtd_partitions, list)
97519dc5 695 if ((slave->parent == mtd) &&
5daa7b21 696 (slave->mtd.index == partno)) {
08263a9a 697 ret = __mtd_del_partition(slave);
5daa7b21
RT
698 break;
699 }
700 mutex_unlock(&mtd_partitions_mutex);
701
702 return ret;
703}
704EXPORT_SYMBOL_GPL(mtd_del_partition);
705
1da177e4
LT
706/*
707 * This function, given a master MTD object and a partition table, creates
708 * and registers slave MTD objects which are bound to the master according to
709 * the partition definitions.
1f24b5a8 710 *
727dc612
DE
711 * For historical reasons, this function's caller only registers the master
712 * if the MTD_PARTITIONED_MASTER config option is set.
1da177e4
LT
713 */
714
97894cda 715int add_mtd_partitions(struct mtd_info *master,
1da177e4
LT
716 const struct mtd_partition *parts,
717 int nbparts)
718{
719 struct mtd_part *slave;
69423d99 720 uint64_t cur_offset = 0;
1da177e4
LT
721 int i;
722
b33a2887 723 printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name);
1da177e4
LT
724
725 for (i = 0; i < nbparts; i++) {
5daa7b21 726 slave = allocate_partition(master, parts + i, i, cur_offset);
e5bae867
BB
727 if (IS_ERR(slave)) {
728 del_mtd_partitions(master);
5daa7b21 729 return PTR_ERR(slave);
e5bae867 730 }
5daa7b21
RT
731
732 mutex_lock(&mtd_partitions_mutex);
733 list_add(&slave->list, &mtd_partitions);
734 mutex_unlock(&mtd_partitions_mutex);
735
736 add_mtd_device(&slave->mtd);
a62c24d7 737 mtd_add_partition_attrs(slave);
1a0915be
RM
738 if (parts[i].types)
739 mtd_parse_part(slave, parts[i].types);
5daa7b21 740
1da177e4 741 cur_offset = slave->offset + slave->mtd.size;
1da177e4
LT
742 }
743
744 return 0;
745}
1da177e4
LT
746
747static DEFINE_SPINLOCK(part_parser_lock);
748static LIST_HEAD(part_parsers);
749
5531ae48 750static struct mtd_part_parser *mtd_part_parser_get(const char *name)
1da177e4 751{
71a928c0 752 struct mtd_part_parser *p, *ret = NULL;
1da177e4 753
71a928c0 754 spin_lock(&part_parser_lock);
1da177e4 755
71a928c0 756 list_for_each_entry(p, &part_parsers, list)
1da177e4
LT
757 if (!strcmp(p->name, name) && try_module_get(p->owner)) {
758 ret = p;
759 break;
760 }
71a928c0 761
1da177e4
LT
762 spin_unlock(&part_parser_lock);
763
764 return ret;
765}
766
5531ae48
BN
767static inline void mtd_part_parser_put(const struct mtd_part_parser *p)
768{
769 module_put(p->owner);
770}
953b3bd1 771
adc83bf8
BN
772/*
773 * Many partition parsers just expected the core to kfree() all their data in
774 * one chunk. Do that by default.
775 */
776static void mtd_part_parser_cleanup_default(const struct mtd_partition *pparts,
777 int nr_parts)
778{
779 kfree(pparts);
780}
781
b9eab011 782int __register_mtd_parser(struct mtd_part_parser *p, struct module *owner)
1da177e4 783{
b9eab011
BN
784 p->owner = owner;
785
adc83bf8
BN
786 if (!p->cleanup)
787 p->cleanup = &mtd_part_parser_cleanup_default;
788
1da177e4
LT
789 spin_lock(&part_parser_lock);
790 list_add(&p->list, &part_parsers);
791 spin_unlock(&part_parser_lock);
b9eab011
BN
792
793 return 0;
1da177e4 794}
b9eab011 795EXPORT_SYMBOL_GPL(__register_mtd_parser);
1da177e4 796
cf3b2b1e 797void deregister_mtd_parser(struct mtd_part_parser *p)
1da177e4
LT
798{
799 spin_lock(&part_parser_lock);
800 list_del(&p->list);
801 spin_unlock(&part_parser_lock);
1da177e4 802}
b33a2887 803EXPORT_SYMBOL_GPL(deregister_mtd_parser);
1da177e4 804
ad274cec
AB
805/*
806 * Do not forget to update 'parse_mtd_partitions()' kerneldoc comment if you
807 * are changing this array!
808 */
ccef4dcc 809static const char * const default_mtd_part_types[] = {
d26c87d6
DES
810 "cmdlinepart",
811 "ofpart",
812 NULL
813};
5c4eefbd 814
01f9c724
BN
815static int mtd_part_do_parse(struct mtd_part_parser *parser,
816 struct mtd_info *master,
817 struct mtd_partitions *pparts,
818 struct mtd_part_parser_data *data)
819{
820 int ret;
821
822 ret = (*parser->parse_fn)(master, &pparts->parts, data);
823 pr_debug("%s: parser %s: %i\n", master->name, parser->name, ret);
824 if (ret <= 0)
825 return ret;
826
827 pr_notice("%d %s partitions found on MTD device %s\n", ret,
828 parser->name, master->name);
829
830 pparts->nr_parts = ret;
831 pparts->parser = parser;
832
833 return ret;
834}
835
5b644aa0
RM
836/**
837 * mtd_part_get_compatible_parser - find MTD parser by a compatible string
838 *
839 * @compat: compatible string describing partitions in a device tree
840 *
841 * MTD parsers can specify supported partitions by providing a table of
842 * compatibility strings. This function finds a parser that advertises support
843 * for a passed value of "compatible".
844 */
845static struct mtd_part_parser *mtd_part_get_compatible_parser(const char *compat)
846{
847 struct mtd_part_parser *p, *ret = NULL;
848
849 spin_lock(&part_parser_lock);
850
851 list_for_each_entry(p, &part_parsers, list) {
852 const struct of_device_id *matches;
853
854 matches = p->of_match_table;
855 if (!matches)
856 continue;
857
858 for (; matches->compatible[0]; matches++) {
859 if (!strcmp(matches->compatible, compat) &&
860 try_module_get(p->owner)) {
861 ret = p;
862 break;
863 }
864 }
865
866 if (ret)
867 break;
868 }
869
870 spin_unlock(&part_parser_lock);
871
872 return ret;
873}
874
875static int mtd_part_of_parse(struct mtd_info *master,
876 struct mtd_partitions *pparts)
877{
878 struct mtd_part_parser *parser;
879 struct device_node *np;
880 struct property *prop;
881 const char *compat;
c0faf434 882 const char *fixed = "fixed-partitions";
5b644aa0
RM
883 int ret, err = 0;
884
885 np = of_get_child_by_name(mtd_get_of_node(master), "partitions");
886 of_property_for_each_string(np, "compatible", prop, compat) {
887 parser = mtd_part_get_compatible_parser(compat);
888 if (!parser)
889 continue;
890 ret = mtd_part_do_parse(parser, master, pparts, NULL);
891 if (ret > 0) {
892 of_node_put(np);
893 return ret;
894 }
895 mtd_part_parser_put(parser);
896 if (ret < 0 && !err)
897 err = ret;
898 }
899 of_node_put(np);
900
901 /*
c0faf434 902 * For backward compatibility we have to try the "fixed-partitions"
5b644aa0
RM
903 * parser. It supports old DT format with partitions specified as a
904 * direct subnodes of a flash device DT node without any compatibility
905 * specified we could match.
906 */
907 parser = mtd_part_parser_get(fixed);
908 if (!parser && !request_module("%s", fixed))
909 parser = mtd_part_parser_get(fixed);
910 if (parser) {
911 ret = mtd_part_do_parse(parser, master, pparts, NULL);
912 if (ret > 0)
913 return ret;
914 mtd_part_parser_put(parser);
915 if (ret < 0 && !err)
916 err = ret;
917 }
918
919 return err;
920}
921
ad274cec 922/**
5ac67ce3
RM
923 * parse_mtd_partitions - parse and register MTD partitions
924 *
ad274cec
AB
925 * @master: the master partition (describes whole MTD device)
926 * @types: names of partition parsers to try or %NULL
c7975330 927 * @data: MTD partition parser-specific data
ad274cec 928 *
5ac67ce3
RM
929 * This function tries to find & register partitions on MTD device @master. It
930 * uses MTD partition parsers, specified in @types. However, if @types is %NULL,
931 * then the default list of parsers is used. The default list contains only the
d26c87d6 932 * "cmdlinepart" and "ofpart" parsers ATM.
c51803dd
HS
933 * Note: If there are more then one parser in @types, the kernel only takes the
934 * partitions parsed out by the first parser.
ad274cec
AB
935 *
936 * This function may return:
937 * o a negative error code in case of failure
5ac67ce3 938 * o number of found partitions otherwise
ad274cec 939 */
26a47346 940int parse_mtd_partitions(struct mtd_info *master, const char *const *types,
c7975330 941 struct mtd_part_parser_data *data)
1da177e4 942{
5ac67ce3 943 struct mtd_partitions pparts = { };
1da177e4 944 struct mtd_part_parser *parser;
5a2415b0 945 int ret, err = 0;
97894cda 946
5c4eefbd
DES
947 if (!types)
948 types = default_mtd_part_types;
949
5a2415b0 950 for ( ; *types; types++) {
5b644aa0
RM
951 /*
952 * ofpart is a special type that means OF partitioning info
953 * should be used. It requires a bit different logic so it is
954 * handled in a separated function.
955 */
956 if (!strcmp(*types, "ofpart")) {
5ac67ce3 957 ret = mtd_part_of_parse(master, &pparts);
5b644aa0
RM
958 } else {
959 pr_debug("%s: parsing partitions %s\n", master->name,
960 *types);
5531ae48 961 parser = mtd_part_parser_get(*types);
5b644aa0
RM
962 if (!parser && !request_module("%s", *types))
963 parser = mtd_part_parser_get(*types);
964 pr_debug("%s: got parser %s\n", master->name,
965 parser ? parser->name : NULL);
966 if (!parser)
967 continue;
5ac67ce3 968 ret = mtd_part_do_parse(parser, master, &pparts, data);
5b644aa0
RM
969 if (ret <= 0)
970 mtd_part_parser_put(parser);
971 }
01f9c724 972 /* Found partitions! */
5ac67ce3
RM
973 if (ret > 0) {
974 err = add_mtd_partitions(master, pparts.parts,
975 pparts.nr_parts);
976 mtd_part_parser_cleanup(&pparts);
977 return err ? err : pparts.nr_parts;
978 }
5a2415b0
BN
979 /*
980 * Stash the first error we see; only report it if no parser
981 * succeeds
982 */
983 if (ret < 0 && !err)
984 err = ret;
1da177e4 985 }
5a2415b0 986 return err;
1da177e4 987}
5daa7b21 988
adc83bf8
BN
989void mtd_part_parser_cleanup(struct mtd_partitions *parts)
990{
991 const struct mtd_part_parser *parser;
992
993 if (!parts)
994 return;
995
996 parser = parts->parser;
997 if (parser) {
998 if (parser->cleanup)
999 parser->cleanup(parts->parts, parts->nr_parts);
1000
1001 mtd_part_parser_put(parser);
1002 }
1003}
1004
5dee4674 1005int mtd_is_partition(const struct mtd_info *mtd)
5daa7b21
RT
1006{
1007 struct mtd_part *part;
a7e93dcd 1008 int ispart = 0;
5daa7b21
RT
1009
1010 mutex_lock(&mtd_partitions_mutex);
1011 list_for_each_entry(part, &mtd_partitions, list)
1012 if (&part->mtd == mtd) {
a7e93dcd 1013 ispart = 1;
5daa7b21
RT
1014 break;
1015 }
1016 mutex_unlock(&mtd_partitions_mutex);
1017
a7e93dcd 1018 return ispart;
5daa7b21 1019}
a7e93dcd 1020EXPORT_SYMBOL_GPL(mtd_is_partition);
62082e56
RG
1021
1022/* Returns the size of the entire flash chip */
1023uint64_t mtd_get_device_size(const struct mtd_info *mtd)
1024{
1025 if (!mtd_is_partition(mtd))
1026 return mtd->size;
1027
97519dc5 1028 return mtd_get_device_size(mtd_to_part(mtd)->parent);
62082e56
RG
1029}
1030EXPORT_SYMBOL_GPL(mtd_get_device_size);