From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heinrich Schuchardt Date: Tue, 29 Jan 2019 23:20:01 +0100 Subject: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION In-Reply-To: <20190129025956.21870-2-takahiro.akashi@linaro.org> References: <20190129025956.21870-1-takahiro.akashi@linaro.org> <20190129025956.21870-2-takahiro.akashi@linaro.org> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 1/29/19 3:59 AM, AKASHI Takahiro wrote: > UCLASS_PARTITION device will be created as a child node of > UCLASS_BLK device. > > Signed-off-by: AKASHI Takahiro > --- > drivers/block/blk-uclass.c | 52 ++++++++++++++++++++++++++++++++++++++ > include/dm/uclass-id.h | 1 + > 2 files changed, 53 insertions(+) > > diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c > index baaf431e5e0c..d4ca30f23fc1 100644 > --- a/drivers/block/blk-uclass.c > +++ b/drivers/block/blk-uclass.c > @@ -10,6 +10,8 @@ > #include > #include > #include > +#include > +#include > > static const char *if_typename_str[IF_TYPE_COUNT] = { > [IF_TYPE_IDE] = "ide", > @@ -654,3 +656,53 @@ UCLASS_DRIVER(blk) = { > .post_probe = blk_post_probe, > .per_device_platdata_auto_alloc_size = sizeof(struct blk_desc), > }; > + > +U_BOOT_DRIVER(blk_partition) = { > + .name = "blk_partition", > + .id = UCLASS_PARTITION, > + .platdata_auto_alloc_size = sizeof(struct disk_part), > +}; > + > +UCLASS_DRIVER(partition) = { > + .id = UCLASS_PARTITION, > + .name = "partition", > +}; > + > +#if defined(CONFIG_PARTITIONS) && defined(CONFIG_HAVE_BLOCK_DEVICE) > +int blk_create_partitions(struct udevice *parent) > +{ > + int part; > + struct blk_desc *desc = dev_get_uclass_platdata(parent); > + disk_partition_t info; > + struct disk_part *part_data; > + char devname[32]; > + struct udevice *dev; > + int disks = 0, ret; > + > + /* Add devices for each partition */ > + for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) { > + if (part_get_info(desc, part, &info)) > + continue; > + snprintf(devname, sizeof(devname), "%s:%d", parent->name, > + part); > + > + ret = device_bind_driver(parent, "blk_partition", > + strdup(devname), &dev); > + if (ret) This looks like a memory leak for the output of strdup(). > + return ret; Why would we leave here if one partition fails? Does this imply that all further partitions will fail? Should we use continue here? Best regards Heinrich > + > + part_data = dev_get_uclass_platdata(dev); > + part_data->partnum = part; > + part_data->gpt_part_info = info; > + > + disks++; > + } > + > + return disks; > +} > +#else > +int blk_create_partitions(struct udevice *dev) > +{ > + return 0; > +} > +#endif > diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h > index f3bafb3c6353..e02b5f8fda42 100644 > --- a/include/dm/uclass-id.h > +++ b/include/dm/uclass-id.h > @@ -65,6 +65,7 @@ enum uclass_id { > UCLASS_NVME, /* NVM Express device */ > UCLASS_PANEL, /* Display panel, such as an LCD */ > UCLASS_PANEL_BACKLIGHT, /* Backlight controller for panel */ > + UCLASS_PARTITION, /* Logical disk partition device */ > UCLASS_PCH, /* x86 platform controller hub */ > UCLASS_PCI, /* PCI bus */ > UCLASS_PCI_GENERIC, /* Generic PCI bus device */ >