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