diff options
Diffstat (limited to 'drivers/rtc/rtc-mrst.c')
-rw-r--r-- | drivers/rtc/rtc-mrst.c | 50 |
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 | ||
65 | static 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 | ||
239 | static 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 */ |
259 | static int mrst_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | 251 | static 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 | ||
331 | static int __init | 322 | static int __devinit |
332 | vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, int rtc_irq) | 323 | vrtc_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 | ||
387 | cleanup1: | 378 | cleanup1: |
388 | mrst_rtc.dev = NULL; | ||
389 | rtc_device_unregister(mrst_rtc.rtc); | 379 | rtc_device_unregister(mrst_rtc.rtc); |
390 | cleanup0: | 380 | cleanup0: |
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 | ||
403 | static void __exit rtc_mrst_do_remove(struct device *dev) | 395 | static 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 | ||
512 | static int __init vrtc_mrst_platform_probe(struct platform_device *pdev) | 504 | static 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 | ||
519 | static int __exit vrtc_mrst_platform_remove(struct platform_device *pdev) | 511 | static 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 | ||
535 | static struct platform_driver vrtc_mrst_platform_driver = { | 527 | static 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, |