Skip to content

Commit

Permalink
rtc: mc13xxx: make rtc_read_time() more readable
Browse files Browse the repository at this point in the history
Remove unnecessary locks when reading the time and make the read
operation until the values of day matched between reading the seconds,
it will make the mc13xxx_rtc_read_time() procedure more readable.
Additionally, patch introduced a "seconds in a day" definition.

Signed-off-by: Alexander Shiyan <[email protected]>
Cc: Uwe Kleine-König <[email protected]>
Cc: Sascha Hauer <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
shcgit authored and torvalds committed Apr 3, 2014
1 parent 12de362 commit 6a2b342
Showing 1 changed file with 23 additions and 36 deletions.
59 changes: 23 additions & 36 deletions drivers/rtc/rtc-mc13xxx.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#define MC13XXX_RTCDAY 22
#define MC13XXX_RTCDAYA 23

#define SEC_PER_DAY (24 * 60 * 60)

struct mc13xxx_rtc {
struct rtc_device *rtc;
struct mc13xxx *mc13xxx;
Expand Down Expand Up @@ -61,42 +63,27 @@ static int mc13xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
{
struct mc13xxx_rtc *priv = dev_get_drvdata(dev);
unsigned int seconds, days1, days2;
unsigned long s1970;
int ret;

if (!priv->valid)
return -ENODATA;

mc13xxx_lock(priv->mc13xxx);
do {
int ret;

ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days1);
if (unlikely(ret))
goto out;

ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTOD, &seconds);
if (unlikely(ret))
goto out;

ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days2);
out:
mc13xxx_unlock(priv->mc13xxx);

if (ret)
return ret;

if (days2 == days1 + 1) {
if (seconds >= 86400 / 2)
days2 = days1;
else
days1 = days2;
}
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days1);
if (ret)
return ret;

if (days1 != days2)
return -EIO;
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTOD, &seconds);
if (ret)
return ret;

s1970 = days1 * 86400 + seconds;
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days2);
if (ret)
return ret;
} while (days1 != days2);

rtc_time_to_tm(s1970, tm);
rtc_time_to_tm(days1 * SEC_PER_DAY + seconds, tm);

return rtc_valid_tm(tm);
}
Expand All @@ -108,8 +95,8 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs)
unsigned int alarmseconds;
int ret;

seconds = secs % 86400;
days = secs / 86400;
seconds = secs % SEC_PER_DAY;
days = secs / SEC_PER_DAY;

mc13xxx_lock(priv->mc13xxx);

Expand All @@ -121,7 +108,7 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs)
if (unlikely(ret))
goto out;

if (alarmseconds < 86400) {
if (alarmseconds < SEC_PER_DAY) {
ret = mc13xxx_reg_write(priv->mc13xxx,
MC13XXX_RTCTODA, 0x1ffff);
if (unlikely(ret))
Expand All @@ -145,7 +132,7 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs)
goto out;

/* restore alarm */
if (alarmseconds < 86400) {
if (alarmseconds < SEC_PER_DAY) {
ret = mc13xxx_reg_write(priv->mc13xxx,
MC13XXX_RTCTODA, alarmseconds);
if (unlikely(ret))
Expand Down Expand Up @@ -181,7 +168,7 @@ static int mc13xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTODA, &seconds);
if (unlikely(ret))
goto out;
if (seconds >= 86400) {
if (seconds >= SEC_PER_DAY) {
ret = -ENODATA;
goto out;
}
Expand All @@ -202,7 +189,7 @@ static int mc13xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
alarm->enabled = enabled;
alarm->pending = pending;

s1970 = days * 86400 + seconds;
s1970 = days * SEC_PER_DAY + seconds;

rtc_time_to_tm(s1970, &alarm->time);
dev_dbg(dev, "%s: %lu\n", __func__, s1970);
Expand Down Expand Up @@ -240,8 +227,8 @@ static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
if (unlikely(ret))
goto out;

seconds = s1970 % 86400;
days = s1970 / 86400;
seconds = s1970 % SEC_PER_DAY;
days = s1970 / SEC_PER_DAY;

ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days);
if (unlikely(ret))
Expand Down

0 comments on commit 6a2b342

Please sign in to comment.