diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/rtc/rtc-pcf50633.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.c | 11 |
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 { | |||
58 | struct pcf50633_rtc { | 59 | struct 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 | ||
278 | static int __devinit pcf50633_rtc_probe(struct platform_device *pdev) | 284 | static 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); |