aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-mrst.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-mrst.c')
-rw-r--r--drivers/rtc/rtc-mrst.c50
1 files changed, 21 insertions, 29 deletions
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c
index 1db62db8469d..b2f096871a97 100644
--- a/drivers/rtc/rtc-mrst.c
+++ b/drivers/rtc/rtc-mrst.c
@@ -62,6 +62,17 @@ static inline int is_intr(u8 rtc_intr)
62 return rtc_intr & RTC_IRQMASK; 62 return rtc_intr & RTC_IRQMASK;
63} 63}
64 64
65static inline unsigned char vrtc_is_updating(void)
66{
67 unsigned char uip;
68 unsigned long flags;
69
70 spin_lock_irqsave(&rtc_lock, flags);
71 uip = (vrtc_cmos_read(RTC_FREQ_SELECT) & RTC_UIP);
72 spin_unlock_irqrestore(&rtc_lock, flags);
73 return uip;
74}
75
65/* 76/*
66 * rtc_time's year contains the increment over 1900, but vRTC's YEAR 77 * rtc_time's year contains the increment over 1900, but vRTC's YEAR
67 * register can't be programmed to value larger than 0x64, so vRTC 78 * register can't be programmed to value larger than 0x64, so vRTC
@@ -76,7 +87,7 @@ static int mrst_read_time(struct device *dev, struct rtc_time *time)
76{ 87{
77 unsigned long flags; 88 unsigned long flags;
78 89
79 if (rtc_is_updating()) 90 if (vrtc_is_updating())
80 mdelay(20); 91 mdelay(20);
81 92
82 spin_lock_irqsave(&rtc_lock, flags); 93 spin_lock_irqsave(&rtc_lock, flags);
@@ -236,25 +247,6 @@ static int mrst_set_alarm(struct device *dev, struct rtc_wkalrm *t)
236 return 0; 247 return 0;
237} 248}
238 249
239static int mrst_irq_set_state(struct device *dev, int enabled)
240{
241 struct mrst_rtc *mrst = dev_get_drvdata(dev);
242 unsigned long flags;
243
244 if (!mrst->irq)
245 return -ENXIO;
246
247 spin_lock_irqsave(&rtc_lock, flags);
248
249 if (enabled)
250 mrst_irq_enable(mrst, RTC_PIE);
251 else
252 mrst_irq_disable(mrst, RTC_PIE);
253
254 spin_unlock_irqrestore(&rtc_lock, flags);
255 return 0;
256}
257
258/* Currently, the vRTC doesn't support UIE ON/OFF */ 250/* Currently, the vRTC doesn't support UIE ON/OFF */
259static int mrst_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) 251static int mrst_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
260{ 252{
@@ -301,7 +293,6 @@ static const struct rtc_class_ops mrst_rtc_ops = {
301 .read_alarm = mrst_read_alarm, 293 .read_alarm = mrst_read_alarm,
302 .set_alarm = mrst_set_alarm, 294 .set_alarm = mrst_set_alarm,
303 .proc = mrst_procfs, 295 .proc = mrst_procfs,
304 .irq_set_state = mrst_irq_set_state,
305 .alarm_irq_enable = mrst_rtc_alarm_irq_enable, 296 .alarm_irq_enable = mrst_rtc_alarm_irq_enable,
306}; 297};
307 298
@@ -328,7 +319,7 @@ static irqreturn_t mrst_rtc_irq(int irq, void *p)
328 return IRQ_NONE; 319 return IRQ_NONE;
329} 320}
330 321
331static int __init 322static int __devinit
332vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, int rtc_irq) 323vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, int rtc_irq)
333{ 324{
334 int retval = 0; 325 int retval = 0;
@@ -351,6 +342,8 @@ vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, int rtc_irq)
351 342
352 mrst_rtc.irq = rtc_irq; 343 mrst_rtc.irq = rtc_irq;
353 mrst_rtc.iomem = iomem; 344 mrst_rtc.iomem = iomem;
345 mrst_rtc.dev = dev;
346 dev_set_drvdata(dev, &mrst_rtc);
354 347
355 mrst_rtc.rtc = rtc_device_register(driver_name, dev, 348 mrst_rtc.rtc = rtc_device_register(driver_name, dev,
356 &mrst_rtc_ops, THIS_MODULE); 349 &mrst_rtc_ops, THIS_MODULE);
@@ -359,8 +352,6 @@ vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, int rtc_irq)
359 goto cleanup0; 352 goto cleanup0;
360 } 353 }
361 354
362 mrst_rtc.dev = dev;
363 dev_set_drvdata(dev, &mrst_rtc);
364 rename_region(iomem, dev_name(&mrst_rtc.rtc->dev)); 355 rename_region(iomem, dev_name(&mrst_rtc.rtc->dev));
365 356
366 spin_lock_irq(&rtc_lock); 357 spin_lock_irq(&rtc_lock);
@@ -385,9 +376,10 @@ vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, int rtc_irq)
385 return 0; 376 return 0;
386 377
387cleanup1: 378cleanup1:
388 mrst_rtc.dev = NULL;
389 rtc_device_unregister(mrst_rtc.rtc); 379 rtc_device_unregister(mrst_rtc.rtc);
390cleanup0: 380cleanup0:
381 dev_set_drvdata(dev, NULL);
382 mrst_rtc.dev = NULL;
391 release_region(iomem->start, iomem->end + 1 - iomem->start); 383 release_region(iomem->start, iomem->end + 1 - iomem->start);
392 dev_err(dev, "rtc-mrst: unable to initialise\n"); 384 dev_err(dev, "rtc-mrst: unable to initialise\n");
393 return retval; 385 return retval;
@@ -400,7 +392,7 @@ static void rtc_mrst_do_shutdown(void)
400 spin_unlock_irq(&rtc_lock); 392 spin_unlock_irq(&rtc_lock);
401} 393}
402 394
403static void __exit rtc_mrst_do_remove(struct device *dev) 395static void __devexit rtc_mrst_do_remove(struct device *dev)
404{ 396{
405 struct mrst_rtc *mrst = dev_get_drvdata(dev); 397 struct mrst_rtc *mrst = dev_get_drvdata(dev);
406 struct resource *iomem; 398 struct resource *iomem;
@@ -509,14 +501,14 @@ static inline int mrst_poweroff(struct device *dev)
509 501
510#endif 502#endif
511 503
512static int __init vrtc_mrst_platform_probe(struct platform_device *pdev) 504static int __devinit vrtc_mrst_platform_probe(struct platform_device *pdev)
513{ 505{
514 return vrtc_mrst_do_probe(&pdev->dev, 506 return vrtc_mrst_do_probe(&pdev->dev,
515 platform_get_resource(pdev, IORESOURCE_MEM, 0), 507 platform_get_resource(pdev, IORESOURCE_MEM, 0),
516 platform_get_irq(pdev, 0)); 508 platform_get_irq(pdev, 0));
517} 509}
518 510
519static int __exit vrtc_mrst_platform_remove(struct platform_device *pdev) 511static int __devexit vrtc_mrst_platform_remove(struct platform_device *pdev)
520{ 512{
521 rtc_mrst_do_remove(&pdev->dev); 513 rtc_mrst_do_remove(&pdev->dev);
522 return 0; 514 return 0;
@@ -534,7 +526,7 @@ MODULE_ALIAS("platform:vrtc_mrst");
534 526
535static struct platform_driver vrtc_mrst_platform_driver = { 527static struct platform_driver vrtc_mrst_platform_driver = {
536 .probe = vrtc_mrst_platform_probe, 528 .probe = vrtc_mrst_platform_probe,
537 .remove = __exit_p(vrtc_mrst_platform_remove), 529 .remove = __devexit_p(vrtc_mrst_platform_remove),
538 .shutdown = vrtc_mrst_platform_shutdown, 530 .shutdown = vrtc_mrst_platform_shutdown,
539 .driver = { 531 .driver = {
540 .name = (char *) driver_name, 532 .name = (char *) driver_name,