[ARM] tegra: harmony: Add sdhci devices
Colin Cross [Thu, 11 Mar 2010 04:43:14 +0000 (20:43 -0800)]
Change-Id: I29eab117c3fb237d5178d9fcf065563e656d46f2
Signed-off-by: Colin Cross <ccross@android.com>

arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/board-harmony-sdhci.c [new file with mode: 0644]

index 8f9cb21..d7d10eb 100644 (file)
@@ -31,6 +31,7 @@ obj-${CONFIG_MACH_HARMONY}              += board-harmony.o
 obj-${CONFIG_MACH_HARMONY}              += board-harmony-pinmux.o
 obj-${CONFIG_MACH_HARMONY}              += board-harmony-pcie.o
 obj-${CONFIG_MACH_HARMONY}              += board-harmony-power.o
+obj-${CONFIG_MACH_HARMONY}              += board-harmony-sdhci.o
 
 obj-${CONFIG_MACH_PAZ00}               += board-paz00.o
 obj-${CONFIG_MACH_PAZ00}               += board-paz00-pinmux.o
diff --git a/arch/arm/mach-tegra/board-harmony-sdhci.c b/arch/arm/mach-tegra/board-harmony-sdhci.c
new file mode 100644 (file)
index 0000000..66907a6
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * arch/arm/mach-tegra/board-harmony-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 <asm/mach-types.h>
+#include <asm/gpio.h>
+#include <mach/irqs.h>
+#include <mach/iomap.h>
+#include <mach/sdhci.h>
+#include <mach/gpio-names.h>
+#include <mach/pinmux.h>
+
+/*static struct resource sdhci_resource1[] = {
+       [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_resource2[] = {
+       [0] = {
+               .start  = INT_SDMMC2,
+               .end    = INT_SDMMC2,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start  = TEGRA_SDMMC2_BASE,
+               .end    = TEGRA_SDMMC2_BASE + TEGRA_SDMMC2_SIZE-1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+/*static struct resource sdhci_resource3[] = {
+       [0] = {
+               .start  = INT_SDMMC3,
+               .end    = INT_SDMMC3,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start  = TEGRA_SDMMC3_BASE,
+               .end    = TEGRA_SDMMC3_BASE + TEGRA_SDMMC3_SIZE-1,
+               .flags  = IORESOURCE_MEM,
+       },
+};*/
+
+static struct resource sdhci_resource4[] = {
+       [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_data1 = {
+       .clk_id = NULL,
+       .force_hs = 0,
+};*/
+
+static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = {
+       .clk_id = NULL,
+       .force_hs = 1,
+       .cd_gpio = TEGRA_GPIO_PI5,
+       .wp_gpio = TEGRA_GPIO_PH1,
+       .power_gpio = TEGRA_GPIO_PT3,
+};
+
+/*static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = {
+       .clk_id = NULL,
+       .force_hs = 0,
+};*/
+
+static struct tegra_sdhci_platform_data tegra_sdhci_platform_data4 = {
+       .clk_id = NULL,
+       .force_hs = 0,
+       .cd_gpio = TEGRA_GPIO_PH2,
+       .wp_gpio = TEGRA_GPIO_PH3,
+       .power_gpio = TEGRA_GPIO_PI6,
+};
+
+/*static struct platform_device tegra_sdhci_device1 = {
+       .name           = "sdhci-tegra",
+       .id             = 0,
+       .resource       = sdhci_resource1,
+       .num_resources  = ARRAY_SIZE(sdhci_resource1),
+       .dev = {
+               .platform_data = &tegra_sdhci_platform_data1,
+       },
+};*/
+
+static struct platform_device tegra_sdhci_device2 = {
+       .name           = "sdhci-tegra",
+       .id             = 1,
+       .resource       = sdhci_resource2,
+       .num_resources  = ARRAY_SIZE(sdhci_resource2),
+       .dev = {
+               .platform_data = &tegra_sdhci_platform_data2,
+       },
+};
+
+/*static struct platform_device tegra_sdhci_device3 = {
+       .name           = "sdhci-tegra",
+       .id             = 2,
+       .resource       = sdhci_resource3,
+       .num_resources  = ARRAY_SIZE(sdhci_resource3),
+       .dev = {
+               .platform_data = &tegra_sdhci_platform_data3,
+       },
+};*/
+
+static struct platform_device tegra_sdhci_device4 = {
+       .name           = "sdhci-tegra",
+       .id             = 3,
+       .resource       = sdhci_resource4,
+       .num_resources  = ARRAY_SIZE(sdhci_resource4),
+       .dev = {
+               .platform_data = &tegra_sdhci_platform_data4,
+       },
+};
+
+static int __init harmony_init_sdhci(void)
+{
+       int ret;
+
+       if (!machine_is_harmony())
+               return 0;
+
+       tegra_pinmux_set_tristate(TEGRA_PINGROUP_DTA, TEGRA_TRI_NORMAL);
+       tegra_pinmux_set_tristate(TEGRA_PINGROUP_DTB, TEGRA_TRI_NORMAL);
+       tegra_pinmux_set_tristate(TEGRA_PINGROUP_DTD, TEGRA_TRI_NORMAL);
+
+       tegra_pinmux_set_tristate(TEGRA_PINGROUP_GMA, TEGRA_TRI_NORMAL);
+       tegra_pinmux_set_tristate(TEGRA_PINGROUP_GMB, TEGRA_TRI_NORMAL);
+       tegra_pinmux_set_tristate(TEGRA_PINGROUP_ATB, TEGRA_TRI_NORMAL);
+
+       gpio_request(tegra_sdhci_platform_data2.power_gpio, "sdhci2_power");
+       gpio_request(tegra_sdhci_platform_data2.cd_gpio, "sdhci2_cd");
+       gpio_request(tegra_sdhci_platform_data2.wp_gpio, "sdhci2_wp");
+
+       tegra_gpio_enable(tegra_sdhci_platform_data2.power_gpio);
+       tegra_gpio_enable(tegra_sdhci_platform_data2.cd_gpio);
+       tegra_gpio_enable(tegra_sdhci_platform_data2.wp_gpio);
+
+       gpio_request(tegra_sdhci_platform_data4.power_gpio, "sdhci4_power");
+       gpio_request(tegra_sdhci_platform_data4.cd_gpio, "sdhci4_cd");
+       gpio_request(tegra_sdhci_platform_data4.wp_gpio, "sdhci4_wp");
+
+       tegra_gpio_enable(tegra_sdhci_platform_data4.power_gpio);
+       tegra_gpio_enable(tegra_sdhci_platform_data4.cd_gpio);
+       tegra_gpio_enable(tegra_sdhci_platform_data4.wp_gpio);
+
+       gpio_direction_output(tegra_sdhci_platform_data2.power_gpio, 1);
+       gpio_direction_output(tegra_sdhci_platform_data4.power_gpio, 1);
+
+       /*ret = platform_device_register(&tegra_sdhci_device1);*/
+       ret = platform_device_register(&tegra_sdhci_device2);
+       /*ret = platform_device_register(&tegra_sdhci_device3);*/
+       ret = platform_device_register(&tegra_sdhci_device4);
+       if (ret != 0)
+               return ret;
+
+       return 0;
+}
+
+device_initcall(harmony_init_sdhci);
+