lkml.org 
[lkml]   [2023]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 6/7] mtd: ubi: populate ubi volume fwnode
    Look for the 'volumes' subnode of an MTD partition attached to a UBI
    device and attach matching child nodes to UBI volumes.
    This allows UBI volumes to be referenced in device tree, e.g. for use
    as NVMEM providers.

    Signed-off-by: Daniel Golle <daniel@makrotopia.org>
    ---
    drivers/mtd/ubi/vmt.c | 31 +++++++++++++++++++++++++++++++
    1 file changed, 31 insertions(+)

    diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
    index eed4b57c61bda..3b997256cfba7 100644
    --- a/drivers/mtd/ubi/vmt.c
    +++ b/drivers/mtd/ubi/vmt.c
    @@ -124,6 +124,35 @@ static void vol_release(struct device *dev)
    kfree(vol);
    }

    +static struct fwnode_handle *find_volume_fwnode(struct ubi_volume *vol)
    +{
    + struct fwnode_handle *fw_vols, *fw_vol;
    + const char *volname;
    + u32 reg;
    +
    + fw_vols = device_get_named_child_node(vol->dev.parent->parent, "volumes");
    + if (!fw_vols)
    + return NULL;
    +
    + fwnode_for_each_child_node(fw_vols, fw_vol) {
    + if (!fwnode_property_read_string(fw_vol, "volname", &volname) &&
    + strncmp(volname, vol->name, vol->name_len))
    + continue;
    +
    + /*
    + * volume id (reg) in device tree greater than UBI_MAX_VOLUMES
    + * can be used to match by volname only
    + */
    + if (!fwnode_property_read_u32(fw_vol, "reg", &reg) &&
    + reg < UBI_MAX_VOLUMES && vol->vol_id != reg)
    + continue;
    +
    + return fw_vol;
    + }
    +
    + return NULL;
    +}
    +
    /**
    * ubi_create_volume - create volume.
    * @ubi: UBI device description object
    @@ -223,6 +252,7 @@ int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req)
    vol->name_len = req->name_len;
    memcpy(vol->name, req->name, vol->name_len);
    vol->ubi = ubi;
    + device_set_node(&vol->dev, find_volume_fwnode(vol));

    /*
    * Finish all pending erases because there may be some LEBs belonging
    @@ -597,6 +627,7 @@ int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol)
    vol->dev.class = &ubi_class;
    vol->dev.groups = volume_dev_groups;
    dev_set_name(&vol->dev, "%s_%d", ubi->ubi_name, vol->vol_id);
    + device_set_node(&vol->dev, find_volume_fwnode(vol));
    err = device_register(&vol->dev);
    if (err) {
    cdev_del(&vol->cdev);
    --
    2.41.0
    \
     
     \ /
      Last update: 2023-08-05 18:27    [W:4.821 / U:0.868 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site