]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/mips/lasat/ds1603.c
V4L/DVB (8955): bttv: Prevent NULL pointer dereference in radio_open
[linux-2.6-omap-h63xx.git] / arch / mips / lasat / ds1603.c
index 9d7812e03dcd9322f5410963e8a63398878d57d2..52cb1436a12aff59908461f87f9ea114d44c1f63 100644 (file)
@@ -8,6 +8,7 @@
 #include <asm/lasat/lasat.h>
 #include <linux/delay.h>
 #include <asm/lasat/ds1603.h>
+#include <asm/time.h>
 
 #include "ds1603.h"
 
@@ -17,7 +18,7 @@
 #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)
@@ -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;
 }