aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/platform/olpc
diff options
context:
space:
mode:
authorDaniel Drake <dsd@laptop.org>2012-04-18 18:34:02 -0400
committerIngo Molnar <mingo@kernel.org>2012-05-07 09:02:26 -0400
commitc2c21e9bb17549e8add4ff76931bcec2e2d3ad48 (patch)
tree136ce4652cbd99a57ce77fbe4d29a01f015c3838 /arch/x86/platform/olpc
parentd2aa37411b8e65d57d2c5ae36f0222274292020d (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/olpc')
-rw-r--r--arch/x86/platform/olpc/olpc-xo1-sci.c17
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)