diff -Nur c3000_pre/linux/arch/arm/config.in c3000_work/linux/arch/arm/config.in --- c3000_pre/linux/arch/arm/config.in 2005-02-21 21:41:40.000000000 +0900 +++ c3000_work/linux/arch/arm/config.in 2005-02-21 22:25:37.000000000 +0900 @@ -478,6 +478,9 @@ if [ "$CONFIG_ARCH_PXA_SPITZ" = "y" ]; then bool 'Use clock change(cccr_change) enable (EXPERIMENTAL)' CONFIG_SL_CCCR_CHANGE fi + if [ "$CONFIG_SL_CCCR_CHANGE" = "y" ]; then + bool 'Core voltage change enable (EXPERIMENTAL)' CONFIG_CHANGE_CORE_VOLT + fi if [ "$CONFIG_ARCH_SHARP_SL" = "y" ]; then define_bool CONFIG_BATT y fi diff -Nur c3000_pre/linux/arch/arm/mach-pxa/pxa27x_power.c c3000_work/linux/arch/arm/mach-pxa/pxa27x_power.c --- c3000_pre/linux/arch/arm/mach-pxa/pxa27x_power.c 2004-11-04 14:13:54.000000000 +0900 +++ c3000_work/linux/arch/arm/mach-pxa/pxa27x_power.c 2005-02-21 22:25:37.000000000 +0900 @@ -150,6 +150,10 @@ extern int sharpsl_main_bk_flag; int sharpsl_request_off = 0; +#if defined(CONFIG_CHANGE_CORE_VOLT) +static unsigned char current_core_voltage = 0x1a; +#endif + void PrintParamTable(void); int sharpsl_restart(void) @@ -324,7 +328,7 @@ return -1; } -#ifdef DEBUG +#if defined(DEBUG) || defined(CONFIG_CHANGE_CORE_VOLT) int pwr_i2c_read( unsigned char device, unsigned char *value ) { unsigned long r; @@ -405,12 +409,33 @@ static void cpu_xscale_voltage_high(void) { pwr_i2c_open(); +#if defined(CONFIG_CHANGE_CORE_VOLT) + pwr_i2c_write( 0x0c, current_core_voltage ); + pwr_i2c_close(); + printk("current voltage %x\n", current_core_voltage ); +#else pwr_i2c_write( 0x0c, 0x1a ); // 1.35V - SlewRate 1 pwr_i2c_close(); +#endif +} + +#if defined(CONFIG_CHANGE_CORE_VOLT) +void cpu_xscale_voltage_write(unsigned char value) +{ + if (value > 0x10 ) + return; + value += 0x10; + pwr_i2c_open(); + pwr_i2c_write( 0x0c, value ); + pwr_i2c_close(); + current_core_voltage = value; + printk("current voltage %x\n", current_core_voltage ); + } +#endif -#ifdef DEBUG -static unsigned char cpu_xscale_voltage_read(void) +#if defined(DEBUG) || defined(CONFIG_CHANGE_CORE_VOLT) +unsigned char cpu_xscale_voltage_read(void) { unsigned char value=0xff; pwr_i2c_open(); @@ -418,7 +443,9 @@ pwr_i2c_close(); return value; } +#endif +#if defined(DEBUG) #define CLKCFG(a) asm("mrc p14, 0, %0, C6, C0, 0" : "=r"(a)) static void __debug_printk(void) { diff -Nur c3000_pre/linux/arch/arm/mach-pxa/sharpsl_apm.c c3000_work/linux/arch/arm/mach-pxa/sharpsl_apm.c --- c3000_pre/linux/arch/arm/mach-pxa/sharpsl_apm.c 2005-02-21 21:44:13.000000000 +0900 +++ c3000_work/linux/arch/arm/mach-pxa/sharpsl_apm.c 2005-02-21 22:29:17.000000000 +0900 @@ -135,6 +135,11 @@ struct proc_dir_entry *proc_zaurus; #endif +#if defined(CONFIG_CHANGE_CORE_VOLT) +extern unsigned char cpu_xscale_voltage_read(void); +extern void cpu_xscale_voltage_write(unsigned char); +#endif + #if defined(CONFIG_SABINAL_DISCOVERY) #define SHARPSL_AC_LINE_STATUS (( ASIC3_GPIO_PSTS_D & AC_IN )? APM_AC_OFFLINE : APM_AC_ONLINE) #define BACKPACK_IN_DETECT() ( ASIC3_GPIO_PSTS_D & BACKPACK_DETECT ) /* 0: exist , 1: not in */ @@ -1036,6 +1041,58 @@ EXPORT_SYMBOL(write_cccr); #endif +#if defined(CONFIG_CHANGE_CORE_VOLT) + +void write_vcore(int vcore) +{ + printk("Change Core voltage = %x.\n", vcore); + cpu_xscale_voltage_write(vcore); + return; +} + +int read_vcore(void) +{ + return cpu_xscale_voltage_read(); +} + +static ssize_t core_volt_read_params(struct file *file, char *buf, + size_t nbytes, loff_t *ppos) +{ + char outputbuf[32]; + int count; + + if (*ppos>0) /* Assume reading completed in previous read*/ + return 0; + count = sprintf(outputbuf, "0x%02X\n", (unsigned int) cpu_xscale_voltage_read() ); + count++; + *ppos += count; + if (count>nbytes)/* Assume output can be read at one time */ + return -EINVAL; + if (copy_to_user(buf, outputbuf, count+1)) + return -EFAULT; + return count; +} + +static ssize_t core_volt_write_params(struct file *file, const char *buf, + size_t nbytes, loff_t *ppos) +{ + unsigned int param=0; + + sscanf(buf,"%x",¶m); + if (param) { + write_vcore(param); + } + return nbytes; +} + +static struct file_operations proc_core_volt_params_operations = { + read:core_volt_read_params, + write:core_volt_write_params, +}; +EXPORT_SYMBOL(read_vcore); +EXPORT_SYMBOL(write_vcore); +#endif + #ifdef CONFIG_APM_CPU_IDLE #ifdef SHARPSL_NEW_IDLE static int save_icmr; @@ -2849,6 +2906,7 @@ struct proc_dir_entry *lock_fcs_proc; struct proc_dir_entry *power_mode_proc; struct proc_dir_entry *cccr_change_proc; + struct proc_dir_entry *core_volt_proc; apm_info.bios = apm_bios_info; if (apm_info.bios.version == 0) { @@ -2981,6 +3039,14 @@ cccr_change_proc->proc_fops = &proc_cccr_change_params_operations; } #endif + +#if defined(CONFIG_CHANGE_CORE_VOLT) + core_volt_proc = create_proc_entry("zaurus/VCORE", 0, NULL); + if (core_volt_proc) { + core_volt_proc->proc_fops = &proc_core_volt_params_operations; + } +#endif + kernel_thread(apm_thread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD); #if defined(CONFIG_SABINAL_DISCOVERY) || defined(CONFIG_ARCH_PXA_TOSA)