blob: 60457cc1f4794298f8876304353327b8bb050840 [file] [log] [blame]
Sravan Kumar Ambapuramb22cf4d2012-01-02 21:45:04 +05301/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Taniya Dasc98bfbc2011-08-23 09:58:55 +05302 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/gpio_event.h>
Pankaj Kumar6f841742011-10-10 15:52:14 +053016#include <linux/usb/android.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053017#include <linux/platform_device.h>
18#include <linux/io.h>
19#include <linux/gpio.h>
20#include <linux/mtd/nand.h>
21#include <linux/mtd/partitions.h>
22#include <linux/i2c.h>
23#include <linux/android_pmem.h>
24#include <linux/bootmem.h>
25#include <linux/mfd/marimba.h>
26#include <linux/power_supply.h>
Trilok Sonib9410792012-04-07 15:37:13 +053027#include <linux/input/rmi_platformdata.h>
28#include <linux/input/rmi_i2c.h>
29#include <linux/i2c/atmel_mxt_ts.h>
Pankaj Kumar3cec0582011-11-18 11:13:29 +053030#include <linux/regulator/consumer.h>
Chintan Pandyaf4ad4002012-02-28 19:49:03 +053031#include <linux/memblock.h>
Mohan Pallaka5afe9852012-01-12 23:12:06 +053032#include <linux/input/ft5x06_ts.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053033#include <asm/mach/mmc.h>
34#include <asm/mach-types.h>
35#include <asm/mach/arch.h>
Chintan Pandyaf4ad4002012-02-28 19:49:03 +053036#include <asm/hardware/gic.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053037#include <mach/board.h>
38#include <mach/msm_iomap.h>
39#include <mach/msm_hsusb.h>
40#include <mach/rpc_hsusb.h>
41#include <mach/rpc_pmapp.h>
42#include <mach/usbdiag.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053043#include <mach/msm_memtypes.h>
44#include <mach/msm_serial_hs.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053045#include <mach/pmic.h>
46#include <mach/socinfo.h>
47#include <mach/vreg.h>
48#include <mach/rpc_pmapp.h>
49#include <mach/msm_battery.h>
50#include <mach/rpc_server_handset.h>
51#include <mach/socinfo.h>
Pankaj Kumar27c02642011-09-22 15:55:55 +053052#include "board-msm7x27a-regulator.h"
Taniya Dasc98bfbc2011-08-23 09:58:55 +053053#include "devices.h"
54#include "devices-msm7x2xa.h"
Matt Wagantall7cca4642012-02-01 16:43:24 -080055#include "pm.h"
Taniya Dasc98bfbc2011-08-23 09:58:55 +053056#include "timer.h"
Murali Nalajalaa1827842011-11-13 14:12:39 +053057#include "pm-boot.h"
Pankaj Kumar3cec0582011-11-18 11:13:29 +053058#include "board-msm7x27a-regulator.h"
Chintan Pandyacf467fc2011-12-01 17:11:11 +053059#include "board-msm7627a.h"
Taniya Dasc98bfbc2011-08-23 09:58:55 +053060
Trilok Sonib9410792012-04-07 15:37:13 +053061#define PMEM_KERNEL_EBI1_SIZE 0x3A000
62#define MSM_PMEM_AUDIO_SIZE 0x5B000
63#define BAHAMA_SLAVE_ID_FM_REG 0x02
64#define FM_GPIO 83
65#define BT_PCM_BCLK_MODE 0x88
66#define BT_PCM_DIN_MODE 0x89
67#define BT_PCM_DOUT_MODE 0x8A
68#define BT_PCM_SYNC_MODE 0x8B
69#define FM_I2S_SD_MODE 0x8E
70#define FM_I2S_WS_MODE 0x8F
71#define FM_I2S_SCK_MODE 0x90
72#define I2C_PIN_CTL 0x15
73#define I2C_NORMAL 0x40
74
Taniya Dasc98bfbc2011-08-23 09:58:55 +053075static struct platform_device msm_wlan_ar6000_pm_device = {
76 .name = "wlan_ar6000_pm_dev",
77 .id = -1,
78};
79
Taniya Dasc98bfbc2011-08-23 09:58:55 +053080static struct msm_gpio qup_i2c_gpios_io[] = {
81 { GPIO_CFG(60, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
82 "qup_scl" },
83 { GPIO_CFG(61, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
84 "qup_sda" },
85 { GPIO_CFG(131, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
86 "qup_scl" },
87 { GPIO_CFG(132, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
88 "qup_sda" },
89};
90
91static struct msm_gpio qup_i2c_gpios_hw[] = {
92 { GPIO_CFG(60, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
93 "qup_scl" },
94 { GPIO_CFG(61, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
95 "qup_sda" },
96 { GPIO_CFG(131, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
97 "qup_scl" },
98 { GPIO_CFG(132, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
99 "qup_sda" },
100};
101
102static void gsbi_qup_i2c_gpio_config(int adap_id, int config_type)
103{
104 int rc;
105
106 if (adap_id < 0 || adap_id > 1)
107 return;
108
109 /* Each adapter gets 2 lines from the table */
110 if (config_type)
111 rc = msm_gpios_request_enable(&qup_i2c_gpios_hw[adap_id*2], 2);
112 else
113 rc = msm_gpios_request_enable(&qup_i2c_gpios_io[adap_id*2], 2);
114 if (rc < 0)
115 pr_err("QUP GPIO request/enable failed: %d\n", rc);
116}
117
118static struct msm_i2c_platform_data msm_gsbi0_qup_i2c_pdata = {
119 .clk_freq = 100000,
120 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
121};
122
123static struct msm_i2c_platform_data msm_gsbi1_qup_i2c_pdata = {
124 .clk_freq = 100000,
125 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
126};
127
Trilok Sonib9410792012-04-07 15:37:13 +0530128#ifdef CONFIG_ARCH_MSM7X27A
129#define MSM_PMEM_MDP_SIZE 0x1DD1000
130#define MSM_PMEM_ADSP_SIZE 0x1100000
131#endif
132
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530133static struct android_usb_platform_data android_usb_pdata = {
Pankaj Kumar6f841742011-10-10 15:52:14 +0530134 .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530135};
136
137static struct platform_device android_usb_device = {
138 .name = "android_usb",
139 .id = -1,
140 .dev = {
141 .platform_data = &android_usb_pdata,
142 },
143};
144
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530145#ifdef CONFIG_USB_EHCI_MSM_72K
146static void msm_hsusb_vbus_power(unsigned phy_info, int on)
147{
148 int rc = 0;
149 unsigned gpio;
150
Chintan Pandya40762702011-12-06 13:47:06 +0530151 gpio = QRD_GPIO_HOST_VBUS_EN;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530152
153 rc = gpio_request(gpio, "i2c_host_vbus_en");
154 if (rc < 0) {
155 pr_err("failed to request %d GPIO\n", gpio);
156 return;
157 }
158 gpio_direction_output(gpio, !!on);
159 gpio_set_value_cansleep(gpio, !!on);
160 gpio_free(gpio);
161}
162
163static struct msm_usb_host_platform_data msm_usb_host_pdata = {
164 .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_45NM),
165};
166
167static void __init msm7627a_init_host(void)
168{
169 msm_add_host(0, &msm_usb_host_pdata);
170}
171#endif
172
173#ifdef CONFIG_USB_MSM_OTG_72K
174static int hsusb_rpc_connect(int connect)
175{
176 if (connect)
177 return msm_hsusb_rpc_connect();
178 else
179 return msm_hsusb_rpc_close();
180}
181
Pankaj Kumar27c02642011-09-22 15:55:55 +0530182static struct regulator *reg_hsusb;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530183static int msm_hsusb_ldo_init(int init)
184{
Pankaj Kumar27c02642011-09-22 15:55:55 +0530185 int rc = 0;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530186
Pankaj Kumar27c02642011-09-22 15:55:55 +0530187 if (init) {
188 reg_hsusb = regulator_get(NULL, "usb");
189 if (IS_ERR(reg_hsusb)) {
190 rc = PTR_ERR(reg_hsusb);
191 pr_err("%s: could not get regulator: %d\n",
192 __func__, rc);
193 goto out;
194 }
195
196 rc = regulator_set_voltage(reg_hsusb, 3300000, 3300000);
197 if (rc) {
198 pr_err("%s: could not set voltage: %d\n",
199 __func__, rc);
200 goto reg_free;
201 }
202
203 return 0;
204 }
205 /* else fall through */
206reg_free:
207 regulator_put(reg_hsusb);
208out:
209 reg_hsusb = NULL;
210 return rc;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530211}
212
213static int msm_hsusb_ldo_enable(int enable)
214{
215 static int ldo_status;
216
Pankaj Kumar27c02642011-09-22 15:55:55 +0530217 if (IS_ERR_OR_NULL(reg_hsusb))
218 return reg_hsusb ? PTR_ERR(reg_hsusb) : -ENODEV;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530219
220 if (ldo_status == enable)
221 return 0;
222
223 ldo_status = enable;
224
Pankaj Kumar27c02642011-09-22 15:55:55 +0530225 return enable ?
226 regulator_enable(reg_hsusb) :
227 regulator_disable(reg_hsusb);
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530228}
229
230#ifndef CONFIG_USB_EHCI_MSM_72K
231static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init)
232{
233 int ret = 0;
234
235 if (init)
236 ret = msm_pm_app_rpc_init(callback);
237 else
238 msm_pm_app_rpc_deinit(callback);
239
240 return ret;
241}
242#endif
243
244static struct msm_otg_platform_data msm_otg_pdata = {
245#ifndef CONFIG_USB_EHCI_MSM_72K
246 .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init,
247#else
248 .vbus_power = msm_hsusb_vbus_power,
249#endif
250 .rpc_connect = hsusb_rpc_connect,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530251 .pemp_level = PRE_EMPHASIS_WITH_20_PERCENT,
252 .cdr_autoreset = CDR_AUTO_RESET_DISABLE,
253 .drv_ampl = HS_DRV_AMPLITUDE_DEFAULT,
254 .se1_gating = SE1_GATING_DISABLE,
255 .ldo_init = msm_hsusb_ldo_init,
256 .ldo_enable = msm_hsusb_ldo_enable,
257 .chg_init = hsusb_chg_init,
258 .chg_connected = hsusb_chg_connected,
259 .chg_vbus_draw = hsusb_chg_vbus_draw,
260};
261#endif
262
263static struct msm_hsusb_gadget_platform_data msm_gadget_pdata = {
264 .is_phy_status_timer_on = 1,
265};
266
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530267#ifdef CONFIG_SERIAL_MSM_HS
268static struct msm_serial_hs_platform_data msm_uart_dm1_pdata = {
269 .inject_rx_on_wakeup = 1,
270 .rx_to_inject = 0xFD,
271};
272#endif
273static struct msm_pm_platform_data msm7627a_pm_data[MSM_PM_SLEEP_MODE_NR] = {
274 [MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = {
275 .idle_supported = 1,
276 .suspend_supported = 1,
277 .idle_enabled = 1,
278 .suspend_enabled = 1,
279 .latency = 16000,
280 .residency = 20000,
281 },
282 [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] = {
283 .idle_supported = 1,
284 .suspend_supported = 1,
285 .idle_enabled = 1,
286 .suspend_enabled = 1,
287 .latency = 12000,
288 .residency = 20000,
289 },
290 [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT] = {
291 .idle_supported = 1,
292 .suspend_supported = 1,
293 .idle_enabled = 0,
294 .suspend_enabled = 1,
295 .latency = 2000,
296 .residency = 0,
297 },
298 [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT] = {
299 .idle_supported = 1,
300 .suspend_supported = 1,
301 .idle_enabled = 1,
302 .suspend_enabled = 1,
303 .latency = 2,
304 .residency = 0,
305 },
306};
307
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -0600308static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {
Sravan Kumar Ambapuramb22cf4d2012-01-02 21:45:04 +0530309 .mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_PHYS,
310 .p_addr = 0,
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -0600311};
312
Murali Nalajala4c996be2012-03-12 17:05:41 +0530313/* 8625 PM platform data */
314static struct msm_pm_platform_data msm8625_pm_data[MSM_PM_SLEEP_MODE_NR * 2] = {
315 /* CORE0 entries */
316 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE)] = {
317 .idle_supported = 1,
318 .suspend_supported = 1,
319 .idle_enabled = 0,
320 .suspend_enabled = 0,
321 .latency = 16000,
322 .residency = 20000,
323 },
324
325 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN)] = {
326 .idle_supported = 1,
327 .suspend_supported = 1,
328 .idle_enabled = 0,
329 .suspend_enabled = 0,
330 .latency = 12000,
331 .residency = 20000,
332 },
333
334 /* picked latency & redisdency values from 7x30 */
335 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = {
336 .idle_supported = 1,
337 .suspend_supported = 1,
338 .idle_enabled = 0,
339 .suspend_enabled = 0,
340 .latency = 500,
341 .residency = 6000,
342 },
343
344 [MSM_PM_MODE(0, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = {
345 .idle_supported = 1,
346 .suspend_supported = 1,
347 .idle_enabled = 1,
348 .suspend_enabled = 1,
349 .latency = 2,
350 .residency = 10,
351 },
352
353 /* picked latency & redisdency values from 7x30 */
354 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_POWER_COLLAPSE_STANDALONE)] = {
355 .idle_supported = 1,
356 .suspend_supported = 1,
357 .idle_enabled = 0,
358 .suspend_enabled = 0,
359 .latency = 500,
360 .residency = 6000,
361 },
362
363 [MSM_PM_MODE(1, MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT)] = {
364 .idle_supported = 1,
365 .suspend_supported = 1,
366 .idle_enabled = 1,
367 .suspend_enabled = 1,
368 .latency = 2,
369 .residency = 10,
370 },
371
372};
373
374static struct msm_pm_boot_platform_data msm_pm_8625_boot_pdata __initdata = {
375 .mode = MSM_PM_BOOT_CONFIG_REMAP_BOOT_ADDR,
376 .v_addr = MSM_CFG_CTL_BASE,
377};
378
Trilok Sonib9410792012-04-07 15:37:13 +0530379static struct android_pmem_platform_data android_pmem_adsp_pdata = {
380 .name = "pmem_adsp",
381 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
382 .cached = 1,
383 .memory_type = MEMTYPE_EBI1,
384};
385
386static struct platform_device android_pmem_adsp_device = {
387 .name = "android_pmem",
388 .id = 1,
389 .dev = { .platform_data = &android_pmem_adsp_pdata },
390};
391
392static unsigned pmem_mdp_size = MSM_PMEM_MDP_SIZE;
393static int __init pmem_mdp_size_setup(char *p)
394{
395 pmem_mdp_size = memparse(p, NULL);
396 return 0;
397}
398
399early_param("pmem_mdp_size", pmem_mdp_size_setup);
400
401static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;
402static int __init pmem_adsp_size_setup(char *p)
403{
404 pmem_adsp_size = memparse(p, NULL);
405 return 0;
406}
407
408early_param("pmem_adsp_size", pmem_adsp_size_setup);
409
410#define SND(desc, num) { .name = #desc, .id = num }
411static struct snd_endpoint snd_endpoints_list[] = {
412 SND(HANDSET, 0),
413 SND(MONO_HEADSET, 2),
414 SND(HEADSET, 3),
415 SND(SPEAKER, 6),
416 SND(TTY_HEADSET, 8),
417 SND(TTY_VCO, 9),
418 SND(TTY_HCO, 10),
419 SND(BT, 12),
420 SND(IN_S_SADC_OUT_HANDSET, 16),
421 SND(IN_S_SADC_OUT_SPEAKER_PHONE, 25),
422 SND(FM_DIGITAL_STEREO_HEADSET, 26),
423 SND(FM_DIGITAL_SPEAKER_PHONE, 27),
424 SND(FM_DIGITAL_BT_A2DP_HEADSET, 28),
425 SND(STEREO_HEADSET_AND_SPEAKER, 31),
426 SND(CURRENT, 0x7FFFFFFE),
427 SND(FM_ANALOG_STEREO_HEADSET, 35),
428 SND(FM_ANALOG_STEREO_HEADSET_CODEC, 36),
429};
430#undef SND
431
432static struct msm_snd_endpoints msm_device_snd_endpoints = {
433 .endpoints = snd_endpoints_list,
434 .num = sizeof(snd_endpoints_list) / sizeof(struct snd_endpoint)
435};
436
437static struct platform_device msm_device_snd = {
438 .name = "msm_snd",
439 .id = -1,
440 .dev = {
441 .platform_data = &msm_device_snd_endpoints
442 },
443};
444
445#define DEC0_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
446 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
447 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
448 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
449 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
450 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
451#define DEC1_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
452 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
453 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
454 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
455 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
456 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
457#define DEC2_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
458 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
459 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
460 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
461 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
462 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
463#define DEC3_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
464 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
465 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
466 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
467 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
468 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
469#define DEC4_FORMAT (1<<MSM_ADSP_CODEC_MIDI)
470
471static unsigned int dec_concurrency_table[] = {
472 /* Audio LP */
473 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DMA)), 0,
474 0, 0, 0,
475
476 /* Concurrency 1 */
477 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
478 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
479 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
480 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
481 (DEC4_FORMAT),
482
483 /* Concurrency 2 */
484 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
485 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
486 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
487 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
488 (DEC4_FORMAT),
489
490 /* Concurrency 3 */
491 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
492 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
493 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
494 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
495 (DEC4_FORMAT),
496
497 /* Concurrency 4 */
498 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
499 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
500 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
501 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
502 (DEC4_FORMAT),
503
504 /* Concurrency 5 */
505 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
506 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
507 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
508 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
509 (DEC4_FORMAT),
510
511 /* Concurrency 6 */
512 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
513 0, 0, 0, 0,
514
515 /* Concurrency 7 */
516 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
517 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
518 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
519 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
520 (DEC4_FORMAT),
521};
522
523#define DEC_INFO(name, queueid, decid, nr_codec) { .module_name = name, \
524 .module_queueid = queueid, .module_decid = decid, \
525 .nr_codec_support = nr_codec}
526
527static struct msm_adspdec_info dec_info_list[] = {
528 DEC_INFO("AUDPLAY0TASK", 13, 0, 11), /* AudPlay0BitStreamCtrlQueue */
529 DEC_INFO("AUDPLAY1TASK", 14, 1, 11), /* AudPlay1BitStreamCtrlQueue */
530 DEC_INFO("AUDPLAY2TASK", 15, 2, 11), /* AudPlay2BitStreamCtrlQueue */
531 DEC_INFO("AUDPLAY3TASK", 16, 3, 11), /* AudPlay3BitStreamCtrlQueue */
532 DEC_INFO("AUDPLAY4TASK", 17, 4, 1), /* AudPlay4BitStreamCtrlQueue */
533};
534
535static struct msm_adspdec_database msm_device_adspdec_database = {
536 .num_dec = ARRAY_SIZE(dec_info_list),
537 .num_concurrency_support = (ARRAY_SIZE(dec_concurrency_table) / \
538 ARRAY_SIZE(dec_info_list)),
539 .dec_concurrency_table = dec_concurrency_table,
540 .dec_info_list = dec_info_list,
541};
542
543static struct platform_device msm_device_adspdec = {
544 .name = "msm_adspdec",
545 .id = -1,
546 .dev = {
547 .platform_data = &msm_device_adspdec_database
548 },
549};
550
551static struct android_pmem_platform_data android_pmem_audio_pdata = {
552 .name = "pmem_audio",
553 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
554 .cached = 0,
555 .memory_type = MEMTYPE_EBI1,
556};
557
558static struct platform_device android_pmem_audio_device = {
559 .name = "android_pmem",
560 .id = 2,
561 .dev = { .platform_data = &android_pmem_audio_pdata },
562};
563
564static struct android_pmem_platform_data android_pmem_pdata = {
565 .name = "pmem",
566 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
567 .cached = 1,
568 .memory_type = MEMTYPE_EBI1,
569};
570static struct platform_device android_pmem_device = {
571 .name = "android_pmem",
572 .id = 0,
573 .dev = { .platform_data = &android_pmem_pdata },
574};
575
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530576static u32 msm_calculate_batt_capacity(u32 current_voltage);
577
578static struct msm_psy_batt_pdata msm_psy_batt_data = {
579 .voltage_min_design = 2800,
580 .voltage_max_design = 4300,
581 .avail_chg_sources = AC_CHG | USB_CHG ,
582 .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION,
583 .calculate_capacity = &msm_calculate_batt_capacity,
584};
585
586static u32 msm_calculate_batt_capacity(u32 current_voltage)
587{
588 u32 low_voltage = msm_psy_batt_data.voltage_min_design;
589 u32 high_voltage = msm_psy_batt_data.voltage_max_design;
590
591 return (current_voltage - low_voltage) * 100
592 / (high_voltage - low_voltage);
593}
594
595static struct platform_device msm_batt_device = {
596 .name = "msm-battery",
597 .id = -1,
598 .dev.platform_data = &msm_psy_batt_data,
599};
600
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530601static struct platform_device *common_devices[] __initdata = {
602 &android_usb_device,
Trilok Sonib9410792012-04-07 15:37:13 +0530603 &android_pmem_device,
604 &android_pmem_adsp_device,
605 &android_pmem_audio_device,
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530606 &msm_batt_device,
Trilok Sonib9410792012-04-07 15:37:13 +0530607 &msm_device_adspdec,
608 &msm_device_snd,
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530609 &asoc_msm_pcm,
610 &asoc_msm_dai0,
611 &asoc_msm_dai1,
612};
613
614static struct platform_device *qrd7627a_devices[] __initdata = {
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530615 &msm_device_dmov,
616 &msm_device_smd,
617 &msm_device_uart1,
618 &msm_device_uart_dm1,
619 &msm_gsbi0_qup_i2c_device,
620 &msm_gsbi1_qup_i2c_device,
621 &msm_device_otg,
622 &msm_device_gadget_peripheral,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530623 &msm_kgsl_3d0,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530624};
625
Chintan Pandyab1bad0e2012-02-06 19:04:51 +0530626static struct platform_device *qrd3_devices[] __initdata = {
627 &msm_device_nand,
628};
629
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530630static struct platform_device *msm8625_evb_devices[] __initdata = {
631 &msm8625_device_dmov,
632 &msm8625_device_smd,
633 &msm8625_gsbi0_qup_i2c_device,
634 &msm8625_gsbi1_qup_i2c_device,
635 &msm8625_device_uart1,
Ram Mohan Korukonda5ee9fb82012-03-09 12:10:01 +0530636 &msm8625_device_uart_dm1,
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530637 &msm8625_device_otg,
638 &msm8625_device_gadget_peripheral,
Aparna Mallavarapud95d8fc2012-03-08 12:07:37 +0530639 &msm8625_kgsl_3d0,
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530640};
641
Trilok Sonib9410792012-04-07 15:37:13 +0530642static unsigned pmem_kernel_ebi1_size = PMEM_KERNEL_EBI1_SIZE;
643static int __init pmem_kernel_ebi1_size_setup(char *p)
644{
645 pmem_kernel_ebi1_size = memparse(p, NULL);
646 return 0;
647}
648early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup);
649
650static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;
651static int __init pmem_audio_size_setup(char *p)
652{
653 pmem_audio_size = memparse(p, NULL);
654 return 0;
655}
656early_param("pmem_audio_size", pmem_audio_size_setup);
657
658static struct memtype_reserve msm7627a_reserve_table[] __initdata = {
659 [MEMTYPE_SMI] = {
660 },
661 [MEMTYPE_EBI0] = {
662 .flags = MEMTYPE_FLAGS_1M_ALIGN,
663 },
664 [MEMTYPE_EBI1] = {
665 .flags = MEMTYPE_FLAGS_1M_ALIGN,
666 },
667};
668
669static void __init size_pmem_devices(void)
670{
671#ifdef CONFIG_ANDROID_PMEM
672 android_pmem_adsp_pdata.size = pmem_adsp_size;
673 android_pmem_pdata.size = pmem_mdp_size;
674 android_pmem_audio_pdata.size = pmem_audio_size;
675#endif
676}
677
678static void __init reserve_memory_for(struct android_pmem_platform_data *p)
679{
680 msm7627a_reserve_table[p->memory_type].size += p->size;
681}
682
683static void __init reserve_pmem_memory(void)
684{
685#ifdef CONFIG_ANDROID_PMEM
686 reserve_memory_for(&android_pmem_adsp_pdata);
687 reserve_memory_for(&android_pmem_pdata);
688 reserve_memory_for(&android_pmem_audio_pdata);
689 msm7627a_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size;
690#endif
691}
692
693static void __init msm7627a_calculate_reserve_sizes(void)
694{
695 size_pmem_devices();
696 reserve_pmem_memory();
697}
698
699static int msm7627a_paddr_to_memtype(unsigned int paddr)
700{
701 return MEMTYPE_EBI1;
702}
703
704static struct reserve_info msm7627a_reserve_info __initdata = {
705 .memtype_reserve_table = msm7627a_reserve_table,
706 .calculate_reserve_sizes = msm7627a_calculate_reserve_sizes,
707 .paddr_to_memtype = msm7627a_paddr_to_memtype,
708};
709
710static void __init msm7627a_reserve(void)
711{
712 reserve_info = &msm7627a_reserve_info;
713 msm_reserve();
714 memblock_remove(MSM8625_WARM_BOOT_PHYS, SZ_32);
715}
716
717static void __init msm8625_reserve(void)
718{
719 memblock_remove(MSM8625_SECONDARY_PHYS, SZ_8);
720 msm7627a_reserve();
721}
722
723static void msmqrd_adsp_add_pdev(void)
724{
725 int rc = 0;
726 struct rpc_board_dev *rpc_adsp_pdev;
727
728 rpc_adsp_pdev = kzalloc(sizeof(struct rpc_board_dev), GFP_KERNEL);
729 if (rpc_adsp_pdev == NULL) {
730 pr_err("%s: Memory Allocation failure\n", __func__);
731 return;
732 }
733 rpc_adsp_pdev->prog = ADSP_RPC_PROG;
734
735 if (cpu_is_msm8625())
736 rpc_adsp_pdev->pdev = msm8625_device_adsp;
737 else
738 rpc_adsp_pdev->pdev = msm_adsp_device;
739 rc = msm_rpc_add_board_dev(rpc_adsp_pdev, 1);
740 if (rc < 0) {
741 pr_err("%s: return val: %d\n", __func__, rc);
742 kfree(rpc_adsp_pdev);
743 }
744}
745
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530746static void __init msm7627a_device_i2c_init(void)
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530747{
748 msm_gsbi0_qup_i2c_device.dev.platform_data = &msm_gsbi0_qup_i2c_pdata;
749 msm_gsbi1_qup_i2c_device.dev.platform_data = &msm_gsbi1_qup_i2c_pdata;
750}
751
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530752static void __init msm8625_device_i2c_init(void)
753{
754 msm8625_gsbi0_qup_i2c_device.dev.platform_data
755 = &msm_gsbi0_qup_i2c_pdata;
756 msm8625_gsbi1_qup_i2c_device.dev.platform_data
757 = &msm_gsbi1_qup_i2c_pdata;
758}
759
Pankaj Kumar3cec0582011-11-18 11:13:29 +0530760static struct platform_device msm_proccomm_regulator_dev = {
761 .name = PROCCOMM_REGULATOR_DEV_NAME,
762 .id = -1,
763 .dev = {
764 .platform_data = &msm7x27a_proccomm_regulator_data
765 }
766};
767
768static void __init msm7627a_init_regulators(void)
769{
770 int rc = platform_device_register(&msm_proccomm_regulator_dev);
771 if (rc)
772 pr_err("%s: could not register regulator device: %d\n",
773 __func__, rc);
774}
775
Santosh Sajjan374d6592012-01-19 23:16:46 +0530776static int __init msm_qrd_init_ar6000pm(void)
777{
778 msm_wlan_ar6000_pm_device.dev.platform_data = &ar600x_wlan_power;
779 return platform_device_register(&msm_wlan_ar6000_pm_device);
780}
781
Taniya Dase380a2d2012-03-09 13:02:41 +0530782static void __init msm_add_footswitch_devices(void)
783{
784 platform_add_devices(msm_footswitch_devices,
785 msm_num_footswitch_devices);
786}
787
Chintan Pandyab1bad0e2012-02-06 19:04:51 +0530788static void add_platform_devices(void)
789{
Taniya Dasbd096542012-03-15 17:43:45 +0530790 if (machine_is_msm8625_evb() || machine_is_msm8625_qrd7()) {
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530791 platform_add_devices(msm8625_evb_devices,
792 ARRAY_SIZE(msm8625_evb_devices));
Aparna Mallavarapubeafcbc2012-03-13 16:57:39 +0530793 platform_add_devices(qrd3_devices,
Taniya Dasbd096542012-03-15 17:43:45 +0530794 ARRAY_SIZE(qrd3_devices));
Aparna Mallavarapubeafcbc2012-03-13 16:57:39 +0530795 } else {
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530796 platform_add_devices(qrd7627a_devices,
797 ARRAY_SIZE(qrd7627a_devices));
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530798 }
Taniya Dasbd096542012-03-15 17:43:45 +0530799
800 if (machine_is_msm7627a_qrd3())
801 platform_add_devices(qrd3_devices,
802 ARRAY_SIZE(qrd3_devices));
803
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530804 platform_add_devices(common_devices,
805 ARRAY_SIZE(common_devices));
Chintan Pandyab1bad0e2012-02-06 19:04:51 +0530806}
807
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530808#define UART1DM_RX_GPIO 45
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530809static void __init qrd7627a_uart1dm_config(void)
810{
811 msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(UART1DM_RX_GPIO);
812 if (cpu_is_msm8625())
813 msm8625_device_uart_dm1.dev.platform_data =
814 &msm_uart_dm1_pdata;
815 else
816 msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata;
817}
818
819static void __init qrd7627a_otg_gadget(void)
820{
821 msm_otg_pdata.swfi_latency = msm7627a_pm_data
822 [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency;
823
824 if (cpu_is_msm8625()) {
825 msm8625_device_otg.dev.platform_data = &msm_otg_pdata;
826 msm8625_device_gadget_peripheral.dev.platform_data =
827 &msm_gadget_pdata;
828
829 } else {
830 msm_device_otg.dev.platform_data = &msm_otg_pdata;
831 msm_device_gadget_peripheral.dev.platform_data =
832 &msm_gadget_pdata;
833 }
834}
835
Taniya Dasbd096542012-03-15 17:43:45 +0530836static void __init msm_pm_init(void)
837{
Taniya Dasbd096542012-03-15 17:43:45 +0530838
Aparna Mallavarapu6d969eb2012-04-03 15:10:25 +0530839 if (!cpu_is_msm8625()) {
Taniya Dasbd096542012-03-15 17:43:45 +0530840 msm_pm_set_platform_data(msm7627a_pm_data,
841 ARRAY_SIZE(msm7627a_pm_data));
842 BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata));
843 } else {
844 msm_pm_set_platform_data(msm8625_pm_data,
845 ARRAY_SIZE(msm8625_pm_data));
846 BUG_ON(msm_pm_boot_init(&msm_pm_8625_boot_pdata));
847 msm8x25_spm_device_init();
848 }
849}
850
Taniya Dasc868a2e2012-01-03 10:18:47 +0530851static void __init msm_qrd_init(void)
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530852{
853 msm7x2x_misc_init();
Pankaj Kumar3cec0582011-11-18 11:13:29 +0530854 msm7627a_init_regulators();
Trilok Sonib9410792012-04-07 15:37:13 +0530855 msmqrd_adsp_add_pdev();
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530856
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530857 if (cpu_is_msm8625())
858 msm8625_device_i2c_init();
859 else
860 msm7627a_device_i2c_init();
861
862 /* uart1dm*/
863 qrd7627a_uart1dm_config();
864 /*OTG gadget*/
865 qrd7627a_otg_gadget();
Taniya Dasc868a2e2012-01-03 10:18:47 +0530866
Taniya Dase380a2d2012-03-09 13:02:41 +0530867 msm_add_footswitch_devices();
Chintan Pandyab1bad0e2012-02-06 19:04:51 +0530868 add_platform_devices();
Taniya Dasc868a2e2012-01-03 10:18:47 +0530869
Santosh Sajjan374d6592012-01-19 23:16:46 +0530870 /* Ensure ar6000pm device is registered before MMC/SDC */
871 msm_qrd_init_ar6000pm();
Chintan Pandyacf467fc2011-12-01 17:11:11 +0530872 msm7627a_init_mmc();
873
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530874#ifdef CONFIG_USB_EHCI_MSM_72K
875 msm7627a_init_host();
876#endif
Taniya Dasbd096542012-03-15 17:43:45 +0530877 msm_pm_init();
Murali Nalajalaa1827842011-11-13 14:12:39 +0530878
Murali Nalajala2a0bbda2012-03-28 12:12:54 +0530879 msm_pm_register_irqs();
Taniya Das0a5303a2011-08-23 18:47:48 +0530880 msm_fb_add_devices();
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530881
882#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE)
Chintan Pandya13490c02011-12-20 13:03:36 +0530883 msm7627a_bt_power_init();
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530884#endif
Taniya Dasda408822011-09-06 12:54:06 +0530885
Chintan Pandya40762702011-12-06 13:47:06 +0530886 msm7627a_camera_init();
Chintan Pandya0d453192012-03-09 13:20:33 +0530887 qrd7627a_add_io_devices();
Aparna Mallavarapud95d8fc2012-03-08 12:07:37 +0530888 msm7x25a_kgsl_3d0_init();
Sudhakara Rao Tentu38ad6e12012-03-30 15:25:18 -0700889 msm8x25_kgsl_3d0_init();
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530890}
891
892static void __init qrd7627a_init_early(void)
893{
894 msm_msm7627a_allocate_memory_regions();
895}
896
897MACHINE_START(MSM7627A_QRD1, "QRD MSM7627a QRD1")
898 .boot_params = PHYS_OFFSET + 0x100,
899 .map_io = msm_common_io_init,
Trilok Sonib9410792012-04-07 15:37:13 +0530900 .reserve = msm7627a_reserve,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530901 .init_irq = msm_init_irq,
Taniya Dasc868a2e2012-01-03 10:18:47 +0530902 .init_machine = msm_qrd_init,
903 .timer = &msm_timer,
904 .init_early = qrd7627a_init_early,
905 .handle_irq = vic_handle_irq,
906MACHINE_END
Chintan Pandyab1bad0e2012-02-06 19:04:51 +0530907MACHINE_START(MSM7627A_QRD3, "QRD MSM7627a QRD3")
908 .boot_params = PHYS_OFFSET + 0x100,
909 .map_io = msm_common_io_init,
Trilok Sonib9410792012-04-07 15:37:13 +0530910 .reserve = msm7627a_reserve,
Chintan Pandyab1bad0e2012-02-06 19:04:51 +0530911 .init_irq = msm_init_irq,
912 .init_machine = msm_qrd_init,
913 .timer = &msm_timer,
914 .init_early = qrd7627a_init_early,
915 .handle_irq = vic_handle_irq,
916MACHINE_END
Taniya Dasc868a2e2012-01-03 10:18:47 +0530917MACHINE_START(MSM7627A_EVB, "QRD MSM7627a EVB")
918 .boot_params = PHYS_OFFSET + 0x100,
919 .map_io = msm_common_io_init,
Trilok Sonib9410792012-04-07 15:37:13 +0530920 .reserve = msm7627a_reserve,
Taniya Dasc868a2e2012-01-03 10:18:47 +0530921 .init_irq = msm_init_irq,
922 .init_machine = msm_qrd_init,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530923 .timer = &msm_timer,
924 .init_early = qrd7627a_init_early,
Pankaj Kumarbf8a2a32011-10-21 11:47:21 +0530925 .handle_irq = vic_handle_irq,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530926MACHINE_END
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530927MACHINE_START(MSM8625_EVB, "QRD MSM8625 EVB")
928 .boot_params = PHYS_OFFSET + 0x100,
929 .map_io = msm8625_map_io,
Trilok Sonib9410792012-04-07 15:37:13 +0530930 .reserve = msm8625_reserve,
Chintan Pandyaf4ad4002012-02-28 19:49:03 +0530931 .init_irq = msm8625_init_irq,
932 .init_machine = msm_qrd_init,
933 .timer = &msm_timer,
934 .init_early = qrd7627a_init_early,
935 .handle_irq = gic_handle_irq,
936MACHINE_END
Taniya Dasbd096542012-03-15 17:43:45 +0530937MACHINE_START(MSM8625_QRD7, "QRD MSM8625 QRD7")
938 .boot_params = PHYS_OFFSET + 0x100,
939 .map_io = msm8625_map_io,
Trilok Sonib9410792012-04-07 15:37:13 +0530940 .reserve = msm8625_reserve,
Taniya Dasbd096542012-03-15 17:43:45 +0530941 .init_irq = msm8625_init_irq,
942 .init_machine = msm_qrd_init,
943 .timer = &msm_timer,
944 .init_early = qrd7627a_init_early,
945 .handle_irq = gic_handle_irq,
946MACHINE_END