time.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
- /*
- * linux/arch/m68k/sun3x/time.c
- *
- * Sun3x-specific time handling
- */
- #include <linux/types.h>
- #include <linux/kd.h>
- #include <linux/init.h>
- #include <linux/sched.h>
- #include <linux/kernel_stat.h>
- #include <linux/interrupt.h>
- #include <asm/irq.h>
- #include <asm/io.h>
- #include <asm/system.h>
- #include <asm/traps.h>
- #include <asm/sun3x.h>
- #include <asm/sun3ints.h>
- #include <asm/rtc.h>
- #include "time.h"
- #define M_CONTROL 0xf8
- #define M_SEC 0xf9
- #define M_MIN 0xfa
- #define M_HOUR 0xfb
- #define M_DAY 0xfc
- #define M_DATE 0xfd
- #define M_MONTH 0xfe
- #define M_YEAR 0xff
- #define C_WRITE 0x80
- #define C_READ 0x40
- #define C_SIGN 0x20
- #define C_CALIB 0x1f
- #define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10)
- #define BIN_TO_BCD(val) (((val/10) << 4) | (val % 10))
- /* Read the Mostek */
- void sun3x_gettod (int *yearp, int *monp, int *dayp,
- int *hourp, int *minp, int *secp)
- {
- volatile unsigned char *eeprom = (unsigned char *)SUN3X_EEPROM;
- /* Stop updates */
- *(eeprom + M_CONTROL) |= C_READ;
- /* Read values */
- *yearp = BCD_TO_BIN(*(eeprom + M_YEAR));
- *monp = BCD_TO_BIN(*(eeprom + M_MONTH)) +1;
- *dayp = BCD_TO_BIN(*(eeprom + M_DATE));
- *hourp = BCD_TO_BIN(*(eeprom + M_HOUR));
- *minp = BCD_TO_BIN(*(eeprom + M_MIN));
- *secp = BCD_TO_BIN(*(eeprom + M_SEC));
- /* Restart updates */
- *(eeprom + M_CONTROL) &= ~C_READ;
- }
- int sun3x_hwclk(int set, struct hwclk_time *t)
- {
- volatile struct mostek_dt *h =
- (unsigned char *)(SUN3X_EEPROM+M_CONTROL);
- unsigned long flags;
- save_and_cli(flags);
-
- if(set) {
- h->csr |= C_WRITE;
- h->sec = BIN_TO_BCD(t->sec);
- h->min = BIN_TO_BCD(t->min);
- h->hour = BIN_TO_BCD(t->hour);
- h->wday = BIN_TO_BCD(t->wday);
- h->mday = BIN_TO_BCD(t->day);
- h->month = BIN_TO_BCD(t->mon);
- h->year = BIN_TO_BCD(t->year);
- h->csr &= ~C_WRITE;
- } else {
- h->csr |= C_READ;
- t->sec = BCD_TO_BIN(h->sec);
- t->min = BCD_TO_BIN(h->min);
- t->hour = BCD_TO_BIN(h->hour);
- t->wday = BCD_TO_BIN(h->wday);
- t->day = BCD_TO_BIN(h->mday);
- t->mon = BCD_TO_BIN(h->month);
- t->year = BCD_TO_BIN(h->year);
- h->csr &= ~C_READ;
- }
- restore_flags(flags);
- return 0;
- }
- /* Not much we can do here */
- unsigned long sun3x_gettimeoffset (void)
- {
- return 0L;
- }
- static void sun3x_timer_tick(int irq, void *dev_id, struct pt_regs *regs)
- {
- void (*vector)(int, void *, struct pt_regs *) = dev_id;
- /* Clear the pending interrupt - pulse the enable line low */
- disable_irq(5);
- enable_irq(5);
-
- vector(irq, NULL, regs);
- }
- void __init sun3x_sched_init(void (*vector)(int, void *, struct pt_regs *))
- {
-
- sun3_disable_interrupts();
-
- /* Pulse enable low to get the clock started */
- sun3_disable_irq(5);
- sun3_enable_irq(5);
- sun3_enable_interrupts();
- }