arm: tegra: cardhu: pcie support for cardhu bsp
Jay Agarwal [Mon, 5 Dec 2011 08:55:38 +0000 (13:55 +0530)]
Enabling PCIE support in cardhu board.
Fixes bug: 637871

Reviewed-on: http://git-master/r/34474
(cherry picked from commit bde3e58d998b6e76934152219b8803327cea2fad)

Change-Id: I18c548b458ad3d17ec07d2ec5b16fd83897b44b1
Signed-off-by: Krishna Kishore <kthota@nvidia.com>
Reviewed-on: http://git-master/r/62072
Reviewed-by: Lokesh Pathak <lpathak@nvidia.com>
Tested-by: Lokesh Pathak <lpathak@nvidia.com>

arch/arm/mach-tegra/board-cardhu-pinmux.c
arch/arm/mach-tegra/board-cardhu.c
arch/arm/mach-tegra/board-cardhu.h
arch/arm/mach-tegra/board-harmony-pcie.c
arch/arm/mach-tegra/board-harmony.c
arch/arm/mach-tegra/board-harmony.h
arch/arm/mach-tegra/board-trimslice.c
arch/arm/mach-tegra/devices.c
arch/arm/mach-tegra/devices.h

index 1b736a4..b836ccf 100644 (file)
@@ -441,6 +441,8 @@ static __initdata struct tegra_pingroup_config cardhu_pinmux_cardhu[] = {
        DEFAULT_PINMUX(GMI_CS1_N,       GMI,             PULL_UP,   TRISTATE,   INPUT),
        /*TP_IRQ*/
        DEFAULT_PINMUX(GMI_CS4_N,       GMI,             PULL_UP,   NORMAL,     INPUT),
+       /*PCIE dock detect*/
+       DEFAULT_PINMUX(GPIO_PU4,        PWM1,            PULL_UP,   NORMAL,     INPUT),
 };
 
 static __initdata struct tegra_pingroup_config cardhu_pinmux_cardhu_a03[] = {
index 0d69eb6..6232083 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/tegra_uart.h>
 #include <linux/memblock.h>
 #include <linux/spi-tegra.h>
+#include <linux/nfc/pn544.h>
 
 #include <sound/wm8903.h>
 
@@ -52,8 +53,8 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <mach/usb_phy.h>
-#include <linux/nfc/pn544.h>
 #include <mach/thermal.h>
+#include <mach/pci.h>
 
 #include "board.h"
 #include "clock.h"
@@ -860,6 +861,31 @@ static struct platform_device tegra_baseband_power2_device = {
        },
 };
 
+
+static struct tegra_pci_platform_data cardhu_pci_platform_data = {
+       .port_status[0] = 1,
+       .port_status[1] = 1,
+       .port_status[2] = 1,
+       .use_dock_detect        = 0,
+       .gpio           = 0,
+};
+
+static void cardhu_pci_init(void)
+{
+       struct board_info board_info;
+
+       tegra_get_board_info(&board_info);
+       if (board_info.board_id == BOARD_E1291) {
+               cardhu_pci_platform_data.port_status[0] = 0;
+               cardhu_pci_platform_data.port_status[1] = 0;
+               cardhu_pci_platform_data.port_status[2] = 1;
+               cardhu_pci_platform_data.use_dock_detect = 1;
+               cardhu_pci_platform_data.gpio = DOCK_DETECT_GPIO;
+       }
+       tegra_pci_device.dev.platform_data = &cardhu_pci_platform_data;
+       platform_device_register(&tegra_pci_device);
+}
+
 static void cardhu_modem_init(void)
 {
        struct board_info board_info;
@@ -966,6 +992,7 @@ static void __init tegra_cardhu_init(void)
        cardhu_emc_init();
        tegra_release_bootloader_fb();
        cardhu_nfc_init();
+       cardhu_pci_init();
 }
 
 static void __init cardhu_ramconsole_reserve(unsigned long size)
index cacbd65..53228a8 100644 (file)
 /* TPS6591x IRQs */
 #define TPS6591X_IRQ_BASE      TEGRA_NR_IRQS
 #define TPS6591X_IRQ_END       (TPS6591X_IRQ_BASE + 18)
+#define DOCK_DETECT_GPIO TEGRA_GPIO_PU4
 
 /* RICOH583 IRQs */
 #define RICOH583_IRQ_BASE      TEGRA_NR_IRQS
index 9c27b95..f3db0ee 100644 (file)
@@ -23,6 +23,8 @@
 #include <asm/mach-types.h>
 
 #include <mach/pinmux.h>
+#include <mach/pci.h>
+#include "devices.h"
 #include "board.h"
 
 #ifdef CONFIG_TEGRA_PCI
 /* GPIO 3 of the PMIC */
 #define EN_VDD_1V05_GPIO       (TEGRA_NR_GPIOS + 2)
 
