extcon: Add extcon_alloc_muex to simplify extcon register function

The mutual exclusive part 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:38 +09:00 committed by Chanwoo Choi
parent 3d9138e5bd
commit 3e70a014ab

View file

@ -1130,6 +1130,63 @@ 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)
return -EINVAL;
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
@ -1181,53 +1238,9 @@ int extcon_dev_register(struct extcon_dev *edev)
if (ret < 0)
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;
}
ret = extcon_alloc_muex(edev);
if (ret < 0)
goto err_alloc_muex;
if (edev->max_supported) {
edev->extcon_dev_type.groups =
@ -1295,7 +1308,7 @@ err_alloc_groups:
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);
if (edev->max_supported)