]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/mmc/host/sdhci-s3c.c
mmc: dw_mmc: add support for exynos specific implementation of dw-mshc
[mirror_ubuntu-artful-kernel.git] / drivers / mmc / host / sdhci-s3c.c
CommitLineData
0d1bb41a
BD
1/* linux/drivers/mmc/host/sdhci-s3c.c
2 *
3 * Copyright 2008 Openmoko Inc.
4 * Copyright 2008 Simtec Electronics
5 * Ben Dooks <ben@simtec.co.uk>
6 * http://armlinux.simtec.co.uk/
7 *
8 * SDHCI (HSMMC) support for Samsung SoC
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/delay.h>
16#include <linux/dma-mapping.h>
17#include <linux/platform_device.h>
5a0e3ad6 18#include <linux/slab.h>
0d1bb41a
BD
19#include <linux/clk.h>
20#include <linux/io.h>
17866e14 21#include <linux/gpio.h>
55156d24 22#include <linux/module.h>
d5e9c02c
MB
23#include <linux/of.h>
24#include <linux/of_gpio.h>
25#include <linux/pm.h>
9f4e8151 26#include <linux/pm_runtime.h>
0d1bb41a
BD
27
28#include <linux/mmc/host.h>
29
30#include <plat/sdhci.h>
31#include <plat/regs-sdhci.h>
32
33#include "sdhci.h"
34
35#define MAX_BUS_CLK (4)
36
37/**
38 * struct sdhci_s3c - S3C SDHCI instance
39 * @host: The SDHCI host created
40 * @pdev: The platform device we where created from.
41 * @ioarea: The resource created when we claimed the IO area.
42 * @pdata: The platform data for this controller.
43 * @cur_clk: The index of the current bus clock.
44 * @clk_io: The clock for the internal bus interface.
45 * @clk_bus: The clocks that are available for the SD/MMC bus clock.
46 */
47struct sdhci_s3c {
48 struct sdhci_host *host;
49 struct platform_device *pdev;
50 struct resource *ioarea;
51 struct s3c_sdhci_platdata *pdata;
52 unsigned int cur_clk;
17866e14
MS
53 int ext_cd_irq;
54 int ext_cd_gpio;
0d1bb41a
BD
55
56 struct clk *clk_io;
57 struct clk *clk_bus[MAX_BUS_CLK];
58};
59
3119936a
TA
60/**
61 * struct sdhci_s3c_driver_data - S3C SDHCI platform specific driver data
62 * @sdhci_quirks: sdhci host specific quirks.
63 *
64 * Specifies platform specific configuration of sdhci controller.
65 * Note: A structure for driver specific platform data is used for future
66 * expansion of its usage.
67 */
68struct sdhci_s3c_drv_data {
69 unsigned int sdhci_quirks;
70};
71
0d1bb41a
BD
72static inline struct sdhci_s3c *to_s3c(struct sdhci_host *host)
73{
74 return sdhci_priv(host);
75}
76
77/**
78 * get_curclk - convert ctrl2 register to clock source number
79 * @ctrl2: Control2 register value.
80 */
81static u32 get_curclk(u32 ctrl2)
82{
83 ctrl2 &= S3C_SDHCI_CTRL2_SELBASECLK_MASK;
84 ctrl2 >>= S3C_SDHCI_CTRL2_SELBASECLK_SHIFT;
85
86 return ctrl2;
87}
88
89static void sdhci_s3c_check_sclk(struct sdhci_host *host)
90{
91 struct sdhci_s3c *ourhost = to_s3c(host);
92 u32 tmp = readl(host->ioaddr + S3C_SDHCI_CONTROL2);
93
94 if (get_curclk(tmp) != ourhost->cur_clk) {
95 dev_dbg(&ourhost->pdev->dev, "restored ctrl2 clock setting\n");
96
97 tmp &= ~S3C_SDHCI_CTRL2_SELBASECLK_MASK;
98 tmp |= ourhost->cur_clk << S3C_SDHCI_CTRL2_SELBASECLK_SHIFT;
7003fecb 99 writel(tmp, host->ioaddr + S3C_SDHCI_CONTROL2);
0d1bb41a
BD
100 }
101}
102
103/**
104 * sdhci_s3c_get_max_clk - callback to get maximum clock frequency.
105 * @host: The SDHCI host instance.
106 *
107 * Callback to return the maximum clock rate acheivable by the controller.
108*/
109static unsigned int sdhci_s3c_get_max_clk(struct sdhci_host *host)
110{
111 struct sdhci_s3c *ourhost = to_s3c(host);
112 struct clk *busclk;
113 unsigned int rate, max;
114 int clk;
115
116 /* note, a reset will reset the clock source */
117
118 sdhci_s3c_check_sclk(host);
119
120 for (max = 0, clk = 0; clk < MAX_BUS_CLK; clk++) {
121 busclk = ourhost->clk_bus[clk];
122 if (!busclk)
123 continue;
124
125 rate = clk_get_rate(busclk);
126 if (rate > max)
127 max = rate;
128 }
129
130 return max;
131}
132
0d1bb41a
BD
133/**
134 * sdhci_s3c_consider_clock - consider one the bus clocks for current setting
135 * @ourhost: Our SDHCI instance.
136 * @src: The source clock index.
137 * @wanted: The clock frequency wanted.
138 */
139static unsigned int sdhci_s3c_consider_clock(struct sdhci_s3c *ourhost,
140 unsigned int src,
141 unsigned int wanted)
142{
143 unsigned long rate;
144 struct clk *clksrc = ourhost->clk_bus[src];
145 int div;
146
147 if (!clksrc)
148 return UINT_MAX;
149
253e0a7c 150 /*
3119936a
TA
151 * If controller uses a non-standard clock division, find the best clock
152 * speed possible with selected clock source and skip the division.
253e0a7c 153 */
3119936a 154 if (ourhost->host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) {
253e0a7c
JS
155 rate = clk_round_rate(clksrc, wanted);
156 return wanted - rate;
157 }
158
0d1bb41a
BD
159 rate = clk_get_rate(clksrc);
160
161 for (div = 1; div < 256; div *= 2) {
162 if ((rate / div) <= wanted)
163 break;
164 }
165
166 dev_dbg(&ourhost->pdev->dev, "clk %d: rate %ld, want %d, got %ld\n",
167 src, rate, wanted, rate / div);
168
2ad0b249 169 return wanted - (rate / div);
0d1bb41a
BD
170}
171
172/**
173 * sdhci_s3c_set_clock - callback on clock change
174 * @host: The SDHCI host being changed
175 * @clock: The clock rate being requested.
176 *
177 * When the card's clock is going to be changed, look at the new frequency
178 * and find the best clock source to go with it.
179*/
180static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock)
181{
182 struct sdhci_s3c *ourhost = to_s3c(host);
183 unsigned int best = UINT_MAX;
184 unsigned int delta;
185 int best_src = 0;
186 int src;
187 u32 ctrl;
188
189 /* don't bother if the clock is going off. */
190 if (clock == 0)
191 return;
192
193 for (src = 0; src < MAX_BUS_CLK; src++) {
194 delta = sdhci_s3c_consider_clock(ourhost, src, clock);
195 if (delta < best) {
196 best = delta;
197 best_src = src;
198 }
199 }
200
201 dev_dbg(&ourhost->pdev->dev,
202 "selected source %d, clock %d, delta %d\n",
203 best_src, clock, best);
204
205 /* select the new clock source */
206
207 if (ourhost->cur_clk != best_src) {
208 struct clk *clk = ourhost->clk_bus[best_src];
209
210 /* turn clock off to card before changing clock source */
211 writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL);
212
213 ourhost->cur_clk = best_src;
214 host->max_clk = clk_get_rate(clk);
0d1bb41a
BD
215
216 ctrl = readl(host->ioaddr + S3C_SDHCI_CONTROL2);
217 ctrl &= ~S3C_SDHCI_CTRL2_SELBASECLK_MASK;
218 ctrl |= best_src << S3C_SDHCI_CTRL2_SELBASECLK_SHIFT;
219 writel(ctrl, host->ioaddr + S3C_SDHCI_CONTROL2);
220 }
221
6fe47179
TA
222 /* reprogram default hardware configuration */
223 writel(S3C64XX_SDHCI_CONTROL4_DRIVE_9mA,
224 host->ioaddr + S3C64XX_SDHCI_CONTROL4);
225
226 ctrl = readl(host->ioaddr + S3C_SDHCI_CONTROL2);
227 ctrl |= (S3C64XX_SDHCI_CTRL2_ENSTAASYNCCLR |
228 S3C64XX_SDHCI_CTRL2_ENCMDCNFMSK |
229 S3C_SDHCI_CTRL2_ENFBCLKRX |
230 S3C_SDHCI_CTRL2_DFCNT_NONE |
231 S3C_SDHCI_CTRL2_ENCLKOUTHOLD);
232 writel(ctrl, host->ioaddr + S3C_SDHCI_CONTROL2);
233
234 /* reconfigure the controller for new clock rate */
235 ctrl = (S3C_SDHCI_CTRL3_FCSEL1 | S3C_SDHCI_CTRL3_FCSEL0);
236 if (clock < 25 * 1000000)
237 ctrl |= (S3C_SDHCI_CTRL3_FCSEL3 | S3C_SDHCI_CTRL3_FCSEL2);
238 writel(ctrl, host->ioaddr + S3C_SDHCI_CONTROL3);
0d1bb41a
BD
239}
240
ce5f036b
MS
241/**
242 * sdhci_s3c_get_min_clock - callback to get minimal supported clock value
243 * @host: The SDHCI host being queried
244 *
245 * To init mmc host properly a minimal clock value is needed. For high system
246 * bus clock's values the standard formula gives values out of allowed range.
247 * The clock still can be set to lower values, if clock source other then
248 * system bus is selected.
249*/
250static unsigned int sdhci_s3c_get_min_clock(struct sdhci_host *host)
251{
252 struct sdhci_s3c *ourhost = to_s3c(host);
253 unsigned int delta, min = UINT_MAX;
254 int src;
255
256 for (src = 0; src < MAX_BUS_CLK; src++) {
257 delta = sdhci_s3c_consider_clock(ourhost, src, 0);
258 if (delta == UINT_MAX)
259 continue;
260 /* delta is a negative value in this case */
261 if (-delta < min)
262 min = -delta;
263 }
264 return min;
265}
266
253e0a7c
JS
267/* sdhci_cmu_get_max_clk - callback to get maximum clock frequency.*/
268static unsigned int sdhci_cmu_get_max_clock(struct sdhci_host *host)
269{
270 struct sdhci_s3c *ourhost = to_s3c(host);
271
272 return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], UINT_MAX);
273}
274
275/* sdhci_cmu_get_min_clock - callback to get minimal supported clock value. */
276static unsigned int sdhci_cmu_get_min_clock(struct sdhci_host *host)
277{
278 struct sdhci_s3c *ourhost = to_s3c(host);
279
280 /*
281 * initial clock can be in the frequency range of
282 * 100KHz-400KHz, so we set it as max value.
283 */
284 return clk_round_rate(ourhost->clk_bus[ourhost->cur_clk], 400000);
285}
286
287/* sdhci_cmu_set_clock - callback on clock change.*/
288static void sdhci_cmu_set_clock(struct sdhci_host *host, unsigned int clock)
289{
290 struct sdhci_s3c *ourhost = to_s3c(host);
2ad0b249 291 struct device *dev = &ourhost->pdev->dev;
3119936a
TA
292 unsigned long timeout;
293 u16 clk = 0;
253e0a7c
JS
294
295 /* don't bother if the clock is going off */
296 if (clock == 0)
297 return;
298
299 sdhci_s3c_set_clock(host, clock);
300
301 clk_set_rate(ourhost->clk_bus[ourhost->cur_clk], clock);
302
303 host->clock = clock;
3119936a
TA
304
305 clk = SDHCI_CLOCK_INT_EN;
306 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
307
308 /* Wait max 20 ms */
309 timeout = 20;
310 while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
311 & SDHCI_CLOCK_INT_STABLE)) {
312 if (timeout == 0) {
2ad0b249
JH
313 dev_err(dev, "%s: Internal clock never stabilised.\n",
314 mmc_hostname(host->mmc));
3119936a
TA
315 return;
316 }
317 timeout--;
318 mdelay(1);
319 }
320
321 clk |= SDHCI_CLOCK_CARD_EN;
322 sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
253e0a7c
JS
323}
324
548f07d2
JC
325/**
326 * sdhci_s3c_platform_8bit_width - support 8bit buswidth
327 * @host: The SDHCI host being queried
328 * @width: MMC_BUS_WIDTH_ macro for the bus width being requested
329 *
330 * We have 8-bit width support but is not a v3 controller.
331 * So we add platform_8bit_width() and support 8bit width.
332 */
333static int sdhci_s3c_platform_8bit_width(struct sdhci_host *host, int width)
334{
335 u8 ctrl;
336
337 ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
338
339 switch (width) {
340 case MMC_BUS_WIDTH_8:
341 ctrl |= SDHCI_CTRL_8BITBUS;
342 ctrl &= ~SDHCI_CTRL_4BITBUS;
343 break;
344 case MMC_BUS_WIDTH_4:
345 ctrl |= SDHCI_CTRL_4BITBUS;
346 ctrl &= ~SDHCI_CTRL_8BITBUS;
347 break;
348 default:
49bb1e61
G
349 ctrl &= ~SDHCI_CTRL_4BITBUS;
350 ctrl &= ~SDHCI_CTRL_8BITBUS;
548f07d2
JC
351 break;
352 }
353
354 sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
355
356 return 0;
357}
358
0d1bb41a
BD
359static struct sdhci_ops sdhci_s3c_ops = {
360 .get_max_clock = sdhci_s3c_get_max_clk,
0d1bb41a 361 .set_clock = sdhci_s3c_set_clock,
ce5f036b 362 .get_min_clock = sdhci_s3c_get_min_clock,
548f07d2 363 .platform_8bit_width = sdhci_s3c_platform_8bit_width,
0d1bb41a
BD
364};
365
17866e14
MS
366static void sdhci_s3c_notify_change(struct platform_device *dev, int state)
367{
368 struct sdhci_host *host = platform_get_drvdata(dev);
06fe577f
MS
369 unsigned long flags;
370
17866e14 371 if (host) {
06fe577f 372 spin_lock_irqsave(&host->lock, flags);
17866e14
MS
373 if (state) {
374 dev_dbg(&dev->dev, "card inserted.\n");
375 host->flags &= ~SDHCI_DEVICE_DEAD;
376 host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;
377 } else {
378 dev_dbg(&dev->dev, "card removed.\n");
379 host->flags |= SDHCI_DEVICE_DEAD;
380 host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION;
381 }
f522886e 382 tasklet_schedule(&host->card_tasklet);
06fe577f 383 spin_unlock_irqrestore(&host->lock, flags);
17866e14
MS
384 }
385}
386
387static irqreturn_t sdhci_s3c_gpio_card_detect_thread(int irq, void *dev_id)
388{
389 struct sdhci_s3c *sc = dev_id;
390 int status = gpio_get_value(sc->ext_cd_gpio);
391 if (sc->pdata->ext_cd_gpio_invert)
392 status = !status;
393 sdhci_s3c_notify_change(sc->pdev, status);
394 return IRQ_HANDLED;
395}
396
397static void sdhci_s3c_setup_card_detect_gpio(struct sdhci_s3c *sc)
398{
399 struct s3c_sdhci_platdata *pdata = sc->pdata;
400 struct device *dev = &sc->pdev->dev;
401
402 if (gpio_request(pdata->ext_cd_gpio, "SDHCI EXT CD") == 0) {
403 sc->ext_cd_gpio = pdata->ext_cd_gpio;
404 sc->ext_cd_irq = gpio_to_irq(pdata->ext_cd_gpio);
405 if (sc->ext_cd_irq &&
406 request_threaded_irq(sc->ext_cd_irq, NULL,
407 sdhci_s3c_gpio_card_detect_thread,
2ad0b249
JH
408 IRQF_TRIGGER_RISING |
409 IRQF_TRIGGER_FALLING |
410 IRQF_ONESHOT,
17866e14
MS
411 dev_name(dev), sc) == 0) {
412 int status = gpio_get_value(sc->ext_cd_gpio);
413 if (pdata->ext_cd_gpio_invert)
414 status = !status;
415 sdhci_s3c_notify_change(sc->pdev, status);
416 } else {
417 dev_warn(dev, "cannot request irq for card detect\n");
418 sc->ext_cd_irq = 0;
419 }
420 } else {
421 dev_err(dev, "cannot request gpio for card detect\n");
422 }
423}
424
3119936a
TA
425static inline struct sdhci_s3c_drv_data *sdhci_s3c_get_driver_data(
426 struct platform_device *pdev)
427{
428 return (struct sdhci_s3c_drv_data *)
429 platform_get_device_id(pdev)->driver_data;
430}
431
0d1bb41a
BD
432static int __devinit sdhci_s3c_probe(struct platform_device *pdev)
433{
1d4dc338 434 struct s3c_sdhci_platdata *pdata;
3119936a 435 struct sdhci_s3c_drv_data *drv_data;
0d1bb41a
BD
436 struct device *dev = &pdev->dev;
437 struct sdhci_host *host;
438 struct sdhci_s3c *sc;
439 struct resource *res;
440 int ret, irq, ptr, clks;
441
1d4dc338 442 if (!pdev->dev.platform_data) {
0d1bb41a
BD
443 dev_err(dev, "no device data specified\n");
444 return -ENOENT;
445 }
446
447 irq = platform_get_irq(pdev, 0);
448 if (irq < 0) {
449 dev_err(dev, "no irq specified\n");
450 return irq;
451 }
452
0d1bb41a
BD
453 host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c));
454 if (IS_ERR(host)) {
455 dev_err(dev, "sdhci_alloc_host() failed\n");
456 return PTR_ERR(host);
457 }
458
1d4dc338
TA
459 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
460 if (!pdata) {
461 ret = -ENOMEM;
462 goto err_io_clk;
463 }
464 memcpy(pdata, pdev->dev.platform_data, sizeof(*pdata));
465
3119936a 466 drv_data = sdhci_s3c_get_driver_data(pdev);
0d1bb41a
BD
467 sc = sdhci_priv(host);
468
469 sc->host = host;
470 sc->pdev = pdev;
471 sc->pdata = pdata;
17866e14 472 sc->ext_cd_gpio = -1; /* invalid gpio number */
0d1bb41a
BD
473
474 platform_set_drvdata(pdev, host);
475
476 sc->clk_io = clk_get(dev, "hsmmc");
477 if (IS_ERR(sc->clk_io)) {
478 dev_err(dev, "failed to get io clock\n");
479 ret = PTR_ERR(sc->clk_io);
480 goto err_io_clk;
481 }
482
483 /* enable the local io clock and keep it running for the moment. */
484 clk_enable(sc->clk_io);
485
486 for (clks = 0, ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
487 struct clk *clk;
4346b6d9 488 char name[14];
0d1bb41a 489
4346b6d9 490 snprintf(name, 14, "mmc_busclk.%d", ptr);
0d1bb41a 491 clk = clk_get(dev, name);
2ad0b249 492 if (IS_ERR(clk))
0d1bb41a 493 continue;
0d1bb41a
BD
494
495 clks++;
496 sc->clk_bus[ptr] = clk;
253e0a7c
JS
497
498 /*
499 * save current clock index to know which clock bus
500 * is used later in overriding functions.
501 */
502 sc->cur_clk = ptr;
503
0d1bb41a
BD
504 clk_enable(clk);
505
506 dev_info(dev, "clock source %d: %s (%ld Hz)\n",
507 ptr, name, clk_get_rate(clk));
508 }
509
510 if (clks == 0) {
511 dev_err(dev, "failed to find any bus clocks\n");
512 ret = -ENOENT;
513 goto err_no_busclks;
514 }
515
9bda6da7
JL
516 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
517 host->ioaddr = devm_request_and_ioremap(&pdev->dev, res);
0d1bb41a
BD
518 if (!host->ioaddr) {
519 dev_err(dev, "failed to map registers\n");
520 ret = -ENXIO;
521 goto err_req_regs;
522 }
523
524 /* Ensure we have minimal gpio selected CMD/CLK/Detect */
525 if (pdata->cfg_gpio)
526 pdata->cfg_gpio(pdev, pdata->max_width);
527
528 host->hw_name = "samsung-hsmmc";
529 host->ops = &sdhci_s3c_ops;
530 host->quirks = 0;
531 host->irq = irq;
532
533 /* Setup quirks for the controller */
b2e75eff 534 host->quirks |= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC;
a1d56460 535 host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT;
3119936a
TA
536 if (drv_data)
537 host->quirks |= drv_data->sdhci_quirks;
0d1bb41a
BD
538
539#ifndef CONFIG_MMC_SDHCI_S3C_DMA
540
541 /* we currently see overruns on errors, so disable the SDMA
542 * support as well. */
543 host->quirks |= SDHCI_QUIRK_BROKEN_DMA;
544
545#endif /* CONFIG_MMC_SDHCI_S3C_DMA */
546
547 /* It seems we do not get an DATA transfer complete on non-busy
548 * transfers, not sure if this is a problem with this specific
549 * SDHCI block, or a missing configuration that needs to be set. */
550 host->quirks |= SDHCI_QUIRK_NO_BUSY_IRQ;
551
732f0e31
KP
552 /* This host supports the Auto CMD12 */
553 host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
554
7199e2b6
JC
555 /* Samsung SoCs need BROKEN_ADMA_ZEROLEN_DESC */
556 host->quirks |= SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC;
557
17866e14
MS
558 if (pdata->cd_type == S3C_SDHCI_CD_NONE ||
559 pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
560 host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;
561
562 if (pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
563 host->mmc->caps = MMC_CAP_NONREMOVABLE;
564
0d22c770
TA
565 switch (pdata->max_width) {
566 case 8:
567 host->mmc->caps |= MMC_CAP_8_BIT_DATA;
568 case 4:
569 host->mmc->caps |= MMC_CAP_4_BIT_DATA;
570 break;
571 }
572
fa1773cc
SL
573 if (pdata->pm_caps)
574 host->mmc->pm_caps |= pdata->pm_caps;
575
0d1bb41a
BD
576 host->quirks |= (SDHCI_QUIRK_32BIT_DMA_ADDR |
577 SDHCI_QUIRK_32BIT_DMA_SIZE);
578
3fe42e07
HL
579 /* HSMMC on Samsung SoCs uses SDCLK as timeout clock */
580 host->quirks |= SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK;
581
253e0a7c
JS
582 /*
583 * If controller does not have internal clock divider,
584 * we can use overriding functions instead of default.
585 */
3119936a 586 if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) {
253e0a7c
JS
587 sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock;
588 sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock;
589 sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock;
590 }
591
b3824f2c
JS
592 /* It supports additional host capabilities if needed */
593 if (pdata->host_caps)
594 host->mmc->caps |= pdata->host_caps;
595
c1c4b66d
JC
596 if (pdata->host_caps2)
597 host->mmc->caps2 |= pdata->host_caps2;
598
9f4e8151
MB
599 pm_runtime_enable(&pdev->dev);
600 pm_runtime_set_autosuspend_delay(&pdev->dev, 50);
601 pm_runtime_use_autosuspend(&pdev->dev);
602 pm_suspend_ignore_children(&pdev->dev, 1);
603
0d1bb41a
BD
604 ret = sdhci_add_host(host);
605 if (ret) {
606 dev_err(dev, "sdhci_add_host() failed\n");
9f4e8151
MB
607 pm_runtime_forbid(&pdev->dev);
608 pm_runtime_get_noresume(&pdev->dev);
9bda6da7 609 goto err_req_regs;
0d1bb41a
BD
610 }
611
17866e14
MS
612 /* The following two methods of card detection might call
613 sdhci_s3c_notify_change() immediately, so they can be called
614 only after sdhci_add_host(). Setup errors are ignored. */
615 if (pdata->cd_type == S3C_SDHCI_CD_EXTERNAL && pdata->ext_cd_init)
616 pdata->ext_cd_init(&sdhci_s3c_notify_change);
617 if (pdata->cd_type == S3C_SDHCI_CD_GPIO &&
618 gpio_is_valid(pdata->ext_cd_gpio))
619 sdhci_s3c_setup_card_detect_gpio(sc);
620
0d1bb41a
BD
621 return 0;
622
0d1bb41a
BD
623 err_req_regs:
624 for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
326adda5
JC
625 if (sc->clk_bus[ptr]) {
626 clk_disable(sc->clk_bus[ptr]);
627 clk_put(sc->clk_bus[ptr]);
628 }
0d1bb41a
BD
629 }
630
631 err_no_busclks:
632 clk_disable(sc->clk_io);
633 clk_put(sc->clk_io);
634
635 err_io_clk:
636 sdhci_free_host(host);
637
638 return ret;
639}
640
641static int __devexit sdhci_s3c_remove(struct platform_device *pdev)
642{
17866e14 643 struct s3c_sdhci_platdata *pdata = pdev->dev.platform_data;
9d51a6b2
MS
644 struct sdhci_host *host = platform_get_drvdata(pdev);
645 struct sdhci_s3c *sc = sdhci_priv(host);
646 int ptr;
647
17866e14
MS
648 if (pdata->cd_type == S3C_SDHCI_CD_EXTERNAL && pdata->ext_cd_cleanup)
649 pdata->ext_cd_cleanup(&sdhci_s3c_notify_change);
650
651 if (sc->ext_cd_irq)
652 free_irq(sc->ext_cd_irq, sc);
653
654 if (gpio_is_valid(sc->ext_cd_gpio))
655 gpio_free(sc->ext_cd_gpio);
656
9d51a6b2
MS
657 sdhci_remove_host(host, 1);
658
9f4e8151
MB
659 pm_runtime_disable(&pdev->dev);
660
9d51a6b2 661 for (ptr = 0; ptr < 3; ptr++) {
9320f7cb
MS
662 if (sc->clk_bus[ptr]) {
663 clk_disable(sc->clk_bus[ptr]);
664 clk_put(sc->clk_bus[ptr]);
665 }
9d51a6b2
MS
666 }
667 clk_disable(sc->clk_io);
668 clk_put(sc->clk_io);
669
9d51a6b2
MS
670 sdhci_free_host(host);
671 platform_set_drvdata(pdev, NULL);
672
0d1bb41a
BD
673 return 0;
674}
675
d5e9c02c 676#ifdef CONFIG_PM_SLEEP
29495aa0 677static int sdhci_s3c_suspend(struct device *dev)
0d1bb41a 678{
29495aa0 679 struct sdhci_host *host = dev_get_drvdata(dev);
0d1bb41a 680
29495aa0 681 return sdhci_suspend_host(host);
0d1bb41a
BD
682}
683
29495aa0 684static int sdhci_s3c_resume(struct device *dev)
0d1bb41a 685{
29495aa0 686 struct sdhci_host *host = dev_get_drvdata(dev);
0d1bb41a 687
65d13516 688 return sdhci_resume_host(host);
0d1bb41a 689}
d5e9c02c 690#endif
0d1bb41a 691
9f4e8151
MB
692#ifdef CONFIG_PM_RUNTIME
693static int sdhci_s3c_runtime_suspend(struct device *dev)
694{
695 struct sdhci_host *host = dev_get_drvdata(dev);
696
697 return sdhci_runtime_suspend_host(host);
698}
699
700static int sdhci_s3c_runtime_resume(struct device *dev)
701{
702 struct sdhci_host *host = dev_get_drvdata(dev);
703
704 return sdhci_runtime_resume_host(host);
705}
706#endif
707
d5e9c02c 708#ifdef CONFIG_PM
29495aa0 709static const struct dev_pm_ops sdhci_s3c_pmops = {
d5e9c02c 710 SET_SYSTEM_SLEEP_PM_OPS(sdhci_s3c_suspend, sdhci_s3c_resume)
9f4e8151
MB
711 SET_RUNTIME_PM_OPS(sdhci_s3c_runtime_suspend, sdhci_s3c_runtime_resume,
712 NULL)
29495aa0
ML
713};
714
715#define SDHCI_S3C_PMOPS (&sdhci_s3c_pmops)
716
0d1bb41a 717#else
29495aa0 718#define SDHCI_S3C_PMOPS NULL
0d1bb41a
BD
719#endif
720
3119936a
TA
721#if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS4212)
722static struct sdhci_s3c_drv_data exynos4_sdhci_drv_data = {
723 .sdhci_quirks = SDHCI_QUIRK_NONSTANDARD_CLOCK,
724};
725#define EXYNOS4_SDHCI_DRV_DATA ((kernel_ulong_t)&exynos4_sdhci_drv_data)
726#else
727#define EXYNOS4_SDHCI_DRV_DATA ((kernel_ulong_t)NULL)
728#endif
729
730static struct platform_device_id sdhci_s3c_driver_ids[] = {
731 {
732 .name = "s3c-sdhci",
733 .driver_data = (kernel_ulong_t)NULL,
734 }, {
735 .name = "exynos4-sdhci",
736 .driver_data = EXYNOS4_SDHCI_DRV_DATA,
737 },
738 { }
739};
740MODULE_DEVICE_TABLE(platform, sdhci_s3c_driver_ids);
741
0d1bb41a
BD
742static struct platform_driver sdhci_s3c_driver = {
743 .probe = sdhci_s3c_probe,
744 .remove = __devexit_p(sdhci_s3c_remove),
3119936a 745 .id_table = sdhci_s3c_driver_ids,
0d1bb41a
BD
746 .driver = {
747 .owner = THIS_MODULE,
748 .name = "s3c-sdhci",
29495aa0 749 .pm = SDHCI_S3C_PMOPS,
0d1bb41a
BD
750 },
751};
752
d1f81a64 753module_platform_driver(sdhci_s3c_driver);
0d1bb41a
BD
754
755MODULE_DESCRIPTION("Samsung SDHCI (HSMMC) glue");
756MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
757MODULE_LICENSE("GPL v2");
758MODULE_ALIAS("platform:s3c-sdhci");