diff options
| author | Simon Glass <sjg@chromium.org> | 2013-04-17 16:13:39 +0000 | 
|---|---|---|
| committer | Simon Glass <sjg@chromium.org> | 2013-05-13 13:33:21 -0700 | 
| commit | d0b6f247a1e7ffd06d931ca4088426134dc4e546 (patch) | |
| tree | 6fb11d15dfddb6223291ef7c48fdcb4da591cacc /arch/x86/lib/pcat_timer.c | |
| parent | f9083bbe784cb03940b094afe4db0bf94f312f2b (diff) | |
| download | olio-uboot-2014.01-d0b6f247a1e7ffd06d931ca4088426134dc4e546.tar.xz olio-uboot-2014.01-d0b6f247a1e7ffd06d931ca4088426134dc4e546.zip | |
x86: Re-enable PCAT timer 2 for beeping
While we don't want PCAT timers for timing, we want timer 2 so that we can
still make a beep. Re-purpose the PCAT driver for this, and enable it in
coreboot.
Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'arch/x86/lib/pcat_timer.c')
| -rw-r--r-- | arch/x86/lib/pcat_timer.c | 69 | 
1 files changed, 3 insertions, 66 deletions
| diff --git a/arch/x86/lib/pcat_timer.c b/arch/x86/lib/pcat_timer.c index b0b6637f3..1ca3eb9e9 100644 --- a/arch/x86/lib/pcat_timer.c +++ b/arch/x86/lib/pcat_timer.c @@ -24,83 +24,20 @@  #include <common.h>  #include <asm/io.h>  #include <asm/i8254.h> -#include <asm/ibmpc.h> -#include <asm/interrupt.h> -#define TIMER0_VALUE 0x04aa /* 1kHz 1.9318MHz / 1000 */  #define TIMER2_VALUE 0x0a8e /* 440Hz */ -static int timer_init_done; - -int timer_init(void) +int pcat_timer_init(void)  { -	/* initialize timer 0 and 2 -	 * -	 * Timer 0 is used to increment system_tick 1000 times/sec -	 * Timer 1 was used for DRAM refresh in early PC's -	 * Timer 2 is used to drive the speaker +	/* +	 * initialize 2, used to drive the speaker  	 * (to start a beep: write 3 to port 0x61,  	 * to stop it again: write 0)  	 */ -	outb(PIT_CMD_CTR0 | PIT_CMD_BOTH | PIT_CMD_MODE2, -			PIT_BASE + PIT_COMMAND); -	outb(TIMER0_VALUE & 0xff, PIT_BASE + PIT_T0); -	outb(TIMER0_VALUE >> 8, PIT_BASE + PIT_T0); -  	outb(PIT_CMD_CTR2 | PIT_CMD_BOTH | PIT_CMD_MODE3,  			PIT_BASE + PIT_COMMAND);  	outb(TIMER2_VALUE & 0xff, PIT_BASE + PIT_T2);  	outb(TIMER2_VALUE >> 8, PIT_BASE + PIT_T2); -	irq_install_handler(0, timer_isr, NULL); -	unmask_irq(0); - -	timer_init_done = 1; -  	return 0;  } - -static u16 read_pit(void) -{ -	u8 low; - -	outb(PIT_CMD_LATCH, PIT_BASE + PIT_COMMAND); -	low = inb(PIT_BASE + PIT_T0); - -	return (inb(PIT_BASE + PIT_T0) << 8) | low; -} - -/* this is not very exact */ -void __udelay(unsigned long usec) -{ -	int counter; -	int wraps; - -	if (timer_init_done) { -		counter = read_pit(); -		wraps = usec / 1000; -		usec = usec % 1000; - -		usec *= 1194; -		usec /= 1000; -		usec += counter; - -		while (usec > 1194) { -			usec -= 1194; -			wraps++; -		} - -		while (1) { -			int new_count = read_pit(); - -			if (((new_count < usec) && !wraps) || wraps < 0) -				break; - -			if (new_count > counter) -				wraps--; - -			counter = new_count; -		} -	} - -} |