blob: 9d4818a3e6f55654c1282c95d374f70914c45618 [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>
Taniya Dasda408822011-09-06 12:54:06 +053027#include <linux/input/rmi_platformdata.h>
28#include <linux/input/rmi_i2c.h>
Pankaj Kumar3cec0582011-11-18 11:13:29 +053029#include <linux/regulator/consumer.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053030#include <asm/mach/mmc.h>
31#include <asm/mach-types.h>
32#include <asm/mach/arch.h>
33#include <mach/board.h>
34#include <mach/msm_iomap.h>
35#include <mach/msm_hsusb.h>
36#include <mach/rpc_hsusb.h>
37#include <mach/rpc_pmapp.h>
38#include <mach/usbdiag.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053039#include <mach/msm_memtypes.h>
40#include <mach/msm_serial_hs.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053041#include <mach/pmic.h>
42#include <mach/socinfo.h>
43#include <mach/vreg.h>
44#include <mach/rpc_pmapp.h>
45#include <mach/msm_battery.h>
46#include <mach/rpc_server_handset.h>
47#include <mach/socinfo.h>
Pankaj Kumar27c02642011-09-22 15:55:55 +053048#include "board-msm7x27a-regulator.h"
Taniya Dasc98bfbc2011-08-23 09:58:55 +053049#include "devices.h"
50#include "devices-msm7x2xa.h"
Abhijeet Dharmapurikarefaca4f2011-12-27 16:24:07 -080051#include <mach/pm.h>
Taniya Dasc98bfbc2011-08-23 09:58:55 +053052#include "timer.h"
Murali Nalajalaa1827842011-11-13 14:12:39 +053053#include "pm-boot.h"
Pankaj Kumar3cec0582011-11-18 11:13:29 +053054#include "board-msm7x27a-regulator.h"
Chintan Pandyacf467fc2011-12-01 17:11:11 +053055#include "board-msm7627a.h"
Taniya Dasc98bfbc2011-08-23 09:58:55 +053056
57#define PMEM_KERNEL_EBI1_SIZE 0x3A000
58#define MSM_PMEM_AUDIO_SIZE 0x5B000
Taniya Dasc98bfbc2011-08-23 09:58:55 +053059#define BAHAMA_SLAVE_ID_FM_REG 0x02
60#define FM_GPIO 83
Rahul Kashyap8b4a7862011-12-13 18:40:54 +053061#define BT_PCM_BCLK_MODE 0x88
62#define BT_PCM_DIN_MODE 0x89
63#define BT_PCM_DOUT_MODE 0x8A
64#define BT_PCM_SYNC_MODE 0x8B
65#define FM_I2S_SD_MODE 0x8E
66#define FM_I2S_WS_MODE 0x8F
67#define FM_I2S_SCK_MODE 0x90
68#define I2C_PIN_CTL 0x15
69#define I2C_NORMAL 0x40
Taniya Dasc98bfbc2011-08-23 09:58:55 +053070
Taniya Dasc98bfbc2011-08-23 09:58:55 +053071static struct platform_device msm_wlan_ar6000_pm_device = {
72 .name = "wlan_ar6000_pm_dev",
73 .id = -1,
74};
75
Taniya Dasc98bfbc2011-08-23 09:58:55 +053076static struct msm_gpio qup_i2c_gpios_io[] = {
77 { GPIO_CFG(60, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
78 "qup_scl" },
79 { GPIO_CFG(61, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
80 "qup_sda" },
81 { GPIO_CFG(131, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
82 "qup_scl" },
83 { GPIO_CFG(132, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
84 "qup_sda" },
85};
86
87static struct msm_gpio qup_i2c_gpios_hw[] = {
88 { GPIO_CFG(60, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
89 "qup_scl" },
90 { GPIO_CFG(61, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
91 "qup_sda" },
92 { GPIO_CFG(131, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
93 "qup_scl" },
94 { GPIO_CFG(132, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
95 "qup_sda" },
96};
97
98static void gsbi_qup_i2c_gpio_config(int adap_id, int config_type)
99{
100 int rc;
101
102 if (adap_id < 0 || adap_id > 1)
103 return;
104
105 /* Each adapter gets 2 lines from the table */
106 if (config_type)
107 rc = msm_gpios_request_enable(&qup_i2c_gpios_hw[adap_id*2], 2);
108 else
109 rc = msm_gpios_request_enable(&qup_i2c_gpios_io[adap_id*2], 2);
110 if (rc < 0)
111 pr_err("QUP GPIO request/enable failed: %d\n", rc);
112}
113
114static struct msm_i2c_platform_data msm_gsbi0_qup_i2c_pdata = {
115 .clk_freq = 100000,
116 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
117};
118
119static struct msm_i2c_platform_data msm_gsbi1_qup_i2c_pdata = {
120 .clk_freq = 100000,
121 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
122};
123
124#ifdef CONFIG_ARCH_MSM7X27A
125#define MSM_PMEM_MDP_SIZE 0x1DD1000
126#define MSM_PMEM_ADSP_SIZE 0x1000000
127
128#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER
129#define MSM_FB_SIZE 0x260000
130#else
131#define MSM_FB_SIZE 0x195000
132#endif
133
134#endif
135
Taniya Dasda408822011-09-06 12:54:06 +0530136#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_RMI4_I2C) || \
137defined(CONFIG_TOUCHSCREEN_SYNAPTICS_RMI4_I2C_MODULE)
138
139#ifndef CLEARPAD3000_ATTEN_GPIO
140#define CLEARPAD3000_ATTEN_GPIO (48)
141#endif
142
143#ifndef CLEARPAD3000_RESET_GPIO
144#define CLEARPAD3000_RESET_GPIO (26)
145#endif
146
147static int synaptics_touchpad_setup(void);
148
149static struct msm_gpio clearpad3000_cfg_data[] = {
150 {GPIO_CFG(CLEARPAD3000_ATTEN_GPIO, 0, GPIO_CFG_INPUT,
151 GPIO_CFG_NO_PULL, GPIO_CFG_6MA), "rmi4_attn"},
152 {GPIO_CFG(CLEARPAD3000_RESET_GPIO, 0, GPIO_CFG_OUTPUT,
153 GPIO_CFG_PULL_DOWN, GPIO_CFG_8MA), "rmi4_reset"},
154};
155
156static struct rmi_XY_pair rmi_offset = {.x = 0, .y = 0};
157static struct rmi_range rmi_clipx = {.min = 48, .max = 980};
158static struct rmi_range rmi_clipy = {.min = 7, .max = 1647};
159static struct rmi_f11_functiondata synaptics_f11_data = {
160 .swap_axes = false,
161 .flipX = false,
162 .flipY = false,
163 .offset = &rmi_offset,
164 .button_height = 113,
165 .clipX = &rmi_clipx,
166 .clipY = &rmi_clipy,
167};
168
169#define MAX_LEN 100
170
171static ssize_t clearpad3000_virtual_keys_register(struct kobject *kobj,
172 struct kobj_attribute *attr, char *buf)
173{
174 char *virtual_keys = __stringify(EV_KEY) ":" __stringify(KEY_MENU) \
175 ":60:830:120:60" ":" __stringify(EV_KEY) \
176 ":" __stringify(KEY_HOME) ":180:830:120:60" \
177 ":" __stringify(EV_KEY) ":" \
178 __stringify(KEY_SEARCH) ":300:830:120:60" \
179 ":" __stringify(EV_KEY) ":" \
180 __stringify(KEY_BACK) ":420:830:120:60" "\n";
181
182 return snprintf(buf, strnlen(virtual_keys, MAX_LEN) + 1 , "%s",
183 virtual_keys);
184}
185
186static struct kobj_attribute clearpad3000_virtual_keys_attr = {
187 .attr = {
188 .name = "virtualkeys.sensor00fn11",
189 .mode = S_IRUGO,
190 },
191 .show = &clearpad3000_virtual_keys_register,
192};
193
194static struct attribute *virtual_key_properties_attrs[] = {
195 &clearpad3000_virtual_keys_attr.attr,
196 NULL
197};
198
199static struct attribute_group virtual_key_properties_attr_group = {
200 .attrs = virtual_key_properties_attrs,
201};
202
203struct kobject *virtual_key_properties_kobj;
204
205static struct rmi_functiondata synaptics_functiondata[] = {
206 {
207 .function_index = RMI_F11_INDEX,
208 .data = &synaptics_f11_data,
209 },
210};
211
212static struct rmi_functiondata_list synaptics_perfunctiondata = {
213 .count = ARRAY_SIZE(synaptics_functiondata),
214 .functiondata = synaptics_functiondata,
215};
216
217static struct rmi_sensordata synaptics_sensordata = {
218 .perfunctiondata = &synaptics_perfunctiondata,
219 .rmi_sensor_setup = synaptics_touchpad_setup,
220};
221
222static struct rmi_i2c_platformdata synaptics_platformdata = {
223 .i2c_address = 0x2c,
224 .irq_type = IORESOURCE_IRQ_LOWLEVEL,
225 .sensordata = &synaptics_sensordata,
226};
227
228static struct i2c_board_info synaptic_i2c_clearpad3k[] = {
229 {
230 I2C_BOARD_INFO("rmi4_ts", 0x2c),
231 .platform_data = &synaptics_platformdata,
232 },
233};
234
235static int synaptics_touchpad_setup(void)
236{
237 int retval = 0;
238
239 virtual_key_properties_kobj =
240 kobject_create_and_add("board_properties", NULL);
241 if (virtual_key_properties_kobj)
242 retval = sysfs_create_group(virtual_key_properties_kobj,
243 &virtual_key_properties_attr_group);
244 if (!virtual_key_properties_kobj || retval)
245 pr_err("failed to create ft5202 board_properties\n");
246
247 retval = msm_gpios_request_enable(clearpad3000_cfg_data,
248 sizeof(clearpad3000_cfg_data)/sizeof(struct msm_gpio));
249 if (retval) {
250 pr_err("%s:Failed to obtain touchpad GPIO %d. Code: %d.",
251 __func__, CLEARPAD3000_ATTEN_GPIO, retval);
252 retval = 0; /* ignore the err */
253 }
254 synaptics_platformdata.irq = gpio_to_irq(CLEARPAD3000_ATTEN_GPIO);
255
256 gpio_set_value(CLEARPAD3000_RESET_GPIO, 0);
257 usleep(10000);
258 gpio_set_value(CLEARPAD3000_RESET_GPIO, 1);
259 usleep(50000);
260
261 return retval;
262}
263#endif
264
265
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530266static struct android_usb_platform_data android_usb_pdata = {
Pankaj Kumar6f841742011-10-10 15:52:14 +0530267 .update_pid_and_serial_num = usb_diag_update_pid_and_serial_num,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530268};
269
270static struct platform_device android_usb_device = {
271 .name = "android_usb",
272 .id = -1,
273 .dev = {
274 .platform_data = &android_usb_pdata,
275 },
276};
277
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530278#ifdef CONFIG_USB_EHCI_MSM_72K
279static void msm_hsusb_vbus_power(unsigned phy_info, int on)
280{
281 int rc = 0;
282 unsigned gpio;
283
Chintan Pandya40762702011-12-06 13:47:06 +0530284 gpio = QRD_GPIO_HOST_VBUS_EN;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530285
286 rc = gpio_request(gpio, "i2c_host_vbus_en");
287 if (rc < 0) {
288 pr_err("failed to request %d GPIO\n", gpio);
289 return;
290 }
291 gpio_direction_output(gpio, !!on);
292 gpio_set_value_cansleep(gpio, !!on);
293 gpio_free(gpio);
294}
295
296static struct msm_usb_host_platform_data msm_usb_host_pdata = {
297 .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_45NM),
298};
299
300static void __init msm7627a_init_host(void)
301{
302 msm_add_host(0, &msm_usb_host_pdata);
303}
304#endif
305
306#ifdef CONFIG_USB_MSM_OTG_72K
307static int hsusb_rpc_connect(int connect)
308{
309 if (connect)
310 return msm_hsusb_rpc_connect();
311 else
312 return msm_hsusb_rpc_close();
313}
314
Pankaj Kumar27c02642011-09-22 15:55:55 +0530315static struct regulator *reg_hsusb;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530316static int msm_hsusb_ldo_init(int init)
317{
Pankaj Kumar27c02642011-09-22 15:55:55 +0530318 int rc = 0;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530319
Pankaj Kumar27c02642011-09-22 15:55:55 +0530320 if (init) {
321 reg_hsusb = regulator_get(NULL, "usb");
322 if (IS_ERR(reg_hsusb)) {
323 rc = PTR_ERR(reg_hsusb);
324 pr_err("%s: could not get regulator: %d\n",
325 __func__, rc);
326 goto out;
327 }
328
329 rc = regulator_set_voltage(reg_hsusb, 3300000, 3300000);
330 if (rc) {
331 pr_err("%s: could not set voltage: %d\n",
332 __func__, rc);
333 goto reg_free;
334 }
335
336 return 0;
337 }
338 /* else fall through */
339reg_free:
340 regulator_put(reg_hsusb);
341out:
342 reg_hsusb = NULL;
343 return rc;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530344}
345
346static int msm_hsusb_ldo_enable(int enable)
347{
348 static int ldo_status;
349
Pankaj Kumar27c02642011-09-22 15:55:55 +0530350 if (IS_ERR_OR_NULL(reg_hsusb))
351 return reg_hsusb ? PTR_ERR(reg_hsusb) : -ENODEV;
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530352
353 if (ldo_status == enable)
354 return 0;
355
356 ldo_status = enable;
357
Pankaj Kumar27c02642011-09-22 15:55:55 +0530358 return enable ?
359 regulator_enable(reg_hsusb) :
360 regulator_disable(reg_hsusb);
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530361}
362
363#ifndef CONFIG_USB_EHCI_MSM_72K
364static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init)
365{
366 int ret = 0;
367
368 if (init)
369 ret = msm_pm_app_rpc_init(callback);
370 else
371 msm_pm_app_rpc_deinit(callback);
372
373 return ret;
374}
375#endif
376
377static struct msm_otg_platform_data msm_otg_pdata = {
378#ifndef CONFIG_USB_EHCI_MSM_72K
379 .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init,
380#else
381 .vbus_power = msm_hsusb_vbus_power,
382#endif
383 .rpc_connect = hsusb_rpc_connect,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530384 .pemp_level = PRE_EMPHASIS_WITH_20_PERCENT,
385 .cdr_autoreset = CDR_AUTO_RESET_DISABLE,
386 .drv_ampl = HS_DRV_AMPLITUDE_DEFAULT,
387 .se1_gating = SE1_GATING_DISABLE,
388 .ldo_init = msm_hsusb_ldo_init,
389 .ldo_enable = msm_hsusb_ldo_enable,
390 .chg_init = hsusb_chg_init,
391 .chg_connected = hsusb_chg_connected,
392 .chg_vbus_draw = hsusb_chg_vbus_draw,
393};
394#endif
395
396static struct msm_hsusb_gadget_platform_data msm_gadget_pdata = {
397 .is_phy_status_timer_on = 1,
398};
399
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530400#ifdef CONFIG_SERIAL_MSM_HS
401static struct msm_serial_hs_platform_data msm_uart_dm1_pdata = {
402 .inject_rx_on_wakeup = 1,
403 .rx_to_inject = 0xFD,
404};
405#endif
406static struct msm_pm_platform_data msm7627a_pm_data[MSM_PM_SLEEP_MODE_NR] = {
407 [MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = {
408 .idle_supported = 1,
409 .suspend_supported = 1,
410 .idle_enabled = 1,
411 .suspend_enabled = 1,
412 .latency = 16000,
413 .residency = 20000,
414 },
415 [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] = {
416 .idle_supported = 1,
417 .suspend_supported = 1,
418 .idle_enabled = 1,
419 .suspend_enabled = 1,
420 .latency = 12000,
421 .residency = 20000,
422 },
423 [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT] = {
424 .idle_supported = 1,
425 .suspend_supported = 1,
426 .idle_enabled = 0,
427 .suspend_enabled = 1,
428 .latency = 2000,
429 .residency = 0,
430 },
431 [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT] = {
432 .idle_supported = 1,
433 .suspend_supported = 1,
434 .idle_enabled = 1,
435 .suspend_enabled = 1,
436 .latency = 2,
437 .residency = 0,
438 },
439};
440
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -0600441static struct msm_pm_boot_platform_data msm_pm_boot_pdata __initdata = {
Sravan Kumar Ambapuramb22cf4d2012-01-02 21:45:04 +0530442 .mode = MSM_PM_BOOT_CONFIG_RESET_VECTOR_PHYS,
443 .p_addr = 0,
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -0600444};
445
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530446static struct android_pmem_platform_data android_pmem_adsp_pdata = {
447 .name = "pmem_adsp",
448 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
449 .cached = 1,
450 .memory_type = MEMTYPE_EBI1,
451};
452
453static struct platform_device android_pmem_adsp_device = {
454 .name = "android_pmem",
455 .id = 1,
456 .dev = { .platform_data = &android_pmem_adsp_pdata },
457};
458
459static unsigned pmem_mdp_size = MSM_PMEM_MDP_SIZE;
460static int __init pmem_mdp_size_setup(char *p)
461{
462 pmem_mdp_size = memparse(p, NULL);
463 return 0;
464}
465
466early_param("pmem_mdp_size", pmem_mdp_size_setup);
467
468static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;
469static int __init pmem_adsp_size_setup(char *p)
470{
471 pmem_adsp_size = memparse(p, NULL);
472 return 0;
473}
474
475early_param("pmem_adsp_size", pmem_adsp_size_setup);
476
477static unsigned fb_size = MSM_FB_SIZE;
478static int __init fb_size_setup(char *p)
479{
480 fb_size = memparse(p, NULL);
481 return 0;
482}
483
484early_param("fb_size", fb_size_setup);
485
Taniya Das0a5303a2011-08-23 18:47:48 +0530486static struct resource msm_fb_resources[] = {
487 {
488 .flags = IORESOURCE_DMA,
489 }
490};
491
492static int msm_fb_detect_panel(const char *name)
493{
494 int ret;
495
496 if (!strncmp(name, "mipi_video_truly_wvga", 21))
497 ret = 0;
498 else
499 ret = -ENODEV;
500
501 return ret;
502}
503
504static int mipi_truly_set_bl(int on)
505{
Chintan Pandya40762702011-12-06 13:47:06 +0530506 gpio_set_value_cansleep(QRD_GPIO_BACKLIGHT_EN, !!on);
Taniya Das0a5303a2011-08-23 18:47:48 +0530507
508 return 1;
509}
510
511static struct msm_fb_platform_data msm_fb_pdata = {
512 .detect_client = msm_fb_detect_panel,
513};
514
515static struct platform_device msm_fb_device = {
516 .name = "msm_fb",
517 .id = 0,
518 .num_resources = ARRAY_SIZE(msm_fb_resources),
519 .resource = msm_fb_resources,
520 .dev = {
521 .platform_data = &msm_fb_pdata,
522 }
523};
524
525static struct msm_panel_common_pdata mipi_truly_pdata = {
526 .pmic_backlight = mipi_truly_set_bl,
527};
528
529static struct platform_device mipi_dsi_truly_panel_device = {
530 .name = "mipi_truly",
531 .id = 0,
532 .dev = {
533 .platform_data = &mipi_truly_pdata,
534 }
535};
536
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530537#define SND(desc, num) { .name = #desc, .id = num }
538static struct snd_endpoint snd_endpoints_list[] = {
539 SND(HANDSET, 0),
540 SND(MONO_HEADSET, 2),
541 SND(HEADSET, 3),
542 SND(SPEAKER, 6),
543 SND(TTY_HEADSET, 8),
544 SND(TTY_VCO, 9),
545 SND(TTY_HCO, 10),
546 SND(BT, 12),
547 SND(IN_S_SADC_OUT_HANDSET, 16),
548 SND(IN_S_SADC_OUT_SPEAKER_PHONE, 25),
549 SND(FM_DIGITAL_STEREO_HEADSET, 26),
550 SND(FM_DIGITAL_SPEAKER_PHONE, 27),
551 SND(FM_DIGITAL_BT_A2DP_HEADSET, 28),
Shashi Kumar64e07602011-10-11 13:18:57 +0530552 SND(STEREO_HEADSET_AND_SPEAKER, 31),
Phani Kumar Alladad6971252011-10-19 10:50:15 +0530553 SND(CURRENT, 0x7FFFFFFE),
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530554 SND(FM_ANALOG_STEREO_HEADSET, 35),
555 SND(FM_ANALOG_STEREO_HEADSET_CODEC, 36),
556};
557#undef SND
558
559static struct msm_snd_endpoints msm_device_snd_endpoints = {
560 .endpoints = snd_endpoints_list,
561 .num = sizeof(snd_endpoints_list) / sizeof(struct snd_endpoint)
562};
563
564static struct platform_device msm_device_snd = {
565 .name = "msm_snd",
566 .id = -1,
567 .dev = {
568 .platform_data = &msm_device_snd_endpoints
569 },
570};
571
572#define DEC0_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
573 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
574 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
575 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
576 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
577 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
578#define DEC1_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
579 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
580 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
581 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
582 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
583 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
584#define DEC2_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
585 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
586 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
587 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
588 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
589 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
590#define DEC3_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
591 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
592 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
593 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
594 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
595 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
596#define DEC4_FORMAT (1<<MSM_ADSP_CODEC_MIDI)
597
598static unsigned int dec_concurrency_table[] = {
599 /* Audio LP */
600 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DMA)), 0,
601 0, 0, 0,
602
603 /* Concurrency 1 */
604 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
605 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
606 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
607 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
608 (DEC4_FORMAT),
609
610 /* Concurrency 2 */
611 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
612 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
613 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
614 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
615 (DEC4_FORMAT),
616
617 /* Concurrency 3 */
618 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
619 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
620 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
621 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
622 (DEC4_FORMAT),
623
624 /* Concurrency 4 */
625 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
626 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
627 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
628 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
629 (DEC4_FORMAT),
630
631 /* Concurrency 5 */
632 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
633 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
634 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
635 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
636 (DEC4_FORMAT),
637
638 /* Concurrency 6 */
639 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
640 0, 0, 0, 0,
641
642 /* Concurrency 7 */
643 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
644 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
645 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
646 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
647 (DEC4_FORMAT),
648};
649
650#define DEC_INFO(name, queueid, decid, nr_codec) { .module_name = name, \
651 .module_queueid = queueid, .module_decid = decid, \
652 .nr_codec_support = nr_codec}
653
654static struct msm_adspdec_info dec_info_list[] = {
655 DEC_INFO("AUDPLAY0TASK", 13, 0, 11), /* AudPlay0BitStreamCtrlQueue */
656 DEC_INFO("AUDPLAY1TASK", 14, 1, 11), /* AudPlay1BitStreamCtrlQueue */
657 DEC_INFO("AUDPLAY2TASK", 15, 2, 11), /* AudPlay2BitStreamCtrlQueue */
658 DEC_INFO("AUDPLAY3TASK", 16, 3, 11), /* AudPlay3BitStreamCtrlQueue */
659 DEC_INFO("AUDPLAY4TASK", 17, 4, 1), /* AudPlay4BitStreamCtrlQueue */
660};
661
662static struct msm_adspdec_database msm_device_adspdec_database = {
663 .num_dec = ARRAY_SIZE(dec_info_list),
664 .num_concurrency_support = (ARRAY_SIZE(dec_concurrency_table) / \
665 ARRAY_SIZE(dec_info_list)),
666 .dec_concurrency_table = dec_concurrency_table,
667 .dec_info_list = dec_info_list,
668};
669
670static struct platform_device msm_device_adspdec = {
671 .name = "msm_adspdec",
672 .id = -1,
673 .dev = {
674 .platform_data = &msm_device_adspdec_database
675 },
676};
677
678static struct android_pmem_platform_data android_pmem_audio_pdata = {
679 .name = "pmem_audio",
680 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
681 .cached = 0,
682 .memory_type = MEMTYPE_EBI1,
683};
684
685static struct platform_device android_pmem_audio_device = {
686 .name = "android_pmem",
687 .id = 2,
688 .dev = { .platform_data = &android_pmem_audio_pdata },
689};
690
691static struct android_pmem_platform_data android_pmem_pdata = {
692 .name = "pmem",
693 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
694 .cached = 1,
695 .memory_type = MEMTYPE_EBI1,
696};
697static struct platform_device android_pmem_device = {
698 .name = "android_pmem",
699 .id = 0,
700 .dev = { .platform_data = &android_pmem_pdata },
701};
702
703static u32 msm_calculate_batt_capacity(u32 current_voltage);
704
705static struct msm_psy_batt_pdata msm_psy_batt_data = {
706 .voltage_min_design = 2800,
707 .voltage_max_design = 4300,
708 .avail_chg_sources = AC_CHG | USB_CHG ,
709 .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION,
710 .calculate_capacity = &msm_calculate_batt_capacity,
711};
712
713static u32 msm_calculate_batt_capacity(u32 current_voltage)
714{
715 u32 low_voltage = msm_psy_batt_data.voltage_min_design;
716 u32 high_voltage = msm_psy_batt_data.voltage_max_design;
717
718 return (current_voltage - low_voltage) * 100
719 / (high_voltage - low_voltage);
720}
721
722static struct platform_device msm_batt_device = {
723 .name = "msm-battery",
724 .id = -1,
725 .dev.platform_data = &msm_psy_batt_data,
726};
727
728static struct platform_device *qrd1_devices[] __initdata = {
729 &msm_device_dmov,
730 &msm_device_smd,
731 &msm_device_uart1,
732 &msm_device_uart_dm1,
733 &msm_gsbi0_qup_i2c_device,
734 &msm_gsbi1_qup_i2c_device,
735 &msm_device_otg,
736 &msm_device_gadget_peripheral,
737 &android_usb_device,
738 &android_pmem_device,
739 &android_pmem_adsp_device,
Taniya Das0a5303a2011-08-23 18:47:48 +0530740 &msm_fb_device,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530741 &android_pmem_audio_device,
742 &msm_device_snd,
743 &msm_device_adspdec,
744 &msm_batt_device,
745 &msm_kgsl_3d0,
746#ifdef CONFIG_BT
747 &msm_bt_power_device,
748#endif
Taniya Das0a5303a2011-08-23 18:47:48 +0530749 &mipi_dsi_truly_panel_device,
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530750 &msm_wlan_ar6000_pm_device,
751 &asoc_msm_pcm,
752 &asoc_msm_dai0,
753 &asoc_msm_dai1,
754};
755
756static unsigned pmem_kernel_ebi1_size = PMEM_KERNEL_EBI1_SIZE;
757static int __init pmem_kernel_ebi1_size_setup(char *p)
758{
759 pmem_kernel_ebi1_size = memparse(p, NULL);
760 return 0;
761}
762early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup);
763
764static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;
765static int __init pmem_audio_size_setup(char *p)
766{
767 pmem_audio_size = memparse(p, NULL);
768 return 0;
769}
770early_param("pmem_audio_size", pmem_audio_size_setup);
771
772static void __init msm_msm7627a_allocate_memory_regions(void)
773{
Taniya Das0a5303a2011-08-23 18:47:48 +0530774 void *addr;
775 unsigned long size;
776
777 size = fb_size ? : MSM_FB_SIZE;
778 addr = alloc_bootmem_align(size, 0x1000);
779 msm_fb_resources[0].start = __pa(addr);
780 msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1;
781 pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", size,
782 addr, __pa(addr));
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530783}
784
785static struct memtype_reserve msm7627a_reserve_table[] __initdata = {
786 [MEMTYPE_SMI] = {
787 },
788 [MEMTYPE_EBI0] = {
789 .flags = MEMTYPE_FLAGS_1M_ALIGN,
790 },
791 [MEMTYPE_EBI1] = {
792 .flags = MEMTYPE_FLAGS_1M_ALIGN,
793 },
794};
795
Taniya Das0a5303a2011-08-23 18:47:48 +0530796static struct msm_panel_common_pdata mdp_pdata = {
797 .gpio = 97,
798 .mdp_rev = MDP_REV_303,
799};
800
801#define GPIO_LCDC_BRDG_PD 128
802#define GPIO_LCDC_BRDG_RESET_N 129
803#define GPIO_LCD_DSI_SEL 125
804
805static unsigned mipi_dsi_gpio[] = {
806 GPIO_CFG(GPIO_LCDC_BRDG_RESET_N, 0, GPIO_CFG_OUTPUT,
807 GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* LCDC_BRDG_RESET_N */
808 GPIO_CFG(GPIO_LCDC_BRDG_PD, 0, GPIO_CFG_OUTPUT,
809 GPIO_CFG_NO_PULL, GPIO_CFG_2MA), /* LCDC_BRDG_PD */
810};
811
812static unsigned lcd_dsi_sel_gpio[] = {
813 GPIO_CFG(GPIO_LCD_DSI_SEL, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP,
814 GPIO_CFG_2MA),
815};
816
817enum {
818 DSI_SINGLE_LANE = 1,
819 DSI_TWO_LANES,
820};
821
822static int msm_fb_get_lane_config(void)
823{
824 pr_info("DSI_TWO_LANES\n");
825 return DSI_TWO_LANES;
826}
827
828static int mipi_truly_sel_mode(int video_mode)
829{
830 int rc = 0;
831
832 rc = gpio_request(GPIO_LCD_DSI_SEL, "lcd_dsi_sel");
833 if (rc < 0)
834 goto gpio_error;
835
836 rc = gpio_tlmm_config(lcd_dsi_sel_gpio[0], GPIO_CFG_ENABLE);
837 if (rc)
838 goto gpio_error;
839
840 rc = gpio_direction_output(GPIO_LCD_DSI_SEL, 1);
841 if (!rc) {
842 gpio_set_value_cansleep(GPIO_LCD_DSI_SEL, video_mode);
843 return rc;
844 } else {
845 goto gpio_error;
846 }
847
848gpio_error:
849 pr_err("mipi_truly_sel_mode failed\n");
850 gpio_free(GPIO_LCD_DSI_SEL);
851 return rc;
852}
853
854static int msm_fb_dsi_client_qrd1_reset(void)
855{
856 int rc = 0;
857
858 rc = gpio_request(GPIO_LCDC_BRDG_RESET_N, "lcdc_brdg_reset_n");
859 if (rc < 0) {
860 pr_err("failed to request lcd brdg reset_n\n");
861 return rc;
862 }
863
864 rc = gpio_tlmm_config(mipi_dsi_gpio[0], GPIO_CFG_ENABLE);
865 if (rc < 0) {
866 pr_err("Failed to enable LCDC Bridge reset enable\n");
867 return rc;
868 }
869
870 rc = gpio_direction_output(GPIO_LCDC_BRDG_RESET_N, 1);
871 if (rc < 0) {
872 pr_err("Failed GPIO bridge pd\n");
873 gpio_free(GPIO_LCDC_BRDG_RESET_N);
874 return rc;
875 }
876
877 mipi_truly_sel_mode(1);
878
879 return rc;
880}
881
882static int msm_fb_dsi_client_reset(void)
883{
884 int rc = 0;
885
886 rc = msm_fb_dsi_client_qrd1_reset();
887 return rc;
888}
889
890static int dsi_gpio_initialized;
891
892static int mipi_dsi_panel_qrd1_power(int on)
893{
894 int rc = 0;
895
896 if (!dsi_gpio_initialized) {
Chintan Pandya40762702011-12-06 13:47:06 +0530897 rc = gpio_request(QRD_GPIO_BACKLIGHT_EN, "gpio_bkl_en");
Taniya Das0a5303a2011-08-23 18:47:48 +0530898 if (rc < 0)
899 return rc;
900
Chintan Pandya40762702011-12-06 13:47:06 +0530901 rc = gpio_tlmm_config(GPIO_CFG(QRD_GPIO_BACKLIGHT_EN, 0,
Jeevan Shriram72e4cc62011-11-10 14:57:22 +0530902 GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
903 GPIO_CFG_ENABLE);
904 if (rc < 0) {
905 pr_err("failed GPIO_BACKLIGHT_EN tlmm config\n");
906 return rc;
907 }
908
Chintan Pandya40762702011-12-06 13:47:06 +0530909 rc = gpio_direction_output(QRD_GPIO_BACKLIGHT_EN, 1);
Taniya Das0a5303a2011-08-23 18:47:48 +0530910 if (rc < 0) {
911 pr_err("failed to enable backlight\n");
Chintan Pandya40762702011-12-06 13:47:06 +0530912 gpio_free(QRD_GPIO_BACKLIGHT_EN);
Taniya Das0a5303a2011-08-23 18:47:48 +0530913 return rc;
914 }
915 dsi_gpio_initialized = 1;
916 }
917
Chintan Pandya40762702011-12-06 13:47:06 +0530918 gpio_set_value_cansleep(QRD_GPIO_BACKLIGHT_EN, !!on);
Taniya Das0a5303a2011-08-23 18:47:48 +0530919
920 if (!on) {
921 gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 1);
922 msleep(20);
923 gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 0);
924 msleep(20);
925 gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 1);
926
927 }
928
929 return rc;
930}
931
932static int mipi_dsi_panel_power(int on)
933{
934 int rc = 0;
935
936 rc = mipi_dsi_panel_qrd1_power(on);
937 return rc;
938}
939
940#define MDP_303_VSYNC_GPIO 97
941
942#ifdef CONFIG_FB_MSM_MDP303
943static struct mipi_dsi_platform_data mipi_dsi_pdata = {
944 .vsync_gpio = MDP_303_VSYNC_GPIO,
945 .dsi_power_save = mipi_dsi_panel_power,
946 .dsi_client_reset = msm_fb_dsi_client_reset,
947 .get_lane_config = msm_fb_get_lane_config,
948};
949#endif
950
951static void __init msm_fb_add_devices(void)
952{
953 msm_fb_register_device("mdp", &mdp_pdata);
954 msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata);
955}
956
Taniya Dasc98bfbc2011-08-23 09:58:55 +0530957static void __init size_pmem_devices(void)
958{
959#ifdef CONFIG_ANDROID_PMEM
960 android_pmem_adsp_pdata.size = pmem_adsp_size;
961 android_pmem_pdata.size = pmem_mdp_size;
962 android_pmem_audio_pdata.size = pmem_audio_size;
963#endif
964}
965
966static void __init reserve_memory_for(struct android_pmem_platform_data *p)
967{
968 msm7627a_reserve_table[p->memory_type].size += p->size;
969}
970
971static void __init reserve_pmem_memory(void)
972{
973#ifdef CONFIG_ANDROID_PMEM
974 reserve_memory_for(&android_pmem_adsp_pdata);
975 reserve_memory_for(&android_pmem_pdata);
976 reserve_memory_for(&android_pmem_audio_pdata);
977 msm7627a_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size;
978#endif
979}
980
981static void __init msm7627a_calculate_reserve_sizes(void)
982{
983 size_pmem_devices();
984 reserve_pmem_memory();
985}
986
987static int msm7627a_paddr_to_memtype(unsigned int paddr)
988{
989 return MEMTYPE_EBI1;
990}
991
992static struct reserve_info msm7627a_reserve_info __initdata = {
993 .memtype_reserve_table = msm7627a_reserve_table,
994 .calculate_reserve_sizes = msm7627a_calculate_reserve_sizes,
995 .paddr_to_memtype = msm7627a_paddr_to_memtype,
996};
997
998static void __init msm7627a_reserve(void)
999{
1000 reserve_info = &msm7627a_reserve_info;
1001 msm_reserve();
1002}
1003
1004static void __init msm_device_i2c_init(void)
1005{
1006 msm_gsbi0_qup_i2c_device.dev.platform_data = &msm_gsbi0_qup_i2c_pdata;
1007 msm_gsbi1_qup_i2c_device.dev.platform_data = &msm_gsbi1_qup_i2c_pdata;
1008}
1009
1010static struct msm_handset_platform_data hs_platform_data = {
1011 .hs_name = "7k_handset",
1012 .pwr_key_delay_ms = 500, /* 0 will disable end key */
1013};
1014
1015static struct platform_device hs_pdev = {
1016 .name = "msm-handset",
1017 .id = -1,
1018 .dev = {
1019 .platform_data = &hs_platform_data,
1020 },
1021};
1022
Pankaj Kumar3cec0582011-11-18 11:13:29 +05301023static struct platform_device msm_proccomm_regulator_dev = {
1024 .name = PROCCOMM_REGULATOR_DEV_NAME,
1025 .id = -1,
1026 .dev = {
1027 .platform_data = &msm7x27a_proccomm_regulator_data
1028 }
1029};
1030
1031static void __init msm7627a_init_regulators(void)
1032{
1033 int rc = platform_device_register(&msm_proccomm_regulator_dev);
1034 if (rc)
1035 pr_err("%s: could not register regulator device: %d\n",
1036 __func__, rc);
1037}
1038
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301039#define UART1DM_RX_GPIO 45
1040static void __init msm_qrd1_init(void)
1041{
1042 msm7x2x_misc_init();
Pankaj Kumar3cec0582011-11-18 11:13:29 +05301043 msm7627a_init_regulators();
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301044 msm_device_i2c_init();
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301045#ifdef CONFIG_SERIAL_MSM_HS
1046 msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(UART1DM_RX_GPIO);
1047 msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata;
1048#endif
1049
1050#ifdef CONFIG_USB_MSM_OTG_72K
1051 msm_otg_pdata.swfi_latency = msm7627a_pm_data
1052 [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency;
1053 msm_device_otg.dev.platform_data = &msm_otg_pdata;
1054#endif
1055 msm_device_gadget_peripheral.dev.platform_data =
Taniya Das7a22cdd2011-09-08 14:57:00 +05301056 &msm_gadget_pdata;
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301057 platform_add_devices(qrd1_devices,
Taniya Das7a22cdd2011-09-08 14:57:00 +05301058 ARRAY_SIZE(qrd1_devices));
Chintan Pandyacf467fc2011-12-01 17:11:11 +05301059 msm7627a_init_mmc();
1060
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301061#ifdef CONFIG_USB_EHCI_MSM_72K
1062 msm7627a_init_host();
1063#endif
1064 msm_pm_set_platform_data(msm7627a_pm_data,
1065 ARRAY_SIZE(msm7627a_pm_data));
Maheshkumar Sivasubramanianc6c55032011-10-25 16:01:32 -06001066 BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata));
Murali Nalajalaa1827842011-11-13 14:12:39 +05301067
Taniya Das0a5303a2011-08-23 18:47:48 +05301068 msm_fb_add_devices();
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301069
1070#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE)
Chintan Pandya13490c02011-12-20 13:03:36 +05301071 msm7627a_bt_power_init();
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301072#endif
Taniya Dasda408822011-09-06 12:54:06 +05301073
Chintan Pandya40762702011-12-06 13:47:06 +05301074 msm7627a_camera_init();
Taniya Das7a22cdd2011-09-08 14:57:00 +05301075
Taniya Dasda408822011-09-06 12:54:06 +05301076#if defined(CONFIG_TOUCHSCREEN_SYNAPTICS_RMI4_I2C) || \
1077 defined(CONFIG_TOUCHSCREEN_SYNAPTICS_RMI4_I2C_MODULE)
1078 i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID,
1079 synaptic_i2c_clearpad3k,
1080 ARRAY_SIZE(synaptic_i2c_clearpad3k));
1081#endif
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301082 platform_device_register(&hs_pdev);
1083
1084#ifdef CONFIG_MSM_RPC_VIBRATOR
1085 msm_init_pmic_vibrator();
1086#endif
1087}
1088
1089static void __init qrd7627a_init_early(void)
1090{
1091 msm_msm7627a_allocate_memory_regions();
1092}
1093
1094MACHINE_START(MSM7627A_QRD1, "QRD MSM7627a QRD1")
1095 .boot_params = PHYS_OFFSET + 0x100,
1096 .map_io = msm_common_io_init,
1097 .reserve = msm7627a_reserve,
1098 .init_irq = msm_init_irq,
1099 .init_machine = msm_qrd1_init,
1100 .timer = &msm_timer,
1101 .init_early = qrd7627a_init_early,
Pankaj Kumarbf8a2a32011-10-21 11:47:21 +05301102 .handle_irq = vic_handle_irq,
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301103MACHINE_END