Commit 3e70a014 authored by Bumwoo Lee's avatar Bumwoo Lee Committed by Chanwoo Choi
Browse files

extcon: Add extcon_alloc_muex to simplify extcon register function



The mutual exclusive part is functionalized from extcon_dev_register.

Signed-off-by: default avatarBumwoo Lee <bw365.lee@samsung.com>
Acked-by: default avatarMyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
parent 3d9138e5
Loading
Loading
Loading
Loading
+61 −48
Original line number Diff line number Diff line
@@ -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 @@ 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)