|
@@ -223,11 +223,21 @@ static int rv8803_set_time(struct device *dev, struct rtc_time *tm)
|
|
{
|
|
{
|
|
struct rv8803_data *rv8803 = dev_get_drvdata(dev);
|
|
struct rv8803_data *rv8803 = dev_get_drvdata(dev);
|
|
u8 date[7];
|
|
u8 date[7];
|
|
- int flags, ret;
|
|
|
|
|
|
+ int ctrl, flags, ret;
|
|
|
|
|
|
if ((tm->tm_year < 100) || (tm->tm_year > 199))
|
|
if ((tm->tm_year < 100) || (tm->tm_year > 199))
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
+ ctrl = rv8803_read_reg(rv8803->client, RV8803_CTRL);
|
|
|
|
+ if (ctrl < 0)
|
|
|
|
+ return ctrl;
|
|
|
|
+
|
|
|
|
+ /* Stop the clock */
|
|
|
|
+ ret = rv8803_write_reg(rv8803->client, RV8803_CTRL,
|
|
|
|
+ ctrl | RV8803_CTRL_RESET);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
date[RV8803_SEC] = bin2bcd(tm->tm_sec);
|
|
date[RV8803_SEC] = bin2bcd(tm->tm_sec);
|
|
date[RV8803_MIN] = bin2bcd(tm->tm_min);
|
|
date[RV8803_MIN] = bin2bcd(tm->tm_min);
|
|
date[RV8803_HOUR] = bin2bcd(tm->tm_hour);
|
|
date[RV8803_HOUR] = bin2bcd(tm->tm_hour);
|
|
@@ -240,6 +250,12 @@ static int rv8803_set_time(struct device *dev, struct rtc_time *tm)
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
|
|
+ /* Restart the clock */
|
|
|
|
+ ret = rv8803_write_reg(rv8803->client, RV8803_CTRL,
|
|
|
|
+ ctrl & ~RV8803_CTRL_RESET);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
mutex_lock(&rv8803->flags_lock);
|
|
mutex_lock(&rv8803->flags_lock);
|
|
|
|
|
|
flags = rv8803_read_reg(rv8803->client, RV8803_FLAG);
|
|
flags = rv8803_read_reg(rv8803->client, RV8803_FLAG);
|