|
@@ -29,6 +29,7 @@ static int parse_ofpart_partitions(struct mtd_info *master,
|
|
|
struct mtd_partition **pparts,
|
|
|
struct mtd_part_parser_data *data)
|
|
|
{
|
|
|
+ struct mtd_partition *parts;
|
|
|
struct device_node *mtd_node;
|
|
|
struct device_node *ofpart_node;
|
|
|
const char *partname;
|
|
@@ -70,8 +71,8 @@ static int parse_ofpart_partitions(struct mtd_info *master,
|
|
|
if (nr_parts == 0)
|
|
|
return 0;
|
|
|
|
|
|
- *pparts = kzalloc(nr_parts * sizeof(**pparts), GFP_KERNEL);
|
|
|
- if (!*pparts)
|
|
|
+ parts = kzalloc(nr_parts * sizeof(*parts), GFP_KERNEL);
|
|
|
+ if (!parts)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
i = 0;
|
|
@@ -105,19 +106,19 @@ static int parse_ofpart_partitions(struct mtd_info *master,
|
|
|
goto ofpart_fail;
|
|
|
}
|
|
|
|
|
|
- (*pparts)[i].offset = of_read_number(reg, a_cells);
|
|
|
- (*pparts)[i].size = of_read_number(reg + a_cells, s_cells);
|
|
|
+ parts[i].offset = of_read_number(reg, a_cells);
|
|
|
+ parts[i].size = of_read_number(reg + a_cells, s_cells);
|
|
|
|
|
|
partname = of_get_property(pp, "label", &len);
|
|
|
if (!partname)
|
|
|
partname = of_get_property(pp, "name", &len);
|
|
|
- (*pparts)[i].name = partname;
|
|
|
+ parts[i].name = partname;
|
|
|
|
|
|
if (of_get_property(pp, "read-only", &len))
|
|
|
- (*pparts)[i].mask_flags |= MTD_WRITEABLE;
|
|
|
+ parts[i].mask_flags |= MTD_WRITEABLE;
|
|
|
|
|
|
if (of_get_property(pp, "lock", &len))
|
|
|
- (*pparts)[i].mask_flags |= MTD_POWERUP_LOCK;
|
|
|
+ parts[i].mask_flags |= MTD_POWERUP_LOCK;
|
|
|
|
|
|
i++;
|
|
|
}
|
|
@@ -125,6 +126,7 @@ static int parse_ofpart_partitions(struct mtd_info *master,
|
|
|
if (!nr_parts)
|
|
|
goto ofpart_none;
|
|
|
|
|
|
+ *pparts = parts;
|
|
|
return nr_parts;
|
|
|
|
|
|
ofpart_fail:
|
|
@@ -133,8 +135,7 @@ ofpart_fail:
|
|
|
ret = -EINVAL;
|
|
|
ofpart_none:
|
|
|
of_node_put(pp);
|
|
|
- kfree(*pparts);
|
|
|
- *pparts = NULL;
|
|
|
+ kfree(parts);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -147,6 +148,7 @@ static int parse_ofoldpart_partitions(struct mtd_info *master,
|
|
|
struct mtd_partition **pparts,
|
|
|
struct mtd_part_parser_data *data)
|
|
|
{
|
|
|
+ struct mtd_partition *parts;
|
|
|
struct device_node *dp;
|
|
|
int i, plen, nr_parts;
|
|
|
const struct {
|
|
@@ -168,32 +170,33 @@ static int parse_ofoldpart_partitions(struct mtd_info *master,
|
|
|
|
|
|
nr_parts = plen / sizeof(part[0]);
|
|
|
|
|
|
- *pparts = kzalloc(nr_parts * sizeof(*(*pparts)), GFP_KERNEL);
|
|
|
- if (!*pparts)
|
|
|
+ parts = kzalloc(nr_parts * sizeof(*parts), GFP_KERNEL);
|
|
|
+ if (!parts)
|
|
|
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;
|
|
|
+ parts[i].offset = be32_to_cpu(part->offset);
|
|
|
+ parts[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;
|
|
|
+ parts[i].mask_flags = MTD_WRITEABLE;
|
|
|
|
|
|
if (names && (plen > 0)) {
|
|
|
int len = strlen(names) + 1;
|
|
|
|
|
|
- (*pparts)[i].name = names;
|
|
|
+ parts[i].name = names;
|
|
|
plen -= len;
|
|
|
names += len;
|
|
|
} else {
|
|
|
- (*pparts)[i].name = "unnamed";
|
|
|
+ parts[i].name = "unnamed";
|
|
|
}
|
|
|
|
|
|
part++;
|
|
|
}
|
|
|
|
|
|
+ *pparts = parts;
|
|
|
return nr_parts;
|
|
|
}
|
|
|
|