e9995a116668907e19b0ca8b9d553e4e65557b71
[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_PADPIPE_CLKEN_OVERRIDE 0x8
34
35 static void tegra_3x_sdhci_set_card_clock(struct sdhci_host *sdhci, unsigned int clock);
36
37 struct tegra_sdhci_hw_ops{
38         /* Set the internal clk and card clk.*/
39         void    (*set_card_clock)(struct sdhci_host *sdhci, unsigned int clock);
40 };
41
42 static struct tegra_sdhci_hw_ops tegra_2x_sdhci_ops = {
43 };
44
45 static struct tegra_sdhci_hw_ops tegra_3x_sdhci_ops = {
46         .set_card_clock = tegra_3x_sdhci_set_card_clock,
47 };
48
49 struct tegra_sdhci_host {
50         bool    clk_enabled;
51         struct regulator *vdd_io_reg;
52         struct regulator *vdd_slot_reg;
53         /* Pointer to the chip specific HW ops */
54         struct tegra_sdhci_hw_ops *hw_ops;
55 };
56
57 static u32 tegra_sdhci_readl(struct sdhci_host *host, int reg)
58 {
59         u32 val;
60
61         if (unlikely(reg == SDHCI_PRESENT_STATE)) {
62                 /* Use wp_gpio here instead? */
63                 val = readl(host->ioaddr + reg);
64                 return val | SDHCI_WRITE_PROTECT;
65         }
66
67         return readl(host->ioaddr + reg);
68 }
69
70 static u16 tegra_sdhci_readw(struct sdhci_host *host, int reg)
71 {
72         if (unlikely(reg == SDHCI_HOST_VERSION)) {
73                 /* Erratum: Version register is invalid in HW. */
74                 return SDHCI_SPEC_200;
75         }
76
77         return readw(host->ioaddr + reg);
78 }
79
80 static void tegra_sdhci_writel(struct sdhci_host *host, u32 val, int reg)
81 {
82         /* Seems like we're getting spurious timeout and crc errors, so
83          * disable signalling of them. In case of real errors software
84          * timers should take care of eventually detecting them.
85          */
86         if (unlikely(reg == SDHCI_SIGNAL_ENABLE))
87                 val &= ~(SDHCI_INT_TIMEOUT|SDHCI_INT_CRC);
88
89         writel(val, host->ioaddr + reg);
90
91 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
92         if (unlikely(reg == SDHCI_INT_ENABLE)) {
93                 /* Erratum: Must enable block gap interrupt detection */
94                 u8 gap_ctrl = readb(host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
95                 if (val & SDHCI_INT_CARD_INT)
96                         gap_ctrl |= 0x8;
97                 else
98                         gap_ctrl &= ~0x8;
99                 writeb(gap_ctrl, host->ioaddr + SDHCI_BLOCK_GAP_CONTROL);
100         }
101 #endif
102 }
103
104 static unsigned int tegra_sdhci_get_ro(struct sdhci_host *sdhci)
105 {
106         struct platform_device *pdev = to_platform_device(mmc_dev(sdhci->mmc));
107         struct tegra_sdhci_platform_data *plat;
108
109         plat = pdev->dev.platform_data;
110
111         if (!gpio_is_valid(plat->wp_gpio))
112                 return -1;
113
114         return gpio_get_value(plat->wp_gpio);
115 }
116
117 static void sdhci_status_notify_cb(int card_present, void *dev_id)
118 {
119         struct sdhci_host *sdhci = (struct sdhci_host *)dev_id;
120         struct platform_device *pdev = to_platform_device(mmc_dev(sdhci->mmc));
121         struct tegra_sdhci_platform_data *plat;
122         unsigned int status, oldstat;
123
124         pr_debug("%s: card_present %d\n", mmc_hostname(sdhci->mmc),
125                 card_present);
126
127         plat = pdev->dev.platform_data;
128         if (!plat->mmc_data.status) {
129                 mmc_detect_change(sdhci->mmc, 0);
130                 return;
131         }
132
133         status = plat->mmc_data.status(mmc_dev(sdhci->mmc));
134
135         oldstat = plat->mmc_data.card_present;
136         plat->mmc_data.card_present = status;
137         if (status ^ oldstat) {
138                 pr_debug("%s: Slot status change detected (%d -> %d)\n",
139                         mmc_hostname(sdhci->mmc), oldstat, status);
140                 if (status && !plat->mmc_data.built_in)
141                         mmc_detect_change(sdhci->mmc, (5 * HZ) / 2);
142                 else
143                         mmc_detect_change(sdhci->mmc, 0);
144         }
145 }
146
147 static irqreturn_t carddetect_irq(int irq, void *data)
148 {
149         struct sdhci_host *sdhost = (struct sdhci_host *)data;
150
151         tasklet_schedule(&sdhost->card_tasklet);
152         return IRQ_HANDLED;
153 };
154
155 static int tegra_sdhci_8bit(struct sdhci_host *host, int bus_width)
156 {
157         struct platform_device *pdev = to_platform_device(mmc_dev(host->mmc));
158         struct tegra_sdhci_platform_data *plat;
159         u32 ctrl;
160
161         plat = pdev->dev.platform_data;
162
163         ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
164         if (plat->is_8bit && bus_width == MMC_BUS_WIDTH_8) {
165                 ctrl &= ~SDHCI_CTRL_4BITBUS;
166                 ctrl |= SDHCI_CTRL_8BITBUS;
167         } else {
168                 ctrl &= ~SDHCI_CTRL_8BITBUS;
169                 if (bus_width == MMC_BUS_WIDTH_4)
170                         ctrl |= SDHCI_CTRL_4BITBUS;
171                 else
172                         ctrl &= ~SDHCI_CTRL_4BITBUS;
173         }
174         sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
175         return 0;
176 }
177
178 static void tegra_3x_sdhci_set_card_clock(struct sdhci_host *sdhci, unsigned int clock)
179 {
180         int div;
181         u16 clk;
182         unsigned long timeout;
183         u8 ctrl;
184
185         if (clock && clock == sdhci->clock)
186                 return;
187
188         sdhci_writew(sdhci, 0, SDHCI_CLOCK_CONTROL);
189
190         if (clock == 0)
191                 goto out;
192
193         if (sdhci->version >= SDHCI_SPEC_300) {
194                 /* Version 3.00 divisors must be a multiple of 2. */
195                 if (sdhci->max_clk <= clock) {
196                         div = 1;
197                 } else {
198                         for (div = 2; div < SDHCI_MAX_DIV_SPEC_300; div += 2) {
199                                 if ((sdhci->max_clk / div) <= clock)
200                                         break;
201                         }
202                 }
203         } else {
204                 /* Version 2.00 divisors must be a power of 2. */
205                 for (div = 1; div < SDHCI_MAX_DIV_SPEC_200; div *= 2) {
206                         if ((sdhci->max_clk / div) <= clock)
207                                 break;
208                 }
209         }
210         div >>= 1;
211
212         /*
213          * Tegra3 sdmmc controller internal clock will not be stabilized when
214          * we use a clock divider value greater than 4. The WAR is as follows.
215          * - Enable PADPIPE_CLK_OVERRIDE in the vendr clk cntrl register.
216          * - Enable internal clock.
217          * - Wait for 5 usec and do a dummy write.
218          * - Poll for clk stable and disable PADPIPE_CLK_OVERRIDE.
219          */
220
221         /* Enable PADPIPE clk override */
222         ctrl = sdhci_readb(sdhci, SDHCI_VENDOR_CLOCK_CNTRL);
223         ctrl |= SDHCI_VENDOR_CLOCK_CNTRL_PADPIPE_CLKEN_OVERRIDE;
224         sdhci_writeb(sdhci, ctrl, SDHCI_VENDOR_CLOCK_CNTRL);
225
226         clk = (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
227         clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN)
228                 << SDHCI_DIVIDER_HI_SHIFT;
229         clk |= SDHCI_CLOCK_INT_EN;
230         sdhci_writew(sdhci, clk, SDHCI_CLOCK_CONTROL);
231
232         /* Wait for 5 usec */
233         udelay(5);
234
235         /* Do a dummy write */
236         ctrl = sdhci_readb(sdhci, SDHCI_CAPABILITIES);
237         ctrl |= 1;
238         sdhci_writeb(sdhci, ctrl, SDHCI_CAPABILITIES);
239
240         /* Wait max 20 ms */
241         timeout = 20;
242         while (!((clk = sdhci_readw(sdhci, SDHCI_CLOCK_CONTROL))
243                 & SDHCI_CLOCK_INT_STABLE)) {
244                 if (timeout == 0) {
245                         dev_err(mmc_dev(sdhci->mmc), "Internal clock never stabilised\n");
246                         return;
247                 }
248                 timeout--;
249                 mdelay(1);
250         }
251
252         /* Disable PADPIPE clk override */
253         ctrl = sdhci_readb(sdhci, SDHCI_VENDOR_CLOCK_CNTRL);
254         ctrl &= ~SDHCI_VENDOR_CLOCK_CNTRL_PADPIPE_CLKEN_OVERRIDE;
255         sdhci_writeb(sdhci, ctrl, SDHCI_VENDOR_CLOCK_CNTRL);
256
257         clk |= SDHCI_CLOCK_CARD_EN;
258         sdhci_writew(sdhci, clk, SDHCI_CLOCK_CONTROL);
259
260 out:
261         sdhci->clock = clock;
262 }
263
264 static void tegra_sdhci_set_clock(struct sdhci_host *sdhci, unsigned int clock)
265 {
266         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
267         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
268
269         pr_debug("%s %s %u enabled=%u\n", __func__,
270                 mmc_hostname(sdhci->mmc), clock, tegra_host->clk_enabled);
271
272         if (clock) {
273                 if (!tegra_host->clk_enabled) {
274                         clk_enable(pltfm_host->clk);
275                         sdhci_writeb(sdhci, 1, SDHCI_VENDOR_CLOCK_CNTRL);
276                         tegra_host->clk_enabled = true;
277                 }
278                 if (tegra_host->hw_ops->set_card_clock)
279                         tegra_host->hw_ops->set_card_clock(sdhci, clock);
280         } else if (!clock && tegra_host->clk_enabled) {
281                 if (tegra_host->hw_ops->set_card_clock)
282                         tegra_host->hw_ops->set_card_clock(sdhci, clock);
283                 sdhci_writeb(sdhci, 0, SDHCI_VENDOR_CLOCK_CNTRL);
284                 clk_disable(pltfm_host->clk);
285                 tegra_host->clk_enabled = false;
286         }
287 }
288
289 static int tegra_sdhci_suspend(struct sdhci_host *sdhci, pm_message_t state)
290 {
291         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
292         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
293
294         tegra_sdhci_set_clock(sdhci, 0);
295
296         /* Disable the power rails if any */
297         if (tegra_host->vdd_slot_reg)
298                 regulator_disable(tegra_host->vdd_slot_reg);
299         if (tegra_host->vdd_io_reg)
300                 regulator_disable(tegra_host->vdd_io_reg);
301         return 0;
302 }
303
304 static int tegra_sdhci_resume(struct sdhci_host *sdhci)
305 {
306         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(sdhci);
307         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
308         unsigned long timeout;
309
310         /* Enable the power rails if any */
311         if (tegra_host->vdd_io_reg)
312                 regulator_enable(tegra_host->vdd_io_reg);
313         if (tegra_host->vdd_slot_reg)
314                 regulator_enable(tegra_host->vdd_slot_reg);
315
316         /* Setting the min identification clock of freq 400KHz */
317         tegra_sdhci_set_clock(sdhci, 400000);
318
319         /* Reset the controller and power on if MMC_KEEP_POWER flag is set*/
320         if (sdhci->mmc->pm_flags & MMC_PM_KEEP_POWER) {
321                 sdhci_writeb(sdhci, SDHCI_RESET_ALL, SDHCI_SOFTWARE_RESET);
322
323                 /* Wait max 100 ms */
324                 timeout = 100;
325
326                 /* hw clears the bit when it's done */
327                 while (sdhci_readb(sdhci, SDHCI_SOFTWARE_RESET) & SDHCI_RESET_ALL) {
328                         if (timeout == 0) {
329                                 printk(KERN_ERR "%s: Reset 0x%x never completed.\n",
330                                         mmc_hostname(sdhci->mmc), (int)SDHCI_RESET_ALL);
331                                 return -ETIMEDOUT;
332                         }
333                         timeout--;
334                         mdelay(1);
335                 }
336
337                 sdhci_writeb(sdhci, SDHCI_POWER_ON, SDHCI_POWER_CONTROL);
338                 sdhci->pwr = 0;
339         }
340
341         return 0;
342 }
343
344 static struct sdhci_ops tegra_sdhci_ops = {
345         .get_ro     = tegra_sdhci_get_ro,
346         .read_l     = tegra_sdhci_readl,
347         .read_w     = tegra_sdhci_readw,
348         .write_l    = tegra_sdhci_writel,
349         .platform_8bit_width = tegra_sdhci_8bit,
350         .set_clock  = tegra_sdhci_set_clock,
351         .suspend    = tegra_sdhci_suspend,
352         .resume     = tegra_sdhci_resume,
353 };
354
355 static struct sdhci_pltfm_data sdhci_tegra_pdata = {
356         .quirks = SDHCI_QUIRK_BROKEN_TIMEOUT_VAL |
357 #ifndef CONFIG_ARCH_TEGRA_2x_SOC
358                   SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK |
359 #endif
360 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
361                   SDHCI_QUIRK_NONSTANDARD_CLOCK |
362 #endif
363                   SDHCI_QUIRK_SINGLE_POWER_WRITE |
364                   SDHCI_QUIRK_NO_HISPD_BIT |
365                   SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC,
366         .ops  = &tegra_sdhci_ops,
367 };
368
369 static int __devinit sdhci_tegra_probe(struct platform_device *pdev)
370 {
371         struct sdhci_pltfm_host *pltfm_host;
372         struct tegra_sdhci_platform_data *plat;
373         struct sdhci_host *host;
374         struct tegra_sdhci_host *tegra_host;
375         struct clk *clk;
376         int rc;
377         void __iomem *ioaddr_clk_rst;
378         unsigned int val = 0;
379
380         ioaddr_clk_rst = ioremap(0x60006300, 0x400);
381         val = readl(ioaddr_clk_rst + 0xa0);
382         val |= 0x68;
383         writel(val, ioaddr_clk_rst + 0xa0);
384
385         host = sdhci_pltfm_init(pdev, &sdhci_tegra_pdata);
386         if (IS_ERR(host))
387                 return PTR_ERR(host);
388
389         pltfm_host = sdhci_priv(host);
390
391         plat = pdev->dev.platform_data;
392
393         if (plat == NULL) {
394                 dev_err(mmc_dev(host->mmc), "missing platform data\n");
395                 rc = -ENXIO;
396                 goto err_no_plat;
397         }
398
399         tegra_host = kzalloc(sizeof(struct tegra_sdhci_host), GFP_KERNEL);
400         if (tegra_host == NULL) {
401                 dev_err(mmc_dev(host->mmc), "failed to allocate tegra host\n");
402                 return -ENOMEM;
403         }
404
405 #ifdef CONFIG_MMC_EMBEDDED_SDIO
406         if (plat->mmc_data.embedded_sdio)
407                 mmc_set_embedded_sdio_data(host->mmc,
408                         &plat->mmc_data.embedded_sdio->cis,
409                         &plat->mmc_data.embedded_sdio->cccr,
410                         plat->mmc_data.embedded_sdio->funcs,
411                         plat->mmc_data.embedded_sdio->num_funcs);
412 #endif
413
414         if (gpio_is_valid(plat->power_gpio)) {
415                 rc = gpio_request(plat->power_gpio, "sdhci_power");
416                 if (rc) {
417                         dev_err(mmc_dev(host->mmc),
418                                 "failed to allocate power gpio\n");
419                         goto err_power_req;
420                 }
421                 tegra_gpio_enable(plat->power_gpio);
422                 gpio_direction_output(plat->power_gpio, 1);
423         }
424
425         if (gpio_is_valid(plat->cd_gpio)) {
426                 rc = gpio_request(plat->cd_gpio, "sdhci_cd");
427                 if (rc) {
428                         dev_err(mmc_dev(host->mmc),
429                                 "failed to allocate cd gpio\n");
430                         goto err_cd_req;
431                 }
432                 tegra_gpio_enable(plat->cd_gpio);
433                 gpio_direction_input(plat->cd_gpio);
434
435                 rc = request_irq(gpio_to_irq(plat->cd_gpio), carddetect_irq,
436                                  IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
437                                  mmc_hostname(host->mmc), host);
438
439                 if (rc) {
440                         dev_err(mmc_dev(host->mmc), "request irq error\n");
441                         goto err_cd_irq_req;
442                 }
443
444         } else if (plat->mmc_data.register_status_notify) {
445                 plat->mmc_data.register_status_notify(sdhci_status_notify_cb, host);
446         }
447
448         if (plat->mmc_data.status) {
449                 plat->mmc_data.card_present = plat->mmc_data.status(mmc_dev(host->mmc));
450         }
451
452         if (gpio_is_valid(plat->wp_gpio)) {
453                 rc = gpio_request(plat->wp_gpio, "sdhci_wp");
454                 if (rc) {
455                         dev_err(mmc_dev(host->mmc),
456                                 "failed to allocate wp gpio\n");
457                         goto err_wp_req;
458                 }
459                 tegra_gpio_enable(plat->wp_gpio);
460                 gpio_direction_input(plat->wp_gpio);
461         }
462
463         if (!plat->mmc_data.built_in) {
464                 tegra_host->vdd_io_reg = regulator_get(mmc_dev(host->mmc), "vddio_sdmmc");
465                 if (WARN_ON(IS_ERR_OR_NULL(tegra_host->vdd_io_reg))) {
466                         dev_err(mmc_dev(host->mmc), "%s regulator not found: %ld\n",
467                                 "vddio_sdmmc", PTR_ERR(tegra_host->vdd_io_reg));
468                         tegra_host->vdd_io_reg = NULL;
469                 } else {
470                         rc = regulator_set_voltage(tegra_host->vdd_io_reg,
471                                 3280000, 3320000);
472                         if (rc) {
473                                 dev_err(mmc_dev(host->mmc), "%s regulator_set_voltage failed: %d",
474                                         "vddio_sdmmc", rc);
475                         } else {
476                                 regulator_enable(tegra_host->vdd_io_reg);
477                         }
478                 }
479
480                 tegra_host->vdd_slot_reg = regulator_get(mmc_dev(host->mmc), "vddio_sd_slot");
481                 if (WARN_ON(IS_ERR_OR_NULL(tegra_host->vdd_slot_reg))) {
482                         dev_err(mmc_dev(host->mmc), "%s regulator not found: %ld\n",
483                                 "vddio_sd_slot", PTR_ERR(tegra_host->vdd_slot_reg));
484                         tegra_host->vdd_slot_reg = NULL;
485                 } else {
486                         regulator_enable(tegra_host->vdd_slot_reg);
487                 }
488         }
489
490         clk = clk_get(mmc_dev(host->mmc), NULL);
491         if (IS_ERR(clk)) {
492                 dev_err(mmc_dev(host->mmc), "clk err\n");
493                 rc = PTR_ERR(clk);
494                 goto err_clk_get;
495         }
496         rc = clk_enable(clk);
497         if (rc != 0)
498                 goto err_clk_put;
499         pltfm_host->clk = clk;
500         pltfm_host->priv = tegra_host;
501         tegra_host->clk_enabled = true;
502
503         host->mmc->pm_caps = plat->pm_flags;
504
505         host->mmc->caps |= MMC_CAP_ERASE;
506         host->mmc->caps |= MMC_CAP_DISABLE;
507         if (plat->is_8bit)
508                 host->mmc->caps |= MMC_CAP_8_BIT_DATA;
509         host->mmc->caps |= MMC_CAP_SDIO_IRQ;
510
511         if (plat->mmc_data.built_in) {
512                 host->mmc->caps |= MMC_CAP_NONREMOVABLE;
513         }
514         /* Do not turn OFF embedded sdio cards as it support Wake on Wireless */
515         if (plat->mmc_data.embedded_sdio)
516                 host->mmc->pm_flags = MMC_PM_KEEP_POWER;
517
518 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
519         tegra_host->hw_ops = &tegra_2x_sdhci_ops;
520 #else
521         tegra_host->hw_ops = &tegra_3x_sdhci_ops;
522 #endif
523
524         rc = sdhci_add_host(host);
525         if (rc)
526                 goto err_add_host;
527
528         return 0;
529
530 err_add_host:
531         clk_disable(pltfm_host->clk);
532 err_clk_put:
533         clk_put(pltfm_host->clk);
534 err_clk_get:
535         if (gpio_is_valid(plat->wp_gpio)) {
536                 tegra_gpio_disable(plat->wp_gpio);
537                 gpio_free(plat->wp_gpio);
538         }
539 err_wp_req:
540         if (gpio_is_valid(plat->cd_gpio))
541                 free_irq(gpio_to_irq(plat->cd_gpio), host);
542 err_cd_irq_req:
543         if (gpio_is_valid(plat->cd_gpio)) {
544                 tegra_gpio_disable(plat->cd_gpio);
545                 gpio_free(plat->cd_gpio);
546         }
547 err_cd_req:
548         if (gpio_is_valid(plat->power_gpio)) {
549                 tegra_gpio_disable(plat->power_gpio);
550                 gpio_free(plat->power_gpio);
551         }
552 err_power_req:
553 err_no_plat:
554         sdhci_pltfm_free(pdev);
555         kfree(tegra_host);
556         return rc;
557 }
558
559 static int __devexit sdhci_tegra_remove(struct platform_device *pdev)
560 {
561         struct sdhci_host *host = platform_get_drvdata(pdev);
562         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
563         struct tegra_sdhci_host *tegra_host = pltfm_host->priv;
564         struct tegra_sdhci_platform_data *plat;
565         int dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);
566
567         sdhci_remove_host(host, dead);
568
569         plat = pdev->dev.platform_data;
570
571         if (tegra_host->vdd_slot_reg) {
572                 regulator_disable(tegra_host->vdd_slot_reg);
573                 regulator_put(tegra_host->vdd_slot_reg);
574         }
575
576         if (tegra_host->vdd_io_reg) {
577                 regulator_disable(tegra_host->vdd_io_reg);
578                 regulator_put(tegra_host->vdd_io_reg);
579         }
580
581         if (gpio_is_valid(plat->wp_gpio)) {
582                 tegra_gpio_disable(plat->wp_gpio);
583                 gpio_free(plat->wp_gpio);
584         }
585
586         if (gpio_is_valid(plat->cd_gpio)) {
587                 free_irq(gpio_to_irq(plat->cd_gpio), host);
588                 tegra_gpio_disable(plat->cd_gpio);
589                 gpio_free(plat->cd_gpio);
590         }
591
592         if (gpio_is_valid(plat->power_gpio)) {
593                 tegra_gpio_disable(plat->power_gpio);
594                 gpio_free(plat->power_gpio);
595         }
596
597         if (tegra_host->clk_enabled)
598                 clk_disable(pltfm_host->clk);
599         clk_put(pltfm_host->clk);
600
601         sdhci_pltfm_free(pdev);
602         kfree(tegra_host);
603
604         return 0;
605 }
606
607 static struct platform_driver sdhci_tegra_driver = {
608         .driver         = {
609                 .name   = "sdhci-tegra",
610                 .owner  = THIS_MODULE,
611         },
612         .probe          = sdhci_tegra_probe,
613         .remove         = __devexit_p(sdhci_tegra_remove),
614 #ifdef CONFIG_PM
615         .suspend        = sdhci_pltfm_suspend,
616         .resume         = sdhci_pltfm_resume,
617 #endif
618 };
619
620 static int __init sdhci_tegra_init(void)
621 {
622         return platform_driver_register(&sdhci_tegra_driver);
623 }
624 module_init(sdhci_tegra_init);
625
626 static void __exit sdhci_tegra_exit(void)
627 {
628         platform_driver_unregister(&sdhci_tegra_driver);
629 }
630 module_exit(sdhci_tegra_exit);
631
632 MODULE_DESCRIPTION("SDHCI driver for Tegra");
633 MODULE_AUTHOR(" Google, Inc.");
634 MODULE_LICENSE("GPL v2");