mirror of https://gitee.com/openkylin/linux.git
mtd: extend physmap_of to let the device tree specify the parition probe
This is to support custom partitioning schemes for embedded PPC. To use define your own mtd_part_parser and then add something like: linux,part-probe = "my_probe", "cmdlinepart"; To the board's dts file. If linux,part-probe is not specified then this behaves the same as before. Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
2bfefa4c96
commit
9d5da3a9b8
|
@ -173,12 +173,53 @@ static struct mtd_info * __devinit obsolete_probe(struct of_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
/* When partitions are set we look for a linux,part-probe property which
|
||||
specifies the list of partition probers to use. If none is given then the
|
||||
default is use. These take precedence over other device tree
|
||||
information. */
|
||||
static const char *part_probe_types_def[] = { "cmdlinepart", "RedBoot", NULL };
|
||||
static const char ** __devinit of_get_probes(struct device_node *dp)
|
||||
{
|
||||
const char *cp;
|
||||
int cplen;
|
||||
unsigned int l;
|
||||
unsigned int count;
|
||||
const char **res;
|
||||
|
||||
cp = of_get_property(dp, "linux,part-probe", &cplen);
|
||||
if (cp == NULL)
|
||||
return part_probe_types_def;
|
||||
|
||||
count = 0;
|
||||
for (l = 0; l != cplen; l++)
|
||||
if (cp[l] == 0)
|
||||
count++;
|
||||
|
||||
res = kzalloc((count + 1)*sizeof(*res), GFP_KERNEL);
|
||||
count = 0;
|
||||
while (cplen > 0) {
|
||||
res[count] = cp;
|
||||
l = strlen(cp) + 1;
|
||||
cp += l;
|
||||
cplen -= l;
|
||||
count++;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static void __devinit of_free_probes(const char **probes)
|
||||
{
|
||||
if (probes != part_probe_types_def)
|
||||
kfree(probes);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __devinit of_flash_probe(struct of_device *dev,
|
||||
const struct of_device_id *match)
|
||||
{
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
static const char *part_probe_types[]
|
||||
= { "cmdlinepart", "RedBoot", NULL };
|
||||
const char **part_probe_types;
|
||||
#endif
|
||||
struct device_node *dp = dev->node;
|
||||
struct resource res;
|
||||
|
@ -307,12 +348,14 @@ static int __devinit of_flash_probe(struct of_device *dev,
|
|||
goto err_out;
|
||||
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
/* First look for RedBoot table or partitions on the command
|
||||
* line, these take precedence over device tree information */
|
||||
part_probe_types = of_get_probes(dp);
|
||||
err = parse_mtd_partitions(info->cmtd, part_probe_types,
|
||||
&info->parts, 0);
|
||||
if (err < 0)
|
||||
if (err < 0) {
|
||||
of_free_probes(part_probe_types);
|
||||
return err;
|
||||
}
|
||||
of_free_probes(part_probe_types);
|
||||
|
||||
#ifdef CONFIG_MTD_OF_PARTS
|
||||
if (err == 0) {
|
||||
|
|
Loading…
Reference in New Issue