extcon: Add extcon_alloc_groups to simplify extcon register function
authorBumwoo Lee <bw365.lee@samsung.com>
Mon, 20 Mar 2023 03:19:39 +0000 (12:19 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Mon, 29 May 2023 14:31:25 +0000 (23:31 +0900)
The alloc groups 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>
drivers/extcon/extcon.c

index 3188b0e..3997b39 100644 (file)
@@ -1188,6 +1188,42 @@ static int extcon_alloc_muex(struct extcon_dev *edev)
 }
 
 /**
+ * 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;
-                       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;
-       }
+       ret = extcon_alloc_groups(edev);
+       if (ret < 0)
+               goto err_alloc_groups;
 
        spin_lock_init(&edev->lock);
        if (edev->max_supported) {