diff options
Diffstat (limited to 'drivers/rtc/rtc-cmos.c')
-rw-r--r-- | drivers/rtc/rtc-cmos.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index df0c5776d49b..a5a19ff10535 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -257,6 +257,7 @@ static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
257 | struct cmos_rtc *cmos = dev_get_drvdata(dev); | 257 | struct cmos_rtc *cmos = dev_get_drvdata(dev); |
258 | unsigned char rtc_control; | 258 | unsigned char rtc_control; |
259 | 259 | ||
260 | /* This not only a rtc_op, but also called directly */ | ||
260 | if (!is_valid_irq(cmos->irq)) | 261 | if (!is_valid_irq(cmos->irq)) |
261 | return -EIO; | 262 | return -EIO; |
262 | 263 | ||
@@ -452,6 +453,7 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
452 | unsigned char mon, mday, hrs, min, sec, rtc_control; | 453 | unsigned char mon, mday, hrs, min, sec, rtc_control; |
453 | int ret; | 454 | int ret; |
454 | 455 | ||
456 | /* This not only a rtc_op, but also called directly */ | ||
455 | if (!is_valid_irq(cmos->irq)) | 457 | if (!is_valid_irq(cmos->irq)) |
456 | return -EIO; | 458 | return -EIO; |
457 | 459 | ||
@@ -516,9 +518,6 @@ static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
516 | struct cmos_rtc *cmos = dev_get_drvdata(dev); | 518 | struct cmos_rtc *cmos = dev_get_drvdata(dev); |
517 | unsigned long flags; | 519 | unsigned long flags; |
518 | 520 | ||
519 | if (!is_valid_irq(cmos->irq)) | ||
520 | return -EINVAL; | ||
521 | |||
522 | spin_lock_irqsave(&rtc_lock, flags); | 521 | spin_lock_irqsave(&rtc_lock, flags); |
523 | 522 | ||
524 | if (enabled) | 523 | if (enabled) |
@@ -579,6 +578,12 @@ static const struct rtc_class_ops cmos_rtc_ops = { | |||
579 | .alarm_irq_enable = cmos_alarm_irq_enable, | 578 | .alarm_irq_enable = cmos_alarm_irq_enable, |
580 | }; | 579 | }; |
581 | 580 | ||
581 | static const struct rtc_class_ops cmos_rtc_ops_no_alarm = { | ||
582 | .read_time = cmos_read_time, | ||
583 | .set_time = cmos_set_time, | ||
584 | .proc = cmos_procfs, | ||
585 | }; | ||
586 | |||
582 | /*----------------------------------------------------------------*/ | 587 | /*----------------------------------------------------------------*/ |
583 | 588 | ||
584 | /* | 589 | /* |
@@ -855,9 +860,12 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
855 | dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); | 860 | dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); |
856 | goto cleanup1; | 861 | goto cleanup1; |
857 | } | 862 | } |
863 | |||
864 | cmos_rtc.rtc->ops = &cmos_rtc_ops; | ||
865 | } else { | ||
866 | cmos_rtc.rtc->ops = &cmos_rtc_ops_no_alarm; | ||
858 | } | 867 | } |
859 | 868 | ||
860 | cmos_rtc.rtc->ops = &cmos_rtc_ops; | ||
861 | cmos_rtc.rtc->nvram_old_abi = true; | 869 | cmos_rtc.rtc->nvram_old_abi = true; |
862 | retval = rtc_register_device(cmos_rtc.rtc); | 870 | retval = rtc_register_device(cmos_rtc.rtc); |
863 | if (retval) | 871 | if (retval) |