diff options
Diffstat (limited to 'drivers/leds/leds-asic3.c')
| -rw-r--r-- | drivers/leds/leds-asic3.c | 36 | 
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/leds/leds-asic3.c b/drivers/leds/leds-asic3.c index 22f847c890c..48d9fe61bdf 100644 --- a/drivers/leds/leds-asic3.c +++ b/drivers/leds/leds-asic3.c @@ -14,6 +14,7 @@  #include <linux/mfd/asic3.h>  #include <linux/mfd/core.h> +#include <linux/module.h>  /*   *	The HTC ASIC3 LED GPIOs are inputs, not outputs. @@ -107,9 +108,10 @@ static int __devinit asic3_led_probe(struct platform_device *pdev)  	}  	led->cdev->name = led->name; -	led->cdev->default_trigger = led->default_trigger; +	led->cdev->flags = LED_CORE_SUSPENDRESUME;  	led->cdev->brightness_set = brightness_set;  	led->cdev->blink_set = blink_set; +	led->cdev->default_trigger = led->default_trigger;  	ret = led_classdev_register(&pdev->dev, led->cdev);  	if (ret < 0) @@ -136,12 +138,44 @@ static int __devexit asic3_led_remove(struct platform_device *pdev)  	return mfd_cell_disable(pdev);  } +static int asic3_led_suspend(struct device *dev) +{ +	struct platform_device *pdev = to_platform_device(dev); +	const struct mfd_cell *cell = mfd_get_cell(pdev); +	int ret; + +	ret = 0; +	if (cell->suspend) +		ret = (*cell->suspend)(pdev); + +	return ret; +} + +static int asic3_led_resume(struct device *dev) +{ +	struct platform_device *pdev = to_platform_device(dev); +	const struct mfd_cell *cell = mfd_get_cell(pdev); +	int ret; + +	ret = 0; +	if (cell->resume) +		ret = (*cell->resume)(pdev); + +	return ret; +} + +static const struct dev_pm_ops asic3_led_pm_ops = { +	.suspend	= asic3_led_suspend, +	.resume		= asic3_led_resume, +}; +  static struct platform_driver asic3_led_driver = {  	.probe		= asic3_led_probe,  	.remove		= __devexit_p(asic3_led_remove),  	.driver		= {  		.name	= "leds-asic3",  		.owner	= THIS_MODULE, +		.pm	= &asic3_led_pm_ops,  	},  };  |