diff options
-rw-r--r-- | arch/arm/mach-mx6/cpu.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-mx6/cpu_op-mx6.c | 23 | ||||
-rw-r--r-- | arch/arm/mach-mx6/cpu_op-mx6.h | 6 |
3 files changed, 27 insertions, 4 deletions
diff --git a/arch/arm/mach-mx6/cpu.c b/arch/arm/mach-mx6/cpu.c index fbb3827668e0..37f125a1b0d8 100644 --- a/arch/arm/mach-mx6/cpu.c +++ b/arch/arm/mach-mx6/cpu.c @@ -33,7 +33,7 @@ struct cpu_op *(*get_cpu_op)(int *op); bool enable_wait_mode = true; -u32 arm_max_freq = CPU_AT_1GHz; +u32 arm_max_freq = CPU_AT_1_2GHz; bool mem_clk_on_in_wait; int chip_rev; diff --git a/arch/arm/mach-mx6/cpu_op-mx6.c b/arch/arm/mach-mx6/cpu_op-mx6.c index 028e876e3324..5124c5ee5985 100644 --- a/arch/arm/mach-mx6/cpu_op-mx6.c +++ b/arch/arm/mach-mx6/cpu_op-mx6.c @@ -13,10 +13,12 @@ #include <linux/types.h> #include <linux/kernel.h> +#include <asm/io.h> #include <mach/hardware.h> #include <mach/mxc_dvfs.h> #include "cpu_op-mx6.h" +#define OCOTP_SPEED_BIT_OFFSET (16) extern struct cpu_op *(*get_cpu_op)(int *op); extern struct dvfs_op *(*get_dvfs_core_op)(int *wp); extern void (*set_num_cpu_op)(int num); @@ -33,6 +35,13 @@ static struct cpu_op mx6q_cpu_op_1_2G[] = { .soc_voltage = 1275000, .cpu_voltage = 1275000,}, { + .pll_rate = 996000000, + .cpu_rate = 996000000, + .cpu_podf = 0, + .pu_voltage = 1250000, + .soc_voltage = 1250000, + .cpu_voltage = 1250000,}, + { .pll_rate = 792000000, .cpu_rate = 792000000, .cpu_podf = 0, @@ -331,6 +340,20 @@ void mx6_set_num_cpu_op(int num) void mx6_cpu_op_init(void) { + unsigned int reg; + void __iomem *base; + if (cpu_is_mx6q()) { + /*read fuse bit to know the max cpu freq : offset 0x440 + * bit[17:16]:SPEED_GRADING[1:0]*/ + base = IO_ADDRESS(OCOTP_BASE_ADDR); + reg = __raw_readl(base + 0x440); + reg &= (0x3 << OCOTP_SPEED_BIT_OFFSET); + reg >>= OCOTP_SPEED_BIT_OFFSET; + /*choose the little value to run lower max cpufreq*/ + arm_max_freq = (reg > arm_max_freq) ? arm_max_freq : reg; + } else + arm_max_freq = CPU_AT_1GHz;/*mx6dl/sl max freq is 1Ghz*/ + printk(KERN_INFO "arm_max_freq=%x\n", arm_max_freq); get_cpu_op = mx6_get_cpu_op; set_num_cpu_op = mx6_set_num_cpu_op; diff --git a/arch/arm/mach-mx6/cpu_op-mx6.h b/arch/arm/mach-mx6/cpu_op-mx6.h index b5ca58ecb3b3..310cbb375ced 100644 --- a/arch/arm/mach-mx6/cpu_op-mx6.h +++ b/arch/arm/mach-mx6/cpu_op-mx6.h @@ -10,9 +10,9 @@ * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html */ - +/*The below value aligned with SPEED_GRADING bits in 0x440 fuse offset */ #define CPU_AT_800MHz 0 -#define CPU_AT_1GHz 1 -#define CPU_AT_1_2GHz 2 +#define CPU_AT_1GHz 2 +#define CPU_AT_1_2GHz 3 void mx6_cpu_op_init(void); |