mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
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>
This commit is contained in:
parent
8c9a88fae2
commit
f308b68202
1 changed files with 10 additions and 38 deletions
|
@ -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;
|
||||
u8 buf[7];
|
||||
|
||||
res = regmap_write(priv->map, DS1343_SECONDS_REG,
|
||||
bin2bcd(dt->tm_sec));
|
||||
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_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;
|
||||
|
||||
res = regmap_write(priv->map, DS1343_DAY_REG,
|
||||
bin2bcd(dt->tm_wday + 1));
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
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)
|
||||
|
|
Loading…
Reference in a new issue