blob: c6f1cce545b61eac9de34c12a3b2d4656ede2389 [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,
666#ifdef CONFIG_MSM_BUS_SCALING
667 .nap_allowed = true,
668 .idle_pass = true,
669#endif
670 },
671 .clk = {
672 .name = {
673 .clk = "gfx3d_clk",
674 .pclk = "gfx3d_pclk",
675 },
676#ifdef CONFIG_MSM_BUS_SCALING
677 .bus_scale_table = &grp3d_bus_scale_pdata,
678#endif
679 },
680 .imem_clk_name = {
681 .clk = NULL,
682 .pclk = "imem_pclk",
683 },
684};
685
686struct platform_device msm_kgsl_3d0 = {
687 .name = "kgsl-3d0",
688 .id = 0,
689 .num_resources = ARRAY_SIZE(kgsl_3d0_resources),
690 .resource = kgsl_3d0_resources,
691 .dev = {
692 .platform_data = &kgsl_3d0_pdata,
693 },
694};
695
696static struct resource kgsl_2d0_resources[] = {
697 {
698 .name = KGSL_2D0_REG_MEMORY,
699 .start = 0x04100000, /* Z180 base address */
700 .end = 0x04100FFF,
701 .flags = IORESOURCE_MEM,
702 },
703 {
704 .name = KGSL_2D0_IRQ,
705 .start = GFX2D0_IRQ,
706 .end = GFX2D0_IRQ,
707 .flags = IORESOURCE_IRQ,
708 },
709};
710
711static struct kgsl_device_platform_data kgsl_2d0_pdata = {
712 .pwr_data = {
713 .pwrlevel = {
714 {
715 .gpu_freq = 200000000,
716 .bus_freq = 1,
717 },
718 {
719 .gpu_freq = 200000000,
720 .bus_freq = 0,
721 },
722 },
723 .init_level = 0,
724 .num_levels = 2,
725 .set_grp_async = NULL,
726 .idle_timeout = HZ/10,
727#ifdef CONFIG_MSM_BUS_SCALING
728 .nap_allowed = true,
729#endif
730 },
731 .clk = {
732 .name = {
733 /* note: 2d clocks disabled on v1 */
734 .clk = "gfx2d0_clk",
735 .pclk = "gfx2d0_pclk",
736 },
737#ifdef CONFIG_MSM_BUS_SCALING
738 .bus_scale_table = &grp2d0_bus_scale_pdata,
739#endif
740 },
741};
742
743struct platform_device msm_kgsl_2d0 = {
744 .name = "kgsl-2d0",
745 .id = 0,
746 .num_resources = ARRAY_SIZE(kgsl_2d0_resources),
747 .resource = kgsl_2d0_resources,
748 .dev = {
749 .platform_data = &kgsl_2d0_pdata,
750 },
751};
752
753static struct resource kgsl_2d1_resources[] = {
754 {
755 .name = KGSL_2D1_REG_MEMORY,
756 .start = 0x04200000, /* Z180 device 1 base address */
757 .end = 0x04200FFF,
758 .flags = IORESOURCE_MEM,
759 },
760 {
761 .name = KGSL_2D1_IRQ,
762 .start = GFX2D1_IRQ,
763 .end = GFX2D1_IRQ,
764 .flags = IORESOURCE_IRQ,
765 },
766};
767
768static struct kgsl_device_platform_data kgsl_2d1_pdata = {
769 .pwr_data = {
770 .pwrlevel = {
771 {
772 .gpu_freq = 200000000,
773 .bus_freq = 1,
774 },
775 {
776 .gpu_freq = 200000000,
777 .bus_freq = 0,
778 },
779 },
780 .init_level = 0,
781 .num_levels = 2,
782 .set_grp_async = NULL,
783 .idle_timeout = HZ/10,
784#ifdef CONFIG_MSM_BUS_SCALING
785 .nap_allowed = true,
786#endif
787 },
788 .clk = {
789 .name = {
790 .clk = "gfx2d1_clk",
791 .pclk = "gfx2d1_pclk",
792 },
793#ifdef CONFIG_MSM_BUS_SCALING
794 .bus_scale_table = &grp2d1_bus_scale_pdata,
795#endif
796 },
797};
798
799struct platform_device msm_kgsl_2d1 = {
800 .name = "kgsl-2d1",
801 .id = 1,
802 .num_resources = ARRAY_SIZE(kgsl_2d1_resources),
803 .resource = kgsl_2d1_resources,
804 .dev = {
805 .platform_data = &kgsl_2d1_pdata,
806 },
807};
808
809/*
810 * this a software workaround for not having two distinct board
811 * files for 8660v1 and 8660v2. 8660v1 has a faulty 2d clock, and
812 * this workaround detects the cpu version to tell if the kernel is on a
813 * 8660v1, and should disable the 2d core. it is called from the board file
814 */
815void __init msm8x60_check_2d_hardware(void)
816{
817 if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 1) &&
818 (SOCINFO_VERSION_MINOR(socinfo_get_version()) == 0)) {
819 printk(KERN_WARNING "kgsl: 2D cores disabled on 8660v1\n");
820 kgsl_2d0_pdata.clk.name.clk = NULL;
821 kgsl_2d1_pdata.clk.name.clk = NULL;
822 }
823}
824
825/* Use GSBI3 QUP for /dev/i2c-0 */
826struct platform_device msm_gsbi3_qup_i2c_device = {
827 .name = "qup_i2c",
828 .id = MSM_GSBI3_QUP_I2C_BUS_ID,
829 .num_resources = ARRAY_SIZE(gsbi3_qup_i2c_resources),
830 .resource = gsbi3_qup_i2c_resources,
831};
832
833/* Use GSBI4 QUP for /dev/i2c-1 */
834struct platform_device msm_gsbi4_qup_i2c_device = {
835 .name = "qup_i2c",
836 .id = MSM_GSBI4_QUP_I2C_BUS_ID,
837 .num_resources = ARRAY_SIZE(gsbi4_qup_i2c_resources),
838 .resource = gsbi4_qup_i2c_resources,
839};
840
841/* Use GSBI8 QUP for /dev/i2c-3 */
842struct platform_device msm_gsbi8_qup_i2c_device = {
843 .name = "qup_i2c",
844 .id = MSM_GSBI8_QUP_I2C_BUS_ID,
845 .num_resources = ARRAY_SIZE(gsbi8_qup_i2c_resources),
846 .resource = gsbi8_qup_i2c_resources,
847};
848
849/* Use GSBI9 QUP for /dev/i2c-2 */
850struct platform_device msm_gsbi9_qup_i2c_device = {
851 .name = "qup_i2c",
852 .id = MSM_GSBI9_QUP_I2C_BUS_ID,
853 .num_resources = ARRAY_SIZE(gsbi9_qup_i2c_resources),
854 .resource = gsbi9_qup_i2c_resources,
855};
856
857/* Use GSBI7 QUP for /dev/i2c-4 (Marimba) */
858struct platform_device msm_gsbi7_qup_i2c_device = {
859 .name = "qup_i2c",
860 .id = MSM_GSBI7_QUP_I2C_BUS_ID,
861 .num_resources = ARRAY_SIZE(gsbi7_qup_i2c_resources),
862 .resource = gsbi7_qup_i2c_resources,
863};
864
865/* Use GSBI12 QUP for /dev/i2c-5 (Sensors) */
866struct platform_device msm_gsbi12_qup_i2c_device = {
867 .name = "qup_i2c",
868 .id = MSM_GSBI12_QUP_I2C_BUS_ID,
869 .num_resources = ARRAY_SIZE(gsbi12_qup_i2c_resources),
870 .resource = gsbi12_qup_i2c_resources,
871};
872
873#ifdef CONFIG_I2C_SSBI
874/* 8058 PMIC SSBI on /dev/i2c-6 */
875#define MSM_SSBI1_PMIC1C_PHYS 0x00500000
876static struct resource msm_ssbi1_resources[] = {
877 {
878 .name = "ssbi_base",
879 .start = MSM_SSBI1_PMIC1C_PHYS,
880 .end = MSM_SSBI1_PMIC1C_PHYS + SZ_4K - 1,
881 .flags = IORESOURCE_MEM,
882 },
883};
884
885struct platform_device msm_device_ssbi1 = {
886 .name = "i2c_ssbi",
887 .id = MSM_SSBI1_I2C_BUS_ID,
888 .num_resources = ARRAY_SIZE(msm_ssbi1_resources),
889 .resource = msm_ssbi1_resources,
890};
891
892/* 8901 PMIC SSBI on /dev/i2c-7 */
893#define MSM_SSBI2_PMIC2B_PHYS 0x00C00000
894static struct resource msm_ssbi2_resources[] = {
895 {
896 .name = "ssbi_base",
897 .start = MSM_SSBI2_PMIC2B_PHYS,
898 .end = MSM_SSBI2_PMIC2B_PHYS + SZ_4K - 1,
899 .flags = IORESOURCE_MEM,
900 },
901};
902
903struct platform_device msm_device_ssbi2 = {
904 .name = "i2c_ssbi",
905 .id = MSM_SSBI2_I2C_BUS_ID,
906 .num_resources = ARRAY_SIZE(msm_ssbi2_resources),
907 .resource = msm_ssbi2_resources,
908};
909
910/* CODEC SSBI on /dev/i2c-8 */
911#define MSM_SSBI3_PHYS 0x18700000
912static struct resource msm_ssbi3_resources[] = {
913 {
914 .name = "ssbi_base",
915 .start = MSM_SSBI3_PHYS,
916 .end = MSM_SSBI3_PHYS + SZ_4K - 1,
917 .flags = IORESOURCE_MEM,
918 },
919};
920
921struct platform_device msm_device_ssbi3 = {
922 .name = "i2c_ssbi",
923 .id = MSM_SSBI3_I2C_BUS_ID,
924 .num_resources = ARRAY_SIZE(msm_ssbi3_resources),
925 .resource = msm_ssbi3_resources,
926};
927#endif /* CONFIG_I2C_SSBI */
928
929static struct resource gsbi1_qup_spi_resources[] = {
930 {
931 .name = "spi_base",
932 .start = MSM_GSBI1_QUP_PHYS,
933 .end = MSM_GSBI1_QUP_PHYS + SZ_4K - 1,
934 .flags = IORESOURCE_MEM,
935 },
936 {
937 .name = "gsbi_base",
938 .start = MSM_GSBI1_PHYS,
939 .end = MSM_GSBI1_PHYS + 4 - 1,
940 .flags = IORESOURCE_MEM,
941 },
942 {
943 .name = "spi_irq_in",
944 .start = GSBI1_QUP_IRQ,
945 .end = GSBI1_QUP_IRQ,
946 .flags = IORESOURCE_IRQ,
947 },
948 {
949 .name = "spidm_channels",
950 .start = 5,
951 .end = 6,
952 .flags = IORESOURCE_DMA,
953 },
954 {
955 .name = "spidm_crci",
956 .start = 8,
957 .end = 7,
958 .flags = IORESOURCE_DMA,
959 },
960 {
961 .name = "spi_clk",
962 .start = 36,
963 .end = 36,
964 .flags = IORESOURCE_IO,
965 },
966 {
967 .name = "spi_cs",
968 .start = 35,
969 .end = 35,
970 .flags = IORESOURCE_IO,
971 },
972 {
973 .name = "spi_miso",
974 .start = 34,
975 .end = 34,
976 .flags = IORESOURCE_IO,
977 },
978 {
979 .name = "spi_mosi",
980 .start = 33,
981 .end = 33,
982 .flags = IORESOURCE_IO,
983 },
984};
985
986/* Use GSBI1 QUP for SPI-0 */
987struct platform_device msm_gsbi1_qup_spi_device = {
988 .name = "spi_qsd",
989 .id = 0,
990 .num_resources = ARRAY_SIZE(gsbi1_qup_spi_resources),
991 .resource = gsbi1_qup_spi_resources,
992};
993
994
995static struct resource gsbi10_qup_spi_resources[] = {
996 {
997 .name = "spi_base",
998 .start = MSM_GSBI10_QUP_PHYS,
999 .end = MSM_GSBI10_QUP_PHYS + SZ_4K - 1,
1000 .flags = IORESOURCE_MEM,
1001 },
1002 {
1003 .name = "gsbi_base",
1004 .start = MSM_GSBI10_PHYS,
1005 .end = MSM_GSBI10_PHYS + 4 - 1,
1006 .flags = IORESOURCE_MEM,
1007 },
1008 {
1009 .name = "spi_irq_in",
1010 .start = GSBI10_QUP_IRQ,
1011 .end = GSBI10_QUP_IRQ,
1012 .flags = IORESOURCE_IRQ,
1013 },
1014 {
1015 .name = "spi_clk",
1016 .start = 73,
1017 .end = 73,
1018 .flags = IORESOURCE_IO,
1019 },
1020 {
1021 .name = "spi_cs",
1022 .start = 72,
1023 .end = 72,
1024 .flags = IORESOURCE_IO,
1025 },
1026 {
1027 .name = "spi_mosi",
1028 .start = 70,
1029 .end = 70,
1030 .flags = IORESOURCE_IO,
1031 },
1032};
1033
1034/* Use GSBI10 QUP for SPI-1 */
1035struct platform_device msm_gsbi10_qup_spi_device = {
1036 .name = "spi_qsd",
1037 .id = 1,
1038 .num_resources = ARRAY_SIZE(gsbi10_qup_spi_resources),
1039 .resource = gsbi10_qup_spi_resources,
1040};
1041#define MSM_SDC1_BASE 0x12400000
1042#define MSM_SDC1_DML_BASE (MSM_SDC1_BASE + 0x800)
1043#define MSM_SDC1_BAM_BASE (MSM_SDC1_BASE + 0x2000)
1044#define MSM_SDC2_BASE 0x12140000
1045#define MSM_SDC2_DML_BASE (MSM_SDC2_BASE + 0x800)
1046#define MSM_SDC2_BAM_BASE (MSM_SDC2_BASE + 0x2000)
1047#define MSM_SDC3_BASE 0x12180000
1048#define MSM_SDC3_DML_BASE (MSM_SDC3_BASE + 0x800)
1049#define MSM_SDC3_BAM_BASE (MSM_SDC3_BASE + 0x2000)
1050#define MSM_SDC4_BASE 0x121C0000
1051#define MSM_SDC4_DML_BASE (MSM_SDC4_BASE + 0x800)
1052#define MSM_SDC4_BAM_BASE (MSM_SDC4_BASE + 0x2000)
1053#define MSM_SDC5_BASE 0x12200000
1054#define MSM_SDC5_DML_BASE (MSM_SDC5_BASE + 0x800)
1055#define MSM_SDC5_BAM_BASE (MSM_SDC5_BASE + 0x2000)
1056
1057static struct resource resources_sdc1[] = {
1058 {
1059 .start = MSM_SDC1_BASE,
1060 .end = MSM_SDC1_DML_BASE - 1,
1061 .flags = IORESOURCE_MEM,
1062 },
1063 {
1064 .start = SDC1_IRQ_0,
1065 .end = SDC1_IRQ_0,
1066 .flags = IORESOURCE_IRQ,
1067 },
1068#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1069 {
1070 .name = "sdcc_dml_addr",
1071 .start = MSM_SDC1_DML_BASE,
1072 .end = MSM_SDC1_BAM_BASE - 1,
1073 .flags = IORESOURCE_MEM,
1074 },
1075 {
1076 .name = "sdcc_bam_addr",
1077 .start = MSM_SDC1_BAM_BASE,
1078 .end = MSM_SDC1_BAM_BASE + (2 * SZ_4K) - 1,
1079 .flags = IORESOURCE_MEM,
1080 },
1081 {
1082 .name = "sdcc_bam_irq",
1083 .start = SDC1_BAM_IRQ,
1084 .end = SDC1_BAM_IRQ,
1085 .flags = IORESOURCE_IRQ,
1086 },
1087#else
1088 {
1089 .start = DMOV_SDC1_CHAN,
1090 .end = DMOV_SDC1_CHAN,
1091 .flags = IORESOURCE_DMA,
1092 },
1093#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 {
1128 .start = DMOV_SDC2_CHAN,
1129 .end = DMOV_SDC2_CHAN,
1130 .flags = IORESOURCE_DMA,
1131 },
1132#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1133};
1134
1135static struct resource resources_sdc3[] = {
1136 {
1137 .start = MSM_SDC3_BASE,
1138 .end = MSM_SDC3_DML_BASE - 1,
1139 .flags = IORESOURCE_MEM,
1140 },
1141 {
1142 .start = SDC3_IRQ_0,
1143 .end = SDC3_IRQ_0,
1144 .flags = IORESOURCE_IRQ,
1145 },
1146#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1147 {
1148 .name = "sdcc_dml_addr",
1149 .start = MSM_SDC3_DML_BASE,
1150 .end = MSM_SDC3_BAM_BASE - 1,
1151 .flags = IORESOURCE_MEM,
1152 },
1153 {
1154 .name = "sdcc_bam_addr",
1155 .start = MSM_SDC3_BAM_BASE,
1156 .end = MSM_SDC3_BAM_BASE + (2 * SZ_4K) - 1,
1157 .flags = IORESOURCE_MEM,
1158 },
1159 {
1160 .name = "sdcc_bam_irq",
1161 .start = SDC3_BAM_IRQ,
1162 .end = SDC3_BAM_IRQ,
1163 .flags = IORESOURCE_IRQ,
1164 },
1165#else
1166 {
1167 .start = DMOV_SDC3_CHAN,
1168 .end = DMOV_SDC3_CHAN,
1169 .flags = IORESOURCE_DMA,
1170 },
1171#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1172};
1173
1174static struct resource resources_sdc4[] = {
1175 {
1176 .start = MSM_SDC4_BASE,
1177 .end = MSM_SDC4_DML_BASE - 1,
1178 .flags = IORESOURCE_MEM,
1179 },
1180 {
1181 .start = SDC4_IRQ_0,
1182 .end = SDC4_IRQ_0,
1183 .flags = IORESOURCE_IRQ,
1184 },
1185#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1186 {
1187 .name = "sdcc_dml_addr",
1188 .start = MSM_SDC4_DML_BASE,
1189 .end = MSM_SDC4_BAM_BASE - 1,
1190 .flags = IORESOURCE_MEM,
1191 },
1192 {
1193 .name = "sdcc_bam_addr",
1194 .start = MSM_SDC4_BAM_BASE,
1195 .end = MSM_SDC4_BAM_BASE + (2 * SZ_4K) - 1,
1196 .flags = IORESOURCE_MEM,
1197 },
1198 {
1199 .name = "sdcc_bam_irq",
1200 .start = SDC4_BAM_IRQ,
1201 .end = SDC4_BAM_IRQ,
1202 .flags = IORESOURCE_IRQ,
1203 },
1204#else
1205 {
1206 .start = DMOV_SDC4_CHAN,
1207 .end = DMOV_SDC4_CHAN,
1208 .flags = IORESOURCE_DMA,
1209 },
1210#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1211};
1212
1213static struct resource resources_sdc5[] = {
1214 {
1215 .start = MSM_SDC5_BASE,
1216 .end = MSM_SDC5_DML_BASE - 1,
1217 .flags = IORESOURCE_MEM,
1218 },
1219 {
1220 .start = SDC5_IRQ_0,
1221 .end = SDC5_IRQ_0,
1222 .flags = IORESOURCE_IRQ,
1223 },
1224#ifdef CONFIG_MMC_MSM_SPS_SUPPORT
1225 {
1226 .name = "sdcc_dml_addr",
1227 .start = MSM_SDC5_DML_BASE,
1228 .end = MSM_SDC5_BAM_BASE - 1,
1229 .flags = IORESOURCE_MEM,
1230 },
1231 {
1232 .name = "sdcc_bam_addr",
1233 .start = MSM_SDC5_BAM_BASE,
1234 .end = MSM_SDC5_BAM_BASE + (2 * SZ_4K) - 1,
1235 .flags = IORESOURCE_MEM,
1236 },
1237 {
1238 .name = "sdcc_bam_irq",
1239 .start = SDC5_BAM_IRQ,
1240 .end = SDC5_BAM_IRQ,
1241 .flags = IORESOURCE_IRQ,
1242 },
1243#else
1244 {
1245 .start = DMOV_SDC5_CHAN,
1246 .end = DMOV_SDC5_CHAN,
1247 .flags = IORESOURCE_DMA,
1248 },
1249#endif /* CONFIG_MMC_MSM_SPS_SUPPORT */
1250};
1251
1252struct platform_device msm_device_sdc1 = {
1253 .name = "msm_sdcc",
1254 .id = 1,
1255 .num_resources = ARRAY_SIZE(resources_sdc1),
1256 .resource = resources_sdc1,
1257 .dev = {
1258 .coherent_dma_mask = 0xffffffff,
1259 },
1260};
1261
1262struct platform_device msm_device_sdc2 = {
1263 .name = "msm_sdcc",
1264 .id = 2,
1265 .num_resources = ARRAY_SIZE(resources_sdc2),
1266 .resource = resources_sdc2,
1267 .dev = {
1268 .coherent_dma_mask = 0xffffffff,
1269 },
1270};
1271
1272struct platform_device msm_device_sdc3 = {
1273 .name = "msm_sdcc",
1274 .id = 3,
1275 .num_resources = ARRAY_SIZE(resources_sdc3),
1276 .resource = resources_sdc3,
1277 .dev = {
1278 .coherent_dma_mask = 0xffffffff,
1279 },
1280};
1281
1282struct platform_device msm_device_sdc4 = {
1283 .name = "msm_sdcc",
1284 .id = 4,
1285 .num_resources = ARRAY_SIZE(resources_sdc4),
1286 .resource = resources_sdc4,
1287 .dev = {
1288 .coherent_dma_mask = 0xffffffff,
1289 },
1290};
1291
1292struct platform_device msm_device_sdc5 = {
1293 .name = "msm_sdcc",
1294 .id = 5,
1295 .num_resources = ARRAY_SIZE(resources_sdc5),
1296 .resource = resources_sdc5,
1297 .dev = {
1298 .coherent_dma_mask = 0xffffffff,
1299 },
1300};
1301
1302static struct platform_device *msm_sdcc_devices[] __initdata = {
1303 &msm_device_sdc1,
1304 &msm_device_sdc2,
1305 &msm_device_sdc3,
1306 &msm_device_sdc4,
1307 &msm_device_sdc5,
1308};
1309
1310int __init msm_add_sdcc(unsigned int controller, struct mmc_platform_data *plat)
1311{
1312 struct platform_device *pdev;
1313
1314 if (controller < 1 || controller > 5)
1315 return -EINVAL;
1316
1317 pdev = msm_sdcc_devices[controller-1];
1318 pdev->dev.platform_data = plat;
1319 return platform_device_register(pdev);
1320}
1321
1322#define MIPI_DSI_HW_BASE 0x04700000
1323#define ROTATOR_HW_BASE 0x04E00000
1324#define TVENC_HW_BASE 0x04F00000
1325#define MDP_HW_BASE 0x05100000
1326
1327static struct resource msm_mipi_dsi_resources[] = {
1328 {
1329 .name = "mipi_dsi",
1330 .start = MIPI_DSI_HW_BASE,
1331 .end = MIPI_DSI_HW_BASE + 0x000F0000 - 1,
1332 .flags = IORESOURCE_MEM,
1333 },
1334 {
1335 .start = DSI_IRQ,
1336 .end = DSI_IRQ,
1337 .flags = IORESOURCE_IRQ,
1338 },
1339};
1340
1341static struct platform_device msm_mipi_dsi_device = {
1342 .name = "mipi_dsi",
1343 .id = 1,
1344 .num_resources = ARRAY_SIZE(msm_mipi_dsi_resources),
1345 .resource = msm_mipi_dsi_resources,
1346};
1347
1348static struct resource msm_mdp_resources[] = {
1349 {
1350 .name = "mdp",
1351 .start = MDP_HW_BASE,
1352 .end = MDP_HW_BASE + 0x000F0000 - 1,
1353 .flags = IORESOURCE_MEM,
1354 },
1355 {
1356 .start = INT_MDP,
1357 .end = INT_MDP,
1358 .flags = IORESOURCE_IRQ,
1359 },
1360};
1361
1362static struct platform_device msm_mdp_device = {
1363 .name = "mdp",
1364 .id = 0,
1365 .num_resources = ARRAY_SIZE(msm_mdp_resources),
1366 .resource = msm_mdp_resources,
1367};
1368#ifdef CONFIG_MSM_ROTATOR
1369static struct resource resources_msm_rotator[] = {
1370 {
1371 .start = 0x04E00000,
1372 .end = 0x04F00000 - 1,
1373 .flags = IORESOURCE_MEM,
1374 },
1375 {
1376 .start = ROT_IRQ,
1377 .end = ROT_IRQ,
1378 .flags = IORESOURCE_IRQ,
1379 },
1380};
1381
1382static struct msm_rot_clocks rotator_clocks[] = {
1383 {
1384 .clk_name = "rot_clk",
1385 .clk_type = ROTATOR_CORE_CLK,
1386 .clk_rate = 160 * 1000 * 1000,
1387 },
1388 {
1389 .clk_name = "rotator_pclk",
1390 .clk_type = ROTATOR_PCLK,
1391 .clk_rate = 0,
1392 },
1393};
1394
1395static struct msm_rotator_platform_data rotator_pdata = {
1396 .number_of_clocks = ARRAY_SIZE(rotator_clocks),
1397 .hardware_version_number = 0x01010307,
1398 .rotator_clks = rotator_clocks,
1399 .regulator_name = "fs_rot",
1400};
1401
1402struct platform_device msm_rotator_device = {
1403 .name = "msm_rotator",
1404 .id = 0,
1405 .num_resources = ARRAY_SIZE(resources_msm_rotator),
1406 .resource = resources_msm_rotator,
1407 .dev = {
1408 .platform_data = &rotator_pdata,
1409 },
1410};
1411#endif
1412
1413
1414/* Sensors DSPS platform data */
1415#ifdef CONFIG_MSM_DSPS
1416
1417#define PPSS_REG_PHYS_BASE 0x12080000
1418
1419#define MHZ (1000*1000)
1420
1421static struct dsps_clk_info dsps_clks[] = {
1422 {
1423 .name = "ppss_pclk",
1424 .rate = 0, /* no rate just on/off */
1425 },
1426 {
1427 .name = "pmem_clk",
1428 .rate = 0, /* no rate just on/off */
1429 },
1430 {
1431 .name = "gsbi_qup_clk",
1432 .rate = 24 * MHZ, /* See clk_tbl_gsbi_qup[] */
1433 },
1434 {
1435 .name = "dfab_dsps_clk",
1436 .rate = 64 * MHZ, /* Same rate as USB. */
1437 }
1438};
1439
1440static struct dsps_regulator_info dsps_regs[] = {
1441 {
1442 .name = "8058_l5",
1443 .volt = 2850000, /* in uV */
1444 },
1445 {
1446 .name = "8058_s3",
1447 .volt = 1800000, /* in uV */
1448 }
1449};
1450
1451/*
1452 * Note: GPIOs field is intialized in run-time at the function
1453 * msm8x60_init_dsps().
1454 */
1455
1456struct msm_dsps_platform_data msm_dsps_pdata = {
1457 .clks = dsps_clks,
1458 .clks_num = ARRAY_SIZE(dsps_clks),
1459 .gpios = NULL,
1460 .gpios_num = 0,
1461 .regs = dsps_regs,
1462 .regs_num = ARRAY_SIZE(dsps_regs),
1463 .signature = DSPS_SIGNATURE,
1464};
1465
1466static struct resource msm_dsps_resources[] = {
1467 {
1468 .start = PPSS_REG_PHYS_BASE,
1469 .end = PPSS_REG_PHYS_BASE + SZ_8K - 1,
1470 .name = "ppss_reg",
1471 .flags = IORESOURCE_MEM,
1472 },
1473};
1474
1475struct platform_device msm_dsps_device = {
1476 .name = "msm_dsps",
1477 .id = 0,
1478 .num_resources = ARRAY_SIZE(msm_dsps_resources),
1479 .resource = msm_dsps_resources,
1480 .dev.platform_data = &msm_dsps_pdata,
1481};
1482
1483#endif /* CONFIG_MSM_DSPS */
1484
1485#ifdef CONFIG_FB_MSM_TVOUT
1486static struct resource msm_tvenc_resources[] = {
1487 {
1488 .name = "tvenc",
1489 .start = TVENC_HW_BASE,
1490 .end = TVENC_HW_BASE + PAGE_SIZE - 1,
1491 .flags = IORESOURCE_MEM,
1492 }
1493};
1494
1495static struct resource tvout_device_resources[] = {
1496 {
1497 .name = "tvout_device_irq",
1498 .start = TV_ENC_IRQ,
1499 .end = TV_ENC_IRQ,
1500 .flags = IORESOURCE_IRQ,
1501 },
1502};
1503#endif
1504static void __init msm_register_device(struct platform_device *pdev, void *data)
1505{
1506 int ret;
1507
1508 pdev->dev.platform_data = data;
1509
1510 ret = platform_device_register(pdev);
1511 if (ret)
1512 dev_err(&pdev->dev,
1513 "%s: platform_device_register() failed = %d\n",
1514 __func__, ret);
1515}
1516
1517static struct platform_device msm_lcdc_device = {
1518 .name = "lcdc",
1519 .id = 0,
1520};
1521
1522#ifdef CONFIG_FB_MSM_TVOUT
1523static struct platform_device msm_tvenc_device = {
1524 .name = "tvenc",
1525 .id = 0,
1526 .num_resources = ARRAY_SIZE(msm_tvenc_resources),
1527 .resource = msm_tvenc_resources,
1528};
1529
1530static struct platform_device msm_tvout_device = {
1531 .name = "tvout_device",
1532 .id = 0,
1533 .num_resources = ARRAY_SIZE(tvout_device_resources),
1534 .resource = tvout_device_resources,
1535};
1536#endif
1537
1538#ifdef CONFIG_MSM_BUS_SCALING
1539static struct platform_device msm_dtv_device = {
1540 .name = "dtv",
1541 .id = 0,
1542};
1543#endif
1544
1545void __init msm_fb_register_device(char *name, void *data)
1546{
1547 if (!strncmp(name, "mdp", 3))
1548 msm_register_device(&msm_mdp_device, data);
1549 else if (!strncmp(name, "lcdc", 4))
1550 msm_register_device(&msm_lcdc_device, data);
1551 else if (!strncmp(name, "mipi_dsi", 8))
1552 msm_register_device(&msm_mipi_dsi_device, data);
1553#ifdef CONFIG_FB_MSM_TVOUT
1554 else if (!strncmp(name, "tvenc", 5))
1555 msm_register_device(&msm_tvenc_device, data);
1556 else if (!strncmp(name, "tvout_device", 12))
1557 msm_register_device(&msm_tvout_device, data);
1558#endif
1559#ifdef CONFIG_MSM_BUS_SCALING
1560 else if (!strncmp(name, "dtv", 3))
1561 msm_register_device(&msm_dtv_device, data);
1562#endif
1563 else
1564 printk(KERN_ERR "%s: unknown device! %s\n", __func__, name);
1565}
1566
1567static struct resource resources_otg[] = {
1568 {
1569 .start = 0x12500000,
1570 .end = 0x12500000 + SZ_1K - 1,
1571 .flags = IORESOURCE_MEM,
1572 },
1573 {
1574 .start = USB1_HS_IRQ,
1575 .end = USB1_HS_IRQ,
1576 .flags = IORESOURCE_IRQ,
1577 },
1578};
1579
1580struct platform_device msm_device_otg = {
1581 .name = "msm_otg",
1582 .id = -1,
1583 .num_resources = ARRAY_SIZE(resources_otg),
1584 .resource = resources_otg,
1585};
1586
1587static u64 dma_mask = 0xffffffffULL;
1588struct platform_device msm_device_gadget_peripheral = {
1589 .name = "msm_hsusb",
1590 .id = -1,
1591 .dev = {
1592 .dma_mask = &dma_mask,
1593 .coherent_dma_mask = 0xffffffffULL,
1594 },
1595};
1596#ifdef CONFIG_USB_EHCI_MSM_72K
1597static struct resource resources_hsusb_host[] = {
1598 {
1599 .start = 0x12500000,
1600 .end = 0x12500000 + SZ_1K - 1,
1601 .flags = IORESOURCE_MEM,
1602 },
1603 {
1604 .start = USB1_HS_IRQ,
1605 .end = USB1_HS_IRQ,
1606 .flags = IORESOURCE_IRQ,
1607 },
1608};
1609
1610struct platform_device msm_device_hsusb_host = {
1611 .name = "msm_hsusb_host",
1612 .id = 0,
1613 .num_resources = ARRAY_SIZE(resources_hsusb_host),
1614 .resource = resources_hsusb_host,
1615 .dev = {
1616 .dma_mask = &dma_mask,
1617 .coherent_dma_mask = 0xffffffffULL,
1618 },
1619};
1620
1621static struct platform_device *msm_host_devices[] = {
1622 &msm_device_hsusb_host,
1623};
1624
1625int msm_add_host(unsigned int host, struct msm_usb_host_platform_data *plat)
1626{
1627 struct platform_device *pdev;
1628
1629 pdev = msm_host_devices[host];
1630 if (!pdev)
1631 return -ENODEV;
1632 pdev->dev.platform_data = plat;
1633 return platform_device_register(pdev);
1634}
1635#endif
1636
1637#define MSM_TSIF0_PHYS (0x18200000)
1638#define MSM_TSIF1_PHYS (0x18201000)
1639#define MSM_TSIF_SIZE (0x200)
1640#define TCSR_ADM_0_A_CRCI_MUX_SEL 0x0070
1641
1642#define TSIF_0_CLK GPIO_CFG(93, 1, GPIO_CFG_INPUT, \
1643 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1644#define TSIF_0_EN GPIO_CFG(94, 1, GPIO_CFG_INPUT, \
1645 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1646#define TSIF_0_DATA GPIO_CFG(95, 1, GPIO_CFG_INPUT, \
1647 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1648#define TSIF_0_SYNC GPIO_CFG(96, 1, GPIO_CFG_INPUT, \
1649 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1650#define TSIF_1_CLK GPIO_CFG(97, 1, GPIO_CFG_INPUT, \
1651 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1652#define TSIF_1_EN GPIO_CFG(98, 1, GPIO_CFG_INPUT, \
1653 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1654#define TSIF_1_DATA GPIO_CFG(99, 1, GPIO_CFG_INPUT, \
1655 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1656#define TSIF_1_SYNC GPIO_CFG(100, 1, GPIO_CFG_INPUT, \
1657 GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA)
1658
1659static const struct msm_gpio tsif0_gpios[] = {
1660 { .gpio_cfg = TSIF_0_CLK, .label = "tsif_clk", },
1661 { .gpio_cfg = TSIF_0_EN, .label = "tsif_en", },
1662 { .gpio_cfg = TSIF_0_DATA, .label = "tsif_data", },
1663 { .gpio_cfg = TSIF_0_SYNC, .label = "tsif_sync", },
1664};
1665
1666static const struct msm_gpio tsif1_gpios[] = {
1667 { .gpio_cfg = TSIF_1_CLK, .label = "tsif_clk", },
1668 { .gpio_cfg = TSIF_1_EN, .label = "tsif_en", },
1669 { .gpio_cfg = TSIF_1_DATA, .label = "tsif_data", },
1670 { .gpio_cfg = TSIF_1_SYNC, .label = "tsif_sync", },
1671};
1672
1673static void tsif_release(struct device *dev)
1674{
1675}
1676
1677static void tsif_init1(struct msm_tsif_platform_data *data)
1678{
1679 int val;
1680
1681 /* configure mux to use correct tsif instance */
1682 val = secure_readl(MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1683 val |= 0x80000000;
1684 secure_writel(val, MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1685}
1686
1687struct msm_tsif_platform_data tsif1_platform_data = {
1688 .num_gpios = ARRAY_SIZE(tsif1_gpios),
1689 .gpios = tsif1_gpios,
1690 .tsif_pclk = "tsif_pclk",
1691 .tsif_ref_clk = "tsif_ref_clk",
1692 .init = tsif_init1
1693};
1694
1695struct resource tsif1_resources[] = {
1696 [0] = {
1697 .flags = IORESOURCE_IRQ,
1698 .start = TSIF2_IRQ,
1699 .end = TSIF2_IRQ,
1700 },
1701 [1] = {
1702 .flags = IORESOURCE_MEM,
1703 .start = MSM_TSIF1_PHYS,
1704 .end = MSM_TSIF1_PHYS + MSM_TSIF_SIZE - 1,
1705 },
1706 [2] = {
1707 .flags = IORESOURCE_DMA,
1708 .start = DMOV_TSIF_CHAN,
1709 .end = DMOV_TSIF_CRCI,
1710 },
1711};
1712
1713static void tsif_init0(struct msm_tsif_platform_data *data)
1714{
1715 int val;
1716
1717 /* configure mux to use correct tsif instance */
1718 val = secure_readl(MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1719 val &= 0x7FFFFFFF;
1720 secure_writel(val, MSM_TCSR_BASE + TCSR_ADM_0_A_CRCI_MUX_SEL);
1721}
1722
1723struct msm_tsif_platform_data tsif0_platform_data = {
1724 .num_gpios = ARRAY_SIZE(tsif0_gpios),
1725 .gpios = tsif0_gpios,
1726 .tsif_pclk = "tsif_pclk",
1727 .tsif_ref_clk = "tsif_ref_clk",
1728 .init = tsif_init0
1729};
1730struct resource tsif0_resources[] = {
1731 [0] = {
1732 .flags = IORESOURCE_IRQ,
1733 .start = TSIF1_IRQ,
1734 .end = TSIF1_IRQ,
1735 },
1736 [1] = {
1737 .flags = IORESOURCE_MEM,
1738 .start = MSM_TSIF0_PHYS,
1739 .end = MSM_TSIF0_PHYS + MSM_TSIF_SIZE - 1,
1740 },
1741 [2] = {
1742 .flags = IORESOURCE_DMA,
1743 .start = DMOV_TSIF_CHAN,
1744 .end = DMOV_TSIF_CRCI,
1745 },
1746};
1747
1748struct platform_device msm_device_tsif[2] = {
1749 {
1750 .name = "msm_tsif",
1751 .id = 0,
1752 .num_resources = ARRAY_SIZE(tsif0_resources),
1753 .resource = tsif0_resources,
1754 .dev = {
1755 .release = tsif_release,
1756 .platform_data = &tsif0_platform_data
1757 },
1758 },
1759 {
1760 .name = "msm_tsif",
1761 .id = 1,
1762 .num_resources = ARRAY_SIZE(tsif1_resources),
1763 .resource = tsif1_resources,
1764 .dev = {
1765 .release = tsif_release,
1766 .platform_data = &tsif1_platform_data
1767 },
1768 }
1769};
1770
1771struct platform_device msm_device_smd = {
1772 .name = "msm_smd",
1773 .id = -1,
1774};
1775
1776struct resource msm_dmov_resource_adm0[] = {
1777 {
1778 .start = INT_ADM0_AARM,
1779 .end = (resource_size_t)MSM_DMOV_ADM0_BASE,
1780 .flags = IORESOURCE_IRQ,
1781 },
1782};
1783
1784struct resource msm_dmov_resource_adm1[] = {
1785 {
1786 .start = INT_ADM1_AARM,
1787 .end = (resource_size_t)MSM_DMOV_ADM1_BASE,
1788 .flags = IORESOURCE_IRQ,
1789 },
1790};
1791
1792struct platform_device msm_device_dmov_adm0 = {
1793 .name = "msm_dmov",
1794 .id = 0,
1795 .resource = msm_dmov_resource_adm0,
1796 .num_resources = ARRAY_SIZE(msm_dmov_resource_adm0),
1797};
1798
1799struct platform_device msm_device_dmov_adm1 = {
1800 .name = "msm_dmov",
1801 .id = 1,
1802 .resource = msm_dmov_resource_adm1,
1803 .num_resources = ARRAY_SIZE(msm_dmov_resource_adm1),
1804};
1805
1806/* MSM Video core device */
1807#ifdef CONFIG_MSM_BUS_SCALING
1808static struct msm_bus_vectors vidc_init_vectors[] = {
1809 {
1810 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1811 .dst = MSM_BUS_SLAVE_SMI,
1812 .ab = 0,
1813 .ib = 0,
1814 },
1815 {
1816 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1817 .dst = MSM_BUS_SLAVE_SMI,
1818 .ab = 0,
1819 .ib = 0,
1820 },
1821 {
1822 .src = MSM_BUS_MASTER_AMPSS_M0,
1823 .dst = MSM_BUS_SLAVE_EBI_CH0,
1824 .ab = 0,
1825 .ib = 0,
1826 },
1827 {
1828 .src = MSM_BUS_MASTER_AMPSS_M0,
1829 .dst = MSM_BUS_SLAVE_SMI,
1830 .ab = 0,
1831 .ib = 0,
1832 },
1833};
1834static struct msm_bus_vectors vidc_venc_vga_vectors[] = {
1835 {
1836 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1837 .dst = MSM_BUS_SLAVE_SMI,
1838 .ab = 54525952,
1839 .ib = 436207616,
1840 },
1841 {
1842 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1843 .dst = MSM_BUS_SLAVE_SMI,
1844 .ab = 72351744,
1845 .ib = 289406976,
1846 },
1847 {
1848 .src = MSM_BUS_MASTER_AMPSS_M0,
1849 .dst = MSM_BUS_SLAVE_EBI_CH0,
1850 .ab = 500000,
1851 .ib = 1000000,
1852 },
1853 {
1854 .src = MSM_BUS_MASTER_AMPSS_M0,
1855 .dst = MSM_BUS_SLAVE_SMI,
1856 .ab = 500000,
1857 .ib = 1000000,
1858 },
1859};
1860static struct msm_bus_vectors vidc_vdec_vga_vectors[] = {
1861 {
1862 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1863 .dst = MSM_BUS_SLAVE_SMI,
1864 .ab = 40894464,
1865 .ib = 327155712,
1866 },
1867 {
1868 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1869 .dst = MSM_BUS_SLAVE_SMI,
1870 .ab = 48234496,
1871 .ib = 192937984,
1872 },
1873 {
1874 .src = MSM_BUS_MASTER_AMPSS_M0,
1875 .dst = MSM_BUS_SLAVE_EBI_CH0,
1876 .ab = 500000,
1877 .ib = 2000000,
1878 },
1879 {
1880 .src = MSM_BUS_MASTER_AMPSS_M0,
1881 .dst = MSM_BUS_SLAVE_SMI,
1882 .ab = 500000,
1883 .ib = 2000000,
1884 },
1885};
1886static struct msm_bus_vectors vidc_venc_720p_vectors[] = {
1887 {
1888 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1889 .dst = MSM_BUS_SLAVE_SMI,
1890 .ab = 163577856,
1891 .ib = 1308622848,
1892 },
1893 {
1894 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1895 .dst = MSM_BUS_SLAVE_SMI,
1896 .ab = 219152384,
1897 .ib = 876609536,
1898 },
1899 {
1900 .src = MSM_BUS_MASTER_AMPSS_M0,
1901 .dst = MSM_BUS_SLAVE_EBI_CH0,
1902 .ab = 1750000,
1903 .ib = 3500000,
1904 },
1905 {
1906 .src = MSM_BUS_MASTER_AMPSS_M0,
1907 .dst = MSM_BUS_SLAVE_SMI,
1908 .ab = 1750000,
1909 .ib = 3500000,
1910 },
1911};
1912static struct msm_bus_vectors vidc_vdec_720p_vectors[] = {
1913 {
1914 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1915 .dst = MSM_BUS_SLAVE_SMI,
1916 .ab = 121634816,
1917 .ib = 973078528,
1918 },
1919 {
1920 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1921 .dst = MSM_BUS_SLAVE_SMI,
1922 .ab = 155189248,
1923 .ib = 620756992,
1924 },
1925 {
1926 .src = MSM_BUS_MASTER_AMPSS_M0,
1927 .dst = MSM_BUS_SLAVE_EBI_CH0,
1928 .ab = 1750000,
1929 .ib = 7000000,
1930 },
1931 {
1932 .src = MSM_BUS_MASTER_AMPSS_M0,
1933 .dst = MSM_BUS_SLAVE_SMI,
1934 .ab = 1750000,
1935 .ib = 7000000,
1936 },
1937};
1938static struct msm_bus_vectors vidc_venc_1080p_vectors[] = {
1939 {
1940 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1941 .dst = MSM_BUS_SLAVE_SMI,
1942 .ab = 372244480,
1943 .ib = 1861222400,
1944 },
1945 {
1946 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1947 .dst = MSM_BUS_SLAVE_SMI,
1948 .ab = 501219328,
1949 .ib = 2004877312,
1950 },
1951 {
1952 .src = MSM_BUS_MASTER_AMPSS_M0,
1953 .dst = MSM_BUS_SLAVE_EBI_CH0,
1954 .ab = 2500000,
1955 .ib = 5000000,
1956 },
1957 {
1958 .src = MSM_BUS_MASTER_AMPSS_M0,
1959 .dst = MSM_BUS_SLAVE_SMI,
1960 .ab = 2500000,
1961 .ib = 5000000,
1962 },
1963};
1964static struct msm_bus_vectors vidc_vdec_1080p_vectors[] = {
1965 {
1966 .src = MSM_BUS_MASTER_HD_CODEC_PORT0,
1967 .dst = MSM_BUS_SLAVE_SMI,
1968 .ab = 222298112,
1969 .ib = 1778384896,
1970 },
1971 {
1972 .src = MSM_BUS_MASTER_HD_CODEC_PORT1,
1973 .dst = MSM_BUS_SLAVE_SMI,
1974 .ab = 330301440,
1975 .ib = 1321205760,
1976 },
1977 {
1978 .src = MSM_BUS_MASTER_AMPSS_M0,
1979 .dst = MSM_BUS_SLAVE_EBI_CH0,
1980 .ab = 2500000,
1981 .ib = 700000000,
1982 },
1983 {
1984 .src = MSM_BUS_MASTER_AMPSS_M0,
1985 .dst = MSM_BUS_SLAVE_SMI,
1986 .ab = 2500000,
1987 .ib = 10000000,
1988 },
1989};
1990
1991static struct msm_bus_paths vidc_bus_client_config[] = {
1992 {
1993 ARRAY_SIZE(vidc_init_vectors),
1994 vidc_init_vectors,
1995 },
1996 {
1997 ARRAY_SIZE(vidc_venc_vga_vectors),
1998 vidc_venc_vga_vectors,
1999 },
2000 {
2001 ARRAY_SIZE(vidc_vdec_vga_vectors),
2002 vidc_vdec_vga_vectors,
2003 },
2004 {
2005 ARRAY_SIZE(vidc_venc_720p_vectors),
2006 vidc_venc_720p_vectors,
2007 },
2008 {
2009 ARRAY_SIZE(vidc_vdec_720p_vectors),
2010 vidc_vdec_720p_vectors,
2011 },
2012 {
2013 ARRAY_SIZE(vidc_venc_1080p_vectors),
2014 vidc_venc_1080p_vectors,
2015 },
2016 {
2017 ARRAY_SIZE(vidc_vdec_1080p_vectors),
2018 vidc_vdec_1080p_vectors,
2019 },
2020};
2021
2022static struct msm_bus_scale_pdata vidc_bus_client_data = {
2023 vidc_bus_client_config,
2024 ARRAY_SIZE(vidc_bus_client_config),
2025 .name = "vidc",
2026};
2027
2028#endif
2029
2030#define MSM_VIDC_BASE_PHYS 0x04400000
2031#define MSM_VIDC_BASE_SIZE 0x00100000
2032
2033static struct resource msm_device_vidc_resources[] = {
2034 {
2035 .start = MSM_VIDC_BASE_PHYS,
2036 .end = MSM_VIDC_BASE_PHYS + MSM_VIDC_BASE_SIZE - 1,
2037 .flags = IORESOURCE_MEM,
2038 },
2039 {
2040 .start = VCODEC_IRQ,
2041 .end = VCODEC_IRQ,
2042 .flags = IORESOURCE_IRQ,
2043 },
2044};
2045
2046struct msm_vidc_platform_data vidc_platform_data = {
2047#ifdef CONFIG_MSM_BUS_SCALING
2048 .vidc_bus_client_pdata = &vidc_bus_client_data,
2049#endif
2050 .memtype = MEMTYPE_SMI_KERNEL
2051};
2052
2053struct platform_device msm_device_vidc = {
2054 .name = "msm_vidc",
2055 .id = 0,
2056 .num_resources = ARRAY_SIZE(msm_device_vidc_resources),
2057 .resource = msm_device_vidc_resources,
2058 .dev = {
2059 .platform_data = &vidc_platform_data,
2060 },
2061};
2062
2063#if defined(CONFIG_MSM_RPM_STATS_LOG)
2064static struct msm_rpmstats_platform_data msm_rpm_stat_pdata = {
2065 .phys_addr_base = 0x00107E04,
2066 .phys_size = SZ_8K,
2067};
2068
2069struct platform_device msm_rpm_stat_device = {
2070 .name = "msm_rpm_stat",
2071 .id = -1,
2072 .dev = {
2073 .platform_data = &msm_rpm_stat_pdata,
2074 },
2075};
2076#endif
2077
2078#ifdef CONFIG_MSM_MPM
2079static uint16_t msm_mpm_irqs_m2a[MSM_MPM_NR_MPM_IRQS] = {
2080 [1] = MSM_GPIO_TO_INT(61),
2081 [4] = MSM_GPIO_TO_INT(87),
2082 [5] = MSM_GPIO_TO_INT(88),
2083 [6] = MSM_GPIO_TO_INT(89),
2084 [7] = MSM_GPIO_TO_INT(90),
2085 [8] = MSM_GPIO_TO_INT(91),
2086 [9] = MSM_GPIO_TO_INT(34),
2087 [10] = MSM_GPIO_TO_INT(38),
2088 [11] = MSM_GPIO_TO_INT(42),
2089 [12] = MSM_GPIO_TO_INT(46),
2090 [13] = MSM_GPIO_TO_INT(50),
2091 [14] = MSM_GPIO_TO_INT(54),
2092 [15] = MSM_GPIO_TO_INT(58),
2093 [16] = MSM_GPIO_TO_INT(63),
2094 [17] = MSM_GPIO_TO_INT(160),
2095 [18] = MSM_GPIO_TO_INT(162),
2096 [19] = MSM_GPIO_TO_INT(144),
2097 [20] = MSM_GPIO_TO_INT(146),
2098 [25] = USB1_HS_IRQ,
2099 [26] = TV_ENC_IRQ,
2100 [27] = HDMI_IRQ,
2101 [29] = MSM_GPIO_TO_INT(123),
2102 [30] = MSM_GPIO_TO_INT(172),
2103 [31] = MSM_GPIO_TO_INT(99),
2104 [32] = MSM_GPIO_TO_INT(96),
2105 [33] = MSM_GPIO_TO_INT(67),
2106 [34] = MSM_GPIO_TO_INT(71),
2107 [35] = MSM_GPIO_TO_INT(105),
2108 [36] = MSM_GPIO_TO_INT(117),
2109 [37] = MSM_GPIO_TO_INT(29),
2110 [38] = MSM_GPIO_TO_INT(30),
2111 [39] = MSM_GPIO_TO_INT(31),
2112 [40] = MSM_GPIO_TO_INT(37),
2113 [41] = MSM_GPIO_TO_INT(40),
2114 [42] = MSM_GPIO_TO_INT(41),
2115 [43] = MSM_GPIO_TO_INT(45),
2116 [44] = MSM_GPIO_TO_INT(51),
2117 [45] = MSM_GPIO_TO_INT(52),
2118 [46] = MSM_GPIO_TO_INT(57),
2119 [47] = MSM_GPIO_TO_INT(73),
2120 [48] = MSM_GPIO_TO_INT(93),
2121 [49] = MSM_GPIO_TO_INT(94),
2122 [50] = MSM_GPIO_TO_INT(103),
2123 [51] = MSM_GPIO_TO_INT(104),
2124 [52] = MSM_GPIO_TO_INT(106),
2125 [53] = MSM_GPIO_TO_INT(115),
2126 [54] = MSM_GPIO_TO_INT(124),
2127 [55] = MSM_GPIO_TO_INT(125),
2128 [56] = MSM_GPIO_TO_INT(126),
2129 [57] = MSM_GPIO_TO_INT(127),
2130 [58] = MSM_GPIO_TO_INT(128),
2131 [59] = MSM_GPIO_TO_INT(129),
2132};
2133
2134static uint16_t msm_mpm_bypassed_apps_irqs[] = {
2135 TLMM_MSM_SUMMARY_IRQ,
2136 RPM_SCSS_CPU0_GP_HIGH_IRQ,
2137 RPM_SCSS_CPU0_GP_MEDIUM_IRQ,
2138 RPM_SCSS_CPU0_GP_LOW_IRQ,
2139 RPM_SCSS_CPU0_WAKE_UP_IRQ,
2140 RPM_SCSS_CPU1_GP_HIGH_IRQ,
2141 RPM_SCSS_CPU1_GP_MEDIUM_IRQ,
2142 RPM_SCSS_CPU1_GP_LOW_IRQ,
2143 RPM_SCSS_CPU1_WAKE_UP_IRQ,
2144 MARM_SCSS_GP_IRQ_0,
2145 MARM_SCSS_GP_IRQ_1,
2146 MARM_SCSS_GP_IRQ_2,
2147 MARM_SCSS_GP_IRQ_3,
2148 MARM_SCSS_GP_IRQ_4,
2149 MARM_SCSS_GP_IRQ_5,
2150 MARM_SCSS_GP_IRQ_6,
2151 MARM_SCSS_GP_IRQ_7,
2152 MARM_SCSS_GP_IRQ_8,
2153 MARM_SCSS_GP_IRQ_9,
2154 LPASS_SCSS_GP_LOW_IRQ,
2155 LPASS_SCSS_GP_MEDIUM_IRQ,
2156 LPASS_SCSS_GP_HIGH_IRQ,
2157 SDC4_IRQ_0,
2158 SPS_MTI_31,
2159};
2160
2161struct msm_mpm_device_data msm_mpm_dev_data = {
2162 .irqs_m2a = msm_mpm_irqs_m2a,
2163 .irqs_m2a_size = ARRAY_SIZE(msm_mpm_irqs_m2a),
2164 .bypassed_apps_irqs = msm_mpm_bypassed_apps_irqs,
2165 .bypassed_apps_irqs_size = ARRAY_SIZE(msm_mpm_bypassed_apps_irqs),
2166 .mpm_request_reg_base = MSM_RPM_BASE + 0x9d8,
2167 .mpm_status_reg_base = MSM_RPM_BASE + 0xdf8,
2168 .mpm_apps_ipc_reg = MSM_GCC_BASE + 0x008,
2169 .mpm_apps_ipc_val = BIT(1),
2170 .mpm_ipc_irq = RPM_SCSS_CPU0_GP_MEDIUM_IRQ,
2171
2172};
2173#endif
2174
2175
2176#ifdef CONFIG_MSM_BUS_SCALING
2177struct platform_device msm_bus_sys_fabric = {
2178 .name = "msm_bus_fabric",
2179 .id = MSM_BUS_FAB_SYSTEM,
2180};
2181struct platform_device msm_bus_apps_fabric = {
2182 .name = "msm_bus_fabric",
2183 .id = MSM_BUS_FAB_APPSS,
2184};
2185struct platform_device msm_bus_mm_fabric = {
2186 .name = "msm_bus_fabric",
2187 .id = MSM_BUS_FAB_MMSS,
2188};
2189struct platform_device msm_bus_sys_fpb = {
2190 .name = "msm_bus_fabric",
2191 .id = MSM_BUS_FAB_SYSTEM_FPB,
2192};
2193struct platform_device msm_bus_cpss_fpb = {
2194 .name = "msm_bus_fabric",
2195 .id = MSM_BUS_FAB_CPSS_FPB,
2196};
2197#endif
2198
2199struct platform_device asoc_msm_pcm = {
2200 .name = "msm-dsp-audio",
2201 .id = 0,
2202};
2203
2204struct platform_device asoc_msm_dai0 = {
2205 .name = "msm-codec-dai",
2206 .id = 0,
2207};
2208
2209struct platform_device asoc_msm_dai1 = {
2210 .name = "msm-cpu-dai",
2211 .id = 0,
2212};
2213
2214#if defined (CONFIG_MSM_8x60_VOIP)
2215struct platform_device asoc_msm_mvs = {
2216 .name = "msm-mvs-audio",
2217 .id = 0,
2218};
2219
2220struct platform_device asoc_mvs_dai0 = {
2221 .name = "mvs-codec-dai",
2222 .id = 0,
2223};
2224
2225struct platform_device asoc_mvs_dai1 = {
2226 .name = "mvs-cpu-dai",
2227 .id = 0,
2228};
2229#endif
2230
2231struct platform_device *msm_footswitch_devices[] = {
2232 FS_8X60(FS_IJPEG, "fs_ijpeg"),
2233 FS_8X60(FS_MDP, "fs_mdp"),
2234 FS_8X60(FS_ROT, "fs_rot"),
2235 FS_8X60(FS_VED, "fs_ved"),
2236 FS_8X60(FS_VFE, "fs_vfe"),
2237 FS_8X60(FS_VPE, "fs_vpe"),
2238 FS_8X60(FS_GFX3D, "fs_gfx3d"),
2239 FS_8X60(FS_GFX2D0, "fs_gfx2d0"),
2240 FS_8X60(FS_GFX2D1, "fs_gfx2d1"),
2241};
2242unsigned msm_num_footswitch_devices = ARRAY_SIZE(msm_footswitch_devices);
2243
2244#ifdef CONFIG_MSM_RPM
2245struct msm_rpm_map_data rpm_map_data[] __initdata = {
2246 MSM_RPM_MAP(TRIGGER_TIMED_TO, TRIGGER_TIMED, 1),
2247 MSM_RPM_MAP(TRIGGER_TIMED_SCLK_COUNT, TRIGGER_TIMED, 1),
2248 MSM_RPM_MAP(TRIGGER_SET_FROM, TRIGGER_SET, 1),
2249 MSM_RPM_MAP(TRIGGER_SET_TO, TRIGGER_SET, 1),
2250 MSM_RPM_MAP(TRIGGER_SET_TRIGGER, TRIGGER_SET, 1),
2251 MSM_RPM_MAP(TRIGGER_CLEAR_FROM, TRIGGER_CLEAR, 1),
2252 MSM_RPM_MAP(TRIGGER_CLEAR_TO, TRIGGER_CLEAR, 1),
2253 MSM_RPM_MAP(TRIGGER_CLEAR_TRIGGER, TRIGGER_CLEAR, 1),
2254
2255 MSM_RPM_MAP(CXO_CLK, CXO_CLK, 1),
2256 MSM_RPM_MAP(PXO_CLK, PXO_CLK, 1),
2257 MSM_RPM_MAP(PLL_4, PLL_4, 1),
2258 MSM_RPM_MAP(APPS_FABRIC_CLK, APPS_FABRIC_CLK, 1),
2259 MSM_RPM_MAP(SYSTEM_FABRIC_CLK, SYSTEM_FABRIC_CLK, 1),
2260 MSM_RPM_MAP(MM_FABRIC_CLK, MM_FABRIC_CLK, 1),
2261 MSM_RPM_MAP(DAYTONA_FABRIC_CLK, DAYTONA_FABRIC_CLK, 1),
2262 MSM_RPM_MAP(SFPB_CLK, SFPB_CLK, 1),
2263 MSM_RPM_MAP(CFPB_CLK, CFPB_CLK, 1),
2264 MSM_RPM_MAP(MMFPB_CLK, MMFPB_CLK, 1),
2265 MSM_RPM_MAP(SMI_CLK, SMI_CLK, 1),
2266 MSM_RPM_MAP(EBI1_CLK, EBI1_CLK, 1),
2267
2268 MSM_RPM_MAP(APPS_L2_CACHE_CTL, APPS_L2_CACHE_CTL, 1),
2269
2270 MSM_RPM_MAP(APPS_FABRIC_HALT_0, APPS_FABRIC_HALT, 2),
2271 MSM_RPM_MAP(APPS_FABRIC_CLOCK_MODE_0, APPS_FABRIC_CLOCK_MODE, 3),
2272 MSM_RPM_MAP(APPS_FABRIC_ARB_0, APPS_FABRIC_ARB, 6),
2273
2274 MSM_RPM_MAP(SYSTEM_FABRIC_HALT_0, SYSTEM_FABRIC_HALT, 2),
2275 MSM_RPM_MAP(SYSTEM_FABRIC_CLOCK_MODE_0, SYSTEM_FABRIC_CLOCK_MODE, 3),
2276 MSM_RPM_MAP(SYSTEM_FABRIC_ARB_0, SYSTEM_FABRIC_ARB, 22),
2277
2278 MSM_RPM_MAP(MM_FABRIC_HALT_0, MM_FABRIC_HALT, 2),
2279 MSM_RPM_MAP(MM_FABRIC_CLOCK_MODE_0, MM_FABRIC_CLOCK_MODE, 3),
2280 MSM_RPM_MAP(MM_FABRIC_ARB_0, MM_FABRIC_ARB, 23),
2281
2282 MSM_RPM_MAP(SMPS0B_0, SMPS0B, 2),
2283 MSM_RPM_MAP(SMPS1B_0, SMPS1B, 2),
2284 MSM_RPM_MAP(SMPS2B_0, SMPS2B, 2),
2285 MSM_RPM_MAP(SMPS3B_0, SMPS3B, 2),
2286 MSM_RPM_MAP(SMPS4B_0, SMPS4B, 2),
2287 MSM_RPM_MAP(LDO0B_0, LDO0B, 2),
2288 MSM_RPM_MAP(LDO1B_0, LDO1B, 2),
2289 MSM_RPM_MAP(LDO2B_0, LDO2B, 2),
2290 MSM_RPM_MAP(LDO3B_0, LDO3B, 2),
2291 MSM_RPM_MAP(LDO4B_0, LDO4B, 2),
2292 MSM_RPM_MAP(LDO5B_0, LDO5B, 2),
2293 MSM_RPM_MAP(LDO6B_0, LDO6B, 2),
2294 MSM_RPM_MAP(LVS0B, LVS0B, 1),
2295 MSM_RPM_MAP(LVS1B, LVS1B, 1),
2296 MSM_RPM_MAP(LVS2B, LVS2B, 1),
2297 MSM_RPM_MAP(LVS3B, LVS3B, 1),
2298 MSM_RPM_MAP(MVS, MVS, 1),
2299
2300 MSM_RPM_MAP(SMPS0_0, SMPS0, 2),
2301 MSM_RPM_MAP(SMPS1_0, SMPS1, 2),
2302 MSM_RPM_MAP(SMPS2_0, SMPS2, 2),
2303 MSM_RPM_MAP(SMPS3_0, SMPS3, 2),
2304 MSM_RPM_MAP(SMPS4_0, SMPS4, 2),
2305 MSM_RPM_MAP(LDO0_0, LDO0, 2),
2306 MSM_RPM_MAP(LDO1_0, LDO1, 2),
2307 MSM_RPM_MAP(LDO2_0, LDO2, 2),
2308 MSM_RPM_MAP(LDO3_0, LDO3, 2),
2309 MSM_RPM_MAP(LDO4_0, LDO4, 2),
2310 MSM_RPM_MAP(LDO5_0, LDO5, 2),
2311 MSM_RPM_MAP(LDO6_0, LDO6, 2),
2312 MSM_RPM_MAP(LDO7_0, LDO7, 2),
2313 MSM_RPM_MAP(LDO8_0, LDO8, 2),
2314 MSM_RPM_MAP(LDO9_0, LDO9, 2),
2315 MSM_RPM_MAP(LDO10_0, LDO10, 2),
2316 MSM_RPM_MAP(LDO11_0, LDO11, 2),
2317 MSM_RPM_MAP(LDO12_0, LDO12, 2),
2318 MSM_RPM_MAP(LDO13_0, LDO13, 2),
2319 MSM_RPM_MAP(LDO14_0, LDO14, 2),
2320 MSM_RPM_MAP(LDO15_0, LDO15, 2),
2321 MSM_RPM_MAP(LDO16_0, LDO16, 2),
2322 MSM_RPM_MAP(LDO17_0, LDO17, 2),
2323 MSM_RPM_MAP(LDO18_0, LDO18, 2),
2324 MSM_RPM_MAP(LDO19_0, LDO19, 2),
2325 MSM_RPM_MAP(LDO20_0, LDO20, 2),
2326 MSM_RPM_MAP(LDO21_0, LDO21, 2),
2327 MSM_RPM_MAP(LDO22_0, LDO22, 2),
2328 MSM_RPM_MAP(LDO23_0, LDO23, 2),
2329 MSM_RPM_MAP(LDO24_0, LDO24, 2),
2330 MSM_RPM_MAP(LDO25_0, LDO25, 2),
2331 MSM_RPM_MAP(LVS0, LVS0, 1),
2332 MSM_RPM_MAP(LVS1, LVS1, 1),
2333 MSM_RPM_MAP(NCP_0, NCP, 2),
2334
2335 MSM_RPM_MAP(CXO_BUFFERS, CXO_BUFFERS, 1),
2336};
2337unsigned int rpm_map_data_size = ARRAY_SIZE(rpm_map_data);
2338
2339#endif