board-cardhu:Adding cd and wp gpios for sdmmc1
[linux-2.6.git] / arch / arm / mach-tegra / board-cardhu-sdhci.c
1 /*
2  * arch/arm/mach-tegra/board-harmony-sdhci.c
3  *
4  * Copyright (C) 2010 Google, Inc.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  */
16
17 #include <linux/resource.h>
18 #include <linux/platform_device.h>
19 #include <linux/delay.h>
20 #include <linux/gpio.h>
21 #include <linux/clk.h>
22 #include <linux/err.h>
23 #include <linux/mmc/host.h>
24
25 #include <asm/mach-types.h>
26 #include <mach/irqs.h>
27 #include <mach/iomap.h>
28 #include <mach/sdhci.h>
29
30 #include "gpio-names.h"
31 #include "board.h"
32
33 static struct resource sdhci_resource0[] = {
34         [0] = {
35                 .start  = INT_SDMMC1,
36                 .end    = INT_SDMMC1,
37                 .flags  = IORESOURCE_IRQ,
38         },
39         [1] = {
40                 .start  = TEGRA_SDMMC1_BASE,
41                 .end    = TEGRA_SDMMC1_BASE + TEGRA_SDMMC1_SIZE-1,
42                 .flags  = IORESOURCE_MEM,
43         },
44 };
45
46 static struct resource sdhci_resource2[] = {
47         [0] = {
48                 .start  = INT_SDMMC3,
49                 .end    = INT_SDMMC3,
50                 .flags  = IORESOURCE_IRQ,
51         },
52         [1] = {
53                 .start  = TEGRA_SDMMC3_BASE,
54                 .end    = TEGRA_SDMMC3_BASE + TEGRA_SDMMC3_SIZE-1,
55                 .flags  = IORESOURCE_MEM,
56         },
57 };
58
59 static struct resource sdhci_resource3[] = {
60         [0] = {
61                 .start  = INT_SDMMC4,
62                 .end    = INT_SDMMC4,
63                 .flags  = IORESOURCE_IRQ,
64         },
65         [1] = {
66                 .start  = TEGRA_SDMMC4_BASE,
67                 .end    = TEGRA_SDMMC4_BASE + TEGRA_SDMMC4_SIZE-1,
68                 .flags  = IORESOURCE_MEM,
69         },
70 };
71
72
73 static struct tegra_sdhci_platform_data tegra_sdhci_platform_data0 = {
74         .clk_id = NULL,
75         .force_hs = 0,
76         .cd_gpio = -1,
77         .wp_gpio = -1,
78         .power_gpio = -1,
79 };
80
81 static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = {
82         .clk_id = NULL,
83         .force_hs = 1,
84         .cd_gpio = -1,
85         .wp_gpio = -1,
86         .power_gpio = -1,
87 };
88
89 static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = {
90         .clk_id = NULL,
91         .force_hs = 0,
92         .cd_gpio = -1,
93         .wp_gpio = -1,
94         .power_gpio = -1,
95 };
96
97 static struct platform_device tegra_sdhci_device0 = {
98         .name           = "sdhci-tegra",
99         .id             = 0,
100         .resource       = sdhci_resource0,
101         .num_resources  = ARRAY_SIZE(sdhci_resource0),
102         .dev = {
103                 .platform_data = &tegra_sdhci_platform_data0,
104         },
105 };
106
107 static struct platform_device tegra_sdhci_device2 = {
108         .name           = "sdhci-tegra",
109         .id             = 2,
110         .resource       = sdhci_resource2,
111         .num_resources  = ARRAY_SIZE(sdhci_resource2),
112         .dev = {
113                 .platform_data = &tegra_sdhci_platform_data2,
114         },
115 };
116
117 static struct platform_device tegra_sdhci_device3 = {
118         .name           = "sdhci-tegra",
119         .id             = 3,
120         .resource       = sdhci_resource3,
121         .num_resources  = ARRAY_SIZE(sdhci_resource3),
122         .dev = {
123                 .platform_data = &tegra_sdhci_platform_data3,
124         },
125 };
126
127 static int cardhu_sd_cd_gpio_init(void)
128 {
129         unsigned int rc = 0;
130
131         rc = gpio_request(TEGRA_GPIO_PI5, "card_detect");
132         if (rc)
133                 return rc;
134
135         tegra_gpio_enable(TEGRA_GPIO_PI5);
136
137         rc = gpio_direction_input(TEGRA_GPIO_PI5);
138         if (rc)
139                 return rc;
140
141         return 0;
142 }
143
144 static int cardhu_sd_wp_gpio_init(void)
145 {
146         unsigned int rc = 0;
147
148         rc = gpio_request(TEGRA_GPIO_PT3, "write_protect");
149         if (rc)
150                 return rc;
151
152         tegra_gpio_enable(TEGRA_GPIO_PT3);
153
154         rc = gpio_direction_input(TEGRA_GPIO_PT3);
155         if (rc)
156                 return rc;
157
158         return 0;
159 }
160
161 int __init cardhu_sdhci_init(void)
162 {
163         unsigned int rc = 0;
164         platform_device_register(&tegra_sdhci_device3);
165         platform_device_register(&tegra_sdhci_device2);
166         rc = cardhu_sd_cd_gpio_init();
167         if (!rc)
168                 tegra_sdhci_platform_data0.cd_gpio = TEGRA_GPIO_PI5;
169
170         rc = cardhu_sd_wp_gpio_init();
171         if (!rc)
172                 tegra_sdhci_platform_data0.cd_gpio = TEGRA_GPIO_PT3;
173
174         platform_device_register(&tegra_sdhci_device0);
175         return 0;
176 }