aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/rtc/rtc-rv8803.c18
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);