Jordan, This allows configuration of powerbutton/lid events... Are the gpio_gpio_{clear,set} calls correct for enabling/disabling LID events? What else do we want to support? --- olpc-pm.c.orig 2007-07-08 17:09:07.000000000 -0400 +++ olpc-pm.c 2007-07-08 18:07:03.000000000 -0400 @@ -54,6 +54,18 @@ static int gpio_wake_events = 0; static int ebook_state = -1; +static u16 olpc_wakeup_mask = 0; + +struct platform_device olpc_powerbutton_dev = { + .name = "powerbutton", + .id = 0, +}; + +struct platform_device olpc_lid_dev = { + .name = "lid", + .id = 0, +}; + static void __init init_ebook_state(void) { @@ -250,6 +262,16 @@ /* Save the MFGPT MSRs */ rdmsrl(MFGPT_IRQ_MSR, mfgpt_irq_msr); rdmsrl(MFGPT_NR_MSR, mfgpt_nr_msr); + + if (device_may_wakeup(&olpc_powerbutton_dev.dev)) + olpc_wakeup_mask |= CS5536_PM_PWRBTN; + else + olpc_wakeup_mask &= ~(CS5536_PM_PWRBTN); + + if (device_may_wakeup(&olpc_lid_dev.dev)) + geode_gpio_clear(OLPC_GPIO_LID, GPIO_EVENTS_ENABLE); + else + geode_gpio_set(OLPC_GPIO_LID, GPIO_EVENTS_ENABLE); } static int olpc_pm_enter(suspend_state_t pm_state) @@ -275,8 +297,6 @@ return 0; } -static u16 olpc_wakeup_mask = CS5536_PM_PWRBTN; - int asmlinkage olpc_do_sleep(u8 sleep_state) { void *pgd_addr = __va(read_cr3()); @@ -596,15 +616,20 @@ .resource = rtc_platform_resource, }; -static int __init olpc_rtc_init(void) +static int __init olpc_platform_init(void) { (void)platform_device_register(&olpc_rtc_device); - device_init_wakeup(&olpc_rtc_device.dev, 1); + (void)platform_device_register(&olpc_powerbutton_dev); + device_init_wakeup(&olpc_powerbutton_dev.dev, 1); + + (void)platform_device_register(&olpc_lid_dev); + device_init_wakeup(&olpc_lid_dev.dev, 1); + return 0; } -arch_initcall(olpc_rtc_init); +arch_initcall(olpc_platform_init); #endif /* CONFIG_RTC_DRV_CMOS */ static void olpc_pm_exit(void) - To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html