6228b651bee1db9832d8c3d72311f54142bbb54b
[linux-2.6.git] / drivers / mmc / host / sdhci-tegra.c
1 /*
2  * Copyright (C) 2010 Google, Inc.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  */
14
15 #include <linux/err.h>
16 #include <linux/init.h>
17 #include <linux/platform_device.h>
18 #include <linux/clk.h>
19 #include <linux/io.h>
20 #include <linux/gpio.h>
21 #include <linux/slab.h>
22 #include <linux/mmc/card.h>
23 #include <linux/mmc/host.h>
24 #include <linux/regulator/consumer.h>
25 #include <linux/delay.h>
26
27 #include <mach/gpio.h>
28 #include <mach/sdhci.h>
29
30 #include "sdhci-pltfm.h"
31
32 #define SDHCI_VENDOR_CLOCK_CNTRL       0x100
33 #define SDHCI_VENDOR_CLOCK_CNTRL_SDMMC_CLK      0x1
34 #define SDHCI_VENDOR_CLOCK_CNTRL_PADPIPE_CLKEN_OVERRIDE 0x8
35 #define SDHCI_VENDOR_CLOCK_CNTRL_BASE_CLK_FREQ_SHIFT    8
36
37 #define SDHCI_VENDOR_MISC_CNTRL         0x120
38 #define SDHCI_VENDOR_MISC_CNTRL_SDMMC_SPARE0_ENABLE_SD_3_0      0x20
39
40 #define SDHOST_1V8_OCR_MASK             0x8
41
42 static void tegra_3x_sdhci_set_card_clock(struct sdhci_host *sdhci, unsigned int clock);
43 static void tegra3_sdhci_post_reset_init(struct sdhci_host *sdhci);
44
45 static unsigned int tegra3_sdhost_max_clk[4] = {
46         208000000,      104000000,      208000000,      104000000 };
47
48 struct tegra_sdhci_hw_ops{
49         /* Set the internal clk and card clk.*/
50         void    (*set_card_clock)(struct sdhci_host *sdhci, unsigned int clock);
51         /* Post reset vendor registers configuration */
52         void    (*sdhost_init)(struct sdhci_host *sdhci);
53 };
54
55 static struct tegra_sdhci_hw_ops tegra_2x_sdhci_ops = {
56 };
57
58 static struct tegra_sdhci_hw_ops tegra_3x_sdhci_ops = {
59         .set_card_clock = tegra_3x_sdhci_set_card_clock,
60         .sdhost_init = tegra3_sdhci_post_reset_init,
61 };
62
63 struct tegra_sdhci_host {
64         bool    clk_enabled;
65         struct regulator *vdd_io_reg;
66         struct regulator *vdd_slot_reg;
67         /* Pointer to the chip specific HW ops */
68         struct tegra_sdhci_hw_ops *hw_ops;
69         /* Host controller instance */
70         unsigned int instance;
71         /* vddio_min */
72         unsigned int vddio_min_uv;
73         /* vddio_max */
74         unsigned int vddio_max_uv;
75 };
76
77 static u32 tegra_sdhci_readl(struct sdhci_host *host, int reg)
78 {
79         u32 val;
80
81         if (unlikely(reg == SDHCI_PRESENT_STATE)) {
82                 /* Use wp_gpio here instead? */
83                 val = readl(host->ioaddr + reg);
84                 return val | SDHCI_WRITE_PROTECT;
85         }
86
87         return readl(host->ioaddr + reg);
88 }
89
90 static u16 tegra_sdhci_readw(struct sdhci_host *host, int reg)
91 {
92 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
93         if (unlikely(reg == SDHCI_HOST_VERSION)) {
94                 /* Erratum: Version register is invalid in HW. */
95                 return SDHCI_SPEC_200;
96         }
97 #endif
98         return readw(host->ioaddr + reg);
99 }
100
101 static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
102 {
103         /* Seems like we're getting spurious timeout and crc errors, so
104          * disable signalling of them. In case of real errors software
105          * timers should take care of eventually detecting them.
106          */
107         if (unlikely(reg == SDHCI_SIGNAL_ENABLE))
108                 val &= ~(SDHCI_INT_TIMEOUT|SDHCI_INT_CRC);
109
110         writel(val, host->ioaddr + reg);
111
112 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
113         if (unlikely(reg == SDHCI_INT_ENABLE)) {
114                 /* Erratum: Must enable block gap interrupt detection */
115                 u8 gap_ctrl = readb(host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
116                 if (val & SDHCI_INT_CARD_INT)
117                         gap_ctrl |= 0x8;
118                 else
119                         gap_ctrl &= ~0x8;
120                 writeb(gap_ctrl, host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
121         }
122 #endif
123 }
124
125 static unsigned int tegra_sdhci_get_ro(struct sdhci_host *sdhci)
126 {
127         struct platform_device *pdev = to_platform_device(mmc_dev(sdhci->mmc));
128         struct tegra_sdhci_platform_data *plat;
129
130         plat = pdev->dev.platform_data;
131
132         if (!gpio_is_valid(plat->wp_gpio))
133                 return -1;
134
135         return gpio_get_value(plat->wp_gpio);
136 }
137
138 static void tegra3_sdhci_post_reset_init(struct sdhci_host *sdhci)
139 {
140         u16 ctrl;
141         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
142         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
143
144         /* Set the base clock frequency */
145         ctrl = sdhci_readw(sdhci, SDHCI_VENDOR_CLOCK_CNTRL);
146         ctrl &= ~(0xFF << SDHCI_VENDOR_CLOCK_CNTRL_BASE_CLK_FREQ_SHIFT);
147         ctrl |= (tegra3_sdhost_max_clk[tegra_host->instance] / 1000000) <<
148                 SDHCI_VENDOR_CLOCK_CNTRL_BASE_CLK_FREQ_SHIFT;
149         sdhci_writew(sdhci, ctrl, SDHCI_VENDOR_CLOCK_CNTRL);
150
151         /* Enable SDHOST v3.0 support */
152         ctrl = sdhci_readw(sdhci, SDHCI_VENDOR_MISC_CNTRL);
153         ctrl |= SDHCI_VENDOR_MISC_CNTRL_SDMMC_SPARE0_ENABLE_SD_3_0;
154         sdhci_writew(sdhci, ctrl, SDHCI_VENDOR_MISC_CNTRL);
155 }
156
157 static int tegra_sdhci_set_uhs_signaling(struct sdhci_host *host,
158                 unsigned int uhs)
159 {
160         u16 clk, ctrl_2;
161         ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
162
163         /* Select Bus Speed Mode for host */
164         ctrl_2 &= ~SDHCI_CTRL_UHS_MASK;
165         switch (uhs) {
166         case MMC_TIMING_UHS_SDR12:
167                 ctrl_2 |= SDHCI_CTRL_UHS_SDR12;
168                 break;
169         case MMC_TIMING_UHS_SDR25:
170                 ctrl_2 |= SDHCI_CTRL_UHS_SDR25;
171                 break;
172         case MMC_TIMING_UHS_SDR50:
173                 ctrl_2 |= SDHCI_CTRL_UHS_SDR50;
174                 break;
175         case MMC_TIMING_UHS_SDR104:
176                 ctrl_2 |= SDHCI_CTRL_UHS_SDR104;
177                 break;
178         case MMC_TIMING_UHS_DDR50:
179                 ctrl_2 |= SDHCI_CTRL_UHS_DDR50;
180                 break;
181         }
182
183         sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2);
184
185         if (uhs == MMC_TIMING_UHS_DDR50) {
186                 clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
187                 clk &= ~(0xFF << SDHCI_DIVIDER_SHIFT);
188                 clk |= 1 << SDHCI_DIVIDER_SHIFT;
189                 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
190         }
191         return 0;
192 }
193
194 static void tegra_sdhci_reset_exit(struct sdhci_host *sdhci, u8 mask)
195 {
196         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
197         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
198
199         if (mask & SDHCI_RESET_ALL) {
200                 if (tegra_host->hw_ops->sdhost_init)
201                         tegra_host->hw_ops->sdhost_init(sdhci);
202         }
203 }
204
205 static void sdhci_status_notify_cb(int card_present, void *dev_id)
206 {
207         struct sdhci_host *sdhci = (struct sdhci_host *)dev_id;
208         struct platform_device *pdev = to_platform_device(mmc_dev(sdhci->mmc));
209         struct tegra_sdhci_platform_data *plat;
210         unsigned int status, oldstat;
211
212         pr_debug("%s: card_present %d\n", mmc_hostname(sdhci->mmc),
213                 card_present);
214
215         plat = pdev->dev.platform_data;
216         if (!plat->mmc_data.status) {
217                 mmc_detect_change(sdhci->mmc, 0);
218                 return;
219         }
220
221         status = plat->mmc_data.status(mmc_dev(sdhci->mmc));
222
223         oldstat = plat->mmc_data.card_present;
224         plat->mmc_data.card_present = status;
225         if (status ^ oldstat) {
226                 pr_debug("%s: Slot status change detected (%d -> %d)\n",
227                         mmc_hostname(sdhci->mmc), oldstat, status);
228                 if (status && !plat->mmc_data.built_in)
229                         mmc_detect_change(sdhci->mmc, (5 * HZ) / 2);
230                 else
231                         mmc_detect_change(sdhci->mmc, 0);
232         }
233 }
234
235 static irqreturn_t carddetect_irq(int irq, void *data)
236 {
237         struct sdhci_host *sdhost = (struct sdhci_host *)data;
238
239         tasklet_schedule(&sdhost->card_tasklet);
240         return IRQ_HANDLED;
241 };
242
243 static int tegra_sdhci_8bit(struct sdhci_host *host, int bus_width)
244 {
245         struct platform_device *pdev = to_platform_device(mmc_dev(host->mmc));
246         struct tegra_sdhci_platform_data *plat;
247         u32 ctrl;
248
249         plat = pdev->dev.platform_data;
250
251         ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
252         if (plat->is_8bit && bus_width == MMC_BUS_WIDTH_8) {
253                 ctrl &= ~SDHCI_CTRL_4BITBUS;
254                 ctrl |= SDHCI_CTRL_8BITBUS;
255         } else {
256                 ctrl &= ~SDHCI_CTRL_8BITBUS;
257                 if (bus_width == MMC_BUS_WIDTH_4)
258                         ctrl |= SDHCI_CTRL_4BITBUS;
259                 else
260                         ctrl &= ~SDHCI_CTRL_4BITBUS;
261         }
262         sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
263         return 0;
264 }
265
266 static void tegra_3x_sdhci_set_card_clock(struct sdhci_host *sdhci, unsigned int clock)
267 {
268         int div;
269         u16 clk;
270         unsigned long timeout;
271         u8 ctrl;
272
273         if (clock && clock == sdhci->clock)
274                 return;
275
276         sdhci_writew(sdhci, 0, SDHCI_CLOCK_CONTROL);
277
278         if (clock == 0)
279                 goto out;
280         if (sdhci->mmc->ios.timing == MMC_TIMING_UHS_DDR50) {
281                 div = 1;
282                 goto set_clk;
283         }
284
285         if (sdhci->version >= SDHCI_SPEC_300) {
286                 /* Version 3.00 divisors must be a multiple of 2. */
287                 if (sdhci->max_clk <= clock) {
288                         div = 1;
289                 } else {
290                         for (div = 2; div < SDHCI_MAX_DIV_SPEC_300; div += 2) {
291                                 if ((sdhci->max_clk / div) <= clock)
292                                         break;
293                         }
294                 }
295         } else {
296                 /* Version 2.00 divisors must be a power of 2. */
297                 for (div = 1; div < SDHCI_MAX_DIV_SPEC_200; div *= 2) {
298                         if ((sdhci->max_clk / div) <= clock)
299                                 break;
300                 }
301         }
302         div >>= 1;
303
304         /*
305          * Tegra3 sdmmc controller internal clock will not be stabilized when
306          * we use a clock divider value greater than 4. The WAR is as follows.
307          * - Enable PADPIPE_CLK_OVERRIDE in the vendr clk cntrl register.
308          * - Enable internal clock.
309          * - Wait for 5 usec and do a dummy write.
310          * - Poll for clk stable and disable PADPIPE_CLK_OVERRIDE.
311          */
312 set_clk:
313         /* Enable PADPIPE clk override */
314         ctrl = sdhci_readb(sdhci, SDHCI_VENDOR_CLOCK_CNTRL);
315         ctrl |= SDHCI_VENDOR_CLOCK_CNTRL_PADPIPE_CLKEN_OVERRIDE;
316         sdhci_writeb(sdhci, ctrl, SDHCI_VENDOR_CLOCK_CNTRL);
317
318         clk = (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
319         clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN)
320                 << SDHCI_DIVIDER_HI_SHIFT;
321         clk |= SDHCI_CLOCK_INT_EN;
322         sdhci_writew(sdhci, clk, SDHCI_CLOCK_CONTROL);
323
324         /* Wait for 5 usec */
325         udelay(5);
326
327         /* Do a dummy write */
328         ctrl = sdhci_readb(sdhci, SDHCI_CAPABILITIES);
329         ctrl |= 1;
330         sdhci_writeb(sdhci, ctrl, SDHCI_CAPABILITIES);
331
332         /* Wait max 20 ms */
333         timeout = 20;
334         while (!((clk = sdhci_readw(sdhci, SDHCI_CLOCK_CONTROL))
335                 & SDHCI_CLOCK_INT_STABLE)) {
336                 if (timeout == 0) {
337                         dev_err(mmc_dev(sdhci->mmc), "Internal clock never stabilised\n");
338                         return;
339                 }
340                 timeout--;
341                 mdelay(1);
342         }
343
344         /* Disable PADPIPE clk override */
345         ctrl = sdhci_readb(sdhci, SDHCI_VENDOR_CLOCK_CNTRL);
346         ctrl &= ~SDHCI_VENDOR_CLOCK_CNTRL_PADPIPE_CLKEN_OVERRIDE;
347         sdhci_writeb(sdhci, ctrl, SDHCI_VENDOR_CLOCK_CNTRL);
348
349         clk |= SDHCI_CLOCK_CARD_EN;
350         sdhci_writew(sdhci, clk, SDHCI_CLOCK_CONTROL);
351
352 out:
353         sdhci->clock = clock;
354 }
355
356 static void tegra_sdhci_set_clock(struct sdhci_host *sdhci, unsigned int clock)
357 {
358         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
359         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
360         u8 ctrl;
361
362         pr_debug("%s %s %u enabled=%u\n", __func__,
363                 mmc_hostname(sdhci->mmc), clock, tegra_host->clk_enabled);
364
365         if (clock) {
366                 if (!tegra_host->clk_enabled) {
367                         clk_enable(pltfm_host->clk);
368                         ctrl = sdhci_readb(sdhci, SDHCI_VENDOR_CLOCK_CNTRL);
369                         ctrl |= SDHCI_VENDOR_CLOCK_CNTRL_SDMMC_CLK;
370                         sdhci_writeb(sdhci, ctrl, SDHCI_VENDOR_CLOCK_CNTRL);
371                         tegra_host->clk_enabled = true;
372                 }
373                 if (tegra_host->hw_ops->set_card_clock)
374                         tegra_host->hw_ops->set_card_clock(sdhci, clock);
375         } else if (!clock && tegra_host->clk_enabled) {
376                 if (tegra_host->hw_ops->set_card_clock)
377                         tegra_host->hw_ops->set_card_clock(sdhci, clock);
378                 ctrl = sdhci_readb(sdhci, SDHCI_VENDOR_CLOCK_CNTRL);
379                 ctrl &= ~SDHCI_VENDOR_CLOCK_CNTRL_SDMMC_CLK;
380                 sdhci_writeb(sdhci, ctrl, SDHCI_VENDOR_CLOCK_CNTRL);
381                 clk_disable(pltfm_host->clk);
382                 tegra_host->clk_enabled = false;
383         }
384 }
385
386 static int tegra_sdhci_suspend(struct sdhci_host *sdhci, pm_message_t state)
387 {
388         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
389         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
390
391         tegra_sdhci_set_clock(sdhci, 0);
392
393         /* Disable the power rails if any */
394         if (tegra_host->vdd_slot_reg)
395                 regulator_disable(tegra_host->vdd_slot_reg);
396         if (tegra_host->vdd_io_reg)
397                 regulator_disable(tegra_host->vdd_io_reg);
398         return 0;
399 }
400
401 static int tegra_sdhci_resume(struct sdhci_host *sdhci)
402 {
403         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
404         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
405         unsigned long timeout;
406
407         /* Enable the power rails if any */
408         if (tegra_host->vdd_io_reg)
409                 regulator_enable(tegra_host->vdd_io_reg);
410         if (tegra_host->vdd_slot_reg)
411                 regulator_enable(tegra_host->vdd_slot_reg);
412
413         /* Setting the min identification clock of freq 400KHz */
414         tegra_sdhci_set_clock(sdhci, 400000);
415
416         /* Reset the controller and power on if MMC_KEEP_POWER flag is set*/
417         if (sdhci->mmc->pm_flags & MMC_PM_KEEP_POWER) {
418                 sdhci_writeb(sdhci, SDHCI_RESET_ALL, SDHCI_SOFTWARE_RESET);
419
420                 /* Wait max 100 ms */
421                 timeout = 100;
422
423                 /* hw clears the bit when it's done */
424                 while (sdhci_readb(sdhci, SDHCI_SOFTWARE_RESET) & SDHCI_RESET_ALL) {
425                         if (timeout == 0) {
426                                 printk(KERN_ERR "%s: Reset 0x%x never completed.\n",
427                                         mmc_hostname(sdhci->mmc), (int)SDHCI_RESET_ALL);
428                                 return -ETIMEDOUT;
429                         }
430                         timeout--;
431                         mdelay(1);
432                 }
433
434                 sdhci_writeb(sdhci, SDHCI_POWER_ON, SDHCI_POWER_CONTROL);
435                 sdhci->pwr = 0;
436         }
437
438         return 0;
439 }
440
441 static struct sdhci_ops tegra_sdhci_ops = {
442         .get_ro     = tegra_sdhci_get_ro,
443         .read_l     = tegra_sdhci_readl,
444         .read_w     = tegra_sdhci_readw,
445         .write_l    = tegra_sdhci_writel,
446         .platform_8bit_width = tegra_sdhci_8bit,
447         .set_clock  = tegra_sdhci_set_clock,
448         .suspend    = tegra_sdhci_suspend,
449         .resume     = tegra_sdhci_resume,
450         .platform_reset_exit = tegra_sdhci_reset_exit,
451         .set_uhs_signaling = tegra_sdhci_set_uhs_signaling,
452 };
453
454 static struct sdhci_pltfm_data sdhci_tegra_pdata = {
455         .quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
456 #ifndef CONFIG_ARCH_TEGRA_2x_SOC
457                   SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
458 #endif
459 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
460                   SDHCI_QUIRK_NONSTANDARD_CLOCK |
461 #endif
462                   SDHCI_QUIRK_SINGLE_POWER_WRITE |
463                   SDHCI_QUIRK_NO_HISPD_BIT |
464                   SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC,
465         .ops  = &tegra_sdhci_ops,
466 };
467
468 static int __devinit sdhci_tegra_probe(struct platform_device *pdev)
469 {
470         struct sdhci_pltfm_host *pltfm_host;
471         struct tegra_sdhci_platform_data *plat;
472         struct sdhci_host *host;
473         struct tegra_sdhci_host *tegra_host;
474         struct clk *clk;
475         int rc;
476
477         host = sdhci_pltfm_init(pdev, &sdhci_tegra_pdata);
478         if (IS_ERR(host))
479                 return PTR_ERR(host);
480
481         pltfm_host = sdhci_priv(host);
482
483         plat = pdev->dev.platform_data;
484
485         if (plat == NULL) {
486                 dev_err(mmc_dev(host->mmc), "missing platform data\n");
487                 rc = -ENXIO;
488                 goto err_no_plat;
489         }
490
491         tegra_host = kzalloc(sizeof(struct tegra_sdhci_host), GFP_KERNEL);
492         if (tegra_host == NULL) {
493                 dev_err(mmc_dev(host->mmc), "failed to allocate tegra host\n");
494                 return -ENOMEM;
495         }
496
497 #ifdef CONFIG_MMC_EMBEDDED_SDIO
498         if (plat->mmc_data.embedded_sdio)
499                 mmc_set_embedded_sdio_data(host->mmc,
500                         &plat->mmc_data.embedded_sdio->cis,
501                         &plat->mmc_data.embedded_sdio->cccr,
502                         plat->mmc_data.embedded_sdio->funcs,
503                         plat->mmc_data.embedded_sdio->num_funcs);
504 #endif
505
506         if (gpio_is_valid(plat->power_gpio)) {
507                 rc = gpio_request(plat->power_gpio, "sdhci_power");
508                 if (rc) {
509                         dev_err(mmc_dev(host->mmc),
510                                 "failed to allocate power gpio\n");
511                         goto err_power_req;
512                 }
513                 tegra_gpio_enable(plat->power_gpio);
514                 gpio_direction_output(plat->power_gpio, 1);
515         }
516
517         if (gpio_is_valid(plat->cd_gpio)) {
518                 rc = gpio_request(plat->cd_gpio, "sdhci_cd");
519                 if (rc) {
520                         dev_err(mmc_dev(host->mmc),
521                                 "failed to allocate cd gpio\n");
522                         goto err_cd_req;
523                 }
524                 tegra_gpio_enable(plat->cd_gpio);
525                 gpio_direction_input(plat->cd_gpio);
526
527                 rc = request_irq(gpio_to_irq(plat->cd_gpio), carddetect_irq,
528                                  IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
529                                  mmc_hostname(host->mmc), host);
530
531                 if (rc) {
532                         dev_err(mmc_dev(host->mmc), "request irq error\n");
533                         goto err_cd_irq_req;
534                 }
535                 rc = enable_irq_wake(gpio_to_irq(plat->cd_gpio));
536                 if (rc < 0)
537                         dev_err(mmc_dev(host->mmc),
538                                 "SD card wake-up event registration"
539                                         "failed with eroor: %d\n", rc);
540
541         } else if (plat->mmc_data.register_status_notify) {
542                 plat->mmc_data.register_status_notify(sdhci_status_notify_cb, host);
543         }
544
545         if (plat->mmc_data.status) {
546                 plat->mmc_data.card_present = plat->mmc_data.status(mmc_dev(host->mmc));
547         }
548
549         if (gpio_is_valid(plat->wp_gpio)) {
550                 rc = gpio_request(plat->wp_gpio, "sdhci_wp");
551                 if (rc) {
552                         dev_err(mmc_dev(host->mmc),
553                                 "failed to allocate wp gpio\n");
554                         goto err_wp_req;
555                 }
556                 tegra_gpio_enable(plat->wp_gpio);
557                 gpio_direction_input(plat->wp_gpio);
558         }
559
560
561         if (!plat->mmc_data.built_in) {
562                 if (plat->mmc_data.ocr_mask & SDHOST_1V8_OCR_MASK) {
563                         tegra_host->vddio_min_uv = 1800000;
564                         tegra_host->vddio_max_uv = 1800000;
565                 } else {
566                         /*
567                          * Set the minV and maxV to default
568                          * voltage range of 2.7V - 3.6V
569                          */
570                         tegra_host->vddio_min_uv = 2700000;
571                         tegra_host->vddio_max_uv = 3600000;
572                 }
573                 tegra_host->vdd_io_reg = regulator_get(mmc_dev(host->mmc), "vddio_sdmmc");
574                 if (IS_ERR_OR_NULL(tegra_host->vdd_io_reg)) {
575                         dev_err(mmc_dev(host->mmc), "%s regulator not found: %ld\n",
576                                 "vddio_sdmmc", PTR_ERR(tegra_host->vdd_io_reg));
577                         tegra_host->vdd_io_reg = NULL;
578                 } else {
579                         rc = regulator_set_voltage(tegra_host->vdd_io_reg,
580                                 tegra_host->vddio_min_uv,
581                                 tegra_host->vddio_max_uv);
582                         if (rc) {
583                                 dev_err(mmc_dev(host->mmc), "%s regulator_set_voltage failed: %d",
584                                         "vddio_sdmmc", rc);
585                         } else {
586                                 regulator_enable(tegra_host->vdd_io_reg);
587                         }
588                 }
589
590                 tegra_host->vdd_slot_reg = regulator_get(mmc_dev(host->mmc), "vddio_sd_slot");
591                 if (IS_ERR_OR_NULL(tegra_host->vdd_slot_reg)) {
592                         dev_err(mmc_dev(host->mmc), "%s regulator not found: %ld\n",
593                                 "vddio_sd_slot", PTR_ERR(tegra_host->vdd_slot_reg));
594                         tegra_host->vdd_slot_reg = NULL;
595                 } else {
596                         regulator_enable(tegra_host->vdd_slot_reg);
597                 }
598         }
599
600         clk = clk_get(mmc_dev(host->mmc), NULL);
601         if (IS_ERR(clk)) {
602                 dev_err(mmc_dev(host->mmc), "clk err\n");
603                 rc = PTR_ERR(clk);
604                 goto err_clk_get;
605         }
606         rc = clk_enable(clk);
607         if (rc != 0)
608                 goto err_clk_put;
609         pltfm_host->clk = clk;
610         pltfm_host->priv = tegra_host;
611         tegra_host->clk_enabled = true;
612         tegra_host->instance = pdev->id;
613
614         host->mmc->pm_caps = plat->pm_flags;
615
616         host->mmc->caps |= MMC_CAP_ERASE;
617         host->mmc->caps |= MMC_CAP_DISABLE;
618         /* enable 1/8V DDR capable */
619         host->mmc->caps |= MMC_CAP_1_8V_DDR;
620         if (plat->is_8bit)
621                 host->mmc->caps |= MMC_CAP_8_BIT_DATA;
622         host->mmc->caps |= MMC_CAP_SDIO_IRQ;
623
624         if (plat->mmc_data.built_in) {
625                 host->mmc->caps |= MMC_CAP_NONREMOVABLE;
626         }
627         /* Do not turn OFF embedded sdio cards as it support Wake on Wireless */
628         if (plat->mmc_data.embedded_sdio)
629                 host->mmc->pm_flags = MMC_PM_KEEP_POWER;
630
631 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
632         tegra_host->hw_ops = &tegra_2x_sdhci_ops;
633 #else
634         tegra_host->hw_ops = &tegra_3x_sdhci_ops;
635 #endif
636
637         rc = sdhci_add_host(host);
638         if (rc)
639                 goto err_add_host;
640
641         return 0;
642
643 err_add_host:
644         clk_disable(pltfm_host->clk);
645 err_clk_put:
646         clk_put(pltfm_host->clk);
647 err_clk_get:
648         if (gpio_is_valid(plat->wp_gpio)) {
649                 tegra_gpio_disable(plat->wp_gpio);
650                 gpio_free(plat->wp_gpio);
651         }
652 err_wp_req:
653         if (gpio_is_valid(plat->cd_gpio))
654                 free_irq(gpio_to_irq(plat->cd_gpio), host);
655 err_cd_irq_req:
656         if (gpio_is_valid(plat->cd_gpio)) {
657                 tegra_gpio_disable(plat->cd_gpio);
658                 gpio_free(plat->cd_gpio);
659         }
660 err_cd_req:
661         if (gpio_is_valid(plat->power_gpio)) {
662                 tegra_gpio_disable(plat->power_gpio);
663                 gpio_free(plat->power_gpio);
664         }
665 err_power_req:
666 err_no_plat:
667         sdhci_pltfm_free(pdev);
668         kfree(tegra_host);
669         return rc;
670 }
671
672 static int __devexit sdhci_tegra_remove(struct platform_device *pdev)
673 {
674         struct sdhci_host *host = platform_get_drvdata(pdev);
675         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
676         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
677         struct tegra_sdhci_platform_data *plat;
678         int dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);
679
680         sdhci_remove_host(host, dead);
681
682         plat = pdev->dev.platform_data;
683
684         disable_irq_wake(gpio_to_irq(plat->cd_gpio));
685
686         if (tegra_host->vdd_slot_reg) {
687                 regulator_disable(tegra_host->vdd_slot_reg);
688                 regulator_put(tegra_host->vdd_slot_reg);
689         }
690
691         if (tegra_host->vdd_io_reg) {
692                 regulator_disable(tegra_host->vdd_io_reg);
693                 regulator_put(tegra_host->vdd_io_reg);
694         }
695
696         if (gpio_is_valid(plat->wp_gpio)) {
697                 tegra_gpio_disable(plat->wp_gpio);
698                 gpio_free(plat->wp_gpio);
699         }
700
701         if (gpio_is_valid(plat->cd_gpio)) {
702                 free_irq(gpio_to_irq(plat->cd_gpio), host);
703                 tegra_gpio_disable(plat->cd_gpio);
704                 gpio_free(plat->cd_gpio);
705         }
706
707         if (gpio_is_valid(plat->power_gpio)) {
708                 tegra_gpio_disable(plat->power_gpio);
709                 gpio_free(plat->power_gpio);
710         }
711
712         if (tegra_host->clk_enabled)
713                 clk_disable(pltfm_host->clk);
714         clk_put(pltfm_host->clk);
715
716         sdhci_pltfm_free(pdev);
717         kfree(tegra_host);
718
719         return 0;
720 }
721
722 static struct platform_driver sdhci_tegra_driver = {
723         .driver         = {
724                 .name   = "sdhci-tegra",
725                 .owner  = THIS_MODULE,
726         },
727         .probe          = sdhci_tegra_probe,
728         .remove         = __devexit_p(sdhci_tegra_remove),
729 #ifdef CONFIG_PM
730         .suspend        = sdhci_pltfm_suspend,
731         .resume         = sdhci_pltfm_resume,
732 #endif
733 };
734
735 static int __init sdhci_tegra_init(void)
736 {
737         return platform_driver_register(&sdhci_tegra_driver);
738 }
739 module_init(sdhci_tegra_init);
740
741 static void __exit sdhci_tegra_exit(void)
742 {
743         platform_driver_unregister(&sdhci_tegra_driver);
744 }
745 module_exit(sdhci_tegra_exit);
746
747 MODULE_DESCRIPTION("SDHCI driver for Tegra");
748 MODULE_AUTHOR(" Google, Inc.");
749 MODULE_LICENSE("GPL v2");