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

extcon: Add extcon_alloc_groups to simplify extcon register function



The alloc groups 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 3e70a014
Loading
Loading
Loading
Loading
+39 −22
Original line number Diff line number Diff line
@@ -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;
	ret = extcon_alloc_groups(edev);
	if (ret < 0)
		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;
	}

	spin_lock_init(&edev->lock);
	if (edev->max_supported) {