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:
		
							parent
							
								
									582be05ea4
								
							
						
					
					
						commit
						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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user