Merge git://git.infradead.org/battery-2.6
[pandora-kernel.git] / arch / mips / sibyte / swarm / setup.c
index defa1f1..080c966 100644 (file)
@@ -69,39 +69,52 @@ const char *get_system_type(void)
        return "SiByte " SIBYTE_BOARD_NAME;
 }
 
-void __init swarm_time_init(void)
+int swarm_be_handler(struct pt_regs *regs, int is_fixup)
 {
-#if defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
-       /* Setup HPT */
-       sb1250_hpt_setup();
-#endif
+       if (!is_fixup && (regs->cp0_cause & 4)) {
+               /* Data bus error - print PA */
+               printk("DBE physical address: %010Lx\n",
+                      __read_64bit_c0_register($26, 1));
+       }
+       return (is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL);
 }
 
-void __init plat_timer_setup(struct irqaction *irq)
+enum swarm_rtc_type {
+       RTC_NONE,
+       RTC_XICOR,
+       RTC_M4LT81
+};
+
+enum swarm_rtc_type swarm_rtc_type;
+
+unsigned long read_persistent_clock(void)
 {
-        /*
-         * we don't set up irqaction, because we will deliver timer
-         * interrupts through low-level (direct) meachanism.
-         */
+       switch (swarm_rtc_type) {
+       case RTC_XICOR:
+               return xicor_get_time();
 
-        /* We only need to setup the generic timer */
-#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
-       bcm1480_time_init();
-#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
-       sb1250_time_init();
-#else
-#error invalid SiByte board configuration
-#endif
+       case RTC_M4LT81:
+               return m41t81_get_time();
+
+       case RTC_NONE:
+       default:
+               return mktime(2000, 1, 1, 0, 0, 0);
+       }
 }
 
-int swarm_be_handler(struct pt_regs *regs, int is_fixup)
+int rtc_mips_set_time(unsigned long sec)
 {
-       if (!is_fixup && (regs->cp0_cause & 4)) {
-               /* Data bus error - print PA */
-               printk("DBE physical address: %010Lx\n",
-                      __read_64bit_c0_register($26, 1));
+       switch (swarm_rtc_type) {
+       case RTC_XICOR:
+               return xicor_set_time(sec);
+
+       case RTC_M4LT81:
+               return m41t81_set_time(sec);
+
+       case RTC_NONE:
+       default:
+               return -1;
        }
-       return (is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL);
 }
 
 void __init plat_mem_setup(void)
@@ -116,20 +129,12 @@ void __init plat_mem_setup(void)
 
        panic_timeout = 5;  /* For debug.  */
 
-       board_time_init = swarm_time_init;
        board_be_handler = swarm_be_handler;
 
-       if (xicor_probe()) {
-               printk("swarm setup: Xicor 1241 RTC detected.\n");
-               rtc_mips_get_time = xicor_get_time;
-               rtc_mips_set_time = xicor_set_time;
-       }
-
-       if (m41t81_probe()) {
-               printk("swarm setup: M41T81 RTC detected.\n");
-               rtc_mips_get_time = m41t81_get_time;
-               rtc_mips_set_time = m41t81_set_time;
-       }
+       if (xicor_probe())
+               swarm_rtc_type = RTC_XICOR;
+       if (m41t81_probe())
+               swarm_rtc_type = RTC_M4LT81;
 
        printk("This kernel optimized for "
 #ifdef CONFIG_SIMULATION
@@ -169,17 +174,19 @@ void __init plat_mem_setup(void)
 #define LEDS_PHYS MLEDS_PHYS
 #endif
 
-#define setled(index, c) \
-  ((unsigned char *)(IOADDR(LEDS_PHYS)+0x20))[(3-(index))<<3] = (c)
 void setleds(char *str)
 {
+       void *reg;
        int i;
+
        for (i = 0; i < 4; i++) {
-               if (!str[i]) {
-                       setled(i, ' ');
-               } else {
-                       setled(i, str[i]);
-               }
+               reg = IOADDR(LEDS_PHYS) + 0x20 + ((3 - i) << 3);
+
+               if (!str[i])
+                       writeb(' ', reg);
+               else
+                       writeb(str[i], reg);
        }
 }
-#endif
+
+#endif /* LEDS_PHYS */