blob: 4d0c15bfa51465c91026972417c17652129e09d8 [file] [log] [blame]
Pierre Ossman5c4e6f12007-05-21 20:23:20 +02001/*
2 * linux/drivers/mmc/sdio.c
3 *
4 * Copyright 2006-2007 Pierre Ossman
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or (at
9 * your option) any later version.
10 */
11
12#include <linux/err.h>
Ohad Ben-Cohen819685612010-10-02 13:54:10 +020013#include <linux/pm_runtime.h>
Pierre Ossman5c4e6f12007-05-21 20:23:20 +020014
15#include <linux/mmc/host.h>
16#include <linux/mmc/card.h>
Pierre Ossman35c66c12007-06-11 20:25:43 +020017#include <linux/mmc/sdio.h>
Pierre Ossmane29a7d72007-05-26 13:48:18 +020018#include <linux/mmc/sdio_func.h>
Ohad Ben-Coheneab40682011-04-05 17:50:14 +030019#include <linux/mmc/sdio_ids.h>
Pierre Ossman5c4e6f12007-05-21 20:23:20 +020020
21#include "core.h"
22#include "bus.h"
Michal Miroslaw71578a12010-08-10 18:01:40 -070023#include "sd.h"
Pierre Ossmane29a7d72007-05-26 13:48:18 +020024#include "sdio_bus.h"
Pierre Ossman5c4e6f12007-05-21 20:23:20 +020025#include "mmc_ops.h"
26#include "sd_ops.h"
27#include "sdio_ops.h"
Nicolas Pitreb7261262007-06-16 02:04:16 -040028#include "sdio_cis.h"
Pierre Ossman5c4e6f12007-05-21 20:23:20 +020029
Pierre Ossman05970072007-06-11 21:01:00 +020030static int sdio_read_fbr(struct sdio_func *func)
31{
32 int ret;
33 unsigned char data;
34
Ohad Ben-Coheneab40682011-04-05 17:50:14 +030035 if (mmc_card_nonstd_func_interface(func->card)) {
36 func->class = SDIO_CLASS_NONE;
37 return 0;
38 }
39
Pierre Ossman05970072007-06-11 21:01:00 +020040 ret = mmc_io_rw_direct(func->card, 0, 0,
David Vrabel7616ee92007-08-08 14:23:05 +010041 SDIO_FBR_BASE(func->num) + SDIO_FBR_STD_IF, 0, &data);
Pierre Ossman05970072007-06-11 21:01:00 +020042 if (ret)
43 goto out;
44
45 data &= 0x0f;
46
47 if (data == 0x0f) {
48 ret = mmc_io_rw_direct(func->card, 0, 0,
David Vrabel7616ee92007-08-08 14:23:05 +010049 SDIO_FBR_BASE(func->num) + SDIO_FBR_STD_IF_EXT, 0, &data);
Pierre Ossman05970072007-06-11 21:01:00 +020050 if (ret)
51 goto out;
52 }
53
54 func->class = data;
55
56out:
57 return ret;
58}
59
Pierre Ossmane29a7d72007-05-26 13:48:18 +020060static int sdio_init_func(struct mmc_card *card, unsigned int fn)
61{
Pierre Ossman05970072007-06-11 21:01:00 +020062 int ret;
Pierre Ossmane29a7d72007-05-26 13:48:18 +020063 struct sdio_func *func;
64
65 BUG_ON(fn > SDIO_MAX_FUNCS);
66
67 func = sdio_alloc_func(card);
68 if (IS_ERR(func))
69 return PTR_ERR(func);
70
71 func->num = fn;
72
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -070073 if (!(card->quirks & MMC_QUIRK_NONSTD_SDIO)) {
74 ret = sdio_read_fbr(func);
75 if (ret)
76 goto fail;
Pierre Ossman05970072007-06-11 21:01:00 +020077
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -070078 ret = sdio_read_func_cis(func);
79 if (ret)
80 goto fail;
81 } else {
82 func->vendor = func->card->cis.vendor;
83 func->device = func->card->cis.device;
84 func->max_blksize = func->card->cis.blksize;
85 }
Nicolas Pitreb7261262007-06-16 02:04:16 -040086
Pierre Ossmane29a7d72007-05-26 13:48:18 +020087 card->sdio_func[fn - 1] = func;
88
89 return 0;
Pierre Ossman05970072007-06-11 21:01:00 +020090
91fail:
92 /*
93 * It is okay to remove the function here even though we hold
94 * the host lock as we haven't registered the device yet.
95 */
96 sdio_remove_func(func);
97 return ret;
Pierre Ossmane29a7d72007-05-26 13:48:18 +020098}
99
Pierre Ossman35c66c12007-06-11 20:25:43 +0200100static int sdio_read_cccr(struct mmc_card *card)
101{
102 int ret;
103 int cccr_vsn;
104 unsigned char data;
105
106 memset(&card->cccr, 0, sizeof(struct sdio_cccr));
107
108 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_CCCR, 0, &data);
109 if (ret)
110 goto out;
111
112 cccr_vsn = data & 0x0f;
113
114 if (cccr_vsn > SDIO_CCCR_REV_1_20) {
115 printk(KERN_ERR "%s: unrecognised CCCR structure version %d\n",
116 mmc_hostname(card->host), cccr_vsn);
117 return -EINVAL;
118 }
119
120 card->cccr.sdio_vsn = (data & 0xf0) >> 4;
121
122 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_CAPS, 0, &data);
123 if (ret)
124 goto out;
125
126 if (data & SDIO_CCCR_CAP_SMB)
127 card->cccr.multi_block = 1;
128 if (data & SDIO_CCCR_CAP_LSC)
129 card->cccr.low_speed = 1;
130 if (data & SDIO_CCCR_CAP_4BLS)
131 card->cccr.wide_bus = 1;
132
133 if (cccr_vsn >= SDIO_CCCR_REV_1_10) {
134 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_POWER, 0, &data);
135 if (ret)
136 goto out;
137
138 if (data & SDIO_POWER_SMPC)
139 card->cccr.high_power = 1;
140 }
141
142 if (cccr_vsn >= SDIO_CCCR_REV_1_20) {
143 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &data);
144 if (ret)
145 goto out;
146
147 if (data & SDIO_SPEED_SHS)
148 card->cccr.high_speed = 1;
149 }
150
151out:
152 return ret;
153}
154
Pierre Ossman4ff64712007-07-30 18:23:53 +0200155static int sdio_enable_wide(struct mmc_card *card)
156{
157 int ret;
158 u8 ctrl;
159
160 if (!(card->host->caps & MMC_CAP_4_BIT_DATA))
161 return 0;
162
163 if (card->cccr.low_speed && !card->cccr.wide_bus)
164 return 0;
165
166 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl);
167 if (ret)
168 return ret;
169
170 ctrl |= SDIO_BUS_WIDTH_4BIT;
171
172 ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
173 if (ret)
174 return ret;
175
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700176 return 1;
Pierre Ossman4ff64712007-07-30 18:23:53 +0200177}
178
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200179/*
Ohad Ben-Cohen006ebd52009-09-22 16:45:07 -0700180 * If desired, disconnect the pull-up resistor on CD/DAT[3] (pin 1)
181 * of the card. This may be required on certain setups of boards,
182 * controllers and embedded sdio device which do not need the card's
183 * pull-up. As a result, card detection is disabled and power is saved.
184 */
185static int sdio_disable_cd(struct mmc_card *card)
186{
187 int ret;
188 u8 ctrl;
189
Ohad Ben-Cohen2059a022011-04-05 18:02:25 +0300190 if (!mmc_card_disable_cd(card))
Ohad Ben-Cohen006ebd52009-09-22 16:45:07 -0700191 return 0;
192
193 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl);
194 if (ret)
195 return ret;
196
197 ctrl |= SDIO_BUS_CD_DISABLE;
198
199 return mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
200}
201
202/*
Daniel Drake6b5eda32010-03-05 13:43:34 -0800203 * Devices that remain active during a system suspend are
204 * put back into 1-bit mode.
205 */
206static int sdio_disable_wide(struct mmc_card *card)
207{
208 int ret;
209 u8 ctrl;
210
211 if (!(card->host->caps & MMC_CAP_4_BIT_DATA))
212 return 0;
213
214 if (card->cccr.low_speed && !card->cccr.wide_bus)
215 return 0;
216
217 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl);
218 if (ret)
219 return ret;
220
221 if (!(ctrl & SDIO_BUS_WIDTH_4BIT))
222 return 0;
223
224 ctrl &= ~SDIO_BUS_WIDTH_4BIT;
225 ctrl |= SDIO_BUS_ASYNC_INT;
226
227 ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
228 if (ret)
229 return ret;
230
231 mmc_set_bus_width(card->host, MMC_BUS_WIDTH_1);
232
233 return 0;
234}
235
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700236
237static int sdio_enable_4bit_bus(struct mmc_card *card)
238{
239 int err;
240
241 if (card->type == MMC_TYPE_SDIO)
242 return sdio_enable_wide(card);
243
244 if ((card->host->caps & MMC_CAP_4_BIT_DATA) &&
245 (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {
246 err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4);
247 if (err)
248 return err;
249 } else
250 return 0;
251
252 err = sdio_enable_wide(card);
253 if (err <= 0)
254 mmc_app_set_bus_width(card, MMC_BUS_WIDTH_1);
255
256 return err;
257}
258
259
Daniel Drake6b5eda32010-03-05 13:43:34 -0800260/*
Pierre Ossmand16f5772008-08-31 17:22:46 +0200261 * Test if the card supports high-speed mode and, if so, switch to it.
262 */
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700263static int mmc_sdio_switch_hs(struct mmc_card *card, int enable)
Pierre Ossmand16f5772008-08-31 17:22:46 +0200264{
265 int ret;
266 u8 speed;
267
268 if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
269 return 0;
270
271 if (!card->cccr.high_speed)
272 return 0;
273
274 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &speed);
275 if (ret)
276 return ret;
277
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700278 if (enable)
279 speed |= SDIO_SPEED_EHS;
280 else
281 speed &= ~SDIO_SPEED_EHS;
Pierre Ossmand16f5772008-08-31 17:22:46 +0200282
283 ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_SPEED, speed, NULL);
284 if (ret)
285 return ret;
286
Michal Miroslaw71578a12010-08-10 18:01:40 -0700287 return 1;
288}
Pierre Ossmand16f5772008-08-31 17:22:46 +0200289
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700290/*
291 * Enable SDIO/combo card's high-speed mode. Return 0/1 if [not]supported.
292 */
293static int sdio_enable_hs(struct mmc_card *card)
294{
295 int ret;
296
297 ret = mmc_sdio_switch_hs(card, true);
298 if (ret <= 0 || card->type == MMC_TYPE_SDIO)
299 return ret;
300
301 ret = mmc_sd_switch_hs(card);
302 if (ret <= 0)
303 mmc_sdio_switch_hs(card, false);
304
305 return ret;
306}
307
Michal Miroslaw71578a12010-08-10 18:01:40 -0700308static unsigned mmc_sdio_get_max_clock(struct mmc_card *card)
309{
310 unsigned max_dtr;
311
312 if (mmc_card_highspeed(card)) {
313 /*
314 * The SDIO specification doesn't mention how
315 * the CIS transfer speed register relates to
316 * high-speed, but it seems that 50 MHz is
317 * mandatory.
318 */
319 max_dtr = 50000000;
320 } else {
321 max_dtr = card->cis.max_dtr;
322 }
323
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700324 if (card->type == MMC_TYPE_SD_COMBO)
325 max_dtr = min(max_dtr, mmc_sd_get_max_clock(card));
326
Michal Miroslaw71578a12010-08-10 18:01:40 -0700327 return max_dtr;
Pierre Ossmand16f5772008-08-31 17:22:46 +0200328}
329
330/*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700331 * Handle the detection and initialisation of a card.
332 *
333 * In the case of a resume, "oldcard" will contain the card
334 * we're trying to reinitialise.
335 */
336static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,
Chris Ball3bca4cf72010-03-05 13:43:33 -0800337 struct mmc_card *oldcard, int powered_resume)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700338{
339 struct mmc_card *card;
340 int err;
341
342 BUG_ON(!host);
343 WARN_ON(!host->claimed);
344
345 /*
346 * Inform the card of the voltage
347 */
Chris Ball3bca4cf72010-03-05 13:43:33 -0800348 if (!powered_resume) {
349 err = mmc_send_io_op_cond(host, host->ocr, &ocr);
350 if (err)
351 goto err;
352 }
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700353
354 /*
355 * For SPI, enable CRC as appropriate.
356 */
357 if (mmc_host_is_spi(host)) {
358 err = mmc_spi_set_crc(host, use_spi_crc);
359 if (err)
360 goto err;
361 }
362
363 /*
364 * Allocate card structure.
365 */
366 card = mmc_alloc_card(host, NULL);
367 if (IS_ERR(card)) {
368 err = PTR_ERR(card);
369 goto err;
370 }
371
Arindam Nathd6d50a12011-05-05 12:18:59 +0530372 if ((ocr & R4_MEMORY_PRESENT) &&
373 mmc_sd_get_cid(host, host->ocr & ocr, card->raw_cid, NULL) == 0) {
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700374 card->type = MMC_TYPE_SD_COMBO;
375
376 if (oldcard && (oldcard->type != MMC_TYPE_SD_COMBO ||
377 memcmp(card->raw_cid, oldcard->raw_cid, sizeof(card->raw_cid)) != 0)) {
378 mmc_remove_card(card);
379 return -ENOENT;
380 }
381 } else {
382 card->type = MMC_TYPE_SDIO;
383
384 if (oldcard && oldcard->type != MMC_TYPE_SDIO) {
385 mmc_remove_card(card);
386 return -ENOENT;
387 }
388 }
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700389
390 /*
Daniel Mack3fcb0272010-04-01 10:03:25 +0200391 * Call the optional HC's init_card function to handle quirks.
392 */
393 if (host->ops->init_card)
394 host->ops->init_card(host, card);
395
396 /*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700397 * For native busses: set card RCA and quit open drain mode.
398 */
Chris Ball3bca4cf72010-03-05 13:43:33 -0800399 if (!powered_resume && !mmc_host_is_spi(host)) {
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700400 err = mmc_send_relative_addr(host, &card->rca);
401 if (err)
402 goto remove;
403
Stefan Nilsson XK0aab3992011-03-01 14:41:04 +0100404 /*
405 * Update oldcard with the new RCA received from the SDIO
406 * device -- we're doing this so that it's updated in the
407 * "card" struct when oldcard overwrites that later.
408 */
409 if (oldcard)
410 oldcard->rca = card->rca;
411
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700412 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
413 }
414
415 /*
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700416 * Read CSD, before selecting the card
417 */
418 if (!oldcard && card->type == MMC_TYPE_SD_COMBO) {
419 err = mmc_sd_get_csd(host, card);
420 if (err)
421 return err;
422
423 mmc_decode_cid(card);
424 }
425
426 /*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700427 * Select card, as all following commands rely on that.
428 */
Chris Ball3bca4cf72010-03-05 13:43:33 -0800429 if (!powered_resume && !mmc_host_is_spi(host)) {
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700430 err = mmc_select_card(card);
431 if (err)
432 goto remove;
433 }
434
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -0700435 if (card->quirks & MMC_QUIRK_NONSTD_SDIO) {
436 /*
437 * This is non-standard SDIO device, meaning it doesn't
438 * have any CIA (Common I/O area) registers present.
439 * It's host's responsibility to fill cccr and cis
440 * structures in init_card().
441 */
442 mmc_set_clock(host, card->cis.max_dtr);
443
444 if (card->cccr.high_speed) {
445 mmc_card_set_highspeed(card);
446 mmc_set_timing(card->host, MMC_TIMING_SD_HS);
447 }
448
449 goto finish;
450 }
451
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700452 /*
453 * Read the common registers.
454 */
455 err = sdio_read_cccr(card);
456 if (err)
457 goto remove;
458
459 /*
460 * Read the common CIS tuples.
461 */
462 err = sdio_read_common_cis(card);
463 if (err)
464 goto remove;
465
466 if (oldcard) {
467 int same = (card->cis.vendor == oldcard->cis.vendor &&
468 card->cis.device == oldcard->cis.device);
469 mmc_remove_card(card);
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700470 if (!same)
471 return -ENOENT;
472
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700473 card = oldcard;
474 }
Andrei Warkentin32780cd2011-04-11 17:02:15 -0500475 mmc_fixup_device(card, NULL);
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700476
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700477 if (card->type == MMC_TYPE_SD_COMBO) {
478 err = mmc_sd_setup_card(host, card, oldcard != NULL);
479 /* handle as SDIO-only card if memory init failed */
480 if (err) {
481 mmc_go_idle(host);
482 if (mmc_host_is_spi(host))
483 /* should not fail, as it worked previously */
484 mmc_spi_set_crc(host, use_spi_crc);
485 card->type = MMC_TYPE_SDIO;
486 } else
487 card->dev.type = &sd_type;
488 }
489
490 /*
491 * If needed, disconnect card detection pull-up resistor.
492 */
493 err = sdio_disable_cd(card);
494 if (err)
495 goto remove;
496
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700497 /*
498 * Switch to high-speed (if supported).
499 */
500 err = sdio_enable_hs(card);
Michal Miroslaw71578a12010-08-10 18:01:40 -0700501 if (err > 0)
502 mmc_sd_go_highspeed(card);
503 else if (err)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700504 goto remove;
505
506 /*
507 * Change to the card's maximum speed.
508 */
Michal Miroslaw71578a12010-08-10 18:01:40 -0700509 mmc_set_clock(host, mmc_sdio_get_max_clock(card));
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700510
511 /*
512 * Switch to wider bus (if supported).
513 */
Michal Miroslaw7310ece82010-08-10 18:01:40 -0700514 err = sdio_enable_4bit_bus(card);
515 if (err > 0)
516 mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);
517 else if (err)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700518 goto remove;
519
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -0700520finish:
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700521 if (!oldcard)
522 host->card = card;
523 return 0;
524
525remove:
526 if (!oldcard)
527 mmc_remove_card(card);
528
529err:
530 return err;
531}
532
533/*
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200534 * Host is being removed. Free up the current card.
535 */
536static void mmc_sdio_remove(struct mmc_host *host)
537{
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200538 int i;
539
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200540 BUG_ON(!host);
541 BUG_ON(!host->card);
542
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200543 for (i = 0;i < host->card->sdio_funcs;i++) {
544 if (host->card->sdio_func[i]) {
545 sdio_remove_func(host->card->sdio_func[i]);
546 host->card->sdio_func[i] = NULL;
547 }
548 }
549
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200550 mmc_remove_card(host->card);
551 host->card = NULL;
552}
553
554/*
555 * Card detection callback from host.
556 */
557static void mmc_sdio_detect(struct mmc_host *host)
558{
559 int err;
560
561 BUG_ON(!host);
562 BUG_ON(!host->card);
563
Ohad Ben-Cohen87973ba2010-10-02 13:54:12 +0200564 /* Make sure card is powered before detecting it */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200565 if (host->caps & MMC_CAP_POWER_OFF_CARD) {
566 err = pm_runtime_get_sync(&host->card->dev);
567 if (err < 0)
568 goto out;
569 }
Ohad Ben-Cohen87973ba2010-10-02 13:54:12 +0200570
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200571 mmc_claim_host(host);
572
573 /*
574 * Just check if our card has been removed.
575 */
576 err = mmc_select_card(host->card);
577
578 mmc_release_host(host);
579
Ohad Ben-Cohen4d0812c2010-11-14 12:40:33 +0200580 /*
581 * Tell PM core it's OK to power off the card now.
582 *
583 * The _sync variant is used in order to ensure that the card
584 * is left powered off in case an error occurred, and the card
585 * is going to be removed.
586 *
587 * Since there is no specific reason to believe a new user
588 * is about to show up at this point, the _sync variant is
589 * desirable anyway.
590 */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200591 if (host->caps & MMC_CAP_POWER_OFF_CARD)
592 pm_runtime_put_sync(&host->card->dev);
Ohad Ben-Cohen4d0812c2010-11-14 12:40:33 +0200593
Ohad Ben-Cohen87973ba2010-10-02 13:54:12 +0200594out:
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200595 if (err) {
596 mmc_sdio_remove(host);
597
598 mmc_claim_host(host);
599 mmc_detach_bus(host);
600 mmc_release_host(host);
601 }
602}
603
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700604/*
605 * SDIO suspend. We need to suspend all functions separately.
606 * Therefore all registered functions must have drivers with suspend
607 * and resume methods. Failing that we simply remove the whole card.
608 */
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700609static int mmc_sdio_suspend(struct mmc_host *host)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700610{
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700611 int i, err = 0;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700612
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700613 for (i = 0; i < host->card->sdio_funcs; i++) {
614 struct sdio_func *func = host->card->sdio_func[i];
615 if (func && sdio_func_present(func) && func->dev.driver) {
616 const struct dev_pm_ops *pmops = func->dev.driver->pm;
617 if (!pmops || !pmops->suspend || !pmops->resume) {
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700618 /* force removal of entire card in that case */
619 err = -ENOSYS;
620 } else
621 err = pmops->suspend(&func->dev);
622 if (err)
623 break;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700624 }
625 }
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700626 while (err && --i >= 0) {
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700627 struct sdio_func *func = host->card->sdio_func[i];
628 if (func && sdio_func_present(func) && func->dev.driver) {
629 const struct dev_pm_ops *pmops = func->dev.driver->pm;
630 pmops->resume(&func->dev);
631 }
632 }
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700633
Ohad Ben-Cohen6b93d01f2011-04-05 17:43:21 +0300634 if (!err && mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) {
Daniel Drake6b5eda32010-03-05 13:43:34 -0800635 mmc_claim_host(host);
636 sdio_disable_wide(host->card);
637 mmc_release_host(host);
638 }
639
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700640 return err;
641}
642
643static int mmc_sdio_resume(struct mmc_host *host)
644{
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200645 int i, err = 0;
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700646
647 BUG_ON(!host);
648 BUG_ON(!host->card);
649
650 /* Basic card reinitialization. */
651 mmc_claim_host(host);
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200652
653 /* No need to reinitialize powered-resumed nonremovable cards */
Ohad Ben-Cohena5e94252011-04-05 17:43:20 +0300654 if (mmc_card_is_removable(host) || !mmc_card_keep_power(host))
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200655 err = mmc_sdio_init_card(host, host->ocr, host->card,
Ohad Ben-Cohena5e94252011-04-05 17:43:20 +0300656 mmc_card_keep_power(host));
Ohad Ben-Cohen6b93d01f2011-04-05 17:43:21 +0300657 else if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) {
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200658 /* We may have switched to 1-bit mode during suspend */
659 err = sdio_enable_4bit_bus(host->card);
660 if (err > 0) {
661 mmc_set_bus_width(host, MMC_BUS_WIDTH_4);
662 err = 0;
663 }
664 }
665
Nicolas Pitre40216842010-03-05 13:43:34 -0800666 if (!err && host->sdio_irqs)
667 mmc_signal_sdio_irq(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700668 mmc_release_host(host);
669
670 /*
671 * If the card looked to be the same as before suspending, then
672 * we proceed to resume all card functions. If one of them returns
673 * an error then we simply return that error to the core and the
674 * card will be redetected as new. It is the responsibility of
675 * the function driver to perform further tests with the extra
676 * knowledge it has of the card to confirm the card is indeed the
677 * same as before suspending (same MAC address for network cards,
678 * etc.) and return an error otherwise.
679 */
680 for (i = 0; !err && i < host->card->sdio_funcs; i++) {
681 struct sdio_func *func = host->card->sdio_func[i];
682 if (func && sdio_func_present(func) && func->dev.driver) {
683 const struct dev_pm_ops *pmops = func->dev.driver->pm;
684 err = pmops->resume(&func->dev);
685 }
686 }
687
688 return err;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700689}
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200690
Ohad Ben-Cohend3fe37b2010-10-02 13:54:07 +0200691static int mmc_sdio_power_restore(struct mmc_host *host)
692{
693 int ret;
694
695 BUG_ON(!host);
696 BUG_ON(!host->card);
697
698 mmc_claim_host(host);
699 ret = mmc_sdio_init_card(host, host->ocr, host->card,
Ohad Ben-Cohena5e94252011-04-05 17:43:20 +0300700 mmc_card_keep_power(host));
Ohad Ben-Cohend3fe37b2010-10-02 13:54:07 +0200701 if (!ret && host->sdio_irqs)
702 mmc_signal_sdio_irq(host);
703 mmc_release_host(host);
704
705 return ret;
706}
707
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200708static const struct mmc_bus_ops mmc_sdio_ops = {
709 .remove = mmc_sdio_remove,
710 .detect = mmc_sdio_detect,
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700711 .suspend = mmc_sdio_suspend,
712 .resume = mmc_sdio_resume,
Ohad Ben-Cohend3fe37b2010-10-02 13:54:07 +0200713 .power_restore = mmc_sdio_power_restore,
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200714};
715
716
717/*
718 * Starting point for SDIO card init.
719 */
Andy Ross807e8e42011-01-03 10:36:56 -0800720int mmc_attach_sdio(struct mmc_host *host)
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200721{
Andy Ross807e8e42011-01-03 10:36:56 -0800722 int err, i, funcs;
723 u32 ocr;
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200724 struct mmc_card *card;
725
726 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +0200727 WARN_ON(!host->claimed);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200728
Andy Ross807e8e42011-01-03 10:36:56 -0800729 err = mmc_send_io_op_cond(host, 0, &ocr);
730 if (err)
731 return err;
732
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200733 mmc_attach_bus(host, &mmc_sdio_ops);
Takashi Iwai8f230f42010-12-08 10:04:30 +0100734 if (host->ocr_avail_sdio)
735 host->ocr_avail = host->ocr_avail_sdio;
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200736
737 /*
738 * Sanity check the voltages that the card claims to
739 * support.
740 */
741 if (ocr & 0x7F) {
742 printk(KERN_WARNING "%s: card claims to support voltages "
743 "below the defined range. These will be ignored.\n",
744 mmc_hostname(host));
745 ocr &= ~0x7F;
746 }
747
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200748 host->ocr = mmc_select_voltage(host, ocr);
749
750 /*
751 * Can we support the voltage(s) of the card(s)?
752 */
753 if (!host->ocr) {
754 err = -EINVAL;
755 goto err;
756 }
757
758 /*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700759 * Detect and init the card.
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200760 */
Chris Ball3bca4cf72010-03-05 13:43:33 -0800761 err = mmc_sdio_init_card(host, host->ocr, NULL, 0);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200762 if (err)
763 goto err;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700764 card = host->card;
David Brownellaf517152007-08-08 09:11:32 -0700765
766 /*
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200767 * Enable runtime PM only if supported by host+card+board
Ohad Ben-Cohen819685612010-10-02 13:54:10 +0200768 */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200769 if (host->caps & MMC_CAP_POWER_OFF_CARD) {
770 /*
771 * Let runtime PM core know our card is active
772 */
773 err = pm_runtime_set_active(&card->dev);
774 if (err)
775 goto remove;
Ohad Ben-Cohen819685612010-10-02 13:54:10 +0200776
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200777 /*
778 * Enable runtime PM for this card
779 */
780 pm_runtime_enable(&card->dev);
781 }
Ohad Ben-Cohen819685612010-10-02 13:54:10 +0200782
783 /*
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200784 * The number of functions on the card is encoded inside
785 * the ocr.
786 */
Matt Fleminge8812792009-12-17 15:27:18 -0800787 funcs = (ocr & 0x70000000) >> 28;
788 card->sdio_funcs = 0;
Pierre Ossman4ff64712007-07-30 18:23:53 +0200789
790 /*
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200791 * Initialize (but don't add) all present functions.
792 */
Matt Fleminge8812792009-12-17 15:27:18 -0800793 for (i = 0; i < funcs; i++, card->sdio_funcs++) {
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200794 err = sdio_init_func(host->card, i + 1);
795 if (err)
796 goto remove;
Ohad Ben-Cohen40bba0c2010-10-02 13:54:11 +0200797
798 /*
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200799 * Enable Runtime PM for this func (if supported)
Ohad Ben-Cohen40bba0c2010-10-02 13:54:11 +0200800 */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200801 if (host->caps & MMC_CAP_POWER_OFF_CARD)
802 pm_runtime_enable(&card->sdio_func[i]->dev);
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200803 }
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200804
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200805 /*
806 * First add the card to the driver model...
807 */
Andy Ross807e8e42011-01-03 10:36:56 -0800808 mmc_release_host(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200809 err = mmc_add_card(host->card);
810 if (err)
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200811 goto remove_added;
812
813 /*
814 * ...then the SDIO functions.
815 */
816 for (i = 0;i < funcs;i++) {
817 err = sdio_add_func(host->card->sdio_func[i]);
818 if (err)
819 goto remove_added;
820 }
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200821
Dmitry Shmidt34497912011-03-03 17:40:10 -0500822 mmc_claim_host(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200823 return 0;
824
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200825
826remove_added:
827 /* Remove without lock if the device has been added. */
828 mmc_sdio_remove(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200829 mmc_claim_host(host);
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200830remove:
831 /* And with lock if it hasn't been added. */
Andy Ross807e8e42011-01-03 10:36:56 -0800832 mmc_release_host(host);
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200833 if (host->card)
834 mmc_sdio_remove(host);
Andy Ross807e8e42011-01-03 10:36:56 -0800835 mmc_claim_host(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200836err:
837 mmc_detach_bus(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200838
839 printk(KERN_ERR "%s: error %d whilst initialising SDIO card\n",
840 mmc_hostname(host), err);
841
842 return err;
843}
844