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>
26 #include <linux/platform_data/tegra_usb.h>
28 #include <mach/irqs.h>
29 #include <mach/iomap.h>
31 #include <mach/usb_phy.h>
32 #include "gpio-names.h"
34 static struct resource gpio_resource[] = {
36 .start = TEGRA_GPIO_BASE,
37 .end = TEGRA_GPIO_BASE + TEGRA_GPIO_SIZE-1,
38 .flags = IORESOURCE_MEM,
43 .flags = IORESOURCE_IRQ,
48 .flags = IORESOURCE_IRQ,
53 .flags = IORESOURCE_IRQ,
58 .flags = IORESOURCE_IRQ,
63 .flags = IORESOURCE_IRQ,
68 .flags = IORESOURCE_IRQ,
73 .flags = IORESOURCE_IRQ,
77 struct platform_device tegra_gpio_device = {
80 .resource = gpio_resource,
81 .num_resources = ARRAY_SIZE(gpio_resource),
84 static struct resource pinmux_resource[] = {
86 /* Tri-state registers */
87 .start = TEGRA_APB_MISC_BASE + 0x14,
88 .end = TEGRA_APB_MISC_BASE + 0x20 + 3,
89 .flags = IORESOURCE_MEM,
93 .start = TEGRA_APB_MISC_BASE + 0x80,
94 .end = TEGRA_APB_MISC_BASE + 0x9c + 3,
95 .flags = IORESOURCE_MEM,
98 /* Pull-up/down registers */
99 .start = TEGRA_APB_MISC_BASE + 0xa0,
100 .end = TEGRA_APB_MISC_BASE + 0xb0 + 3,
101 .flags = IORESOURCE_MEM,
104 /* Pad control registers */
105 .start = TEGRA_APB_MISC_BASE + 0x868,
106 .end = TEGRA_APB_MISC_BASE + 0x90c + 3,
107 .flags = IORESOURCE_MEM,
111 struct platform_device tegra_pinmux_device = {
112 .name = "tegra-pinmux",
114 .resource = pinmux_resource,
115 .num_resources = ARRAY_SIZE(pinmux_resource),
118 static struct resource i2c_resource1[] = {
122 .flags = IORESOURCE_IRQ,
125 .start = TEGRA_I2C_BASE,
126 .end = TEGRA_I2C_BASE + TEGRA_I2C_SIZE-1,
127 .flags = IORESOURCE_MEM,
131 static struct resource i2c_resource2[] = {
135 .flags = IORESOURCE_IRQ,
138 .start = TEGRA_I2C2_BASE,
139 .end = TEGRA_I2C2_BASE + TEGRA_I2C2_SIZE-1,
140 .flags = IORESOURCE_MEM,
144 static struct resource i2c_resource3[] = {
148 .flags = IORESOURCE_IRQ,
151 .start = TEGRA_I2C3_BASE,
152 .end = TEGRA_I2C3_BASE + TEGRA_I2C3_SIZE-1,
153 .flags = IORESOURCE_MEM,
157 static struct resource i2c_resource4[] = {
161 .flags = IORESOURCE_IRQ,
164 .start = TEGRA_DVC_BASE,
165 .end = TEGRA_DVC_BASE + TEGRA_DVC_SIZE-1,
166 .flags = IORESOURCE_MEM,
170 static struct tegra_i2c_platform_data tegra_i2c1_platform_data = {
171 .bus_clk_rate = 400000,
174 static struct tegra_i2c_platform_data tegra_i2c2_platform_data = {
175 .bus_clk_rate = 400000,
178 static struct tegra_i2c_platform_data tegra_i2c3_platform_data = {
179 .bus_clk_rate = 400000,
182 static struct tegra_i2c_platform_data tegra_dvc_platform_data = {
183 .bus_clk_rate = 400000,
186 struct platform_device tegra_i2c_device1 = {
189 .resource = i2c_resource1,
190 .num_resources = ARRAY_SIZE(i2c_resource1),
192 .platform_data = &tegra_i2c1_platform_data,
196 struct platform_device tegra_i2c_device2 = {
199 .resource = i2c_resource2,
200 .num_resources = ARRAY_SIZE(i2c_resource2),
202 .platform_data = &tegra_i2c2_platform_data,
206 struct platform_device tegra_i2c_device3 = {
209 .resource = i2c_resource3,
210 .num_resources = ARRAY_SIZE(i2c_resource3),
212 .platform_data = &tegra_i2c3_platform_data,
216 struct platform_device tegra_i2c_device4 = {
219 .resource = i2c_resource4,
220 .num_resources = ARRAY_SIZE(i2c_resource4),
222 .platform_data = &tegra_dvc_platform_data,
226 static struct resource spi_resource1[] = {
228 .start = INT_S_LINK1,
230 .flags = IORESOURCE_IRQ,
233 .start = TEGRA_SPI1_BASE,
234 .end = TEGRA_SPI1_BASE + TEGRA_SPI1_SIZE-1,
235 .flags = IORESOURCE_MEM,
239 static struct resource spi_resource2[] = {
243 .flags = IORESOURCE_IRQ,
246 .start = TEGRA_SPI2_BASE,
247 .end = TEGRA_SPI2_BASE + TEGRA_SPI2_SIZE-1,
248 .flags = IORESOURCE_MEM,
252 static struct resource spi_resource3[] = {
256 .flags = IORESOURCE_IRQ,
259 .start = TEGRA_SPI3_BASE,
260 .end = TEGRA_SPI3_BASE + TEGRA_SPI3_SIZE-1,
261 .flags = IORESOURCE_MEM,
265 static struct resource spi_resource4[] = {
269 .flags = IORESOURCE_IRQ,
272 .start = TEGRA_SPI4_BASE,
273 .end = TEGRA_SPI4_BASE + TEGRA_SPI4_SIZE-1,
274 .flags = IORESOURCE_MEM,
278 struct platform_device tegra_spi_device1 = {
281 .resource = spi_resource1,
282 .num_resources = ARRAY_SIZE(spi_resource1),
284 .coherent_dma_mask = 0xffffffff,
288 struct platform_device tegra_spi_device2 = {
291 .resource = spi_resource2,
292 .num_resources = ARRAY_SIZE(spi_resource2),
294 .coherent_dma_mask = 0xffffffff,
298 struct platform_device tegra_spi_device3 = {
301 .resource = spi_resource3,
302 .num_resources = ARRAY_SIZE(spi_resource3),
304 .coherent_dma_mask = 0xffffffff,
308 struct platform_device tegra_spi_device4 = {
311 .resource = spi_resource4,
312 .num_resources = ARRAY_SIZE(spi_resource4),
314 .coherent_dma_mask = 0xffffffff,
319 static struct resource sdhci_resource1[] = {
323 .flags = IORESOURCE_IRQ,
326 .start = TEGRA_SDMMC1_BASE,
327 .end = TEGRA_SDMMC1_BASE + TEGRA_SDMMC1_SIZE-1,
328 .flags = IORESOURCE_MEM,
332 static struct resource sdhci_resource2[] = {
336 .flags = IORESOURCE_IRQ,
339 .start = TEGRA_SDMMC2_BASE,
340 .end = TEGRA_SDMMC2_BASE + TEGRA_SDMMC2_SIZE-1,
341 .flags = IORESOURCE_MEM,
345 static struct resource sdhci_resource3[] = {
349 .flags = IORESOURCE_IRQ,
352 .start = TEGRA_SDMMC3_BASE,
353 .end = TEGRA_SDMMC3_BASE + TEGRA_SDMMC3_SIZE-1,
354 .flags = IORESOURCE_MEM,
358 static struct resource sdhci_resource4[] = {
362 .flags = IORESOURCE_IRQ,
365 .start = TEGRA_SDMMC4_BASE,
366 .end = TEGRA_SDMMC4_BASE + TEGRA_SDMMC4_SIZE-1,
367 .flags = IORESOURCE_MEM,
371 /* board files should fill in platform_data register the devices themselvs.
372 * See board-harmony.c for an example
374 struct platform_device tegra_sdhci_device1 = {
375 .name = "sdhci-tegra",
377 .resource = sdhci_resource1,
378 .num_resources = ARRAY_SIZE(sdhci_resource1),
381 struct platform_device tegra_sdhci_device2 = {
382 .name = "sdhci-tegra",
384 .resource = sdhci_resource2,
385 .num_resources = ARRAY_SIZE(sdhci_resource2),
388 struct platform_device tegra_sdhci_device3 = {
389 .name = "sdhci-tegra",
391 .resource = sdhci_resource3,
392 .num_resources = ARRAY_SIZE(sdhci_resource3),
395 struct platform_device tegra_sdhci_device4 = {
396 .name = "sdhci-tegra",
398 .resource = sdhci_resource4,
399 .num_resources = ARRAY_SIZE(sdhci_resource4),
402 static struct resource tegra_usb1_resources[] = {
404 .start = TEGRA_USB_BASE,
405 .end = TEGRA_USB_BASE + TEGRA_USB_SIZE - 1,
406 .flags = IORESOURCE_MEM,
411 .flags = IORESOURCE_IRQ,
415 static struct resource tegra_usb2_resources[] = {
417 .start = TEGRA_USB2_BASE,
418 .end = TEGRA_USB2_BASE + TEGRA_USB2_SIZE - 1,
419 .flags = IORESOURCE_MEM,
424 .flags = IORESOURCE_IRQ,
428 static struct resource tegra_usb3_resources[] = {
430 .start = TEGRA_USB3_BASE,
431 .end = TEGRA_USB3_BASE + TEGRA_USB3_SIZE - 1,
432 .flags = IORESOURCE_MEM,
437 .flags = IORESOURCE_IRQ,
441 static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = {
442 /* All existing boards use GPIO PV0 for phy reset */
443 .reset_gpio = TEGRA_GPIO_PV0,
447 static struct tegra_ehci_platform_data tegra_ehci1_pdata = {
448 .operating_mode = TEGRA_USB_OTG,
449 .power_down_on_bus_suspend = 1,
452 static struct tegra_ehci_platform_data tegra_ehci2_pdata = {
453 .phy_config = &tegra_ehci2_ulpi_phy_config,
454 .operating_mode = TEGRA_USB_HOST,
455 .power_down_on_bus_suspend = 1,
458 static struct tegra_ehci_platform_data tegra_ehci3_pdata = {
459 .operating_mode = TEGRA_USB_HOST,
460 .power_down_on_bus_suspend = 1,
463 static u64 tegra_ehci_dmamask = DMA_BIT_MASK(32);
465 struct platform_device tegra_ehci1_device = {
466 .name = "tegra-ehci",
469 .dma_mask = &tegra_ehci_dmamask,
470 .coherent_dma_mask = DMA_BIT_MASK(32),
471 .platform_data = &tegra_ehci1_pdata,
473 .resource = tegra_usb1_resources,
474 .num_resources = ARRAY_SIZE(tegra_usb1_resources),
477 struct platform_device tegra_ehci2_device = {
478 .name = "tegra-ehci",
481 .dma_mask = &tegra_ehci_dmamask,
482 .coherent_dma_mask = DMA_BIT_MASK(32),
483 .platform_data = &tegra_ehci2_pdata,
485 .resource = tegra_usb2_resources,
486 .num_resources = ARRAY_SIZE(tegra_usb2_resources),
489 struct platform_device tegra_ehci3_device = {
490 .name = "tegra-ehci",
493 .dma_mask = &tegra_ehci_dmamask,
494 .coherent_dma_mask = DMA_BIT_MASK(32),
495 .platform_data = &tegra_ehci3_pdata,
497 .resource = tegra_usb3_resources,
498 .num_resources = ARRAY_SIZE(tegra_usb3_resources),
501 static struct resource tegra_pmu_resources[] = {
503 .start = INT_CPU0_PMU_INTR,
504 .end = INT_CPU0_PMU_INTR,
505 .flags = IORESOURCE_IRQ,
508 .start = INT_CPU1_PMU_INTR,
509 .end = INT_CPU1_PMU_INTR,
510 .flags = IORESOURCE_IRQ,
514 struct platform_device tegra_pmu_device = {
516 .id = ARM_PMU_DEVICE_CPU,
517 .num_resources = ARRAY_SIZE(tegra_pmu_resources),
518 .resource = tegra_pmu_resources,
521 static struct resource tegra_uarta_resources[] = {
523 .start = TEGRA_UARTA_BASE,
524 .end = TEGRA_UARTA_BASE + TEGRA_UARTA_SIZE - 1,
525 .flags = IORESOURCE_MEM,
530 .flags = IORESOURCE_IRQ,
534 static struct resource tegra_uartb_resources[] = {
536 .start = TEGRA_UARTB_BASE,
537 .end = TEGRA_UARTB_BASE + TEGRA_UARTB_SIZE - 1,
538 .flags = IORESOURCE_MEM,
543 .flags = IORESOURCE_IRQ,
547 static struct resource tegra_uartc_resources[] = {
549 .start = TEGRA_UARTC_BASE,
550 .end = TEGRA_UARTC_BASE + TEGRA_UARTC_SIZE - 1,
551 .flags = IORESOURCE_MEM,
556 .flags = IORESOURCE_IRQ,
560 static struct resource tegra_uartd_resources[] = {
562 .start = TEGRA_UARTD_BASE,
563 .end = TEGRA_UARTD_BASE + TEGRA_UARTD_SIZE - 1,
564 .flags = IORESOURCE_MEM,
569 .flags = IORESOURCE_IRQ,
573 static struct resource tegra_uarte_resources[] = {
575 .start = TEGRA_UARTE_BASE,
576 .end = TEGRA_UARTE_BASE + TEGRA_UARTE_SIZE - 1,
577 .flags = IORESOURCE_MEM,
582 .flags = IORESOURCE_IRQ,
586 struct platform_device tegra_uarta_device = {
587 .name = "tegra_uart",
589 .num_resources = ARRAY_SIZE(tegra_uarta_resources),
590 .resource = tegra_uarta_resources,
592 .coherent_dma_mask = DMA_BIT_MASK(32),
596 struct platform_device tegra_uartb_device = {
597 .name = "tegra_uart",
599 .num_resources = ARRAY_SIZE(tegra_uartb_resources),
600 .resource = tegra_uartb_resources,
602 .coherent_dma_mask = DMA_BIT_MASK(32),
606 struct platform_device tegra_uartc_device = {
607 .name = "tegra_uart",
609 .num_resources = ARRAY_SIZE(tegra_uartc_resources),
610 .resource = tegra_uartc_resources,
612 .coherent_dma_mask = DMA_BIT_MASK(32),
616 struct platform_device tegra_uartd_device = {
617 .name = "tegra_uart",
619 .num_resources = ARRAY_SIZE(tegra_uartd_resources),
620 .resource = tegra_uartd_resources,
622 .coherent_dma_mask = DMA_BIT_MASK(32),
626 struct platform_device tegra_uarte_device = {
627 .name = "tegra_uart",
629 .num_resources = ARRAY_SIZE(tegra_uarte_resources),
630 .resource = tegra_uarte_resources,
632 .coherent_dma_mask = DMA_BIT_MASK(32),
636 static struct resource i2s_resource1[] = {
640 .flags = IORESOURCE_IRQ
643 .start = TEGRA_DMA_REQ_SEL_I2S_1,
644 .end = TEGRA_DMA_REQ_SEL_I2S_1,
645 .flags = IORESOURCE_DMA
648 .start = TEGRA_I2S1_BASE,
649 .end = TEGRA_I2S1_BASE + TEGRA_I2S1_SIZE - 1,
650 .flags = IORESOURCE_MEM
654 static struct resource i2s_resource2[] = {
658 .flags = IORESOURCE_IRQ
661 .start = TEGRA_DMA_REQ_SEL_I2S2_1,
662 .end = TEGRA_DMA_REQ_SEL_I2S2_1,
663 .flags = IORESOURCE_DMA
666 .start = TEGRA_I2S2_BASE,
667 .end = TEGRA_I2S2_BASE + TEGRA_I2S2_SIZE - 1,
668 .flags = IORESOURCE_MEM
672 struct platform_device tegra_i2s_device1 = {
675 .resource = i2s_resource1,
676 .num_resources = ARRAY_SIZE(i2s_resource1),
679 struct platform_device tegra_i2s_device2 = {
682 .resource = i2s_resource2,
683 .num_resources = ARRAY_SIZE(i2s_resource2),
686 static struct resource tegra_das_resources[] = {
688 .start = TEGRA_APB_MISC_DAS_BASE,
689 .end = TEGRA_APB_MISC_DAS_BASE + TEGRA_APB_MISC_DAS_SIZE - 1,
690 .flags = IORESOURCE_MEM,
694 struct platform_device tegra_das_device = {
697 .num_resources = ARRAY_SIZE(tegra_das_resources),
698 .resource = tegra_das_resources,
701 struct platform_device tegra_pcm_device = {
702 .name = "tegra-pcm-audio",