-static int __init harmony_pcie_init(void)
+static struct tegra_pci_platform_data harmony_pci_platform_data = {
+       .port_status[0] = 1,
+       .port_status[1] = 1,
+       .use_dock_detect        = 0,
+       .gpio           = 0,
+};
+
+int __init harmony_pcie_init(void)
 {
        struct regulator *regulator = NULL;
        int err;
@@ -54,9 +63,8 @@ static int __init harmony_pcie_init(void)
        tegra_pinmux_set_tristate(TEGRA_PINGROUP_SLXA, TEGRA_TRI_NORMAL);
        tegra_pinmux_set_tristate(TEGRA_PINGROUP_SLXK, TEGRA_TRI_NORMAL);
 
-       err = tegra_pcie_init(true, true);
-       if (err)
-               goto err_pcie;
+       tegra_pci_device.dev.platform_data = &harmony_pci_platform_data;
+       platform_device_register(&tegra_pci_device);
 
        return 0;
 
@@ -73,7 +81,4 @@ err_reg:
        return err;
 }
 
-/* PCI should be initialized after I2C, mfd and regulators */
-subsys_initcall_sync(harmony_pcie_init);
-
 #endif
index 9fb1c8f..d40084c 100644 (file)
@@ -432,6 +432,7 @@ static void __init tegra_harmony_init(void)
 #ifdef CONFIG_KEYBOARD_TEGRA
        harmony_kbc_init();
 #endif
+       harmony_pcie_init();
 }
 
 void __init tegra_harmony_reserve(void)
index c7a081d..d70b397 100644 (file)
@@ -45,5 +45,6 @@ void harmony_pinmux_init(void);
 int harmony_regulator_init(void);
 int harmony_panel_init(void);
 int harmony_kbc_init(void);
+int harmony_pcie_init(void);
 
 #endif
index 89a6d2a..823060e 100644 (file)
@@ -33,6 +33,7 @@
 #include <mach/iomap.h>
 #include <mach/sdhci.h>
 #include <mach/gpio.h>
+#include <mach/pci.h>
 
 #include "board.h"
 #include "clock.h"
@@ -79,6 +80,13 @@ static struct platform_device trimslice_audio_device = {
        .id     = 0,
 };
 
+static struct tegra_pci_platform_data trimslice_pci_platform_data = {
+       .port_status[0] = 1,
+       .port_status[1] = 1,
+       .use_dock_detect        = 0,
+       .gpio           = 0,
+};
+
 static struct platform_device *trimslice_devices[] __initdata = {
        &debug_uart,
        &tegra_sdhci_device1,
@@ -87,6 +95,7 @@ static struct platform_device *trimslice_devices[] __initdata = {
        &tegra_das_device,
        &tegra_pcm_device,
        &trimslice_audio_device,
+       &trimslice_pci_platform_data,
 };
 
 static struct i2c_board_info trimslice_i2c3_board_info[] = {
@@ -146,15 +155,6 @@ static __initdata struct tegra_clk_init_table trimslice_clk_init_table[] = {
        { NULL,         NULL,           0,              0},
 };
 
-static int __init tegra_trimslice_pci_init(void)
-{
-       if (!machine_is_trimslice())
-               return 0;
-
-       return tegra_pcie_init(true, true);
-}
-subsys_initcall(tegra_trimslice_pci_init);
-
 static void __init tegra_trimslice_init(void)
 {
        tegra_clk_init_from_table(trimslice_clk_init_table);
@@ -163,6 +163,7 @@ static void __init tegra_trimslice_init(void)
 
        tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
        tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
+       tegra_pci_device.dev.platform_data = &trimslice_pci_platform_data;
 
        platform_add_devices(trimslice_devices, ARRAY_SIZE(trimslice_devices));
 
index c38120d..c301654 100644 (file)
@@ -474,6 +474,16 @@ static struct resource sdhci_resource4[] = {
        },
 };
 
+struct platform_device tegra_pci_device = {
+       .name           = "tegra-pcie",
+       .id             = 0,
+       .resource       = 0,
+       .num_resources  = 0,
+       .dev = {
+               .platform_data = 0,
+       },
+};
+
 /* board files should fill in platform_data register the devices themselvs.
  * See board-harmony.c for an example
  */
index e3ece52..0facd56 100644 (file)
@@ -32,6 +32,7 @@ extern struct platform_device tegra_i2c_device2;
 extern struct platform_device tegra_i2c_device3;
 extern struct platform_device tegra_i2c_device4;
 extern struct platform_device tegra_kbc_device;
+extern struct platform_device tegra_pci_device;
 #ifndef CONFIG_ARCH_TEGRA_2x_SOC
 extern struct platform_device tegra_i2c_device5;
 #endif