diff -urN linux-2.6.19/arch/i386/Kconfig linux-2.6.19.new/arch/i386/Kconfig --- linux-2.6.19/arch/i386/Kconfig 2006-11-29 22:57:37.000000000 +0100 +++ linux-2.6.19.new/arch/i386/Kconfig 2006-12-17 17:13:33.000000000 +0100 @@ -180,6 +180,14 @@ Only choose this option if you have such a system, otherwise you should say N here. +config X86_RDC + bool "Support for RDC 3211 boards" + help + Support for RDC 3211 systems. Say 'Y' here if the kernel is + supposed to run on an IA-32 RDC R3211 system. + Only choose this option if you have such as system, otherwise you + should say N here. + endchoice config ACPI_SRAT diff -urN linux-2.6.19/arch/i386/Makefile linux-2.6.19.new/arch/i386/Makefile --- linux-2.6.19/arch/i386/Makefile 2006-11-29 22:57:37.000000000 +0100 +++ linux-2.6.19.new/arch/i386/Makefile 2006-12-17 17:13:33.000000000 +0100 @@ -92,6 +92,10 @@ mflags-$(CONFIG_X86_ES7000) := -Iinclude/asm-i386/mach-es7000 mcore-$(CONFIG_X86_ES7000) := mach-default core-$(CONFIG_X86_ES7000) := arch/i386/mach-es7000/ +# RDC subarch support +mflags-$(CONFIG_X86_RDC) := -Iinclude/asm-i386/mach-generic +mcore-$(CONFIG_X86_RDC) := mach-default +core-$(CONFIG_X86_RDC) += arch/i386/mach-rdc/ # default subarch .h files mflags-y += -Iinclude/asm-i386/mach-default diff -urN linux-2.6.19/arch/i386/mach-rdc/Makefile linux-2.6.19.new/arch/i386/mach-rdc/Makefile --- linux-2.6.19/arch/i386/mach-rdc/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.19.new/arch/i386/mach-rdc/Makefile 2006-12-17 17:13:33.000000000 +0100 @@ -0,0 +1,5 @@ +# +# Makefile for the linux kernel. +# + +obj-$(CONFIG_X86_RDC) := led.o diff -urN linux-2.6.19/arch/i386/mach-rdc/led.c linux-2.6.19.new/arch/i386/mach-rdc/led.c --- linux-2.6.19/arch/i386/mach-rdc/led.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.19.new/arch/i386/mach-rdc/led.c 2006-12-17 17:13:33.000000000 +0100 @@ -0,0 +1,743 @@ +/* + * LED interface for WP3200 + * + * Copyright (C) 2002, by Allen Hung + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "led.h" + +#define BUF_LEN 30 + +struct LED_DATA { + char sts_buf[BUF_LEN+1]; + unsigned long sts; +}; + +struct LED_DATA led_data[LED_DEV_NUM]; +// sam +unsigned long ul_ledstat = 0xffffffff; + + +static struct timer_list blink_timer[LED_DEV_NUM]; +// sam 01-30-2004 for watchdog +static struct timer_list watchdog; +// end sam +static char cmd_buf[BUF_LEN+1]; + +//------------------------------------------------------------ +static long atoh(char *p) +{ + long v = 0, c; + while ( (c = *p++) ) { + if ( c >= '0' && c <= '9' ) v = (v << 4) + c - '0'; + else if ( c >= 'a' && c <= 'f' ) v = (v << 4) + c - 'a' + 0xA; + else if ( c >= 'A' && c <= 'F' ) v = (v << 4) + c - 'A' + 0xA; + else break; + } + return v; +} + +static int reset_flash_default(void *data) +{ + char *argv[3], *envp[1] = {NULL}; + int i = 0; + + int reset_default=(int) data; + + argv[i++] = "/bin/flash"; + argv[i++] = "default"; + argv[i] = NULL; + if(reset_default) + if (call_usermodehelper(argv[0], argv, envp, 1)) + printk("failed to Reset to default\n"); + machine_restart(0); + return 0; +} + +// sam for ps 3205U -- using CSx1 (0xb0e00000) +// bit map as following +// BIT 1 2 3 4 5 +// POWER WLEN PORT1 PORT2 PORT3 +// +// value 0 --> led on +// value 1 --> led off + +#define _ROUTER_ + +#ifdef _ROUTER_ + #define LED_VAL 0x8000384C // the data ofset of gpio 0~30 +#else + #define LED_VAL 0x80003888 // the ofset of gpio 31~58 +#endif +#define GPIO_VAL 0x8000384C // the offset of gpio 0-30 + + + +// sam 1-30-2004 LED status +// bit map as following +// BIT 4:0 Link status -->PHY Link ->1 = up, 0 = down +#define LINK_STATUS (*(unsigned long *)0xb2000014) +#define WATCHDOG_VAL (*(unsigned long *)0xb20000c0) +#define WATCHDOG_PERIOD 500 // unit ms +#define EXPIRE_TIME 300 // unit 10 ms +#define CLEAR_TIMEER 0xffffa000l // bit 14:0 -> count up timer, write 0 to clear +#define ENABLE_WATCHDOG 0x80000000l // bit 31 -> 1 enable , 0 disable watchdog +#define WATCHDOG_SET_TMR_SHIFT 16 // bit 16:30 -> watchdog timer set +// end sam + + +//------------------------------------------------------------ +static void turn_led(int id, int on) +{ + unsigned long led_bit = 1 << (id); + unsigned long led_bit_val; + + // since we define we have 8 led devices and use gpio 53, 55, 57, 58 + // which locate at bit21~26, so we rotate left 20bit + +#ifdef _ROUTER_ + led_bit_val = led_bit; +#else + led_bit_val = led_bit << 20; +#endif + + switch ( on ) { + case 0: + ul_ledstat|= led_bit_val; + outl(LED_VAL, 0xcf8); + outl(ul_ledstat, 0xcfc); + break; // LED OFF + case 1: + ul_ledstat &= ~led_bit_val; + outl(LED_VAL, 0xcf8); + outl(ul_ledstat, 0xcfc); + break; // LED ON + case 2: + ul_ledstat ^= led_bit_val; + outl(LED_VAL, 0xcf8); + outl(ul_ledstat, 0xcfc); + break; // LED inverse + } +} + + +static int led_flash[30]={20,10,100,5,5,150,100,5,5,50,20,50,50,20,60,5,20,10,30,10,5,10,50,2,5,5,5,70,10,50};//Erwin +static unsigned int wlan_counter; //Erwin +static void blink_wrapper(u_long id) +{ + u_long sts = led_data[id].sts; + + if ( (sts & LED_BLINK_CMD) == LED_BLINK_CMD ) { + unsigned long period = sts & LED_BLINK_PERIOD; + if(period == 0xffff) // BLINK random + { + blink_timer[id].expires = jiffies + 3*led_flash[wlan_counter%30]*HZ/1000; + wlan_counter++; + } + else + blink_timer[id].expires = jiffies + (period * HZ / 1000); + turn_led(id, 2); + add_timer(&blink_timer[id]); + } + else if ( sts == LED_ON || sts == LED_OFF ) + turn_led(id, sts==LED_ON ? 1 : 0); +} +//------------------------------------------------------------ +static void get_token_str(char *str, char token[][21], int token_num) +{ + int t, i; + + for ( t = 0 ; t < token_num ; t++ ) { + memset(token[t], 0, 21); + while ( *str == ' ' ) str++; + for ( i = 0 ; str[i] ; i++ ) { + if ( str[i] == '\t' || str[i] == ' ' || str[i] == '\n' ) break; + if ( i < 20 ) token[t][i] = str[i]; + } + str += i; + } +} + +//------------------------------------------------------------ +static void set_led_status_by_str(int id) +{ + char token[3][21], *p; + + + get_token_str(led_data[id].sts_buf, token, 3); + + if ( strcmp(token[0], "LED") ) + { + goto set_led_off; + } + if ( !strcmp(token[1], "ON") ) + { + + turn_led(id, 1); + led_data[id].sts = LED_ON; + } + else if ( !strcmp(token[1], "OFF") ) + { + + goto set_led_off; + } + else if ( !strcmp(token[1], "BLINK") ) + { + unsigned int period = 0; + p = token[2]; + if ( !strcmp(p, "FAST") ) + period = LED_BLINK_FAST & LED_BLINK_PERIOD; + else if ( !strcmp(p, "SLOW") ) + period = LED_BLINK_SLOW & LED_BLINK_PERIOD; + else if ( !strcmp(p, "EXTRA_SLOW") ) + period = LED_BLINK_EXTRA_SLOW & LED_BLINK_PERIOD; + else if ( !strcmp(p, "RANDOM") ) + period = LED_BLINK_RANDOM & LED_BLINK_PERIOD; + else if ( !strcmp(p, "OFF") ) + goto set_led_off; + else if ( *p >= '0' && *p <= '9' ) + { + while ( *p >= '0' && *p <= '9' ) + period = period * 10 + (*p++) - '0'; +// if ( period > 10000 ) +// period = 10000; + } + else + period = LED_BLINK & LED_BLINK_PERIOD; + + if ( period == 0 ) + goto set_led_off; + + sprintf(led_data[id].sts_buf, "LED BLINK %d\n", period); + led_data[id].sts = LED_BLINK_CMD + period; + turn_led(id, 2); + // Set timer for next blink + del_timer(&blink_timer[id]); + blink_timer[id].function = blink_wrapper; + blink_timer[id].data = id; + init_timer(&blink_timer[id]); + + blink_timer[id].expires = jiffies + (1000 * HZ / 1000); + + add_timer(&blink_timer[id]); + } + else + { + goto set_led_off; + } + return; + set_led_off: + strcpy(led_data[id].sts_buf, "LED OFF\n"); + led_data[id].sts = LED_OFF; + turn_led(id, 0); +} + +//---------------------------------------------------------------------- +static int led_read_proc(char *buf, char **start, off_t fpos, int length, int *eof, void *data) +{ + int len, dev; + + for ( len = dev = 0 ; dev < LED_DEV_NUM ; dev++ ) { + len += sprintf(buf+len, "%d: %s", dev, led_data[dev].sts_buf); + } + len = strlen(buf) - fpos; + if ( len <= 0 ) { + *start = buf; + *eof = 1; + return 0; + } + *start = buf + fpos; + if ( len <= length ) *eof = 1; + return len < length ? len : length; +} + +//---------------------------------------------------------------------- +static int led_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) +{ + int id = (int)file->private_data; + + switch ( cmd ) { + case LED_ON: + strcpy(led_data[id].sts_buf, "LED ON\n"); + set_led_status_by_str(id); + break; + case LED_OFF: + strcpy(led_data[id].sts_buf, "LED OFF\n"); + set_led_status_by_str(id); + break; + default: + if ( (cmd & LED_BLINK_CMD) != LED_BLINK_CMD ) + { + break; + } + case LED_BLINK: + case LED_BLINK_FAST: + case LED_BLINK_SLOW: + case LED_BLINK_EXTRA_SLOW: + case LED_BLINK_RANDOM: + sprintf(led_data[id].sts_buf, "LED BLINK %d\n", (int)(cmd & LED_BLINK_PERIOD)); + set_led_status_by_str(id); + break; + } + return 0; +} + +static int led_open(struct inode *inode, struct file *file) +{ + int led_id = MINOR(inode->i_rdev); +// unsigned long led_bit = 1 << (led_id); + + if ( led_id >= LED_DEV_NUM ) + return -ENODEV; +/* sam 12/02/2003 + GPIO_SEL_I_O &= ~led_bit; // 0 to GPIO + GPIO_O_EN |= (led_bit << 16); // 0 to Output +*/ + + file->private_data = (void*)led_id; + return 0; +} + +static long led_read(struct file *file, char *buf, size_t count, loff_t *fpos) +{ + int rem, len; + int id = (int)file->private_data; + char *p = led_data[id].sts_buf; + + len = strlen(p); + rem = len - *fpos; + if ( rem <= 0 ) { + *fpos = len; + return 0; + } + if ( rem > count ) rem = count; + memcpy(buf, p+(*fpos), rem); + *fpos += rem; + return rem; +} + +static long led_write(struct file *file, char *buf, size_t count, loff_t *fpos) +{ + int len; + int id = (int)file->private_data; + char *p = id == REG_MINOR ? cmd_buf : led_data[id].sts_buf; + memset(p, 0, BUF_LEN); + + p += *fpos; + len = 0; + + + while ( count > 0 ) + { + + if ( *fpos < BUF_LEN ) + { + int c = *buf++; + p[len] = c>='a' && c<='z' ? c-'a'+'A' : c; + } + (*fpos)++; + len++; + count--; + } + // sam + set_led_status_by_str(id); + (*fpos) = 0; + // + + return len; +} + +static int led_flush(struct file *file) +{ + int id = (int)file->private_data; + + if ( file->f_mode & FMODE_WRITE ) + { + set_led_status_by_str(id); + } + return 0; +} + +static struct file_operations led_fops = { + read: led_read, + write: led_write, + flush: led_flush, + ioctl: led_ioctl, + open: led_open, +}; + +//---------------------------------------------- +static unsigned long *reg_addr; +static int dump_len; + +static int dump_content(char *buf) +{ + return 0; +} + +static long gpio_read(struct file *file, char *buf, size_t count, loff_t *fpos) +{ + int rem, len; + int id = (int)file->private_data; + char temp[80*10]; + unsigned long gpio_regval =0; + + outl(GPIO_VAL, 0xcf8); + gpio_regval = inl(0xcfc); + gpio_regval |= 0x40; + outl(gpio_regval, 0xcfc); // each in, need out 1 first + gpio_regval = inl(0xcfc); + + + // sam debug + //printk(KERN_ERR "gpio_id:%d, gpio_regval:%08X\n", id, gpio_regval); + //end sam + + if ( id < GPIO_DEV_NUM ) { + int gpio_bit = 1 << id; + + len = sprintf(temp, "%d\n", (gpio_regval & gpio_bit) ? 1 : 0); + } + else // REG device + len = dump_content(temp); + rem = len - *fpos; + if ( rem <= 0 ) { + *fpos = len; + return 0; + } + if ( rem > count ) rem = count; + memcpy(buf, temp+(*fpos), rem); + *fpos += rem; + return rem; +} + +static int gpio_flush(struct file *file) +{ + return 0; +} + +static int gpio_open(struct inode *inode, struct file *file) +{ + int id = MINOR(inode->i_rdev); + if ( id >= GPIO_DEV_NUM && id != REG_MINOR ) + return -ENODEV; + file->private_data = (void*)id; + return 0; +} + +static struct file_operations gpio_fops = { + read: gpio_read, + open: gpio_open, + flush: gpio_flush, + write: led_write, +}; + +// --------------------------------------------- +// sam 1-30-2004 LAN_STATUS Device + +//static unsigned long *reg_addr; +//static int dump_len; + +//static int lanSt_content(char *buf) +//{ +// int i, j, len; +// unsigned long *p = (unsigned long *)0xb2000014; // PHY_ST +// // j = dump_len/4 + ((dump_len&3) ? 1 : 0); +// len = sprintf(buf, "Reg Addr = %08lX, Value = \n", (unsigned long)p); +// // for ( i = 0 ; i < j ; i++, p++ ) +// len += sprintf(buf+len,"%08lX\n", *p); + +// return len; +//} + +#define MAC_IOBASE 0xe800 // Eth0 +#define PHY_ADDR 1 // For Eth0 +#define MII_STATUS_ADDR 1 +// where "id" value means which bit of PHY reg 1 we want to check +static long lanSt_read(struct file *file, char *buf, size_t count, loff_t *fpos) +{ + int rem, len; +// unsigned long *p = (unsigned long *)0xb2000014; // PHY_ST + unsigned short status; + unsigned int i = 0; + int id = (int)file->private_data; + char temp[80*10]; + + outw(0x2000 + MII_STATUS_ADDR + (PHY_ADDR << 8), MAC_IOBASE + 0x20); + do{}while( (i++ < 2048) && (inw(MAC_IOBASE+0x20) & 0x2000) ); + + status = inw(MAC_IOBASE + 0x24); + + // sam debug + //printk(KERN_ERR "PHY REG1 Status:%04x\n", status ); + // end sam + + if ( id < LAN_DEV_NUM ) { + unsigned long lanSt_bit = 1 << id; +// len = lanSt_content(temp); + len = sprintf(temp, "%d\n",(status & lanSt_bit) ? 1 : 0); + } + else // REG device + { + len = sprintf(temp, "-1\n"); + } + rem = len - *fpos; + if ( rem <= 0 ) { + *fpos = len; + return 0; + } + if ( rem > count ) rem = count; + memcpy(buf, temp+(*fpos), rem); + *fpos += rem; + return rem; +} + +static int lanSt_flush(struct file *file) +{ + return 0; +} + +static int lanSt_open(struct inode *inode, struct file *file) +{ + int id = MINOR(inode->i_rdev); + if ( id >= LAN_DEV_NUM && id != REG_MINOR ) + return -ENODEV; + file->private_data = (void*)id; + return 0; +} + +static struct file_operations lanSt_fops = { + read: lanSt_read, + open: lanSt_open, + flush: lanSt_flush, + write: led_write, +}; + +//---------------------------------------------- +static int SwResetPress = 0; +static int SwResetCounter = 0; +static int RebootFlag = 0; +static void watchdog_wrapper(unsigned int period) +{ + // { RexHua add for restore default, by press SwReset 5 second, 2 sec to restart +#if 0 // + u_long reg; + + outl(GPIO_VAL, 0xcf8); + reg = inl(0xcfc); + reg |= 0x40; + outl(reg, 0xcfc); // each in, need out 1 first + reg = inl(0xcfc); + + if( (reg & 0x40) == 0) + { + if(SwResetPress == 0) + { + SwResetCounter=0; + strcpy(led_data[15].sts_buf, "LED BLINK 500\n" ); + set_led_status_by_str(15); + } + SwResetPress=1; + printk("SwReset press!\n"); + + } + else + { + if(SwResetPress=1) + { + strcpy(led_data[15].sts_buf, "LED ON\n" ); + set_led_status_by_str(15); + } + + SwResetPress=0; + if(RebootFlag == 1) + machine_restart(0); + } + + if(SwResetPress == 1) + { + if(SwResetCounter > 10) + { + turn_led(15, 0); +// kernel_thread(reset_flash_default, 1, SIGCHLD); + reset_flash_default(1); + turn_led(15, 1); + } + else if(SwResetCounter == 3) + { + RebootFlag=1; + strcpy(led_data[15].sts_buf, "LED BLINK 100\n" ); + set_led_status_by_str(15); + } + } + + SwResetCounter++; +#endif + + // clear timer count + outl(0x80003844, 0xcf8); + outl(0x00800080, 0xcfc); // enable watchdog and set the timeout = 1.34s + //printk(KERN_ERR "wdt\n" ); + watchdog.expires = jiffies + (period * HZ / 1000); + add_timer(&watchdog); +} + +//---------------------------------------------- +static int init_status; + +#define INIT_REGION 0x01 +#define INIT_LED_REGISTER 0x02 +#define INIT_LED_PROC_READ 0x04 +#define INIT_GPIO_REGISTER 0x08 +// sam 1-30-2004 LAN_STATUS +#define INIT_LAN_STATUS_REGISTER 0x10 +#define INIT_WATCHDOG_REGISTER 0x20 + +static void led_exit(void) +{ + int id; + for ( id = 0 ; id < LED_DEV_NUM ; id++ ) { + del_timer(&blink_timer[id]); + turn_led(id, 0); + } + if ( init_status & INIT_LED_PROC_READ ) + remove_proc_entry("driver/led", NULL); + + if ( init_status & INIT_LED_REGISTER ) + unregister_chrdev(LED_MAJOR, "led"); + + if ( init_status & INIT_GPIO_REGISTER ) + unregister_chrdev(GPIO_MAJOR, "gpio"); + // sam 1-30-2004 + + if( init_status & INIT_LAN_STATUS_REGISTER ) + unregister_chrdev(LAN_STATUS_MAJOR, "lanSt"); + + if( init_status & INIT_WATCHDOG_REGISTER) + del_timer(&watchdog); + + + // end sam + +} + +static int __init led_init(void) +{ + int result, id, i, j; + unsigned long reg; + init_status = 0; + + //----- register device (LED)------------------------- + + + result = register_chrdev(LED_MAJOR, "led", &led_fops); + if ( result < 0 ) { + printk(KERN_ERR "led: can't register char device\n" ); + led_exit(); + return result; + } + init_status |= INIT_LED_REGISTER; + //----- register device (GPIO)------------------------- + result = register_chrdev(GPIO_MAJOR, "gpio", &gpio_fops); + if ( result < 0 ) { + printk(KERN_ERR "gpio: can't register char device\n" ); + led_exit(); + return result; + } + init_status |= INIT_GPIO_REGISTER; + + // sam 1-30-2004 LAN Status + // ----- register device (LAN_STATUS)------------------- + + //--> sam 5-1802995 + + result = register_chrdev(LAN_STATUS_MAJOR, "lanSt", &lanSt_fops); + if ( result < 0 ) { + printk(KERN_ERR "lanSt: can't register char device\n" ); + led_exit(); + return result; + } + init_status |= INIT_LAN_STATUS_REGISTER; + + // <-- end sam + + // -----------init watchdog timer------------------------- + //del_timer(&blink_timer[id]); + + outl(0x80003840, 0xcf8); + reg = inl(0xcfc); + reg |= 0x1600; // ensable SRC bit + outl(reg, 0xcfc); +#ifdef _ROUTER_ + outl(0x80003848, 0xcf8); + reg = inl(0xcfc); + reg |= 0x18040; // enable GPIO, PowerLED:15, WLAN_LED0:16, SwReset:6 + outl(reg, 0xcfc); + + outl(0x8000384c, 0xcf8); + reg = inl(0xcfc); + reg |= 0x40; // output SwReset:6 1, Set SwReset as Input + outl(reg, 0xcfc); +#endif + // sam debug + //reg = inl(0xcfc); + //printk(KERN_ERR "REG40:%08X\n", reg); + // end sam + outl(0x80003844, 0xcf8); + outl(0x00800080, 0xcfc); // enable watchdog and set the timeout = 1.34s + + watchdog.function = watchdog_wrapper; + watchdog.data = WATCHDOG_PERIOD; + init_timer(&watchdog); + watchdog.expires = jiffies + (WATCHDOG_PERIOD * HZ / 1000); + add_timer(&watchdog); + init_status |= INIT_WATCHDOG_REGISTER; + + // end sam + //------ read proc ------------------- + if ( !create_proc_read_entry("driver/led", 0, 0, led_read_proc, NULL) ) { + printk(KERN_ERR "led: can't create /proc/driver/led\n"); + led_exit(); + return -ENOMEM; + } + init_status |= INIT_LED_PROC_READ; + //------------------------------ +// reg_addr = (unsigned long *)0xB4000000; +// dump_len = 4; + + for ( id = 0 ; id < LED_DEV_NUM ; id++ ) { + strcpy(led_data[id].sts_buf, "LED ON\n" ); + set_led_status_by_str(id); + } + +// for (i = 0; i < 0xffff; i++) +// for (j = 0; j < 0x6000; j++); + +/* sam 5-18-2005 remark + for ( id = 0 ; id < LED_DEV_NUM ; id++ ) { + strcpy(led_data[id].sts_buf, "LED ON\n" ); + set_led_status_by_str(id); + } +*/ + printk(KERN_INFO "LED & GPIO & LAN Status Driver LED_VERSION \n"); + return 0; +} + +module_init(led_init); +module_exit(led_exit); +EXPORT_NO_SYMBOLS; diff -urN linux-2.6.19/arch/i386/mach-rdc/led.h linux-2.6.19.new/arch/i386/mach-rdc/led.h --- linux-2.6.19/arch/i386/mach-rdc/led.h 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.19.new/arch/i386/mach-rdc/led.h 2006-12-17 17:13:33.000000000 +0100 @@ -0,0 +1,32 @@ +#ifndef _LED_H_INCLUDED +#define _LED_H_INCLUDED + +#include + +#define LED_VERSION "v1.0" +#define LED_MAJOR 166 +#define LED_DEV_NUM 32 +#define LED_GPIO_START 1 +#define GPIO_MAJOR 167 +#define GPIO_DEV_NUM 32 +#define REG_MINOR 128 +// sam 1-30-2004 for LAN_STATUS +#define LAN_STATUS_MAJOR 168 +#define LAN_DEV_NUM 5 +// end sam + +//#define GPIO_IO_BASE 0xB4002480 +//#define GPIO_IO_BASE ((unsigned long)0xb20000b8) +//#define GPIO_IO_EXTENT 0x40 + +#define LED_ON 0x010000 +#define LED_OFF 0x020000 +#define LED_BLINK_CMD 0x030000 +#define LED_BLINK_PERIOD 0x00FFFF +#define LED_BLINK (LED_BLINK_CMD|1000) +#define LED_BLINK_FAST (LED_BLINK_CMD|250) +#define LED_BLINK_SLOW (LED_BLINK_CMD|500) +#define LED_BLINK_EXTRA_SLOW (LED_BLINK_CMD|2000) +#define LED_BLINK_RANDOM (LED_BLINK_CMD|0xffff) + +#endif diff -urN linux-2.6.21.1/arch/i386/kernel/time.c linux-2.6.21.1.new/arch/i386/kernel/time.c --- linux-2.6.21.1/arch/i386/kernel/time.c 2007-04-27 23:49:26.000000000 +0200 +++ linux-2.6.21.1.new/arch/i386/kernel/time.c 2007-05-31 13:43:31.000000000 +0200 @@ -264,8 +264,16 @@ /* Duplicate of time_init() below, with hpet_enable part added */ void __init hpet_time_init(void) { +#ifndef CONFIG_X86_RDC if (!hpet_enable()) setup_pit_timer(); +#else + struct timespec ts; + + /* RDC devices do not have CMOS */ + ts.tv_sec = 0; + ts.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); +#endif time_init_hook(); } @@ -279,6 +287,18 @@ */ void __init time_init(void) { +#ifndef CONFIG_X86_RDC tsc_init(); late_time_init = choose_time_init(); +#else + struct timespec ts; + + /* RDC devices do not have CMOS */ + ts.tv_sec = 0; + ts.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); + + do_settimeofday(&ts); + + time_init_hook(); +#endif }