rtc-ds1390: fix compilation warnings in drivers/rtc/rtc-ds1390.c
[safe/jmp/linux-2.6] / drivers / rtc / rtc-rs5c313.c
index f964d1d..e6ea3f5 100644 (file)
@@ -212,7 +212,9 @@ static inline void rs5c313_write_intintvreg(unsigned char data)
 static int rs5c313_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
        int data;
+       int cnt;
 
+       cnt = 0;
        while (1) {
                RS5C313_CEENABLE;       /* CE:H */
 
@@ -225,37 +227,41 @@ static int rs5c313_rtc_read_time(struct device *dev, struct rtc_time *tm)
                RS5C313_CEDISABLE;
                ndelay(700);    /* CE:L */
 
+               if (cnt++ > 100) {
+                       dev_err(dev, "%s: timeout error\n", __func__);
+                       return -EIO;
+               }
        }
 
        data = rs5c313_read_reg(RS5C313_ADDR_SEC);
        data |= (rs5c313_read_reg(RS5C313_ADDR_SEC10) << 4);
-       tm->tm_sec = BCD2BIN(data);
+       tm->tm_sec = bcd2bin(data);
 
        data = rs5c313_read_reg(RS5C313_ADDR_MIN);
        data |= (rs5c313_read_reg(RS5C313_ADDR_MIN10) << 4);
-       tm->tm_min = BCD2BIN(data);
+       tm->tm_min = bcd2bin(data);
 
        data = rs5c313_read_reg(RS5C313_ADDR_HOUR);
        data |= (rs5c313_read_reg(RS5C313_ADDR_HOUR10) << 4);
-       tm->tm_hour = BCD2BIN(data);
+       tm->tm_hour = bcd2bin(data);
 
        data = rs5c313_read_reg(RS5C313_ADDR_DAY);
        data |= (rs5c313_read_reg(RS5C313_ADDR_DAY10) << 4);
-       tm->tm_mday = BCD2BIN(data);
+       tm->tm_mday = bcd2bin(data);
 
        data = rs5c313_read_reg(RS5C313_ADDR_MON);
        data |= (rs5c313_read_reg(RS5C313_ADDR_MON10) << 4);
-       tm->tm_mon = BCD2BIN(data) - 1;
+       tm->tm_mon = bcd2bin(data) - 1;
 
        data = rs5c313_read_reg(RS5C313_ADDR_YEAR);
        data |= (rs5c313_read_reg(RS5C313_ADDR_YEAR10) << 4);
-       tm->tm_year = BCD2BIN(data);
+       tm->tm_year = bcd2bin(data);
 
        if (tm->tm_year < 70)
                tm->tm_year += 100;
 
        data = rs5c313_read_reg(RS5C313_ADDR_WEEK);
-       tm->tm_wday = BCD2BIN(data);
+       tm->tm_wday = bcd2bin(data);
 
        RS5C313_CEDISABLE;
        ndelay(700);            /* CE:L */
@@ -266,7 +272,9 @@ static int rs5c313_rtc_read_time(struct device *dev, struct rtc_time *tm)
 static int rs5c313_rtc_set_time(struct device *dev, struct rtc_time *tm)
 {
        int data;
+       int cnt;
 
+       cnt = 0;
        /* busy check. */
        while (1) {
                RS5C313_CEENABLE;       /* CE:H */
@@ -279,33 +287,38 @@ static int rs5c313_rtc_set_time(struct device *dev, struct rtc_time *tm)
                RS5C313_MISCOP;
                RS5C313_CEDISABLE;
                ndelay(700);    /* CE:L */
+
+               if (cnt++ > 100) {
+                       dev_err(dev, "%s: timeout error\n", __func__);
+                       return -EIO;
+               }
        }
 
-       data = BIN2BCD(tm->tm_sec);
+       data = bin2bcd(tm->tm_sec);
        rs5c313_write_reg(RS5C313_ADDR_SEC, data);
        rs5c313_write_reg(RS5C313_ADDR_SEC10, (data >> 4));
 
-       data = BIN2BCD(tm->tm_min);
+       data = bin2bcd(tm->tm_min);
        rs5c313_write_reg(RS5C313_ADDR_MIN, data );
        rs5c313_write_reg(RS5C313_ADDR_MIN10, (data >> 4));
 
-       data = BIN2BCD(tm->tm_hour);
+       data = bin2bcd(tm->tm_hour);
        rs5c313_write_reg(RS5C313_ADDR_HOUR, data);
        rs5c313_write_reg(RS5C313_ADDR_HOUR10, (data >> 4));
 
-       data = BIN2BCD(tm->tm_mday);
+       data = bin2bcd(tm->tm_mday);
        rs5c313_write_reg(RS5C313_ADDR_DAY, data);
        rs5c313_write_reg(RS5C313_ADDR_DAY10, (data>> 4));
 
-       data = BIN2BCD(tm->tm_mon + 1);
+       data = bin2bcd(tm->tm_mon + 1);
        rs5c313_write_reg(RS5C313_ADDR_MON, data);
        rs5c313_write_reg(RS5C313_ADDR_MON10, (data >> 4));
 
-       data = BIN2BCD(tm->tm_year % 100);
+       data = bin2bcd(tm->tm_year % 100);
        rs5c313_write_reg(RS5C313_ADDR_YEAR, data);
        rs5c313_write_reg(RS5C313_ADDR_YEAR10, (data >> 4));
 
-       data = BIN2BCD(tm->tm_wday);
+       data = bin2bcd(tm->tm_wday);
        rs5c313_write_reg(RS5C313_ADDR_WEEK, data);
 
        RS5C313_CEDISABLE;      /* CE:H */
@@ -317,6 +330,7 @@ static int rs5c313_rtc_set_time(struct device *dev, struct rtc_time *tm)
 static void rs5c313_check_xstp_bit(void)
 {
        struct rtc_time tm;
+       int cnt;
 
        RS5C313_CEENABLE;       /* CE:H */
        if (rs5c313_read_cntreg() & RS5C313_CNTREG_WTEN_XSTP) {
@@ -326,8 +340,11 @@ static void rs5c313_check_xstp_bit(void)
                rs5c313_write_cntreg(0x07);
 
                /* busy check. */
-               while (rs5c313_read_cntreg() & RS5C313_CNTREG_ADJ_BSY)
+               for (cnt = 0; cnt < 100; cnt++) {
+                       if (!(rs5c313_read_cntreg() & RS5C313_CNTREG_ADJ_BSY))
+                               break;
                        RS5C313_MISCOP;
+               }
 
                memset(&tm, 0, sizeof(struct rtc_time));
                tm.tm_mday      = 1;
@@ -404,3 +421,4 @@ MODULE_VERSION(DRV_VERSION);
 MODULE_AUTHOR("kogiidena , Nobuhiro Iwamatsu <iwamatsu@nigauri.org>");
 MODULE_DESCRIPTION("Ricoh RS5C313 RTC device driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);