diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/class.c | 8 | ||||
| -rw-r--r-- | drivers/rtc/interface.c | 8 | ||||
| -rw-r--r-- | drivers/rtc/rtc-ab3100.c | 55 | ||||
| -rw-r--r-- | drivers/rtc/rtc-cmos.c | 36 | ||||
| -rw-r--r-- | drivers/rtc/rtc-ds1305.c | 6 | ||||
| -rw-r--r-- | drivers/rtc/rtc-hid-sensor-time.c | 2 | ||||
| -rw-r--r-- | drivers/rtc/rtc-mc13xxx.c | 32 | ||||
| -rw-r--r-- | drivers/rtc/rtc-mrst.c | 16 | ||||
| -rw-r--r-- | drivers/rtc/rtc-mxc.c | 55 | ||||
| -rw-r--r-- | drivers/rtc/rtc-s5m.c | 60 | ||||
| -rw-r--r-- | drivers/rtc/rtc-tegra.c | 4 | ||||
| -rw-r--r-- | drivers/rtc/rtc-test.c | 19 | ||||
| -rw-r--r-- | drivers/rtc/systohc.c | 7 |
13 files changed, 127 insertions, 181 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c index 472a5adc4642..c29ba7e14304 100644 --- a/drivers/rtc/class.c +++ b/drivers/rtc/class.c | |||
| @@ -55,7 +55,7 @@ static int rtc_suspend(struct device *dev) | |||
| 55 | struct timespec64 delta, delta_delta; | 55 | struct timespec64 delta, delta_delta; |
| 56 | int err; | 56 | int err; |
| 57 | 57 | ||
| 58 | if (has_persistent_clock()) | 58 | if (timekeeping_rtc_skipsuspend()) |
| 59 | return 0; | 59 | return 0; |
| 60 | 60 | ||
| 61 | if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0) | 61 | if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0) |
| @@ -102,7 +102,7 @@ static int rtc_resume(struct device *dev) | |||
| 102 | struct timespec64 sleep_time; | 102 | struct timespec64 sleep_time; |
| 103 | int err; | 103 | int err; |
| 104 | 104 | ||
| 105 | if (has_persistent_clock()) | 105 | if (timekeeping_rtc_skipresume()) |
| 106 | return 0; | 106 | return 0; |
| 107 | 107 | ||
| 108 | rtc_hctosys_ret = -ENODEV; | 108 | rtc_hctosys_ret = -ENODEV; |
| @@ -117,10 +117,6 @@ static int rtc_resume(struct device *dev) | |||
| 117 | return 0; | 117 | return 0; |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | if (rtc_valid_tm(&tm) != 0) { | ||
| 121 | pr_debug("%s: bogus resume time\n", dev_name(&rtc->dev)); | ||
| 122 | return 0; | ||
| 123 | } | ||
| 124 | new_rtc.tv_sec = rtc_tm_to_time64(&tm); | 120 | new_rtc.tv_sec = rtc_tm_to_time64(&tm); |
| 125 | new_rtc.tv_nsec = 0; | 121 | new_rtc.tv_nsec = 0; |
| 126 | 122 | ||
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 37215cf983e9..d43ee409a5f2 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
| @@ -72,7 +72,11 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) | |||
| 72 | err = -ENODEV; | 72 | err = -ENODEV; |
| 73 | else if (rtc->ops->set_time) | 73 | else if (rtc->ops->set_time) |
| 74 | err = rtc->ops->set_time(rtc->dev.parent, tm); | 74 | err = rtc->ops->set_time(rtc->dev.parent, tm); |
| 75 | else if (rtc->ops->set_mmss) { | 75 | else if (rtc->ops->set_mmss64) { |
| 76 | time64_t secs64 = rtc_tm_to_time64(tm); | ||
| 77 | |||
| 78 | err = rtc->ops->set_mmss64(rtc->dev.parent, secs64); | ||
| 79 | } else if (rtc->ops->set_mmss) { | ||
| 76 | time64_t secs64 = rtc_tm_to_time64(tm); | 80 | time64_t secs64 = rtc_tm_to_time64(tm); |
| 77 | err = rtc->ops->set_mmss(rtc->dev.parent, secs64); | 81 | err = rtc->ops->set_mmss(rtc->dev.parent, secs64); |
| 78 | } else | 82 | } else |
| @@ -96,6 +100,8 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs) | |||
| 96 | 100 | ||
| 97 | if (!rtc->ops) | 101 | if (!rtc->ops) |
| 98 | err = -ENODEV; | 102 | err = -ENODEV; |
| 103 | else if (rtc->ops->set_mmss64) | ||
| 104 | err = rtc->ops->set_mmss64(rtc->dev.parent, secs); | ||
| 99 | else if (rtc->ops->set_mmss) | 105 | else if (rtc->ops->set_mmss) |
| 100 | err = rtc->ops->set_mmss(rtc->dev.parent, secs); | 106 | err = rtc->ops->set_mmss(rtc->dev.parent, secs); |
| 101 | else if (rtc->ops->read_time && rtc->ops->set_time) { | 107 | else if (rtc->ops->read_time && rtc->ops->set_time) { |
diff --git a/drivers/rtc/rtc-ab3100.c b/drivers/rtc/rtc-ab3100.c index 1d0340fdb820..9b725c553058 100644 --- a/drivers/rtc/rtc-ab3100.c +++ b/drivers/rtc/rtc-ab3100.c | |||
| @@ -43,21 +43,21 @@ | |||
| 43 | /* | 43 | /* |
| 44 | * RTC clock functions and device struct declaration | 44 | * RTC clock functions and device struct declaration |
| 45 | */ | 45 | */ |
| 46 | static int ab3100_rtc_set_mmss(struct device *dev, unsigned long secs) | 46 | static int ab3100_rtc_set_mmss(struct device *dev, time64_t secs) |
| 47 | { | 47 | { |
| 48 | u8 regs[] = {AB3100_TI0, AB3100_TI1, AB3100_TI2, | 48 | u8 regs[] = {AB3100_TI0, AB3100_TI1, AB3100_TI2, |
| 49 | AB3100_TI3, AB3100_TI4, AB3100_TI5}; | 49 | AB3100_TI3, AB3100_TI4, AB3100_TI5}; |
| 50 | unsigned char buf[6]; | 50 | unsigned char buf[6]; |
| 51 | u64 fat_time = (u64) secs * AB3100_RTC_CLOCK_RATE * 2; | 51 | u64 hw_counter = secs * AB3100_RTC_CLOCK_RATE * 2; |
| 52 | int err = 0; | 52 | int err = 0; |
| 53 | int i; | 53 | int i; |
| 54 | 54 | ||
| 55 | buf[0] = (fat_time) & 0xFF; | 55 | buf[0] = (hw_counter) & 0xFF; |
| 56 | buf[1] = (fat_time >> 8) & 0xFF; | 56 | buf[1] = (hw_counter >> 8) & 0xFF; |
| 57 | buf[2] = (fat_time >> 16) & 0xFF; | 57 | buf[2] = (hw_counter >> 16) & 0xFF; |
| 58 | buf[3] = (fat_time >> 24) & 0xFF; | 58 | buf[3] = (hw_counter >> 24) & 0xFF; |
| 59 | buf[4] = (fat_time >> 32) & 0xFF; | 59 | buf[4] = (hw_counter >> 32) & 0xFF; |
| 60 | buf[5] = (fat_time >> 40) & 0xFF; | 60 | buf[5] = (hw_counter >> 40) & 0xFF; |
| 61 | 61 | ||
| 62 | for (i = 0; i < 6; i++) { | 62 | for (i = 0; i < 6; i++) { |
| 63 | err = abx500_set_register_interruptible(dev, 0, | 63 | err = abx500_set_register_interruptible(dev, 0, |
| @@ -75,7 +75,7 @@ static int ab3100_rtc_set_mmss(struct device *dev, unsigned long secs) | |||
| 75 | 75 | ||
| 76 | static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm) | 76 | static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm) |
| 77 | { | 77 | { |
| 78 | unsigned long time; | 78 | time64_t time; |
| 79 | u8 rtcval; | 79 | u8 rtcval; |
| 80 | int err; | 80 | int err; |
| 81 | 81 | ||
| @@ -88,7 +88,7 @@ static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 88 | dev_info(dev, "clock not set (lost power)"); | 88 | dev_info(dev, "clock not set (lost power)"); |
| 89 | return -EINVAL; | 89 | return -EINVAL; |
| 90 | } else { | 90 | } else { |
| 91 | u64 fat_time; | 91 | u64 hw_counter; |
| 92 | u8 buf[6]; | 92 | u8 buf[6]; |
| 93 | 93 | ||
| 94 | /* Read out time registers */ | 94 | /* Read out time registers */ |
| @@ -98,22 +98,21 @@ static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 98 | if (err != 0) | 98 | if (err != 0) |
| 99 | return err; | 99 | return err; |
| 100 | 100 | ||
| 101 | fat_time = ((u64) buf[5] << 40) | ((u64) buf[4] << 32) | | 101 | hw_counter = ((u64) buf[5] << 40) | ((u64) buf[4] << 32) | |
| 102 | ((u64) buf[3] << 24) | ((u64) buf[2] << 16) | | 102 | ((u64) buf[3] << 24) | ((u64) buf[2] << 16) | |
| 103 | ((u64) buf[1] << 8) | (u64) buf[0]; | 103 | ((u64) buf[1] << 8) | (u64) buf[0]; |
| 104 | time = (unsigned long) (fat_time / | 104 | time = hw_counter / (u64) (AB3100_RTC_CLOCK_RATE * 2); |
| 105 | (u64) (AB3100_RTC_CLOCK_RATE * 2)); | ||
| 106 | } | 105 | } |
| 107 | 106 | ||
| 108 | rtc_time_to_tm(time, tm); | 107 | rtc_time64_to_tm(time, tm); |
| 109 | 108 | ||
| 110 | return rtc_valid_tm(tm); | 109 | return rtc_valid_tm(tm); |
| 111 | } | 110 | } |
| 112 | 111 | ||
| 113 | static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | 112 | static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) |
| 114 | { | 113 | { |
| 115 | unsigned long time; | 114 | time64_t time; |
| 116 | u64 fat_time; | 115 | u64 hw_counter; |
| 117 | u8 buf[6]; | 116 | u8 buf[6]; |
| 118 | u8 rtcval; | 117 | u8 rtcval; |
| 119 | int err; | 118 | int err; |
| @@ -134,11 +133,11 @@ static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
| 134 | AB3100_AL0, buf, 4); | 133 | AB3100_AL0, buf, 4); |
| 135 | if (err) | 134 | if (err) |
| 136 | return err; | 135 | return err; |
| 137 | fat_time = ((u64) buf[3] << 40) | ((u64) buf[2] << 32) | | 136 | hw_counter = ((u64) buf[3] << 40) | ((u64) buf[2] << 32) | |
| 138 | ((u64) buf[1] << 24) | ((u64) buf[0] << 16); | 137 | ((u64) buf[1] << 24) | ((u64) buf[0] << 16); |
| 139 | time = (unsigned long) (fat_time / (u64) (AB3100_RTC_CLOCK_RATE * 2)); | 138 | time = hw_counter / (u64) (AB3100_RTC_CLOCK_RATE * 2); |
| 140 | 139 | ||
| 141 | rtc_time_to_tm(time, &alarm->time); | 140 | rtc_time64_to_tm(time, &alarm->time); |
| 142 | 141 | ||
| 143 | return rtc_valid_tm(&alarm->time); | 142 | return rtc_valid_tm(&alarm->time); |
| 144 | } | 143 | } |
| @@ -147,17 +146,17 @@ static int ab3100_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
| 147 | { | 146 | { |
| 148 | u8 regs[] = {AB3100_AL0, AB3100_AL1, AB3100_AL2, AB3100_AL3}; | 147 | u8 regs[] = {AB3100_AL0, AB3100_AL1, AB3100_AL2, AB3100_AL3}; |
| 149 | unsigned char buf[4]; | 148 | unsigned char buf[4]; |
| 150 | unsigned long secs; | 149 | time64_t secs; |
| 151 | u64 fat_time; | 150 | u64 hw_counter; |
| 152 | int err; | 151 | int err; |
| 153 | int i; | 152 | int i; |
| 154 | 153 | ||
| 155 | rtc_tm_to_time(&alarm->time, &secs); | 154 | secs = rtc_tm_to_time64(&alarm->time); |
| 156 | fat_time = (u64) secs * AB3100_RTC_CLOCK_RATE * 2; | 155 | hw_counter = secs * AB3100_RTC_CLOCK_RATE * 2; |
| 157 | buf[0] = (fat_time >> 16) & 0xFF; | 156 | buf[0] = (hw_counter >> 16) & 0xFF; |
| 158 | buf[1] = (fat_time >> 24) & 0xFF; | 157 | buf[1] = (hw_counter >> 24) & 0xFF; |
| 159 | buf[2] = (fat_time >> 32) & 0xFF; | 158 | buf[2] = (hw_counter >> 32) & 0xFF; |
| 160 | buf[3] = (fat_time >> 40) & 0xFF; | 159 | buf[3] = (hw_counter >> 40) & 0xFF; |
| 161 | 160 | ||
| 162 | /* Set the alarm */ | 161 | /* Set the alarm */ |
| 163 | for (i = 0; i < 4; i++) { | 162 | for (i = 0; i < 4; i++) { |
| @@ -193,7 +192,7 @@ static int ab3100_rtc_irq_enable(struct device *dev, unsigned int enabled) | |||
| 193 | 192 | ||
| 194 | static const struct rtc_class_ops ab3100_rtc_ops = { | 193 | static const struct rtc_class_ops ab3100_rtc_ops = { |
| 195 | .read_time = ab3100_rtc_read_time, | 194 | .read_time = ab3100_rtc_read_time, |
| 196 | .set_mmss = ab3100_rtc_set_mmss, | 195 | .set_mmss64 = ab3100_rtc_set_mmss, |
| 197 | .read_alarm = ab3100_rtc_read_alarm, | 196 | .read_alarm = ab3100_rtc_read_alarm, |
| 198 | .set_alarm = ab3100_rtc_set_alarm, | 197 | .set_alarm = ab3100_rtc_set_alarm, |
| 199 | .alarm_irq_enable = ab3100_rtc_irq_enable, | 198 | .alarm_irq_enable = ab3100_rtc_irq_enable, |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 5b2e76159b41..87647f459198 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
| @@ -459,23 +459,25 @@ static int cmos_procfs(struct device *dev, struct seq_file *seq) | |||
| 459 | /* NOTE: at least ICH6 reports battery status using a different | 459 | /* NOTE: at least ICH6 reports battery status using a different |
| 460 | * (non-RTC) bit; and SQWE is ignored on many current systems. | 460 | * (non-RTC) bit; and SQWE is ignored on many current systems. |
| 461 | */ | 461 | */ |
| 462 | return seq_printf(seq, | 462 | seq_printf(seq, |
| 463 | "periodic_IRQ\t: %s\n" | 463 | "periodic_IRQ\t: %s\n" |
| 464 | "update_IRQ\t: %s\n" | 464 | "update_IRQ\t: %s\n" |
| 465 | "HPET_emulated\t: %s\n" | 465 | "HPET_emulated\t: %s\n" |
| 466 | // "square_wave\t: %s\n" | 466 | // "square_wave\t: %s\n" |
| 467 | "BCD\t\t: %s\n" | 467 | "BCD\t\t: %s\n" |
| 468 | "DST_enable\t: %s\n" | 468 | "DST_enable\t: %s\n" |
| 469 | "periodic_freq\t: %d\n" | 469 | "periodic_freq\t: %d\n" |
| 470 | "batt_status\t: %s\n", | 470 | "batt_status\t: %s\n", |
| 471 | (rtc_control & RTC_PIE) ? "yes" : "no", | 471 | (rtc_control & RTC_PIE) ? "yes" : "no", |
| 472 | (rtc_control & RTC_UIE) ? "yes" : "no", | 472 | (rtc_control & RTC_UIE) ? "yes" : "no", |
| 473 | is_hpet_enabled() ? "yes" : "no", | 473 | is_hpet_enabled() ? "yes" : "no", |
| 474 | // (rtc_control & RTC_SQWE) ? "yes" : "no", | 474 | // (rtc_control & RTC_SQWE) ? "yes" : "no", |
| 475 | (rtc_control & RTC_DM_BINARY) ? "no" : "yes", | 475 | (rtc_control & RTC_DM_BINARY) ? "no" : "yes", |
| 476 | (rtc_control & RTC_DST_EN) ? "yes" : "no", | 476 | (rtc_control & RTC_DST_EN) ? "yes" : "no", |
| 477 | cmos->rtc->irq_freq, | 477 | cmos->rtc->irq_freq, |
| 478 | (valid & RTC_VRT) ? "okay" : "dead"); | 478 | (valid & RTC_VRT) ? "okay" : "dead"); |
| 479 | |||
| 480 | return 0; | ||
| 479 | } | 481 | } |
| 480 | 482 | ||
| 481 | #else | 483 | #else |
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index 129add77065d..12b07158a366 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c | |||
| @@ -434,9 +434,9 @@ static int ds1305_proc(struct device *dev, struct seq_file *seq) | |||
| 434 | } | 434 | } |
| 435 | 435 | ||
| 436 | done: | 436 | done: |
| 437 | return seq_printf(seq, | 437 | seq_printf(seq, "trickle_charge\t: %s%s\n", diodes, resistors); |
| 438 | "trickle_charge\t: %s%s\n", | 438 | |
| 439 | diodes, resistors); | 439 | return 0; |
| 440 | } | 440 | } |
| 441 | 441 | ||
| 442 | #else | 442 | #else |
diff --git a/drivers/rtc/rtc-hid-sensor-time.c b/drivers/rtc/rtc-hid-sensor-time.c index ae7c2ba440cf..af4f85a66b39 100644 --- a/drivers/rtc/rtc-hid-sensor-time.c +++ b/drivers/rtc/rtc-hid-sensor-time.c | |||
| @@ -213,7 +213,7 @@ static int hid_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 213 | /* get a report with all values through requesting one value */ | 213 | /* get a report with all values through requesting one value */ |
| 214 | sensor_hub_input_attr_get_raw_value(time_state->common_attributes.hsdev, | 214 | sensor_hub_input_attr_get_raw_value(time_state->common_attributes.hsdev, |
| 215 | HID_USAGE_SENSOR_TIME, hid_time_addresses[0], | 215 | HID_USAGE_SENSOR_TIME, hid_time_addresses[0], |
| 216 | time_state->info[0].report_id); | 216 | time_state->info[0].report_id, SENSOR_HUB_SYNC); |
| 217 | /* wait for all values (event) */ | 217 | /* wait for all values (event) */ |
| 218 | ret = wait_for_completion_killable_timeout( | 218 | ret = wait_for_completion_killable_timeout( |
| 219 | &time_state->comp_last_time, HZ*6); | 219 | &time_state->comp_last_time, HZ*6); |
diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c index 5bce904b7ee6..32df1d812367 100644 --- a/drivers/rtc/rtc-mc13xxx.c +++ b/drivers/rtc/rtc-mc13xxx.c | |||
| @@ -83,20 +83,19 @@ static int mc13xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 83 | return ret; | 83 | return ret; |
| 84 | } while (days1 != days2); | 84 | } while (days1 != days2); |
| 85 | 85 | ||
| 86 | rtc_time_to_tm(days1 * SEC_PER_DAY + seconds, tm); | 86 | rtc_time64_to_tm((time64_t)days1 * SEC_PER_DAY + seconds, tm); |
| 87 | 87 | ||
| 88 | return rtc_valid_tm(tm); | 88 | return rtc_valid_tm(tm); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs) | 91 | static int mc13xxx_rtc_set_mmss(struct device *dev, time64_t secs) |
| 92 | { | 92 | { |
| 93 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); | 93 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); |
| 94 | unsigned int seconds, days; | 94 | unsigned int seconds, days; |
| 95 | unsigned int alarmseconds; | 95 | unsigned int alarmseconds; |
| 96 | int ret; | 96 | int ret; |
| 97 | 97 | ||
| 98 | seconds = secs % SEC_PER_DAY; | 98 | days = div_s64_rem(secs, SEC_PER_DAY, &seconds); |
| 99 | days = secs / SEC_PER_DAY; | ||
| 100 | 99 | ||
| 101 | mc13xxx_lock(priv->mc13xxx); | 100 | mc13xxx_lock(priv->mc13xxx); |
| 102 | 101 | ||
| @@ -159,7 +158,7 @@ static int mc13xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
| 159 | { | 158 | { |
| 160 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); | 159 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); |
| 161 | unsigned seconds, days; | 160 | unsigned seconds, days; |
| 162 | unsigned long s1970; | 161 | time64_t s1970; |
| 163 | int enabled, pending; | 162 | int enabled, pending; |
| 164 | int ret; | 163 | int ret; |
| 165 | 164 | ||
| @@ -189,10 +188,10 @@ out: | |||
| 189 | alarm->enabled = enabled; | 188 | alarm->enabled = enabled; |
| 190 | alarm->pending = pending; | 189 | alarm->pending = pending; |
| 191 | 190 | ||
| 192 | s1970 = days * SEC_PER_DAY + seconds; | 191 | s1970 = (time64_t)days * SEC_PER_DAY + seconds; |
| 193 | 192 | ||
| 194 | rtc_time_to_tm(s1970, &alarm->time); | 193 | rtc_time64_to_tm(s1970, &alarm->time); |
| 195 | dev_dbg(dev, "%s: %lu\n", __func__, s1970); | 194 | dev_dbg(dev, "%s: %lld\n", __func__, (long long)s1970); |
| 196 | 195 | ||
| 197 | return 0; | 196 | return 0; |
| 198 | } | 197 | } |
| @@ -200,8 +199,8 @@ out: | |||
| 200 | static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | 199 | static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) |
| 201 | { | 200 | { |
| 202 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); | 201 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); |
| 203 | unsigned long s1970; | 202 | time64_t s1970; |
| 204 | unsigned seconds, days; | 203 | u32 seconds, days; |
| 205 | int ret; | 204 | int ret; |
| 206 | 205 | ||
| 207 | mc13xxx_lock(priv->mc13xxx); | 206 | mc13xxx_lock(priv->mc13xxx); |
| @@ -215,20 +214,17 @@ static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
| 215 | if (unlikely(ret)) | 214 | if (unlikely(ret)) |
| 216 | goto out; | 215 | goto out; |
| 217 | 216 | ||
| 218 | ret = rtc_tm_to_time(&alarm->time, &s1970); | 217 | s1970 = rtc_tm_to_time64(&alarm->time); |
| 219 | if (unlikely(ret)) | ||
| 220 | goto out; | ||
| 221 | 218 | ||
| 222 | dev_dbg(dev, "%s: o%2.s %lu\n", __func__, alarm->enabled ? "n" : "ff", | 219 | dev_dbg(dev, "%s: o%2.s %lld\n", __func__, alarm->enabled ? "n" : "ff", |
| 223 | s1970); | 220 | (long long)s1970); |
| 224 | 221 | ||
| 225 | ret = mc13xxx_rtc_irq_enable_unlocked(dev, alarm->enabled, | 222 | ret = mc13xxx_rtc_irq_enable_unlocked(dev, alarm->enabled, |
| 226 | MC13XXX_IRQ_TODA); | 223 | MC13XXX_IRQ_TODA); |
| 227 | if (unlikely(ret)) | 224 | if (unlikely(ret)) |
| 228 | goto out; | 225 | goto out; |
| 229 | 226 | ||
| 230 | seconds = s1970 % SEC_PER_DAY; | 227 | days = div_s64_rem(s1970, SEC_PER_DAY, &seconds); |
| 231 | days = s1970 / SEC_PER_DAY; | ||
| 232 | 228 | ||
| 233 | ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days); | 229 | ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days); |
| 234 | if (unlikely(ret)) | 230 | if (unlikely(ret)) |
| @@ -268,7 +264,7 @@ static irqreturn_t mc13xxx_rtc_update_handler(int irq, void *dev) | |||
| 268 | 264 | ||
| 269 | static const struct rtc_class_ops mc13xxx_rtc_ops = { | 265 | static const struct rtc_class_ops mc13xxx_rtc_ops = { |
| 270 | .read_time = mc13xxx_rtc_read_time, | 266 | .read_time = mc13xxx_rtc_read_time, |
| 271 | .set_mmss = mc13xxx_rtc_set_mmss, | 267 | .set_mmss64 = mc13xxx_rtc_set_mmss, |
| 272 | .read_alarm = mc13xxx_rtc_read_alarm, | 268 | .read_alarm = mc13xxx_rtc_read_alarm, |
| 273 | .set_alarm = mc13xxx_rtc_set_alarm, | 269 | .set_alarm = mc13xxx_rtc_set_alarm, |
| 274 | .alarm_irq_enable = mc13xxx_rtc_alarm_irq_enable, | 270 | .alarm_irq_enable = mc13xxx_rtc_alarm_irq_enable, |
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c index 3a6fd3a8a2ec..548ea6f6f384 100644 --- a/drivers/rtc/rtc-mrst.c +++ b/drivers/rtc/rtc-mrst.c | |||
| @@ -277,13 +277,15 @@ static int mrst_procfs(struct device *dev, struct seq_file *seq) | |||
| 277 | valid = vrtc_cmos_read(RTC_VALID); | 277 | valid = vrtc_cmos_read(RTC_VALID); |
| 278 | spin_unlock_irq(&rtc_lock); | 278 | spin_unlock_irq(&rtc_lock); |
| 279 | 279 | ||
| 280 | return seq_printf(seq, | 280 | seq_printf(seq, |
| 281 | "periodic_IRQ\t: %s\n" | 281 | "periodic_IRQ\t: %s\n" |
| 282 | "alarm\t\t: %s\n" | 282 | "alarm\t\t: %s\n" |
| 283 | "BCD\t\t: no\n" | 283 | "BCD\t\t: no\n" |
| 284 | "periodic_freq\t: daily (not adjustable)\n", | 284 | "periodic_freq\t: daily (not adjustable)\n", |
| 285 | (rtc_control & RTC_PIE) ? "on" : "off", | 285 | (rtc_control & RTC_PIE) ? "on" : "off", |
| 286 | (rtc_control & RTC_AIE) ? "on" : "off"); | 286 | (rtc_control & RTC_AIE) ? "on" : "off"); |
| 287 | |||
| 288 | return 0; | ||
| 287 | } | 289 | } |
| 288 | 290 | ||
| 289 | #else | 291 | #else |
diff --git a/drivers/rtc/rtc-mxc.c b/drivers/rtc/rtc-mxc.c index 3c3f8d10ab43..09d422b9f7f7 100644 --- a/drivers/rtc/rtc-mxc.c +++ b/drivers/rtc/rtc-mxc.c | |||
| @@ -106,7 +106,7 @@ static inline int is_imx1_rtc(struct rtc_plat_data *data) | |||
| 106 | * This function is used to obtain the RTC time or the alarm value in | 106 | * This function is used to obtain the RTC time or the alarm value in |
| 107 | * second. | 107 | * second. |
| 108 | */ | 108 | */ |
| 109 | static u32 get_alarm_or_time(struct device *dev, int time_alarm) | 109 | static time64_t get_alarm_or_time(struct device *dev, int time_alarm) |
| 110 | { | 110 | { |
| 111 | struct platform_device *pdev = to_platform_device(dev); | 111 | struct platform_device *pdev = to_platform_device(dev); |
| 112 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 112 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
| @@ -129,29 +129,28 @@ static u32 get_alarm_or_time(struct device *dev, int time_alarm) | |||
| 129 | hr = hr_min >> 8; | 129 | hr = hr_min >> 8; |
| 130 | min = hr_min & 0xff; | 130 | min = hr_min & 0xff; |
| 131 | 131 | ||
| 132 | return (((day * 24 + hr) * 60) + min) * 60 + sec; | 132 | return ((((time64_t)day * 24 + hr) * 60) + min) * 60 + sec; |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | /* | 135 | /* |
| 136 | * This function sets the RTC alarm value or the time value. | 136 | * This function sets the RTC alarm value or the time value. |
| 137 | */ | 137 | */ |
| 138 | static void set_alarm_or_time(struct device *dev, int time_alarm, u32 time) | 138 | static void set_alarm_or_time(struct device *dev, int time_alarm, time64_t time) |
| 139 | { | 139 | { |
| 140 | u32 day, hr, min, sec, temp; | 140 | u32 tod, day, hr, min, sec, temp; |
| 141 | struct platform_device *pdev = to_platform_device(dev); | 141 | struct platform_device *pdev = to_platform_device(dev); |
| 142 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 142 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
| 143 | void __iomem *ioaddr = pdata->ioaddr; | 143 | void __iomem *ioaddr = pdata->ioaddr; |
| 144 | 144 | ||
| 145 | day = time / 86400; | 145 | day = div_s64_rem(time, 86400, &tod); |
| 146 | time -= day * 86400; | ||
| 147 | 146 | ||
| 148 | /* time is within a day now */ | 147 | /* time is within a day now */ |
| 149 | hr = time / 3600; | 148 | hr = tod / 3600; |
| 150 | time -= hr * 3600; | 149 | tod -= hr * 3600; |
| 151 | 150 | ||
| 152 | /* time is within an hour now */ | 151 | /* time is within an hour now */ |
| 153 | min = time / 60; | 152 | min = tod / 60; |
| 154 | sec = time - min * 60; | 153 | sec = tod - min * 60; |
| 155 | 154 | ||
| 156 | temp = (hr << 8) + min; | 155 | temp = (hr << 8) + min; |
| 157 | 156 | ||
| @@ -173,29 +172,18 @@ static void set_alarm_or_time(struct device *dev, int time_alarm, u32 time) | |||
| 173 | * This function updates the RTC alarm registers and then clears all the | 172 | * This function updates the RTC alarm registers and then clears all the |
| 174 | * interrupt status bits. | 173 | * interrupt status bits. |
| 175 | */ | 174 | */ |
| 176 | static int rtc_update_alarm(struct device *dev, struct rtc_time *alrm) | 175 | static void rtc_update_alarm(struct device *dev, struct rtc_time *alrm) |
| 177 | { | 176 | { |
| 178 | struct rtc_time alarm_tm, now_tm; | 177 | time64_t time; |
| 179 | unsigned long now, time; | ||
| 180 | struct platform_device *pdev = to_platform_device(dev); | 178 | struct platform_device *pdev = to_platform_device(dev); |
| 181 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 179 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
| 182 | void __iomem *ioaddr = pdata->ioaddr; | 180 | void __iomem *ioaddr = pdata->ioaddr; |
| 183 | 181 | ||
| 184 | now = get_alarm_or_time(dev, MXC_RTC_TIME); | 182 | time = rtc_tm_to_time64(alrm); |
| 185 | rtc_time_to_tm(now, &now_tm); | ||
| 186 | alarm_tm.tm_year = now_tm.tm_year; | ||
| 187 | alarm_tm.tm_mon = now_tm.tm_mon; | ||
| 188 | alarm_tm.tm_mday = now_tm.tm_mday; | ||
| 189 | alarm_tm.tm_hour = alrm->tm_hour; | ||
| 190 | alarm_tm.tm_min = alrm->tm_min; | ||
| 191 | alarm_tm.tm_sec = alrm->tm_sec; | ||
| 192 | rtc_tm_to_time(&alarm_tm, &time); | ||
| 193 | 183 | ||
| 194 | /* clear all the interrupt status bits */ | 184 | /* clear all the interrupt status bits */ |
| 195 | writew(readw(ioaddr + RTC_RTCISR), ioaddr + RTC_RTCISR); | 185 | writew(readw(ioaddr + RTC_RTCISR), ioaddr + RTC_RTCISR); |
| 196 | set_alarm_or_time(dev, MXC_RTC_ALARM, time); | 186 | set_alarm_or_time(dev, MXC_RTC_ALARM, time); |
| 197 | |||
| 198 | return 0; | ||
| 199 | } | 187 | } |
| 200 | 188 | ||
| 201 | static void mxc_rtc_irq_enable(struct device *dev, unsigned int bit, | 189 | static void mxc_rtc_irq_enable(struct device *dev, unsigned int bit, |
| @@ -283,14 +271,14 @@ static int mxc_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
| 283 | */ | 271 | */ |
| 284 | static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm) | 272 | static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm) |
| 285 | { | 273 | { |
| 286 | u32 val; | 274 | time64_t val; |
| 287 | 275 | ||
| 288 | /* Avoid roll-over from reading the different registers */ | 276 | /* Avoid roll-over from reading the different registers */ |
| 289 | do { | 277 | do { |
| 290 | val = get_alarm_or_time(dev, MXC_RTC_TIME); | 278 | val = get_alarm_or_time(dev, MXC_RTC_TIME); |
| 291 | } while (val != get_alarm_or_time(dev, MXC_RTC_TIME)); | 279 | } while (val != get_alarm_or_time(dev, MXC_RTC_TIME)); |
| 292 | 280 | ||
| 293 | rtc_time_to_tm(val, tm); | 281 | rtc_time64_to_tm(val, tm); |
| 294 | 282 | ||
| 295 | return 0; | 283 | return 0; |
| 296 | } | 284 | } |
| @@ -298,7 +286,7 @@ static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
| 298 | /* | 286 | /* |
| 299 | * This function sets the internal RTC time based on tm in Gregorian date. | 287 | * This function sets the internal RTC time based on tm in Gregorian date. |
| 300 | */ | 288 | */ |
| 301 | static int mxc_rtc_set_mmss(struct device *dev, unsigned long time) | 289 | static int mxc_rtc_set_mmss(struct device *dev, time64_t time) |
| 302 | { | 290 | { |
| 303 | struct platform_device *pdev = to_platform_device(dev); | 291 | struct platform_device *pdev = to_platform_device(dev); |
| 304 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 292 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
| @@ -309,9 +297,9 @@ static int mxc_rtc_set_mmss(struct device *dev, unsigned long time) | |||
| 309 | if (is_imx1_rtc(pdata)) { | 297 | if (is_imx1_rtc(pdata)) { |
| 310 | struct rtc_time tm; | 298 | struct rtc_time tm; |
| 311 | 299 | ||
| 312 | rtc_time_to_tm(time, &tm); | 300 | rtc_time64_to_tm(time, &tm); |
| 313 | tm.tm_year = 70; | 301 | tm.tm_year = 70; |
| 314 | rtc_tm_to_time(&tm, &time); | 302 | time = rtc_tm_to_time64(&tm); |
| 315 | } | 303 | } |
| 316 | 304 | ||
| 317 | /* Avoid roll-over from reading the different registers */ | 305 | /* Avoid roll-over from reading the different registers */ |
| @@ -333,7 +321,7 @@ static int mxc_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 333 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 321 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
| 334 | void __iomem *ioaddr = pdata->ioaddr; | 322 | void __iomem *ioaddr = pdata->ioaddr; |
| 335 | 323 | ||
| 336 | rtc_time_to_tm(get_alarm_or_time(dev, MXC_RTC_ALARM), &alrm->time); | 324 | rtc_time64_to_tm(get_alarm_or_time(dev, MXC_RTC_ALARM), &alrm->time); |
| 337 | alrm->pending = ((readw(ioaddr + RTC_RTCISR) & RTC_ALM_BIT)) ? 1 : 0; | 325 | alrm->pending = ((readw(ioaddr + RTC_RTCISR) & RTC_ALM_BIT)) ? 1 : 0; |
| 338 | 326 | ||
| 339 | return 0; | 327 | return 0; |
| @@ -346,11 +334,8 @@ static int mxc_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 346 | { | 334 | { |
| 347 | struct platform_device *pdev = to_platform_device(dev); | 335 | struct platform_device *pdev = to_platform_device(dev); |
| 348 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); | 336 | struct rtc_plat_data *pdata = platform_get_drvdata(pdev); |
| 349 | int ret; | ||
| 350 | 337 | ||
| 351 | ret = rtc_update_alarm(dev, &alrm->time); | 338 | rtc_update_alarm(dev, &alrm->time); |
| 352 | if (ret) | ||
| 353 | return ret; | ||
| 354 | 339 | ||
| 355 | memcpy(&pdata->g_rtc_alarm, &alrm->time, sizeof(struct rtc_time)); | 340 | memcpy(&pdata->g_rtc_alarm, &alrm->time, sizeof(struct rtc_time)); |
| 356 | mxc_rtc_irq_enable(dev, RTC_ALM_BIT, alrm->enabled); | 341 | mxc_rtc_irq_enable(dev, RTC_ALM_BIT, alrm->enabled); |
| @@ -362,7 +347,7 @@ static int mxc_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
| 362 | static struct rtc_class_ops mxc_rtc_ops = { | 347 | static struct rtc_class_ops mxc_rtc_ops = { |
| 363 | .release = mxc_rtc_release, | 348 | .release = mxc_rtc_release, |
| 364 | .read_time = mxc_rtc_read_time, | 349 | .read_time = mxc_rtc_read_time, |
| 365 | .set_mmss = mxc_rtc_set_mmss, | 350 | .set_mmss64 = mxc_rtc_set_mmss, |
| 366 | .read_alarm = mxc_rtc_read_alarm, | 351 | .read_alarm = mxc_rtc_read_alarm, |
| 367 | .set_alarm = mxc_rtc_set_alarm, | 352 | .set_alarm = mxc_rtc_set_alarm, |
| 368 | .alarm_irq_enable = mxc_rtc_alarm_irq_enable, | 353 | .alarm_irq_enable = mxc_rtc_alarm_irq_enable, |
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c index 89ac1d5083c6..4008b84246ca 100644 --- a/drivers/rtc/rtc-s5m.c +++ b/drivers/rtc/rtc-s5m.c | |||
| @@ -48,8 +48,6 @@ struct s5m_rtc_reg_config { | |||
| 48 | unsigned int alarm0; | 48 | unsigned int alarm0; |
| 49 | /* First register for alarm 1, seconds */ | 49 | /* First register for alarm 1, seconds */ |
| 50 | unsigned int alarm1; | 50 | unsigned int alarm1; |
| 51 | /* SMPL/WTSR register */ | ||
| 52 | unsigned int smpl_wtsr; | ||
| 53 | /* | 51 | /* |
| 54 | * Register for update flag (UDR). Typically setting UDR field to 1 | 52 | * Register for update flag (UDR). Typically setting UDR field to 1 |
| 55 | * will enable update of time or alarm register. Then it will be | 53 | * will enable update of time or alarm register. Then it will be |
| @@ -67,7 +65,6 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = { | |||
| 67 | .ctrl = S5M_ALARM1_CONF, | 65 | .ctrl = S5M_ALARM1_CONF, |
| 68 | .alarm0 = S5M_ALARM0_SEC, | 66 | .alarm0 = S5M_ALARM0_SEC, |
| 69 | .alarm1 = S5M_ALARM1_SEC, | 67 | .alarm1 = S5M_ALARM1_SEC, |
| 70 | .smpl_wtsr = S5M_WTSR_SMPL_CNTL, | ||
| 71 | .rtc_udr_update = S5M_RTC_UDR_CON, | 68 | .rtc_udr_update = S5M_RTC_UDR_CON, |
| 72 | .rtc_udr_mask = S5M_RTC_UDR_MASK, | 69 | .rtc_udr_mask = S5M_RTC_UDR_MASK, |
| 73 | }; | 70 | }; |
| @@ -82,7 +79,6 @@ static const struct s5m_rtc_reg_config s2mps_rtc_regs = { | |||
| 82 | .ctrl = S2MPS_RTC_CTRL, | 79 | .ctrl = S2MPS_RTC_CTRL, |
| 83 | .alarm0 = S2MPS_ALARM0_SEC, | 80 | .alarm0 = S2MPS_ALARM0_SEC, |
| 84 | .alarm1 = S2MPS_ALARM1_SEC, | 81 | .alarm1 = S2MPS_ALARM1_SEC, |
| 85 | .smpl_wtsr = S2MPS_WTSR_SMPL_CNTL, | ||
| 86 | .rtc_udr_update = S2MPS_RTC_UDR_CON, | 82 | .rtc_udr_update = S2MPS_RTC_UDR_CON, |
| 87 | .rtc_udr_mask = S2MPS_RTC_WUDR_MASK, | 83 | .rtc_udr_mask = S2MPS_RTC_WUDR_MASK, |
| 88 | }; | 84 | }; |
| @@ -96,7 +92,6 @@ struct s5m_rtc_info { | |||
| 96 | int irq; | 92 | int irq; |
| 97 | int device_type; | 93 | int device_type; |
| 98 | int rtc_24hr_mode; | 94 | int rtc_24hr_mode; |
| 99 | bool wtsr_smpl; | ||
| 100 | const struct s5m_rtc_reg_config *regs; | 95 | const struct s5m_rtc_reg_config *regs; |
| 101 | }; | 96 | }; |
| 102 | 97 | ||
| @@ -597,28 +592,6 @@ static const struct rtc_class_ops s5m_rtc_ops = { | |||
| 597 | .alarm_irq_enable = s5m_rtc_alarm_irq_enable, | 592 | .alarm_irq_enable = s5m_rtc_alarm_irq_enable, |
| 598 | }; | 593 | }; |
| 599 | 594 | ||
| 600 | static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable) | ||
| 601 | { | ||
| 602 | int ret; | ||
| 603 | ret = regmap_update_bits(info->regmap, info->regs->smpl_wtsr, | ||
| 604 | WTSR_ENABLE_MASK, | ||
| 605 | enable ? WTSR_ENABLE_MASK : 0); | ||
| 606 | if (ret < 0) | ||
| 607 | dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n", | ||
| 608 | __func__, ret); | ||
| 609 | } | ||
| 610 | |||
| 611 | static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable) | ||
| 612 | { | ||
| 613 | int ret; | ||
| 614 | ret = regmap_update_bits(info->regmap, info->regs->smpl_wtsr, | ||
| 615 | SMPL_ENABLE_MASK, | ||
| 616 | enable ? SMPL_ENABLE_MASK : 0); | ||
| 617 | if (ret < 0) | ||
| 618 | dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n", | ||
| 619 | __func__, ret); | ||
| 620 | } | ||
| 621 | |||
| 622 | static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info) | 595 | static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info) |
| 623 | { | 596 | { |
| 624 | u8 data[2]; | 597 | u8 data[2]; |
| @@ -715,7 +688,6 @@ static int s5m_rtc_probe(struct platform_device *pdev) | |||
| 715 | info->dev = &pdev->dev; | 688 | info->dev = &pdev->dev; |
| 716 | info->s5m87xx = s5m87xx; | 689 | info->s5m87xx = s5m87xx; |
| 717 | info->device_type = s5m87xx->device_type; | 690 | info->device_type = s5m87xx->device_type; |
| 718 | info->wtsr_smpl = s5m87xx->wtsr_smpl; | ||
| 719 | 691 | ||
| 720 | if (s5m87xx->irq_data) { | 692 | if (s5m87xx->irq_data) { |
| 721 | info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); | 693 | info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); |
| @@ -731,11 +703,6 @@ static int s5m_rtc_probe(struct platform_device *pdev) | |||
| 731 | 703 | ||
| 732 | ret = s5m8767_rtc_init_reg(info); | 704 | ret = s5m8767_rtc_init_reg(info); |
| 733 | 705 | ||
| 734 | if (info->wtsr_smpl) { | ||
| 735 | s5m_rtc_enable_wtsr(info, true); | ||
| 736 | s5m_rtc_enable_smpl(info, true); | ||
| 737 | } | ||
| 738 | |||
| 739 | device_init_wakeup(&pdev->dev, 1); | 706 | device_init_wakeup(&pdev->dev, 1); |
| 740 | 707 | ||
| 741 | info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc", | 708 | info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc", |
| @@ -768,36 +735,10 @@ err: | |||
| 768 | return ret; | 735 | return ret; |
| 769 | } | 736 | } |
| 770 | 737 | ||
| 771 | static void s5m_rtc_shutdown(struct platform_device *pdev) | ||
| 772 | { | ||
| 773 | struct s5m_rtc_info *info = platform_get_drvdata(pdev); | ||
| 774 | int i; | ||
| 775 | unsigned int val = 0; | ||
| 776 | if (info->wtsr_smpl) { | ||
| 777 | for (i = 0; i < 3; i++) { | ||
| 778 | s5m_rtc_enable_wtsr(info, false); | ||
| 779 | regmap_read(info->regmap, info->regs->smpl_wtsr, &val); | ||
| 780 | pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val); | ||
| 781 | if (val & WTSR_ENABLE_MASK) | ||
| 782 | pr_emerg("%s: fail to disable WTSR\n", | ||
| 783 | __func__); | ||
| 784 | else { | ||
| 785 | pr_info("%s: success to disable WTSR\n", | ||
| 786 | __func__); | ||
| 787 | break; | ||
| 788 | } | ||
| 789 | } | ||
| 790 | } | ||
| 791 | /* Disable SMPL when power off */ | ||
| 792 | s5m_rtc_enable_smpl(info, false); | ||
| 793 | } | ||
| 794 | |||
| 795 | static int s5m_rtc_remove(struct platform_device *pdev) | 738 | static int s5m_rtc_remove(struct platform_device *pdev) |
| 796 | { | 739 | { |
| 797 | struct s5m_rtc_info *info = platform_get_drvdata(pdev); | 740 | struct s5m_rtc_info *info = platform_get_drvdata(pdev); |
| 798 | 741 | ||
| 799 | /* Perform also all shutdown steps when removing */ | ||
| 800 | s5m_rtc_shutdown(pdev); | ||
| 801 | i2c_unregister_device(info->i2c); | 742 | i2c_unregister_device(info->i2c); |
| 802 | 743 | ||
| 803 | return 0; | 744 | return 0; |
| @@ -842,7 +783,6 @@ static struct platform_driver s5m_rtc_driver = { | |||
| 842 | }, | 783 | }, |
| 843 | .probe = s5m_rtc_probe, | 784 | .probe = s5m_rtc_probe, |
| 844 | .remove = s5m_rtc_remove, | 785 | .remove = s5m_rtc_remove, |
| 845 | .shutdown = s5m_rtc_shutdown, | ||
| 846 | .id_table = s5m_rtc_id, | 786 | .id_table = s5m_rtc_id, |
| 847 | }; | 787 | }; |
| 848 | 788 | ||
diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c index d948277057d8..60232bd366ef 100644 --- a/drivers/rtc/rtc-tegra.c +++ b/drivers/rtc/rtc-tegra.c | |||
| @@ -261,7 +261,9 @@ static int tegra_rtc_proc(struct device *dev, struct seq_file *seq) | |||
| 261 | if (!dev || !dev->driver) | 261 | if (!dev || !dev->driver) |
| 262 | return 0; | 262 | return 0; |
| 263 | 263 | ||
| 264 | return seq_printf(seq, "name\t\t: %s\n", dev_name(dev)); | 264 | seq_printf(seq, "name\t\t: %s\n", dev_name(dev)); |
| 265 | |||
| 266 | return 0; | ||
| 265 | } | 267 | } |
| 266 | 268 | ||
| 267 | static irqreturn_t tegra_rtc_irq_handler(int irq, void *data) | 269 | static irqreturn_t tegra_rtc_irq_handler(int irq, void *data) |
diff --git a/drivers/rtc/rtc-test.c b/drivers/rtc/rtc-test.c index 8f86fa91de1a..3a2da4c892d6 100644 --- a/drivers/rtc/rtc-test.c +++ b/drivers/rtc/rtc-test.c | |||
| @@ -13,6 +13,10 @@ | |||
| 13 | #include <linux/rtc.h> | 13 | #include <linux/rtc.h> |
| 14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 15 | 15 | ||
| 16 | static int test_mmss64; | ||
| 17 | module_param(test_mmss64, int, 0644); | ||
| 18 | MODULE_PARM_DESC(test_mmss64, "Test struct rtc_class_ops.set_mmss64()."); | ||
| 19 | |||
| 16 | static struct platform_device *test0 = NULL, *test1 = NULL; | 20 | static struct platform_device *test0 = NULL, *test1 = NULL; |
| 17 | 21 | ||
| 18 | static int test_rtc_read_alarm(struct device *dev, | 22 | static int test_rtc_read_alarm(struct device *dev, |
| @@ -30,7 +34,13 @@ static int test_rtc_set_alarm(struct device *dev, | |||
| 30 | static int test_rtc_read_time(struct device *dev, | 34 | static int test_rtc_read_time(struct device *dev, |
| 31 | struct rtc_time *tm) | 35 | struct rtc_time *tm) |
| 32 | { | 36 | { |
| 33 | rtc_time_to_tm(get_seconds(), tm); | 37 | rtc_time64_to_tm(ktime_get_real_seconds(), tm); |
| 38 | return 0; | ||
| 39 | } | ||
| 40 | |||
| 41 | static int test_rtc_set_mmss64(struct device *dev, time64_t secs) | ||
| 42 | { | ||
| 43 | dev_info(dev, "%s, secs = %lld\n", __func__, (long long)secs); | ||
| 34 | return 0; | 44 | return 0; |
| 35 | } | 45 | } |
| 36 | 46 | ||
| @@ -55,7 +65,7 @@ static int test_rtc_alarm_irq_enable(struct device *dev, unsigned int enable) | |||
| 55 | return 0; | 65 | return 0; |
| 56 | } | 66 | } |
| 57 | 67 | ||
| 58 | static const struct rtc_class_ops test_rtc_ops = { | 68 | static struct rtc_class_ops test_rtc_ops = { |
| 59 | .proc = test_rtc_proc, | 69 | .proc = test_rtc_proc, |
| 60 | .read_time = test_rtc_read_time, | 70 | .read_time = test_rtc_read_time, |
| 61 | .read_alarm = test_rtc_read_alarm, | 71 | .read_alarm = test_rtc_read_alarm, |
| @@ -101,6 +111,11 @@ static int test_probe(struct platform_device *plat_dev) | |||
| 101 | int err; | 111 | int err; |
| 102 | struct rtc_device *rtc; | 112 | struct rtc_device *rtc; |
| 103 | 113 | ||
| 114 | if (test_mmss64) { | ||
| 115 | test_rtc_ops.set_mmss64 = test_rtc_set_mmss64; | ||
| 116 | test_rtc_ops.set_mmss = NULL; | ||
| 117 | } | ||
| 118 | |||
| 104 | rtc = devm_rtc_device_register(&plat_dev->dev, "test", | 119 | rtc = devm_rtc_device_register(&plat_dev->dev, "test", |
| 105 | &test_rtc_ops, THIS_MODULE); | 120 | &test_rtc_ops, THIS_MODULE); |
| 106 | if (IS_ERR(rtc)) { | 121 | if (IS_ERR(rtc)) { |
diff --git a/drivers/rtc/systohc.c b/drivers/rtc/systohc.c index eb71872d0361..7728d5e32bf4 100644 --- a/drivers/rtc/systohc.c +++ b/drivers/rtc/systohc.c | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | * rtc_set_ntp_time - Save NTP synchronized time to the RTC | 11 | * rtc_set_ntp_time - Save NTP synchronized time to the RTC |
| 12 | * @now: Current time of day | 12 | * @now: Current time of day |
| 13 | * | 13 | * |
| 14 | * Replacement for the NTP platform function update_persistent_clock | 14 | * Replacement for the NTP platform function update_persistent_clock64 |
| 15 | * that stores time for later retrieval by rtc_hctosys. | 15 | * that stores time for later retrieval by rtc_hctosys. |
| 16 | * | 16 | * |
| 17 | * Returns 0 on successful RTC update, -ENODEV if a RTC update is not | 17 | * Returns 0 on successful RTC update, -ENODEV if a RTC update is not |
| @@ -35,7 +35,10 @@ int rtc_set_ntp_time(struct timespec64 now) | |||
| 35 | if (rtc) { | 35 | if (rtc) { |
| 36 | /* rtc_hctosys exclusively uses UTC, so we call set_time here, | 36 | /* rtc_hctosys exclusively uses UTC, so we call set_time here, |
| 37 | * not set_mmss. */ | 37 | * not set_mmss. */ |
| 38 | if (rtc->ops && (rtc->ops->set_time || rtc->ops->set_mmss)) | 38 | if (rtc->ops && |
| 39 | (rtc->ops->set_time || | ||
| 40 | rtc->ops->set_mmss64 || | ||
| 41 | rtc->ops->set_mmss)) | ||
| 39 | err = rtc_set_time(rtc, &tm); | 42 | err = rtc_set_time(rtc, &tm); |
| 40 | rtc_class_close(rtc); | 43 | rtc_class_close(rtc); |
| 41 | } | 44 | } |
