[MIPS] Deforest the function pointer jungle in the time code.
[firefly-linux-kernel-4.4.55.git] / arch / mips / lasat / ds1603.c
index 7bbf6cf923c98f85f7a00e556558e2ccc64fe7a2..52cb1436a12aff59908461f87f9ea114d44c1f63 100644 (file)
@@ -1,13 +1,14 @@
-/* 
- * Dallas Semiconductors 1603 RTC driver 
+/*
+ * Dallas Semiconductors 1603 RTC driver
  *
- * Brian Murphy <brian@murphy.dk> 
+ * Brian Murphy <brian@murphy.dk>
  *
  */
 #include <linux/kernel.h>
 #include <asm/lasat/lasat.h>
 #include <linux/delay.h>
 #include <asm/lasat/ds1603.h>
+#include <asm/time.h>
 
 #include "ds1603.h"
 
 #define TRIMMER_VALUE_MASK 0x38
 #define TRIMMER_SHIFT 3
 
-struct ds_defs *ds1603 = NULL;
+struct ds_defs *ds1603;
 
 /* HW specific register functions */
-static void rtc_reg_write(unsigned long val) 
+static void rtc_reg_write(unsigned long val)
 {
        *ds1603->reg = val;
 }
 
-static unsigned long rtc_reg_read(void) 
+static unsigned long rtc_reg_read(void)
 {
        unsigned long tmp = *ds1603->reg;
        return tmp;
@@ -80,7 +81,7 @@ static unsigned int rtc_read_databit(void)
 {
        unsigned int data;
 
-       data = (rtc_datareg_read() & (1 << ds1603->data_read_shift)) 
+       data = (rtc_datareg_read() & (1 << ds1603->data_read_shift))
                >> ds1603->data_read_shift;
        rtc_cycle_clock(rtc_reg_read());
        return data;
@@ -90,7 +91,7 @@ static void rtc_write_byte(unsigned int byte)
 {
        int i;
 
-       for (i = 0; i<=7; i++) {
+       for (i = 0; i <= 7; i++) {
                rtc_write_databit(byte & 1L);
                byte >>= 1;
        }
@@ -100,7 +101,7 @@ static void rtc_write_word(unsigned long word)
 {
        int i;
 
-       for (i = 0; i<=31; i++) {
+       for (i = 0; i <= 31; i++) {
                rtc_write_databit(word & 1L);
                word >>= 1;
        }
@@ -112,7 +113,7 @@ static unsigned long rtc_read_word(void)
        unsigned long word = 0;
        unsigned long shift = 0;
 
-       for (i = 0; i<=31; i++) {
+       for (i = 0; i <= 31; i++) {
                word |= rtc_read_databit() << shift;
                shift++;
        }
@@ -134,23 +135,31 @@ static void rtc_end_op(void)
        lasat_ndelay(1000);
 }
 
-/* interface */
-unsigned long ds1603_read(void)
+unsigned long read_persistent_clock(void)
 {
        unsigned long word;
+       unsigned long flags;
+
+       spin_lock_irqsave(&rtc_lock, flags);
        rtc_init_op();
        rtc_write_byte(READ_TIME_CMD);
        word = rtc_read_word();
        rtc_end_op();
+       spin_unlock_irqrestore(&rtc_lock, flags);
+
        return word;
 }
 
-int ds1603_set(unsigned long time)
+int rtc_mips_set_mmss(unsigned long time)
 {
+       unsigned long flags;
+
+       spin_lock_irqsave(&rtc_lock, flags);
        rtc_init_op();
        rtc_write_byte(SET_TIME_CMD);
        rtc_write_word(time);
        rtc_end_op();
+       spin_unlock_irqrestore(&rtc_lock, flags);
 
        return 0;
 }