Loading drivers/extcon/extcon.c +61 −48 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 = Loading Loading @@ -1295,7 +1308,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); if (edev->max_supported) Loading Loading
drivers/extcon/extcon.c +61 −48 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 = Loading Loading @@ -1295,7 +1308,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); if (edev->max_supported) Loading