2 * Copyright (C) 2010,2011 Google, Inc.
5 * Colin Cross <ccross@android.com>
6 * Erik Gilling <ccross@android.com>
8 * This software is licensed under the terms of the GNU General Public
9 * License version 2, as published by the Free Software Foundation, and
10 * may be copied, distributed, and modified under those terms.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
20 #include <linux/resource.h>
21 #include <linux/platform_device.h>
22 #include <linux/dma-mapping.h>
23 #include <linux/fsl_devices.h>
24 #include <linux/serial_8250.h>
25 #include <linux/i2c-tegra.h>
27 #include <mach/irqs.h>
28 #include <mach/iomap.h>
30 #include <mach/usb_phy.h>
32 #include "gpio-names.h"
35 static struct resource gpio_resource
[] = {
37 .start
= TEGRA_GPIO_BASE
,
38 .end
= TEGRA_GPIO_BASE
+ TEGRA_GPIO_SIZE
-1,
39 .flags
= IORESOURCE_MEM
,
44 .flags
= IORESOURCE_IRQ
,
49 .flags
= IORESOURCE_IRQ
,
54 .flags
= IORESOURCE_IRQ
,
59 .flags
= IORESOURCE_IRQ
,
64 .flags
= IORESOURCE_IRQ
,
69 .flags
= IORESOURCE_IRQ
,
74 .flags
= IORESOURCE_IRQ
,
78 struct platform_device tegra_gpio_device
= {
81 .resource
= gpio_resource
,
82 .num_resources
= ARRAY_SIZE(gpio_resource
),
85 static struct resource pinmux_resource
[] = {
87 /* Tri-state registers */
88 .start
= TEGRA_APB_MISC_BASE
+ 0x14,
89 .end
= TEGRA_APB_MISC_BASE
+ 0x20 + 3,
90 .flags
= IORESOURCE_MEM
,
94 .start
= TEGRA_APB_MISC_BASE
+ 0x80,
95 .end
= TEGRA_APB_MISC_BASE
+ 0x9c + 3,
96 .flags
= IORESOURCE_MEM
,
99 /* Pull-up/down registers */
100 .start
= TEGRA_APB_MISC_BASE
+ 0xa0,
101 .end
= TEGRA_APB_MISC_BASE
+ 0xb0 + 3,
102 .flags
= IORESOURCE_MEM
,
105 /* Pad control registers */
106 .start
= TEGRA_APB_MISC_BASE
+ 0x868,
107 .end
= TEGRA_APB_MISC_BASE
+ 0x90c + 3,
108 .flags
= IORESOURCE_MEM
,
112 struct platform_device tegra_pinmux_device
= {
113 .name
= "tegra-pinmux",
115 .resource
= pinmux_resource
,
116 .num_resources
= ARRAY_SIZE(pinmux_resource
),
119 static struct resource i2c_resource1
[] = {
123 .flags
= IORESOURCE_IRQ
,
126 .start
= TEGRA_I2C_BASE
,
127 .end
= TEGRA_I2C_BASE
+ TEGRA_I2C_SIZE
-1,
128 .flags
= IORESOURCE_MEM
,
132 static struct resource i2c_resource2
[] = {
136 .flags
= IORESOURCE_IRQ
,
139 .start
= TEGRA_I2C2_BASE
,
140 .end
= TEGRA_I2C2_BASE
+ TEGRA_I2C2_SIZE
-1,
141 .flags
= IORESOURCE_MEM
,
145 static struct resource i2c_resource3
[] = {
149 .flags
= IORESOURCE_IRQ
,
152 .start
= TEGRA_I2C3_BASE
,
153 .end
= TEGRA_I2C3_BASE
+ TEGRA_I2C3_SIZE
-1,
154 .flags
= IORESOURCE_MEM
,
158 static struct resource i2c_resource4
[] = {
162 .flags
= IORESOURCE_IRQ
,
165 .start
= TEGRA_DVC_BASE
,
166 .end
= TEGRA_DVC_BASE
+ TEGRA_DVC_SIZE
-1,
167 .flags
= IORESOURCE_MEM
,
171 static struct tegra_i2c_platform_data tegra_i2c1_platform_data
= {
172 .bus_clk_rate
= 400000,
175 static struct tegra_i2c_platform_data tegra_i2c2_platform_data
= {
176 .bus_clk_rate
= 400000,
179 static struct tegra_i2c_platform_data tegra_i2c3_platform_data
= {
180 .bus_clk_rate
= 400000,
183 static struct tegra_i2c_platform_data tegra_dvc_platform_data
= {
184 .bus_clk_rate
= 400000,
187 struct platform_device tegra_i2c_device1
= {
190 .resource
= i2c_resource1
,
191 .num_resources
= ARRAY_SIZE(i2c_resource1
),
193 .platform_data
= &tegra_i2c1_platform_data
,
197 struct platform_device tegra_i2c_device2
= {
200 .resource
= i2c_resource2
,
201 .num_resources
= ARRAY_SIZE(i2c_resource2
),
203 .platform_data
= &tegra_i2c2_platform_data
,
207 struct platform_device tegra_i2c_device3
= {
210 .resource
= i2c_resource3
,
211 .num_resources
= ARRAY_SIZE(i2c_resource3
),
213 .platform_data
= &tegra_i2c3_platform_data
,
217 struct platform_device tegra_i2c_device4
= {
220 .resource
= i2c_resource4
,
221 .num_resources
= ARRAY_SIZE(i2c_resource4
),
223 .platform_data
= &tegra_dvc_platform_data
,
227 static struct resource spi_resource1
[] = {
229 .start
= INT_S_LINK1
,
231 .flags
= IORESOURCE_IRQ
,
234 .start
= TEGRA_SPI1_BASE
,
235 .end
= TEGRA_SPI1_BASE
+ TEGRA_SPI1_SIZE
-1,
236 .flags
= IORESOURCE_MEM
,
240 static struct resource spi_resource2
[] = {
244 .flags
= IORESOURCE_IRQ
,
247 .start
= TEGRA_SPI2_BASE
,
248 .end
= TEGRA_SPI2_BASE
+ TEGRA_SPI2_SIZE
-1,
249 .flags
= IORESOURCE_MEM
,
253 static struct resource spi_resource3
[] = {
257 .flags
= IORESOURCE_IRQ
,
260 .start
= TEGRA_SPI3_BASE
,
261 .end
= TEGRA_SPI3_BASE
+ TEGRA_SPI3_SIZE
-1,
262 .flags
= IORESOURCE_MEM
,
266 static struct resource spi_resource4
[] = {
270 .flags
= IORESOURCE_IRQ
,
273 .start
= TEGRA_SPI4_BASE
,
274 .end
= TEGRA_SPI4_BASE
+ TEGRA_SPI4_SIZE
-1,
275 .flags
= IORESOURCE_MEM
,
279 struct platform_device tegra_spi_device1
= {
282 .resource
= spi_resource1
,
283 .num_resources
= ARRAY_SIZE(spi_resource1
),
285 .coherent_dma_mask
= 0xffffffff,
289 struct platform_device tegra_spi_device2
= {
292 .resource
= spi_resource2
,
293 .num_resources
= ARRAY_SIZE(spi_resource2
),
295 .coherent_dma_mask
= 0xffffffff,
299 struct platform_device tegra_spi_device3
= {
302 .resource
= spi_resource3
,
303 .num_resources
= ARRAY_SIZE(spi_resource3
),
305 .coherent_dma_mask
= 0xffffffff,
309 struct platform_device tegra_spi_device4
= {
312 .resource
= spi_resource4
,
313 .num_resources
= ARRAY_SIZE(spi_resource4
),
315 .coherent_dma_mask
= 0xffffffff,
320 static struct resource sdhci_resource1
[] = {
324 .flags
= IORESOURCE_IRQ
,
327 .start
= TEGRA_SDMMC1_BASE
,
328 .end
= TEGRA_SDMMC1_BASE
+ TEGRA_SDMMC1_SIZE
-1,
329 .flags
= IORESOURCE_MEM
,
333 static struct resource sdhci_resource2
[] = {
337 .flags
= IORESOURCE_IRQ
,
340 .start
= TEGRA_SDMMC2_BASE
,
341 .end
= TEGRA_SDMMC2_BASE
+ TEGRA_SDMMC2_SIZE
-1,
342 .flags
= IORESOURCE_MEM
,
346 static struct resource sdhci_resource3
[] = {
350 .flags
= IORESOURCE_IRQ
,
353 .start
= TEGRA_SDMMC3_BASE
,
354 .end
= TEGRA_SDMMC3_BASE
+ TEGRA_SDMMC3_SIZE
-1,
355 .flags
= IORESOURCE_MEM
,
359 static struct resource sdhci_resource4
[] = {
363 .flags
= IORESOURCE_IRQ
,
366 .start
= TEGRA_SDMMC4_BASE
,
367 .end
= TEGRA_SDMMC4_BASE
+ TEGRA_SDMMC4_SIZE
-1,
368 .flags
= IORESOURCE_MEM
,
372 /* board files should fill in platform_data register the devices themselvs.
373 * See board-harmony.c for an example
375 struct platform_device tegra_sdhci_device1
= {
376 .name
= "sdhci-tegra",
378 .resource
= sdhci_resource1
,
379 .num_resources
= ARRAY_SIZE(sdhci_resource1
),
382 struct platform_device tegra_sdhci_device2
= {
383 .name
= "sdhci-tegra",
385 .resource
= sdhci_resource2
,
386 .num_resources
= ARRAY_SIZE(sdhci_resource2
),
389 struct platform_device tegra_sdhci_device3
= {
390 .name
= "sdhci-tegra",
392 .resource
= sdhci_resource3
,
393 .num_resources
= ARRAY_SIZE(sdhci_resource3
),
396 struct platform_device tegra_sdhci_device4
= {
397 .name
= "sdhci-tegra",
399 .resource
= sdhci_resource4
,
400 .num_resources
= ARRAY_SIZE(sdhci_resource4
),
403 static struct resource tegra_usb1_resources
[] = {
405 .start
= TEGRA_USB_BASE
,
406 .end
= TEGRA_USB_BASE
+ TEGRA_USB_SIZE
- 1,
407 .flags
= IORESOURCE_MEM
,
412 .flags
= IORESOURCE_IRQ
,
416 static struct resource tegra_usb2_resources
[] = {
418 .start
= TEGRA_USB2_BASE
,
419 .end
= TEGRA_USB2_BASE
+ TEGRA_USB2_SIZE
- 1,
420 .flags
= IORESOURCE_MEM
,
425 .flags
= IORESOURCE_IRQ
,
429 static struct resource tegra_usb3_resources
[] = {
431 .start
= TEGRA_USB3_BASE
,
432 .end
= TEGRA_USB3_BASE
+ TEGRA_USB3_SIZE
- 1,
433 .flags
= IORESOURCE_MEM
,
438 .flags
= IORESOURCE_IRQ
,
442 static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config
= {
443 /* All existing boards use GPIO PV0 for phy reset */
444 .reset_gpio
= TEGRA_GPIO_PV0
,
448 struct tegra_ehci_platform_data tegra_ehci1_pdata
= {
449 .operating_mode
= TEGRA_USB_OTG
,
450 .power_down_on_bus_suspend
= 1,
453 struct tegra_ehci_platform_data tegra_ehci2_pdata
= {
454 .phy_config
= &tegra_ehci2_ulpi_phy_config
,
455 .operating_mode
= TEGRA_USB_HOST
,
456 .power_down_on_bus_suspend
= 1,
459 struct tegra_ehci_platform_data tegra_ehci3_pdata
= {
460 .operating_mode
= TEGRA_USB_HOST
,
461 .power_down_on_bus_suspend
= 1,
464 static u64 tegra_ehci_dmamask
= DMA_BIT_MASK(32);
466 struct platform_device tegra_ehci1_device
= {
467 .name
= "tegra-ehci",
470 .dma_mask
= &tegra_ehci_dmamask
,
471 .coherent_dma_mask
= DMA_BIT_MASK(32),
472 .platform_data
= &tegra_ehci1_pdata
,
474 .resource
= tegra_usb1_resources
,
475 .num_resources
= ARRAY_SIZE(tegra_usb1_resources
),
478 struct platform_device tegra_ehci2_device
= {
479 .name
= "tegra-ehci",
482 .dma_mask
= &tegra_ehci_dmamask
,
483 .coherent_dma_mask
= DMA_BIT_MASK(32),
484 .platform_data
= &tegra_ehci2_pdata
,
486 .resource
= tegra_usb2_resources
,
487 .num_resources
= ARRAY_SIZE(tegra_usb2_resources
),
490 struct platform_device tegra_ehci3_device
= {
491 .name
= "tegra-ehci",
494 .dma_mask
= &tegra_ehci_dmamask
,
495 .coherent_dma_mask
= DMA_BIT_MASK(32),
496 .platform_data
= &tegra_ehci3_pdata
,
498 .resource
= tegra_usb3_resources
,
499 .num_resources
= ARRAY_SIZE(tegra_usb3_resources
),
502 static struct resource tegra_pmu_resources
[] = {
504 .start
= INT_CPU0_PMU_INTR
,
505 .end
= INT_CPU0_PMU_INTR
,
506 .flags
= IORESOURCE_IRQ
,
509 .start
= INT_CPU1_PMU_INTR
,
510 .end
= INT_CPU1_PMU_INTR
,
511 .flags
= IORESOURCE_IRQ
,
515 struct platform_device tegra_pmu_device
= {
517 .id
= ARM_PMU_DEVICE_CPU
,
518 .num_resources
= ARRAY_SIZE(tegra_pmu_resources
),
519 .resource
= tegra_pmu_resources
,
522 static struct resource tegra_uarta_resources
[] = {
524 .start
= TEGRA_UARTA_BASE
,
525 .end
= TEGRA_UARTA_BASE
+ TEGRA_UARTA_SIZE
- 1,
526 .flags
= IORESOURCE_MEM
,
531 .flags
= IORESOURCE_IRQ
,
535 static struct resource tegra_uartb_resources
[] = {
537 .start
= TEGRA_UARTB_BASE
,
538 .end
= TEGRA_UARTB_BASE
+ TEGRA_UARTB_SIZE
- 1,
539 .flags
= IORESOURCE_MEM
,
544 .flags
= IORESOURCE_IRQ
,
548 static struct resource tegra_uartc_resources
[] = {
550 .start
= TEGRA_UARTC_BASE
,
551 .end
= TEGRA_UARTC_BASE
+ TEGRA_UARTC_SIZE
- 1,
552 .flags
= IORESOURCE_MEM
,
557 .flags
= IORESOURCE_IRQ
,
561 static struct resource tegra_uartd_resources
[] = {
563 .start
= TEGRA_UARTD_BASE
,
564 .end
= TEGRA_UARTD_BASE
+ TEGRA_UARTD_SIZE
- 1,
565 .flags
= IORESOURCE_MEM
,
570 .flags
= IORESOURCE_IRQ
,
574 static struct resource tegra_uarte_resources
[] = {
576 .start
= TEGRA_UARTE_BASE
,
577 .end
= TEGRA_UARTE_BASE
+ TEGRA_UARTE_SIZE
- 1,
578 .flags
= IORESOURCE_MEM
,
583 .flags
= IORESOURCE_IRQ
,
587 struct platform_device tegra_uarta_device
= {
588 .name
= "tegra_uart",
590 .num_resources
= ARRAY_SIZE(tegra_uarta_resources
),
591 .resource
= tegra_uarta_resources
,
593 .coherent_dma_mask
= DMA_BIT_MASK(32),
597 struct platform_device tegra_uartb_device
= {
598 .name
= "tegra_uart",
600 .num_resources
= ARRAY_SIZE(tegra_uartb_resources
),
601 .resource
= tegra_uartb_resources
,
603 .coherent_dma_mask
= DMA_BIT_MASK(32),
607 struct platform_device tegra_uartc_device
= {
608 .name
= "tegra_uart",
610 .num_resources
= ARRAY_SIZE(tegra_uartc_resources
),
611 .resource
= tegra_uartc_resources
,
613 .coherent_dma_mask
= DMA_BIT_MASK(32),
617 struct platform_device tegra_uartd_device
= {
618 .name
= "tegra_uart",
620 .num_resources
= ARRAY_SIZE(tegra_uartd_resources
),
621 .resource
= tegra_uartd_resources
,
623 .coherent_dma_mask
= DMA_BIT_MASK(32),
627 struct platform_device tegra_uarte_device
= {
628 .name
= "tegra_uart",
630 .num_resources
= ARRAY_SIZE(tegra_uarte_resources
),
631 .resource
= tegra_uarte_resources
,
633 .coherent_dma_mask
= DMA_BIT_MASK(32),
637 static struct resource i2s_resource1
[] = {
641 .flags
= IORESOURCE_IRQ
644 .start
= TEGRA_DMA_REQ_SEL_I2S_1
,
645 .end
= TEGRA_DMA_REQ_SEL_I2S_1
,
646 .flags
= IORESOURCE_DMA
649 .start
= TEGRA_I2S1_BASE
,
650 .end
= TEGRA_I2S1_BASE
+ TEGRA_I2S1_SIZE
- 1,
651 .flags
= IORESOURCE_MEM
655 static struct resource i2s_resource2
[] = {
659 .flags
= IORESOURCE_IRQ
662 .start
= TEGRA_DMA_REQ_SEL_I2S2_1
,
663 .end
= TEGRA_DMA_REQ_SEL_I2S2_1
,
664 .flags
= IORESOURCE_DMA
667 .start
= TEGRA_I2S2_BASE
,
668 .end
= TEGRA_I2S2_BASE
+ TEGRA_I2S2_SIZE
- 1,
669 .flags
= IORESOURCE_MEM
673 struct platform_device tegra_i2s_device1
= {
676 .resource
= i2s_resource1
,
677 .num_resources
= ARRAY_SIZE(i2s_resource1
),
680 struct platform_device tegra_i2s_device2
= {
683 .resource
= i2s_resource2
,
684 .num_resources
= ARRAY_SIZE(i2s_resource2
),
687 static struct resource tegra_das_resources
[] = {
689 .start
= TEGRA_APB_MISC_DAS_BASE
,
690 .end
= TEGRA_APB_MISC_DAS_BASE
+ TEGRA_APB_MISC_DAS_SIZE
- 1,
691 .flags
= IORESOURCE_MEM
,
695 struct platform_device tegra_das_device
= {
698 .num_resources
= ARRAY_SIZE(tegra_das_resources
),
699 .resource
= tegra_das_resources
,
702 struct platform_device tegra_pcm_device
= {
703 .name
= "tegra-pcm-audio",