81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* drivers/leds/ledtrig-sleep.c
 | 
						|
 *
 | 
						|
 * Copyright (C) 2007 Google, Inc.
 | 
						|
 *
 | 
						|
 * This software is licensed under the terms of the GNU General Public
 | 
						|
 * License version 2, as published by the Free Software Foundation, and
 | 
						|
 * may be copied, distributed, and modified under those terms.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/earlysuspend.h>
 | 
						|
#include <linux/leds.h>
 | 
						|
#include <linux/suspend.h>
 | 
						|
 | 
						|
static int ledtrig_sleep_pm_callback(struct notifier_block *nfb,
 | 
						|
					unsigned long action,
 | 
						|
					void *ignored);
 | 
						|
 | 
						|
DEFINE_LED_TRIGGER(ledtrig_sleep)
 | 
						|
static struct notifier_block ledtrig_sleep_pm_notifier = {
 | 
						|
	.notifier_call = ledtrig_sleep_pm_callback,
 | 
						|
	.priority = 0,
 | 
						|
};
 | 
						|
 | 
						|
static void ledtrig_sleep_early_suspend(struct early_suspend *h)
 | 
						|
{
 | 
						|
	led_trigger_event(ledtrig_sleep, LED_FULL);
 | 
						|
}
 | 
						|
 | 
						|
static void ledtrig_sleep_early_resume(struct early_suspend *h)
 | 
						|
{
 | 
						|
	led_trigger_event(ledtrig_sleep, LED_OFF);
 | 
						|
}
 | 
						|
 | 
						|
static struct early_suspend ledtrig_sleep_early_suspend_handler = {
 | 
						|
	.suspend = ledtrig_sleep_early_suspend,
 | 
						|
	.resume = ledtrig_sleep_early_resume,
 | 
						|
};
 | 
						|
 | 
						|
static int ledtrig_sleep_pm_callback(struct notifier_block *nfb,
 | 
						|
					unsigned long action,
 | 
						|
					void *ignored)
 | 
						|
{
 | 
						|
	switch (action) {
 | 
						|
	case PM_HIBERNATION_PREPARE:
 | 
						|
	case PM_SUSPEND_PREPARE:
 | 
						|
		led_trigger_event(ledtrig_sleep, LED_OFF);
 | 
						|
		return NOTIFY_OK;
 | 
						|
	case PM_POST_HIBERNATION:
 | 
						|
	case PM_POST_SUSPEND:
 | 
						|
		led_trigger_event(ledtrig_sleep, LED_FULL);
 | 
						|
		return NOTIFY_OK;
 | 
						|
	}
 | 
						|
 | 
						|
	return NOTIFY_DONE;
 | 
						|
}
 | 
						|
 | 
						|
static int __init ledtrig_sleep_init(void)
 | 
						|
{
 | 
						|
	led_trigger_register_simple("sleep", &ledtrig_sleep);
 | 
						|
	register_pm_notifier(&ledtrig_sleep_pm_notifier);
 | 
						|
	register_early_suspend(&ledtrig_sleep_early_suspend_handler);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
static void __exit ledtrig_sleep_exit(void)
 | 
						|
{
 | 
						|
	unregister_early_suspend(&ledtrig_sleep_early_suspend_handler);
 | 
						|
	unregister_pm_notifier(&ledtrig_sleep_pm_notifier);
 | 
						|
	led_trigger_unregister_simple(ledtrig_sleep);
 | 
						|
}
 | 
						|
 | 
						|
module_init(ledtrig_sleep_init);
 | 
						|
module_exit(ledtrig_sleep_exit);
 | 
						|
 |