extcon: Add extcon_alloc_groups to simplify extcon register function

The alloc groups is functionalized from extcon_dev_register.

Signed-off-by: Bumwoo Lee <bw365.lee@samsung.com>
Acked-by: MyungJoo Ham <myungjoo.ham@samsung.com
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
This commit is contained in:
Bumwoo Lee 2023-03-20 12:19:39 +09:00 committed by Chanwoo Choi
parent 3e70a014ab
commit 04151575c5
1 changed files with 39 additions and 22 deletions

View File

@ -1187,6 +1187,42 @@ static int extcon_alloc_muex(struct extcon_dev *edev)
return 0;
}
/**
* extcon_alloc_groups() - alloc the groups for extcon device
* @edev: extcon device
*
* Returns 0 if success or error number if fail.
*/
static int extcon_alloc_groups(struct extcon_dev *edev)
{
int index;
if (!edev)
return -EINVAL;
if (!edev->max_supported)
return 0;
edev->extcon_dev_type.groups = kcalloc(edev->max_supported + 2,
sizeof(struct attribute_group *),
GFP_KERNEL);
if (!edev->extcon_dev_type.groups)
return -ENOMEM;
edev->extcon_dev_type.name = dev_name(&edev->dev);
edev->extcon_dev_type.release = dummy_sysfs_dev_release;
for (index = 0; index < edev->max_supported; index++)
edev->extcon_dev_type.groups[index] = &edev->cables[index].attr_g;
if (edev->mutually_exclusive)
edev->extcon_dev_type.groups[index] = &edev->attr_g_muex;
edev->dev.type = &edev->extcon_dev_type;
return 0;
}
/**
* extcon_dev_register() - Register an new extcon device
* @edev: the extcon device to be registered
@ -1242,28 +1278,9 @@ int extcon_dev_register(struct extcon_dev *edev)
if (ret < 0)
goto err_alloc_muex;
if (edev->max_supported) {
edev->extcon_dev_type.groups =
kcalloc(edev->max_supported + 2,
sizeof(struct attribute_group *),
GFP_KERNEL);
if (!edev->extcon_dev_type.groups) {
ret = -ENOMEM;
goto err_alloc_groups;
}
edev->extcon_dev_type.name = dev_name(&edev->dev);
edev->extcon_dev_type.release = dummy_sysfs_dev_release;
for (index = 0; index < edev->max_supported; index++)
edev->extcon_dev_type.groups[index] =
&edev->cables[index].attr_g;
if (edev->mutually_exclusive)
edev->extcon_dev_type.groups[index] =
&edev->attr_g_muex;
edev->dev.type = &edev->extcon_dev_type;
}
ret = extcon_alloc_groups(edev);
if (ret < 0)
goto err_alloc_groups;
spin_lock_init(&edev->lock);
if (edev->max_supported) {