x86/olpc/xo1/sci: Report RTC wakeup events
authorDaniel Drake <dsd@laptop.org>
Wed, 18 Apr 2012 22:34:02 +0000 (23:34 +0100)
committerIngo Molnar <mingo@kernel.org>
Mon, 7 May 2012 13:02:26 +0000 (15:02 +0200)
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>
arch/x86/platform/olpc/olpc-xo1-sci.c
include/linux/cs5535.h

index 4b93ff4..04b8c73 100644 (file)
@@ -236,6 +236,18 @@ static irqreturn_t xo1_sci_intr(int irq, void *dev_id)
                pm_wakeup_event(&power_button_idev->dev, 0);
        }
 
+       if ((sts & (CS5536_RTC_FLAG | CS5536_WAK_FLAG)) ==
+                       (CS5536_RTC_FLAG | CS5536_WAK_FLAG)) {
+               /* When the system is woken by the RTC alarm, report the
+                * event on the rtc device. */
+               struct device *rtc = bus_find_device_by_name(
+                       &platform_bus_type, NULL, "rtc_cmos");
+               if (rtc) {
+                       pm_wakeup_event(rtc, 0);
+                       put_device(rtc);
+               }
+       }
+
        if (gpe & CS5536_GPIOM7_PME_FLAG) { /* EC GPIO */
                cs5535_gpio_set(OLPC_GPIO_ECSCI, GPIO_NEGATIVE_EDGE_STS);
                schedule_work(&sci_work);
@@ -326,9 +338,10 @@ static int __devinit setup_sci_interrupt(struct platform_device *pdev)
                outb(lo, CS5536_PIC_INT_SEL2);
        }
 
-       /* Enable SCI from power button, and clear pending interrupts */
+       /* Enable interesting SCI events, and clear pending interrupts */
        sts = inl(acpi_base + CS5536_PM1_STS);
-       outl((CS5536_PM_PWRBTN << 16) | 0xffff, acpi_base + CS5536_PM1_STS);
+       outl(((CS5536_PM_PWRBTN | CS5536_PM_RTC) << 16) | 0xffff,
+            acpi_base + CS5536_PM1_STS);
 
        r = request_irq(sci_irq, xo1_sci_intr, 0, DRV_NAME, pdev);
        if (r)
index c077aec..cfe8323 100644 (file)
@@ -95,6 +95,7 @@ static inline int cs5535_pic_unreqz_select_high(unsigned int group,
 
 /* CS5536_PM1_STS bits */
 #define CS5536_WAK_FLAG                (1 << 15)
+#define CS5536_RTC_FLAG                (1 << 10)
 #define CS5536_PWRBTN_FLAG     (1 << 8)
 
 /* CS5536_PM1_EN bits */