lkml.org 
[lkml]   [2023]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/4] extcon: added extcon_alloc_muex to simplify extcon register function
    Date
    The mutual exclusive part is functionalized from extcon_dev_register.

    Signed-off-by: Bumwoo Lee <bw365.lee@samsung.com>
    ---
    drivers/extcon/extcon.c | 105 ++++++++++++++++++++++------------------
    1 file changed, 57 insertions(+), 48 deletions(-)

    diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c
    index 28058a1d2745..93cab4fe178e 100644
    --- a/drivers/extcon/extcon.c
    +++ b/drivers/extcon/extcon.c
    @@ -1125,6 +1125,60 @@ static int extcon_alloc_cables(struct extcon_dev *edev)
    return 0;
    }

    +/**
    + * extcon_alloc_muex() - alloc the mutual exclusive for extcon device
    + * @edev: extcon device
    + *
    + * Returns 0 if success or error number if fail.
    + */
    +static int extcon_alloc_muex(struct extcon_dev *edev)
    +{
    + char *name;
    + int index;
    +
    + if (!(edev->max_supported && edev->mutually_exclusive))
    + return 0;
    +
    + /* Count the size of mutually_exclusive array */
    + for (index = 0; edev->mutually_exclusive[index]; index++)
    + ;
    +
    + edev->attrs_muex = kcalloc(index + 1,
    + sizeof(struct attribute *),
    + GFP_KERNEL);
    + if (!edev->attrs_muex)
    + return -ENOMEM;
    +
    + edev->d_attrs_muex = kcalloc(index,
    + sizeof(struct device_attribute),
    + GFP_KERNEL);
    + if (!edev->d_attrs_muex) {
    + kfree(edev->attrs_muex);
    + return -ENOMEM;
    + }
    +
    + for (index = 0; edev->mutually_exclusive[index]; index++) {
    + name = kasprintf(GFP_KERNEL, "0x%x",
    + edev->mutually_exclusive[index]);
    + if (!name) {
    + for (index--; index >= 0; index--)
    + kfree(edev->d_attrs_muex[index].attr.name);
    +
    + kfree(edev->d_attrs_muex);
    + kfree(edev->attrs_muex);
    + return -ENOMEM;
    + }
    + sysfs_attr_init(&edev->d_attrs_muex[index].attr);
    + edev->d_attrs_muex[index].attr.name = name;
    + edev->d_attrs_muex[index].attr.mode = 0000;
    + edev->attrs_muex[index] = &edev->d_attrs_muex[index].attr;
    + }
    + edev->attr_g_muex.name = muex_name;
    + edev->attr_g_muex.attrs = edev->attrs_muex;
    +
    + return 0;
    +}
    +
    /**
    * extcon_dev_register() - Register an new extcon device
    * @edev: the extcon device to be registered
    @@ -1175,53 +1229,8 @@ int extcon_dev_register(struct extcon_dev *edev)
    if (extcon_alloc_cables(edev))
    goto err_alloc_cables;

    - if (edev->max_supported && edev->mutually_exclusive) {
    - char *name;
    -
    - /* Count the size of mutually_exclusive array */
    - for (index = 0; edev->mutually_exclusive[index]; index++)
    - ;
    -
    - edev->attrs_muex = kcalloc(index + 1,
    - sizeof(struct attribute *),
    - GFP_KERNEL);
    - if (!edev->attrs_muex) {
    - ret = -ENOMEM;
    - goto err_muex;
    - }
    -
    - edev->d_attrs_muex = kcalloc(index,
    - sizeof(struct device_attribute),
    - GFP_KERNEL);
    - if (!edev->d_attrs_muex) {
    - ret = -ENOMEM;
    - kfree(edev->attrs_muex);
    - goto err_muex;
    - }
    -
    - for (index = 0; edev->mutually_exclusive[index]; index++) {
    - name = kasprintf(GFP_KERNEL, "0x%x",
    - edev->mutually_exclusive[index]);
    - if (!name) {
    - for (index--; index >= 0; index--) {
    - kfree(edev->d_attrs_muex[index].attr.
    - name);
    - }
    - kfree(edev->d_attrs_muex);
    - kfree(edev->attrs_muex);
    - ret = -ENOMEM;
    - goto err_muex;
    - }
    - sysfs_attr_init(&edev->d_attrs_muex[index].attr);
    - edev->d_attrs_muex[index].attr.name = name;
    - edev->d_attrs_muex[index].attr.mode = 0000;
    - edev->attrs_muex[index] = &edev->d_attrs_muex[index]
    - .attr;
    - }
    - edev->attr_g_muex.name = muex_name;
    - edev->attr_g_muex.attrs = edev->attrs_muex;
    -
    - }
    + if (extcon_alloc_muex(edev))
    + goto err_alloc_muex;

    if (edev->max_supported) {
    edev->extcon_dev_type.groups =
    @@ -1289,7 +1298,7 @@ int extcon_dev_register(struct extcon_dev *edev)
    kfree(edev->d_attrs_muex);
    kfree(edev->attrs_muex);
    }
    -err_muex:
    +err_alloc_muex:
    for (index = 0; index < edev->max_supported; index++)
    kfree(edev->cables[index].attr_g.name);
    err_alloc_cables:
    --
    2.35.1
    \
     
     \ /
      Last update: 2023-03-27 00:26    [W:3.736 / U:0.624 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site