/*	@(#)clock.h 1.1 92/07/30 SMI	*/

#ifndef	_sun4c_clock_h
#define	_sun4c_clock_h

/*
 * Copyright (c) 1988 by Sun Microsystems, Inc.
 */

/*
 * Definitions and structures for the hi resolution counters
 * on sun4c machines. These counters are normally used to generate
 * 100hz clock interrupts, but are fully programmable for whatever
 * purpose desired.
 */
#define	OBIO_COUNTER_ADDR	0xF3000000	/* addr in obio space */
#define	COUNTER_ADDR		0xFFFF7000	/* virtual addr we map to */
#ifndef LOCORE
struct counterregs {
	u_int	counter10;
	u_int	limit10;
	u_int	counter14;
	u_int	limit14;
};
#define	COUNTER	((struct counterregs *)(COUNTER_ADDR))
#endif !LOCORE

#define	CTR_LIMIT_BIT		0x80000000	/* limit bit mask */
#define	CTR_USEC_MASK		0x7FFFFC00	/* counter/limit mask */
#define	CTR_USEC_SHIFT		10		/* counter/limit shift */

/*
 * Definitions for the Mostek 48T02 clock chip. We use this chip as
 * our TOD clock. Clock interrupts are generated by a separate timer
 * circuit.
 */

#define	SECDAY	((unsigned)(24*60*60))		/* seconds per day */
#define	SECYR	((unsigned)(365*SECDAY))	/* seconds per common year */

/*
 * The 48T02 uses year % 4 to figure out if
 * we have a leap year, we do the same here.
 */
#define	SECYEAR(yr)	((((unsigned)(yr) % 4) == 0)? SECYR + SECDAY : SECYR)

/*
 * The year register counts from 0 to 99.
 * Unix time is the number of seconds
 * since the year YRREF.  The 2 digit year
 * value stored in the chip represents the
 * the number of years beyond YRBASE.
 * Note that YRBASE must be < YRREF and
 * (YRBASE % 4) == 0 to do leap years correct.
 * Note that we can only keep time up to the year 2068.
 */
#define	YRREF		70	/* 1970 - where UNIX time begins */
#define	YRBASE		68	/* 1968 - what year 0 in chip represents */

#define	CLOCK_ADDR 0xFFFF87F8	/* virtual address we map clock to be at */

#ifndef LOCORE
struct mostek48T02 {
	u_char	clk_ctrl;	/* ctrl register */
	u_char	clk_sec;	/* counter - seconds 0-59 */
	u_char	clk_min;	/* counter - minutes 0-59 */
	u_char	clk_hour;	/* counter - hours 0-23 */
	u_char	clk_weekday;	/* counter - weekday 1-7 */
	u_char	clk_day;	/* counter - day 1-31 */
	u_char	clk_month;	/* counter - month 1-12 */
	u_char	clk_year;	/* counter - year 0-99 */
};
#define	CLOCK ((struct mostek48T02 *)(CLOCK_ADDR))
#endif !LOCORE

/*
 * Bit masks for various operations and register limits.
 */
#define	CLK_CTRL_WRITE		0x80
#define	CLK_CTRL_READ		0x40
#define	CLK_CTRL_SIGN		0x20

#define	CLK_STOP		0x80
#define	CLK_KICK		0x80
#define	CLK_FREQT		0x40

#define	CLK_MONTH_MASK		0x1f
#define	CLK_DAY_MASK		0x3f
#define	CLK_WEEKDAY_MASK	0x07
#define	CLK_HOUR_MASK		0x3f
#define	CLK_MIN_MASK		0x7f
#define	CLK_SEC_MASK		0x7f

#endif	/* !_sun4c_clock_h */
