blob: b3b5ff4901026c0ebd50bf7ba2f5d82fe563e053 [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-Cohen81968562010-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
San Mehat9a248202008-04-14 15:22:49 -070030#ifdef CONFIG_MMC_EMBEDDED_SDIO
31#include <linux/mmc/sdio_ids.h>
32#endif
33
Pierre Ossman05970072007-06-11 21:01:00 +020034static int sdio_read_fbr(struct sdio_func *func)
35{
36 int ret;
37 unsigned char data;
38
Ohad Ben-Coheneab40682011-04-05 17:50:14 +030039 if (mmc_card_nonstd_func_interface(func->card)) {
40 func->class = SDIO_CLASS_NONE;
41 return 0;
42 }
43
Pierre Ossman05970072007-06-11 21:01:00 +020044 ret = mmc_io_rw_direct(func->card, 0, 0,
David Vrabel7616ee92007-08-08 14:23:05 +010045 SDIO_FBR_BASE(func->num) + SDIO_FBR_STD_IF, 0, &data);
Pierre Ossman05970072007-06-11 21:01:00 +020046 if (ret)
47 goto out;
48
49 data &= 0x0f;
50
51 if (data == 0x0f) {
52 ret = mmc_io_rw_direct(func->card, 0, 0,
David Vrabel7616ee92007-08-08 14:23:05 +010053 SDIO_FBR_BASE(func->num) + SDIO_FBR_STD_IF_EXT, 0, &data);
Pierre Ossman05970072007-06-11 21:01:00 +020054 if (ret)
55 goto out;
56 }
57
58 func->class = data;
59
60out:
61 return ret;
62}
63
Pierre Ossmane29a7d72007-05-26 13:48:18 +020064static int sdio_init_func(struct mmc_card *card, unsigned int fn)
65{
Pierre Ossman05970072007-06-11 21:01:00 +020066 int ret;
Pierre Ossmane29a7d72007-05-26 13:48:18 +020067 struct sdio_func *func;
68
69 BUG_ON(fn > SDIO_MAX_FUNCS);
70
71 func = sdio_alloc_func(card);
72 if (IS_ERR(func))
73 return PTR_ERR(func);
74
75 func->num = fn;
76
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -070077 if (!(card->quirks & MMC_QUIRK_NONSTD_SDIO)) {
78 ret = sdio_read_fbr(func);
79 if (ret)
80 goto fail;
Pierre Ossman05970072007-06-11 21:01:00 +020081
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -070082 ret = sdio_read_func_cis(func);
83 if (ret)
84 goto fail;
85 } else {
86 func->vendor = func->card->cis.vendor;
87 func->device = func->card->cis.device;
88 func->max_blksize = func->card->cis.blksize;
89 }
Nicolas Pitreb7261262007-06-16 02:04:16 -040090
Pierre Ossmane29a7d72007-05-26 13:48:18 +020091 card->sdio_func[fn - 1] = func;
92
93 return 0;
Pierre Ossman05970072007-06-11 21:01:00 +020094
95fail:
96 /*
97 * It is okay to remove the function here even though we hold
98 * the host lock as we haven't registered the device yet.
99 */
100 sdio_remove_func(func);
101 return ret;
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200102}
103
Pierre Ossman35c66c12007-06-11 20:25:43 +0200104static int sdio_read_cccr(struct mmc_card *card)
105{
106 int ret;
107 int cccr_vsn;
108 unsigned char data;
109
110 memset(&card->cccr, 0, sizeof(struct sdio_cccr));
111
112 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_CCCR, 0, &data);
113 if (ret)
114 goto out;
115
116 cccr_vsn = data & 0x0f;
117
118 if (cccr_vsn > SDIO_CCCR_REV_1_20) {
119 printk(KERN_ERR "%s: unrecognised CCCR structure version %d\n",
120 mmc_hostname(card->host), cccr_vsn);
121 return -EINVAL;
122 }
123
124 card->cccr.sdio_vsn = (data & 0xf0) >> 4;
125
126 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_CAPS, 0, &data);
127 if (ret)
128 goto out;
129
130 if (data & SDIO_CCCR_CAP_SMB)
131 card->cccr.multi_block = 1;
132 if (data & SDIO_CCCR_CAP_LSC)
133 card->cccr.low_speed = 1;
134 if (data & SDIO_CCCR_CAP_4BLS)
135 card->cccr.wide_bus = 1;
136
137 if (cccr_vsn >= SDIO_CCCR_REV_1_10) {
138 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_POWER, 0, &data);
139 if (ret)
140 goto out;
141
142 if (data & SDIO_POWER_SMPC)
143 card->cccr.high_power = 1;
144 }
145
146 if (cccr_vsn >= SDIO_CCCR_REV_1_20) {
147 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &data);
148 if (ret)
149 goto out;
150
151 if (data & SDIO_SPEED_SHS)
152 card->cccr.high_speed = 1;
153 }
154
155out:
156 return ret;
157}
158
Pierre Ossman4ff64712007-07-30 18:23:53 +0200159static int sdio_enable_wide(struct mmc_card *card)
160{
161 int ret;
162 u8 ctrl;
163
164 if (!(card->host->caps & MMC_CAP_4_BIT_DATA))
165 return 0;
166
167 if (card->cccr.low_speed && !card->cccr.wide_bus)
168 return 0;
169
170 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl);
171 if (ret)
172 return ret;
173
174 ctrl |= SDIO_BUS_WIDTH_4BIT;
175
176 ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
177 if (ret)
178 return ret;
179
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700180 return 1;
Pierre Ossman4ff64712007-07-30 18:23:53 +0200181}
182
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200183/*
Ohad Ben-Cohen006ebd52009-09-22 16:45:07 -0700184 * If desired, disconnect the pull-up resistor on CD/DAT[3] (pin 1)
185 * of the card. This may be required on certain setups of boards,
186 * controllers and embedded sdio device which do not need the card's
187 * pull-up. As a result, card detection is disabled and power is saved.
188 */
189static int sdio_disable_cd(struct mmc_card *card)
190{
191 int ret;
192 u8 ctrl;
193
Ohad Ben-Cohen2059a022011-04-05 18:02:25 +0300194 if (!mmc_card_disable_cd(card))
Ohad Ben-Cohen006ebd52009-09-22 16:45:07 -0700195 return 0;
196
197 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl);
198 if (ret)
199 return ret;
200
201 ctrl |= SDIO_BUS_CD_DISABLE;
202
203 return mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
204}
205
206/*
Daniel Drake6b5eda32010-03-05 13:43:34 -0800207 * Devices that remain active during a system suspend are
208 * put back into 1-bit mode.
209 */
210static int sdio_disable_wide(struct mmc_card *card)
211{
212 int ret;
213 u8 ctrl;
214
215 if (!(card->host->caps & MMC_CAP_4_BIT_DATA))
216 return 0;
217
218 if (card->cccr.low_speed && !card->cccr.wide_bus)
219 return 0;
220
221 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_IF, 0, &ctrl);
222 if (ret)
223 return ret;
224
225 if (!(ctrl & SDIO_BUS_WIDTH_4BIT))
226 return 0;
227
228 ctrl &= ~SDIO_BUS_WIDTH_4BIT;
229 ctrl |= SDIO_BUS_ASYNC_INT;
230
231 ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_IF, ctrl, NULL);
232 if (ret)
233 return ret;
234
235 mmc_set_bus_width(card->host, MMC_BUS_WIDTH_1);
236
237 return 0;
238}
239
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700240
241static int sdio_enable_4bit_bus(struct mmc_card *card)
242{
243 int err;
244
245 if (card->type == MMC_TYPE_SDIO)
246 return sdio_enable_wide(card);
247
248 if ((card->host->caps & MMC_CAP_4_BIT_DATA) &&
249 (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) {
250 err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4);
251 if (err)
252 return err;
253 } else
254 return 0;
255
256 err = sdio_enable_wide(card);
257 if (err <= 0)
258 mmc_app_set_bus_width(card, MMC_BUS_WIDTH_1);
259
260 return err;
261}
262
263
Daniel Drake6b5eda32010-03-05 13:43:34 -0800264/*
Pierre Ossmand16f5772008-08-31 17:22:46 +0200265 * Test if the card supports high-speed mode and, if so, switch to it.
266 */
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700267static int mmc_sdio_switch_hs(struct mmc_card *card, int enable)
Pierre Ossmand16f5772008-08-31 17:22:46 +0200268{
269 int ret;
270 u8 speed;
271
272 if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED))
273 return 0;
274
275 if (!card->cccr.high_speed)
276 return 0;
277
278 ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_SPEED, 0, &speed);
279 if (ret)
280 return ret;
281
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700282 if (enable)
283 speed |= SDIO_SPEED_EHS;
284 else
285 speed &= ~SDIO_SPEED_EHS;
Pierre Ossmand16f5772008-08-31 17:22:46 +0200286
287 ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_SPEED, speed, NULL);
288 if (ret)
289 return ret;
290
Michal Miroslaw71578a12010-08-10 18:01:40 -0700291 return 1;
292}
Pierre Ossmand16f5772008-08-31 17:22:46 +0200293
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700294/*
295 * Enable SDIO/combo card's high-speed mode. Return 0/1 if [not]supported.
296 */
297static int sdio_enable_hs(struct mmc_card *card)
298{
299 int ret;
300
301 ret = mmc_sdio_switch_hs(card, true);
302 if (ret <= 0 || card->type == MMC_TYPE_SDIO)
303 return ret;
304
305 ret = mmc_sd_switch_hs(card);
306 if (ret <= 0)
307 mmc_sdio_switch_hs(card, false);
308
309 return ret;
310}
311
Michal Miroslaw71578a12010-08-10 18:01:40 -0700312static unsigned mmc_sdio_get_max_clock(struct mmc_card *card)
313{
314 unsigned max_dtr;
315
316 if (mmc_card_highspeed(card)) {
317 /*
318 * The SDIO specification doesn't mention how
319 * the CIS transfer speed register relates to
320 * high-speed, but it seems that 50 MHz is
321 * mandatory.
322 */
323 max_dtr = 50000000;
324 } else {
325 max_dtr = card->cis.max_dtr;
326 }
327
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700328 if (card->type == MMC_TYPE_SD_COMBO)
329 max_dtr = min(max_dtr, mmc_sd_get_max_clock(card));
330
Michal Miroslaw71578a12010-08-10 18:01:40 -0700331 return max_dtr;
Pierre Ossmand16f5772008-08-31 17:22:46 +0200332}
333
334/*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700335 * Handle the detection and initialisation of a card.
336 *
337 * In the case of a resume, "oldcard" will contain the card
338 * we're trying to reinitialise.
339 */
340static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,
Chris Ball3bca4cf2010-03-05 13:43:33 -0800341 struct mmc_card *oldcard, int powered_resume)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700342{
343 struct mmc_card *card;
344 int err;
345
346 BUG_ON(!host);
347 WARN_ON(!host->claimed);
348
349 /*
350 * Inform the card of the voltage
351 */
Chris Ball3bca4cf2010-03-05 13:43:33 -0800352 if (!powered_resume) {
353 err = mmc_send_io_op_cond(host, host->ocr, &ocr);
354 if (err)
355 goto err;
356 }
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700357
358 /*
359 * For SPI, enable CRC as appropriate.
360 */
361 if (mmc_host_is_spi(host)) {
362 err = mmc_spi_set_crc(host, use_spi_crc);
363 if (err)
364 goto err;
365 }
366
367 /*
368 * Allocate card structure.
369 */
370 card = mmc_alloc_card(host, NULL);
371 if (IS_ERR(card)) {
372 err = PTR_ERR(card);
373 goto err;
374 }
375
Arindam Nathd6d50a12011-05-05 12:18:59 +0530376 if ((ocr & R4_MEMORY_PRESENT) &&
377 mmc_sd_get_cid(host, host->ocr & ocr, card->raw_cid, NULL) == 0) {
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700378 card->type = MMC_TYPE_SD_COMBO;
379
380 if (oldcard && (oldcard->type != MMC_TYPE_SD_COMBO ||
381 memcmp(card->raw_cid, oldcard->raw_cid, sizeof(card->raw_cid)) != 0)) {
382 mmc_remove_card(card);
383 return -ENOENT;
384 }
385 } else {
386 card->type = MMC_TYPE_SDIO;
387
388 if (oldcard && oldcard->type != MMC_TYPE_SDIO) {
389 mmc_remove_card(card);
390 return -ENOENT;
391 }
392 }
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700393
394 /*
Daniel Mack3fcb0272010-04-01 10:03:25 +0200395 * Call the optional HC's init_card function to handle quirks.
396 */
397 if (host->ops->init_card)
398 host->ops->init_card(host, card);
399
400 /*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700401 * For native busses: set card RCA and quit open drain mode.
402 */
Chris Ball3bca4cf2010-03-05 13:43:33 -0800403 if (!powered_resume && !mmc_host_is_spi(host)) {
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700404 err = mmc_send_relative_addr(host, &card->rca);
405 if (err)
406 goto remove;
407
Stefan Nilsson XK0aab3992011-03-01 14:41:04 +0100408 /*
409 * Update oldcard with the new RCA received from the SDIO
410 * device -- we're doing this so that it's updated in the
411 * "card" struct when oldcard overwrites that later.
412 */
413 if (oldcard)
414 oldcard->rca = card->rca;
415
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700416 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
417 }
418
419 /*
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700420 * Read CSD, before selecting the card
421 */
422 if (!oldcard && card->type == MMC_TYPE_SD_COMBO) {
423 err = mmc_sd_get_csd(host, card);
424 if (err)
425 return err;
426
427 mmc_decode_cid(card);
428 }
429
430 /*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700431 * Select card, as all following commands rely on that.
432 */
Chris Ball3bca4cf2010-03-05 13:43:33 -0800433 if (!powered_resume && !mmc_host_is_spi(host)) {
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700434 err = mmc_select_card(card);
435 if (err)
436 goto remove;
437 }
438
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -0700439 if (card->quirks & MMC_QUIRK_NONSTD_SDIO) {
440 /*
441 * This is non-standard SDIO device, meaning it doesn't
442 * have any CIA (Common I/O area) registers present.
443 * It's host's responsibility to fill cccr and cis
444 * structures in init_card().
445 */
446 mmc_set_clock(host, card->cis.max_dtr);
447
448 if (card->cccr.high_speed) {
449 mmc_card_set_highspeed(card);
450 mmc_set_timing(card->host, MMC_TIMING_SD_HS);
451 }
452
453 goto finish;
454 }
455
San Mehat9a248202008-04-14 15:22:49 -0700456#ifdef CONFIG_MMC_EMBEDDED_SDIO
457 if (host->embedded_sdio_data.cccr)
458 memcpy(&card->cccr, host->embedded_sdio_data.cccr, sizeof(struct sdio_cccr));
459 else {
460#endif
461 /*
462 * Read the common registers.
463 */
464 err = sdio_read_cccr(card);
465 if (err)
466 goto remove;
467#ifdef CONFIG_MMC_EMBEDDED_SDIO
468 }
469#endif
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700470
San Mehat9a248202008-04-14 15:22:49 -0700471#ifdef CONFIG_MMC_EMBEDDED_SDIO
472 if (host->embedded_sdio_data.cis)
473 memcpy(&card->cis, host->embedded_sdio_data.cis, sizeof(struct sdio_cis));
474 else {
475#endif
476 /*
477 * Read the common CIS tuples.
478 */
479 err = sdio_read_common_cis(card);
480 if (err)
481 goto remove;
482#ifdef CONFIG_MMC_EMBEDDED_SDIO
483 }
484#endif
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700485
486 if (oldcard) {
487 int same = (card->cis.vendor == oldcard->cis.vendor &&
488 card->cis.device == oldcard->cis.device);
489 mmc_remove_card(card);
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700490 if (!same)
491 return -ENOENT;
492
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700493 card = oldcard;
494 }
Andrei Warkentin32780cd2011-04-11 17:02:15 -0500495 mmc_fixup_device(card, NULL);
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700496
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700497 if (card->type == MMC_TYPE_SD_COMBO) {
498 err = mmc_sd_setup_card(host, card, oldcard != NULL);
499 /* handle as SDIO-only card if memory init failed */
500 if (err) {
501 mmc_go_idle(host);
502 if (mmc_host_is_spi(host))
503 /* should not fail, as it worked previously */
504 mmc_spi_set_crc(host, use_spi_crc);
505 card->type = MMC_TYPE_SDIO;
506 } else
507 card->dev.type = &sd_type;
508 }
509
510 /*
511 * If needed, disconnect card detection pull-up resistor.
512 */
513 err = sdio_disable_cd(card);
514 if (err)
515 goto remove;
516
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700517 /*
518 * Switch to high-speed (if supported).
519 */
520 err = sdio_enable_hs(card);
Michal Miroslaw71578a12010-08-10 18:01:40 -0700521 if (err > 0)
522 mmc_sd_go_highspeed(card);
523 else if (err)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700524 goto remove;
525
526 /*
527 * Change to the card's maximum speed.
528 */
Michal Miroslaw71578a12010-08-10 18:01:40 -0700529 mmc_set_clock(host, mmc_sdio_get_max_clock(card));
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700530
531 /*
532 * Switch to wider bus (if supported).
533 */
Michal Miroslaw7310ece2010-08-10 18:01:40 -0700534 err = sdio_enable_4bit_bus(card);
535 if (err > 0)
536 mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4);
537 else if (err)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700538 goto remove;
539
Grazvydas Ignotas6f51be32010-08-10 18:01:50 -0700540finish:
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700541 if (!oldcard)
542 host->card = card;
543 return 0;
544
545remove:
546 if (!oldcard)
547 mmc_remove_card(card);
548
549err:
550 return err;
551}
552
553/*
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200554 * Host is being removed. Free up the current card.
555 */
556static void mmc_sdio_remove(struct mmc_host *host)
557{
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200558 int i;
559
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200560 BUG_ON(!host);
561 BUG_ON(!host->card);
562
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200563 for (i = 0;i < host->card->sdio_funcs;i++) {
564 if (host->card->sdio_func[i]) {
565 sdio_remove_func(host->card->sdio_func[i]);
566 host->card->sdio_func[i] = NULL;
567 }
568 }
569
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200570 mmc_remove_card(host->card);
571 host->card = NULL;
572}
573
574/*
575 * Card detection callback from host.
576 */
577static void mmc_sdio_detect(struct mmc_host *host)
578{
579 int err;
580
581 BUG_ON(!host);
582 BUG_ON(!host->card);
583
Ohad Ben-Cohen87973ba2010-10-02 13:54:12 +0200584 /* Make sure card is powered before detecting it */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200585 if (host->caps & MMC_CAP_POWER_OFF_CARD) {
586 err = pm_runtime_get_sync(&host->card->dev);
587 if (err < 0)
588 goto out;
589 }
Ohad Ben-Cohen87973ba2010-10-02 13:54:12 +0200590
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200591 mmc_claim_host(host);
592
593 /*
594 * Just check if our card has been removed.
595 */
596 err = mmc_select_card(host->card);
597
598 mmc_release_host(host);
599
Ohad Ben-Cohen4d0812c2010-11-14 12:40:33 +0200600 /*
601 * Tell PM core it's OK to power off the card now.
602 *
603 * The _sync variant is used in order to ensure that the card
604 * is left powered off in case an error occurred, and the card
605 * is going to be removed.
606 *
607 * Since there is no specific reason to believe a new user
608 * is about to show up at this point, the _sync variant is
609 * desirable anyway.
610 */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200611 if (host->caps & MMC_CAP_POWER_OFF_CARD)
612 pm_runtime_put_sync(&host->card->dev);
Ohad Ben-Cohen4d0812c2010-11-14 12:40:33 +0200613
Ohad Ben-Cohen87973ba2010-10-02 13:54:12 +0200614out:
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200615 if (err) {
616 mmc_sdio_remove(host);
617
618 mmc_claim_host(host);
619 mmc_detach_bus(host);
620 mmc_release_host(host);
621 }
622}
623
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700624/*
625 * SDIO suspend. We need to suspend all functions separately.
626 * Therefore all registered functions must have drivers with suspend
627 * and resume methods. Failing that we simply remove the whole card.
628 */
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700629static int mmc_sdio_suspend(struct mmc_host *host)
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700630{
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700631 int i, err = 0;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700632
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700633 for (i = 0; i < host->card->sdio_funcs; i++) {
634 struct sdio_func *func = host->card->sdio_func[i];
635 if (func && sdio_func_present(func) && func->dev.driver) {
636 const struct dev_pm_ops *pmops = func->dev.driver->pm;
637 if (!pmops || !pmops->suspend || !pmops->resume) {
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700638 /* force removal of entire card in that case */
639 err = -ENOSYS;
640 } else
641 err = pmops->suspend(&func->dev);
642 if (err)
643 break;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700644 }
645 }
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700646 while (err && --i >= 0) {
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700647 struct sdio_func *func = host->card->sdio_func[i];
648 if (func && sdio_func_present(func) && func->dev.driver) {
649 const struct dev_pm_ops *pmops = func->dev.driver->pm;
650 pmops->resume(&func->dev);
651 }
652 }
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700653
Ohad Ben-Cohen6b93d01f2011-04-05 17:43:21 +0300654 if (!err && mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) {
Daniel Drake6b5eda32010-03-05 13:43:34 -0800655 mmc_claim_host(host);
656 sdio_disable_wide(host->card);
657 mmc_release_host(host);
658 }
659
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700660 return err;
661}
662
663static int mmc_sdio_resume(struct mmc_host *host)
664{
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200665 int i, err = 0;
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700666
667 BUG_ON(!host);
668 BUG_ON(!host->card);
669
670 /* Basic card reinitialization. */
671 mmc_claim_host(host);
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200672
673 /* No need to reinitialize powered-resumed nonremovable cards */
Ohad Ben-Cohena5e94252011-04-05 17:43:20 +0300674 if (mmc_card_is_removable(host) || !mmc_card_keep_power(host))
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200675 err = mmc_sdio_init_card(host, host->ocr, host->card,
Ohad Ben-Cohena5e94252011-04-05 17:43:20 +0300676 mmc_card_keep_power(host));
Ohad Ben-Cohen6b93d01f2011-04-05 17:43:21 +0300677 else if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) {
Ohad Ben-Cohen080bc972010-11-28 07:21:29 +0200678 /* We may have switched to 1-bit mode during suspend */
679 err = sdio_enable_4bit_bus(host->card);
680 if (err > 0) {
681 mmc_set_bus_width(host, MMC_BUS_WIDTH_4);
682 err = 0;
683 }
684 }
685
Nicolas Pitre40216842010-03-05 13:43:34 -0800686 if (!err && host->sdio_irqs)
687 mmc_signal_sdio_irq(host);
Nicolas Pitre95cdfb72009-09-22 16:45:29 -0700688 mmc_release_host(host);
689
690 /*
691 * If the card looked to be the same as before suspending, then
692 * we proceed to resume all card functions. If one of them returns
693 * an error then we simply return that error to the core and the
694 * card will be redetected as new. It is the responsibility of
695 * the function driver to perform further tests with the extra
696 * knowledge it has of the card to confirm the card is indeed the
697 * same as before suspending (same MAC address for network cards,
698 * etc.) and return an error otherwise.
699 */
700 for (i = 0; !err && i < host->card->sdio_funcs; i++) {
701 struct sdio_func *func = host->card->sdio_func[i];
702 if (func && sdio_func_present(func) && func->dev.driver) {
703 const struct dev_pm_ops *pmops = func->dev.driver->pm;
704 err = pmops->resume(&func->dev);
705 }
706 }
707
708 return err;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700709}
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200710
Ohad Ben-Cohend3fe37b2010-10-02 13:54:07 +0200711static int mmc_sdio_power_restore(struct mmc_host *host)
712{
713 int ret;
714
715 BUG_ON(!host);
716 BUG_ON(!host->card);
717
718 mmc_claim_host(host);
719 ret = mmc_sdio_init_card(host, host->ocr, host->card,
Ohad Ben-Cohena5e94252011-04-05 17:43:20 +0300720 mmc_card_keep_power(host));
Ohad Ben-Cohend3fe37b2010-10-02 13:54:07 +0200721 if (!ret && host->sdio_irqs)
722 mmc_signal_sdio_irq(host);
723 mmc_release_host(host);
724
725 return ret;
726}
727
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200728static const struct mmc_bus_ops mmc_sdio_ops = {
729 .remove = mmc_sdio_remove,
730 .detect = mmc_sdio_detect,
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700731 .suspend = mmc_sdio_suspend,
732 .resume = mmc_sdio_resume,
Ohad Ben-Cohend3fe37b2010-10-02 13:54:07 +0200733 .power_restore = mmc_sdio_power_restore,
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200734};
735
736
737/*
738 * Starting point for SDIO card init.
739 */
Andy Ross807e8e42011-01-03 10:36:56 -0800740int mmc_attach_sdio(struct mmc_host *host)
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200741{
Andy Ross807e8e42011-01-03 10:36:56 -0800742 int err, i, funcs;
743 u32 ocr;
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200744 struct mmc_card *card;
745
746 BUG_ON(!host);
Pierre Ossmand84075c82007-08-09 13:23:56 +0200747 WARN_ON(!host->claimed);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200748
Andy Ross807e8e42011-01-03 10:36:56 -0800749 err = mmc_send_io_op_cond(host, 0, &ocr);
750 if (err)
751 return err;
752
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200753 mmc_attach_bus(host, &mmc_sdio_ops);
Takashi Iwai8f230f42010-12-08 10:04:30 +0100754 if (host->ocr_avail_sdio)
755 host->ocr_avail = host->ocr_avail_sdio;
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200756
757 /*
758 * Sanity check the voltages that the card claims to
759 * support.
760 */
761 if (ocr & 0x7F) {
762 printk(KERN_WARNING "%s: card claims to support voltages "
763 "below the defined range. These will be ignored.\n",
764 mmc_hostname(host));
765 ocr &= ~0x7F;
766 }
767
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200768 host->ocr = mmc_select_voltage(host, ocr);
769
770 /*
771 * Can we support the voltage(s) of the card(s)?
772 */
773 if (!host->ocr) {
774 err = -EINVAL;
775 goto err;
776 }
777
778 /*
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700779 * Detect and init the card.
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200780 */
Chris Ball3bca4cf2010-03-05 13:43:33 -0800781 err = mmc_sdio_init_card(host, host->ocr, NULL, 0);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200782 if (err)
783 goto err;
Nicolas Pitre17d33e12009-09-22 16:45:28 -0700784 card = host->card;
David Brownellaf517152007-08-08 09:11:32 -0700785
786 /*
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200787 * Enable runtime PM only if supported by host+card+board
Ohad Ben-Cohen81968562010-10-02 13:54:10 +0200788 */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200789 if (host->caps & MMC_CAP_POWER_OFF_CARD) {
790 /*
791 * Let runtime PM core know our card is active
792 */
793 err = pm_runtime_set_active(&card->dev);
794 if (err)
795 goto remove;
Ohad Ben-Cohen81968562010-10-02 13:54:10 +0200796
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200797 /*
798 * Enable runtime PM for this card
799 */
800 pm_runtime_enable(&card->dev);
801 }
Ohad Ben-Cohen81968562010-10-02 13:54:10 +0200802
803 /*
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200804 * The number of functions on the card is encoded inside
805 * the ocr.
806 */
Matt Fleminge8812792009-12-17 15:27:18 -0800807 funcs = (ocr & 0x70000000) >> 28;
808 card->sdio_funcs = 0;
Pierre Ossman4ff64712007-07-30 18:23:53 +0200809
San Mehat9a248202008-04-14 15:22:49 -0700810#ifdef CONFIG_MMC_EMBEDDED_SDIO
811 if (host->embedded_sdio_data.funcs)
812 card->sdio_funcs = funcs = host->embedded_sdio_data.num_funcs;
813#endif
814
Pierre Ossman4ff64712007-07-30 18:23:53 +0200815 /*
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200816 * Initialize (but don't add) all present functions.
817 */
Matt Fleminge8812792009-12-17 15:27:18 -0800818 for (i = 0; i < funcs; i++, card->sdio_funcs++) {
San Mehat9a248202008-04-14 15:22:49 -0700819#ifdef CONFIG_MMC_EMBEDDED_SDIO
820 if (host->embedded_sdio_data.funcs) {
821 struct sdio_func *tmp;
Ohad Ben-Cohen40bba0c2010-10-02 13:54:11 +0200822
San Mehat9a248202008-04-14 15:22:49 -0700823 tmp = sdio_alloc_func(host->card);
824 if (IS_ERR(tmp))
825 goto remove;
826 tmp->num = (i + 1);
827 card->sdio_func[i] = tmp;
828 tmp->class = host->embedded_sdio_data.funcs[i].f_class;
829 tmp->max_blksize = host->embedded_sdio_data.funcs[i].f_maxblksize;
830 tmp->vendor = card->cis.vendor;
831 tmp->device = card->cis.device;
832 } else {
833#endif
834 err = sdio_init_func(host->card, i + 1);
835 if (err)
836 goto remove;
837#ifdef CONFIG_MMC_EMBEDDED_SDIO
838 }
839#endif
Ohad Ben-Cohen40bba0c2010-10-02 13:54:11 +0200840 /*
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200841 * Enable Runtime PM for this func (if supported)
Ohad Ben-Cohen40bba0c2010-10-02 13:54:11 +0200842 */
Ohad Ben-Cohened919b02010-11-19 09:29:09 +0200843 if (host->caps & MMC_CAP_POWER_OFF_CARD)
844 pm_runtime_enable(&card->sdio_func[i]->dev);
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200845 }
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200846
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200847 /*
848 * First add the card to the driver model...
849 */
Andy Ross807e8e42011-01-03 10:36:56 -0800850 mmc_release_host(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200851 err = mmc_add_card(host->card);
852 if (err)
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200853 goto remove_added;
854
855 /*
856 * ...then the SDIO functions.
857 */
858 for (i = 0;i < funcs;i++) {
859 err = sdio_add_func(host->card->sdio_func[i]);
860 if (err)
861 goto remove_added;
862 }
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200863
Dmitry Shmidt34497912011-03-03 17:40:10 -0500864 mmc_claim_host(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200865 return 0;
866
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200867
868remove_added:
869 /* Remove without lock if the device has been added. */
870 mmc_sdio_remove(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200871 mmc_claim_host(host);
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200872remove:
873 /* And with lock if it hasn't been added. */
Andy Ross807e8e42011-01-03 10:36:56 -0800874 mmc_release_host(host);
Pierre Ossmane29a7d72007-05-26 13:48:18 +0200875 if (host->card)
876 mmc_sdio_remove(host);
Andy Ross807e8e42011-01-03 10:36:56 -0800877 mmc_claim_host(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200878err:
879 mmc_detach_bus(host);
Pierre Ossman5c4e6f12007-05-21 20:23:20 +0200880
881 printk(KERN_ERR "%s: error %d whilst initialising SDIO card\n",
882 mmc_hostname(host), err);
883
884 return err;
885}
886
San Mehat200a8e82008-05-15 09:15:37 -0700887int sdio_reset_comm(struct mmc_card *card)
888{
889 struct mmc_host *host = card->host;
890 u32 ocr;
891 int err;
892
893 printk("%s():\n", __func__);
Dmitry Shmidt7e053b32009-07-29 10:22:03 -0700894 mmc_claim_host(host);
895
San Mehat200a8e82008-05-15 09:15:37 -0700896 mmc_go_idle(host);
897
898 mmc_set_clock(host, host->f_min);
899
900 err = mmc_send_io_op_cond(host, 0, &ocr);
901 if (err)
902 goto err;
903
904 host->ocr = mmc_select_voltage(host, ocr);
905 if (!host->ocr) {
906 err = -EINVAL;
907 goto err;
908 }
909
910 err = mmc_send_io_op_cond(host, host->ocr, &ocr);
911 if (err)
912 goto err;
913
914 if (mmc_host_is_spi(host)) {
915 err = mmc_spi_set_crc(host, use_spi_crc);
916 if (err)
917 goto err;
918 }
919
920 if (!mmc_host_is_spi(host)) {
921 err = mmc_send_relative_addr(host, &card->rca);
922 if (err)
923 goto err;
924 mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL);
925 }
926 if (!mmc_host_is_spi(host)) {
927 err = mmc_select_card(card);
928 if (err)
929 goto err;
930 }
931
Daniel Chen8f5ed002009-12-09 09:45:36 -0800932 /*
933 * Switch to high-speed (if supported).
934 */
935 err = sdio_enable_hs(card);
936 if (err)
937 goto err;
938
939 /*
940 * Change to the card's maximum speed.
941 */
942 if (mmc_card_highspeed(card)) {
943 /*
944 * The SDIO specification doesn't mention how
945 * the CIS transfer speed register relates to
946 * high-speed, but it seems that 50 MHz is
947 * mandatory.
948 */
949 mmc_set_clock(host, 50000000);
950 } else {
951 mmc_set_clock(host, card->cis.max_dtr);
952 }
953
San Mehat200a8e82008-05-15 09:15:37 -0700954 err = sdio_enable_wide(card);
955 if (err)
956 goto err;
Dmitry Shmidt7e053b32009-07-29 10:22:03 -0700957 mmc_release_host(host);
San Mehat200a8e82008-05-15 09:15:37 -0700958 return 0;
Dmitry Shmidt7e053b32009-07-29 10:22:03 -0700959err:
San Mehat200a8e82008-05-15 09:15:37 -0700960 printk("%s: Error resetting SDIO communications (%d)\n",
961 mmc_hostname(host), err);
Dmitry Shmidt7e053b32009-07-29 10:22:03 -0700962 mmc_release_host(host);
San Mehat200a8e82008-05-15 09:15:37 -0700963 return err;
964}
965EXPORT_SYMBOL(sdio_reset_comm);