only enable peripheral power management on the Smartbook. On the Smarttop
[efikamx:linux-kernel.git] / arch / arm / mach-mx5 / mx51_efikamx_cpu.c
1 /*
2  * Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
3  * Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
4  * Copyright 2009-2010 Genesi USA, Inc. All Rights Reserved.
5  */
6
7 /*
8  * The code contained herein is licensed under the GNU General Public
9  * License. You may obtain a copy of the GNU General Public License
10  * Version 2 or later at the following locations:
11  *
12  * http://www.opensource.org/licenses/gpl-license.html
13  * http://www.gnu.org/copyleft/gpl.html
14  */
15
16 #include <linux/types.h>
17 #include <linux/delay.h>
18 #include <linux/pm.h>
19 #include <linux/interrupt.h>
20 #include <linux/irq.h>
21 #include <linux/init.h>
22 #include <linux/clk.h>
23 #include <linux/platform_device.h>
24 #include <linux/fsl_devices.h>
25 #include <linux/spi/spi.h>
26 #include <linux/i2c.h>
27 #include <linux/mtd/mtd.h>
28 #include <linux/mtd/map.h>
29 #include <linux/mtd/partitions.h>
30 #include <linux/spi/flash.h>
31 #include <linux/regulator/consumer.h>
32 #include <linux/pmic_external.h>
33 #include <linux/pmic_status.h>
34 #include <linux/ipu.h>
35 #include <linux/mxcfb.h>
36 #include <linux/pwm_backlight.h>
37 #include <mach/common.h>
38 #include <mach/hardware.h>
39 #include <asm/setup.h>
40 #include <asm/mach-types.h>
41 #include <asm/mach/arch.h>
42 #include <asm/mach/time.h>
43 #include <mach/gpio.h>
44 #include <mach/mmc.h>
45 #include <mach/mxc_dvfs.h>
46
47 #include "devices.h"
48 #include "iomux.h"
49 #include "mx51_pins.h"
50 #include "crm_regs.h"
51 #include "usb.h"
52
53 #include "mx51_efikamx.h"
54
55 static int num_cpu_wp = 2;
56
57 /* working point(wp): 0 - 800MHz; 1 - 166.25MHz; */
58 static struct cpu_wp cpu_wp_auto[] = {
59         {
60          .pll_rate = 800000000,
61          .cpu_rate = 800000000,
62          .pdf = 0,
63          .mfi = 8,
64          .mfd = 2,
65          .mfn = 1,
66          .cpu_podf = 0,
67          .cpu_voltage = 1100000,
68         },
69         {
70          .pll_rate = 800000000,
71          .cpu_rate = 166250000,
72          .pdf = 4,
73          .mfi = 8,
74          .mfd = 2,
75          .mfn = 1,
76          .cpu_podf = 4,
77          .cpu_voltage = 850000,
78         },
79 };
80
81
82 struct cpu_wp *mx51_efikamx_get_cpu_wp(int *wp)
83 {
84         *wp = num_cpu_wp;
85         return cpu_wp_auto;
86 }
87
88 void mx51_efikamx_set_num_cpu_wp(int num)
89 {
90         num_cpu_wp = num;
91         return;
92 }
93
94 static struct mxc_dvfs_platform_data mx51_efikamx_dvfs_core_data = {
95         .reg_id = "SW1",
96         .clk1_id = "cpu_clk",
97         .clk2_id = "gpc_dvfs_clk",
98         .gpc_cntr_reg_addr = MXC_GPC_CNTR,
99         .gpc_vcr_reg_addr = MXC_GPC_VCR,
100         .ccm_cdcr_reg_addr = MXC_CCM_CDCR,
101         .ccm_cacrr_reg_addr = MXC_CCM_CACRR,
102         .ccm_cdhipr_reg_addr = MXC_CCM_CDHIPR,
103         .prediv_mask = 0x1F800,
104         .prediv_offset = 11,
105         .prediv_val = 3,
106         .div3ck_mask = 0xE0000000,
107         .div3ck_offset = 29,
108         .div3ck_val = 2,
109         .emac_val = 0x08,
110         .upthr_val = 25,
111         .dnthr_val = 9,
112         .pncthr_val = 33,
113         .upcnt_val = 10,
114         .dncnt_val = 10,
115         .delay_time = 30,
116         .num_wp = 2,
117 };
118
119 static struct mxc_dvfsper_data mx51_efikamx_dvfs_per_data = {
120         .reg_id = "SW2",
121         .clk_id = "gpc_dvfs_clk",
122         .gpc_cntr_reg_addr = MXC_GPC_CNTR,
123         .gpc_vcr_reg_addr = MXC_GPC_VCR,
124         .gpc_adu = 0x0,
125         .vai_mask = MXC_DVFSPMCR0_FSVAI_MASK,
126         .vai_offset = MXC_DVFSPMCR0_FSVAI_OFFSET,
127         .dvfs_enable_bit = MXC_DVFSPMCR0_DVFEN,
128         .irq_mask = MXC_DVFSPMCR0_FSVAIM,
129         .div3_offset = 0,
130         .div3_mask = 0x7,
131         .div3_div = 2,
132         .lp_high = 1250000,
133         .lp_low = 1250000,
134 };
135
136 static struct mxc_srtc_platform_data mx51_efikamx_srtc_data = {
137         .srtc_sec_mode_addr = 0x83f98840,
138 };
139
140 /* external because the main init struct wants it */
141 void __init mx51_efikamx_timer_init(void)
142 {
143         /* Change the CPU voltages for TO2*/
144         if (cpu_is_mx51_rev(CHIP_REV_2_0) <= 1) {
145                 cpu_wp_auto[1].cpu_voltage = 1000000;
146         }
147
148         mx51_clocks_init(32768, 24000000, 22579200, 24576000);
149
150         early_console_setup(UART1_BASE_ADDR, clk_get(NULL, "uart_clk.0"));
151 }
152
153 void __init mx51_efikamx_init_soc(void)
154 {
155         mxc_register_device(&mxc_dma_device, NULL);
156         mxc_register_device(&mxc_wdt_device, NULL);
157         mxc_register_device(&mxc_rtc_device, &mx51_efikamx_srtc_data);
158         mxc_register_device(&mx51_lpmode_device, NULL);
159         mxc_register_device(&busfreq_device, NULL);
160         mxc_register_device(&sdram_autogating_device, NULL);
161         mxc_register_device(&mxc_iim_device, NULL);
162
163         /*
164          * on TO2 and below DVFS and DVFS-PER either don't work or they make video
165          * playback using the VPU unreliable. Consider them both busted and only
166          * activate them on TO3+
167          */
168         if (cpu_is_mx51_rev(CHIP_REV_3_0) >= 1) {
169                 mxc_register_device(&mxc_dvfs_core_device, &mx51_efikamx_dvfs_core_data);
170
171                 /* only enable peripheral power management on the Smartbook. On the Smarttop
172                  * with very high resolution displays, power management causes serious performance
173                  * regressions which we cannot really accept when it comes to video playback
174                  * and other features. However, Smartbook display resolution is low enough and
175                  * power usage is important enough that we should leave it on for those systems
176                  */
177                 if (machine_is_mx51_efikasb()) {
178                         mxc_register_device(&mxc_dvfs_per_device, &mx51_efikamx_dvfs_per_data);
179                 }
180         }
181
182         mxc_register_device(&mxcscc_device, NULL);
183 }
184