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: Bartosz Golaszewski <bgolaszewski@baylibre.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
Родитель
582be05ea4
Коммит
42e9acc679
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче