On Fri, 26 Oct 2007 20:39:58 +0400 Valentine Barshak <[EMAIL PROTECTED]> wrote: > > +static int __devinit parse_partitions(struct of_ndfc *ndfc, > + struct of_device *dev) > +{ > + const char *partname; > + static const char *part_probe_types[] > + = { "cmdlinepart", "RedBoot", NULL }; > + struct device_node *dp = dev->node, *pp; > + int nr_parts, i; > + > + /* First look for RedBoot table or partitions on the command > + * line, these take precedence over device tree information */ > + nr_parts = parse_mtd_partitions(&ndfc->mtd, part_probe_types, > + &ndfc->parts, 0); > + if (nr_parts > 0) { > + add_mtd_partitions(&ndfc->mtd, ndfc->parts, nr_parts); > + return 0; > + } > + > + /* First count the subnodes */ > + nr_parts = 0; > + for (pp = dp->child; pp; pp = pp->sibling)
For proper ref counting and locking, use: for (pp = of_get_next_child(dp, NULL); pp; pp = of_get_next_child(dp, pp)) > + nr_parts++; > + > + if (nr_parts == 0) > + return 0; > + > + ndfc->parts = kzalloc(nr_parts * sizeof(*ndfc->parts), > + GFP_KERNEL); > + if (!ndfc->parts) > + return -ENOMEM; > + > + for (pp = dp->child, i = 0; pp; pp = pp->sibling, i++) { for (pp = of_get_next_child(dp, NULL), i = 0; pp; pp = of_get_next_child(dp, pp), i++) > + const u32 *reg; > + int len; > + > + reg = of_get_property(pp, "reg", &len); > + if (!reg || (len != 2*sizeof(u32))) { of_node_put(pp); > + dev_err(&dev->dev, "Invalid 'reg' on %s\n", > + dp->full_name); > + kfree(ndfc->parts); > + ndfc->parts = NULL; > + return -EINVAL; > + } > + ndfc->parts[i].offset = reg[0]; > + ndfc->parts[i].size = reg[1]; > + > + partname = of_get_property(pp, "label", &len); > + if (!partname) > + partname = of_get_property(pp, "name", &len); > + ndfc->parts[i].name = (char *)partname; > + > + if (of_get_property(pp, "read-only", &len)) > + ndfc->parts[i].mask_flags = MTD_WRITEABLE; > + } > + > + return nr_parts; > +} > +#else /* MTD_PARTITIONS */ > +#define OF_FLASH_PARTS(ndfc) (0) > +#define parse_partitions(ndfc, dev) (0) static inline int parse_partitions(struct of_ndfc *ndfc, struct of_device *dev) { return 0; } > +#endif /* MTD_PARTITIONS */ > +static int __devinit of_ndfc_probe(struct of_device *dev, > + const struct of_device_id *match) > +{ > + struct device_node *dp = dev->node; > + struct resource res; > + struct of_ndfc *ndfc; > + const u32 *prop; > + resource_size_t rlen; > + int err; > + > + err = -ENXIO; > + if (of_address_to_resource(dp, 0, &res)) { > + dev_err(&dev->dev, "can't get IO address from device tree\n"); > + goto err_out; > + } > + > + dev_dbg(&dev->dev, "regs: %.8llx-%.8llx\n", indentation ? -- Cheers, Stephen Rothwell [EMAIL PROTECTED] http://www.canb.auug.org.au/~sfr/
pgp4xB26FXBlq.pgp
Description: PGP signature
_______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev