blob: 24f70a4f7cddec7a13f433caf6b27b5d1a6245d5 [file] [log] [blame]
Amol Jadica4f4c92011-01-13 20:19:34 -08001/*
2 * Copyright (c) 2009, Google Inc.
3 * All rights reserved.
Shashank Mittalb3be37f2012-01-16 22:59:49 -08004 * Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Amol Jadica4f4c92011-01-13 20:19:34 -08005 *
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 Jadia63aaff2012-02-01 15:51:50 -080047#include <uart_dm.h>
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -080048#include <crypto_hash.h>
Shashank Mittala635abf2012-03-28 18:11:43 -070049#include <board.h>
Amol Jadi0c04df82011-10-14 17:40:21 -070050
Amol Jadicd43ea02011-02-15 20:56:04 -080051extern void dmb(void);
Shashank Mittalb3be37f2012-01-16 22:59:49 -080052extern void msm8960_keypad_init(void);
53extern void msm8930_keypad_init(void);
Greg Griscod2471ef2011-07-14 13:00:42 -070054extern void panel_backlight_on(void);
Amol Jadicd43ea02011-02-15 20:56:04 -080055
Ajay Dudanib01e5062011-12-03 23:23:42 -080056static unsigned mmc_sdc_base[] =
57 { MSM_SDC1_BASE, MSM_SDC2_BASE, MSM_SDC3_BASE, MSM_SDC4_BASE };
Shashank Mittalda89a682011-03-14 19:18:38 -070058
Amol Jadi57abe4c2011-05-24 15:47:27 -070059static pm8921_dev_t pmic;
60
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -080061/* Setting this variable to different values defines the
62 * behavior of CE engine:
63 * platform_ce_type = CRYPTO_ENGINE_TYPE_NONE : No CE engine
64 * platform_ce_type = CRYPTO_ENGINE_TYPE_SW : Software CE engine
65 * platform_ce_type = CRYPTO_ENGINE_TYPE_HW : Hardware CE engine
66 * Behavior is determined in the target code.
67 */
68static crypto_engine_type platform_ce_type = CRYPTO_ENGINE_TYPE_SW;
69
Amol Jadia63aaff2012-02-01 15:51:50 -080070static void target_uart_init(void);
Amol Jadi0c04df82011-10-14 17:40:21 -070071
72void target_early_init(void)
73{
Amol Jadi0c04df82011-10-14 17:40:21 -070074#if WITH_DEBUG_UART
Amol Jadia63aaff2012-02-01 15:51:50 -080075 target_uart_init();
Amol Jadi0c04df82011-10-14 17:40:21 -070076#endif
77}
Amol Jadic52c8a32011-07-12 11:27:04 -070078
Shashank Mittal39503262011-07-19 11:41:35 -070079void shutdown_device(void)
80{
81 dprintf(CRITICAL, "Shutdown system.\n");
82 pm8921_config_reset_pwr_off(0);
83
84 /* Actually reset the chip */
85 writel(0, MSM_PSHOLD_CTL_SU);
86 mdelay(5000);
87
Ajay Dudanib01e5062011-12-03 23:23:42 -080088 dprintf(CRITICAL, "Shutdown failed.\n");
Shashank Mittal39503262011-07-19 11:41:35 -070089}
90
Amol Jadica4f4c92011-01-13 20:19:34 -080091void target_init(void)
92{
Shashank Mittalda89a682011-03-14 19:18:38 -070093 unsigned base_addr;
94 unsigned char slot;
Shashank Mittala635abf2012-03-28 18:11:43 -070095 unsigned platform_id = board_platform_id();
Amol Jadi0c04df82011-10-14 17:40:21 -070096
Amol Jadica4f4c92011-01-13 20:19:34 -080097 dprintf(INFO, "target_init()\n");
98
Amol Jadi57abe4c2011-05-24 15:47:27 -070099 /* Initialize PMIC driver */
Ajay Dudanib01e5062011-12-03 23:23:42 -0800100 pmic.read = (pm8921_read_func) & pa1_ssbi2_read_bytes;
101 pmic.write = (pm8921_write_func) & pa1_ssbi2_write_bytes;
Amol Jadi57abe4c2011-05-24 15:47:27 -0700102
103 pm8921_init(&pmic);
Amol Jadi0c04df82011-10-14 17:40:21 -0700104
Amol Jadi6db9fe32011-04-15 17:19:00 -0700105 /* Keypad init */
106 keys_init();
Shashank Mittalb3be37f2012-01-16 22:59:49 -0800107
108 if(platform_id == MSM8960)
109 {
110 msm8960_keypad_init();
111 }
112 else if(platform_id == MSM8930)
113 {
114 msm8930_keypad_init();
115 }
Amol Jadi6d7f1d22012-04-13 15:33:41 -0700116 else if( (platform_id == APQ8064) ||
117 (platform_id == MPQ8064))
Amol Jadi76071672012-02-03 12:19:36 -0800118 {
119 apq8064_keypad_init();
120 }
Amol Jadi6db9fe32011-04-15 17:19:00 -0700121
Kinson Chikce306ff2011-07-08 15:23:33 -0700122 /* Display splash screen if enabled */
123#if DISPLAY_SPLASH_SCREEN
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700124 display_init();
125 dprintf(SPEW, "Diplay initialized\n");
Kinson Chikce306ff2011-07-08 15:23:33 -0700126#endif
127
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -0800128 if ((platform_id == MSM8960) || (platform_id == MSM8660A)
129 || (platform_id == MSM8260A) || (platform_id == APQ8060A))
130 /* Enable Hardware CE */
131 platform_ce_type = CRYPTO_ENGINE_TYPE_HW;
132
Shashank Mittalda89a682011-03-14 19:18:38 -0700133 /* Trying Slot 1 first */
134 slot = 1;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800135 base_addr = mmc_sdc_base[slot - 1];
136 if (mmc_boot_main(slot, base_addr)) {
Shashank Mittalda89a682011-03-14 19:18:38 -0700137 /* Trying Slot 3 next */
138 slot = 3;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800139 base_addr = mmc_sdc_base[slot - 1];
140 if (mmc_boot_main(slot, base_addr)) {
Shashank Mittalda89a682011-03-14 19:18:38 -0700141 dprintf(CRITICAL, "mmc init failed!");
142 ASSERT(0);
143 }
Amol Jadica4f4c92011-01-13 20:19:34 -0800144 }
145}
146
147unsigned board_machtype(void)
148{
Shashank Mittala635abf2012-03-28 18:11:43 -0700149 return board_target_id();
Amol Jadia63aaff2012-02-01 15:51:50 -0800150}
151
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -0800152crypto_engine_type board_ce_type(void)
153{
154 return platform_ce_type;
155}
156
Ajay Dudani403bc492011-09-30 16:17:21 -0700157unsigned target_baseband()
158{
Shashank Mittala635abf2012-03-28 18:11:43 -0700159 return board_baseband();
Ajay Dudani403bc492011-09-30 16:17:21 -0700160}
161
Ajay Dudani23a18c32011-11-18 08:37:01 -0800162static unsigned target_check_power_on_reason(void)
163{
164 unsigned power_on_status = 0;
165 unsigned int status_len = sizeof(power_on_status);
166 unsigned smem_status;
167
168 smem_status = smem_read_alloc_entry(SMEM_POWER_ON_STATUS_INFO,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800169 &power_on_status, status_len);
Ajay Dudani23a18c32011-11-18 08:37:01 -0800170
Ajay Dudanib01e5062011-12-03 23:23:42 -0800171 if (smem_status) {
172 dprintf(CRITICAL,
173 "ERROR: unable to read shared memory for power on reason\n");
Ajay Dudani23a18c32011-11-18 08:37:01 -0800174 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800175 dprintf(INFO, "Power on reason %u\n", power_on_status);
Ajay Dudani23a18c32011-11-18 08:37:01 -0800176 return power_on_status;
177}
178
Amol Jadica4f4c92011-01-13 20:19:34 -0800179void reboot_device(unsigned reboot_reason)
180{
Trevor Bourgeta5c4a242011-11-08 15:37:08 -0800181 writel(reboot_reason, RESTART_REASON_ADDR);
182
Shashank Mittal6239b162011-06-28 17:59:33 -0700183 /* Actually reset the chip */
Shashank Mittal39503262011-07-19 11:41:35 -0700184 pm8921_config_reset_pwr_off(1);
Shashank Mittal6239b162011-06-28 17:59:33 -0700185 writel(0, MSM_PSHOLD_CTL_SU);
Amol Jadica4f4c92011-01-13 20:19:34 -0800186 mdelay(10000);
Shashank Mittal39503262011-07-19 11:41:35 -0700187
Ajay Dudanib01e5062011-12-03 23:23:42 -0800188 dprintf(CRITICAL, "PSHOLD failed, trying watchdog reset\n");
Trevor Bourgetcc278352011-11-08 15:49:30 -0800189 writel(1, MSM_WDT0_RST);
190 writel(0, MSM_WDT0_EN);
191 writel(0x31F3, MSM_WDT0_BT);
192 writel(3, MSM_WDT0_EN);
193 dmb();
194 writel(3, MSM_TCSR_BASE + TCSR_WDOG_CFG);
195 mdelay(10000);
196
Ajay Dudanib01e5062011-12-03 23:23:42 -0800197 dprintf(CRITICAL, "Rebooting failed\n");
Amol Jadica4f4c92011-01-13 20:19:34 -0800198}
199
200unsigned check_reboot_mode(void)
201{
202 unsigned restart_reason = 0;
Amol Jadica4f4c92011-01-13 20:19:34 -0800203
204 /* Read reboot reason and scrub it */
Shashank Mittal0207df72011-06-15 15:20:43 -0700205 restart_reason = readl(RESTART_REASON_ADDR);
206 writel(0x00, RESTART_REASON_ADDR);
Amol Jadica4f4c92011-01-13 20:19:34 -0800207
208 return restart_reason;
209}
210
Ajay Dudani23a18c32011-11-18 08:37:01 -0800211unsigned target_pause_for_battery_charge(void)
212{
Ajay Dudaniba822332011-11-25 13:37:31 -0800213 if (target_check_power_on_reason() == PWR_ON_EVENT_WALL_CHG)
Ajay Dudani23a18c32011-11-18 08:37:01 -0800214 return 1;
215
216 return 0;
217}
218
Ajay Dudani12091e22011-05-06 17:13:23 -0700219void target_serialno(unsigned char *buf)
220{
221 unsigned int serialno;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800222 if (target_is_emmc_boot()) {
223 serialno = mmc_get_psn();
224 snprintf((char *)buf, 13, "%x", serialno);
Ajay Dudani12091e22011-05-06 17:13:23 -0700225 }
226}
227
Amol Jadica4f4c92011-01-13 20:19:34 -0800228void target_battery_charging_enable(unsigned enable, unsigned disconnect)
229{
230}
Amol Jadi57abe4c2011-05-24 15:47:27 -0700231
232/* Do any target specific intialization needed before entering fastboot mode */
233void target_fastboot_init(void)
234{
235 /* Set the BOOT_DONE flag in PM8921 */
236 pm8921_boot_done();
237}
Amol Jadic52c8a32011-07-12 11:27:04 -0700238
Amol Jadia63aaff2012-02-01 15:51:50 -0800239void target_uart_init(void)
Amol Jadic52c8a32011-07-12 11:27:04 -0700240{
Shashank Mittala635abf2012-03-28 18:11:43 -0700241 unsigned target_id = board_machtype();
242
Ajay Dudanib01e5062011-12-03 23:23:42 -0800243 switch (target_id) {
244 case LINUX_MACHTYPE_8960_SIM:
245 case LINUX_MACHTYPE_8960_RUMI3:
246 case LINUX_MACHTYPE_8960_CDP:
247 case LINUX_MACHTYPE_8960_MTP:
248 case LINUX_MACHTYPE_8960_FLUID:
249 case LINUX_MACHTYPE_8960_APQ:
250 case LINUX_MACHTYPE_8960_LIQUID:
Amol Jadi0c04df82011-10-14 17:40:21 -0700251
Amol Jadia63aaff2012-02-01 15:51:50 -0800252 uart_dm_init(5, 0x16400000, 0x16440000);
253 break;
Amol Jadi0c04df82011-10-14 17:40:21 -0700254
Ajay Dudanib01e5062011-12-03 23:23:42 -0800255 case LINUX_MACHTYPE_8930_CDP:
256 case LINUX_MACHTYPE_8930_MTP:
257 case LINUX_MACHTYPE_8930_FLUID:
Amol Jadi0c04df82011-10-14 17:40:21 -0700258
Amol Jadia63aaff2012-02-01 15:51:50 -0800259 uart_dm_init(5, 0x16400000, 0x16440000);
260 break;
Amol Jadi0c04df82011-10-14 17:40:21 -0700261
Ajay Dudanib01e5062011-12-03 23:23:42 -0800262 case LINUX_MACHTYPE_8064_SIM:
263 case LINUX_MACHTYPE_8064_RUMI3:
Amol Jadia63aaff2012-02-01 15:51:50 -0800264 uart_dm_init(3, 0x16200000, 0x16240000);
265 break;
Amol Jadi0c04df82011-10-14 17:40:21 -0700266
Amol Jadia63aaff2012-02-01 15:51:50 -0800267 case LINUX_MACHTYPE_8064_CDP:
268 case LINUX_MACHTYPE_8064_MTP:
269 case LINUX_MACHTYPE_8064_LIQUID:
270 uart_dm_init(7, 0x16600000, 0x16640000);
271 break;
Amol Jadi0c04df82011-10-14 17:40:21 -0700272
Amol Jadic4263042012-03-29 16:18:11 -0700273 case LINUX_MACHTYPE_8064_MPQ_CDP:
274 uart_dm_init(5, 0x1A200000, 0x1A240000);
275 break;
276
Ajay Dudanib01e5062011-12-03 23:23:42 -0800277 case LINUX_MACHTYPE_8627_CDP:
278 case LINUX_MACHTYPE_8627_MTP:
Shashank Mittal26309ed2011-12-01 16:05:45 -0800279
Amol Jadia63aaff2012-02-01 15:51:50 -0800280 uart_dm_init(5, 0x16400000, 0x16440000);
281 break;
Shashank Mittal26309ed2011-12-01 16:05:45 -0800282
Ajay Dudanib01e5062011-12-03 23:23:42 -0800283 default:
284 dprintf(CRITICAL, "uart gsbi not defined for target: %d\n",
285 target_id);
Amol Jadi0c04df82011-10-14 17:40:21 -0700286
Ajay Dudanib01e5062011-12-03 23:23:42 -0800287 ASSERT(0);
Amol Jadi0c04df82011-10-14 17:40:21 -0700288 }
Amol Jadic52c8a32011-07-12 11:27:04 -0700289}
Shashank Mittal4bfb2e32012-04-16 10:56:27 -0700290
Amol Jadi5c61a952012-05-04 17:05:35 -0700291/* Detect the target type */
292void target_detect(struct board_data *board)
293{
294 uint32_t platform;
295 uint32_t platform_hw;
296 uint32_t target_id;
297
298 platform = board->platform;
299 platform_hw = board->platform_hw;
300
301 /* Detect the board we are running on */
302 if ((platform == MSM8960) || (platform == MSM8660A)
303 || (platform == MSM8260A) || (platform == APQ8060A)) {
304 switch (platform_hw) {
305 case HW_PLATFORM_SURF:
306 target_id = LINUX_MACHTYPE_8960_CDP;
307 break;
308 case HW_PLATFORM_MTP:
309 target_id = LINUX_MACHTYPE_8960_MTP;
310 break;
311 case HW_PLATFORM_FLUID:
312 target_id = LINUX_MACHTYPE_8960_FLUID;
313 break;
314 case HW_PLATFORM_LIQUID:
315 target_id = LINUX_MACHTYPE_8960_LIQUID;
316 break;
317 default:
318 target_id = LINUX_MACHTYPE_8960_CDP;
319 }
320 } else if ((platform == MSM8230) || (platform == MSM8630)
321 || (platform == MSM8930) || (platform == APQ8030)) {
322 switch (platform_hw) {
323 case HW_PLATFORM_SURF:
324 target_id = LINUX_MACHTYPE_8930_CDP;
325 break;
326 case HW_PLATFORM_MTP:
327 target_id = LINUX_MACHTYPE_8930_MTP;
328 break;
329 case HW_PLATFORM_FLUID:
330 target_id = LINUX_MACHTYPE_8930_FLUID;
331 break;
332 default:
333 target_id = LINUX_MACHTYPE_8930_CDP;
334 }
335 } else if ((platform == MSM8227) || (platform == MSM8627)) {
336 switch (platform_hw) {
337 case HW_PLATFORM_SURF:
338 target_id = LINUX_MACHTYPE_8627_CDP;
339 break;
340 case HW_PLATFORM_MTP:
341 target_id = LINUX_MACHTYPE_8627_MTP;
342 break;
343 default:
344 target_id = LINUX_MACHTYPE_8627_CDP;
345 }
346 } else if (platform == MPQ8064) {
347 switch (platform_hw) {
348 case HW_PLATFORM_SURF:
349 target_id = LINUX_MACHTYPE_8064_MPQ_CDP;
350 break;
351 case HW_PLATFORM_HRD:
352 target_id = LINUX_MACHTYPE_8064_HRD;
353 break;
354 case HW_PLATFORM_DTV:
355 target_id = LINUX_MACHTYPE_8064_DTV;
356 break;
357 default:
358 target_id = LINUX_MACHTYPE_8064_MPQ_CDP;
359 }
360 } else if ((platform == APQ8064)) {
361 switch (platform_hw) {
362 case HW_PLATFORM_SURF:
363 target_id = LINUX_MACHTYPE_8064_CDP;
364 break;
365 case HW_PLATFORM_MTP:
366 target_id = LINUX_MACHTYPE_8064_MTP;
367 break;
368 case HW_PLATFORM_LIQUID:
369 target_id = LINUX_MACHTYPE_8064_LIQUID;
370 break;
371 default:
372 target_id = LINUX_MACHTYPE_8064_CDP;
373 }
374 } else {
375 dprintf(CRITICAL, "platform (%d) is not identified.\n",
376 platform);
377 ASSERT(0);
378 }
379 board->target = target_id;
380}
381
382/* Detect the modem type */
383void target_baseband_detect(struct board_data *board)
384{
385 uint32_t baseband;
386 uint32_t platform;
387 uint32_t platform_subtype;
388
389 platform = board->platform;
390 platform_subtype = board->platform_subtype;
391
392 /* Check for baseband variants. Default to MSM */
393 if (platform_subtype == HW_PLATFORM_SUBTYPE_MDM)
394 baseband = BASEBAND_MDM;
395 else if (platform_subtype == HW_PLATFORM_SUBTYPE_SGLTE)
396 baseband = BASEBAND_SGLTE;
397 else if (platform == APQ8060)
398 baseband = BASEBAND_APQ;
399 else if (platform == APQ8064)
400 baseband = BASEBAND_APQ;
401 else if (platform == MPQ8064)
402 baseband = BASEBAND_APQ;
403 else
404 baseband = BASEBAND_MSM;
405
406 board->baseband = baseband;
407}
408