summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Agarwal <jagarwal@nvidia.com>2011-12-05 14:25:38 +0530
committerVarun Wadekar <vwadekar@nvidia.com>2011-12-15 12:05:31 +0530
commiteba3b9a73807a14a11983d931883022834e7349e (patch)
tree1567f12ec0a5042bc826e293876855f70992d6c2
parenta4f80ed45571d6d37589dcca1e2cadfb8f46df6e (diff)
arm: tegra: cardhu: pcie support for cardhu bsp
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>
-rw-r--r--arch/arm/mach-tegra/board-cardhu-pinmux.c2
-rw-r--r--arch/arm/mach-tegra/board-cardhu.c29
-rw-r--r--arch/arm/mach-tegra/board-cardhu.h1
-rw-r--r--arch/arm/mach-tegra/board-harmony-pcie.c19
-rw-r--r--arch/arm/mach-tegra/board-harmony.c1
-rw-r--r--arch/arm/mach-tegra/board-harmony.h1
-rw-r--r--arch/arm/mach-tegra/board-trimslice.c19
-rw-r--r--arch/arm/mach-tegra/devices.c10
-rw-r--r--arch/arm/mach-tegra/devices.h1
9 files changed, 66 insertions, 17 deletions
diff --git a/arch/arm/mach-tegra/board-cardhu-pinmux.c b/arch/arm/mach-tegra/board-cardhu-pinmux.c
index 1b736a40dccf..b836ccf6f591 100644
--- a/arch/arm/mach-tegra/board-cardhu-pinmux.c
+++ b/arch/arm/mach-tegra/board-cardhu-pinmux.c
@@ -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[] = {
diff --git a/arch/arm/mach-tegra/board-cardhu.c b/arch/arm/mach-tegra/board-cardhu.c
index 0d69eb6165b7..62320839aca3 100644
--- a/arch/arm/mach-tegra/board-cardhu.c
+++ b/arch/arm/mach-tegra/board-cardhu.c
@@ -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)
diff --git a/arch/arm/mach-tegra/board-cardhu.h b/arch/arm/mach-tegra/board-cardhu.h
index cacbd65dea0d..53228a87db32 100644
--- a/arch/arm/mach-tegra/board-cardhu.h
+++ b/arch/arm/mach-tegra/board-cardhu.h
@@ -180,6 +180,7 @@
/* 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
diff --git a/arch/arm/mach-tegra/board-harmony-pcie.c b/arch/arm/mach-tegra/board-harmony-pcie.c
index 9c27b95b8d86..f3db0eeba2c9 100644
--- a/arch/arm/mach-tegra/board-harmony-pcie.c
+++ b/arch/arm/mach-tegra/board-harmony-pcie.c
@@ -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
@@ -30,7 +32,14 @@
/* 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
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c
index 9fb1c8fbce0c..d40084cc5e6d 100644
--- a/arch/arm/mach-tegra/board-harmony.c
+++ b/arch/arm/mach-tegra/board-harmony.c
@@ -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)
diff --git a/arch/arm/mach-tegra/board-harmony.h b/arch/arm/mach-tegra/board-harmony.h
index c7a081dfe3b9..d70b39711135 100644
--- a/arch/arm/mach-tegra/board-harmony.h
+++ b/arch/arm/mach-tegra/board-harmony.h
@@ -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
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c
index 89a6d2adc1de..823060ec478f 100644
--- a/arch/arm/mach-tegra/board-trimslice.c
+++ b/arch/arm/mach-tegra/board-trimslice.c
@@ -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));
diff --git a/arch/arm/mach-tegra/devices.c b/arch/arm/mach-tegra/devices.c
index c38120d119f4..c301654426b5 100644
--- a/arch/arm/mach-tegra/devices.c
+++ b/arch/arm/mach-tegra/devices.c
@@ -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
*/
diff --git a/arch/arm/mach-tegra/devices.h b/arch/arm/mach-tegra/devices.h
index e3ece52c8056..0facd56ce3df 100644
--- a/arch/arm/mach-tegra/devices.h
+++ b/arch/arm/mach-tegra/devices.h
@@ -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