From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Date: Thu, 16 Aug 2018 19:04:43 +0200 Subject: [U-Boot] [PATCH v6 25/31] cmd: mtdparts: add a generic 'mtdparts' parser In-Reply-To: <20180816153029.15521-26-miquel.raynal@bootlin.com> References: <20180816153029.15521-1-miquel.raynal@bootlin.com> <20180816153029.15521-26-miquel.raynal@bootlin.com> Message-ID: <20180816190443.0489938c@bbrezillon> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Thu, 16 Aug 2018 17:30:23 +0200 Miquel Raynal wrote: > > +int mtdparts_parse_part(struct mtd_info *parent, const char **_mtdparts, > + struct mtd_partition **_parts, int *_nb_parts) > +{ > + const char *mtdparts = *_mtdparts; > + struct part_info *part_legacy; > + struct mtd_partition *parts; > + int cur_off = 0, cur_sz = 0; > + int nb_parts = 0; > + char *names; > + int ret, idx; > + > + *_parts = NULL; > + *_nb_parts = 0; > + > + /* First, iterate over the partitions until we know their number */ > + while (mtdparts[0] != '\0' && mtdparts[0] != ';') { > + ret = part_parse(mtdparts, &mtdparts, &part_legacy); > + if (ret) > + return ret; > + > + nb_parts++; > + free(part_legacy); > + } > + > + /* Allocate an array of partitions to give back to the caller */ > + parts = malloc((sizeof(*parts) + 20) * nb_parts); > + names = (char *)&parts[nb_parts]; > + if (!parts) { > + printf("Could not allocate enough space to save partitions meta-data\n"); > + return -ENOMEM; > + } > + > + /* Iterate again over each partition to save the data in our array */ > + for (idx = 0; idx < nb_parts; idx++) { > + char *name; > + > + ret = part_parse(*_mtdparts, _mtdparts, &part_legacy); > + if (ret) > + return ret; > + > + name = &names[idx * 20]; > + strncpy(name, part_legacy->name, 20); > + parts[idx].name = name; > + > + parts[idx].size = part_legacy->size; > + if (parts[idx].size == SIZE_REMAINING) > + parts[idx].size = parent->size - cur_sz; > + cur_sz += parts[idx].size; > + > + parts[idx].offset = part_legacy->offset; > + if (parts[idx].offset == OFFSET_NOT_SPECIFIED) > + parts[idx].offset = cur_off; > + cur_off += parts[idx].size; > + > + parts[idx].mask_flags = part_legacy->mask_flags; > + parts[idx].ecclayout = parent->ecclayout; > + > + free(part_legacy); > + } > + > + /* Offset by one mtdparts to point to the next device if needed */ > + if (*_mtdparts[0] == ';') > + _mtdparts++; > + > + *_parts = parts; > + *_nb_parts = nb_parts; > + > + return 0; > +} > I guess the CMD_MTD dependency on CMD_MTDPARTS comes from here. Can't we just move mtdparts_parse_part()+part_parse() somewhere in drivers/mtd/ and remove this dependency?