diff options
| -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 | ||
