diff options
author | Daniel Drake <dsd@laptop.org> | 2012-04-18 18:34:02 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-05-07 09:02:26 -0400 |
commit | c2c21e9bb17549e8add4ff76931bcec2e2d3ad48 (patch) | |
tree | 136ce4652cbd99a57ce77fbe4d29a01f015c3838 /arch/x86/platform | |
parent | d2aa37411b8e65d57d2c5ae36f0222274292020d (diff) |
x86/olpc/xo1/sci: Report RTC wakeup events
When the system is woken due to a RTC event, report the wakeup
event on the relevant rtc device (if it can be found).
Signed-off-by: Daniel Drake <dsd@laptop.org>
Cc: dilinger@queued.net
Cc: pgf@laptop.org
Link: http://lkml.kernel.org/r/20120418223402.D73249D401E@zog.reactivated.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/platform')
-rw-r--r-- | arch/x86/platform/olpc/olpc-xo1-sci.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/x86/platform/olpc/olpc-xo1-sci.c b/arch/x86/platform/olpc/olpc-xo1-sci.c index 4b93ff46cec3..04b8c73659c5 100644 --- a/arch/x86/platform/olpc/olpc-xo1-sci.c +++ b/arch/x86/platform/olpc/olpc-xo1-sci.c | |||
@@ -236,6 +236,18 @@ static irqreturn_t xo1_sci_intr(int irq, void *dev_id) | |||
236 | pm_wakeup_event(&power_button_idev->dev, 0); | 236 | pm_wakeup_event(&power_button_idev->dev, 0); |
237 | } | 237 | } |
238 | 238 | ||
239 | if ((sts & (CS5536_RTC_FLAG | CS5536_WAK_FLAG)) == | ||
240 | (CS5536_RTC_FLAG | CS5536_WAK_FLAG)) { | ||
241 | /* When the system is woken by the RTC alarm, report the | ||
242 | * event on the rtc device. */ | ||
243 | struct device *rtc = bus_find_device_by_name( | ||
244 | &platform_bus_type, NULL, "rtc_cmos"); | ||
245 | if (rtc) { | ||
246 | pm_wakeup_event(rtc, 0); | ||
247 | put_device(rtc); | ||
248 | } | ||
249 | } | ||
250 | |||
239 | if (gpe & CS5536_GPIOM7_PME_FLAG) { /* EC GPIO */ | 251 | if (gpe & CS5536_GPIOM7_PME_FLAG) { /* EC GPIO */ |
240 | cs5535_gpio_set(OLPC_GPIO_ECSCI, GPIO_NEGATIVE_EDGE_STS); | 252 | cs5535_gpio_set(OLPC_GPIO_ECSCI, GPIO_NEGATIVE_EDGE_STS); |
241 | schedule_work(&sci_work); | 253 | schedule_work(&sci_work); |
@@ -326,9 +338,10 @@ static int __devinit setup_sci_interrupt(struct platform_device *pdev) | |||
326 | outb(lo, CS5536_PIC_INT_SEL2); | 338 | outb(lo, CS5536_PIC_INT_SEL2); |
327 | } | 339 | } |
328 | 340 | ||
329 | /* Enable SCI from power button, and clear pending interrupts */ | 341 | /* Enable interesting SCI events, and clear pending interrupts */ |
330 | sts = inl(acpi_base + CS5536_PM1_STS); | 342 | sts = inl(acpi_base + CS5536_PM1_STS); |
331 | outl((CS5536_PM_PWRBTN << 16) | 0xffff, acpi_base + CS5536_PM1_STS); | 343 | outl(((CS5536_PM_PWRBTN | CS5536_PM_RTC) << 16) | 0xffff, |
344 | acpi_base + CS5536_PM1_STS); | ||
332 | 345 | ||
333 | r = request_irq(sci_irq, xo1_sci_intr, 0, DRV_NAME, pdev); | 346 | r = request_irq(sci_irq, xo1_sci_intr, 0, DRV_NAME, pdev); |
334 | if (r) | 347 | if (r) |