blob: db569ab15701961451cc65dd4432df9bf014dd43 [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>
42#include <dev/gpio_keypad.h>
Amol Jadica4f4c92011-01-13 20:19:34 -080043
44#define LINUX_MACHTYPE_8960_SIM 3230
45#define LINUX_MACHTYPE_8960_RUMI3 3231
Shashank Mittald67508a2011-05-06 19:18:42 -070046#define LINUX_MACHTYPE_8960_CDP 3396
47#define LINUX_MACHTYPE_8960_MTP 3397
48#define LINUX_MACHTYPE_8960_FLUID 3398
49#define LINUX_MACHTYPE_8960_APQ 3399
Amol Jadica4f4c92011-01-13 20:19:34 -080050
Amol Jadicd43ea02011-02-15 20:56:04 -080051extern void dmb(void);
Amol Jadi6db9fe32011-04-15 17:19:00 -070052extern void keypad_init(void);
Amol Jadicd43ea02011-02-15 20:56:04 -080053
Shashank Mittalda89a682011-03-14 19:18:38 -070054static unsigned mmc_sdc_base[] = { MSM_SDC1_BASE, MSM_SDC2_BASE, MSM_SDC3_BASE, MSM_SDC4_BASE};
55
Amol Jadi57abe4c2011-05-24 15:47:27 -070056static pm8921_dev_t pmic;
57
Amol Jadica4f4c92011-01-13 20:19:34 -080058void target_init(void)
59{
Shashank Mittalda89a682011-03-14 19:18:38 -070060 unsigned base_addr;
61 unsigned char slot;
Amol Jadica4f4c92011-01-13 20:19:34 -080062 dprintf(INFO, "target_init()\n");
63
Amol Jadi57abe4c2011-05-24 15:47:27 -070064 /* Initialize PMIC driver */
65 pmic.read = pa1_ssbi2_read_bytes;
66 pmic.write = pa1_ssbi2_write_bytes;
67
68 pm8921_init(&pmic);
69
Amol Jadi6db9fe32011-04-15 17:19:00 -070070 /* Keypad init */
71 keys_init();
72 keypad_init();
73
Kinson Chik1ac45ce2011-05-29 22:01:34 -070074 /* Turn on Backlight */
75 panel_backlight_on();
76
Shashank Mittalda89a682011-03-14 19:18:38 -070077 /* Trying Slot 1 first */
78 slot = 1;
79 base_addr = mmc_sdc_base[slot-1];
80 if(mmc_boot_main(slot, base_addr))
Amol Jadica4f4c92011-01-13 20:19:34 -080081 {
Shashank Mittalda89a682011-03-14 19:18:38 -070082 /* Trying Slot 3 next */
83 slot = 3;
84 base_addr = mmc_sdc_base[slot-1];
85 if(mmc_boot_main(slot, base_addr))
86 {
87 dprintf(CRITICAL, "mmc init failed!");
88 ASSERT(0);
89 }
Amol Jadica4f4c92011-01-13 20:19:34 -080090 }
91}
92
93unsigned board_machtype(void)
94{
Shashank Mittalda89a682011-03-14 19:18:38 -070095 struct smem_board_info_v6 board_info_v6;
96 unsigned int board_info_len = 0;
97 unsigned smem_status = 0;
98 unsigned format = 0;
Amol Jadi64c58c12011-05-11 13:40:25 -070099 unsigned id = HW_PLATFORM_UNKNOWN;
100 unsigned mach_id;
Amol Jadica4f4c92011-01-13 20:19:34 -0800101
Shashank Mittald67508a2011-05-06 19:18:42 -0700102
Shashank Mittalda89a682011-03-14 19:18:38 -0700103 smem_status = smem_read_alloc_entry_offset(SMEM_BOARD_INFO_LOCATION,
104 &format, sizeof(format), 0);
105 if(!smem_status)
106 {
Amol Jadi64c58c12011-05-11 13:40:25 -0700107 if (format == 6)
Shashank Mittalda89a682011-03-14 19:18:38 -0700108 {
109 board_info_len = sizeof(board_info_v6);
110
111 smem_status = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
112 &board_info_v6, board_info_len);
113 if(!smem_status)
114 {
115 id = board_info_v6.board_info_v3.hw_platform;
116 }
117 }
118 }
119
Amol Jadi64c58c12011-05-11 13:40:25 -0700120 /* Detect the board we are running on */
Shashank Mittalda89a682011-03-14 19:18:38 -0700121 switch(id)
122 {
123 case HW_PLATFORM_SURF:
Amol Jadi64c58c12011-05-11 13:40:25 -0700124 mach_id = LINUX_MACHTYPE_8960_CDP;
Shashank Mittalda89a682011-03-14 19:18:38 -0700125 break;
126 case HW_PLATFORM_FFA:
Amol Jadi64c58c12011-05-11 13:40:25 -0700127 mach_id = LINUX_MACHTYPE_8960_MTP;
128 break;
129 case HW_PLATFORM_FLUID:
130 mach_id = LINUX_MACHTYPE_8960_FLUID;
Shashank Mittalda89a682011-03-14 19:18:38 -0700131 break;
132 default:
Amol Jadi64c58c12011-05-11 13:40:25 -0700133 mach_id = LINUX_MACHTYPE_8960_CDP;
Shashank Mittalda89a682011-03-14 19:18:38 -0700134 };
135
136 return mach_id;
Amol Jadica4f4c92011-01-13 20:19:34 -0800137}
138
139void reboot_device(unsigned reboot_reason)
140{
Amol Jadica4f4c92011-01-13 20:19:34 -0800141 /* Disable WDG0 */
142 writel(0,MSM_WDT0_EN);
Shashank Mittal6239b162011-06-28 17:59:33 -0700143
144 /* Actually reset the chip */
145 writel(0, MSM_PSHOLD_CTL_SU);
146 mdelay(5000);
147
148 /* Fall back to watchdog */
149 /* Reset WDG0 counter */
150 writel(1,MSM_WDT0_RST);
Amol Jadica4f4c92011-01-13 20:19:34 -0800151 /* Set WDG0 bark time */
152 writel(0x31F3,MSM_WDT0_BT);
153 /* Enable WDG0 */
154 writel(3,MSM_WDT0_EN);
155 dmb();
156 /* Enable WDG output */
157 writel(3,MSM_TCSR_BASE + TCSR_WDOG_CFG);
158 mdelay(10000);
159 dprintf (CRITICAL, "Rebooting failed\n");
160 return;
161}
162
163unsigned check_reboot_mode(void)
164{
165 unsigned restart_reason = 0;
Amol Jadica4f4c92011-01-13 20:19:34 -0800166
167 /* Read reboot reason and scrub it */
Shashank Mittal0207df72011-06-15 15:20:43 -0700168 restart_reason = readl(RESTART_REASON_ADDR);
169 writel(0x00, RESTART_REASON_ADDR);
Amol Jadica4f4c92011-01-13 20:19:34 -0800170
171 return restart_reason;
172}
173
Ajay Dudani12091e22011-05-06 17:13:23 -0700174void target_serialno(unsigned char *buf)
175{
176 unsigned int serialno;
177 if(target_is_emmc_boot())
178 {
179 serialno = mmc_get_psn();
Greg Griscod6250552011-06-29 14:40:23 -0700180 sprintf((char *) buf,"%x",serialno);
Ajay Dudani12091e22011-05-06 17:13:23 -0700181 }
182}
183
Amol Jadica4f4c92011-01-13 20:19:34 -0800184void target_battery_charging_enable(unsigned enable, unsigned disconnect)
185{
186}
Amol Jadi57abe4c2011-05-24 15:47:27 -0700187
188/* Do any target specific intialization needed before entering fastboot mode */
189void target_fastboot_init(void)
190{
191 /* Set the BOOT_DONE flag in PM8921 */
192 pm8921_boot_done();
193}