1 /* linux/arch/arm/mach-msm/devices.c
3 * Copyright (C) 2008 Google, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #include <linux/kernel.h>
17 #include <linux/platform_device.h>
18 #include <linux/clkdev.h>
20 #include <mach/irqs.h>
21 #include <mach/msm_iomap.h>
24 #include <asm/mach/flash.h>
25 #include <linux/mtd/nand.h>
26 #include <linux/mtd/partitions.h>
29 #include "clock-pcom.h"
32 static struct resource resources_uart1
[] = {
36 .flags
= IORESOURCE_IRQ
,
39 .start
= MSM_UART1_PHYS
,
40 .end
= MSM_UART1_PHYS
+ MSM_UART1_SIZE
- 1,
41 .flags
= IORESOURCE_MEM
,
42 .name
= "uart_resource"
46 static struct resource resources_uart2
[] = {
50 .flags
= IORESOURCE_IRQ
,
53 .start
= MSM_UART2_PHYS
,
54 .end
= MSM_UART2_PHYS
+ MSM_UART2_SIZE
- 1,
55 .flags
= IORESOURCE_MEM
,
56 .name
= "uart_resource"
60 static struct resource resources_uart3
[] = {
64 .flags
= IORESOURCE_IRQ
,
67 .start
= MSM_UART3_PHYS
,
68 .end
= MSM_UART3_PHYS
+ MSM_UART3_SIZE
- 1,
69 .flags
= IORESOURCE_MEM
,
70 .name
= "uart_resource"
74 struct platform_device msm_device_uart1
= {
77 .num_resources
= ARRAY_SIZE(resources_uart1
),
78 .resource
= resources_uart1
,
81 struct platform_device msm_device_uart2
= {
84 .num_resources
= ARRAY_SIZE(resources_uart2
),
85 .resource
= resources_uart2
,
88 struct platform_device msm_device_uart3
= {
91 .num_resources
= ARRAY_SIZE(resources_uart3
),
92 .resource
= resources_uart3
,
95 static struct resource resources_i2c
[] = {
97 .start
= MSM_I2C_PHYS
,
98 .end
= MSM_I2C_PHYS
+ MSM_I2C_SIZE
- 1,
99 .flags
= IORESOURCE_MEM
,
102 .start
= INT_PWB_I2C
,
104 .flags
= IORESOURCE_IRQ
,
108 struct platform_device msm_device_i2c
= {
111 .num_resources
= ARRAY_SIZE(resources_i2c
),
112 .resource
= resources_i2c
,
115 static struct resource resources_hsusb
[] = {
117 .start
= MSM_HSUSB_PHYS
,
118 .end
= MSM_HSUSB_PHYS
+ MSM_HSUSB_SIZE
,
119 .flags
= IORESOURCE_MEM
,
124 .flags
= IORESOURCE_IRQ
,
128 struct platform_device msm_device_hsusb
= {
131 .num_resources
= ARRAY_SIZE(resources_hsusb
),
132 .resource
= resources_hsusb
,
134 .coherent_dma_mask
= 0xffffffff,
138 struct flash_platform_data msm_nand_data
= {
143 static struct resource resources_nand
[] = {
147 .flags
= IORESOURCE_DMA
,
151 struct platform_device msm_device_nand
= {
154 .num_resources
= ARRAY_SIZE(resources_nand
),
155 .resource
= resources_nand
,
157 .platform_data
= &msm_nand_data
,
161 struct platform_device msm_device_smd
= {
166 static struct resource resources_sdc1
[] = {
168 .start
= MSM_SDC1_PHYS
,
169 .end
= MSM_SDC1_PHYS
+ MSM_SDC1_SIZE
- 1,
170 .flags
= IORESOURCE_MEM
,
175 .flags
= IORESOURCE_IRQ
,
181 .flags
= IORESOURCE_IRQ
,
185 .flags
= IORESOURCE_IRQ
| IORESOURCE_DISABLED
,
191 .flags
= IORESOURCE_DMA
,
195 static struct resource resources_sdc2
[] = {
197 .start
= MSM_SDC2_PHYS
,
198 .end
= MSM_SDC2_PHYS
+ MSM_SDC2_SIZE
- 1,
199 .flags
= IORESOURCE_MEM
,
204 .flags
= IORESOURCE_IRQ
,
210 .flags
= IORESOURCE_IRQ
,
214 .flags
= IORESOURCE_IRQ
| IORESOURCE_DISABLED
,
220 .flags
= IORESOURCE_DMA
,
224 static struct resource resources_sdc3
[] = {
226 .start
= MSM_SDC3_PHYS
,
227 .end
= MSM_SDC3_PHYS
+ MSM_SDC3_SIZE
- 1,
228 .flags
= IORESOURCE_MEM
,
233 .flags
= IORESOURCE_IRQ
,
239 .flags
= IORESOURCE_IRQ
,
243 .flags
= IORESOURCE_IRQ
| IORESOURCE_DISABLED
,
249 .flags
= IORESOURCE_DMA
,
253 static struct resource resources_sdc4
[] = {
255 .start
= MSM_SDC4_PHYS
,
256 .end
= MSM_SDC4_PHYS
+ MSM_SDC4_SIZE
- 1,
257 .flags
= IORESOURCE_MEM
,
262 .flags
= IORESOURCE_IRQ
,
268 .flags
= IORESOURCE_IRQ
,
272 .flags
= IORESOURCE_IRQ
| IORESOURCE_DISABLED
,
278 .flags
= IORESOURCE_DMA
,
282 struct platform_device msm_device_sdc1
= {
285 .num_resources
= ARRAY_SIZE(resources_sdc1
),
286 .resource
= resources_sdc1
,
288 .coherent_dma_mask
= 0xffffffff,
292 struct platform_device msm_device_sdc2
= {
295 .num_resources
= ARRAY_SIZE(resources_sdc2
),
296 .resource
= resources_sdc2
,
298 .coherent_dma_mask
= 0xffffffff,
302 struct platform_device msm_device_sdc3
= {
305 .num_resources
= ARRAY_SIZE(resources_sdc3
),
306 .resource
= resources_sdc3
,
308 .coherent_dma_mask
= 0xffffffff,
312 struct platform_device msm_device_sdc4
= {
315 .num_resources
= ARRAY_SIZE(resources_sdc4
),
316 .resource
= resources_sdc4
,
318 .coherent_dma_mask
= 0xffffffff,
322 static struct platform_device
*msm_sdcc_devices
[] __initdata
= {
329 int __init
msm_add_sdcc(unsigned int controller
,
330 struct msm_mmc_platform_data
*plat
,
331 unsigned int stat_irq
, unsigned long stat_irq_flags
)
333 struct platform_device
*pdev
;
334 struct resource
*res
;
336 if (controller
< 1 || controller
> 4)
339 pdev
= msm_sdcc_devices
[controller
-1];
340 pdev
->dev
.platform_data
= plat
;
342 res
= platform_get_resource_byname(pdev
, IORESOURCE_IRQ
, "status_irq");
346 res
->start
= res
->end
= stat_irq
;
347 res
->flags
&= ~IORESOURCE_DISABLED
;
348 res
->flags
|= stat_irq_flags
;
351 return platform_device_register(pdev
);
354 static struct resource resources_mddi0
[] = {
356 .start
= MSM_PMDH_PHYS
,
357 .end
= MSM_PMDH_PHYS
+ MSM_PMDH_SIZE
- 1,
358 .flags
= IORESOURCE_MEM
,
361 .start
= INT_MDDI_PRI
,
363 .flags
= IORESOURCE_IRQ
,
367 static struct resource resources_mddi1
[] = {
369 .start
= MSM_EMDH_PHYS
,
370 .end
= MSM_EMDH_PHYS
+ MSM_EMDH_SIZE
- 1,
371 .flags
= IORESOURCE_MEM
,
374 .start
= INT_MDDI_EXT
,
376 .flags
= IORESOURCE_IRQ
,
380 struct platform_device msm_device_mddi0
= {
383 .num_resources
= ARRAY_SIZE(resources_mddi0
),
384 .resource
= resources_mddi0
,
386 .coherent_dma_mask
= 0xffffffff,
390 struct platform_device msm_device_mddi1
= {
393 .num_resources
= ARRAY_SIZE(resources_mddi1
),
394 .resource
= resources_mddi1
,
396 .coherent_dma_mask
= 0xffffffff,
400 static struct resource resources_mdp
[] = {
402 .start
= MSM_MDP_PHYS
,
403 .end
= MSM_MDP_PHYS
+ MSM_MDP_SIZE
- 1,
405 .flags
= IORESOURCE_MEM
410 .flags
= IORESOURCE_IRQ
,
414 struct platform_device msm_device_mdp
= {
417 .num_resources
= ARRAY_SIZE(resources_mdp
),
418 .resource
= resources_mdp
,
421 struct clk_lookup msm_clocks_7x01a
[] = {
422 CLK_PCOM("adm_clk", ADM_CLK
, NULL
, 0),
423 CLK_PCOM("adsp_clk", ADSP_CLK
, NULL
, 0),
424 CLK_PCOM("ebi1_clk", EBI1_CLK
, NULL
, 0),
425 CLK_PCOM("ebi2_clk", EBI2_CLK
, NULL
, 0),
426 CLK_PCOM("ecodec_clk", ECODEC_CLK
, NULL
, 0),
427 CLK_PCOM("emdh_clk", EMDH_CLK
, NULL
, OFF
),
428 CLK_PCOM("gp_clk", GP_CLK
, NULL
, 0),
429 CLK_PCOM("grp_clk", GRP_3D_CLK
, NULL
, OFF
),
430 CLK_PCOM("i2c_clk", I2C_CLK
, "msm_i2c.0", 0),
431 CLK_PCOM("icodec_rx_clk", ICODEC_RX_CLK
, NULL
, 0),
432 CLK_PCOM("icodec_tx_clk", ICODEC_TX_CLK
, NULL
, 0),
433 CLK_PCOM("imem_clk", IMEM_CLK
, NULL
, OFF
),
434 CLK_PCOM("mdc_clk", MDC_CLK
, NULL
, 0),
435 CLK_PCOM("mdp_clk", MDP_CLK
, NULL
, OFF
),
436 CLK_PCOM("pbus_clk", PBUS_CLK
, NULL
, 0),
437 CLK_PCOM("pcm_clk", PCM_CLK
, NULL
, 0),
438 CLK_PCOM("mddi_clk", PMDH_CLK
, NULL
, OFF
| CLK_MINMAX
),
439 CLK_PCOM("sdac_clk", SDAC_CLK
, NULL
, OFF
),
440 CLK_PCOM("sdc_clk", SDC1_CLK
, "msm_sdcc.1", OFF
),
441 CLK_PCOM("sdc_pclk", SDC1_P_CLK
, "msm_sdcc.1", OFF
),
442 CLK_PCOM("sdc_clk", SDC2_CLK
, "msm_sdcc.2", OFF
),
443 CLK_PCOM("sdc_pclk", SDC2_P_CLK
, "msm_sdcc.2", OFF
),
444 CLK_PCOM("sdc_clk", SDC3_CLK
, "msm_sdcc.3", OFF
),
445 CLK_PCOM("sdc_pclk", SDC3_P_CLK
, "msm_sdcc.3", OFF
),
446 CLK_PCOM("sdc_clk", SDC4_CLK
, "msm_sdcc.4", OFF
),
447 CLK_PCOM("sdc_pclk", SDC4_P_CLK
, "msm_sdcc.4", OFF
),
448 CLK_PCOM("tsif_clk", TSIF_CLK
, NULL
, 0),
449 CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK
, NULL
, 0),
450 CLK_PCOM("tv_dac_clk", TV_DAC_CLK
, NULL
, 0),
451 CLK_PCOM("tv_enc_clk", TV_ENC_CLK
, NULL
, 0),
452 CLK_PCOM("uart_clk", UART1_CLK
, "msm_serial.0", OFF
),
453 CLK_PCOM("uart_clk", UART2_CLK
, "msm_serial.1", 0),
454 CLK_PCOM("uart_clk", UART3_CLK
, "msm_serial.2", OFF
),
455 CLK_PCOM("uart1dm_clk", UART1DM_CLK
, NULL
, OFF
),
456 CLK_PCOM("uart2dm_clk", UART2DM_CLK
, NULL
, 0),
457 CLK_PCOM("usb_hs_clk", USB_HS_CLK
, "msm_hsusb", OFF
),
458 CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK
, "msm_hsusb", OFF
),
459 CLK_PCOM("usb_otg_clk", USB_OTG_CLK
, NULL
, 0),
460 CLK_PCOM("vdc_clk", VDC_CLK
, NULL
, OFF
),
461 CLK_PCOM("vfe_clk", VFE_CLK
, NULL
, OFF
),
462 CLK_PCOM("vfe_mdc_clk", VFE_MDC_CLK
, NULL
, OFF
),
465 unsigned msm_num_clocks_7x01a
= ARRAY_SIZE(msm_clocks_7x01a
);