 c4845474a0
			
		
	
	
	c4845474a0
	
	
	
		
			
			Simplified hierarchy under rm directory to a flat directory because it is not anymore really justified to have own directory for wakeup code. It only adds more complexity. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@intel.com> Link: http://lkml.kernel.org/r/1336501366-28617-20-git-send-email-jarkko.sakkinen@intel.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "wakeup.h"
 | |
| #include "boot.h"
 | |
| 
 | |
| static void udelay(int loops)
 | |
| {
 | |
| 	while (loops--)
 | |
| 		io_delay();	/* Approximately 1 us */
 | |
| }
 | |
| 
 | |
| static void beep(unsigned int hz)
 | |
| {
 | |
| 	u8 enable;
 | |
| 
 | |
| 	if (!hz) {
 | |
| 		enable = 0x00;		/* Turn off speaker */
 | |
| 	} else {
 | |
| 		u16 div = 1193181/hz;
 | |
| 
 | |
| 		outb(0xb6, 0x43);	/* Ctr 2, squarewave, load, binary */
 | |
| 		io_delay();
 | |
| 		outb(div, 0x42);	/* LSB of counter */
 | |
| 		io_delay();
 | |
| 		outb(div >> 8, 0x42);	/* MSB of counter */
 | |
| 		io_delay();
 | |
| 
 | |
| 		enable = 0x03;		/* Turn on speaker */
 | |
| 	}
 | |
| 	inb(0x61);		/* Dummy read of System Control Port B */
 | |
| 	io_delay();
 | |
| 	outb(enable, 0x61);	/* Enable timer 2 output to speaker */
 | |
| 	io_delay();
 | |
| }
 | |
| 
 | |
| #define DOT_HZ		880
 | |
| #define DASH_HZ		587
 | |
| #define US_PER_DOT	125000
 | |
| 
 | |
| /* Okay, this is totally silly, but it's kind of fun. */
 | |
| static void send_morse(const char *pattern)
 | |
| {
 | |
| 	char s;
 | |
| 
 | |
| 	while ((s = *pattern++)) {
 | |
| 		switch (s) {
 | |
| 		case '.':
 | |
| 			beep(DOT_HZ);
 | |
| 			udelay(US_PER_DOT);
 | |
| 			beep(0);
 | |
| 			udelay(US_PER_DOT);
 | |
| 			break;
 | |
| 		case '-':
 | |
| 			beep(DASH_HZ);
 | |
| 			udelay(US_PER_DOT * 3);
 | |
| 			beep(0);
 | |
| 			udelay(US_PER_DOT);
 | |
| 			break;
 | |
| 		default:	/* Assume it's a space */
 | |
| 			udelay(US_PER_DOT * 3);
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void main(void)
 | |
| {
 | |
| 	/* Kill machine if structures are wrong */
 | |
| 	if (wakeup_header.real_magic != 0x12345678)
 | |
| 		while (1)
 | |
| 			;
 | |
| 
 | |
| 	if (wakeup_header.realmode_flags & 4)
 | |
| 		send_morse("...-");
 | |
| 
 | |
| 	if (wakeup_header.realmode_flags & 1)
 | |
| 		asm volatile("lcallw   $0xc000,$3");
 | |
| 
 | |
| 	if (wakeup_header.realmode_flags & 2) {
 | |
| 		/* Need to call BIOS */
 | |
| 		probe_cards(0);
 | |
| 		set_mode(wakeup_header.video_mode);
 | |
| 	}
 | |
| }
 |