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