rtc: 88pm80x: fix unintended sign extension
[linux-2.6-microblaze.git] / drivers / rtc / rtc-88pm80x.c
index cab293c..1fc48eb 100644 (file)
@@ -114,12 +114,14 @@ static int pm80x_rtc_read_time(struct device *dev, struct rtc_time *tm)
        unsigned char buf[4];
        unsigned long ticks, base, data;
        regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4);
-       base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+       base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
+               (buf[1] << 8) | buf[0];
        dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]);
 
        /* load 32-bit read-only counter */
        regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4);
-       data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+       data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
+               (buf[1] << 8) | buf[0];
        ticks = base + data;
        dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
                base, data, ticks);
@@ -137,7 +139,8 @@ static int pm80x_rtc_set_time(struct device *dev, struct rtc_time *tm)
 
        /* load 32-bit read-only counter */
        regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4);
-       data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+       data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
+               (buf[1] << 8) | buf[0];
        base = ticks - data;
        dev_dbg(info->dev, "set base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
                base, data, ticks);
@@ -158,11 +161,13 @@ static int pm80x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
        int ret;
 
        regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4);
-       base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+       base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
+               (buf[1] << 8) | buf[0];
        dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]);
 
        regmap_raw_read(info->map, PM800_RTC_EXPIRE1_1, buf, 4);
-       data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+       data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
+               (buf[1] << 8) | buf[0];
        ticks = base + data;
        dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
                base, data, ticks);
@@ -185,12 +190,14 @@ static int pm80x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
        regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_ALARM1_EN, 0);
 
        regmap_raw_read(info->map, PM800_RTC_EXPIRE2_1, buf, 4);
-       base = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+       base = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
+               (buf[1] << 8) | buf[0];
        dev_dbg(info->dev, "%x-%x-%x-%x\n", buf[0], buf[1], buf[2], buf[3]);
 
        /* load 32-bit read-only counter */
        regmap_raw_read(info->map, PM800_RTC_COUNTER1, buf, 4);
-       data = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+       data = ((unsigned long)buf[3] << 24) | (buf[2] << 16) |
+               (buf[1] << 8) | buf[0];
        ticks = base + data;
        dev_dbg(info->dev, "get base:0x%lx, RO count:0x%lx, ticks:0x%lx\n",
                base, data, ticks);