blob: 41fbabe93404d1851f2c7fa7fcf0acfe40d8da4d [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2010-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
14#include <linux/kernel.h>
15#include <linux/platform_device.h>
16#include <linux/regulator/machine.h>
17#include <linux/regulator/consumer.h>
18#include <mach/irqs.h>
19#include <mach/dma.h>
20#include <asm/mach/mmc.h>
21#include <asm/clkdev.h>
22#include <linux/msm_kgsl.h>
23#include <linux/msm_rotator.h>
24#include <mach/msm_hsusb.h>
25#include "footswitch.h"
26#include "clock.h"
27#include "clock-rpm.h"
28#include "clock-voter.h"
29#include "devices.h"
30#include "devices-msm8x60.h"
31#include <linux/dma-mapping.h>
32#include <linux/irq.h>
33#include <linux/clk.h>
34#include <asm/hardware/gic.h>
35#include <asm/mach-types.h>
36#include <asm/clkdev.h>
37#include <mach/msm_serial_hs_lite.h>
38#include <mach/msm_bus.h>
39#include <mach/msm_bus_board.h>
40#include <mach/socinfo.h>
41#include <mach/msm_memtypes.h>
42#include <mach/msm_tsif.h>
43#include <mach/scm-io.h>
44#ifdef CONFIG_MSM_DSPS
45#include <mach/msm_dsps.h>
46#endif
47#include <linux/android_pmem.h>
48#include <linux/gpio.h>
49#include <linux/delay.h>
50#include <mach/mdm.h>
51#include <mach/rpm.h>
52#include <mach/board.h>
53#include "rpm_stats.h"
54#include "mpm.h"
55
56/* Address of GSBI blocks */
57#define MSM_GSBI1_PHYS 0x16000000
58#define MSM_GSBI2_PHYS 0x16100000
59#define MSM_GSBI3_PHYS 0x16200000
60#define MSM_GSBI4_PHYS 0x16300000
61#define MSM_GSBI5_PHYS 0x16400000
62#define MSM_GSBI6_PHYS 0x16500000
63#define MSM_GSBI7_PHYS 0x16600000
64#define MSM_GSBI8_PHYS 0x19800000
65#define MSM_GSBI9_PHYS 0x19900000
66#define MSM_GSBI10_PHYS 0x19A00000
67#define MSM_GSBI11_PHYS 0x19B00000
68#define MSM_GSBI12_PHYS 0x19C00000
69
70/* GSBI QUPe devices */
71#define MSM_GSBI1_QUP_PHYS 0x16080000
72#define MSM_GSBI2_QUP_PHYS 0x16180000
73#define MSM_GSBI3_QUP_PHYS 0x16280000
74#define MSM_GSBI4_QUP_PHYS 0x16380000
75#define MSM_GSBI5_QUP_PHYS 0x16480000
76#define MSM_GSBI6_QUP_PHYS 0x16580000
77#define MSM_GSBI7_QUP_PHYS 0x16680000
78#define MSM_GSBI8_QUP_PHYS 0x19880000
79#define MSM_GSBI9_QUP_PHYS 0x19980000
80#define MSM_GSBI10_QUP_PHYS 0x19A80000
81#define MSM_GSBI11_QUP_PHYS 0x19B80000
82#define MSM_GSBI12_QUP_PHYS 0x19C80000
83
84/* GSBI UART devices */
85#define MSM_UART1DM_PHYS (MSM_GSBI6_PHYS + 0x40000)
86#define INT_UART1DM_IRQ GSBI6_UARTDM_IRQ
87#define INT_UART2DM_IRQ GSBI12_UARTDM_IRQ
88#define MSM_UART2DM_PHYS 0x19C40000
89#define MSM_UART3DM_PHYS (MSM_GSBI3_PHYS + 0x40000)
90#define INT_UART3DM_IRQ GSBI3_UARTDM_IRQ
91#define TCSR_BASE_PHYS 0x16b00000
92
93/* PRNG device */
94#define MSM_PRNG_PHYS 0x16C00000
95#define MSM_UART9DM_PHYS (MSM_GSBI9_PHYS + 0x40000)
96#define INT_UART9DM_IRQ GSBI9_UARTDM_IRQ
97
98static void charm_ap2mdm_kpdpwr_on(void)
99{
100 gpio_direction_output(AP2MDM_PMIC_RESET_N, 0);
Laura Abbotteda23372011-08-17 09:25:56 -0700101 gpio_direction_output(AP2MDM_KPDPWR_N, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700102}
103
104static void charm_ap2mdm_kpdpwr_off(void)
105{
106 int i;
107
108 gpio_direction_output(AP2MDM_ERRFATAL, 1);
109
110 for (i = 20; i > 0; i--) {
111 if (gpio_get_value(MDM2AP_STATUS) == 0)
112 break;
113 msleep(100);
114 }
115 gpio_direction_output(AP2MDM_ERRFATAL, 0);
116
117 if (i == 0) {
118 pr_err("%s: MDM2AP_STATUS never went low. Doing a hard reset \
119 of the charm modem.\n", __func__);
120 gpio_direction_output(AP2MDM_PMIC_RESET_N, 1);
121 /*
122 * Currently, there is a debounce timer on the charm PMIC. It is
123 * necessary to hold the AP2MDM_PMIC_RESET low for ~3.5 seconds
124 * for the reset to fully take place. Sleep here to ensure the
125 * reset has occured before the function exits.
126 */
127 msleep(4000);
128 gpio_direction_output(AP2MDM_PMIC_RESET_N, 0);
129 }
130}
131
132static struct resource charm_resources[] = {
133 /* MDM2AP_ERRFATAL */
134 {
135 .start = MSM_GPIO_TO_INT(MDM2AP_ERRFATAL),
136 .end = MSM_GPIO_TO_INT(MDM2AP_ERRFATAL),
137 .flags = IORESOURCE_IRQ,
138 },
139 /* MDM2AP_STATUS */
140 {
141 .start = MSM_GPIO_TO_INT(MDM2AP_STATUS),
142 .end = MSM_GPIO_TO_INT(MDM2AP_STATUS),
143 .flags = IORESOURCE_IRQ,
144 }
145};
146
147static struct charm_platform_data mdm_platform_data = {
148 .charm_modem_on = charm_ap2mdm_kpdpwr_on,
149 .charm_modem_off = charm_ap2mdm_kpdpwr_off,
150};
151
152struct platform_device msm_charm_modem = {
153 .name = "charm_modem",
154 .id = -1,
155 .num_resources = ARRAY_SIZE(charm_resources),
156 .resource = charm_resources,
157 .dev = {
158 .platform_data = &mdm_platform_data,
159 },
160};
161
162#ifdef CONFIG_MSM_DSPS
163#define GSBI12_DEV (&msm_dsps_device.dev)
164#else
165#define GSBI12_DEV (&msm_gsbi12_qup_i2c_device.dev)
166#endif
167
168void __init msm8x60_init_irq(void)
169{
170 unsigned int i;
171
172 msm_mpm_irq_extn_init();
173 gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE, (void *)MSM_QGIC_CPU_BASE);
174
175 /* Edge trigger PPIs except AVS_SVICINT and AVS_SVICINTSWDONE */
176 writel(0xFFFFD7FF, MSM_QGIC_DIST_BASE + GIC_DIST_CONFIG + 4);
177
178 /* FIXME: Not installing AVS_SVICINT and AVS_SVICINTSWDONE yet
179 * as they are configured as level, which does not play nice with
180 * handle_percpu_irq.
181 */
182 for (i = GIC_PPI_START; i < GIC_SPI_START; i++) {
183 if (i != AVS_SVICINT && i != AVS_SVICINTSWDONE)
184 irq_set_handler(i, handle_percpu_irq);
185 }
186}
187
188static struct resource msm_uart1_dm_resources[] = {
189 {
190 .start = MSM_UART1DM_PHYS,
191 .end = MSM_UART1DM_PHYS + PAGE_SIZE - 1,
192 .flags = IORESOURCE_MEM,
193 },
194 {
195 .start = INT_UART1DM_IRQ,
196 .end = INT_UART1DM_IRQ,
197 .flags = IORESOURCE_IRQ,
198 },
199 {
200 /* GSBI6 is UARTDM1 */
201 .start = MSM_GSBI6_PHYS,
202 .end = MSM_GSBI6_PHYS + 4 - 1,
203 .name = "gsbi_resource",
204 .flags = IORESOURCE_MEM,
205 },
206 {
207 .start = DMOV_HSUART1_TX_CHAN,
208 .end = DMOV_HSUART1_RX_CHAN,
209 .name = "uartdm_channels",
210 .flags = IORESOURCE_DMA,
211 },
212 {
213 .start = DMOV_HSUART1_TX_CRCI,
214 .end = DMOV_HSUART1_RX_CRCI,
215 .name = "uartdm_crci",
216 .flags = IORESOURCE_DMA,
217 },
218};
219
220static u64 msm_uart_dm1_dma_mask = DMA_BIT_MASK(32);
221
222struct platform_device msm_device_uart_dm1 = {
223 .name = "msm_serial_hs",
224 .id = 0,
225 .num_resources = ARRAY_SIZE(msm_uart1_dm_resources),
226 .resource = msm_uart1_dm_resources,
227 .dev = {
228 .dma_mask = &msm_uart_dm1_dma_mask,
229 .coherent_dma_mask = DMA_BIT_MASK(32),
230 },
231};
232
233static struct resource msm_uart3_dm_resources[] = {
234 {
235 .start = MSM_UART3DM_PHYS,
236 .end = MSM_UART3DM_PHYS + PAGE_SIZE - 1,
237 .name = "uartdm_resource",
238 .flags = IORESOURCE_MEM,
239 },
240 {
241 .start = INT_UART3DM_IRQ,
242 .end = INT_UART3DM_IRQ,
243 .flags = IORESOURCE_IRQ,
244 },
245 {
246 .start = MSM_GSBI3_PHYS,
247 .end = MSM_GSBI3_PHYS + PAGE_SIZE - 1,
248 .name = "gsbi_resource",
249 .flags = IORESOURCE_MEM,
250 },
251};
252
253struct platform_device msm_device_uart_dm3 = {
254 .name = "msm_serial_hsl",
255 .id = 2,
256 .num_resources = ARRAY_SIZE(msm_uart3_dm_resources),
257 .resource = msm_uart3_dm_resources,
258};
259
260static struct resource msm_uart12_dm_resources[] = {
261 {
262 .start = MSM_UART2DM_PHYS,
263 .end = MSM_UART2DM_PHYS + PAGE_SIZE - 1,
264 .name = "uartdm_resource",
265 .flags = IORESOURCE_MEM,
266 },
267 {
268 .start = INT_UART2DM_IRQ,
269 .end = INT_UART2DM_IRQ,
270 .flags = IORESOURCE_IRQ,
271 },
272 {
273 /* GSBI 12 is UARTDM2 */
274 .start = MSM_GSBI12_PHYS,
275 .end = MSM_GSBI12_PHYS + PAGE_SIZE - 1,
276 .name = "gsbi_resource",
277 .flags = IORESOURCE_MEM,
278 },
279};
280
281struct platform_device msm_device_uart_dm12 = {
282 .name = "msm_serial_hsl",
283 .id = 0,
284 .num_resources = ARRAY_SIZE(msm_uart12_dm_resources),
285 .resource = msm_uart12_dm_resources,
286};
287
288#ifdef CONFIG_MSM_GSBI9_UART
289static struct msm_serial_hslite_platform_data uart_gsbi9_pdata = {
290 .config_gpio = 1,
291 .uart_tx_gpio = 67,
292 .uart_rx_gpio = 66,
293};
294
295static struct resource msm_uart_gsbi9_resources[] = {
296 {
297 .start = MSM_UART9DM_PHYS,
298 .end = MSM_UART9DM_PHYS + PAGE_SIZE - 1,
299 .name = "uartdm_resource",
300 .flags = IORESOURCE_MEM,
301 },
302 {
303 .start = INT_UART9DM_IRQ,
304 .end = INT_UART9DM_IRQ,
305 .flags = IORESOURCE_IRQ,
306 },
307 {
308 /* GSBI 9 is UART_GSBI9 */
309 .start = MSM_GSBI9_PHYS,
310 .end = MSM_GSBI9_PHYS + PAGE_SIZE - 1,
311 .name = "gsbi_resource",
312 .flags = IORESOURCE_MEM,
313 },
314};
315struct platform_device *msm_device_uart_gsbi9;
316struct platform_device *msm_add_gsbi9_uart(void)
317{
318 return platform_device_register_resndata(NULL, "msm_serial_hsl",
319 1, msm_uart_gsbi9_resources,
320 ARRAY_SIZE(msm_uart_gsbi9_resources),
321 &uart_gsbi9_pdata,
322 sizeof(uart_gsbi9_pdata));
323}
324#endif
325
326static struct resource gsbi3_qup_i2c_resources[] = {
327 {
328 .name = "qup_phys_addr",
329 .start = MSM_GSBI3_QUP_PHYS,
330 .end = MSM_GSBI3_QUP_PHYS + SZ_4K - 1,
331 .flags = IORESOURCE_MEM,
332 },
333 {
334 .name = "gsbi_qup_i2c_addr",
335 .start = MSM_GSBI3_PHYS,
336 .end = MSM_GSBI3_PHYS + 4 - 1,
337 .flags = IORESOURCE_MEM,
338 },
339 {
340 .name = "qup_err_intr",
341 .start = GSBI3_QUP_IRQ,
342 .end = GSBI3_QUP_IRQ,
343 .flags = IORESOURCE_IRQ,
344 },
345 {
346 .name = "i2c_clk",
347 .start = 44,
348 .end = 44,
349 .flags = IORESOURCE_IO,
350 },
351 {
352 .name = "i2c_sda",
353 .start = 43,
354 .end = 43,
355 .flags = IORESOURCE_IO,
356 },
357};
358
359static struct resource gsbi4_qup_i2c_resources[] = {
360 {
361 .name = "qup_phys_addr",
362 .start = MSM_GSBI4_QUP_PHYS,
363 .end = MSM_GSBI4_QUP_PHYS + SZ_4K - 1,
364 .flags = IORESOURCE_MEM,
365 },
366 {
367 .name = "gsbi_qup_i2c_addr",
368 .start = MSM_GSBI4_PHYS,
369 .end = MSM_GSBI4_PHYS + 4 - 1,
370 .flags = IORESOURCE_MEM,
371 },
372 {
373 .name = "qup_err_intr",
374 .start = GSBI4_QUP_IRQ,
375 .end = GSBI4_QUP_IRQ,
376 .flags = IORESOURCE_IRQ,
377 },
378};
379
380static struct resource gsbi7_qup_i2c_resources[] = {
381 {
382 .name = "qup_phys_addr",
383 .start = MSM_GSBI7_QUP_PHYS,
384 .end = MSM_GSBI7_QUP_PHYS + SZ_4K - 1,
385 .flags = IORESOURCE_MEM,
386 },
387 {
388 .name = "gsbi_qup_i2c_addr",
389 .start = MSM_GSBI7_PHYS,
390 .end = MSM_GSBI7_PHYS + 4 - 1,
391 .flags = IORESOURCE_MEM,
392 },
393 {
394 .name = "qup_err_intr",
395 .start = GSBI7_QUP_IRQ,
396 .end = GSBI7_QUP_IRQ,
397 .flags = IORESOURCE_IRQ,
398 },
399 {
400 .name = "i2c_clk",
401 .start = 60,
402 .end = 60,
403 .flags = IORESOURCE_IO,
404 },
405 {
406 .name = "i2c_sda",
407 .start = 59,
408 .end = 59,
409 .flags = IORESOURCE_IO,
410 },
411};
412
413static struct resource gsbi8_qup_i2c_resources[] = {
414 {
415 .name = "qup_phys_addr",
416 .start = MSM_GSBI8_QUP_PHYS,
417 .end = MSM_GSBI8_QUP_PHYS + SZ_4K - 1,
418 .flags = IORESOURCE_MEM,
419 },
420 {
421 .name = "gsbi_qup_i2c_addr",
422 .start = MSM_GSBI8_PHYS,
423 .end = MSM_GSBI8_PHYS + 4 - 1,
424 .flags = IORESOURCE_MEM,
425 },
426 {
427 .name = "qup_err_intr",
428 .start = GSBI8_QUP_IRQ,
429 .end = GSBI8_QUP_IRQ,
430 .flags = IORESOURCE_IRQ,
431 },
432};
433
434static struct resource gsbi9_qup_i2c_resources[] = {
435 {
436 .name = "qup_phys_addr",
437 .start = MSM_GSBI9_QUP_PHYS,
438 .end = MSM_GSBI9_QUP_PHYS + SZ_4K - 1,
439 .flags = IORESOURCE_MEM,
440 },
441 {
442 .name = "gsbi_qup_i2c_addr",
443 .start = MSM_GSBI9_PHYS,
444 .end = MSM_GSBI9_PHYS + 4 - 1,
445 .flags = IORESOURCE_MEM,
446 },
447 {
448 .name = "qup_err_intr",
449 .start = GSBI9_QUP_IRQ,
450 .end = GSBI9_QUP_IRQ,
451 .flags = IORESOURCE_IRQ,
452 },
453};
454
455static struct resource gsbi12_qup_i2c_resources[] = {
456 {
457 .name = "qup_phys_addr",
458 .start = MSM_GSBI12_QUP_PHYS,
459 .end = MSM_GSBI12_QUP_PHYS + SZ_4K - 1,
460 .flags = IORESOURCE_MEM,
461 },
462 {
463 .name = "gsbi_qup_i2c_addr",
464 .start = MSM_GSBI12_PHYS,
465 .end = MSM_GSBI12_PHYS + 4 - 1,
466 .flags = IORESOURCE_MEM,
467 },
468 {
469 .name = "qup_err_intr",
470 .start = GSBI12_QUP_IRQ,
471 .end = GSBI12_QUP_IRQ,
472 .flags = IORESOURCE_IRQ,
473 },
474};
475
476#ifdef CONFIG_MSM_BUS_SCALING
477static struct msm_bus_vectors grp3d_init_vectors[] = {
478 {
479 .src = MSM_BUS_MASTER_GRAPHICS_3D,
480 .dst = MSM_BUS_SLAVE_EBI_CH0,
481 .ab = 0,
482 .ib = 0,
483 },
484};
485
486static struct msm_bus_vectors grp3d_nominal_low_vectors[] = {
487 {
488 .src = MSM_BUS_MASTER_GRAPHICS_3D,
489 .dst = MSM_BUS_SLAVE_EBI_CH0,
490 .ab = 0,
491 .ib = 1300000000U,
492 },
493};
494
495static struct msm_bus_vectors grp3d_nominal_high_vectors[] = {
496 {
497 .src = MSM_BUS_MASTER_GRAPHICS_3D,
498 .dst = MSM_BUS_SLAVE_EBI_CH0,
499 .ab = 0,
500 .ib = 2008000000U,
501 },
502};
503
504static struct msm_bus_vectors grp3d_max_vectors[] = {
505 {
506 .src = MSM_BUS_MASTER_GRAPHICS_3D,
507 .dst = MSM_BUS_SLAVE_EBI_CH0,
508 .ab = 0,
509 .ib = 2484000000U,
510 },
511};
512
513static struct msm_bus_paths grp3d_bus_scale_usecases[] = {
514 {
515 ARRAY_SIZE(grp3d_init_vectors),
516 grp3d_init_vectors,
517 },
518 {
519 ARRAY_SIZE(grp3d_nominal_low_vectors),
520 grp3d_nominal_low_vectors,
521 },
522 {
523 ARRAY_SIZE(grp3d_nominal_high_vectors),
524 grp3d_nominal_high_vectors,
525 },
526 {
527 ARRAY_SIZE(grp3d_max_vectors),
528 grp3d_max_vectors,
529 },
530};
531
532static struct msm_bus_scale_pdata grp3d_bus_scale_pdata = {
533 grp3d_bus_scale_usecases,
534 ARRAY_SIZE(grp3d_bus_scale_usecases),
535 .name = "grp3d",
536};
537
538static struct msm_bus_vectors grp2d0_init_vectors[] = {
539 {
540 .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE0,
541 .dst = MSM_BUS_SLAVE_EBI_CH0,
542 .ab = 0,
543 .ib = 0,
544 },
545};
546
547static struct msm_bus_vectors grp2d0_max_vectors[] = {
548 {
549 .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE0,
550 .dst = MSM_BUS_SLAVE_EBI_CH0,
551 .ab = 0,
552 .ib = 1300000000U,
553 },
554};
555
556static struct msm_bus_paths grp2d0_bus_scale_usecases[] = {
557 {
558 ARRAY_SIZE(grp2d0_init_vectors),
559 grp2d0_init_vectors,
560 },
561 {
562 ARRAY_SIZE(grp2d0_max_vectors),
563 grp2d0_max_vectors,
564 },
565};
566
567static struct msm_bus_scale_pdata grp2d0_bus_scale_pdata = {
568 grp2d0_bus_scale_usecases,
569 ARRAY_SIZE(grp2d0_bus_scale_usecases),
570 .name = "grp2d0",
571};
572
573static struct msm_bus_vectors grp2d1_init_vectors[] = {
574 {
575 .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE1,
576 .dst = MSM_BUS_SLAVE_EBI_CH0,
577 .ab = 0,
578 .ib = 0,
579 },
580};
581
582static struct msm_bus_vectors grp2d1_max_vectors[] = {
583 {
584 .src = MSM_BUS_MASTER_GRAPHICS_2D_CORE1,
585 .dst = MSM_BUS_SLAVE_EBI_CH0,
586 .ab = 0,
587 .ib = 1300000000U,
588 },
589};
590
591static struct msm_bus_paths grp2d1_bus_scale_usecases[] = {
592 {
593 ARRAY_SIZE(grp2d1_init_vectors),
594 grp2d1_init_vectors,
595 },
596 {
597 ARRAY_SIZE(grp2d1_max_vectors),
598 grp2d1_max_vectors,
599 },
600};
601
602static struct msm_bus_scale_pdata grp2d1_bus_scale_pdata = {
603 grp2d1_bus_scale_usecases,
604 ARRAY_SIZE(grp2d1_bus_scale_usecases),
605 .name = "grp2d1",
606};
607#endif
608
609#ifdef CONFIG_HW_RANDOM_MSM
610static struct resource rng_resources = {
611 .flags = IORESOURCE_MEM,
612 .start = MSM_PRNG_PHYS,
613 .end = MSM_PRNG_PHYS + SZ_512 - 1,
614};
615
616struct platform_device msm_device_rng = {
617 .name = "msm_rng",
618 .id = 0,
619 .num_resources = 1,
620 .resource = &rng_resources,
621};
622#endif
623
624static struct resource kgsl_3d0_resources[] = {
625 {
626 .name = KGSL_3D0_REG_MEMORY,
627 .start = 0x04300000, /* GFX3D address */
628 .end = 0x0431ffff,
629 .flags = IORESOURCE_MEM,
630 },
631 {
632 .name = KGSL_3D0_IRQ,
633 .start = GFX3D_IRQ,
634 .end = GFX3D_IRQ,
635 .flags = IORESOURCE_IRQ,
636 },
637};
638
639static struct kgsl_device_platform_data kgsl_3d0_pdata = {
640 .pwr_data = {
641 .pwrlevel = {
642 {
643 .gpu_freq = 266667000,
644 .bus_freq = 3,
645 },
646 {
647 .gpu_freq = 228571000,
648 .bus_freq = 2,
649 },
650 {
651 .gpu_freq = 200000000,
652 .bus_freq = 1,
653 },
654 {
655 .gpu_freq = 27000000,
656 .bus_freq = 0,
657 },
658 },
659 .init_level = 0,
660 .num_levels = 4,
661 .set_grp_async = NULL,
662 .idle_timeout = HZ/5,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700663 .nap_allowed = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700664 },
665 .clk = {
666 .name = {
667 .clk = "gfx3d_clk",
668 .pclk = "gfx3d_pclk",
669 },
670#ifdef CONFIG_MSM_BUS_SCALING
671 .bus_scale_table = &grp3d_bus_scale_pdata,
672#endif
673 },
674 .imem_clk_name = {
675 .clk = NULL,
676 .pclk = "imem_pclk",
677 },
678};
679
680struct platform_device msm_kgsl_3d0 = {
681 .name = "kgsl-3d0",
682 .id = 0,
683 .num_resources = ARRAY_SIZE(kgsl_3d0_resources),
684 .resource = kgsl_3d0_resources,
685 .dev = {
686 .platform_data = &kgsl_3d0_pdata,
687 },
688};
689
690static struct resource kgsl_2d0_resources[] = {
691 {
692 .name = KGSL_2D0_REG_MEMORY,
693 .start = 0x04100000, /* Z180 base address */
694 .end = 0x04100FFF,
695 .flags = IORESOURCE_MEM,
696 },
697 {
698 .name = KGSL_2D0_IRQ,
699 .start = GFX2D0_IRQ,
700 .end = GFX2D0_IRQ,
701 .flags = IORESOURCE_IRQ,
702 },
703};
704
705static struct kgsl_device_platform_data kgsl_2d0_pdata = {
706 .pwr_data = {
707 .pwrlevel = {
708 {
709 .gpu_freq = 200000000,
710 .bus_freq = 1,
711 },
712 {
713 .gpu_freq = 200000000,
714 .bus_freq = 0,
715 },
716 },
717 .init_level = 0,
718 .num_levels = 2,
719 .set_grp_async = NULL,
720 .idle_timeout = HZ/10,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700721 .nap_allowed = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700722 },
723 .clk = {
724 .name = {
725 /* note: 2d clocks disabled on v1 */
726 .clk = "gfx2d0_clk",
727 .pclk = "gfx2d0_pclk",
728 },
729#ifdef CONFIG_MSM_BUS_SCALING
730 .bus_scale_table = &grp2d0_bus_scale_pdata,
731#endif
732 },
733};
734
735struct platform_device msm_kgsl_2d0 = {
736 .name = "kgsl-2d0",
737 .id = 0,
738 .num_resources = ARRAY_SIZE(kgsl_2d0_resources),
739 .resource = kgsl_2d0_resources,
740 .dev = {
741 .platform_data = &kgsl_2d0_pdata,
742 },
743};
744
745static struct resource kgsl_2d1_resources[] = {
746 {
747 .name = KGSL_2D1_REG_MEMORY,
748 .start = 0x04200000, /* Z180 device 1 base address */
749 .end = 0x04200FFF,
750 .flags = IORESOURCE_MEM,
751 },
752 {
753 .name = KGSL_2D1_IRQ,
754 .start = GFX2D1_IRQ,
755 .end = GFX2D1_IRQ,
756 .flags = IORESOURCE_IRQ,
757 },
758};
759
760static struct kgsl_device_platform_data kgsl_2d1_pdata = {
761 .pwr_data = {
762 .pwrlevel = {
763 {
764 .gpu_freq = 200000000,
765 .bus_freq = 1,
766 },
767 {
768 .gpu_freq = 200000000,
769 .bus_freq = 0,
770 },
771 },
772 .init_level = 0,
773 .num_levels = 2,
774 .set_grp_async = NULL,
775 .idle_timeout = HZ/10,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700776 .nap_allowed = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700777 },
778 .clk = {
779 .name = {
780 .clk = "gfx2d1_clk",
781 .pclk = "gfx2d1_pclk",
782 },
783#ifdef CONFIG_MSM_BUS_SCALING
784 .bus_scale_table = &grp2d1_bus_scale_pdata,
785#endif
786 },
787};
788
789struct platform_device msm_kgsl_2d1 = {
790 .name = "kgsl-2d1",
791 .id = 1,
792 .num_resources = ARRAY_SIZE(kgsl_2d1_resources),
793 .resource = kgsl_2d1_resources,
794 .dev = {
795 .platform_data = &kgsl_2d1_pdata,
796 },
797};
798
799/*
800 * this a software workaround for not having two distinct board
801 * files for 8660v1 and 8660v2. 8660v1 has a faulty 2d clock, and
802 * this workaround detects the cpu version to tell if the kernel is on a
803 * 8660v1, and should disable the 2d core. it is called from the board file
804 */
805void __init msm8x60_check_2d_hardware(void)
806{
807 if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 1) &&
808 (SOCINFO_VERSION_MINOR(socinfo_get_version()) == 0)) {
809 printk(KERN_WARNING "kgsl: 2D cores disabled on 8660v1\n");
810 kgsl_2d0_pdata.clk.name.clk = NULL;
811 kgsl_2d1_pdata.clk.name.clk = NULL;
812 }
813}
814
815/* Use GSBI3 QUP for /dev/i2c-0 */
816struct platform_device msm_gsbi3_qup_i2c_device = {
817 .name = "qup_i2c",
818 .id = MSM_GSBI3_QUP_I2C_BUS_ID,
819 .num_resources = ARRAY_SIZE(gsbi3_qup_i2c_resources),
820 .resource = gsbi3_qup_i2c_resources,
821};
822
823/* Use GSBI4 QUP for /dev/i2c-1 */
824struct platform_device msm_gsbi4_qup_i2c_device = {
825 .name = "qup_i2c",
826 .id = MSM_GSBI4_QUP_I2C_BUS_ID,
827 .num_resources = ARRAY_SIZE(gsbi4_qup_i2c_resources),
828 .resource = gsbi4_qup_i2c_resources,
829};
830
831/* Use GSBI8 QUP for /dev/i2c-3 */
832struct platform_device msm_gsbi8_qup_i2c_device = {
833 .name = "qup_i2c",
834 .id = MSM_GSBI8_QUP_I2C_BUS_ID,
835 .num_resources = ARRAY_SIZE(gsbi8_qup_i2c_resources),
836 .resource = gsbi8_qup_i2c_resources,
837};
838
839/* Use GSBI9 QUP for /dev/i2c-2 */
840struct platform_device msm_gsbi9_qup_i2c_device = {
841 .name = "qup_i2c",
842 .id = MSM_GSBI9_QUP_I2C_BUS_ID,
843 .num_resources = ARRAY_SIZE(gsbi9_qup_i2c_resources),
844 .resource = gsbi9_qup_i2c_resources,
845};
846
847/* Use GSBI7 QUP for /dev/i2c-4 (Marimba) */
848struct platform_device msm_gsbi7_qup_i2c_device = {
849 .name = "qup_i2c",
850 .id = MSM_GSBI7_QUP_I2C_BUS_ID,
851 .num_resources = ARRAY_SIZE(gsbi7_qup_i2c_resources),
852 .resource = gsbi7_qup_i2c_resources,
853};
854
855/* Use GSBI12 QUP for /dev/i2c-5 (Sensors) */
856struct platform_device msm_gsbi12_qup_i2c_device = {
857 .name = "qup_i2c",
858 .id = MSM_GSBI12_QUP_I2C_BUS_ID,
859 .num_resources = ARRAY_SIZE(gsbi12_qup_i2c_resources),
860 .resource = gsbi12_qup_i2c_resources,
861};
862
863#ifdef CONFIG_I2C_SSBI
864/* 8058 PMIC SSBI on /dev/i2c-6 */
865#define MSM_SSBI1_PMIC1C_PHYS 0x00500000
866static struct resource msm_ssbi1_resources[] = {
867 {
868 .name = "ssbi_base",
869 .start = MSM_SSBI1_PMIC1C_PHYS,
870 .end = MSM_SSBI1_PMIC1C_PHYS + SZ_4K - 1,
871 .flags = IORESOURCE_MEM,
872 },
873};
874
875struct platform_device msm_device_ssbi1 = {
876 .name = "i2c_ssbi",
877 .id = MSM_SSBI1_I2C_BUS_ID,
878 .num_resources = ARRAY_SIZE(msm_ssbi1_resources),
879 .resource = msm_ssbi1_resources,
880};
881
882/* 8901 PMIC SSBI on /dev/i2c-7 */
883#define MSM_SSBI2_PMIC2B_PHYS 0x00C00000
884static struct resource msm_ssbi2_resources[] = {
885 {
886 .name = "ssbi_base",
887 .start = MSM_SSBI2_PMIC2B_PHYS,
888 .end = MSM_SSBI2_PMIC2B_PHYS + SZ_4K - 1,
889 .flags = IORESOURCE_MEM,
890 },
891};
892
893struct platform_device msm_device_ssbi2 = {
894 .name = "i2c_ssbi",
895 .id = MSM_SSBI2_I2C_BUS_ID,
896 .num_resources = ARRAY_SIZE(msm_ssbi2_resources),
897 .resource = msm_ssbi2_resources,
898};
899
900/* CODEC SSBI on /dev/i2c-8 */
901#define MSM_SSBI3_PHYS 0x18700000
902static struct resource msm_ssbi3_resources[] = {
903 {
904 .name = "ssbi_base",
905 .start = MSM_SSBI3_PHYS,
906 .end = MSM_SSBI3_PHYS + SZ_4K - 1,
907 .flags = IORESOURCE_MEM,
908 },
909};
910
911struct platform_device msm_device_ssbi3 = {
912 .name = "i2c_ssbi",
913 .id = MSM_SSBI3_I2C_BUS_ID,
914 .num_resources = ARRAY_SIZE(msm_ssbi3_resources),
915 .resource = msm_ssbi3_resources,
916};
917#endif /* CONFIG_I2C_SSBI */
918
919static struct resource gsbi1_qup_spi_resources[] = {
920 {
921 .name = "spi_base",
922 .start = MSM_GSBI1_QUP_PHYS,
923 .end = MSM_GSBI1_QUP_PHYS + SZ_4K - 1,
924 .flags = IORESOURCE_MEM,
925 },
926 {
927 .name = "gsbi_base",
928 .start = MSM_GSBI1_PHYS,
929 .end = MSM_GSBI1_PHYS + 4 - 1,
930 .flags = IORESOURCE_MEM,
931 },
932 {
933 .name = "spi_irq_in",
934 .start = GSBI1_QUP_IRQ,
935 .end = GSBI1_QUP_IRQ,
936 .flags = IORESOURCE_IRQ,
937 },
938 {
939 .name = "spidm_channels",
940 .start = 5,
941 .end = 6,
942 .flags = IORESOURCE_DMA,
943 },
944 {
945 .name = "spidm_crci",
946 .start = 8,
947 .end = 7,
948 .flags = IORESOURCE_DMA,
949 },
950 {
951 .name = "spi_clk",
952 .start = 36,
953 .end = 36,
954 .flags = IORESOURCE_IO,
955 },
956 {
957 .name = "spi_cs",
958 .start = 35,
959 .end = 35,
960 .flags = IORESOURCE_IO,
961 },
962 {
963 .name = "spi_miso",
964 .start = 34,
965 .end = 34,
966 .flags = IORESOURCE_IO,
967 },
968 {
969 .name = "spi_mosi",
970 .start = 33,
971 .end = 33,
972 .flags = IORESOURCE_IO,
973 },
974};
975
976/* Use GSBI1 QUP for SPI-0 */
977struct platform_device msm_gsbi1_qup_spi_device = {
978 .name = "spi_qsd",
979 .id = 0,
980 .num_resources = ARRAY_SIZE(gsbi1_qup_spi_resources),
981 .resource = gsbi1_qup_spi_resources,
982};
983
984
985static struct resource gsbi10_qup_spi_resources[] = {
986 {
987 .name = "spi_base",
988 .start = MSM_GSBI10_QUP_PHYS,
989 .end = MSM_GSBI10_QUP_PHYS + SZ_4K - 1,
990 .flags = IORESOURCE_MEM,
991 },
992 {
993 .name = "gsbi_base",
994 .start = MSM_GSBI10_PHYS,
995 .end = MSM_GSBI10_PHYS + 4 - 1,
996 .flags = IORESOURCE_MEM,
997 },
998 {
999 .name = "spi_irq_in",
1000 .start = GSBI10_QUP_IRQ,
1001 .end = GSBI10_QUP_IRQ,
1002 .flags = IORESOURCE_IRQ,
1003 },
1004 {
1005 .name = "spi_clk",
1006 .start = 73,
1007 .end = 73,
1008 .flags = IORESOURCE_IO,
1009 },
1010 {
1011 .name = "spi_cs",
1012 .start = 72,
1013 .end = 72,
1014 .flags = IORESOURCE_IO,
1015 },
1016 {
1017 .name = "spi_mosi",
1018 .start = 70,
1019 .end = 70,
1020 .flags = IORESOURCE_IO,
1021 },
1022};
1023
1024/* Use GSBI10 QUP for SPI-1 */
1025struct platform_device msm_gsbi10_qup_spi_device = {
1026 .name = "spi_qsd",
1027 .id = 1,
1028 .num_resources = ARRAY_SIZE(gsbi10_qup_spi_resources),
1029 .resource = gsbi10_qup_spi_resources,
1030};
1031#define MSM_SDC1_BASE 0x12400000
1032#define MSM_SDC1_DML_BASE (MSM_SDC1_BASE + 0x800)
1033#define MSM_SDC1_BAM_BASE (MSM_SDC1_BASE + 0x2000)
1034#define MSM_SDC2_BASE 0x12140000
1035#define MSM_SDC2_DML_BASE (MSM_SDC2_BASE + 0x800)
1036#define MSM_SDC2_BAM_BASE (MSM_SDC2_BASE + 0x2000)
1037#define MSM_SDC3_BASE 0x12180000
1038#define MSM_SDC3_DML_BASE (MSM_SDC3_BASE + 0x800)
1039#define MSM_SDC3_BAM_BASE (MSM_SDC3_BASE + 0x2000)
1040#define MSM_SDC4_BASE 0x121C0000
1041#define MSM_SDC4_DML_BASE (MSM_SDC4_BASE + 0x800)
1042#define MSM_SDC4_BAM_BASE (MSM_SDC4_BASE + 0x2000)
1043#define MSM_SDC5_BASE 0x12200000
1044#define MSM_SDC5_DML_BASE (MSM_SDC5_BASE + 0x800)
1045#define MSM_SDC5_BAM_BASE (MSM_SDC5_BASE + 0x2000)
1046
1047static struct resource resources_sdc1[] = {
1048 {
1049 .start = MSM_SDC1_BASE,
1050 .end = MSM_SDC1_DML_BASE - 1,
1051 .flags = IORESOURCE_MEM,
1052 },
1053 {
1054 .start = SDC1_IRQ_0,
1055 .end = SDC1_IRQ_0,
1056 .flags = IORESOURCE_IRQ,
1057 },
1058#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1059 {
1060 .name = "sdcc_dml_addr",
1061 .start = MSM_SDC1_DML_BASE,
1062 .end = MSM_SDC1_BAM_BASE - 1,
1063 .flags = IORESOURCE_MEM,
1064 },
1065 {
1066 .name = "sdcc_bam_addr",
1067 .start = MSM_SDC1_BAM_BASE,
1068 .end = MSM_SDC1_BAM_BASE + (2 * SZ_4K) - 1,
1069 .flags = IORESOURCE_MEM,
1070 },
1071 {
1072 .name = "sdcc_bam_irq",
1073 .start = SDC1_BAM_IRQ,
1074 .end = SDC1_BAM_IRQ,
1075 .flags = IORESOURCE_IRQ,
1076 },
1077#else
1078 {
Krishna Konda25786ec2011-07-25 16:21:36 -07001079 .name = "sdcc_dma_chnl",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001080 .start = DMOV_SDC1_CHAN,
1081 .end = DMOV_SDC1_CHAN,
1082 .flags = IORESOURCE_DMA,
1083 },
Krishna Konda25786ec2011-07-25 16:21:36 -07001084 {
1085 .name = "sdcc_dma_crci",
1086 .start = DMOV_SDC1_CRCI,
1087 .end = DMOV_SDC1_CRCI,
1088 .flags = IORESOURCE_DMA,
1089 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001090#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1091};
1092
1093static struct resource resources_sdc2[] = {
1094 {
1095 .start = MSM_SDC2_BASE,
1096 .end = MSM_SDC2_DML_BASE - 1,
1097 .flags = IORESOURCE_MEM,
1098 },
1099 {
1100 .start = SDC2_IRQ_0,
1101 .end = SDC2_IRQ_0,
1102 .flags = IORESOURCE_IRQ,
1103 },
1104#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1105 {
1106 .name = "sdcc_dml_addr",
1107 .start = MSM_SDC2_DML_BASE,
1108 .end = MSM_SDC2_BAM_BASE - 1,
1109 .flags = IORESOURCE_MEM,
1110 },
1111 {
1112 .name = "sdcc_bam_addr",
1113 .start = MSM_SDC2_BAM_BASE,
1114 .end = MSM_SDC2_BAM_BASE + (2 * SZ_4K) - 1,
1115 .flags = IORESOURCE_MEM,
1116 },
1117 {
1118 .name = "sdcc_bam_irq",
1119 .start = SDC2_BAM_IRQ,
1120 .end = SDC2_BAM_IRQ,
1121 .flags = IORESOURCE_IRQ,
1122 },
1123#else
1124 {
Krishna Konda25786ec2011-07-25 16:21:36 -07001125 .name = "sdcc_dma_chnl",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001126 .start = DMOV_SDC2_CHAN,
1127 .end = DMOV_SDC2_CHAN,
1128 .flags = IORESOURCE_DMA,
1129 },
Krishna Konda25786ec2011-07-25 16:21:36 -07001130 {
1131 .name = "sdcc_dma_crci",
1132 .start = DMOV_SDC2_CRCI,
1133 .end = DMOV_SDC2_CRCI,
1134 .flags = IORESOURCE_DMA,
1135 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001136#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1137};
1138
1139static struct resource resources_sdc3[] = {
1140 {
1141 .start = MSM_SDC3_BASE,
1142 .end = MSM_SDC3_DML_BASE - 1,
1143 .flags = IORESOURCE_MEM,
1144 },
1145 {
1146 .start = SDC3_IRQ_0,
1147 .end = SDC3_IRQ_0,
1148 .flags = IORESOURCE_IRQ,
1149 },
1150#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1151 {
1152 .name = "sdcc_dml_addr",
1153 .start = MSM_SDC3_DML_BASE,
1154 .end = MSM_SDC3_BAM_BASE - 1,
1155 .flags = IORESOURCE_MEM,
1156 },
1157 {
1158 .name = "sdcc_bam_addr",
1159 .start = MSM_SDC3_BAM_BASE,
1160 .end = MSM_SDC3_BAM_BASE + (2 * SZ_4K) - 1,
1161 .flags = IORESOURCE_MEM,
1162 },
1163 {
1164 .name = "sdcc_bam_irq",
1165 .start = SDC3_BAM_IRQ,
1166 .end = SDC3_BAM_IRQ,
1167 .flags = IORESOURCE_IRQ,
1168 },
1169#else
1170 {
Krishna Konda25786ec2011-07-25 16:21:36 -07001171 .name = "sdcc_dma_chnl",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001172 .start = DMOV_SDC3_CHAN,
1173 .end = DMOV_SDC3_CHAN,
1174 .flags = IORESOURCE_DMA,
1175 },
Krishna Konda25786ec2011-07-25 16:21:36 -07001176 {
1177 .name = "sdcc_dma_crci",
1178 .start = DMOV_SDC3_CRCI,
1179 .end = DMOV_SDC3_CRCI,
1180 .flags = IORESOURCE_DMA,
1181 },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001182#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1183};
1184
1185static struct resource resources_sdc4[] = {
1186 {
1187 .start = MSM_SDC4_BASE,
1188 .end = MSM_SDC4_DML_BASE - 1,
1189 .flags = IORESOURCE_MEM,
1190 },
1191 {
1192 .start = SDC4_IRQ_0,
1193 .end = SDC4_IRQ_0,
1194 .flags = IORESOURCE_IRQ,
1195 },
1196#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1197 {
1198 .name = "sdcc_dml_addr",
1199 .start = MSM_SDC4_DML_BASE,
1200 .end = MSM_SDC4_BAM_BASE - 1,
1201 .flags = IORESOURCE_MEM,
1202 },
1203 {
1204 .name = "sdcc_bam_addr",
1205 .start = MSM_SDC4_BAM_BASE,
1206 .end = MSM_SDC4_BAM_BASE + (2 * SZ_4K) - 1,
1207 .flags = IORESOURCE_MEM,
1208 },
1209 {
1210 .name = "sdcc_bam_irq",
1211 .start = SDC4_BAM_IRQ,
1212 .end = SDC4_BAM_IRQ,
1213 .flags = IORESOURCE_IRQ,
1214 },
1215#else
1216 {
Krishna Konda25786ec2011-07-25 16:21:36 -07001217 .name = "sdcc_dma_chnl",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001218 .start = DMOV_SDC4_CHAN,
1219 .end = DMOV_SDC4_CHAN,
1220 .flags = IORESOURCE_DMA,
1221 },
Krishna Konda25786ec2011-07-25 16:21:36 -07001222 {
1223 .name = "sdcc_dma_crci",
1224 .start = DMOV_SDC4_CRCI,
1225 .end = DMOV_SDC4_CRCI,
1226 .flags = IORESOURCE_DMA,
1227 },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001228#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1229};
1230
1231static struct resource resources_sdc5[] = {
1232 {
1233 .start = MSM_SDC5_BASE,
1234 .end = MSM_SDC5_DML_BASE - 1,
1235 .flags = IORESOURCE_MEM,
1236 },
1237 {
1238 .start = SDC5_IRQ_0,
1239 .end = SDC5_IRQ_0,
1240 .flags = IORESOURCE_IRQ,
1241 },
1242#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1243 {
1244 .name = "sdcc_dml_addr",
1245 .start = MSM_SDC5_DML_BASE,
1246 .end = MSM_SDC5_BAM_BASE - 1,
1247 .flags = IORESOURCE_MEM,
1248 },
1249 {
1250 .name = "sdcc_bam_addr",
1251 .start = MSM_SDC5_BAM_BASE,
1252 .end = MSM_SDC5_BAM_BASE + (2 * SZ_4K) - 1,
1253 .flags = IORESOURCE_MEM,
1254 },
1255 {
1256 .name = "sdcc_bam_irq",
1257 .start = SDC5_BAM_IRQ,
1258 .end = SDC5_BAM_IRQ,
1259 .flags = IORESOURCE_IRQ,
1260 },
1261#else
1262 {
Krishna Konda25786ec2011-07-25 16:21:36 -07001263 .name = "sdcc_dma_chnl",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001264 .start = DMOV_SDC5_CHAN,
1265 .end = DMOV_SDC5_CHAN,
1266 .flags = IORESOURCE_DMA,
1267 },
Krishna Konda25786ec2011-07-25 16:21:36 -07001268 {
1269 .name = "sdcc_dma_crci",
1270 .start = DMOV_SDC5_CRCI,
1271 .end = DMOV_SDC5_CRCI,
1272 .flags = IORESOURCE_DMA,
1273 },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001274#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1275};
1276
1277struct platform_device msm_device_sdc1 = {
1278 .name = "msm_sdcc",
1279 .id = 1,
1280 .num_resources = ARRAY_SIZE(resources_sdc1),
1281 .resource = resources_sdc1,
1282 .dev = {
1283 .coherent_dma_mask = 0xffffffff,
1284 },
1285};
1286
1287struct platform_device msm_device_sdc2 = {
1288 .name = "msm_sdcc",
1289 .id = 2,
1290 .num_resources = ARRAY_SIZE(resources_sdc2),
1291 .resource = resources_sdc2,
1292 .dev = {
1293 .coherent_dma_mask = 0xffffffff,
1294 },
1295};
1296
1297struct platform_device msm_device_sdc3 = {
1298 .name = "msm_sdcc",
1299 .id = 3,
1300 .num_resources = ARRAY_SIZE(resources_sdc3),
1301 .resource = resources_sdc3,
1302 .dev = {
1303 .coherent_dma_mask = 0xffffffff,
1304 },
1305};
1306
1307struct platform_device msm_device_sdc4 = {
1308 .name = "msm_sdcc",
1309 .id = 4,
1310 .num_resources = ARRAY_SIZE(resources_sdc4),
1311 .resource = resources_sdc4,
1312 .dev = {
1313 .coherent_dma_mask = 0xffffffff,
1314 },
1315};
1316
1317struct platform_device msm_device_sdc5 = {
1318 .name = "msm_sdcc",
1319 .id = 5,
1320 .num_resources = ARRAY_SIZE(resources_sdc5),
1321 .resource = resources_sdc5,
1322 .dev = {
1323 .coherent_dma_mask = 0xffffffff,
1324 },
1325};
1326
1327static struct platform_device *msm_sdcc_devices[] __initdata = {
1328 &msm_device_sdc1,
1329 &msm_device_sdc2,
1330 &msm_device_sdc3,
1331 &msm_device_sdc4,
1332 &msm_device_sdc5,
1333};
1334
1335int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat)
1336{
1337 struct platform_device *pdev;
1338
1339 if (controller < 1 || controller > 5)
1340 return -EINVAL;
1341
1342 pdev = msm_sdcc_devices[controller-1];
1343 pdev->dev.platform_data = plat;
1344 return platform_device_register(pdev);
1345}
1346
1347#define MIPI_DSI_HW_BASE 0x04700000
1348#define ROTATOR_HW_BASE 0x04E00000
1349#define TVENC_HW_BASE 0x04F00000
1350#define MDP_HW_BASE 0x05100000
1351
1352static struct resource msm_mipi_dsi_resources[] = {
1353 {
1354 .name = "mipi_dsi",
1355 .start = MIPI_DSI_HW_BASE,
1356 .end = MIPI_DSI_HW_BASE + 0x000F0000 - 1,
1357 .flags = IORESOURCE_MEM,
1358 },
1359 {
1360 .start = DSI_IRQ,
1361 .end = DSI_IRQ,
1362 .flags = IORESOURCE_IRQ,
1363 },
1364};
1365
1366static struct platform_device msm_mipi_dsi_device = {
1367 .name = "mipi_dsi",
1368 .id = 1,
1369 .num_resources = ARRAY_SIZE(msm_mipi_dsi_resources),
1370 .resource = msm_mipi_dsi_resources,
1371};
1372
1373static struct resource msm_mdp_resources[] = {
1374 {
1375 .name = "mdp",
1376 .start = MDP_HW_BASE,
1377 .end = MDP_HW_BASE + 0x000F0000 - 1,
1378 .flags = IORESOURCE_MEM,
1379 },
1380 {
1381 .start = INT_MDP,
1382 .end = INT_MDP,
1383 .flags = IORESOURCE_IRQ,
1384 },
1385};
1386
1387static struct platform_device msm_mdp_device = {
1388 .name = "mdp",
1389 .id = 0,
1390 .num_resources = ARRAY_SIZE(msm_mdp_resources),
1391 .resource = msm_mdp_resources,
1392};
1393#ifdef CONFIG_MSM_ROTATOR
1394static struct resource resources_msm_rotator[] = {
1395 {
1396 .start = 0x04E00000,
1397 .end = 0x04F00000 - 1,
1398 .flags = IORESOURCE_MEM,
1399 },
1400 {
1401 .start = ROT_IRQ,
1402 .end = ROT_IRQ,
1403 .flags = IORESOURCE_IRQ,
1404 },
1405};
1406
1407static struct msm_rot_clocks rotator_clocks[] = {
1408 {
1409 .clk_name = "rot_clk",
1410 .clk_type = ROTATOR_CORE_CLK,
1411 .clk_rate = 160 * 1000 * 1000,
1412 },
1413 {
1414 .clk_name = "rotator_pclk",
1415 .clk_type = ROTATOR_PCLK,
1416 .clk_rate = 0,
1417 },
1418};
1419
1420static struct msm_rotator_platform_data rotator_pdata = {
1421 .number_of_clocks = ARRAY_SIZE(rotator_clocks),
1422 .hardware_version_number = 0x01010307,
1423 .rotator_clks = rotator_clocks,
1424 .regulator_name = "fs_rot",
1425};
1426
1427struct platform_device msm_rotator_device = {
1428 .name = "msm_rotator",
1429 .id = 0,
1430 .num_resources = ARRAY_SIZE(resources_msm_rotator),
1431 .resource = resources_msm_rotator,
1432 .dev = {
1433 .platform_data = &rotator_pdata,
1434 },
1435};
1436#endif
1437
1438
1439/* Sensors DSPS platform data */
1440#ifdef CONFIG_MSM_DSPS
1441
1442#define PPSS_REG_PHYS_BASE 0x12080000
1443
1444#define MHZ (1000*1000)
1445
1446static struct dsps_clk_info dsps_clks[] = {
1447 {
1448 .name = "ppss_pclk",
1449 .rate = 0, /* no rate just on/off */
1450 },
1451 {
1452 .name = "pmem_clk",
1453 .rate = 0, /* no rate just on/off */
1454 },
1455 {
1456 .name = "gsbi_qup_clk",
1457 .rate = 24 * MHZ, /* See clk_tbl_gsbi_qup[] */
1458 },
1459 {
1460 .name = "dfab_dsps_clk",
1461 .rate = 64 * MHZ, /* Same rate as USB. */
1462 }
1463};
1464
1465static struct dsps_regulator_info dsps_regs[] = {
1466 {
1467 .name = "8058_l5",
1468 .volt = 2850000, /* in uV */
1469 },
1470 {
1471 .name = "8058_s3",
1472 .volt = 1800000, /* in uV */
1473 }
1474};
1475
1476/*
1477 * Note: GPIOs field is intialized in run-time at the function
1478 * msm8x60_init_dsps().
1479 */
1480
1481struct msm_dsps_platform_data msm_dsps_pdata = {
1482 .clks = dsps_clks,
1483 .clks_num = ARRAY_SIZE(dsps_clks),
1484 .gpios = NULL,
1485 .gpios_num = 0,
1486 .regs = dsps_regs,
1487 .regs_num = ARRAY_SIZE(dsps_regs),
1488 .signature = DSPS_SIGNATURE,
1489};
1490
1491static struct resource msm_dsps_resources[] = {
1492 {
1493 .start = PPSS_REG_PHYS_BASE,
1494 .end = PPSS_REG_PHYS_BASE + SZ_8K - 1,
1495 .name = "ppss_reg",
1496 .flags = IORESOURCE_MEM,
1497 },
1498};
1499
1500struct platform_device msm_dsps_device = {
1501 .name = "msm_dsps",
1502 .id = 0,
1503 .num_resources = ARRAY_SIZE(msm_dsps_resources),
1504 .resource = msm_dsps_resources,
1505 .dev.platform_data = &msm_dsps_pdata,
1506};
1507
1508#endif /* CONFIG_MSM_DSPS */
1509
1510#ifdef CONFIG_FB_MSM_TVOUT
1511static struct resource msm_tvenc_resources[] = {
1512 {
1513 .name = "tvenc",
1514 .start = TVENC_HW_BASE,
1515 .end = TVENC_HW_BASE + PAGE_SIZE - 1,
1516 .flags = IORESOURCE_MEM,
1517 }
1518};
1519
1520static struct resource tvout_device_resources[] = {
1521 {
1522 .name = "tvout_device_irq",
1523 .start = TV_ENC_IRQ,
1524 .end = TV_ENC_IRQ,
1525 .flags = IORESOURCE_IRQ,
1526 },
1527};
1528#endif
1529static void __init msm_register_device(struct platform_device *pdev, void *data)
1530{
1531 int ret;
1532
1533 pdev->dev.platform_data = data;
1534
1535 ret = platform_device_register(pdev);
1536 if (ret)
1537 dev_err(&pdev->dev,
1538 "%s: platform_device_register() failed = %d\n",
1539 __func__, ret);
1540}
1541
1542static struct platform_device msm_lcdc_device = {
1543 .name = "lcdc",
1544 .id = 0,
1545};
1546
1547#ifdef CONFIG_FB_MSM_TVOUT
1548static struct platform_device msm_tvenc_device = {
1549 .name = "tvenc",
1550 .id = 0,
1551 .num_resources = ARRAY_SIZE(msm_tvenc_resources),
1552 .resource = msm_tvenc_resources,
1553};
1554
1555static struct platform_device msm_tvout_device = {
1556 .name = "tvout_device",
1557 .id = 0,
1558 .num_resources = ARRAY_SIZE(tvout_device_resources),
1559 .resource = tvout_device_resources,
1560};
1561#endif
1562
1563#ifdef CONFIG_MSM_BUS_SCALING
1564static struct platform_device msm_dtv_device = {
1565 .name = "dtv",
1566 .id = 0,
1567};
1568#endif
1569
1570void __init msm_fb_register_device(char *name, void *data)
1571{
1572 if (!strncmp(name, "mdp", 3))
1573 msm_register_device(&msm_mdp_device, data);
1574 else if (!strncmp(name, "lcdc", 4))
1575 msm_register_device(&msm_lcdc_device, data);
1576 else if (!strncmp(name, "mipi_dsi", 8))
1577 msm_register_device(&msm_mipi_dsi_device, data);
1578#ifdef CONFIG_FB_MSM_TVOUT
1579 else if (!strncmp(name, "tvenc", 5))
1580 msm_register_device(&msm_tvenc_device, data);
1581 else if (!strncmp(name, "tvout_device", 12))
1582 msm_register_device(&msm_tvout_device, data);
1583#endif
1584#ifdef CONFIG_MSM_BUS_SCALING
1585 else if (!strncmp(name, "dtv", 3))
1586 msm_register_device(&msm_dtv_device, data);
1587#endif
1588 else
1589 printk(KERN_ERR "%s: unknown device! %s\n", __func__, name);
1590}
1591
1592static struct resource resources_otg[] = {
1593 {
1594 .start = 0x12500000,
1595 .end = 0x12500000 + SZ_1K - 1,
1596 .flags = IORESOURCE_MEM,
1597 },
1598 {
1599 .start = USB1_HS_IRQ,
1600 .end = USB1_HS_IRQ,
1601 .flags = IORESOURCE_IRQ,
1602 },
1603};
1604
1605struct platform_device msm_device_otg = {
1606 .name = "msm_otg",
1607 .id = -1,
1608 .num_resources = ARRAY_SIZE(resources_otg),
1609 .resource = resources_otg,
1610};
1611
1612static u64 dma_mask = 0xffffffffULL;
1613struct platform_device msm_device_gadget_peripheral = {
1614 .name = "msm_hsusb",
1615 .id = -1,
1616 .dev = {
1617 .dma_mask = &dma_mask,
1618 .coherent_dma_mask = 0xffffffffULL,
1619 },
1620};
1621#ifdef CONFIG_USB_EHCI_MSM_72K
1622static struct resource resources_hsusb_host[] = {
1623 {
1624 .start = 0x12500000,
1625 .end = 0x12500000 + SZ_1K - 1,
1626 .flags = IORESOURCE_MEM,
1627 },
1628 {
1629 .start = USB1_HS_IRQ,
1630 .end = USB1_HS_IRQ,
1631 .flags = IORESOURCE_IRQ,
1632 },
1633};
1634
1635struct platform_device msm_device_hsusb_host = {
1636 .name = "msm_hsusb_host",
1637 .id = 0,
1638 .num_resources = ARRAY_SIZE(resources_hsusb_host),
1639 .resource = resources_hsusb_host,
1640 .dev = {
1641 .dma_mask = &dma_mask,
1642 .coherent_dma_mask = 0xffffffffULL,
1643 },
1644};
1645
1646static struct platform_device *msm_host_devices[] = {
1647 &msm_device_hsusb_host,
1648};
1649
1650int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat)
1651{
1652 struct platform_device *pdev;
1653
1654 pdev = msm_host_devices[host];
1655 if (!pdev)
1656 return -ENODEV;
1657 pdev->dev.platform_data = plat;
1658 return platform_device_register(pdev);
1659}
1660#endif
1661
1662#define MSM_TSIF0_PHYS (0x18200000)
1663#define MSM_TSIF1_PHYS (0x18201000)
1664#define MSM_TSIF_SIZE (0x200)
1665#define TCSR_ADM_0_A_CRCI_MUX_SEL 0x0070
1666
1667#define TSIF_0_CLK GPIO_CFG(93, 1, GPIO_CFG_INPUT, \
1668 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1669#define TSIF_0_EN GPIO_CFG(94, 1, GPIO_CFG_INPUT, \
1670 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1671#define TSIF_0_DATA GPIO_CFG(95, 1, GPIO_CFG_INPUT, \
1672 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1673#define TSIF_0_SYNC GPIO_CFG(96, 1, GPIO_CFG_INPUT, \
1674 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1675#define TSIF_1_CLK GPIO_CFG(97, 1, GPIO_CFG_INPUT, \
1676 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1677#define TSIF_1_EN GPIO_CFG(98, 1, GPIO_CFG_INPUT, \
1678 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1679#define TSIF_1_DATA GPIO_CFG(99, 1, GPIO_CFG_INPUT, \
1680 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1681#define TSIF_1_SYNC GPIO_CFG(100, 1, GPIO_CFG_INPUT, \
1682 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1683
1684static const struct msm_gpio tsif0_gpios[] = {
1685 { .gpio_cfg = TSIF_0_CLK, .label = "tsif_clk", },
1686 { .gpio_cfg = TSIF_0_EN, .label = "tsif_en", },
1687 { .gpio_cfg = TSIF_0_DATA, .label = "tsif_data", },
1688 { .gpio_cfg = TSIF_0_SYNC, .label = "tsif_sync", },
1689};
1690
1691static const struct msm_gpio tsif1_gpios[] = {
1692 { .gpio_cfg = TSIF_1_CLK, .label = "tsif_clk", },
1693 { .gpio_cfg = TSIF_1_EN, .label = "tsif_en", },
1694 { .gpio_cfg = TSIF_1_DATA, .label = "tsif_data", },
1695 { .gpio_cfg = TSIF_1_SYNC, .label = "tsif_sync", },
1696};
1697
1698static void tsif_release(struct device *dev)
1699{
1700}
1701
1702static void tsif_init1(struct msm_tsif_platform_data *data)
1703{
1704 int val;
1705
1706 /* configure mux to use correct tsif instance */
1707 val = secure_readl(MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1708 val |= 0x80000000;
1709 secure_writel(val, MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1710}
1711
1712struct msm_tsif_platform_data tsif1_platform_data = {
1713 .num_gpios = ARRAY_SIZE(tsif1_gpios),
1714 .gpios = tsif1_gpios,
1715 .tsif_pclk = "tsif_pclk",
1716 .tsif_ref_clk = "tsif_ref_clk",
1717 .init = tsif_init1
1718};
1719
1720struct resource tsif1_resources[] = {
1721 [0] = {
1722 .flags = IORESOURCE_IRQ,
1723 .start = TSIF2_IRQ,
1724 .end = TSIF2_IRQ,
1725 },
1726 [1] = {
1727 .flags = IORESOURCE_MEM,
1728 .start = MSM_TSIF1_PHYS,
1729 .end = MSM_TSIF1_PHYS + MSM_TSIF_SIZE - 1,
1730 },
1731 [2] = {
1732 .flags = IORESOURCE_DMA,
1733 .start = DMOV_TSIF_CHAN,
1734 .end = DMOV_TSIF_CRCI,
1735 },
1736};
1737
1738static void tsif_init0(struct msm_tsif_platform_data *data)
1739{
1740 int val;
1741
1742 /* configure mux to use correct tsif instance */
1743 val = secure_readl(MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1744 val &= 0x7FFFFFFF;
1745 secure_writel(val, MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1746}
1747
1748struct msm_tsif_platform_data tsif0_platform_data = {
1749 .num_gpios = ARRAY_SIZE(tsif0_gpios),
1750 .gpios = tsif0_gpios,
1751 .tsif_pclk = "tsif_pclk",
1752 .tsif_ref_clk = "tsif_ref_clk",
1753 .init = tsif_init0
1754};
1755struct resource tsif0_resources[] = {
1756 [0] = {
1757 .flags = IORESOURCE_IRQ,
1758 .start = TSIF1_IRQ,
1759 .end = TSIF1_IRQ,
1760 },
1761 [1] = {
1762 .flags = IORESOURCE_MEM,
1763 .start = MSM_TSIF0_PHYS,
1764 .end = MSM_TSIF0_PHYS + MSM_TSIF_SIZE - 1,
1765 },
1766 [2] = {
1767 .flags = IORESOURCE_DMA,
1768 .start = DMOV_TSIF_CHAN,
1769 .end = DMOV_TSIF_CRCI,
1770 },
1771};
1772
1773struct platform_device msm_device_tsif[2] = {
1774 {
1775 .name = "msm_tsif",
1776 .id = 0,
1777 .num_resources = ARRAY_SIZE(tsif0_resources),
1778 .resource = tsif0_resources,
1779 .dev = {
1780 .release = tsif_release,
1781 .platform_data = &tsif0_platform_data
1782 },
1783 },
1784 {
1785 .name = "msm_tsif",
1786 .id = 1,
1787 .num_resources = ARRAY_SIZE(tsif1_resources),
1788 .resource = tsif1_resources,
1789 .dev = {
1790 .release = tsif_release,
1791 .platform_data = &tsif1_platform_data
1792 },
1793 }
1794};
1795
1796struct platform_device msm_device_smd = {
1797 .name = "msm_smd",
1798 .id = -1,
1799};
1800
1801struct resource msm_dmov_resource_adm0[] = {
1802 {
1803 .start = INT_ADM0_AARM,
1804 .end = (resource_size_t)MSM_DMOV_ADM0_BASE,
1805 .flags = IORESOURCE_IRQ,
1806 },
1807};
1808
1809struct resource msm_dmov_resource_adm1[] = {
1810 {
1811 .start = INT_ADM1_AARM,
1812 .end = (resource_size_t)MSM_DMOV_ADM1_BASE,
1813 .flags = IORESOURCE_IRQ,
1814 },
1815};
1816
1817struct platform_device msm_device_dmov_adm0 = {
1818 .name = "msm_dmov",
1819 .id = 0,
1820 .resource = msm_dmov_resource_adm0,
1821 .num_resources = ARRAY_SIZE(msm_dmov_resource_adm0),
1822};
1823
1824struct platform_device msm_device_dmov_adm1 = {
1825 .name = "msm_dmov",
1826 .id = 1,
1827 .resource = msm_dmov_resource_adm1,
1828 .num_resources = ARRAY_SIZE(msm_dmov_resource_adm1),
1829};
1830
1831/* MSM Video core device */
1832#ifdef CONFIG_MSM_BUS_SCALING
1833static struct msm_bus_vectors vidc_init_vectors[] = {
1834 {
1835 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1836 .dst = MSM_BUS_SLAVE_SMI,
1837 .ab = 0,
1838 .ib = 0,
1839 },
1840 {
1841 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1842 .dst = MSM_BUS_SLAVE_SMI,
1843 .ab = 0,
1844 .ib = 0,
1845 },
1846 {
1847 .src = MSM_BUS_MASTER_AMPSS_M0,
1848 .dst = MSM_BUS_SLAVE_EBI_CH0,
1849 .ab = 0,
1850 .ib = 0,
1851 },
1852 {
1853 .src = MSM_BUS_MASTER_AMPSS_M0,
1854 .dst = MSM_BUS_SLAVE_SMI,
1855 .ab = 0,
1856 .ib = 0,
1857 },
1858};
1859static struct msm_bus_vectors vidc_venc_vga_vectors[] = {
1860 {
1861 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1862 .dst = MSM_BUS_SLAVE_SMI,
1863 .ab = 54525952,
1864 .ib = 436207616,
1865 },
1866 {
1867 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1868 .dst = MSM_BUS_SLAVE_SMI,
1869 .ab = 72351744,
1870 .ib = 289406976,
1871 },
1872 {
1873 .src = MSM_BUS_MASTER_AMPSS_M0,
1874 .dst = MSM_BUS_SLAVE_EBI_CH0,
1875 .ab = 500000,
1876 .ib = 1000000,
1877 },
1878 {
1879 .src = MSM_BUS_MASTER_AMPSS_M0,
1880 .dst = MSM_BUS_SLAVE_SMI,
1881 .ab = 500000,
1882 .ib = 1000000,
1883 },
1884};
1885static struct msm_bus_vectors vidc_vdec_vga_vectors[] = {
1886 {
1887 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1888 .dst = MSM_BUS_SLAVE_SMI,
1889 .ab = 40894464,
1890 .ib = 327155712,
1891 },
1892 {
1893 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1894 .dst = MSM_BUS_SLAVE_SMI,
1895 .ab = 48234496,
1896 .ib = 192937984,
1897 },
1898 {
1899 .src = MSM_BUS_MASTER_AMPSS_M0,
1900 .dst = MSM_BUS_SLAVE_EBI_CH0,
1901 .ab = 500000,
1902 .ib = 2000000,
1903 },
1904 {
1905 .src = MSM_BUS_MASTER_AMPSS_M0,
1906 .dst = MSM_BUS_SLAVE_SMI,
1907 .ab = 500000,
1908 .ib = 2000000,
1909 },
1910};
1911static struct msm_bus_vectors vidc_venc_720p_vectors[] = {
1912 {
1913 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1914 .dst = MSM_BUS_SLAVE_SMI,
1915 .ab = 163577856,
1916 .ib = 1308622848,
1917 },
1918 {
1919 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1920 .dst = MSM_BUS_SLAVE_SMI,
1921 .ab = 219152384,
1922 .ib = 876609536,
1923 },
1924 {
1925 .src = MSM_BUS_MASTER_AMPSS_M0,
1926 .dst = MSM_BUS_SLAVE_EBI_CH0,
1927 .ab = 1750000,
1928 .ib = 3500000,
1929 },
1930 {
1931 .src = MSM_BUS_MASTER_AMPSS_M0,
1932 .dst = MSM_BUS_SLAVE_SMI,
1933 .ab = 1750000,
1934 .ib = 3500000,
1935 },
1936};
1937static struct msm_bus_vectors vidc_vdec_720p_vectors[] = {
1938 {
1939 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1940 .dst = MSM_BUS_SLAVE_SMI,
1941 .ab = 121634816,
1942 .ib = 973078528,
1943 },
1944 {
1945 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1946 .dst = MSM_BUS_SLAVE_SMI,
1947 .ab = 155189248,
1948 .ib = 620756992,
1949 },
1950 {
1951 .src = MSM_BUS_MASTER_AMPSS_M0,
1952 .dst = MSM_BUS_SLAVE_EBI_CH0,
1953 .ab = 1750000,
1954 .ib = 7000000,
1955 },
1956 {
1957 .src = MSM_BUS_MASTER_AMPSS_M0,
1958 .dst = MSM_BUS_SLAVE_SMI,
1959 .ab = 1750000,
1960 .ib = 7000000,
1961 },
1962};
1963static struct msm_bus_vectors vidc_venc_1080p_vectors[] = {
1964 {
1965 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1966 .dst = MSM_BUS_SLAVE_SMI,
1967 .ab = 372244480,
1968 .ib = 1861222400,
1969 },
1970 {
1971 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1972 .dst = MSM_BUS_SLAVE_SMI,
1973 .ab = 501219328,
1974 .ib = 2004877312,
1975 },
1976 {
1977 .src = MSM_BUS_MASTER_AMPSS_M0,
1978 .dst = MSM_BUS_SLAVE_EBI_CH0,
1979 .ab = 2500000,
1980 .ib = 5000000,
1981 },
1982 {
1983 .src = MSM_BUS_MASTER_AMPSS_M0,
1984 .dst = MSM_BUS_SLAVE_SMI,
1985 .ab = 2500000,
1986 .ib = 5000000,
1987 },
1988};
1989static struct msm_bus_vectors vidc_vdec_1080p_vectors[] = {
1990 {
1991 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1992 .dst = MSM_BUS_SLAVE_SMI,
1993 .ab = 222298112,
1994 .ib = 1778384896,
1995 },
1996 {
1997 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1998 .dst = MSM_BUS_SLAVE_SMI,
1999 .ab = 330301440,
2000 .ib = 1321205760,
2001 },
2002 {
2003 .src = MSM_BUS_MASTER_AMPSS_M0,
2004 .dst = MSM_BUS_SLAVE_EBI_CH0,
2005 .ab = 2500000,
2006 .ib = 700000000,
2007 },
2008 {
2009 .src = MSM_BUS_MASTER_AMPSS_M0,
2010 .dst = MSM_BUS_SLAVE_SMI,
2011 .ab = 2500000,
2012 .ib = 10000000,
2013 },
2014};
2015
2016static struct msm_bus_paths vidc_bus_client_config[] = {
2017 {
2018 ARRAY_SIZE(vidc_init_vectors),
2019 vidc_init_vectors,
2020 },
2021 {
2022 ARRAY_SIZE(vidc_venc_vga_vectors),
2023 vidc_venc_vga_vectors,
2024 },
2025 {
2026 ARRAY_SIZE(vidc_vdec_vga_vectors),
2027 vidc_vdec_vga_vectors,
2028 },
2029 {
2030 ARRAY_SIZE(vidc_venc_720p_vectors),
2031 vidc_venc_720p_vectors,
2032 },
2033 {
2034 ARRAY_SIZE(vidc_vdec_720p_vectors),
2035 vidc_vdec_720p_vectors,
2036 },
2037 {
2038 ARRAY_SIZE(vidc_venc_1080p_vectors),
2039 vidc_venc_1080p_vectors,
2040 },
2041 {
2042 ARRAY_SIZE(vidc_vdec_1080p_vectors),
2043 vidc_vdec_1080p_vectors,
2044 },
2045};
2046
2047static struct msm_bus_scale_pdata vidc_bus_client_data = {
2048 vidc_bus_client_config,
2049 ARRAY_SIZE(vidc_bus_client_config),
2050 .name = "vidc",
2051};
2052
2053#endif
2054
2055#define MSM_VIDC_BASE_PHYS 0x04400000
2056#define MSM_VIDC_BASE_SIZE 0x00100000
2057
2058static struct resource msm_device_vidc_resources[] = {
2059 {
2060 .start = MSM_VIDC_BASE_PHYS,
2061 .end = MSM_VIDC_BASE_PHYS + MSM_VIDC_BASE_SIZE - 1,
2062 .flags = IORESOURCE_MEM,
2063 },
2064 {
2065 .start = VCODEC_IRQ,
2066 .end = VCODEC_IRQ,
2067 .flags = IORESOURCE_IRQ,
2068 },
2069};
2070
2071struct msm_vidc_platform_data vidc_platform_data = {
2072#ifdef CONFIG_MSM_BUS_SCALING
2073 .vidc_bus_client_pdata = &vidc_bus_client_data,
2074#endif
2075 .memtype = MEMTYPE_SMI_KERNEL
2076};
2077
2078struct platform_device msm_device_vidc = {
2079 .name = "msm_vidc",
2080 .id = 0,
2081 .num_resources = ARRAY_SIZE(msm_device_vidc_resources),
2082 .resource = msm_device_vidc_resources,
2083 .dev = {
2084 .platform_data = &vidc_platform_data,
2085 },
2086};
2087
2088#if defined(CONFIG_MSM_RPM_STATS_LOG)
2089static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = {
2090 .phys_addr_base = 0x00107E04,
2091 .phys_size = SZ_8K,
2092};
2093
2094struct platform_device msm_rpm_stat_device = {
2095 .name = "msm_rpm_stat",
2096 .id = -1,
2097 .dev = {
2098 .platform_data = &msm_rpm_stat_pdata,
2099 },
2100};
2101#endif
2102
2103#ifdef CONFIG_MSM_MPM
2104static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] = {
2105 [1] = MSM_GPIO_TO_INT(61),
2106 [4] = MSM_GPIO_TO_INT(87),
2107 [5] = MSM_GPIO_TO_INT(88),
2108 [6] = MSM_GPIO_TO_INT(89),
2109 [7] = MSM_GPIO_TO_INT(90),
2110 [8] = MSM_GPIO_TO_INT(91),
2111 [9] = MSM_GPIO_TO_INT(34),
2112 [10] = MSM_GPIO_TO_INT(38),
2113 [11] = MSM_GPIO_TO_INT(42),
2114 [12] = MSM_GPIO_TO_INT(46),
2115 [13] = MSM_GPIO_TO_INT(50),
2116 [14] = MSM_GPIO_TO_INT(54),
2117 [15] = MSM_GPIO_TO_INT(58),
2118 [16] = MSM_GPIO_TO_INT(63),
2119 [17] = MSM_GPIO_TO_INT(160),
2120 [18] = MSM_GPIO_TO_INT(162),
2121 [19] = MSM_GPIO_TO_INT(144),
2122 [20] = MSM_GPIO_TO_INT(146),
2123 [25] = USB1_HS_IRQ,
2124 [26] = TV_ENC_IRQ,
2125 [27] = HDMI_IRQ,
2126 [29] = MSM_GPIO_TO_INT(123),
2127 [30] = MSM_GPIO_TO_INT(172),
2128 [31] = MSM_GPIO_TO_INT(99),
2129 [32] = MSM_GPIO_TO_INT(96),
2130 [33] = MSM_GPIO_TO_INT(67),
2131 [34] = MSM_GPIO_TO_INT(71),
2132 [35] = MSM_GPIO_TO_INT(105),
2133 [36] = MSM_GPIO_TO_INT(117),
2134 [37] = MSM_GPIO_TO_INT(29),
2135 [38] = MSM_GPIO_TO_INT(30),
2136 [39] = MSM_GPIO_TO_INT(31),
2137 [40] = MSM_GPIO_TO_INT(37),
2138 [41] = MSM_GPIO_TO_INT(40),
2139 [42] = MSM_GPIO_TO_INT(41),
2140 [43] = MSM_GPIO_TO_INT(45),
2141 [44] = MSM_GPIO_TO_INT(51),
2142 [45] = MSM_GPIO_TO_INT(52),
2143 [46] = MSM_GPIO_TO_INT(57),
2144 [47] = MSM_GPIO_TO_INT(73),
2145 [48] = MSM_GPIO_TO_INT(93),
2146 [49] = MSM_GPIO_TO_INT(94),
2147 [50] = MSM_GPIO_TO_INT(103),
2148 [51] = MSM_GPIO_TO_INT(104),
2149 [52] = MSM_GPIO_TO_INT(106),
2150 [53] = MSM_GPIO_TO_INT(115),
2151 [54] = MSM_GPIO_TO_INT(124),
2152 [55] = MSM_GPIO_TO_INT(125),
2153 [56] = MSM_GPIO_TO_INT(126),
2154 [57] = MSM_GPIO_TO_INT(127),
2155 [58] = MSM_GPIO_TO_INT(128),
2156 [59] = MSM_GPIO_TO_INT(129),
2157};
2158
2159static uint16_t msm_mpm_bypassed_apps_irqs[] = {
2160 TLMM_MSM_SUMMARY_IRQ,
2161 RPM_SCSS_CPU0_GP_HIGH_IRQ,
2162 RPM_SCSS_CPU0_GP_MEDIUM_IRQ,
2163 RPM_SCSS_CPU0_GP_LOW_IRQ,
2164 RPM_SCSS_CPU0_WAKE_UP_IRQ,
2165 RPM_SCSS_CPU1_GP_HIGH_IRQ,
2166 RPM_SCSS_CPU1_GP_MEDIUM_IRQ,
2167 RPM_SCSS_CPU1_GP_LOW_IRQ,
2168 RPM_SCSS_CPU1_WAKE_UP_IRQ,
2169 MARM_SCSS_GP_IRQ_0,
2170 MARM_SCSS_GP_IRQ_1,
2171 MARM_SCSS_GP_IRQ_2,
2172 MARM_SCSS_GP_IRQ_3,
2173 MARM_SCSS_GP_IRQ_4,
2174 MARM_SCSS_GP_IRQ_5,
2175 MARM_SCSS_GP_IRQ_6,
2176 MARM_SCSS_GP_IRQ_7,
2177 MARM_SCSS_GP_IRQ_8,
2178 MARM_SCSS_GP_IRQ_9,
2179 LPASS_SCSS_GP_LOW_IRQ,
2180 LPASS_SCSS_GP_MEDIUM_IRQ,
2181 LPASS_SCSS_GP_HIGH_IRQ,
2182 SDC4_IRQ_0,
2183 SPS_MTI_31,
2184};
2185
2186struct msm_mpm_device_data msm_mpm_dev_data = {
2187 .irqs_m2a = msm_mpm_irqs_m2a,
2188 .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a),
2189 .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs,
2190 .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs),
2191 .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8,
2192 .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8,
2193 .mpm_apps_ipc_reg = MSM_GCC_BASE + 0x008,
2194 .mpm_apps_ipc_val = BIT(1),
2195 .mpm_ipc_irq = RPM_SCSS_CPU0_GP_MEDIUM_IRQ,
2196
2197};
2198#endif
2199
2200
2201#ifdef CONFIG_MSM_BUS_SCALING
2202struct platform_device msm_bus_sys_fabric = {
2203 .name = "msm_bus_fabric",
2204 .id = MSM_BUS_FAB_SYSTEM,
2205};
2206struct platform_device msm_bus_apps_fabric = {
2207 .name = "msm_bus_fabric",
2208 .id = MSM_BUS_FAB_APPSS,
2209};
2210struct platform_device msm_bus_mm_fabric = {
2211 .name = "msm_bus_fabric",
2212 .id = MSM_BUS_FAB_MMSS,
2213};
2214struct platform_device msm_bus_sys_fpb = {
2215 .name = "msm_bus_fabric",
2216 .id = MSM_BUS_FAB_SYSTEM_FPB,
2217};
2218struct platform_device msm_bus_cpss_fpb = {
2219 .name = "msm_bus_fabric",
2220 .id = MSM_BUS_FAB_CPSS_FPB,
2221};
2222#endif
2223
2224struct platform_device asoc_msm_pcm = {
2225 .name = "msm-dsp-audio",
2226 .id = 0,
2227};
2228
2229struct platform_device asoc_msm_dai0 = {
2230 .name = "msm-codec-dai",
2231 .id = 0,
2232};
2233
2234struct platform_device asoc_msm_dai1 = {
2235 .name = "msm-cpu-dai",
2236 .id = 0,
2237};
2238
2239#if defined (CONFIG_MSM_8x60_VOIP)
2240struct platform_device asoc_msm_mvs = {
2241 .name = "msm-mvs-audio",
2242 .id = 0,
2243};
2244
2245struct platform_device asoc_mvs_dai0 = {
2246 .name = "mvs-codec-dai",
2247 .id = 0,
2248};
2249
2250struct platform_device asoc_mvs_dai1 = {
2251 .name = "mvs-cpu-dai",
2252 .id = 0,
2253};
2254#endif
2255
2256struct platform_device *msm_footswitch_devices[] = {
2257 FS_8X60(FS_IJPEG, "fs_ijpeg"),
2258 FS_8X60(FS_MDP, "fs_mdp"),
2259 FS_8X60(FS_ROT, "fs_rot"),
2260 FS_8X60(FS_VED, "fs_ved"),
2261 FS_8X60(FS_VFE, "fs_vfe"),
2262 FS_8X60(FS_VPE, "fs_vpe"),
2263 FS_8X60(FS_GFX3D, "fs_gfx3d"),
2264 FS_8X60(FS_GFX2D0, "fs_gfx2d0"),
2265 FS_8X60(FS_GFX2D1, "fs_gfx2d1"),
2266};
2267unsigned msm_num_footswitch_devices = ARRAY_SIZE(msm_footswitch_devices);
2268
2269#ifdef CONFIG_MSM_RPM
2270struct msm_rpm_map_data rpm_map_data[] __initdata = {
2271 MSM_RPM_MAP(TRIGGER_TIMED_TO, TRIGGER_TIMED, 1),
2272 MSM_RPM_MAP(TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1),
2273 MSM_RPM_MAP(TRIGGER_SET_FROM, TRIGGER_SET, 1),
2274 MSM_RPM_MAP(TRIGGER_SET_TO, TRIGGER_SET, 1),
2275 MSM_RPM_MAP(TRIGGER_SET_TRIGGER, TRIGGER_SET, 1),
2276 MSM_RPM_MAP(TRIGGER_CLEAR_FROM, TRIGGER_CLEAR, 1),
2277 MSM_RPM_MAP(TRIGGER_CLEAR_TO, TRIGGER_CLEAR, 1),
2278 MSM_RPM_MAP(TRIGGER_CLEAR_TRIGGER, TRIGGER_CLEAR, 1),
2279
2280 MSM_RPM_MAP(CXO_CLK, CXO_CLK, 1),
2281 MSM_RPM_MAP(PXO_CLK, PXO_CLK, 1),
2282 MSM_RPM_MAP(PLL_4, PLL_4, 1),
2283 MSM_RPM_MAP(APPS_FABRIC_CLK, APPS_FABRIC_CLK, 1),
2284 MSM_RPM_MAP(SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1),
2285 MSM_RPM_MAP(MM_FABRIC_CLK, MM_FABRIC_CLK, 1),
2286 MSM_RPM_MAP(DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1),
2287 MSM_RPM_MAP(SFPB_CLK, SFPB_CLK, 1),
2288 MSM_RPM_MAP(CFPB_CLK, CFPB_CLK, 1),
2289 MSM_RPM_MAP(MMFPB_CLK, MMFPB_CLK, 1),
2290 MSM_RPM_MAP(SMI_CLK, SMI_CLK, 1),
2291 MSM_RPM_MAP(EBI1_CLK, EBI1_CLK, 1),
2292
2293 MSM_RPM_MAP(APPS_L2_CACHE_CTL, APPS_L2_CACHE_CTL, 1),
2294
2295 MSM_RPM_MAP(APPS_FABRIC_HALT_0, APPS_FABRIC_HALT, 2),
2296 MSM_RPM_MAP(APPS_FABRIC_CLOCK_MODE_0, APPS_FABRIC_CLOCK_MODE, 3),
2297 MSM_RPM_MAP(APPS_FABRIC_ARB_0, APPS_FABRIC_ARB, 6),
2298
2299 MSM_RPM_MAP(SYSTEM_FABRIC_HALT_0, SYSTEM_FABRIC_HALT, 2),
2300 MSM_RPM_MAP(SYSTEM_FABRIC_CLOCK_MODE_0, SYSTEM_FABRIC_CLOCK_MODE, 3),
2301 MSM_RPM_MAP(SYSTEM_FABRIC_ARB_0, SYSTEM_FABRIC_ARB, 22),
2302
2303 MSM_RPM_MAP(MM_FABRIC_HALT_0, MM_FABRIC_HALT, 2),
2304 MSM_RPM_MAP(MM_FABRIC_CLOCK_MODE_0, MM_FABRIC_CLOCK_MODE, 3),
2305 MSM_RPM_MAP(MM_FABRIC_ARB_0, MM_FABRIC_ARB, 23),
2306
2307 MSM_RPM_MAP(SMPS0B_0, SMPS0B, 2),
2308 MSM_RPM_MAP(SMPS1B_0, SMPS1B, 2),
2309 MSM_RPM_MAP(SMPS2B_0, SMPS2B, 2),
2310 MSM_RPM_MAP(SMPS3B_0, SMPS3B, 2),
2311 MSM_RPM_MAP(SMPS4B_0, SMPS4B, 2),
2312 MSM_RPM_MAP(LDO0B_0, LDO0B, 2),
2313 MSM_RPM_MAP(LDO1B_0, LDO1B, 2),
2314 MSM_RPM_MAP(LDO2B_0, LDO2B, 2),
2315 MSM_RPM_MAP(LDO3B_0, LDO3B, 2),
2316 MSM_RPM_MAP(LDO4B_0, LDO4B, 2),
2317 MSM_RPM_MAP(LDO5B_0, LDO5B, 2),
2318 MSM_RPM_MAP(LDO6B_0, LDO6B, 2),
2319 MSM_RPM_MAP(LVS0B, LVS0B, 1),
2320 MSM_RPM_MAP(LVS1B, LVS1B, 1),
2321 MSM_RPM_MAP(LVS2B, LVS2B, 1),
2322 MSM_RPM_MAP(LVS3B, LVS3B, 1),
2323 MSM_RPM_MAP(MVS, MVS, 1),
2324
2325 MSM_RPM_MAP(SMPS0_0, SMPS0, 2),
2326 MSM_RPM_MAP(SMPS1_0, SMPS1, 2),
2327 MSM_RPM_MAP(SMPS2_0, SMPS2, 2),
2328 MSM_RPM_MAP(SMPS3_0, SMPS3, 2),
2329 MSM_RPM_MAP(SMPS4_0, SMPS4, 2),
2330 MSM_RPM_MAP(LDO0_0, LDO0, 2),
2331 MSM_RPM_MAP(LDO1_0, LDO1, 2),
2332 MSM_RPM_MAP(LDO2_0, LDO2, 2),
2333 MSM_RPM_MAP(LDO3_0, LDO3, 2),
2334 MSM_RPM_MAP(LDO4_0, LDO4, 2),
2335 MSM_RPM_MAP(LDO5_0, LDO5, 2),
2336 MSM_RPM_MAP(LDO6_0, LDO6, 2),
2337 MSM_RPM_MAP(LDO7_0, LDO7, 2),
2338 MSM_RPM_MAP(LDO8_0, LDO8, 2),
2339 MSM_RPM_MAP(LDO9_0, LDO9, 2),
2340 MSM_RPM_MAP(LDO10_0, LDO10, 2),
2341 MSM_RPM_MAP(LDO11_0, LDO11, 2),
2342 MSM_RPM_MAP(LDO12_0, LDO12, 2),
2343 MSM_RPM_MAP(LDO13_0, LDO13, 2),
2344 MSM_RPM_MAP(LDO14_0, LDO14, 2),
2345 MSM_RPM_MAP(LDO15_0, LDO15, 2),
2346 MSM_RPM_MAP(LDO16_0, LDO16, 2),
2347 MSM_RPM_MAP(LDO17_0, LDO17, 2),
2348 MSM_RPM_MAP(LDO18_0, LDO18, 2),
2349 MSM_RPM_MAP(LDO19_0, LDO19, 2),
2350 MSM_RPM_MAP(LDO20_0, LDO20, 2),
2351 MSM_RPM_MAP(LDO21_0, LDO21, 2),
2352 MSM_RPM_MAP(LDO22_0, LDO22, 2),
2353 MSM_RPM_MAP(LDO23_0, LDO23, 2),
2354 MSM_RPM_MAP(LDO24_0, LDO24, 2),
2355 MSM_RPM_MAP(LDO25_0, LDO25, 2),
2356 MSM_RPM_MAP(LVS0, LVS0, 1),
2357 MSM_RPM_MAP(LVS1, LVS1, 1),
2358 MSM_RPM_MAP(NCP_0, NCP, 2),
2359
2360 MSM_RPM_MAP(CXO_BUFFERS, CXO_BUFFERS, 1),
2361};
2362unsigned int rpm_map_data_size = ARRAY_SIZE(rpm_map_data);
2363
2364#endif