Commit fbcf62a3 authored by Dmitry Eremin-Solenikov's avatar Dmitry Eremin-Solenikov Committed by Artem Bityutskiy

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: default avatarDmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Signed-off-by: default avatarArtem Bityutskiy <dedekind1@gmail.com>
parent 628376fb
...@@ -40,51 +40,6 @@ struct of_flash { ...@@ -40,51 +40,6 @@ struct of_flash {
}; };
#define OF_FLASH_PARTS(info) ((info)->parts) #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) static int of_flash_remove(struct platform_device *dev)
{ {
...@@ -166,7 +121,7 @@ static struct mtd_info * __devinit obsolete_probe(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 default is use. These take precedence over other device tree
information. */ information. */
static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot", 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) static const char ** __devinit of_get_probes(struct device_node *dp)
{ {
const char *cp; const char *cp;
...@@ -343,12 +298,6 @@ static int __devinit of_flash_probe(struct platform_device *dev) ...@@ -343,12 +298,6 @@ static int __devinit of_flash_probe(struct platform_device *dev)
} }
of_free_probes(part_probe_types); 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); mtd_device_register(info->cmtd, info->parts, err);
kfree(mtd_list); kfree(mtd_list);
......
...@@ -93,9 +93,82 @@ static struct mtd_part_parser ofpart_parser = { ...@@ -93,9 +93,82 @@ static struct mtd_part_parser ofpart_parser = {
.name = "ofpart", .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) 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); module_init(ofpart_parser_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment