summaryrefslogtreecommitdiff
path: root/drivers/rtc
diff options
context:
space:
mode:
authorColin Ian King <colin.king@canonical.com>2021-09-28 16:46:54 +0300
committerAlexandre Belloni <alexandre.belloni@bootlin.com>2021-10-02 00:28:46 +0300
commitf3606687b447c41d28a011c98373b62b1cd52345 (patch)
treeb8d85f97457b4a32c252b7c17ad8ccf6be2302fb /drivers/rtc
parent3109151c47343c80300177ec7704e0757064efdc (diff)
downloadlinux-f3606687b447c41d28a011c98373b62b1cd52345.tar.xz
rtc: msc313: Fix unintentional sign extension issues with left shift of a u16
Shifting the u16 value returned by readw by 16 bits to the left will be promoted to a 32 bit signed int and then sign-extended to an unsigned long. If the top bit of the readw is set then the shifted value will be sign extended and the top 32 bits of the result will be set. Fixes: be7d9c9161b9 ("rtc: Add support for the MSTAR MSC313 RTC") Signed-off-by: Colin Ian King <colin.king@canonical.com> Reviewed-by: Romain Perier <romain.perier@gmail.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Link: https://lore.kernel.org/r/20210928134654.991923-1-colin.king@canonical.com
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/rtc-msc313.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/rtc/rtc-msc313.c b/drivers/rtc/rtc-msc313.c
index 5f178d29cfd8..f3fde013c4b8 100644
--- a/drivers/rtc/rtc-msc313.c
+++ b/drivers/rtc/rtc-msc313.c
@@ -53,7 +53,7 @@ static int msc313_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
unsigned long seconds;
seconds = readw(priv->rtc_base + REG_RTC_MATCH_VAL_L)
- | (readw(priv->rtc_base + REG_RTC_MATCH_VAL_H) << 16);
+ | ((unsigned long)readw(priv->rtc_base + REG_RTC_MATCH_VAL_H) << 16);
rtc_time64_to_tm(seconds, &alarm->time);
@@ -122,7 +122,7 @@ static int msc313_rtc_read_time(struct device *dev, struct rtc_time *tm)
udelay(1);
seconds = readw(priv->rtc_base + REG_RTC_CNT_VAL_L)
- | (readw(priv->rtc_base + REG_RTC_CNT_VAL_H) << 16);
+ | ((unsigned long)readw(priv->rtc_base + REG_RTC_CNT_VAL_H) << 16);
rtc_time64_to_tm(seconds, tm);