mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
mtd: physmap_of: move parse_obsolete_partitions to become separate parser
Move parse_obsolete_partitions() to ofpart.c and register it as an ofoldpart partitions parser. Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> Signed-off-by: Artem Bityutskiy <dedekind1@gmail.com>
This commit is contained in:
parent
628376fb53
commit
fbcf62a32b
2 changed files with 75 additions and 53 deletions
|
@ -40,51 +40,6 @@ struct of_flash {
|
|||
};
|
||||
|
||||
#define OF_FLASH_PARTS(info) ((info)->parts)
|
||||
static int parse_obsolete_partitions(struct platform_device *dev,
|
||||
struct of_flash *info,
|
||||
struct device_node *dp)
|
||||
{
|
||||
int i, plen, nr_parts;
|
||||
const struct {
|
||||
__be32 offset, len;
|
||||
} *part;
|
||||
const char *names;
|
||||
|
||||
part = of_get_property(dp, "partitions", &plen);
|
||||
if (!part)
|
||||
return 0; /* No partitions found */
|
||||
|
||||
dev_warn(&dev->dev, "Device tree uses obsolete partition map binding\n");
|
||||
|
||||
nr_parts = plen / sizeof(part[0]);
|
||||
|
||||
info->parts = kzalloc(nr_parts * sizeof(*info->parts), GFP_KERNEL);
|
||||
if (!info->parts)
|
||||
return -ENOMEM;
|
||||
|
||||
names = of_get_property(dp, "partition-names", &plen);
|
||||
|
||||
for (i = 0; i < nr_parts; i++) {
|
||||
info->parts[i].offset = be32_to_cpu(part->offset);
|
||||
info->parts[i].size = be32_to_cpu(part->len) & ~1;
|
||||
if (be32_to_cpu(part->len) & 1) /* bit 0 set signifies read only partition */
|
||||
info->parts[i].mask_flags = MTD_WRITEABLE;
|
||||
|
||||
if (names && (plen > 0)) {
|
||||
int len = strlen(names) + 1;
|
||||
|
||||
info->parts[i].name = (char *)names;
|
||||
plen -= len;
|
||||
names += len;
|
||||
} else {
|
||||
info->parts[i].name = "unnamed";
|
||||
}
|
||||
|
||||
part++;
|
||||
}
|
||||
|
||||
return nr_parts;
|
||||
}
|
||||
|
||||
static int of_flash_remove(struct platform_device *dev)
|
||||
{
|
||||
|
@ -166,7 +121,7 @@ static struct mtd_info * __devinit obsolete_probe(struct platform_device *dev,
|
|||
default is use. These take precedence over other device tree
|
||||
information. */
|
||||
static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot",
|
||||
"ofpart", NULL };
|
||||
"ofpart", "ofoldpart", NULL };
|
||||
static const char ** __devinit of_get_probes(struct device_node *dp)
|
||||
{
|
||||
const char *cp;
|
||||
|
@ -343,12 +298,6 @@ static int __devinit of_flash_probe(struct platform_device *dev)
|
|||
}
|
||||
of_free_probes(part_probe_types);
|
||||
|
||||
if (err == 0) {
|
||||
err = parse_obsolete_partitions(dev, info, dp);
|
||||
if (err < 0)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
mtd_device_register(info->cmtd, info->parts, err);
|
||||
|
||||
kfree(mtd_list);
|
||||
|
|
|
@ -93,9 +93,82 @@ static struct mtd_part_parser ofpart_parser = {
|
|||
.name = "ofpart",
|
||||
};
|
||||
|
||||
static int parse_ofoldpart_partitions(struct mtd_info *master,
|
||||
struct mtd_partition **pparts,
|
||||
struct mtd_part_parser_data *data)
|
||||
{
|
||||
struct device_node *dp;
|
||||
int i, plen, nr_parts;
|
||||
const struct {
|
||||
__be32 offset, len;
|
||||
} *part;
|
||||
const char *names;
|
||||
|
||||
if (!data)
|
||||
return 0;
|
||||
|
||||
dp = data->of_node;
|
||||
if (!dp)
|
||||
return 0;
|
||||
|
||||
part = of_get_property(dp, "partitions", &plen);
|
||||
if (!part)
|
||||
return 0; /* No partitions found */
|
||||
|
||||
pr_warning("Device tree uses obsolete partition map binding: %s\n",
|
||||
dp->full_name);
|
||||
|
||||
nr_parts = plen / sizeof(part[0]);
|
||||
|
||||
*pparts = kzalloc(nr_parts * sizeof(*(*pparts)), GFP_KERNEL);
|
||||
if (!pparts)
|
||||
return -ENOMEM;
|
||||
|
||||
names = of_get_property(dp, "partition-names", &plen);
|
||||
|
||||
for (i = 0; i < nr_parts; i++) {
|
||||
(*pparts)[i].offset = be32_to_cpu(part->offset);
|
||||
(*pparts)[i].size = be32_to_cpu(part->len) & ~1;
|
||||
/* bit 0 set signifies read only partition */
|
||||
if (be32_to_cpu(part->len) & 1)
|
||||
(*pparts)[i].mask_flags = MTD_WRITEABLE;
|
||||
|
||||
if (names && (plen > 0)) {
|
||||
int len = strlen(names) + 1;
|
||||
|
||||
(*pparts)[i].name = (char *)names;
|
||||
plen -= len;
|
||||
names += len;
|
||||
} else {
|
||||
(*pparts)[i].name = "unnamed";
|
||||
}
|
||||
|
||||
part++;
|
||||
}
|
||||
|
||||
return nr_parts;
|
||||
}
|
||||
|
||||
static struct mtd_part_parser ofoldpart_parser = {
|
||||
.owner = THIS_MODULE,
|
||||
.parse_fn = parse_ofoldpart_partitions,
|
||||
.name = "ofoldpart",
|
||||
};
|
||||
|
||||
static int __init ofpart_parser_init(void)
|
||||
{
|
||||
return register_mtd_parser(&ofpart_parser);
|
||||
int rc;
|
||||
rc = register_mtd_parser(&ofpart_parser);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
rc = register_mtd_parser(&ofoldpart_parser);
|
||||
if (!rc)
|
||||
return 0;
|
||||
|
||||
deregister_mtd_parser(&ofoldpart_parser);
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
module_init(ofpart_parser_init);
|
||||
|
|
Loading…
Reference in a new issue