1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-29 16:44:03 +00:00

MFi386: BURN_BRIDGES around timer0 functions

This commit is contained in:
Peter Wemm 2003-09-30 06:38:11 +00:00
parent 3c4d5e1546
commit ec548f97fc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=120596
2 changed files with 17 additions and 3 deletions

View File

@ -30,9 +30,11 @@ extern int wall_cmos_clock;
*/ */
struct clockframe; struct clockframe;
#ifndef BURN_BRIDGES
int acquire_timer0(int rate, void (*function)(struct clockframe *frame)); int acquire_timer0(int rate, void (*function)(struct clockframe *frame));
int acquire_timer2(int mode);
int release_timer0(void); int release_timer0(void);
#endif
int acquire_timer2(int mode);
int release_timer2(void); int release_timer2(void);
int rtcin(int val); int rtcin(int val);
int sysbeep(int pitch, int period); int sysbeep(int pitch, int period);

View File

@ -92,6 +92,7 @@ __FBSDID("$FreeBSD$");
#define TIMER_DIV(x) ((timer_freq + (x) / 2) / (x)) #define TIMER_DIV(x) ((timer_freq + (x) / 2) / (x))
#ifndef BURN_BRIDGES
/* /*
* Time in timer cycles that it takes for microtime() to disable interrupts * Time in timer cycles that it takes for microtime() to disable interrupts
* and latch the count. microtime() currently uses "cli; outb ..." so it * and latch the count. microtime() currently uses "cli; outb ..." so it
@ -107,6 +108,7 @@ __FBSDID("$FreeBSD$");
* before the next timer interrupt. * before the next timer interrupt.
*/ */
#define TIMER0_MAX_FREQ 20000 #define TIMER0_MAX_FREQ 20000
#endif
int adjkerntz; /* local offset from GMT in seconds */ int adjkerntz; /* local offset from GMT in seconds */
int clkintr_pending; int clkintr_pending;
@ -128,6 +130,7 @@ static u_int hardclock_max_count;
static u_int32_t i8254_lastcount; static u_int32_t i8254_lastcount;
static u_int32_t i8254_offset; static u_int32_t i8254_offset;
static int i8254_ticked; static int i8254_ticked;
#ifndef BURN_BRIDGES
/* /*
* XXX new_function and timer_func should not handle clockframes, but * XXX new_function and timer_func should not handle clockframes, but
* timer_func currently needs to hold hardclock to handle the * timer_func currently needs to hold hardclock to handle the
@ -136,9 +139,11 @@ static int i8254_ticked;
*/ */
static void (*new_function)(struct clockframe *frame); static void (*new_function)(struct clockframe *frame);
static u_int new_rate; static u_int new_rate;
static u_int timer0_prescaler_count;
static u_char timer0_state;
#endif
static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF; static u_char rtc_statusa = RTCSA_DIVIDER | RTCSA_NOPROF;
static u_char rtc_statusb = RTCSB_24HR | RTCSB_PINTR; static u_char rtc_statusb = RTCSB_24HR | RTCSB_PINTR;
static u_int timer0_prescaler_count;
/* Values for timerX_state: */ /* Values for timerX_state: */
#define RELEASED 0 #define RELEASED 0
@ -146,7 +151,6 @@ static u_int timer0_prescaler_count;
#define ACQUIRED 2 #define ACQUIRED 2
#define ACQUIRE_PENDING 3 #define ACQUIRE_PENDING 3
static u_char timer0_state;
static u_char timer2_state; static u_char timer2_state;
static void (*timer_func)(struct clockframe *frame) = hardclock; static void (*timer_func)(struct clockframe *frame) = hardclock;
@ -177,6 +181,7 @@ clkintr(struct clockframe frame)
mtx_unlock_spin(&clock_lock); mtx_unlock_spin(&clock_lock);
} }
timer_func(&frame); timer_func(&frame);
#ifndef BURN_BRIDGES
switch (timer0_state) { switch (timer0_state) {
case RELEASED: case RELEASED:
@ -222,8 +227,10 @@ clkintr(struct clockframe frame)
} }
break; break;
} }
#endif
} }
#ifndef BURN_BRIDGES
/* /*
* The acquire and release functions must be called at ipl >= splclock(). * The acquire and release functions must be called at ipl >= splclock().
*/ */
@ -259,6 +266,7 @@ acquire_timer0(int rate, void (*function)(struct clockframe *frame))
old_rate = new_rate = rate; old_rate = new_rate = rate;
return (0); return (0);
} }
#endif
int int
acquire_timer2(int mode) acquire_timer2(int mode)
@ -280,6 +288,7 @@ acquire_timer2(int mode)
return (0); return (0);
} }
#ifndef BURN_BRIDGES
int int
release_timer0() release_timer0()
{ {
@ -299,6 +308,7 @@ release_timer0()
} }
return (0); return (0);
} }
#endif
int int
release_timer2() release_timer2()
@ -931,8 +941,10 @@ sysctl_machdep_i8254_freq(SYSCTL_HANDLER_ARGS)
freq = timer_freq; freq = timer_freq;
error = sysctl_handle_int(oidp, &freq, sizeof(freq), req); error = sysctl_handle_int(oidp, &freq, sizeof(freq), req);
if (error == 0 && req->newptr != NULL) { if (error == 0 && req->newptr != NULL) {
#ifndef BURN_BRIDGES
if (timer0_state != RELEASED) if (timer0_state != RELEASED)
return (EBUSY); /* too much trouble to handle */ return (EBUSY); /* too much trouble to handle */
#endif
set_timer_freq(freq, hz); set_timer_freq(freq, hz);
i8254_timecounter.tc_frequency = freq; i8254_timecounter.tc_frequency = freq;
} }