blob: 4a5d84f6e90838eeb2dc25fa6fa9d56d2e00b7f7 [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 Jadi76071672012-02-03 12:19:36 -0800116 else if(platform_id == APQ8064)
117 {
118 apq8064_keypad_init();
119 }
Amol Jadi6db9fe32011-04-15 17:19:00 -0700120
Kinson Chikce306ff2011-07-08 15:23:33 -0700121 /* Display splash screen if enabled */
122#if DISPLAY_SPLASH_SCREEN
Ajay Dudanib01e5062011-12-03 23:23:42 -0800123 if ((platform_id == MSM8960) || (platform_id == MSM8660A)
124 || (platform_id == MSM8260A) || (platform_id == APQ8060A)
125 || (platform_id == MSM8230) || (platform_id == MSM8630)
126 || (platform_id == MSM8930) || (platform_id == APQ8030)
127 || (platform_id == MSM8227) || (platform_id == MSM8627)) {
Amol Jadi0c04df82011-10-14 17:40:21 -0700128 panel_backlight_on();
129 display_init();
130 dprintf(SPEW, "Diplay initialized\n");
131 display_image_on_screen();
132 }
Kinson Chikce306ff2011-07-08 15:23:33 -0700133#endif
134
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -0800135 if ((platform_id == MSM8960) || (platform_id == MSM8660A)
136 || (platform_id == MSM8260A) || (platform_id == APQ8060A))
137 /* Enable Hardware CE */
138 platform_ce_type = CRYPTO_ENGINE_TYPE_HW;
139
Shashank Mittalda89a682011-03-14 19:18:38 -0700140 /* Trying Slot 1 first */
141 slot = 1;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800142 base_addr = mmc_sdc_base[slot - 1];
143 if (mmc_boot_main(slot, base_addr)) {
Shashank Mittalda89a682011-03-14 19:18:38 -0700144 /* Trying Slot 3 next */
145 slot = 3;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800146 base_addr = mmc_sdc_base[slot - 1];
147 if (mmc_boot_main(slot, base_addr)) {
Shashank Mittalda89a682011-03-14 19:18:38 -0700148 dprintf(CRITICAL, "mmc init failed!");
149 ASSERT(0);
150 }
Amol Jadica4f4c92011-01-13 20:19:34 -0800151 }
152}
153
154unsigned board_machtype(void)
155{
Shashank Mittala635abf2012-03-28 18:11:43 -0700156 return board_target_id();
Amol Jadia63aaff2012-02-01 15:51:50 -0800157}
158
Deepa Dinamani5e5c21a2012-02-16 18:59:57 -0800159crypto_engine_type board_ce_type(void)
160{
161 return platform_ce_type;
162}
163
Ajay Dudani403bc492011-09-30 16:17:21 -0700164unsigned target_baseband()
165{
Shashank Mittala635abf2012-03-28 18:11:43 -0700166 return board_baseband();
Ajay Dudani403bc492011-09-30 16:17:21 -0700167}
168
Ajay Dudani23a18c32011-11-18 08:37:01 -0800169static unsigned target_check_power_on_reason(void)
170{
171 unsigned power_on_status = 0;
172 unsigned int status_len = sizeof(power_on_status);
173 unsigned smem_status;
174
175 smem_status = smem_read_alloc_entry(SMEM_POWER_ON_STATUS_INFO,
Ajay Dudanib01e5062011-12-03 23:23:42 -0800176 &power_on_status, status_len);
Ajay Dudani23a18c32011-11-18 08:37:01 -0800177
Ajay Dudanib01e5062011-12-03 23:23:42 -0800178 if (smem_status) {
179 dprintf(CRITICAL,
180 "ERROR: unable to read shared memory for power on reason\n");
Ajay Dudani23a18c32011-11-18 08:37:01 -0800181 }
Ajay Dudanib01e5062011-12-03 23:23:42 -0800182 dprintf(INFO, "Power on reason %u\n", power_on_status);
Ajay Dudani23a18c32011-11-18 08:37:01 -0800183 return power_on_status;
184}
185
Amol Jadica4f4c92011-01-13 20:19:34 -0800186void reboot_device(unsigned reboot_reason)
187{
Trevor Bourgeta5c4a242011-11-08 15:37:08 -0800188 writel(reboot_reason, RESTART_REASON_ADDR);
189
Shashank Mittal6239b162011-06-28 17:59:33 -0700190 /* Actually reset the chip */
Shashank Mittal39503262011-07-19 11:41:35 -0700191 pm8921_config_reset_pwr_off(1);
Shashank Mittal6239b162011-06-28 17:59:33 -0700192 writel(0, MSM_PSHOLD_CTL_SU);
Amol Jadica4f4c92011-01-13 20:19:34 -0800193 mdelay(10000);
Shashank Mittal39503262011-07-19 11:41:35 -0700194
Ajay Dudanib01e5062011-12-03 23:23:42 -0800195 dprintf(CRITICAL, "PSHOLD failed, trying watchdog reset\n");
Trevor Bourgetcc278352011-11-08 15:49:30 -0800196 writel(1, MSM_WDT0_RST);
197 writel(0, MSM_WDT0_EN);
198 writel(0x31F3, MSM_WDT0_BT);
199 writel(3, MSM_WDT0_EN);
200 dmb();
201 writel(3, MSM_TCSR_BASE + TCSR_WDOG_CFG);
202 mdelay(10000);
203
Ajay Dudanib01e5062011-12-03 23:23:42 -0800204 dprintf(CRITICAL, "Rebooting failed\n");
Amol Jadica4f4c92011-01-13 20:19:34 -0800205}
206
207unsigned check_reboot_mode(void)
208{
209 unsigned restart_reason = 0;
Amol Jadica4f4c92011-01-13 20:19:34 -0800210
211 /* Read reboot reason and scrub it */
Shashank Mittal0207df72011-06-15 15:20:43 -0700212 restart_reason = readl(RESTART_REASON_ADDR);
213 writel(0x00, RESTART_REASON_ADDR);
Amol Jadica4f4c92011-01-13 20:19:34 -0800214
215 return restart_reason;
216}
217
Ajay Dudani23a18c32011-11-18 08:37:01 -0800218unsigned target_pause_for_battery_charge(void)
219{
Ajay Dudaniba822332011-11-25 13:37:31 -0800220 if (target_check_power_on_reason() == PWR_ON_EVENT_WALL_CHG)
Ajay Dudani23a18c32011-11-18 08:37:01 -0800221 return 1;
222
223 return 0;
224}
225
Ajay Dudani12091e22011-05-06 17:13:23 -0700226void target_serialno(unsigned char *buf)
227{
228 unsigned int serialno;
Ajay Dudanib01e5062011-12-03 23:23:42 -0800229 if (target_is_emmc_boot()) {
230 serialno = mmc_get_psn();
231 snprintf((char *)buf, 13, "%x", serialno);
Ajay Dudani12091e22011-05-06 17:13:23 -0700232 }
233}
234
Amol Jadica4f4c92011-01-13 20:19:34 -0800235void target_battery_charging_enable(unsigned enable, unsigned disconnect)
236{
237}
Amol Jadi57abe4c2011-05-24 15:47:27 -0700238
239/* Do any target specific intialization needed before entering fastboot mode */
240void target_fastboot_init(void)
241{
242 /* Set the BOOT_DONE flag in PM8921 */
243 pm8921_boot_done();
244}
Amol Jadic52c8a32011-07-12 11:27:04 -0700245
Amol Jadia63aaff2012-02-01 15:51:50 -0800246void target_uart_init(void)
Amol Jadic52c8a32011-07-12 11:27:04 -0700247{
Shashank Mittala635abf2012-03-28 18:11:43 -0700248 unsigned target_id = board_machtype();
249
Ajay Dudanib01e5062011-12-03 23:23:42 -0800250 switch (target_id) {
251 case LINUX_MACHTYPE_8960_SIM:
252 case LINUX_MACHTYPE_8960_RUMI3:
253 case LINUX_MACHTYPE_8960_CDP:
254 case LINUX_MACHTYPE_8960_MTP:
255 case LINUX_MACHTYPE_8960_FLUID:
256 case LINUX_MACHTYPE_8960_APQ:
257 case LINUX_MACHTYPE_8960_LIQUID:
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_8930_CDP:
263 case LINUX_MACHTYPE_8930_MTP:
264 case LINUX_MACHTYPE_8930_FLUID:
Amol Jadi0c04df82011-10-14 17:40:21 -0700265
Amol Jadia63aaff2012-02-01 15:51:50 -0800266 uart_dm_init(5, 0x16400000, 0x16440000);
267 break;
Amol Jadi0c04df82011-10-14 17:40:21 -0700268
Ajay Dudanib01e5062011-12-03 23:23:42 -0800269 case LINUX_MACHTYPE_8064_SIM:
270 case LINUX_MACHTYPE_8064_RUMI3:
Amol Jadia63aaff2012-02-01 15:51:50 -0800271 uart_dm_init(3, 0x16200000, 0x16240000);
272 break;
Amol Jadi0c04df82011-10-14 17:40:21 -0700273
Amol Jadia63aaff2012-02-01 15:51:50 -0800274 case LINUX_MACHTYPE_8064_CDP:
275 case LINUX_MACHTYPE_8064_MTP:
276 case LINUX_MACHTYPE_8064_LIQUID:
277 uart_dm_init(7, 0x16600000, 0x16640000);
278 break;
Amol Jadi0c04df82011-10-14 17:40:21 -0700279
Ajay Dudanib01e5062011-12-03 23:23:42 -0800280 case LINUX_MACHTYPE_8627_CDP:
281 case LINUX_MACHTYPE_8627_MTP:
Shashank Mittal26309ed2011-12-01 16:05:45 -0800282
Amol Jadia63aaff2012-02-01 15:51:50 -0800283 uart_dm_init(5, 0x16400000, 0x16440000);
284 break;
Shashank Mittal26309ed2011-12-01 16:05:45 -0800285
Ajay Dudanib01e5062011-12-03 23:23:42 -0800286 default:
287 dprintf(CRITICAL, "uart gsbi not defined for target: %d\n",
288 target_id);
Amol Jadi0c04df82011-10-14 17:40:21 -0700289
Ajay Dudanib01e5062011-12-03 23:23:42 -0800290 ASSERT(0);
Amol Jadi0c04df82011-10-14 17:40:21 -0700291 }
Amol Jadic52c8a32011-07-12 11:27:04 -0700292}