]> Pileus Git - ~andy/linux/blobdiff - arch/mips/sibyte/swarm/rtc_m41t81.c
Merge branch 'staging-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[~andy/linux] / arch / mips / sibyte / swarm / rtc_m41t81.c
index a686bb716ec67e8b5061c9c975689bd6a502e6eb..b732600b47f5e5e8ad7908e61cd55d22d9f4f6f2 100644 (file)
 #define M41T81REG_SQW  0x13            /* square wave register */
 
 #define M41T81_CCR_ADDRESS     0x68
-#define SMB_CSR(reg) ((u8 *) (IOADDR(A_SMB_REGISTER(1, reg))))
+
+#define SMB_CSR(reg)   IOADDR(A_SMB_REGISTER(1, reg))
 
 static int m41t81_read(uint8_t addr)
 {
-       while (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
+       while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
                ;
 
-       bus_writeq(addr & 0xff, SMB_CSR(R_SMB_CMD));
-       bus_writeq((V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_WR1BYTE),
-                  SMB_CSR(R_SMB_START));
+       __raw_writeq(addr & 0xff, SMB_CSR(R_SMB_CMD));
+       __raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_WR1BYTE,
+                    SMB_CSR(R_SMB_START));
 
-       while (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
+       while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
                ;
 
-       bus_writeq((V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_RD1BYTE),
-                  SMB_CSR(R_SMB_START));
+       __raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_RD1BYTE,
+                    SMB_CSR(R_SMB_START));
 
-       while (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
+       while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
                ;
 
-       if (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) {
+       if (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) {
                /* Clear error bit by writing a 1 */
-               bus_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS));
+               __raw_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS));
                return -1;
        }
 
-       return (bus_readq(SMB_CSR(R_SMB_DATA)) & 0xff);
+       return (__raw_readq(SMB_CSR(R_SMB_DATA)) & 0xff);
 }
 
 static int m41t81_write(uint8_t addr, int b)
 {
-       while (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
+       while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
                ;
 
-       bus_writeq((addr & 0xFF), SMB_CSR(R_SMB_CMD));
-       bus_writeq((b & 0xff), SMB_CSR(R_SMB_DATA));
-       bus_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_WR2BYTE,
-                  SMB_CSR(R_SMB_START));
+       __raw_writeq(addr & 0xff, SMB_CSR(R_SMB_CMD));
+       __raw_writeq(b & 0xff, SMB_CSR(R_SMB_DATA));
+       __raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_WR2BYTE,
+                    SMB_CSR(R_SMB_START));
 
-       while (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
+       while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
                ;
 
-       if (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) {
+       if (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_ERROR) {
                /* Clear error bit by writing a 1 */
-               bus_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS));
+               __raw_writeq(M_SMB_ERROR, SMB_CSR(R_SMB_STATUS));
                return -1;
        }
 
        /* read the same byte again to make sure it is written */
-       bus_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_RD1BYTE,
-                  SMB_CSR(R_SMB_START));
+       __raw_writeq(V_SMB_ADDR(M41T81_CCR_ADDRESS) | V_SMB_TT_RD1BYTE,
+                    SMB_CSR(R_SMB_START));
 
-       while (bus_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
+       while (__raw_readq(SMB_CSR(R_SMB_STATUS)) & M_SMB_BUSY)
                ;
 
        return 0;
@@ -143,8 +144,10 @@ static int m41t81_write(uint8_t addr, int b)
 int m41t81_set_time(unsigned long t)
 {
        struct rtc_time tm;
+       unsigned long flags;
 
-       to_tm(t, &tm);
+       /* Note we don't care about the century */
+       rtc_time_to_tm(t, &tm);
 
        /*
         * Note the write order matters as it ensures the correctness.
@@ -152,33 +155,35 @@ int m41t81_set_time(unsigned long t)
         * believe we should finish writing min within a second.
         */
 
-       tm.tm_sec = BIN2BCD(tm.tm_sec);
+       spin_lock_irqsave(&rtc_lock, flags);
+       tm.tm_sec = bin2bcd(tm.tm_sec);
        m41t81_write(M41T81REG_SC, tm.tm_sec);
 
-       tm.tm_min = BIN2BCD(tm.tm_min);
+       tm.tm_min = bin2bcd(tm.tm_min);
        m41t81_write(M41T81REG_MN, tm.tm_min);
 
-       tm.tm_hour = BIN2BCD(tm.tm_hour);
+       tm.tm_hour = bin2bcd(tm.tm_hour);
        tm.tm_hour = (tm.tm_hour & 0x3f) | (m41t81_read(M41T81REG_HR) & 0xc0);
        m41t81_write(M41T81REG_HR, tm.tm_hour);
 
        /* tm_wday starts from 0 to 6 */
        if (tm.tm_wday == 0) tm.tm_wday = 7;
-       tm.tm_wday = BIN2BCD(tm.tm_wday);
+       tm.tm_wday = bin2bcd(tm.tm_wday);
        m41t81_write(M41T81REG_DY, tm.tm_wday);
 
-       tm.tm_mday = BIN2BCD(tm.tm_mday);
+       tm.tm_mday = bin2bcd(tm.tm_mday);
        m41t81_write(M41T81REG_DT, tm.tm_mday);
 
        /* tm_mon starts from 0, *ick* */
        tm.tm_mon ++;
-       tm.tm_mon = BIN2BCD(tm.tm_mon);
+       tm.tm_mon = bin2bcd(tm.tm_mon);
        m41t81_write(M41T81REG_MO, tm.tm_mon);
 
        /* we don't do century, everything is beyond 2000 */
        tm.tm_year %= 100;
-       tm.tm_year = BIN2BCD(tm.tm_year);
+       tm.tm_year = bin2bcd(tm.tm_year);
        m41t81_write(M41T81REG_YR, tm.tm_year);
+       spin_unlock_irqrestore(&rtc_lock, flags);
 
        return 0;
 }
@@ -186,26 +191,30 @@ int m41t81_set_time(unsigned long t)
 unsigned long m41t81_get_time(void)
 {
        unsigned int year, mon, day, hour, min, sec;
+       unsigned long flags;
 
        /*
         * min is valid if two reads of sec are the same.
         */
        for (;;) {
+               spin_lock_irqsave(&rtc_lock, flags);
                sec = m41t81_read(M41T81REG_SC);
                min = m41t81_read(M41T81REG_MN);
                if (sec == m41t81_read(M41T81REG_SC)) break;
+               spin_unlock_irqrestore(&rtc_lock, flags);
        }
        hour = m41t81_read(M41T81REG_HR) & 0x3f;
        day = m41t81_read(M41T81REG_DT);
        mon = m41t81_read(M41T81REG_MO);
        year = m41t81_read(M41T81REG_YR);
-
-       sec = BCD2BIN(sec);
-       min = BCD2BIN(min);
-       hour = BCD2BIN(hour);
-       day = BCD2BIN(day);
-       mon = BCD2BIN(mon);
-       year = BCD2BIN(year);
+       spin_unlock_irqrestore(&rtc_lock, flags);
+
+       sec = bcd2bin(sec);
+       min = bcd2bin(min);
+       hour = bcd2bin(hour);
+       day = bcd2bin(day);
+       mon = bcd2bin(mon);
+       year = bcd2bin(year);
 
        year += 2000;