diff options
-rw-r--r-- | drivers/rtc/rtc-rv8803.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/rtc/rtc-rv8803.c b/drivers/rtc/rtc-rv8803.c index 09ab5cb1fa8a..24c688eec527 100644 --- a/drivers/rtc/rtc-rv8803.c +++ b/drivers/rtc/rtc-rv8803.c | |||
@@ -223,11 +223,21 @@ static int rv8803_set_time(struct device *dev, struct rtc_time *tm) | |||
223 | { | 223 | { |
224 | struct rv8803_data *rv8803 = dev_get_drvdata(dev); | 224 | struct rv8803_data *rv8803 = dev_get_drvdata(dev); |
225 | u8 date[7]; | 225 | u8 date[7]; |
226 | int flags, ret; | 226 | int ctrl, flags, ret; |
227 | 227 | ||
228 | if ((tm->tm_year < 100) || (tm->tm_year > 199)) | 228 | if ((tm->tm_year < 100) || (tm->tm_year > 199)) |
229 | return -EINVAL; | 229 | return -EINVAL; |
230 | 230 | ||
231 | ctrl = rv8803_read_reg(rv8803->client, RV8803_CTRL); | ||
232 | if (ctrl < 0) | ||
233 | return ctrl; | ||
234 | |||
235 | /* Stop the clock */ | ||
236 | ret = rv8803_write_reg(rv8803->client, RV8803_CTRL, | ||
237 | ctrl | RV8803_CTRL_RESET); | ||
238 | if (ret) | ||
239 | return ret; | ||
240 | |||
231 | date[RV8803_SEC] = bin2bcd(tm->tm_sec); | 241 | date[RV8803_SEC] = bin2bcd(tm->tm_sec); |
232 | date[RV8803_MIN] = bin2bcd(tm->tm_min); | 242 | date[RV8803_MIN] = bin2bcd(tm->tm_min); |
233 | date[RV8803_HOUR] = bin2bcd(tm->tm_hour); | 243 | date[RV8803_HOUR] = bin2bcd(tm->tm_hour); |
@@ -240,6 +250,12 @@ static int rv8803_set_time(struct device *dev, struct rtc_time *tm) | |||
240 | if (ret) | 250 | if (ret) |
241 | return ret; | 251 | return ret; |
242 | 252 | ||
253 | /* Restart the clock */ | ||
254 | ret = rv8803_write_reg(rv8803->client, RV8803_CTRL, | ||
255 | ctrl & ~RV8803_CTRL_RESET); | ||
256 | if (ret) | ||
257 | return ret; | ||
258 | |||
243 | mutex_lock(&rv8803->flags_lock); | 259 | mutex_lock(&rv8803->flags_lock); |
244 | 260 | ||
245 | flags = rv8803_read_reg(rv8803->client, RV8803_FLAG); | 261 | flags = rv8803_read_reg(rv8803->client, RV8803_FLAG); |