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