mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 05:24:39 +01:00
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:
parent
3d9138e5bd
commit
3e70a014ab
1 changed files with 61 additions and 48 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue