diff options
| author | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2019-10-19 22:49:35 +0200 | 
|---|---|---|
| committer | Alexandre Belloni <alexandre.belloni@bootlin.com> | 2019-10-19 22:56:00 +0200 | 
| commit | f308b682028a34874a376da649f99e7531dea15c (patch) | |
| tree | a24eda7d4ec0e0c38466468676e830e7b30defb6 | |
| parent | 8c9a88fae2ce50f1aef5a72273a5d46e4fa89603 (diff) | |
rtc: ds1343: use burst write to set time
To avoid possible race condition, use regmap_bulk_write to write all the
date/time registers at once instead of sequentially.
Link: https://lore.kernel.org/r/20191019204941.6203-3-alexandre.belloni@bootlin.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
| -rw-r--r-- | drivers/rtc/rtc-ds1343.c | 48 | 
1 files changed, 10 insertions, 38 deletions
| diff --git a/drivers/rtc/rtc-ds1343.c b/drivers/rtc/rtc-ds1343.c index 9d7d571e722b..8a4f1fbb57fd 100644 --- a/drivers/rtc/rtc-ds1343.c +++ b/drivers/rtc/rtc-ds1343.c @@ -236,46 +236,18 @@ static int ds1343_read_time(struct device *dev, struct rtc_time *dt)  static int ds1343_set_time(struct device *dev, struct rtc_time *dt)  {  	struct ds1343_priv *priv = dev_get_drvdata(dev); -	int res; - -	res = regmap_write(priv->map, DS1343_SECONDS_REG, -				bin2bcd(dt->tm_sec)); -	if (res) -		return res; - -	res = regmap_write(priv->map, DS1343_MINUTES_REG, -				bin2bcd(dt->tm_min)); -	if (res) -		return res; - -	res = regmap_write(priv->map, DS1343_HOURS_REG, -				bin2bcd(dt->tm_hour) & 0x3F); -	if (res) -		return res; +	u8 buf[7]; -	res = regmap_write(priv->map, DS1343_DAY_REG, -				bin2bcd(dt->tm_wday + 1)); -	if (res) -		return res; +	buf[0] = bin2bcd(dt->tm_sec); +	buf[1] = bin2bcd(dt->tm_min); +	buf[2] = bin2bcd(dt->tm_hour) & 0x3F; +	buf[3] = bin2bcd(dt->tm_wday + 1); +	buf[4] = bin2bcd(dt->tm_mday); +	buf[5] = bin2bcd(dt->tm_mon + 1); +	buf[6] = bin2bcd(dt->tm_year - 100); -	res = regmap_write(priv->map, DS1343_DATE_REG, -				bin2bcd(dt->tm_mday)); -	if (res) -		return res; - -	res = regmap_write(priv->map, DS1343_MONTH_REG, -				bin2bcd(dt->tm_mon + 1)); -	if (res) -		return res; - -	dt->tm_year %= 100; - -	res = regmap_write(priv->map, DS1343_YEAR_REG, -				bin2bcd(dt->tm_year)); -	if (res) -		return res; - -	return 0; +	return regmap_bulk_write(priv->map, DS1343_SECONDS_REG, +				 buf, sizeof(buf));  }  static int ds1343_update_alarm(struct device *dev) | 
