+static void
+init_rtc()
+{
+ outb_cmos(0x26, CMOS_STATUS_A); // 32,768Khz src, 976.5625us updates
+ u8 regB = inb_cmos(CMOS_STATUS_B);
+ outb_cmos((regB & RTC_B_DSE) | RTC_B_24HR, CMOS_STATUS_B);
+ inb_cmos(CMOS_STATUS_C);
+ inb_cmos(CMOS_STATUS_D);
+}
+
+static u32
+bcd2bin(u8 val)
+{
+ return (val & 0xf) + ((val >> 4) * 10);
+}
+
+void
+timer_setup()
+{
+ dprintf(3, "init timer\n");
+ calibrate_tsc();
+ pit_setup();
+
+ init_rtc();
+ rtc_updating();
+ u32 seconds = bcd2bin(inb_cmos(CMOS_RTC_SECONDS));
+ u32 ticks = (seconds * 18206507) / 1000000;
+ u32 minutes = bcd2bin(inb_cmos(CMOS_RTC_MINUTES));
+ ticks += (minutes * 10923904) / 10000;
+ u32 hours = bcd2bin(inb_cmos(CMOS_RTC_HOURS));
+ ticks += (hours * 65543427) / 1000;
+ SET_BDA(timer_counter, ticks);
+ SET_BDA(timer_rollover, 0);
+
+ enable_hwirq(0, entry_08);
+ enable_hwirq(8, entry_70);
+}
+
+
+/****************************************************************
+ * Standard clock functions
+ ****************************************************************/
+