Commit 64d69b5d authored by Miquel Raynal's avatar Miquel Raynal Committed by Alexandre Belloni

rtc: rzn1: Avoid mixing variables

In the ->set_offset() callback, the 'val' variable is used for two
different purposes at the same time, which is oviously wrong:
- It contains the intermediate value of the SUBU register that must be
  written at the end of ->set_offset().
- It is used in the middle of the above calculations to poll the CTL2
  register for a specific value.

Let's introduce a 'ctl2' variable just for the readl_poll_timeout()
call and use it there in place of 'var'.

In order to avoid mixing those two variables again, let's rename the
remaining occurences of 'val' into 'subu' and initialize it to 0 to
avoid the uninitialized variable situation reported by Tom Rix and Colin
Ian King already.

Fixes: be4a11cf ("rtc: rzn1: Add oscillator offset support")
Reported-by: default avatarTom Rix <trix@redhat.com>
Reported-by: default avatarColin Ian King <colin.i.king@gmail.com>
Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/r/20220520082221.488849-1-miquel.raynal@bootlin.com
parent b520cbe5
......@@ -272,7 +272,7 @@ static int rzn1_rtc_set_offset(struct device *dev, long offset)
struct rzn1_rtc *rtc = dev_get_drvdata(dev);
unsigned int steps;
int stepsh, stepsl;
u32 val;
u32 subu = 0, ctl2;
int ret;
/*
......@@ -288,7 +288,7 @@ static int rzn1_rtc_set_offset(struct device *dev, long offset)
if (stepsh >= -0x3E && stepsh <= 0x3E) {
/* 1017 ppb per step */
steps = stepsh;
val |= RZN1_RTC_SUBU_DEV;
subu |= RZN1_RTC_SUBU_DEV;
} else if (stepsl >= -0x3E && stepsl <= 0x3E) {
/* 3051 ppb per step */
steps = stepsl;
......@@ -300,18 +300,18 @@ static int rzn1_rtc_set_offset(struct device *dev, long offset)
return 0;
if (steps > 0) {
val |= steps + 1;
subu |= steps + 1;
} else {
val |= RZN1_RTC_SUBU_DECR;
val |= (~(-steps - 1)) & 0x3F;
subu |= RZN1_RTC_SUBU_DECR;
subu |= (~(-steps - 1)) & 0x3F;
}
ret = readl_poll_timeout(rtc->base + RZN1_RTC_CTL2, val,
!(val & RZN1_RTC_CTL2_WUST), 100, 2000000);
ret = readl_poll_timeout(rtc->base + RZN1_RTC_CTL2, ctl2,
!(ctl2 & RZN1_RTC_CTL2_WUST), 100, 2000000);
if (ret)
return ret;
writel(val, rtc->base + RZN1_RTC_SUBU);
writel(subu, rtc->base + RZN1_RTC_SUBU);
return 0;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment