mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	leds: Introduce devres helper for led_classdev_register
(cooloney@gmail.com: add _unregister function into the document) Suggested-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
This commit is contained in:
		
							parent
							
								
									eb2294c343
								
							
						
					
					
						commit
						ca1bb4ee4c
					
				
					 3 changed files with 65 additions and 0 deletions
				
			
		|  | @ -289,6 +289,10 @@ IRQ | |||
|   devm_request_irq() | ||||
|   devm_request_threaded_irq() | ||||
| 
 | ||||
| LED | ||||
|   devm_led_classdev_register() | ||||
|   devm_led_classdev_unregister() | ||||
| 
 | ||||
| MDIO | ||||
|   devm_mdiobus_alloc() | ||||
|   devm_mdiobus_alloc_size() | ||||
|  |  | |||
|  | @ -288,6 +288,63 @@ void led_classdev_unregister(struct led_classdev *led_cdev) | |||
| } | ||||
| EXPORT_SYMBOL_GPL(led_classdev_unregister); | ||||
| 
 | ||||
| static void devm_led_classdev_release(struct device *dev, void *res) | ||||
| { | ||||
| 	led_classdev_unregister(*(struct led_classdev **)res); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * devm_led_classdev_register - resource managed led_classdev_register() | ||||
|  * @parent: The device to register. | ||||
|  * @led_cdev: the led_classdev structure for this device. | ||||
|  */ | ||||
| int devm_led_classdev_register(struct device *parent, | ||||
| 			       struct led_classdev *led_cdev) | ||||
| { | ||||
| 	struct led_classdev **dr; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	dr = devres_alloc(devm_led_classdev_release, sizeof(*dr), GFP_KERNEL); | ||||
| 	if (!dr) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	rc = led_classdev_register(parent, led_cdev); | ||||
| 	if (rc) { | ||||
| 		devres_free(dr); | ||||
| 		return rc; | ||||
| 	} | ||||
| 
 | ||||
| 	*dr = led_cdev; | ||||
| 	devres_add(parent, dr); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(devm_led_classdev_register); | ||||
| 
 | ||||
| static int devm_led_classdev_match(struct device *dev, void *res, void *data) | ||||
| { | ||||
| 	struct led_cdev **p = res; | ||||
| 
 | ||||
| 	if (WARN_ON(!p || !*p)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	return *p == data; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * devm_led_classdev_unregister() - resource managed led_classdev_unregister() | ||||
|  * @parent: The device to unregister. | ||||
|  * @led_cdev: the led_classdev structure for this device. | ||||
|  */ | ||||
| void devm_led_classdev_unregister(struct device *dev, | ||||
| 				  struct led_classdev *led_cdev) | ||||
| { | ||||
| 	WARN_ON(devres_release(dev, | ||||
| 			       devm_led_classdev_release, | ||||
| 			       devm_led_classdev_match, led_cdev)); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(devm_led_classdev_unregister); | ||||
| 
 | ||||
| static int __init leds_init(void) | ||||
| { | ||||
| 	leds_class = class_create(THIS_MODULE, "leds"); | ||||
|  |  | |||
|  | @ -105,7 +105,11 @@ struct led_classdev { | |||
| 
 | ||||
| extern int led_classdev_register(struct device *parent, | ||||
| 				 struct led_classdev *led_cdev); | ||||
| extern int devm_led_classdev_register(struct device *parent, | ||||
| 				      struct led_classdev *led_cdev); | ||||
| extern void led_classdev_unregister(struct led_classdev *led_cdev); | ||||
| extern void devm_led_classdev_unregister(struct device *parent, | ||||
| 					 struct led_classdev *led_cdev); | ||||
| extern void led_classdev_suspend(struct led_classdev *led_cdev); | ||||
| extern void led_classdev_resume(struct led_classdev *led_cdev); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Bjorn Andersson
						Bjorn Andersson