- patches.suse/slab-handle-memoryless-nodes-v2a.patch: Refresh.
[linux-flexiantxendom0-3.2.10.git] / drivers / rtc / rtc-pcf50633.c
index 4c5d5d0..854c3cb 100644 (file)
@@ -58,6 +58,7 @@ struct pcf50633_time {
 struct pcf50633_rtc {
        int alarm_enabled;
        int second_enabled;
+       int alarm_pending;
 
        struct pcf50633 *pcf;
        struct rtc_device *rtc_dev;
@@ -209,6 +210,7 @@ static int pcf50633_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
        rtc = dev_get_drvdata(dev);
 
        alrm->enabled = rtc->alarm_enabled;
+       alrm->pending = rtc->alarm_pending;
 
        ret = pcf50633_read_block(rtc->pcf, PCF50633_REG_RTCSCA,
                                PCF50633_TI_EXTENT, &pcf_tm.time[0]);
@@ -244,6 +246,8 @@ static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
        /* Returns 0 on success */
        ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSCA,
                                PCF50633_TI_EXTENT, &pcf_tm.time[0]);
+       if (!alrm->enabled)
+               rtc->alarm_pending = 0;
 
        if (!alarm_masked || alrm->enabled)
                pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM);
@@ -268,6 +272,7 @@ static void pcf50633_rtc_irq(int irq, void *data)
        switch (irq) {
        case PCF50633_IRQ_ALARM:
                rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
+               rtc->alarm_pending = 1;
                break;
        case PCF50633_IRQ_SECOND:
                rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
@@ -277,16 +282,13 @@ static void pcf50633_rtc_irq(int irq, void *data)
 
 static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
 {
-       struct pcf50633_subdev_pdata *pdata;
        struct pcf50633_rtc *rtc;
 
-
        rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
        if (!rtc)
                return -ENOMEM;
 
-       pdata = pdev->dev.platform_data;
-       rtc->pcf = pdata->pcf;
+       rtc->pcf = dev_to_pcf50633(pdev->dev.parent);
        platform_set_drvdata(pdev, rtc);
        rtc->rtc_dev = rtc_device_register("pcf50633-rtc", &pdev->dev,
                                &pcf50633_rtc_ops, THIS_MODULE);