Commit 42e9acc6 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski

gpio: mockup: refactor the module init function

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: default avatarBartosz Golaszewski <bgolaszewski@baylibre.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
parent 582be05e
...@@ -503,16 +503,59 @@ static __init char **gpio_mockup_make_line_names(const char *label, ...@@ -503,16 +503,59 @@ static __init char **gpio_mockup_make_line_names(const char *label,
return names; 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]; struct property_entry properties[GPIO_MOCKUP_MAX_PROP];
int i, prop, num_chips, err = 0, base;
struct platform_device_info pdevinfo; struct platform_device_info pdevinfo;
struct platform_device *pdev; struct platform_device *pdev;
char **line_names = NULL;
char chip_label[32]; char chip_label[32];
char **line_names; int prop = 0, base;
u16 ngpio; 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) || if ((gpio_mockup_num_ranges < 2) ||
(gpio_mockup_num_ranges % 2) || (gpio_mockup_num_ranges % 2) ||
(gpio_mockup_num_ranges > GPIO_MOCKUP_MAX_RANGES)) (gpio_mockup_num_ranges > GPIO_MOCKUP_MAX_RANGES))
...@@ -540,54 +583,13 @@ static int __init gpio_mockup_init(void) ...@@ -540,54 +583,13 @@ static int __init gpio_mockup_init(void)
} }
for (i = 0; i < num_chips; i++) { for (i = 0; i < num_chips; i++) {
memset(properties, 0, sizeof(properties)); err = gpio_mockup_register_chip(i);
memset(&pdevinfo, 0, sizeof(pdevinfo)); if (err) {
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");
platform_driver_unregister(&gpio_mockup_driver); platform_driver_unregister(&gpio_mockup_driver);
gpio_mockup_unregister_pdevs(); gpio_mockup_unregister_pdevs();
debugfs_remove_recursive(gpio_mockup_dbg_dir); debugfs_remove_recursive(gpio_mockup_dbg_dir);
return PTR_ERR(pdev); return err;
} }
gpio_mockup_pdevs[i] = pdev;
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment