gpio: mockup: refactor the module init function
authorBartosz Golaszewski <bgolaszewski@baylibre.com>
Tue, 29 Sep 2020 10:10:04 +0000 (12:10 +0200)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Wed, 30 Sep 2020 08:52:21 +0000 (10:52 +0200)
Let's move the code preparing the device properties into a separate
routine. This has the advantage of simplifying the error handling and
makes the indentation less deep.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/gpio/gpio-mockup.c

index 2d865b5..67ed4f2 100644 (file)
@@ -503,16 +503,59 @@ static __init char **gpio_mockup_make_line_names(const char *label,
        return names;
 }
 
-static int __init gpio_mockup_init(void)
+static int __init gpio_mockup_register_chip(int idx)
 {
        struct property_entry properties[GPIO_MOCKUP_MAX_PROP];
-       int i, prop, num_chips, err = 0, base;
        struct platform_device_info pdevinfo;
        struct platform_device *pdev;
+       char **line_names = NULL;
        char chip_label[32];
-       char **line_names;
+       int prop = 0, base;
        u16 ngpio;
 
+       memset(properties, 0, sizeof(properties));
+       memset(&pdevinfo, 0, sizeof(pdevinfo));
+
+       snprintf(chip_label, sizeof(chip_label), "gpio-mockup-%c", idx + 'A');
+       properties[prop++] = PROPERTY_ENTRY_STRING("chip-label", chip_label);
+
+       base = gpio_mockup_range_base(idx);
+       if (base >= 0)
+               properties[prop++] = PROPERTY_ENTRY_U32("gpio-base", base);
+
+       ngpio = base < 0 ? gpio_mockup_range_ngpio(idx)
+                        : gpio_mockup_range_ngpio(idx) - base;
+       properties[prop++] = PROPERTY_ENTRY_U16("nr-gpios", ngpio);
+
+       if (gpio_mockup_named_lines) {
+               line_names = gpio_mockup_make_line_names(chip_label, ngpio);
+               if (!line_names)
+                       return -ENOMEM;
+
+               properties[prop++] = PROPERTY_ENTRY_STRING_ARRAY_LEN(
+                                       "gpio-line-names", line_names, ngpio);
+       }
+
+       pdevinfo.name = "gpio-mockup";
+       pdevinfo.id = idx;
+       pdevinfo.properties = properties;
+
+       pdev = platform_device_register_full(&pdevinfo);
+       kfree_strarray(line_names, ngpio);
+       if (IS_ERR(pdev)) {
+               pr_err("error registering device");
+               return PTR_ERR(pdev);
+       }
+
+       gpio_mockup_pdevs[idx] = pdev;
+
+       return 0;
+}
+
+static int __init gpio_mockup_init(void)
+{
+       int i, num_chips, err;
+
        if ((gpio_mockup_num_ranges < 2) ||
            (gpio_mockup_num_ranges % 2) ||
            (gpio_mockup_num_ranges > GPIO_MOCKUP_MAX_RANGES))
@@ -540,54 +583,13 @@ static int __init gpio_mockup_init(void)
        }
 
        for (i = 0; i < num_chips; i++) {
-               memset(properties, 0, sizeof(properties));
-               memset(&pdevinfo, 0, sizeof(pdevinfo));
-               prop = 0;
-               line_names = NULL;
-
-               snprintf(chip_label, sizeof(chip_label),
-                        "gpio-mockup-%c", i + 'A');
-               properties[prop++] = PROPERTY_ENTRY_STRING("chip-label",
-                                                          chip_label);
-
-               base = gpio_mockup_range_base(i);
-               if (base >= 0)
-                       properties[prop++] = PROPERTY_ENTRY_U32("gpio-base",
-                                                               base);
-
-               ngpio = base < 0 ? gpio_mockup_range_ngpio(i)
-                                : gpio_mockup_range_ngpio(i) - base;
-               properties[prop++] = PROPERTY_ENTRY_U16("nr-gpios", ngpio);
-
-               if (gpio_mockup_named_lines) {
-                       line_names = gpio_mockup_make_line_names(chip_label,
-                                                                ngpio);
-                       if (!line_names) {
-                               platform_driver_unregister(&gpio_mockup_driver);
-                               gpio_mockup_unregister_pdevs();
-                               return -ENOMEM;
-                       }
-
-                       properties[prop++] = PROPERTY_ENTRY_STRING_ARRAY_LEN(
-                                               "gpio-line-names",
-                                               line_names, ngpio);
-               }
-
-               pdevinfo.name = "gpio-mockup";
-               pdevinfo.id = i;
-               pdevinfo.properties = properties;
-
-               pdev = platform_device_register_full(&pdevinfo);
-               kfree_strarray(line_names, ngpio);
-               if (IS_ERR(pdev)) {
-                       pr_err("error registering device");
+               err = gpio_mockup_register_chip(i);
+               if (err) {
                        platform_driver_unregister(&gpio_mockup_driver);
                        gpio_mockup_unregister_pdevs();
                        debugfs_remove_recursive(gpio_mockup_dbg_dir);
-                       return PTR_ERR(pdev);
+                       return err;
                }
-
-               gpio_mockup_pdevs[i] = pdev;
        }
 
        return 0;