Remove hardcoded values for HZ (under different names!) from mcclock.c

and clock_machdep.h, so that now HZ can be any supported frequency of
the mc146818a/ds1287a RTCs.
Tested at 256Hz and 2048Hz.
This commit is contained in:
simonb 2001-11-23 01:04:11 +00:00
parent d1be3cca41
commit 1b1e4bd3d1
3 changed files with 70 additions and 81 deletions

View File

@ -1,57 +0,0 @@
/* $NetBSD: clock_machdep.h,v 1.5 2000/01/09 15:34:42 ad Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Jonathan Stone.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* System-dependent clock declarations for the ``cpu-independent''
* clock interface.
*
* This file must prototype or define the following functions or
* macros (one or more of which may be no-ops):
*
* CLOCK_RATE default rate at which clock runs. Some platforms
* run the RTC at a fixed rate, independent of
* the acutal RTC hardware in use. clock
*/
#ifndef _PMAX_CLOCK_MACHDEP_H_
#define _PMAX_CLOCK_MACHDEP_H_
/* The default clock rate on a pmax is 256 Hz. */
#define CLOCK_RATE 256
#endif /* !_PMAX_CLOCK_MACHDEP_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: clock.c,v 1.31 2000/06/04 19:14:54 cgd Exp $ */
/* $NetBSD: clock.c,v 1.32 2001/11/23 01:04:11 simonb Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@ -44,7 +44,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.31 2000/06/04 19:14:54 cgd Exp $");
__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.32 2001/11/23 01:04:11 simonb Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@ -52,8 +52,6 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.31 2000/06/04 19:14:54 cgd Exp $");
#include <dev/clock_subr.h>
#include <machine/clock_machdep.h>
#include <dev/dec/clockvar.h>
#include "opt_ntp.h"
@ -113,20 +111,6 @@ cpu_initclocks()
if (clockfns == NULL)
panic("cpu_initclocks: no clock attached");
hz = CLOCK_RATE; /* 256 Hz clock */
tick = 1000000 / hz; /* number of microseconds between interrupts */
tickfix = 1000000 - (hz * tick);
#ifdef NTP
fixtick = tickfix;
#endif
if (tickfix) {
int ftp;
ftp = min(ffs(tickfix), ffs(hz));
tickfix >>= (ftp - 1);
tickfixinterval = hz >> (ftp - 1);
}
/*
* Establish the clock interrupt; it's a special case.
*
@ -144,6 +128,23 @@ cpu_initclocks()
* Get the clock started.
*/
(*clockfns->cf_init)(clockdev);
/*
* Set hz-related variables after the clock is initialised in
* case the initialisation routines adjusted hz.
*/
tick = 1000000 / hz; /* number of microseconds between interrupts */
tickfix = 1000000 - (hz * tick);
#ifdef NTP
fixtick = tickfix;
#endif
if (tickfix) {
int ftp;
ftp = min(ffs(tickfix), ffs(hz));
tickfix >>= (ftp - 1);
tickfixinterval = hz >> (ftp - 1);
}
}
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: mcclock.c,v 1.13 2001/11/13 12:49:45 lukem Exp $ */
/* $NetBSD: mcclock.c,v 1.14 2001/11/23 01:04:11 simonb Exp $ */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: mcclock.c,v 1.13 2001/11/13 12:49:45 lukem Exp $");
__KERNEL_RCSID(0, "$NetBSD: mcclock.c,v 1.14 2001/11/23 01:04:11 simonb Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@ -40,13 +40,13 @@ __KERNEL_RCSID(0, "$NetBSD: mcclock.c,v 1.13 2001/11/13 12:49:45 lukem Exp $");
#include <dev/ic/mc146818reg.h>
/*
* XXX rate is machine-dependent.
* XXX default rate is machine-dependent.
*/
#ifdef __alpha__
#define MC_DFEAULTRATE MC_RATE_1024_Hz
#define MC_DFEAULTHZ 1024
#endif
#ifdef pmax
#define MC_DEFAULTRATE MC_RATE_256_Hz
#define MC_DEFAULTHZ 256
#endif
@ -84,10 +84,55 @@ mcclock_init(dev)
struct device *dev;
{
struct mcclock_softc *sc = (struct mcclock_softc *)dev;
int rate;
mc146818_write(sc, MC_REGA, MC_BASE_32_KHz | MC_DEFAULTRATE);
printf("%s: try to set hz to %d\n", sc->sc_dev.dv_xname, hz);
again:
switch (hz) {
case 32:
rate = MC_BASE_32_KHz | MC_RATE_32_Hz;
break;
case 64:
rate = MC_BASE_32_KHz | MC_RATE_64_Hz;
break;
case 128:
rate = MC_BASE_32_KHz | MC_RATE_128_Hz;
break;
case 256:
rate = MC_BASE_32_KHz | MC_RATE_256_Hz;
break;
case 512:
rate = MC_BASE_32_KHz | MC_RATE_512_Hz;
break;
case 1024:
rate = MC_BASE_32_KHz | MC_RATE_1024_Hz;
break;
case 2048:
rate = MC_BASE_32_KHz | MC_RATE_2048_Hz;
break;
case 4096:
rate = MC_BASE_32_KHz | MC_RATE_4096_Hz;
break;
case 8192:
rate = MC_BASE_32_KHz | MC_RATE_8192_Hz;
break;
case 16384:
rate = MC_BASE_4_MHz | MC_RATE_1;
break;
case 32768:
rate = MC_BASE_4_MHz | MC_RATE_2;
break;
default:
printf("%s: Cannot get %d Hz clock; using %d Hz\n",
sc->sc_dev.dv_xname, hz, MC_DEFAULTHZ);
hz = MC_DEFAULTHZ;
goto again;
}
mc146818_write(sc, MC_REGA, rate);
mc146818_write(sc, MC_REGB,
MC_REGB_PIE | MC_REGB_SQWE | MC_REGB_BINARY | MC_REGB_24HR);
printf("%s: hz set to %d\n", sc->sc_dev.dv_xname, hz);
}
/*