blob: b09352ce941e7490bb03671b9031015e3149fe2f [file] [log] [blame]
Taniya Dasc98bfbc2011-08-23 09:58:55 +05301/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
2 *
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>
16#include <linux/usb/android_composite.h>
17#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>
27#include <asm/mach/mmc.h>
28#include <asm/mach-types.h>
29#include <asm/mach/arch.h>
30#include <mach/board.h>
31#include <mach/msm_iomap.h>
32#include <mach/msm_hsusb.h>
33#include <mach/rpc_hsusb.h>
34#include <mach/rpc_pmapp.h>
35#include <mach/usbdiag.h>
36#include <mach/usb_gadget_fserial.h>
37#include <mach/msm_memtypes.h>
38#include <mach/msm_serial_hs.h>
39#include <mach/vreg.h>
40#include <mach/pmic.h>
41#include <mach/socinfo.h>
42#include <mach/vreg.h>
43#include <mach/rpc_pmapp.h>
44#include <mach/msm_battery.h>
45#include <mach/rpc_server_handset.h>
46#include <mach/socinfo.h>
47
48#include "devices.h"
49#include "devices-msm7x2xa.h"
50#include "pm.h"
51#include "timer.h"
52
53#define PMEM_KERNEL_EBI1_SIZE 0x3A000
54#define MSM_PMEM_AUDIO_SIZE 0x5B000
55#define BAHAMA_SLAVE_ID_FM_ADDR 0x2A
56#define BAHAMA_SLAVE_ID_QMEMBIST_ADDR 0x7B
57#define BAHAMA_SLAVE_ID_FM_REG 0x02
58#define FM_GPIO 83
59
60enum {
61 GPIO_HOST_VBUS_EN = 107,
62 GPIO_BT_SYS_REST_EN = 114,
63 GPIO_WAKE_ON_WIRELESS,
64 GPIO_BACKLIGHT_EN,
65 GPIO_CAM_3MP_PWDN,
66 GPIO_WLAN_EN,
67 GPIO_CAM_5MP_SHDN_EN,
68 GPIO_CAM_5MP_RESET,
69};
70
71 /* FM Platform power and shutdown routines */
72#define FPGA_MSM_CNTRL_REG2 0x90008010
73
74static void config_pcm_i2s_mode(int mode)
75{
76 void __iomem *cfg_ptr;
77 u8 reg2;
78
79 cfg_ptr = ioremap_nocache(FPGA_MSM_CNTRL_REG2, sizeof(char));
80
81 if (!cfg_ptr)
82 return;
83 if (mode) {
84 /*enable the pcm mode in FPGA*/
85 reg2 = readb_relaxed(cfg_ptr);
86 if (reg2 == 0) {
87 reg2 = 1;
88 writeb_relaxed(reg2, cfg_ptr);
89 }
90 } else {
91 /*enable i2s mode in FPGA*/
92 reg2 = readb_relaxed(cfg_ptr);
93 if (reg2 == 1) {
94 reg2 = 0;
95 writeb_relaxed(reg2, cfg_ptr);
96 }
97 }
98 iounmap(cfg_ptr);
99}
100
101static unsigned fm_i2s_config_power_on[] = {
102 /*FM_I2S_SD*/
103 GPIO_CFG(68, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
104 /*FM_I2S_WS*/
105 GPIO_CFG(70, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
106 /*FM_I2S_SCK*/
107 GPIO_CFG(71, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
108};
109
110static unsigned fm_i2s_config_power_off[] = {
111 /*FM_I2S_SD*/
112 GPIO_CFG(68, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
113 /*FM_I2S_WS*/
114 GPIO_CFG(70, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
115 /*FM_I2S_SCK*/
116 GPIO_CFG(71, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
117};
118
119static unsigned bt_config_power_on[] = {
120 /*RFR*/
121 GPIO_CFG(43, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
122 /*CTS*/
123 GPIO_CFG(44, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
124 /*RX*/
125 GPIO_CFG(45, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
126 /*TX*/
127 GPIO_CFG(46, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
128};
129static unsigned bt_config_pcm_on[] = {
130 /*PCM_DOUT*/
131 GPIO_CFG(68, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
132 /*PCM_DIN*/
133 GPIO_CFG(69, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
134 /*PCM_SYNC*/
135 GPIO_CFG(70, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
136 /*PCM_CLK*/
137 GPIO_CFG(71, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
138};
139static unsigned bt_config_power_off[] = {
140 /*RFR*/
141 GPIO_CFG(43, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
142 /*CTS*/
143 GPIO_CFG(44, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
144 /*RX*/
145 GPIO_CFG(45, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
146 /*TX*/
147 GPIO_CFG(46, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
148};
149static unsigned bt_config_pcm_off[] = {
150 /*PCM_DOUT*/
151 GPIO_CFG(68, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
152 /*PCM_DIN*/
153 GPIO_CFG(69, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
154 /*PCM_SYNC*/
155 GPIO_CFG(70, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
156 /*PCM_CLK*/
157 GPIO_CFG(71, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
158};
159
160
161static int config_i2s(int mode)
162{
163 int pin, rc = 0;
164
165 if (mode == FM_I2S_ON) {
166 if (machine_is_msm7627a_qrd1())
167 config_pcm_i2s_mode(0);
168 pr_err("%s mode = FM_I2S_ON", __func__);
169 for (pin = 0; pin < ARRAY_SIZE(fm_i2s_config_power_on);
170 pin++) {
171 rc = gpio_tlmm_config(
172 fm_i2s_config_power_on[pin],
173 GPIO_CFG_ENABLE
174 );
175 if (rc < 0)
176 return rc;
177 }
178 } else if (mode == FM_I2S_OFF) {
179 pr_err("%s mode = FM_I2S_OFF", __func__);
180 for (pin = 0; pin < ARRAY_SIZE(fm_i2s_config_power_off);
181 pin++) {
182 rc = gpio_tlmm_config(
183 fm_i2s_config_power_off[pin],
184 GPIO_CFG_ENABLE
185 );
186 if (rc < 0)
187 return rc;
188 }
189 }
190 return rc;
191}
192static int config_pcm(int mode)
193{
194 int pin, rc = 0;
195
196 if (mode == BT_PCM_ON) {
197 if (machine_is_msm7627a_qrd1())
198 config_pcm_i2s_mode(1);
199 pr_err("%s mode =BT_PCM_ON", __func__);
200 for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_on);
201 pin++) {
202 rc = gpio_tlmm_config(bt_config_pcm_on[pin],
203 GPIO_CFG_ENABLE);
204 if (rc < 0)
205 return rc;
206 }
207 } else if (mode == BT_PCM_OFF) {
208 pr_err("%s mode =BT_PCM_OFF", __func__);
209 for (pin = 0; pin < ARRAY_SIZE(bt_config_pcm_off);
210 pin++) {
211 rc = gpio_tlmm_config(bt_config_pcm_off[pin],
212 GPIO_CFG_ENABLE);
213 if (rc < 0)
214 return rc;
215 }
216
217 }
218
219 return rc;
220}
221
222static int msm_bahama_setup_pcm_i2s(int mode)
223{
224 int fm_state = 0, bt_state = 0;
225 int rc = 0;
226 struct marimba config = { .mod_id = SLAVE_ID_BAHAMA};
227
228 fm_state = marimba_get_fm_status(&config);
229 bt_state = marimba_get_bt_status(&config);
230
231 switch (mode) {
232 case BT_PCM_ON:
233 case BT_PCM_OFF:
234 if (!fm_state)
235 rc = config_pcm(mode);
236 break;
237 case FM_I2S_ON:
238 rc = config_i2s(mode);
239 break;
240 case FM_I2S_OFF:
241 if (bt_state)
242 rc = config_pcm(BT_PCM_ON);
243 else
244 rc = config_i2s(mode);
245 break;
246 default:
247 rc = -EIO;
248 pr_err("%s:Unsupported mode", __func__);
249 }
250 return rc;
251}
252
253static int bt_set_gpio(int on)
254{
255 int rc = 0;
256 struct marimba config = { .mod_id = SLAVE_ID_BAHAMA};
257
258 if (on) {
259 rc = gpio_direction_output(GPIO_BT_SYS_REST_EN, 1);
260 msleep(100);
261 } else {
262 if (!marimba_get_fm_status(&config) &&
263 !marimba_get_bt_status(&config)) {
264 gpio_set_value_cansleep(GPIO_BT_SYS_REST_EN, 0);
265 rc = gpio_direction_input(GPIO_BT_SYS_REST_EN);
266 msleep(100);
267 }
268 }
269 if (rc)
270 pr_err("%s: BT sys_reset_en GPIO : Error", __func__);
271
272 return rc;
273}
274static struct vreg *fm_regulator;
275static int fm_radio_setup(struct marimba_fm_platform_data *pdata)
276{
277 int rc = 0;
278 const char *id = "FMPW";
279 uint32_t irqcfg;
280 struct marimba config = { .mod_id = SLAVE_ID_BAHAMA};
281 u8 value;
282
283 /* Voting for 1.8V Regulator */
284 fm_regulator = vreg_get(NULL , "msme1");
285 if (IS_ERR(fm_regulator)) {
286 pr_err("%s: vreg get failed with : (%ld)\n",
287 __func__, PTR_ERR(fm_regulator));
288 return -EINVAL;
289 }
290
291 /* Set the voltage level to 1.8V */
292 rc = vreg_set_level(fm_regulator, 1800);
293 if (rc < 0) {
294 pr_err("%s: set regulator level failed with :(%d)\n",
295 __func__, rc);
296 goto fm_vreg_fail;
297 }
298
299 /* Enabling the 1.8V regulator */
300 rc = vreg_enable(fm_regulator);
301 if (rc) {
302 pr_err("%s: enable regulator failed with :(%d)\n",
303 __func__, rc);
304 goto fm_vreg_fail;
305 }
306
307 /* Voting for 19.2MHz clock */
308 rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1,
309 PMAPP_CLOCK_VOTE_ON);
310 if (rc < 0) {
311 pr_err("%s: clock vote failed with :(%d)\n",
312 __func__, rc);
313 goto fm_clock_vote_fail;
314 }
315
316 rc = bt_set_gpio(1);
317 if (rc) {
318 pr_err("%s: bt_set_gpio = %d", __func__, rc);
319 goto fm_gpio_config_fail;
320 }
321 /*re-write FM Slave Id, after reset*/
322 value = BAHAMA_SLAVE_ID_FM_ADDR;
323 rc = marimba_write_bit_mask(&config,
324 BAHAMA_SLAVE_ID_FM_REG, &value, 1, 0xFF);
325 if (rc < 0) {
326 pr_err("%s: FM Slave ID rewrite Failed = %d", __func__, rc);
327 goto fm_gpio_config_fail;
328 }
329 /* Configuring the FM GPIO */
330 irqcfg = GPIO_CFG(FM_GPIO, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL,
331 GPIO_CFG_2MA);
332
333 rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE);
334 if (rc) {
335 pr_err("%s: gpio_tlmm_config(%#x)=%d\n",
336 __func__, irqcfg, rc);
337 goto fm_gpio_config_fail;
338 }
339
340 return 0;
341
342fm_gpio_config_fail:
343 pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1,
344 PMAPP_CLOCK_VOTE_OFF);
345 bt_set_gpio(0);
346fm_clock_vote_fail:
347 vreg_disable(fm_regulator);
348
349fm_vreg_fail:
350 vreg_put(fm_regulator);
351
352 return rc;
353};
354
355static void fm_radio_shutdown(struct marimba_fm_platform_data *pdata)
356{
357 int rc;
358 const char *id = "FMPW";
359
360 /* Releasing the GPIO line used by FM */
361 uint32_t irqcfg = GPIO_CFG(FM_GPIO, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_UP,
362 GPIO_CFG_2MA);
363
364 rc = gpio_tlmm_config(irqcfg, GPIO_CFG_ENABLE);
365 if (rc)
366 pr_err("%s: gpio_tlmm_config(%#x)=%d\n",
367 __func__, irqcfg, rc);
368
369 /* Releasing the 1.8V Regulator */
370 if (fm_regulator != NULL) {
371 rc = vreg_disable(fm_regulator);
372 if (rc)
373 pr_err("%s: disable regulator failed:(%d)\n",
374 __func__, rc);
375 fm_regulator = NULL;
376 }
377
378 /* Voting off the clock */
379 rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1,
380 PMAPP_CLOCK_VOTE_OFF);
381 if (rc < 0)
382 pr_err("%s: voting off failed with :(%d)\n",
383 __func__, rc);
384 rc = bt_set_gpio(0);
385 if (rc)
386 pr_err("%s: bt_set_gpio = %d", __func__, rc);
387}
388
389static struct marimba_fm_platform_data marimba_fm_pdata = {
390 .fm_setup = fm_radio_setup,
391 .fm_shutdown = fm_radio_shutdown,
392 .irq = MSM_GPIO_TO_INT(FM_GPIO),
393 .vreg_s2 = NULL,
394 .vreg_xo_out = NULL,
395 /* Configuring the FM SoC as I2S Master */
396 .is_fm_soc_i2s_master = true,
397 .config_i2s_gpio = msm_bahama_setup_pcm_i2s,
398};
399
400static struct platform_device msm_wlan_ar6000_pm_device = {
401 .name = "wlan_ar6000_pm_dev",
402 .id = -1,
403};
404
405#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE)
406
407static struct platform_device msm_bt_power_device = {
408 .name = "bt_power",
409};
410struct bahama_config_register {
411 u8 reg;
412 u8 value;
413 u8 mask;
414};
415struct bt_vreg_info {
416 const char *name;
417 unsigned int pmapp_id;
418 unsigned int level;
419 unsigned int is_pin_controlled;
420 struct vreg *vregs;
421};
422static struct bt_vreg_info bt_vregs[] = {
423 {"msme1", 2, 1800, 0, NULL},
424 {"bt", 21, 2900, 1, NULL}
425};
426
427static int bahama_bt(int on)
428{
429
430 int rc = 0;
431 int i;
432
433 struct marimba config = { .mod_id = SLAVE_ID_BAHAMA};
434
435 struct bahama_variant_register {
436 const size_t size;
437 const struct bahama_config_register *set;
438 };
439
440 const struct bahama_config_register *p;
441
442 u8 version;
443
444 const struct bahama_config_register v10_bt_on[] = {
445 { 0xE9, 0x00, 0xFF },
446 { 0xF4, 0x80, 0xFF },
447 { 0xE4, 0x00, 0xFF },
448 { 0xE5, 0x00, 0x0F },
449#ifdef CONFIG_WLAN
450 { 0xE6, 0x38, 0x7F },
451 { 0xE7, 0x06, 0xFF },
452#endif
453 { 0xE9, 0x21, 0xFF },
454 { 0x01, 0x0C, 0x1F },
455 { 0x01, 0x08, 0x1F },
456 };
457
458 const struct bahama_config_register v20_bt_on_fm_off[] = {
459 { 0x11, 0x0C, 0xFF },
460 { 0x13, 0x01, 0xFF },
461 { 0xF4, 0x80, 0xFF },
462 { 0xF0, 0x00, 0xFF },
463 { 0xE9, 0x00, 0xFF },
464#ifdef CONFIG_WLAN
465 { 0x81, 0x00, 0x7F },
466 { 0x82, 0x00, 0xFF },
467 { 0xE6, 0x38, 0x7F },
468 { 0xE7, 0x06, 0xFF },
469#endif
470 { 0x8E, 0x15, 0xFF },
471 { 0x8F, 0x15, 0xFF },
472 { 0x90, 0x15, 0xFF },
473
474 { 0xE9, 0x21, 0xFF },
475 };
476
477 const struct bahama_config_register v20_bt_on_fm_on[] = {
478 { 0x11, 0x0C, 0xFF },
479 { 0x13, 0x01, 0xFF },
480 { 0xF4, 0x86, 0xFF },
481 { 0xF0, 0x06, 0xFF },
482 { 0xE9, 0x00, 0xFF },
483#ifdef CONFIG_WLAN
484 { 0x81, 0x00, 0x7F },
485 { 0x82, 0x00, 0xFF },
486 { 0xE6, 0x38, 0x7F },
487 { 0xE7, 0x06, 0xFF },
488#endif
489 { 0xE9, 0x21, 0xFF },
490 };
491
492 const struct bahama_config_register v10_bt_off[] = {
493 { 0xE9, 0x00, 0xFF },
494 };
495
496 const struct bahama_config_register v20_bt_off_fm_off[] = {
497 { 0xF4, 0x84, 0xFF },
498 { 0xF0, 0x04, 0xFF },
499 { 0xE9, 0x00, 0xFF }
500 };
501
502 const struct bahama_config_register v20_bt_off_fm_on[] = {
503 { 0xF4, 0x86, 0xFF },
504 { 0xF0, 0x06, 0xFF },
505 { 0xE9, 0x00, 0xFF }
506 };
507 const struct bahama_variant_register bt_bahama[2][3] = {
508 {
509 { ARRAY_SIZE(v10_bt_off), v10_bt_off },
510 { ARRAY_SIZE(v20_bt_off_fm_off), v20_bt_off_fm_off },
511 { ARRAY_SIZE(v20_bt_off_fm_on), v20_bt_off_fm_on }
512 },
513 {
514 { ARRAY_SIZE(v10_bt_on), v10_bt_on },
515 { ARRAY_SIZE(v20_bt_on_fm_off), v20_bt_on_fm_off },
516 { ARRAY_SIZE(v20_bt_on_fm_on), v20_bt_on_fm_on }
517 }
518 };
519
520 u8 offset = 0; /* index into bahama configs */
521 on = on ? 1 : 0;
522 version = marimba_read_bahama_ver(&config);
523 if ((int)version < 0 || version == BAHAMA_VER_UNSUPPORTED) {
524 dev_err(&msm_bt_power_device.dev, "%s: Bahama \
525 version read Error, version = %d \n",
526 __func__, version);
527 return -EIO;
528 }
529
530 if (version == BAHAMA_VER_2_0) {
531 if (marimba_get_fm_status(&config))
532 offset = 0x01;
533 }
534
535 p = bt_bahama[on][version + offset].set;
536
537 dev_info(&msm_bt_power_device.dev,
538 "%s: found version %d\n", __func__, version);
539
540 for (i = 0; i < bt_bahama[on][version + offset].size; i++) {
541 u8 value = (p+i)->value;
542 rc = marimba_write_bit_mask(&config,
543 (p+i)->reg,
544 &value,
545 sizeof((p+i)->value),
546 (p+i)->mask);
547 if (rc < 0) {
548 dev_err(&msm_bt_power_device.dev,
549 "%s: reg %x write failed: %d\n",
550 __func__, (p+i)->reg, rc);
551 return rc;
552 }
553 dev_dbg(&msm_bt_power_device.dev,
554 "%s: reg 0x%02x write value 0x%02x mask 0x%02x\n",
555 __func__, (p+i)->reg,
556 value, (p+i)->mask);
557 value = 0;
558 rc = marimba_read_bit_mask(&config,
559 (p+i)->reg, &value,
560 sizeof((p+i)->value), (p+i)->mask);
561 if (rc < 0)
562 dev_err(&msm_bt_power_device.dev, "%s marimba_read_bit_mask- error",
563 __func__);
564 dev_dbg(&msm_bt_power_device.dev,
565 "%s: reg 0x%02x read value 0x%02x mask 0x%02x\n",
566 __func__, (p+i)->reg,
567 value, (p+i)->mask);
568 }
569 /* Update BT Status */
570 if (on)
571 marimba_set_bt_status(&config, true);
572 else
573 marimba_set_bt_status(&config, false);
574 return rc;
575}
576static int bluetooth_switch_regulators(int on)
577{
578 int i, rc = 0;
579 const char *id = "BTPW";
580
581 for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) {
582 if (!bt_vregs[i].vregs) {
583 pr_err("%s: vreg_get %s failed(%d)\n",
584 __func__, bt_vregs[i].name, rc);
585 goto vreg_fail;
586 }
587 rc = on ? vreg_set_level(bt_vregs[i].vregs,
588 bt_vregs[i].level) : 0;
589
590 if (rc < 0) {
591 pr_err("%s: vreg set level failed (%d)\n",
592 __func__, rc);
593 goto vreg_set_level_fail;
594 }
595 if (bt_vregs[i].is_pin_controlled == 1) {
596 rc = pmapp_vreg_pincntrl_vote(id,
597 bt_vregs[i].pmapp_id,
598 PMAPP_CLOCK_ID_D1,
599 on ? PMAPP_CLOCK_VOTE_ON :
600 PMAPP_CLOCK_VOTE_OFF);
601 } else {
602 rc = on ? vreg_enable(bt_vregs[i].vregs) :
603 vreg_disable(bt_vregs[i].vregs);
604 }
605
606 if (rc < 0) {
607 pr_err("%s: vreg %s %s failed(%d)\n",
608 __func__, bt_vregs[i].name,
609 on ? "enable" : "disable", rc);
610 goto vreg_fail;
611 }
612 }
613
614 return rc;
615
616vreg_fail:
617 while (i) {
618 if (on)
619 vreg_disable(bt_vregs[--i].vregs);
620 }
621vreg_set_level_fail:
622 vreg_put(bt_vregs[0].vregs);
623 vreg_put(bt_vregs[1].vregs);
624 return rc;
625}
626
627static unsigned int msm_bahama_setup_power(void)
628{
629 int rc = 0;
630 struct vreg *vreg_s3 = NULL;
631
632 vreg_s3 = vreg_get(NULL, "msme1");
633 if (IS_ERR(vreg_s3)) {
634 pr_err("%s: vreg get failed (%ld)\n",
635 __func__, PTR_ERR(vreg_s3));
636 return PTR_ERR(vreg_s3);
637 }
638 rc = vreg_set_level(vreg_s3, 1800);
639 if (rc < 0) {
640 pr_err("%s: vreg set level failed (%d)\n",
641 __func__, rc);
642 goto vreg_fail;
643 }
644 rc = vreg_enable(vreg_s3);
645 if (rc < 0) {
646 pr_err("%s: vreg enable failed (%d)\n",
647 __func__, rc);
648 goto vreg_fail;
649 }
650
651 /*setup Bahama_sys_reset_n*/
652 rc = gpio_request(GPIO_BT_SYS_REST_EN, "bahama sys_rst_n");
653 if (rc < 0) {
654 pr_err("%s: gpio_request %d = %d\n", __func__,
655 GPIO_BT_SYS_REST_EN, rc);
656 goto vreg_fail;
657 }
658 rc = bt_set_gpio(1);
659 if (rc < 0) {
660 pr_err("%s: bt_set_gpio %d = %d\n", __func__,
661 GPIO_BT_SYS_REST_EN, rc);
662 goto gpio_fail;
663 }
664 return rc;
665
666gpio_fail:
667 gpio_free(GPIO_BT_SYS_REST_EN);
668vreg_fail:
669 vreg_put(vreg_s3);
670 return rc;
671}
672
673static unsigned int msm_bahama_shutdown_power(int value)
674{
675 int rc = 0;
676 struct vreg *vreg_s3 = NULL;
677
678 vreg_s3 = vreg_get(NULL, "msme1");
679 if (IS_ERR(vreg_s3)) {
680 pr_err("%s: vreg get failed (%ld)\n",
681 __func__, PTR_ERR(vreg_s3));
682 return PTR_ERR(vreg_s3);
683 }
684 rc = vreg_disable(vreg_s3);
685 if (rc) {
686 pr_err("%s: vreg disable failed (%d)\n",
687 __func__, rc);
688 vreg_put(vreg_s3);
689 return rc;
690 }
691 if (value == BAHAMA_ID) {
692 rc = bt_set_gpio(0);
693 if (rc) {
694 pr_err("%s: bt_set_gpio = %d\n",
695 __func__, rc);
696 }
697 }
698 return rc;
699}
700
701static unsigned int msm_bahama_core_config(int type)
702{
703 int rc = 0;
704
705 if (type == BAHAMA_ID) {
706 int i;
707 struct marimba config = { .mod_id = SLAVE_ID_BAHAMA};
708 const struct bahama_config_register v20_init[] = {
709 /* reg, value, mask */
710 { 0xF4, 0x84, 0xFF }, /* AREG */
711 { 0xF0, 0x04, 0xFF } /* DREG */
712 };
713 if (marimba_read_bahama_ver(&config) == BAHAMA_VER_2_0) {
714 for (i = 0; i < ARRAY_SIZE(v20_init); i++) {
715 u8 value = v20_init[i].value;
716 rc = marimba_write_bit_mask(&config,
717 v20_init[i].reg,
718 &value,
719 sizeof(v20_init[i].value),
720 v20_init[i].mask);
721 if (rc < 0) {
722 pr_err("%s: reg %d write failed: %d\n",
723 __func__, v20_init[i].reg, rc);
724 return rc;
725 }
726 pr_debug("%s: reg 0x%02x value 0x%02x"
727 " mask 0x%02x\n",
728 __func__, v20_init[i].reg,
729 v20_init[i].value, v20_init[i].mask);
730 }
731 }
732 }
733 rc = bt_set_gpio(0);
734 if (rc) {
735 pr_err("%s: bt_set_gpio = %d\n",
736 __func__, rc);
737 }
738 pr_debug("core type: %d\n", type);
739 return rc;
740}
741
742static int bluetooth_power(int on)
743{
744 int pin, rc = 0;
745 const char *id = "BTPW";
746 int cid = 0;
747
748 cid = adie_get_detected_connectivity_type();
749 if (cid != BAHAMA_ID) {
750 pr_err("%s: unexpected adie connectivity type: %d\n",
751 __func__, cid);
752 return -ENODEV;
753 }
754 if (on) {
755 /*setup power for BT SOC*/
756 rc = bt_set_gpio(on);
757 if (rc) {
758 pr_err("%s: bt_set_gpio = %d\n",
759 __func__, rc);
760 goto exit;
761 }
762 rc = bluetooth_switch_regulators(on);
763 if (rc < 0) {
764 pr_err("%s: bluetooth_switch_regulators rc = %d",
765 __func__, rc);
766 goto exit;
767 }
768 /*setup BT GPIO lines*/
769 for (pin = 0; pin < ARRAY_SIZE(bt_config_power_on);
770 pin++) {
771 rc = gpio_tlmm_config(bt_config_power_on[pin],
772 GPIO_CFG_ENABLE);
773 if (rc < 0) {
774 pr_err("%s: gpio_tlmm_config(%#x)=%d\n",
775 __func__,
776 bt_config_power_on[pin],
777 rc);
778 goto fail_power;
779 }
780 }
781 /*Setup BT clocks*/
782 rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1,
783 PMAPP_CLOCK_VOTE_ON);
784 if (rc < 0) {
785 pr_err("Failed to vote for TCXO_D1 ON\n");
786 goto fail_clock;
787 }
788 msleep(20);
789
790 /*I2C config for Bahama*/
791 rc = bahama_bt(1);
792 if (rc < 0) {
793 pr_err("%s: bahama_bt rc = %d", __func__, rc);
794 goto fail_i2c;
795 }
796 msleep(20);
797
798 /*setup BT PCM lines*/
799 rc = msm_bahama_setup_pcm_i2s(BT_PCM_ON);
800 if (rc < 0) {
801 pr_err("%s: msm_bahama_setup_pcm_i2s , rc =%d\n",
802 __func__, rc);
803 goto fail_power;
804 }
805 rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1,
806 PMAPP_CLOCK_VOTE_PIN_CTRL);
807 if (rc < 0)
808 pr_err("%s:Pin Control Failed, rc = %d",
809 __func__, rc);
810
811 } else {
812 rc = bahama_bt(0);
813 if (rc < 0)
814 pr_err("%s: bahama_bt rc = %d", __func__, rc);
815
816 rc = bt_set_gpio(on);
817 if (rc) {
818 pr_err("%s: bt_set_gpio = %d\n",
819 __func__, rc);
820 }
821fail_i2c:
822 rc = pmapp_clock_vote(id, PMAPP_CLOCK_ID_D1,
823 PMAPP_CLOCK_VOTE_OFF);
824 if (rc < 0)
825 pr_err("%s: Failed to vote Off D1\n", __func__);
826fail_clock:
827 for (pin = 0; pin < ARRAY_SIZE(bt_config_power_off);
828 pin++) {
829 rc = gpio_tlmm_config(bt_config_power_off[pin],
830 GPIO_CFG_ENABLE);
831 if (rc < 0) {
832 pr_err("%s: gpio_tlmm_config(%#x)=%d\n",
833 __func__, bt_config_power_off[pin], rc);
834 }
835 }
836 rc = msm_bahama_setup_pcm_i2s(BT_PCM_OFF);
837 if (rc < 0) {
838 pr_err("%s: msm_bahama_setup_pcm_i2s, rc =%d\n",
839 __func__, rc);
840 }
841fail_power:
842 rc = bluetooth_switch_regulators(0);
843 if (rc < 0) {
844 pr_err("%s: switch_regulators : rc = %d",\
845 __func__, rc);
846 goto exit;
847 }
848 }
849 return rc;
850exit:
851 pr_err("%s: failed with rc = %d", __func__, rc);
852 return rc;
853}
854
855static int __init bt_power_init(void)
856{
857 int i, rc = 0;
858 for (i = 0; i < ARRAY_SIZE(bt_vregs); i++) {
859 bt_vregs[i].vregs = vreg_get(NULL,
860 bt_vregs[i].name);
861 if (IS_ERR(bt_vregs[i].vregs)) {
862 pr_err("%s: vreg get %s failed (%ld)\n",
863 __func__, bt_vregs[i].name,
864 PTR_ERR(bt_vregs[i].vregs));
865 rc = PTR_ERR(bt_vregs[i].vregs);
866 goto vreg_get_fail;
867 }
868 }
869
870 msm_bt_power_device.dev.platform_data = &bluetooth_power;
871
872 return rc;
873
874vreg_get_fail:
875 while (i)
876 vreg_put(bt_vregs[--i].vregs);
877 return rc;
878}
879
880static struct marimba_platform_data marimba_pdata = {
881 .slave_id[SLAVE_ID_BAHAMA_FM] = BAHAMA_SLAVE_ID_FM_ADDR,
882 .slave_id[SLAVE_ID_BAHAMA_QMEMBIST] = BAHAMA_SLAVE_ID_QMEMBIST_ADDR,
883 .bahama_setup = msm_bahama_setup_power,
884 .bahama_shutdown = msm_bahama_shutdown_power,
885 .bahama_core_config = msm_bahama_core_config,
886 .fm = &marimba_fm_pdata,
887};
888
889#endif
890
891#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE)
892static struct i2c_board_info bahama_devices[] = {
893{
894 I2C_BOARD_INFO("marimba", 0xc),
895 .platform_data = &marimba_pdata,
896},
897};
898#endif
899
900static struct msm_gpio qup_i2c_gpios_io[] = {
901 { GPIO_CFG(60, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
902 "qup_scl" },
903 { GPIO_CFG(61, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
904 "qup_sda" },
905 { GPIO_CFG(131, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
906 "qup_scl" },
907 { GPIO_CFG(132, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
908 "qup_sda" },
909};
910
911static struct msm_gpio qup_i2c_gpios_hw[] = {
912 { GPIO_CFG(60, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
913 "qup_scl" },
914 { GPIO_CFG(61, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
915 "qup_sda" },
916 { GPIO_CFG(131, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
917 "qup_scl" },
918 { GPIO_CFG(132, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
919 "qup_sda" },
920};
921
922static void gsbi_qup_i2c_gpio_config(int adap_id, int config_type)
923{
924 int rc;
925
926 if (adap_id < 0 || adap_id > 1)
927 return;
928
929 /* Each adapter gets 2 lines from the table */
930 if (config_type)
931 rc = msm_gpios_request_enable(&qup_i2c_gpios_hw[adap_id*2], 2);
932 else
933 rc = msm_gpios_request_enable(&qup_i2c_gpios_io[adap_id*2], 2);
934 if (rc < 0)
935 pr_err("QUP GPIO request/enable failed: %d\n", rc);
936}
937
938static struct msm_i2c_platform_data msm_gsbi0_qup_i2c_pdata = {
939 .clk_freq = 100000,
940 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
941};
942
943static struct msm_i2c_platform_data msm_gsbi1_qup_i2c_pdata = {
944 .clk_freq = 100000,
945 .msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
946};
947
948#ifdef CONFIG_ARCH_MSM7X27A
949#define MSM_PMEM_MDP_SIZE 0x1DD1000
950#define MSM_PMEM_ADSP_SIZE 0x1000000
951
952#ifdef CONFIG_FB_MSM_TRIPLE_BUFFER
953#define MSM_FB_SIZE 0x260000
954#else
955#define MSM_FB_SIZE 0x195000
956#endif
957
958#endif
959
960static char *usb_functions_default[] = {
961 "diag",
962 "modem",
963 "nmea",
964 "rmnet",
965 "usb_mass_storage",
966};
967
968static char *usb_functions_default_adb[] = {
969 "diag",
970 "adb",
971 "modem",
972 "nmea",
973 "rmnet",
974 "usb_mass_storage",
975};
976
977static char *usb_functions_rndis[] = {
978 "rndis",
979};
980
981static char *usb_functions_rndis_adb[] = {
982 "rndis",
983 "adb",
984};
985
986static char *usb_functions_all[] = {
987#ifdef CONFIG_USB_ANDROID_RNDIS
988 "rndis",
989#endif
990#ifdef CONFIG_USB_ANDROID_DIAG
991 "diag",
992#endif
993 "adb",
994#ifdef CONFIG_USB_F_SERIAL
995 "modem",
996 "nmea",
997#endif
998#ifdef CONFIG_USB_ANDROID_RMNET
999 "rmnet",
1000#endif
1001 "usb_mass_storage",
1002};
1003
1004static struct android_usb_product usb_products[] = {
1005 {
1006 .product_id = 0x9026,
1007 .num_functions = ARRAY_SIZE(usb_functions_default),
1008 .functions = usb_functions_default,
1009 },
1010 {
1011 .product_id = 0x9025,
1012 .num_functions = ARRAY_SIZE(usb_functions_default_adb),
1013 .functions = usb_functions_default_adb,
1014 },
1015 {
1016 .product_id = 0xf00e,
1017 .num_functions = ARRAY_SIZE(usb_functions_rndis),
1018 .functions = usb_functions_rndis,
1019 },
1020 {
1021 .product_id = 0x9024,
1022 .num_functions = ARRAY_SIZE(usb_functions_rndis_adb),
1023 .functions = usb_functions_rndis_adb,
1024 },
1025};
1026
1027static struct usb_mass_storage_platform_data mass_storage_pdata = {
1028 .nluns = 1,
1029 .vendor = "Qualcomm Incorporated",
1030 .product = "Mass storage",
1031 .release = 0x0100,
1032
1033};
1034
1035static struct platform_device usb_mass_storage_device = {
1036 .name = "usb_mass_storage",
1037 .id = -1,
1038 .dev = {
1039 .platform_data = &mass_storage_pdata,
1040 },
1041};
1042
1043static struct android_usb_platform_data android_usb_pdata = {
1044 .vendor_id = 0x05C6,
1045 .product_id = 0x9026,
1046 .version = 0x0100,
1047 .product_name = "Qualcomm HSUSB Device",
1048 .manufacturer_name = "Qualcomm Incorporated",
1049 .num_products = ARRAY_SIZE(usb_products),
1050 .products = usb_products,
1051 .num_functions = ARRAY_SIZE(usb_functions_all),
1052 .functions = usb_functions_all,
1053 .serial_number = "1234567890ABCDEF",
1054};
1055
1056static struct platform_device android_usb_device = {
1057 .name = "android_usb",
1058 .id = -1,
1059 .dev = {
1060 .platform_data = &android_usb_pdata,
1061 },
1062};
1063
1064static struct usb_ether_platform_data rndis_pdata = {
1065 .vendorID = 0x05C6,
1066 .vendorDescr = "Qualcomm Incorporated",
1067};
1068
1069static struct platform_device rndis_device = {
1070 .name = "rndis",
1071 .id = -1,
1072 .dev = {
1073 .platform_data = &rndis_pdata,
1074 },
1075};
1076
1077static int __init board_serialno_setup(char *serialno)
1078{
1079 int i;
1080 char *src = serialno;
1081
1082 /* create a fake MAC address from our serial number.
1083 * first byte is 0x02 to signify locally administered.
1084 */
1085 rndis_pdata.ethaddr[0] = 0x02;
1086 for (i = 0; *src; i++) {
1087 /* XOR the USB serial across the remaining bytes */
1088 rndis_pdata.ethaddr[i % (ETH_ALEN - 1) + 1] ^= *src++;
1089 }
1090
1091 android_usb_pdata.serial_number = serialno;
1092 return 1;
1093}
1094__setup("androidboot.serialno=", board_serialno_setup);
1095
1096#ifdef CONFIG_USB_EHCI_MSM_72K
1097static void msm_hsusb_vbus_power(unsigned phy_info, int on)
1098{
1099 int rc = 0;
1100 unsigned gpio;
1101
1102 gpio = GPIO_HOST_VBUS_EN;
1103
1104 rc = gpio_request(gpio, "i2c_host_vbus_en");
1105 if (rc < 0) {
1106 pr_err("failed to request %d GPIO\n", gpio);
1107 return;
1108 }
1109 gpio_direction_output(gpio, !!on);
1110 gpio_set_value_cansleep(gpio, !!on);
1111 gpio_free(gpio);
1112}
1113
1114static struct msm_usb_host_platform_data msm_usb_host_pdata = {
1115 .phy_info = (USB_PHY_INTEGRATED | USB_PHY_MODEL_45NM),
1116};
1117
1118static void __init msm7627a_init_host(void)
1119{
1120 msm_add_host(0, &msm_usb_host_pdata);
1121}
1122#endif
1123
1124#ifdef CONFIG_USB_MSM_OTG_72K
1125static int hsusb_rpc_connect(int connect)
1126{
1127 if (connect)
1128 return msm_hsusb_rpc_connect();
1129 else
1130 return msm_hsusb_rpc_close();
1131}
1132
1133static struct vreg *vreg_3p3;
1134static int msm_hsusb_ldo_init(int init)
1135{
1136 if (init) {
1137 vreg_3p3 = vreg_get(NULL, "usb");
1138 if (IS_ERR(vreg_3p3))
1139 return PTR_ERR(vreg_3p3);
1140 } else
1141 vreg_put(vreg_3p3);
1142
1143 return 0;
1144}
1145
1146static int msm_hsusb_ldo_enable(int enable)
1147{
1148 static int ldo_status;
1149
1150 if (!vreg_3p3 || IS_ERR(vreg_3p3))
1151 return -ENODEV;
1152
1153 if (ldo_status == enable)
1154 return 0;
1155
1156 ldo_status = enable;
1157
1158 if (enable)
1159 return vreg_enable(vreg_3p3);
1160
1161 return vreg_disable(vreg_3p3);
1162}
1163
1164#ifndef CONFIG_USB_EHCI_MSM_72K
1165static int msm_hsusb_pmic_notif_init(void (*callback)(int online), int init)
1166{
1167 int ret = 0;
1168
1169 if (init)
1170 ret = msm_pm_app_rpc_init(callback);
1171 else
1172 msm_pm_app_rpc_deinit(callback);
1173
1174 return ret;
1175}
1176#endif
1177
1178static struct msm_otg_platform_data msm_otg_pdata = {
1179#ifndef CONFIG_USB_EHCI_MSM_72K
1180 .pmic_vbus_notif_init = msm_hsusb_pmic_notif_init,
1181#else
1182 .vbus_power = msm_hsusb_vbus_power,
1183#endif
1184 .rpc_connect = hsusb_rpc_connect,
1185 .core_clk = 1,
1186 .pemp_level = PRE_EMPHASIS_WITH_20_PERCENT,
1187 .cdr_autoreset = CDR_AUTO_RESET_DISABLE,
1188 .drv_ampl = HS_DRV_AMPLITUDE_DEFAULT,
1189 .se1_gating = SE1_GATING_DISABLE,
1190 .ldo_init = msm_hsusb_ldo_init,
1191 .ldo_enable = msm_hsusb_ldo_enable,
1192 .chg_init = hsusb_chg_init,
1193 .chg_connected = hsusb_chg_connected,
1194 .chg_vbus_draw = hsusb_chg_vbus_draw,
1195};
1196#endif
1197
1198static struct msm_hsusb_gadget_platform_data msm_gadget_pdata = {
1199 .is_phy_status_timer_on = 1,
1200};
1201
1202#if (defined(CONFIG_MMC_MSM_SDC1_SUPPORT)\
1203 || defined(CONFIG_MMC_MSM_SDC2_SUPPORT)\
1204 || defined(CONFIG_MMC_MSM_SDC3_SUPPORT)\
1205 || defined(CONFIG_MMC_MSM_SDC4_SUPPORT))
1206
1207static unsigned long vreg_sts, gpio_sts;
1208static struct vreg *vreg_mmc;
1209static struct vreg *vreg_emmc;
1210
1211struct sdcc_vreg {
1212 struct vreg *vreg_data;
1213 unsigned level;
1214};
1215
1216static struct sdcc_vreg sdcc_vreg_data[4];
1217
1218struct sdcc_gpio {
1219 struct msm_gpio *cfg_data;
1220 uint32_t size;
1221 struct msm_gpio *sleep_cfg_data;
1222};
1223
1224/**
1225 * Due to insufficient drive strengths for SDC GPIO lines some old versioned
1226 * SD/MMC cards may cause data CRC errors. Hence, set optimal values
1227 * for SDC slots based on timing closure and marginality. SDC1 slot
1228 * require higher value since it should handle bad signal quality due
1229 * to size of T-flash adapters.
1230 */
1231static struct msm_gpio sdc1_cfg_data[] = {
1232 {GPIO_CFG(51, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA),
1233 "sdc1_dat_3"},
1234 {GPIO_CFG(52, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA),
1235 "sdc1_dat_2"},
1236 {GPIO_CFG(53, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA),
1237 "sdc1_dat_1"},
1238 {GPIO_CFG(54, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA),
1239 "sdc1_dat_0"},
1240 {GPIO_CFG(55, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_14MA),
1241 "sdc1_cmd"},
1242 {GPIO_CFG(56, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_14MA),
1243 "sdc1_clk"},
1244};
1245
1246static struct msm_gpio sdc2_cfg_data[] = {
1247 {GPIO_CFG(62, 2, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
1248 "sdc2_clk"},
1249 {GPIO_CFG(63, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1250 "sdc2_cmd"},
1251 {GPIO_CFG(64, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1252 "sdc2_dat_3"},
1253 {GPIO_CFG(65, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1254 "sdc2_dat_2"},
1255 {GPIO_CFG(66, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1256 "sdc2_dat_1"},
1257 {GPIO_CFG(67, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1258 "sdc2_dat_0"},
1259};
1260
1261static struct msm_gpio sdc2_sleep_cfg_data[] = {
1262 {GPIO_CFG(62, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
1263 "sdc2_clk"},
1264 {GPIO_CFG(63, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
1265 "sdc2_cmd"},
1266 {GPIO_CFG(64, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
1267 "sdc2_dat_3"},
1268 {GPIO_CFG(65, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
1269 "sdc2_dat_2"},
1270 {GPIO_CFG(66, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
1271 "sdc2_dat_1"},
1272 {GPIO_CFG(67, 0, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
1273 "sdc2_dat_0"},
1274};
1275static struct msm_gpio sdc3_cfg_data[] = {
1276 {GPIO_CFG(88, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
1277 "sdc3_clk"},
1278 {GPIO_CFG(89, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1279 "sdc3_cmd"},
1280 {GPIO_CFG(90, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1281 "sdc3_dat_3"},
1282 {GPIO_CFG(91, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1283 "sdc3_dat_2"},
1284 {GPIO_CFG(92, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1285 "sdc3_dat_1"},
1286 {GPIO_CFG(93, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1287 "sdc3_dat_0"},
1288#ifdef CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT
1289 {GPIO_CFG(19, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1290 "sdc3_dat_7"},
1291 {GPIO_CFG(20, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1292 "sdc3_dat_6"},
1293 {GPIO_CFG(21, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1294 "sdc3_dat_5"},
1295 {GPIO_CFG(108, 3, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1296 "sdc3_dat_4"},
1297#endif
1298};
1299
1300static struct msm_gpio sdc4_cfg_data[] = {
1301 {GPIO_CFG(19, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1302 "sdc4_dat_3"},
1303 {GPIO_CFG(20, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1304 "sdc4_dat_2"},
1305 {GPIO_CFG(21, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1306 "sdc4_dat_1"},
1307 {GPIO_CFG(107, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1308 "sdc4_cmd"},
1309 {GPIO_CFG(108, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_UP, GPIO_CFG_10MA),
1310 "sdc4_dat_0"},
1311 {GPIO_CFG(109, 1, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
1312 "sdc4_clk"},
1313};
1314
1315static struct sdcc_gpio sdcc_cfg_data[] = {
1316 {
1317 .cfg_data = sdc1_cfg_data,
1318 .size = ARRAY_SIZE(sdc1_cfg_data),
1319 },
1320 {
1321 .cfg_data = sdc2_cfg_data,
1322 .size = ARRAY_SIZE(sdc2_cfg_data),
1323 .sleep_cfg_data = sdc2_sleep_cfg_data,
1324 },
1325 {
1326 .cfg_data = sdc3_cfg_data,
1327 .size = ARRAY_SIZE(sdc3_cfg_data),
1328 },
1329 {
1330 .cfg_data = sdc4_cfg_data,
1331 .size = ARRAY_SIZE(sdc4_cfg_data),
1332 },
1333};
1334
1335static int msm_sdcc_setup_gpio(int dev_id, unsigned int enable)
1336{
1337 int rc = 0;
1338 struct sdcc_gpio *curr;
1339
1340 curr = &sdcc_cfg_data[dev_id - 1];
1341 if (!(test_bit(dev_id, &gpio_sts)^enable))
1342 return rc;
1343
1344 if (enable) {
1345 set_bit(dev_id, &gpio_sts);
1346 rc = msm_gpios_request_enable(curr->cfg_data, curr->size);
1347 if (rc)
1348 pr_err("%s: Failed to turn on GPIOs for slot %d\n",
1349 __func__, dev_id);
1350 } else {
1351 clear_bit(dev_id, &gpio_sts);
1352 if (curr->sleep_cfg_data) {
1353 rc = msm_gpios_enable(curr->sleep_cfg_data, curr->size);
1354 msm_gpios_free(curr->sleep_cfg_data, curr->size);
1355 return rc;
1356 }
1357 msm_gpios_disable_free(curr->cfg_data, curr->size);
1358 }
1359 return rc;
1360}
1361
1362static int msm_sdcc_setup_vreg(int dev_id, unsigned int enable)
1363{
1364 int rc = 0;
1365 struct sdcc_vreg *curr;
1366
1367 curr = &sdcc_vreg_data[dev_id - 1];
1368
1369 if (!(test_bit(dev_id, &vreg_sts)^enable))
1370 return rc;
1371
1372 if (enable) {
1373 set_bit(dev_id, &vreg_sts);
1374 rc = vreg_set_level(curr->vreg_data, curr->level);
1375 if (rc)
1376 pr_err("%s: vreg_set_level() = %d\n", __func__, rc);
1377
1378 rc = vreg_enable(curr->vreg_data);
1379 if (rc)
1380 pr_err("%s: vreg_enable() = %d\n", __func__, rc);
1381 } else {
1382 clear_bit(dev_id, &vreg_sts);
1383 rc = vreg_disable(curr->vreg_data);
1384 if (rc)
1385 pr_err("%s: vreg_disable() = %d\n", __func__, rc);
1386 }
1387 return rc;
1388}
1389
1390static uint32_t msm_sdcc_setup_power(struct device *dv, unsigned int vdd)
1391{
1392 int rc = 0;
1393 struct platform_device *pdev;
1394
1395 pdev = container_of(dv, struct platform_device, dev);
1396
1397 rc = msm_sdcc_setup_gpio(pdev->id, !!vdd);
1398 if (rc)
1399 goto out;
1400
1401 rc = msm_sdcc_setup_vreg(pdev->id, !!vdd);
1402out:
1403 return rc;
1404}
1405
1406#define GPIO_SDC1_HW_DET 85
1407
1408#if defined(CONFIG_MMC_MSM_SDC1_SUPPORT) \
1409 && defined(CONFIG_MMC_MSM_CARD_HW_DETECTION)
1410static unsigned int msm7627a_sdcc_slot_status(struct device *dev)
1411{
1412 int status;
1413
1414 status = gpio_tlmm_config(GPIO_CFG(GPIO_SDC1_HW_DET, 2, GPIO_CFG_INPUT,
1415 GPIO_CFG_PULL_UP, GPIO_CFG_8MA), GPIO_CFG_ENABLE);
1416 if (status)
1417 pr_err("%s:Failed to configure tlmm for GPIO %d\n", __func__,
1418 GPIO_SDC1_HW_DET);
1419
1420 status = gpio_request(GPIO_SDC1_HW_DET, "SD_HW_Detect");
1421 if (status) {
1422 pr_err("%s:Failed to request GPIO %d\n", __func__,
1423 GPIO_SDC1_HW_DET);
1424 } else {
1425 status = gpio_direction_input(GPIO_SDC1_HW_DET);
1426 if (!status)
1427 status = gpio_get_value(GPIO_SDC1_HW_DET);
1428 gpio_free(GPIO_SDC1_HW_DET);
1429 }
1430 return status;
1431}
1432#endif
1433
1434#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
1435static struct mmc_platform_data sdc1_plat_data = {
1436 .ocr_mask = MMC_VDD_28_29,
1437 .translate_vdd = msm_sdcc_setup_power,
1438 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
1439 .msmsdcc_fmin = 144000,
1440 .msmsdcc_fmid = 24576000,
1441 .msmsdcc_fmax = 49152000,
1442#ifdef CONFIG_MMC_MSM_CARD_HW_DETECTION
1443 .status = msm7627a_sdcc_slot_status,
1444 .status_irq = MSM_GPIO_TO_INT(GPIO_SDC1_HW_DET),
1445 .irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
1446#endif
1447};
1448#endif
1449
1450#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT
1451static struct mmc_platform_data sdc2_plat_data = {
1452 /*
1453 * SDC2 supports only 1.8V, claim for 2.85V range is just
1454 * for allowing buggy cards who advertise 2.8V even though
1455 * they can operate at 1.8V supply.
1456 */
1457 .ocr_mask = MMC_VDD_28_29 | MMC_VDD_165_195,
1458 .translate_vdd = msm_sdcc_setup_power,
1459 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
1460#ifdef CONFIG_MMC_MSM_SDIO_SUPPORT
1461 .sdiowakeup_irq = MSM_GPIO_TO_INT(66),
1462#endif
1463 .msmsdcc_fmin = 144000,
1464 .msmsdcc_fmid = 24576000,
1465 .msmsdcc_fmax = 49152000,
1466#ifdef CONFIG_MMC_MSM_SDC2_DUMMY52_REQUIRED
1467 .dummy52_required = 1,
1468#endif
1469};
1470#endif
1471
1472#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
1473static struct mmc_platform_data sdc3_plat_data = {
1474 .ocr_mask = MMC_VDD_28_29,
1475 .translate_vdd = msm_sdcc_setup_power,
1476#ifdef CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT
1477 .mmc_bus_width = MMC_CAP_8_BIT_DATA,
1478#else
1479 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
1480#endif
1481 .msmsdcc_fmin = 144000,
1482 .msmsdcc_fmid = 24576000,
1483 .msmsdcc_fmax = 49152000,
1484 .nonremovable = 1,
1485};
1486#endif
1487
1488#if (defined(CONFIG_MMC_MSM_SDC4_SUPPORT)\
1489 && !defined(CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT))
1490static struct mmc_platform_data sdc4_plat_data = {
1491 .ocr_mask = MMC_VDD_28_29,
1492 .translate_vdd = msm_sdcc_setup_power,
1493 .mmc_bus_width = MMC_CAP_4_BIT_DATA,
1494 .msmsdcc_fmin = 144000,
1495 .msmsdcc_fmid = 24576000,
1496 .msmsdcc_fmax = 49152000,
1497};
1498#endif
1499#endif
1500
1501#ifdef CONFIG_SERIAL_MSM_HS
1502static struct msm_serial_hs_platform_data msm_uart_dm1_pdata = {
1503 .inject_rx_on_wakeup = 1,
1504 .rx_to_inject = 0xFD,
1505};
1506#endif
1507static struct msm_pm_platform_data msm7627a_pm_data[MSM_PM_SLEEP_MODE_NR] = {
1508 [MSM_PM_SLEEP_MODE_POWER_COLLAPSE] = {
1509 .idle_supported = 1,
1510 .suspend_supported = 1,
1511 .idle_enabled = 1,
1512 .suspend_enabled = 1,
1513 .latency = 16000,
1514 .residency = 20000,
1515 },
1516 [MSM_PM_SLEEP_MODE_POWER_COLLAPSE_NO_XO_SHUTDOWN] = {
1517 .idle_supported = 1,
1518 .suspend_supported = 1,
1519 .idle_enabled = 1,
1520 .suspend_enabled = 1,
1521 .latency = 12000,
1522 .residency = 20000,
1523 },
1524 [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT] = {
1525 .idle_supported = 1,
1526 .suspend_supported = 1,
1527 .idle_enabled = 0,
1528 .suspend_enabled = 1,
1529 .latency = 2000,
1530 .residency = 0,
1531 },
1532 [MSM_PM_SLEEP_MODE_WAIT_FOR_INTERRUPT] = {
1533 .idle_supported = 1,
1534 .suspend_supported = 1,
1535 .idle_enabled = 1,
1536 .suspend_enabled = 1,
1537 .latency = 2,
1538 .residency = 0,
1539 },
1540};
1541
1542static struct android_pmem_platform_data android_pmem_adsp_pdata = {
1543 .name = "pmem_adsp",
1544 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
1545 .cached = 1,
1546 .memory_type = MEMTYPE_EBI1,
1547};
1548
1549static struct platform_device android_pmem_adsp_device = {
1550 .name = "android_pmem",
1551 .id = 1,
1552 .dev = { .platform_data = &android_pmem_adsp_pdata },
1553};
1554
1555static unsigned pmem_mdp_size = MSM_PMEM_MDP_SIZE;
1556static int __init pmem_mdp_size_setup(char *p)
1557{
1558 pmem_mdp_size = memparse(p, NULL);
1559 return 0;
1560}
1561
1562early_param("pmem_mdp_size", pmem_mdp_size_setup);
1563
1564static unsigned pmem_adsp_size = MSM_PMEM_ADSP_SIZE;
1565static int __init pmem_adsp_size_setup(char *p)
1566{
1567 pmem_adsp_size = memparse(p, NULL);
1568 return 0;
1569}
1570
1571early_param("pmem_adsp_size", pmem_adsp_size_setup);
1572
1573static unsigned fb_size = MSM_FB_SIZE;
1574static int __init fb_size_setup(char *p)
1575{
1576 fb_size = memparse(p, NULL);
1577 return 0;
1578}
1579
1580early_param("fb_size", fb_size_setup);
1581
1582static void __init msm7627a_init_mmc(void)
1583{
1584 vreg_emmc = vreg_get(NULL, "emmc");
1585 if (IS_ERR(vreg_emmc)) {
1586 pr_err("%s: vreg get failed (%ld)\n",
1587 __func__, PTR_ERR(vreg_emmc));
1588 return;
1589 }
1590
1591 vreg_mmc = vreg_get(NULL, "mmc");
1592 if (IS_ERR(vreg_mmc)) {
1593 pr_err("%s: vreg get failed (%ld)\n",
1594 __func__, PTR_ERR(vreg_mmc));
1595 return;
1596 }
1597
1598 /* eMMC slot */
1599#ifdef CONFIG_MMC_MSM_SDC3_SUPPORT
1600 sdcc_vreg_data[2].vreg_data = vreg_emmc;
1601 sdcc_vreg_data[2].level = 3000;
1602 msm_add_sdcc(3, &sdc3_plat_data);
1603#endif
1604 /* Micro-SD slot */
1605#ifdef CONFIG_MMC_MSM_SDC1_SUPPORT
1606 sdcc_vreg_data[0].vreg_data = vreg_mmc;
1607 sdcc_vreg_data[0].level = 2850;
1608 msm_add_sdcc(1, &sdc1_plat_data);
1609#endif
1610 /* SDIO WLAN slot */
1611#ifdef CONFIG_MMC_MSM_SDC2_SUPPORT
1612 sdcc_vreg_data[1].vreg_data = vreg_mmc;
1613 sdcc_vreg_data[1].level = 2850;
1614 msm_add_sdcc(2, &sdc2_plat_data);
1615#endif
1616 /* Not Used */
1617#if (defined(CONFIG_MMC_MSM_SDC4_SUPPORT)\
1618 && !defined(CONFIG_MMC_MSM_SDC3_8_BIT_SUPPORT))
1619 sdcc_vreg_data[3].vreg_data = vreg_mmc;
1620 sdcc_vreg_data[3].level = 2850;
1621 msm_add_sdcc(4, &sdc4_plat_data);
1622#endif
1623}
1624
1625#define SND(desc, num) { .name = #desc, .id = num }
1626static struct snd_endpoint snd_endpoints_list[] = {
1627 SND(HANDSET, 0),
1628 SND(MONO_HEADSET, 2),
1629 SND(HEADSET, 3),
1630 SND(SPEAKER, 6),
1631 SND(TTY_HEADSET, 8),
1632 SND(TTY_VCO, 9),
1633 SND(TTY_HCO, 10),
1634 SND(BT, 12),
1635 SND(IN_S_SADC_OUT_HANDSET, 16),
1636 SND(IN_S_SADC_OUT_SPEAKER_PHONE, 25),
1637 SND(FM_DIGITAL_STEREO_HEADSET, 26),
1638 SND(FM_DIGITAL_SPEAKER_PHONE, 27),
1639 SND(FM_DIGITAL_BT_A2DP_HEADSET, 28),
1640 SND(CURRENT, 34),
1641 SND(FM_ANALOG_STEREO_HEADSET, 35),
1642 SND(FM_ANALOG_STEREO_HEADSET_CODEC, 36),
1643};
1644#undef SND
1645
1646static struct msm_snd_endpoints msm_device_snd_endpoints = {
1647 .endpoints = snd_endpoints_list,
1648 .num = sizeof(snd_endpoints_list) / sizeof(struct snd_endpoint)
1649};
1650
1651static struct platform_device msm_device_snd = {
1652 .name = "msm_snd",
1653 .id = -1,
1654 .dev = {
1655 .platform_data = &msm_device_snd_endpoints
1656 },
1657};
1658
1659#define DEC0_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
1660 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
1661 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
1662 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
1663 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
1664 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
1665#define DEC1_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
1666 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
1667 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
1668 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
1669 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
1670 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
1671#define DEC2_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
1672 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
1673 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
1674 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
1675 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
1676 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
1677#define DEC3_FORMAT ((1<<MSM_ADSP_CODEC_MP3)| \
1678 (1<<MSM_ADSP_CODEC_AAC)|(1<<MSM_ADSP_CODEC_WMA)| \
1679 (1<<MSM_ADSP_CODEC_WMAPRO)|(1<<MSM_ADSP_CODEC_AMRWB)| \
1680 (1<<MSM_ADSP_CODEC_AMRNB)|(1<<MSM_ADSP_CODEC_WAV)| \
1681 (1<<MSM_ADSP_CODEC_ADPCM)|(1<<MSM_ADSP_CODEC_YADPCM)| \
1682 (1<<MSM_ADSP_CODEC_EVRC)|(1<<MSM_ADSP_CODEC_QCELP))
1683#define DEC4_FORMAT (1<<MSM_ADSP_CODEC_MIDI)
1684
1685static unsigned int dec_concurrency_table[] = {
1686 /* Audio LP */
1687 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DMA)), 0,
1688 0, 0, 0,
1689
1690 /* Concurrency 1 */
1691 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1692 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1693 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1694 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1695 (DEC4_FORMAT),
1696
1697 /* Concurrency 2 */
1698 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1699 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1700 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1701 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1702 (DEC4_FORMAT),
1703
1704 /* Concurrency 3 */
1705 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1706 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1707 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1708 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1709 (DEC4_FORMAT),
1710
1711 /* Concurrency 4 */
1712 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1713 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1714 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1715 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1716 (DEC4_FORMAT),
1717
1718 /* Concurrency 5 */
1719 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_TUNNEL)|(1<<MSM_ADSP_OP_DM)),
1720 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1721 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1722 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1723 (DEC4_FORMAT),
1724
1725 /* Concurrency 6 */
1726 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1727 0, 0, 0, 0,
1728
1729 /* Concurrency 7 */
1730 (DEC0_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1731 (DEC1_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1732 (DEC2_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1733 (DEC3_FORMAT|(1<<MSM_ADSP_MODE_NONTUNNEL)|(1<<MSM_ADSP_OP_DM)),
1734 (DEC4_FORMAT),
1735};
1736
1737#define DEC_INFO(name, queueid, decid, nr_codec) { .module_name = name, \
1738 .module_queueid = queueid, .module_decid = decid, \
1739 .nr_codec_support = nr_codec}
1740
1741static struct msm_adspdec_info dec_info_list[] = {
1742 DEC_INFO("AUDPLAY0TASK", 13, 0, 11), /* AudPlay0BitStreamCtrlQueue */
1743 DEC_INFO("AUDPLAY1TASK", 14, 1, 11), /* AudPlay1BitStreamCtrlQueue */
1744 DEC_INFO("AUDPLAY2TASK", 15, 2, 11), /* AudPlay2BitStreamCtrlQueue */
1745 DEC_INFO("AUDPLAY3TASK", 16, 3, 11), /* AudPlay3BitStreamCtrlQueue */
1746 DEC_INFO("AUDPLAY4TASK", 17, 4, 1), /* AudPlay4BitStreamCtrlQueue */
1747};
1748
1749static struct msm_adspdec_database msm_device_adspdec_database = {
1750 .num_dec = ARRAY_SIZE(dec_info_list),
1751 .num_concurrency_support = (ARRAY_SIZE(dec_concurrency_table) / \
1752 ARRAY_SIZE(dec_info_list)),
1753 .dec_concurrency_table = dec_concurrency_table,
1754 .dec_info_list = dec_info_list,
1755};
1756
1757static struct platform_device msm_device_adspdec = {
1758 .name = "msm_adspdec",
1759 .id = -1,
1760 .dev = {
1761 .platform_data = &msm_device_adspdec_database
1762 },
1763};
1764
1765static struct android_pmem_platform_data android_pmem_audio_pdata = {
1766 .name = "pmem_audio",
1767 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
1768 .cached = 0,
1769 .memory_type = MEMTYPE_EBI1,
1770};
1771
1772static struct platform_device android_pmem_audio_device = {
1773 .name = "android_pmem",
1774 .id = 2,
1775 .dev = { .platform_data = &android_pmem_audio_pdata },
1776};
1777
1778static struct android_pmem_platform_data android_pmem_pdata = {
1779 .name = "pmem",
1780 .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
1781 .cached = 1,
1782 .memory_type = MEMTYPE_EBI1,
1783};
1784static struct platform_device android_pmem_device = {
1785 .name = "android_pmem",
1786 .id = 0,
1787 .dev = { .platform_data = &android_pmem_pdata },
1788};
1789
1790static u32 msm_calculate_batt_capacity(u32 current_voltage);
1791
1792static struct msm_psy_batt_pdata msm_psy_batt_data = {
1793 .voltage_min_design = 2800,
1794 .voltage_max_design = 4300,
1795 .avail_chg_sources = AC_CHG | USB_CHG ,
1796 .batt_technology = POWER_SUPPLY_TECHNOLOGY_LION,
1797 .calculate_capacity = &msm_calculate_batt_capacity,
1798};
1799
1800static u32 msm_calculate_batt_capacity(u32 current_voltage)
1801{
1802 u32 low_voltage = msm_psy_batt_data.voltage_min_design;
1803 u32 high_voltage = msm_psy_batt_data.voltage_max_design;
1804
1805 return (current_voltage - low_voltage) * 100
1806 / (high_voltage - low_voltage);
1807}
1808
1809static struct platform_device msm_batt_device = {
1810 .name = "msm-battery",
1811 .id = -1,
1812 .dev.platform_data = &msm_psy_batt_data,
1813};
1814
1815static struct platform_device *qrd1_devices[] __initdata = {
1816 &msm_device_dmov,
1817 &msm_device_smd,
1818 &msm_device_uart1,
1819 &msm_device_uart_dm1,
1820 &msm_gsbi0_qup_i2c_device,
1821 &msm_gsbi1_qup_i2c_device,
1822 &msm_device_otg,
1823 &msm_device_gadget_peripheral,
1824 &android_usb_device,
1825 &android_pmem_device,
1826 &android_pmem_adsp_device,
1827 &usb_mass_storage_device,
1828 &rndis_device,
1829 &usb_diag_device,
1830 &usb_gadget_fserial_device,
1831 &android_pmem_audio_device,
1832 &msm_device_snd,
1833 &msm_device_adspdec,
1834 &msm_batt_device,
1835 &msm_kgsl_3d0,
1836#ifdef CONFIG_BT
1837 &msm_bt_power_device,
1838#endif
1839 &msm_wlan_ar6000_pm_device,
1840 &asoc_msm_pcm,
1841 &asoc_msm_dai0,
1842 &asoc_msm_dai1,
1843};
1844
1845static unsigned pmem_kernel_ebi1_size = PMEM_KERNEL_EBI1_SIZE;
1846static int __init pmem_kernel_ebi1_size_setup(char *p)
1847{
1848 pmem_kernel_ebi1_size = memparse(p, NULL);
1849 return 0;
1850}
1851early_param("pmem_kernel_ebi1_size", pmem_kernel_ebi1_size_setup);
1852
1853static unsigned pmem_audio_size = MSM_PMEM_AUDIO_SIZE;
1854static int __init pmem_audio_size_setup(char *p)
1855{
1856 pmem_audio_size = memparse(p, NULL);
1857 return 0;
1858}
1859early_param("pmem_audio_size", pmem_audio_size_setup);
1860
1861static void __init msm_msm7627a_allocate_memory_regions(void)
1862{
1863 pr_info("Dummy allocation for fb\n");
1864}
1865
1866static struct memtype_reserve msm7627a_reserve_table[] __initdata = {
1867 [MEMTYPE_SMI] = {
1868 },
1869 [MEMTYPE_EBI0] = {
1870 .flags = MEMTYPE_FLAGS_1M_ALIGN,
1871 },
1872 [MEMTYPE_EBI1] = {
1873 .flags = MEMTYPE_FLAGS_1M_ALIGN,
1874 },
1875};
1876
1877static void __init size_pmem_devices(void)
1878{
1879#ifdef CONFIG_ANDROID_PMEM
1880 android_pmem_adsp_pdata.size = pmem_adsp_size;
1881 android_pmem_pdata.size = pmem_mdp_size;
1882 android_pmem_audio_pdata.size = pmem_audio_size;
1883#endif
1884}
1885
1886static void __init reserve_memory_for(struct android_pmem_platform_data *p)
1887{
1888 msm7627a_reserve_table[p->memory_type].size += p->size;
1889}
1890
1891static void __init reserve_pmem_memory(void)
1892{
1893#ifdef CONFIG_ANDROID_PMEM
1894 reserve_memory_for(&android_pmem_adsp_pdata);
1895 reserve_memory_for(&android_pmem_pdata);
1896 reserve_memory_for(&android_pmem_audio_pdata);
1897 msm7627a_reserve_table[MEMTYPE_EBI1].size += pmem_kernel_ebi1_size;
1898#endif
1899}
1900
1901static void __init msm7627a_calculate_reserve_sizes(void)
1902{
1903 size_pmem_devices();
1904 reserve_pmem_memory();
1905}
1906
1907static int msm7627a_paddr_to_memtype(unsigned int paddr)
1908{
1909 return MEMTYPE_EBI1;
1910}
1911
1912static struct reserve_info msm7627a_reserve_info __initdata = {
1913 .memtype_reserve_table = msm7627a_reserve_table,
1914 .calculate_reserve_sizes = msm7627a_calculate_reserve_sizes,
1915 .paddr_to_memtype = msm7627a_paddr_to_memtype,
1916};
1917
1918static void __init msm7627a_reserve(void)
1919{
1920 reserve_info = &msm7627a_reserve_info;
1921 msm_reserve();
1922}
1923
1924static void __init msm_device_i2c_init(void)
1925{
1926 msm_gsbi0_qup_i2c_device.dev.platform_data = &msm_gsbi0_qup_i2c_pdata;
1927 msm_gsbi1_qup_i2c_device.dev.platform_data = &msm_gsbi1_qup_i2c_pdata;
1928}
1929
1930static struct msm_handset_platform_data hs_platform_data = {
1931 .hs_name = "7k_handset",
1932 .pwr_key_delay_ms = 500, /* 0 will disable end key */
1933};
1934
1935static struct platform_device hs_pdev = {
1936 .name = "msm-handset",
1937 .id = -1,
1938 .dev = {
1939 .platform_data = &hs_platform_data,
1940 },
1941};
1942
1943#define UART1DM_RX_GPIO 45
1944static void __init msm_qrd1_init(void)
1945{
1946 msm7x2x_misc_init();
1947 msm_device_i2c_init();
1948 msm7627a_init_mmc();
1949
1950#ifdef CONFIG_SERIAL_MSM_HS
1951 msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(UART1DM_RX_GPIO);
1952 msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata;
1953#endif
1954
1955#ifdef CONFIG_USB_MSM_OTG_72K
1956 msm_otg_pdata.swfi_latency = msm7627a_pm_data
1957 [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency;
1958 msm_device_otg.dev.platform_data = &msm_otg_pdata;
1959#endif
1960 msm_device_gadget_peripheral.dev.platform_data =
1961 &msm_gadget_pdata;
1962 platform_add_devices(qrd1_devices,
1963 ARRAY_SIZE(qrd1_devices));
1964#ifdef CONFIG_USB_EHCI_MSM_72K
1965 msm7627a_init_host();
1966#endif
1967 msm_pm_set_platform_data(msm7627a_pm_data,
1968 ARRAY_SIZE(msm7627a_pm_data));
1969
1970#if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE)
1971 i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID,
1972 bahama_devices,
1973 ARRAY_SIZE(bahama_devices));
1974 bt_power_init();
1975#endif
1976 platform_device_register(&hs_pdev);
1977
1978#ifdef CONFIG_MSM_RPC_VIBRATOR
1979 msm_init_pmic_vibrator();
1980#endif
1981}
1982
1983static void __init qrd7627a_init_early(void)
1984{
1985 msm_msm7627a_allocate_memory_regions();
1986}
1987
1988MACHINE_START(MSM7627A_QRD1, "QRD MSM7627a QRD1")
1989 .boot_params = PHYS_OFFSET + 0x100,
1990 .map_io = msm_common_io_init,
1991 .reserve = msm7627a_reserve,
1992 .init_irq = msm_init_irq,
1993 .init_machine = msm_qrd1_init,
1994 .timer = &msm_timer,
1995 .init_early = qrd7627a_init_early,
1996MACHINE_END