aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-pcf50633.c
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /drivers/rtc/rtc-pcf50633.c
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/rtc/rtc-pcf50633.c')
-rw-r--r--drivers/rtc/rtc-pcf50633.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/rtc/rtc-pcf50633.c b/drivers/rtc/rtc-pcf50633.c
index 4c5d5d0c4cfc..16edf94ab42f 100644
--- a/drivers/rtc/rtc-pcf50633.c
+++ b/drivers/rtc/rtc-pcf50633.c
@@ -18,6 +18,7 @@
18#include <linux/module.h> 18#include <linux/module.h>
19#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/device.h> 20#include <linux/device.h>
21#include <linux/slab.h>
21#include <linux/platform_device.h> 22#include <linux/platform_device.h>
22#include <linux/rtc.h> 23#include <linux/rtc.h>
23#include <linux/bcd.h> 24#include <linux/bcd.h>
@@ -58,6 +59,7 @@ struct pcf50633_time {
58struct pcf50633_rtc { 59struct pcf50633_rtc {
59 int alarm_enabled; 60 int alarm_enabled;
60 int second_enabled; 61 int second_enabled;
62 int alarm_pending;
61 63
62 struct pcf50633 *pcf; 64 struct pcf50633 *pcf;
63 struct rtc_device *rtc_dev; 65 struct rtc_device *rtc_dev;
@@ -209,6 +211,7 @@ static int pcf50633_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
209 rtc = dev_get_drvdata(dev); 211 rtc = dev_get_drvdata(dev);
210 212
211 alrm->enabled = rtc->alarm_enabled; 213 alrm->enabled = rtc->alarm_enabled;
214 alrm->pending = rtc->alarm_pending;
212 215
213 ret = pcf50633_read_block(rtc->pcf, PCF50633_REG_RTCSCA, 216 ret = pcf50633_read_block(rtc->pcf, PCF50633_REG_RTCSCA,
214 PCF50633_TI_EXTENT, &pcf_tm.time[0]); 217 PCF50633_TI_EXTENT, &pcf_tm.time[0]);
@@ -244,6 +247,8 @@ static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
244 /* Returns 0 on success */ 247 /* Returns 0 on success */
245 ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSCA, 248 ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSCA,
246 PCF50633_TI_EXTENT, &pcf_tm.time[0]); 249 PCF50633_TI_EXTENT, &pcf_tm.time[0]);
250 if (!alrm->enabled)
251 rtc->alarm_pending = 0;
247 252
248 if (!alarm_masked || alrm->enabled) 253 if (!alarm_masked || alrm->enabled)
249 pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM); 254 pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM);
@@ -268,6 +273,7 @@ static void pcf50633_rtc_irq(int irq, void *data)
268 switch (irq) { 273 switch (irq) {
269 case PCF50633_IRQ_ALARM: 274 case PCF50633_IRQ_ALARM:
270 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF); 275 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
276 rtc->alarm_pending = 1;
271 break; 277 break;
272 case PCF50633_IRQ_SECOND: 278 case PCF50633_IRQ_SECOND:
273 rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF); 279 rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
@@ -277,16 +283,13 @@ static void pcf50633_rtc_irq(int irq, void *data)
277 283
278static int __devinit pcf50633_rtc_probe(struct platform_device *pdev) 284static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
279{ 285{
280 struct pcf50633_subdev_pdata *pdata;
281 struct pcf50633_rtc *rtc; 286 struct pcf50633_rtc *rtc;
282 287
283
284 rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); 288 rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
285 if (!rtc) 289 if (!rtc)
286 return -ENOMEM; 290 return -ENOMEM;
287 291
288 pdata = pdev->dev.platform_data; 292 rtc->pcf = dev_to_pcf50633(pdev->dev.parent);
289 rtc->pcf = pdata->pcf;
290 platform_set_drvdata(pdev, rtc); 293 platform_set_drvdata(pdev, rtc);
291 rtc->rtc_dev = rtc_device_register("pcf50633-rtc", &pdev->dev, 294 rtc->rtc_dev = rtc_device_register("pcf50633-rtc", &pdev->dev,
292 &pcf50633_rtc_ops, THIS_MODULE); 295 &pcf50633_rtc_ops, THIS_MODULE);