Skip to content

Commit

Permalink
mtd: physmap_of: move parse_obsolete_partitions to become separate pa…
Browse files Browse the repository at this point in the history
…rser

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>
  • Loading branch information
Dmitry Eremin-Solenikov authored and Artem Bityutskiy committed Sep 11, 2011
1 parent 628376f commit fbcf62a
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 53 deletions.
53 changes: 1 addition & 52 deletions drivers/mtd/maps/physmap_of.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
75 changes: 74 additions & 1 deletion drivers/mtd/ofpart.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit fbcf62a

Please sign in to comment.