1
/* $Id: mostek.h,v 1.1 2001/04/27 21:55:00 bencollins Exp $
2
* mostek.h: Describes the various Mostek time of day clock registers.
4
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
5
* Copyright (C) 1996 Thomas K. Dyas (tdyas@eden.rutgers.edu)
8
#ifndef _SPARC_MOSTEK_H
9
#define _SPARC_MOSTEK_H
11
#include <asm/idprom.h>
13
/* M48T02 Register Map (adapted from Sun NVRAM/Hostid FAQ)
17
* Bit 7 Bit 6 Bit 5 Bit 4Bit 3 Bit 2 Bit 1 Bit 0
18
* 7ff - - - - - - - - Year 00-99
19
* 7fe 0 0 0 - - - - - Month 01-12
20
* 7fd 0 0 - - - - - - Date 01-31
21
* 7fc 0 FT 0 0 0 - - - Day 01-07
22
* 7fb KS 0 - - - - - - Hours 00-23
23
* 7fa 0 - - - - - - - Minutes 00-59
24
* 7f9 ST - - - - - - - Seconds 00-59
25
* 7f8 W R S - - - - - Control
31
* * FT is FREQ TEST BIT
32
* * KS is KICK START BIT
35
/* The Mostek 48t02 real time clock and NVRAM chip. The registers
36
* other than the control register are in binary coded decimal. Some
37
* control bits also live outside the control register.
41
volatile char eeprom[2040]; /* This is the eeprom, don't touch! */
42
volatile unsigned char creg; /* Control register */
43
volatile unsigned char sec; /* Seconds (0-59) */
44
volatile unsigned char min; /* Minutes (0-59) */
45
volatile unsigned char hour; /* Hour (0-23) */
46
volatile unsigned char dow; /* Day of the week (1-7) */
47
volatile unsigned char dom; /* Day of the month (1-31) */
48
volatile unsigned char month; /* Month of year (1-12) */
49
volatile unsigned char year; /* Year (0-99) */
52
/* Control register values. */
53
#define MSTK_CREG_WRITE 0x80 /* Must set this before placing values. */
54
#define MSTK_CREG_READ 0x40 /* Stop updates to allow a clean read. */
55
#define MSTK_CREG_SIGN 0x20 /* Slow/speed clock in calibration mode. */
57
/* Control bits that live in the other registers. */
58
#define MSTK_STOP 0x80 /* Stop the clock oscillator. (sec) */
59
#define MSTK_KICK_START 0x80 /* Kick start the clock chip. (hour) */
60
#define MSTK_FREQ_TEST 0x40 /* Frequency test mode. (day) */
62
#define MSTK_YEAR_ZERO 1968 /* If year reg has zero, it is 1968. */
63
#define MSTK_CVT_YEAR(yr) ((yr) + MSTK_YEAR_ZERO)
65
/* Masks that define how much space each value takes up. */
66
#define MSTK_SEC_MASK 0x7f
67
#define MSTK_MIN_MASK 0x7f
68
#define MSTK_HOUR_MASK 0x3f
69
#define MSTK_DOW_MASK 0x07
70
#define MSTK_DOM_MASK 0x3f
71
#define MSTK_MONTH_MASK 0x1f
72
#define MSTK_YEAR_MASK 0xff
74
/* Binary coded decimal conversion macros. */
75
#define MSTK_REGVAL_TO_DECIMAL(x) (((x) & 0x0F) + 0x0A * ((x) >> 0x04))
76
#define MSTK_DECIMAL_TO_REGVAL(x) ((((x) / 0x0A) << 0x04) + ((x) % 0x0A))
78
/* Generic register set and get macros for internal use. */
79
#define MSTK_GET(regs,var,mask) (MSTK_REGVAL_TO_DECIMAL(regs->var & MSTK_ ## mask ## _MASK))
80
#define MSTK_SET(regs,var,value,mask) do { regs->var &= ~(MSTK_ ## mask ## _MASK); regs->var |= MSTK_DECIMAL_TO_REGVAL(value) & (MSTK_ ## mask ## _MASK); } while (0)
82
/* Macros to make register access easier on our fingers. These give you
83
* the decimal value of the register requested if applicable. You pass
84
* the a pointer to a 'struct mostek48t02'.
86
#define MSTK_REG_CREG(regs) (regs->creg)
87
#define MSTK_REG_SEC(regs) MSTK_GET(regs,sec,SEC)
88
#define MSTK_REG_MIN(regs) MSTK_GET(regs,min,MIN)
89
#define MSTK_REG_HOUR(regs) MSTK_GET(regs,hour,HOUR)
90
#define MSTK_REG_DOW(regs) MSTK_GET(regs,dow,DOW)
91
#define MSTK_REG_DOM(regs) MSTK_GET(regs,dom,DOM)
92
#define MSTK_REG_MONTH(regs) MSTK_GET(regs,month,MONTH)
93
#define MSTK_REG_YEAR(regs) MSTK_GET(regs,year,YEAR)
95
#define MSTK_SET_REG_SEC(regs,value) MSTK_SET(regs,sec,value,SEC)
96
#define MSTK_SET_REG_MIN(regs,value) MSTK_SET(regs,min,value,MIN)
97
#define MSTK_SET_REG_HOUR(regs,value) MSTK_SET(regs,hour,value,HOUR)
98
#define MSTK_SET_REG_DOW(regs,value) MSTK_SET(regs,dow,value,DOW)
99
#define MSTK_SET_REG_DOM(regs,value) MSTK_SET(regs,dom,value,DOM)
100
#define MSTK_SET_REG_MONTH(regs,value) MSTK_SET(regs,month,value,MONTH)
101
#define MSTK_SET_REG_YEAR(regs,value) MSTK_SET(regs,year,value,YEAR)
103
#endif /* !(_SPARC_MOSTEK_H) */