blob: f397153f90d6e637aa6a2614b4a9766471e7da85 [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