summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-enterprise-sdhci.c
diff options
context:
space:
mode:
authorKasoju Mallikarjun <mkasoju@nvidia.com>2011-04-07 00:41:48 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:46:00 -0800
commit662573bb1bad71322b9292617bedcedd879ac851 (patch)
treea1d2c3cd1baa88b6bdb4e354c0d79e3c9be770a4 /arch/arm/mach-tegra/board-enterprise-sdhci.c
parentc157acd9d0d8c3849fbe59db6eddc2e3a2fda016 (diff)
arm: tegra: tegra_enterprise: Creating board files
Creating initial board files and config files for tegra_enterprise board. Original-Change-Id: I77dcd612421167b9c6441d5d6fb779bb51491efa Reviewed-on: http://git-master/r/20852 Reviewed-by: Niket Sirsi <nsirsi@nvidia.com> Tested-by: Niket Sirsi <nsirsi@nvidia.com> Change-Id: I498fe3cde454657c22fb1c1bc2212eb5e2f7fd6e Rebase-Id: Rcf164609f08780297a383d040e934a1ecd3c86b5
Diffstat (limited to 'arch/arm/mach-tegra/board-enterprise-sdhci.c')
-rw-r--r--arch/arm/mach-tegra/board-enterprise-sdhci.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-enterprise-sdhci.c b/arch/arm/mach-tegra/board-enterprise-sdhci.c
new file mode 100644
index 000000000000..5596dbe91086
--- /dev/null
+++ b/arch/arm/mach-tegra/board-enterprise-sdhci.c
@@ -0,0 +1,174 @@
+/*
+ * arch/arm/mach-tegra/board-enterprise-sdhci.c
+ *
+ * Copyright (C) 2010 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/resource.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/gpio.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/mmc/host.h>
+
+#include <asm/mach-types.h>
+#include <mach/irqs.h>
+#include <mach/iomap.h>
+#include <mach/sdhci.h>
+
+#include "gpio-names.h"
+#include "board.h"
+
+
+#define TEGRA_ENTERPRISE_SD_CD TEGRA_GPIO_PI5
+#define TEGRA_ENTERPRISE_SD_WP TEGRA_GPIO_PT3
+
+static struct resource sdhci_resource0[] = {
+ [0] = {
+ .start = INT_SDMMC1,
+ .end = INT_SDMMC1,
+ .flags = IORESOURCE_IRQ,
+ },
+ [1] = {
+ .start = TEGRA_SDMMC1_BASE,
+ .end = TEGRA_SDMMC1_BASE + TEGRA_SDMMC1_SIZE-1,
+ .flags = IORESOURCE_MEM,
+ },
+};
+
+static struct resource sdhci_resource3[] = {
+ [0] = {
+ .start = INT_SDMMC4,
+ .end = INT_SDMMC4,
+ .flags = IORESOURCE_IRQ,
+ },
+ [1] = {
+ .start = TEGRA_SDMMC4_BASE,
+ .end = TEGRA_SDMMC4_BASE + TEGRA_SDMMC4_SIZE-1,
+ .flags = IORESOURCE_MEM,
+ },
+};
+
+
+static struct tegra_sdhci_platform_data tegra_sdhci_platform_data0 = {
+ .clk_id = NULL,
+ .force_hs = 1,
+ .cd_gpio = -1,
+ .wp_gpio = -1,
+ .power_gpio = -1,
+ .tap_delay = 6,
+ .is_voltage_switch_supported = true,
+ .vsd_name = "vddio_sdmmc1",
+ .vsd_slot_name = "vddio_sd_slot",
+ .max_clk = 208000000,
+ .is_8bit_supported = false,
+};
+
+static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = {
+ .clk_id = NULL,
+ .force_hs = 0,
+ .cd_gpio = -1,
+ .wp_gpio = -1,
+ .power_gpio = -1,
+ .tap_delay = 6,
+ .is_voltage_switch_supported = false,
+ .vsd_name = NULL,
+ .vsd_slot_name = NULL,
+ .max_clk = 48000000,
+ .is_8bit_supported = true,
+};
+
+static struct platform_device tegra_sdhci_device0 = {
+ .name = "sdhci-tegra",
+ .id = 0,
+ .resource = sdhci_resource0,
+ .num_resources = ARRAY_SIZE(sdhci_resource0),
+ .dev = {
+ .platform_data = &tegra_sdhci_platform_data0,
+ },
+};
+
+static struct platform_device tegra_sdhci_device3 = {
+ .name = "sdhci-tegra",
+ .id = 3,
+ .resource = sdhci_resource3,
+ .num_resources = ARRAY_SIZE(sdhci_resource3),
+ .dev = {
+ .platform_data = &tegra_sdhci_platform_data3,
+ },
+};
+
+static int tegra_enterprise_sd_cd_gpio_init(void)
+{
+ unsigned int rc = 0;
+
+ rc = gpio_request(TEGRA_ENTERPRISE_SD_CD, "card_detect");
+ if (rc) {
+ pr_err("Card detect gpio request failed:%d\n", rc);
+ return rc;
+ }
+
+ tegra_gpio_enable(TEGRA_ENTERPRISE_SD_CD);
+
+ rc = gpio_direction_input(TEGRA_ENTERPRISE_SD_CD);
+ if (rc) {
+ pr_err("Unable to configure direction for card detect gpio:%d\n", rc);
+ return rc;
+ }
+
+ return 0;
+}
+
+static int tegra_enterprise_sd_wp_gpio_init(void)
+{
+ unsigned int rc = 0;
+
+ rc = gpio_request(TEGRA_ENTERPRISE_SD_WP, "write_protect");
+ if (rc) {
+ pr_err("Write protect gpio request failed:%d\n", rc);
+ return rc;
+ }
+
+ tegra_gpio_enable(TEGRA_ENTERPRISE_SD_WP);
+
+ rc = gpio_direction_input(TEGRA_ENTERPRISE_SD_WP);
+ if (rc) {
+ pr_err("Unable to configure direction for write protect gpio:%d\n", rc);
+ return rc;
+ }
+
+ return 0;
+}
+
+int __init tegra_enterprise_sdhci_init(void)
+{
+ unsigned int rc = 0;
+ platform_device_register(&tegra_sdhci_device3);
+
+ /* Fix ME: The gpios have to enabled for hot plug support */
+ rc = tegra_enterprise_sd_cd_gpio_init();
+ if (!rc) {
+ tegra_sdhci_platform_data0.cd_gpio = TEGRA_ENTERPRISE_SD_CD;
+ tegra_sdhci_platform_data0.cd_gpio_polarity = 0;
+ }
+ rc = tegra_enterprise_sd_wp_gpio_init();
+ if (!rc) {
+ tegra_sdhci_platform_data0.wp_gpio = TEGRA_ENTERPRISE_SD_WP;
+ tegra_sdhci_platform_data0.wp_gpio_polarity = 1;
+ }
+
+ platform_device_register(&tegra_sdhci_device0);
+
+ return 0;
+}