diff options
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/hctosys.c | 4 | ||||
-rw-r--r-- | drivers/rtc/rtc-cmos.c | 16 | ||||
-rw-r--r-- | drivers/rtc/rtc-pcf2127.c | 3 |
3 files changed, 18 insertions, 5 deletions
diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c index e79f2a181ad2..b9ec4a16db1f 100644 --- a/drivers/rtc/hctosys.c +++ b/drivers/rtc/hctosys.c | |||
@@ -50,8 +50,10 @@ static int __init rtc_hctosys(void) | |||
50 | tv64.tv_sec = rtc_tm_to_time64(&tm); | 50 | tv64.tv_sec = rtc_tm_to_time64(&tm); |
51 | 51 | ||
52 | #if BITS_PER_LONG == 32 | 52 | #if BITS_PER_LONG == 32 |
53 | if (tv64.tv_sec > INT_MAX) | 53 | if (tv64.tv_sec > INT_MAX) { |
54 | err = -ERANGE; | ||
54 | goto err_read; | 55 | goto err_read; |
56 | } | ||
55 | #endif | 57 | #endif |
56 | 58 | ||
57 | err = do_settimeofday64(&tv64); | 59 | err = do_settimeofday64(&tv64); |
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) |
diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c index 9f99a0966550..7cb786d76e3c 100644 --- a/drivers/rtc/rtc-pcf2127.c +++ b/drivers/rtc/rtc-pcf2127.c | |||
@@ -303,6 +303,9 @@ static int pcf2127_i2c_gather_write(void *context, | |||
303 | memcpy(buf + 1, val, val_size); | 303 | memcpy(buf + 1, val, val_size); |
304 | 304 | ||
305 | ret = i2c_master_send(client, buf, val_size + 1); | 305 | ret = i2c_master_send(client, buf, val_size + 1); |
306 | |||
307 | kfree(buf); | ||
308 | |||
306 | if (ret != val_size + 1) | 309 | if (ret != val_size + 1) |
307 | return ret < 0 ? ret : -EIO; | 310 | return ret < 0 ? ret : -EIO; |
308 | 311 | ||