blob: 0027422a37cebab314c6aba82401868b88e2faa8 [file] [log] [blame]
Amol Jadica4f4c92011-01-13 20:19:34 -08001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
4 * Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google, Inc. nor the names of its contributors
16 * may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
26 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include <debug.h>
34#include <lib/ptable.h>
35#include <smem.h>
36#include <platform/iomap.h>
Greg Griscod6250552011-06-29 14:40:23 -070037#include <mmc.h>
38#include <platform/timer.h>
Amol Jadica4f4c92011-01-13 20:19:34 -080039#include <reg.h>
Amol Jadi6db9fe32011-04-15 17:19:00 -070040#include <dev/keys.h>
Amol Jadi57abe4c2011-05-24 15:47:27 -070041#include <dev/pm8921.h>
Kinson Chikea646242011-09-01 13:53:16 -070042#include <dev/ssbi.h>
Amol Jadic52c8a32011-07-12 11:27:04 -070043#include <gsbi.h>
Greg Griscod2471ef2011-07-14 13:00:42 -070044#include <target.h>
Greg Grisco1073a5e2011-07-28 18:59:18 -070045#include <platform.h>
Ajay Dudani403bc492011-09-30 16:17:21 -070046#include <baseband.h>
Amol Jadica4f4c92011-01-13 20:19:34 -080047
Amol Jadi0c04df82011-10-14 17:40:21 -070048/* 8960 */
Amol Jadica4f4c92011-01-13 20:19:34 -080049#define LINUX_MACHTYPE_8960_SIM 3230
50#define LINUX_MACHTYPE_8960_RUMI3 3231
Shashank Mittald67508a2011-05-06 19:18:42 -070051#define LINUX_MACHTYPE_8960_CDP 3396
52#define LINUX_MACHTYPE_8960_MTP 3397
53#define LINUX_MACHTYPE_8960_FLUID 3398
54#define LINUX_MACHTYPE_8960_APQ 3399
Amir Samuelov6a9871b2011-07-31 14:38:05 +030055#define LINUX_MACHTYPE_8960_LIQUID 3535
Amol Jadi0c04df82011-10-14 17:40:21 -070056
Ajay Dudani4d3a3df2011-11-18 08:37:01 -080057/* 8627 */
58#define LINUX_MACHTYPE_8627_CDP 3861
59#define LINUX_MACHTYPE_8627_MTP 3862
60
Amol Jadi0c04df82011-10-14 17:40:21 -070061/* 8930 */
Ajay Dudani8decb502011-09-12 13:39:32 -070062#define LINUX_MACHTYPE_8930_CDP 3727
63#define LINUX_MACHTYPE_8930_MTP 3728
64#define LINUX_MACHTYPE_8930_FLUID 3729
Greg Griscod2471ef2011-07-14 13:00:42 -070065
Amol Jadi0c04df82011-10-14 17:40:21 -070066/* 8064 */
67#define LINUX_MACHTYPE_8064_SIM 3572
68#define LINUX_MACHTYPE_8064_RUMI3 3679
69
Amol Jadicd43ea02011-02-15 20:56:04 -080070extern void dmb(void);
Amol Jadi6db9fe32011-04-15 17:19:00 -070071extern void keypad_init(void);
Greg Griscod2471ef2011-07-14 13:00:42 -070072extern void panel_backlight_on(void);
Amol Jadicd43ea02011-02-15 20:56:04 -080073
Shashank Mittalda89a682011-03-14 19:18:38 -070074static unsigned mmc_sdc_base[] = { MSM_SDC1_BASE, MSM_SDC2_BASE, MSM_SDC3_BASE, MSM_SDC4_BASE};
75
Amol Jadi0c04df82011-10-14 17:40:21 -070076static uint32_t platform_id;
77static uint32_t target_id;
78
Amol Jadi57abe4c2011-05-24 15:47:27 -070079static pm8921_dev_t pmic;
80
Amol Jadi0c04df82011-10-14 17:40:21 -070081static void target_detect(void);
82static uint8_t get_uart_gsbi(void);
83
84void target_early_init(void)
85{
86 target_detect();
87
88#if WITH_DEBUG_UART
89 uart_init(get_uart_gsbi());
90#endif
91}
Amol Jadic52c8a32011-07-12 11:27:04 -070092
Shashank Mittal39503262011-07-19 11:41:35 -070093void shutdown_device(void)
94{
95 dprintf(CRITICAL, "Shutdown system.\n");
96 pm8921_config_reset_pwr_off(0);
97
98 /* Actually reset the chip */
99 writel(0, MSM_PSHOLD_CTL_SU);
100 mdelay(5000);
101
102 dprintf (CRITICAL, "Shutdown failed.\n");
103}
104
Amol Jadica4f4c92011-01-13 20:19:34 -0800105void target_init(void)
106{
Shashank Mittalda89a682011-03-14 19:18:38 -0700107 unsigned base_addr;
108 unsigned char slot;
Amol Jadi0c04df82011-10-14 17:40:21 -0700109
Amol Jadica4f4c92011-01-13 20:19:34 -0800110 dprintf(INFO, "target_init()\n");
111
Amol Jadi57abe4c2011-05-24 15:47:27 -0700112 /* Initialize PMIC driver */
Greg Griscod2471ef2011-07-14 13:00:42 -0700113 pmic.read = (pm8921_read_func) &pa1_ssbi2_read_bytes;
114 pmic.write = (pm8921_write_func) &pa1_ssbi2_write_bytes;
Amol Jadi57abe4c2011-05-24 15:47:27 -0700115
116 pm8921_init(&pmic);
Amol Jadi0c04df82011-10-14 17:40:21 -0700117
Amol Jadi6db9fe32011-04-15 17:19:00 -0700118 /* Keypad init */
119 keys_init();
120 keypad_init();
121
Kinson Chikce306ff2011-07-08 15:23:33 -0700122 /* Display splash screen if enabled */
123#if DISPLAY_SPLASH_SCREEN
Ajay Dudani51005842011-11-05 12:34:51 -0700124 if((platform_id == MSM8960) || (platform_id == MSM8660A)
125 || (platform_id == MSM8260A) || (platform_id == APQ8060A)
Shashank Mittal26309ed2011-12-01 16:05:45 -0800126 || (platform_id == MSM8230) || (platform_id == MSM8630)
127 || (platform_id == MSM8930) || (platform_id == APQ8030)
128 || (platform_id == MSM8227) || (platform_id == MSM8627))
Amol Jadi0c04df82011-10-14 17:40:21 -0700129 {
130 panel_backlight_on();
131 display_init();
132 dprintf(SPEW, "Diplay initialized\n");
133 display_image_on_screen();
134 }
Kinson Chikce306ff2011-07-08 15:23:33 -0700135#endif
136
Shashank Mittalda89a682011-03-14 19:18:38 -0700137 /* Trying Slot 1 first */
138 slot = 1;
139 base_addr = mmc_sdc_base[slot-1];
140 if(mmc_boot_main(slot, base_addr))
Amol Jadica4f4c92011-01-13 20:19:34 -0800141 {
Shashank Mittalda89a682011-03-14 19:18:38 -0700142 /* Trying Slot 3 next */
143 slot = 3;
144 base_addr = mmc_sdc_base[slot-1];
145 if(mmc_boot_main(slot, base_addr))
146 {
147 dprintf(CRITICAL, "mmc init failed!");
148 ASSERT(0);
149 }
Amol Jadica4f4c92011-01-13 20:19:34 -0800150 }
151}
152
153unsigned board_machtype(void)
154{
Amol Jadi0c04df82011-10-14 17:40:21 -0700155 return target_id;
156}
157
158
159void target_detect(void)
160{
Shashank Mittalda89a682011-03-14 19:18:38 -0700161 struct smem_board_info_v6 board_info_v6;
162 unsigned int board_info_len = 0;
163 unsigned smem_status = 0;
164 unsigned format = 0;
Amol Jadi64c58c12011-05-11 13:40:25 -0700165 unsigned id = HW_PLATFORM_UNKNOWN;
Amol Jadica4f4c92011-01-13 20:19:34 -0800166
Shashank Mittald67508a2011-05-06 19:18:42 -0700167
Shashank Mittalda89a682011-03-14 19:18:38 -0700168 smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
169 &format, sizeof(format), 0);
170 if(!smem_status)
171 {
Amol Jadi64c58c12011-05-11 13:40:25 -0700172 if (format == 6)
Shashank Mittalda89a682011-03-14 19:18:38 -0700173 {
174 board_info_len = sizeof(board_info_v6);
175
176 smem_status = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
177 &board_info_v6, board_info_len);
178 if(!smem_status)
179 {
180 id = board_info_v6.board_info_v3.hw_platform;
181 }
182 }
183 }
184
Amol Jadi0c04df82011-10-14 17:40:21 -0700185 platform_id = board_info_v6.board_info_v3.msm_id;
186
Amol Jadi64c58c12011-05-11 13:40:25 -0700187 /* Detect the board we are running on */
Ajay Dudani51005842011-11-05 12:34:51 -0700188 if ((platform_id == MSM8960) || (platform_id == MSM8660A)
189 || (platform_id == MSM8260A) || (platform_id == APQ8060A))
Shashank Mittalda89a682011-03-14 19:18:38 -0700190 {
Ajay Dudani8decb502011-09-12 13:39:32 -0700191 switch(id)
192 {
193 case HW_PLATFORM_SURF:
Amol Jadi0c04df82011-10-14 17:40:21 -0700194 target_id = LINUX_MACHTYPE_8960_CDP;
Ajay Dudani8decb502011-09-12 13:39:32 -0700195 break;
196 case HW_PLATFORM_MTP:
Amol Jadi0c04df82011-10-14 17:40:21 -0700197 target_id = LINUX_MACHTYPE_8960_MTP;
Ajay Dudani8decb502011-09-12 13:39:32 -0700198 break;
199 case HW_PLATFORM_FLUID:
Amol Jadi0c04df82011-10-14 17:40:21 -0700200 target_id = LINUX_MACHTYPE_8960_FLUID;
Ajay Dudani8decb502011-09-12 13:39:32 -0700201 break;
202 case HW_PLATFORM_LIQUID:
Amol Jadi0c04df82011-10-14 17:40:21 -0700203 target_id = LINUX_MACHTYPE_8960_LIQUID;
Ajay Dudani8decb502011-09-12 13:39:32 -0700204 break;
205 default:
Amol Jadi0c04df82011-10-14 17:40:21 -0700206 target_id = LINUX_MACHTYPE_8960_CDP;
Ajay Dudani8decb502011-09-12 13:39:32 -0700207 }
208 }
Ajay Dudani4d3a3df2011-11-18 08:37:01 -0800209 else if ((platform_id == MSM8230) || (platform_id == MSM8630)
210 || (platform_id == MSM8930) || (platform_id == APQ8030))
Ajay Dudani8decb502011-09-12 13:39:32 -0700211 {
212 switch(id)
213 {
214 case HW_PLATFORM_SURF:
Amol Jadi0c04df82011-10-14 17:40:21 -0700215 target_id = LINUX_MACHTYPE_8930_CDP;
Ajay Dudani8decb502011-09-12 13:39:32 -0700216 break;
217 case HW_PLATFORM_MTP:
Amol Jadi0c04df82011-10-14 17:40:21 -0700218 target_id = LINUX_MACHTYPE_8930_MTP;
Ajay Dudani8decb502011-09-12 13:39:32 -0700219 break;
220 case HW_PLATFORM_FLUID:
Amol Jadi0c04df82011-10-14 17:40:21 -0700221 target_id = LINUX_MACHTYPE_8930_FLUID;
Ajay Dudani8decb502011-09-12 13:39:32 -0700222 break;
223 default:
Amol Jadi0c04df82011-10-14 17:40:21 -0700224 target_id = LINUX_MACHTYPE_8930_CDP;
Ajay Dudani8decb502011-09-12 13:39:32 -0700225 }
226 }
Ajay Dudani4d3a3df2011-11-18 08:37:01 -0800227 else if ((platform_id == MSM8227) || (platform_id == MSM8627))
228 {
229 switch(id)
230 {
231 case HW_PLATFORM_SURF:
232 target_id = LINUX_MACHTYPE_8627_CDP;
233 break;
234 case HW_PLATFORM_MTP:
235 target_id = LINUX_MACHTYPE_8627_MTP;
236 break;
237 default:
238 target_id = LINUX_MACHTYPE_8627_CDP;
239 }
240 }
Amol Jadi0c04df82011-10-14 17:40:21 -0700241 else if (platform_id == APQ8064)
242 {
243 switch(id)
244 {
245 case HW_PLATFORM_SURF:
246 target_id = LINUX_MACHTYPE_8064_SIM;
247 break;
248 default:
249 target_id = LINUX_MACHTYPE_8064_RUMI3;
250 }
251 }
252 else
253 {
254 dprintf(CRITICAL, "platform_id (%d) is not identified.\n", platform_id);
255 ASSERT(0);
256 }
Amol Jadica4f4c92011-01-13 20:19:34 -0800257}
258
Ajay Dudani403bc492011-09-30 16:17:21 -0700259unsigned target_baseband()
260{
261 struct smem_board_info_v6 board_info_v6;
262 unsigned int board_info_len = 0;
263 unsigned smem_status = 0;
264 unsigned format = 0;
265 unsigned baseband = BASEBAND_MSM;
266
267 smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
268 &format, sizeof(format), 0);
269 if(!smem_status)
270 {
271 if (format >= 6)
272 {
273 board_info_len = sizeof(board_info_v6);
274
275 smem_status = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
276 &board_info_v6, board_info_len);
277 if(!smem_status)
278 {
Ajay Dudani51005842011-11-05 12:34:51 -0700279 /* Check for MDM or APQ baseband variants. Default to MSM */
Ajay Dudani403bc492011-09-30 16:17:21 -0700280 if (board_info_v6.platform_subtype == HW_PLATFORM_SUBTYPE_MDM)
281 baseband = BASEBAND_MDM;
Ajay Dudani51005842011-11-05 12:34:51 -0700282 else if (board_info_v6.board_info_v3.msm_id == APQ8060)
283 baseband = BASEBAND_APQ;
Ajay Dudani403bc492011-09-30 16:17:21 -0700284 else
285 baseband = BASEBAND_MSM;
286 }
287 }
288 }
289 return baseband;
290}
291
Ajay Dudani23a18c32011-11-18 08:37:01 -0800292static unsigned target_check_power_on_reason(void)
293{
294 unsigned power_on_status = 0;
295 unsigned int status_len = sizeof(power_on_status);
296 unsigned smem_status;
297
298 smem_status = smem_read_alloc_entry(SMEM_POWER_ON_STATUS_INFO,
299 &power_on_status, status_len);
300
301 if (smem_status)
302 {
303 dprintf(CRITICAL, "ERROR: unable to read shared memory for power on reason\n");
304 }
305 dprintf(INFO,"Power on reason %u\n", power_on_status);
306 return power_on_status;
307}
308
Amol Jadica4f4c92011-01-13 20:19:34 -0800309void reboot_device(unsigned reboot_reason)
310{
Trevor Bourgeta5c4a242011-11-08 15:37:08 -0800311 writel(reboot_reason, RESTART_REASON_ADDR);
312
Shashank Mittal6239b162011-06-28 17:59:33 -0700313 /* Actually reset the chip */
Shashank Mittal39503262011-07-19 11:41:35 -0700314 pm8921_config_reset_pwr_off(1);
Shashank Mittal6239b162011-06-28 17:59:33 -0700315 writel(0, MSM_PSHOLD_CTL_SU);
Amol Jadica4f4c92011-01-13 20:19:34 -0800316 mdelay(10000);
Shashank Mittal39503262011-07-19 11:41:35 -0700317
Trevor Bourgetcc278352011-11-08 15:49:30 -0800318 dprintf (CRITICAL, "PSHOLD failed, trying watchdog reset\n");
319 writel(1, MSM_WDT0_RST);
320 writel(0, MSM_WDT0_EN);
321 writel(0x31F3, MSM_WDT0_BT);
322 writel(3, MSM_WDT0_EN);
323 dmb();
324 writel(3, MSM_TCSR_BASE + TCSR_WDOG_CFG);
325 mdelay(10000);
326
Amol Jadica4f4c92011-01-13 20:19:34 -0800327 dprintf (CRITICAL, "Rebooting failed\n");
Amol Jadica4f4c92011-01-13 20:19:34 -0800328}
329
330unsigned check_reboot_mode(void)
331{
332 unsigned restart_reason = 0;
Amol Jadica4f4c92011-01-13 20:19:34 -0800333
334 /* Read reboot reason and scrub it */
Shashank Mittal0207df72011-06-15 15:20:43 -0700335 restart_reason = readl(RESTART_REASON_ADDR);
336 writel(0x00, RESTART_REASON_ADDR);
Amol Jadica4f4c92011-01-13 20:19:34 -0800337
338 return restart_reason;
339}
340
Ajay Dudani23a18c32011-11-18 08:37:01 -0800341unsigned target_pause_for_battery_charge(void)
342{
Ajay Dudaniba822332011-11-25 13:37:31 -0800343 if (target_check_power_on_reason() == PWR_ON_EVENT_WALL_CHG)
Ajay Dudani23a18c32011-11-18 08:37:01 -0800344 return 1;
345
346 return 0;
347}
348
Ajay Dudani12091e22011-05-06 17:13:23 -0700349void target_serialno(unsigned char *buf)
350{
351 unsigned int serialno;
352 if(target_is_emmc_boot())
353 {
354 serialno = mmc_get_psn();
Ajay Dudanif63d02f2011-10-01 08:29:53 -0700355 snprintf((char *) buf, 13, "%x", serialno);
Ajay Dudani12091e22011-05-06 17:13:23 -0700356 }
357}
358
Amol Jadica4f4c92011-01-13 20:19:34 -0800359void target_battery_charging_enable(unsigned enable, unsigned disconnect)
360{
361}
Amol Jadi57abe4c2011-05-24 15:47:27 -0700362
363/* Do any target specific intialization needed before entering fastboot mode */
364void target_fastboot_init(void)
365{
366 /* Set the BOOT_DONE flag in PM8921 */
367 pm8921_boot_done();
368}
Amol Jadic52c8a32011-07-12 11:27:04 -0700369
Amol Jadi0c04df82011-10-14 17:40:21 -0700370uint8_t get_uart_gsbi(void)
Amol Jadic52c8a32011-07-12 11:27:04 -0700371{
Amol Jadi0c04df82011-10-14 17:40:21 -0700372 switch(target_id)
373 {
374 case LINUX_MACHTYPE_8960_SIM:
375 case LINUX_MACHTYPE_8960_RUMI3:
376 case LINUX_MACHTYPE_8960_CDP:
377 case LINUX_MACHTYPE_8960_MTP:
378 case LINUX_MACHTYPE_8960_FLUID:
379 case LINUX_MACHTYPE_8960_APQ:
380 case LINUX_MACHTYPE_8960_LIQUID:
381
382 return GSBI_ID_5;
383
384 case LINUX_MACHTYPE_8930_CDP:
385 case LINUX_MACHTYPE_8930_MTP:
386 case LINUX_MACHTYPE_8930_FLUID:
387
388 return GSBI_ID_5;
389
390 case LINUX_MACHTYPE_8064_SIM:
391 case LINUX_MACHTYPE_8064_RUMI3:
392
393 return GSBI_ID_3;
394
Shashank Mittal26309ed2011-12-01 16:05:45 -0800395 case LINUX_MACHTYPE_8627_CDP:
396 case LINUX_MACHTYPE_8627_MTP:
397
398 return GSBI_ID_5;
399
Amol Jadi0c04df82011-10-14 17:40:21 -0700400 default:
401 dprintf(CRITICAL, "uart gsbi not defined for target: %d\n",
402 target_id);
403
404 ASSERT(0);
405 }
Amol Jadic52c8a32011-07-12 11:27:04 -0700406}