ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-vcm30_t124-sdhci.c
1 /*
2  * arch/arm/mach-tegra/board-vcm30_t124-sdhci.c
3  *
4  * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  */
19
20 #include <linux/resource.h>
21 #include <linux/platform_device.h>
22 #include <linux/wlan_plat.h>
23 #include <linux/delay.h>
24 #include <linux/gpio.h>
25 #include <linux/clk.h>
26 #include <linux/err.h>
27 #include <linux/mmc/host.h>
28 #include <linux/platform_data/mmc-sdhci-tegra.h>
29
30 #include <asm/mach-types.h>
31 #include <mach/irqs.h>
32 #include <mach/board_id.h>
33 #include <linux/i2c.h>
34
35 #include "iomap.h"
36 #include "gpio-names.h"
37 #include "board.h"
38 #include "board-vcm30_t124.h"
39 #include "devices.h"
40
41 static void (*wifi_status_cb) (int card_present, void *dev_id);
42 static void *wifi_status_cb_devid;
43 static int
44 vcm30_t124_wifi_status_register(void (*callback) (int, void *), void *);
45 static int vcm30_t124_wifi_reset(int on);
46 static int vcm30_t124_wifi_power(int on);
47 static int vcm30_t124_wifi_set_carddetect(int val);
48
49 static struct wifi_platform_data vcm30_t124_wifi_control = {
50         .set_power = vcm30_t124_wifi_power,
51         .set_reset = vcm30_t124_wifi_reset,
52         .set_carddetect = vcm30_t124_wifi_set_carddetect,
53 };
54
55 static struct platform_device broadcom_wifi_device = {
56         .name = "bcm4329_wlan",
57         .id = 1,
58         .dev = {
59                 .platform_data = &vcm30_t124_wifi_control,
60         },
61 };
62
63 #ifdef CONFIG_MMC_EMBEDDED_SDIO
64 static struct embedded_sdio_data embedded_sdio_data1 = {
65         .cccr = {
66                 .sdio_vsn = 2,
67                 .multi_block = 1,
68                 .low_speed = 0,
69                 .wide_bus = 0,
70                 .high_power = 1,
71                 .high_speed = 1,
72         },
73         .cis = {
74                 .vendor = 0x02d0,
75                 .device = 0x4329,
76         },
77 };
78 #endif
79
80 static struct tegra_sdhci_platform_data tegra_sdhci_platform_data1 = {
81         .mmc_data = {
82                 .register_status_notify = vcm30_t124_wifi_status_register,
83 #ifdef CONFIG_MMC_EMBEDDED_SDIO
84                 .embedded_sdio = &embedded_sdio_data1,
85 #endif
86                 .built_in = 0,
87                 .ocr_mask = MMC_OCR_1V8_MASK,
88         },
89 #ifndef CONFIG_MMC_EMBEDDED_SDIO
90         .pm_flags = MMC_PM_KEEP_POWER,
91 #endif
92         .cd_gpio = -1,
93         .wp_gpio = -1,
94         .power_gpio = -1,
95         .tap_delay = 0x0F,
96         .ddr_clk_limit = 30000000,
97         .is_8bit = false,
98 };
99
100 static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = {
101         .cd_gpio = -1,
102         .wp_gpio = -1,
103         .power_gpio = -1,
104         .is_8bit = false,
105         .tap_delay = 0x4,
106         .trim_delay = 0x4,
107         .ddr_trim_delay = 0x4,
108         .mmc_data = {
109                 .built_in = 1,
110                 .ocr_mask = MMC_OCR_1V8_MASK,
111         },
112         .uhs_mask = MMC_MASK_HS200,
113         .ddr_clk_limit = 30000000,
114         .max_clk_limit = 52000000,
115         /*      .max_clk = 12000000, */
116 };
117
118 static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = {
119         .cd_gpio = TEGRA_GPIO_PQ5,
120         .wp_gpio = TEGRA_GPIO_PQ4,
121         .power_gpio = -1,
122         .tap_delay = 0x0,
123         .trim_delay = 0x3,
124         /*FIXME: Enable UHS modes for SD, bug 1381913 */
125         .uhs_mask = MMC_UHS_MASK_SDR104 |
126                 MMC_UHS_MASK_DDR50 | MMC_UHS_MASK_SDR50 | MMC_UHS_MASK_SDR12 | MMC_UHS_MASK_SDR25,
127         .mmc_data = {
128                 .ocr_mask = MMC_OCR_2V8_MASK,
129         },
130 };
131
132 static struct tegra_sdhci_platform_data tegra_sdhci_platform_data4 = {
133         .cd_gpio = -1,
134         .wp_gpio = -1,
135         .power_gpio = -1,
136         .is_8bit = true,
137         .tap_delay = 0x4,
138         .trim_delay = 0x4,
139         .ddr_trim_delay = 0x4,
140         .mmc_data = {
141                 .built_in = 1,
142                 .ocr_mask = MMC_OCR_1V8_MASK,
143         },
144         .uhs_mask = MMC_MASK_HS200,
145         .ddr_clk_limit = 51000000,
146         .max_clk_limit = 102000000,
147         /*      .max_clk = 12000000, */
148 };
149
150 static int vcm30_t124_wifi_status_register(
151                         void (*callback) (int card_present, void *dev_id),
152                         void *dev_id)
153 {
154         if (wifi_status_cb)
155                 return -EBUSY;
156         wifi_status_cb = callback;
157         wifi_status_cb_devid = dev_id;
158         return 0;
159 }
160
161 static int vcm30_t124_wifi_set_carddetect(int val)
162 {
163
164         if (wifi_status_cb)
165                 wifi_status_cb(val, wifi_status_cb_devid);
166         else
167                 pr_warn("%s: Nobody to notify\n", __func__);
168
169         return 0;
170 }
171
172 static int vcm30_t124_wifi_power(int on)
173 {
174         gpio_set_value_cansleep(MISCIO_WF_EN_GPIO, on);
175         mdelay(100);
176         gpio_set_value_cansleep(MISCIO_WF_RST_GPIO, on);
177         mdelay(200);
178
179         return 0;
180 }
181
182 static int vcm30_t124_wifi_reset(int on)
183 {
184         /*
185          * FIXME: Implement wifi reset
186          */
187         return 0;
188 }
189
190 int __init vcm30_t124_wifi_init(void)
191 {
192         gpio_request(MISCIO_WF_EN_GPIO, "wifi_en");
193         gpio_request(MISCIO_WF_RST_GPIO, "wifi_rst");
194
195 #ifdef CONFIG_TEGRA_PREPOWER_WIFI
196         gpio_direction_output(MISCIO_WF_EN_GPIO, 1);
197         gpio_direction_output(MISCIO_WF_RST_GPIO, 1);
198 #else
199         gpio_direction_output(MISCIO_WF_EN_GPIO, 0);
200         gpio_direction_output(MISCIO_WF_RST_GPIO, 0);
201 #endif
202
203         platform_device_register(&broadcom_wifi_device);
204         return 0;
205 }
206
207 int __init vcm30_t124_sdhci_init(void)
208 {
209         int is_e1860 = 0;
210         tegra_sdhci_device1.dev.platform_data = &tegra_sdhci_platform_data1;
211         tegra_sdhci_device2.dev.platform_data = &tegra_sdhci_platform_data2;
212         tegra_sdhci_device3.dev.platform_data = &tegra_sdhci_platform_data3;
213         tegra_sdhci_device4.dev.platform_data = &tegra_sdhci_platform_data4;
214
215 /* FIXME: Enable this check after SKU support is working */
216 /*      is_e1860 = tegra_is_board(NULL, "61860", NULL, NULL, NULL);
217         if (is_e1860)*/
218                 tegra_sdhci_platform_data3.mmc_data.ocr_mask = MMC_OCR_3V3_MASK;
219
220 /*      platform_device_register(&tegra_sdhci_device1); */
221 /*      platform_device_register(&tegra_sdhci_device2); */
222         platform_device_register(&tegra_sdhci_device4);
223         platform_device_register(&tegra_sdhci_device3);
224
225         return 0;
226 }