diff options
-rw-r--r-- | drivers/mmc/core/Makefile | 2 | ||||
-rw-r--r-- | drivers/mmc/core/core.c | 817 | ||||
-rw-r--r-- | drivers/mmc/core/core.h | 37 | ||||
-rw-r--r-- | drivers/mmc/core/mmc.c | 430 | ||||
-rw-r--r-- | drivers/mmc/core/sd.c | 431 | ||||
-rw-r--r-- | include/linux/mmc/host.h | 7 |
6 files changed, 1041 insertions, 683 deletions
diff --git a/drivers/mmc/core/Makefile b/drivers/mmc/core/Makefile index 5977abf3e41b..1075b02ae754 100644 --- a/drivers/mmc/core/Makefile +++ b/drivers/mmc/core/Makefile | |||
@@ -7,5 +7,5 @@ ifeq ($(CONFIG_MMC_DEBUG),y) | |||
7 | endif | 7 | endif |
8 | 8 | ||
9 | obj-$(CONFIG_MMC) += mmc_core.o | 9 | obj-$(CONFIG_MMC) += mmc_core.o |
10 | mmc_core-y := core.o sysfs.o mmc_ops.o sd_ops.o | 10 | mmc_core-y := core.o sysfs.o mmc.o mmc_ops.o sd.o sd_ops.o |
11 | 11 | ||
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 310be2fe1944..75333a2461df 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
@@ -32,36 +32,8 @@ | |||
32 | #include "mmc_ops.h" | 32 | #include "mmc_ops.h" |
33 | #include "sd_ops.h" | 33 | #include "sd_ops.h" |
34 | 34 | ||
35 | #define CMD_RETRIES 3 | 35 | extern int mmc_attach_mmc(struct mmc_host *host, u32 ocr); |
36 | 36 | extern int mmc_attach_sd(struct mmc_host *host, u32 ocr); | |
37 | /* | ||
38 | * OCR Bit positions to 10s of Vdd mV. | ||
39 | */ | ||
40 | static const unsigned short mmc_ocr_bit_to_vdd[] = { | ||
41 | 150, 155, 160, 165, 170, 180, 190, 200, | ||
42 | 210, 220, 230, 240, 250, 260, 270, 280, | ||
43 | 290, 300, 310, 320, 330, 340, 350, 360 | ||
44 | }; | ||
45 | |||
46 | static const unsigned int tran_exp[] = { | ||
47 | 10000, 100000, 1000000, 10000000, | ||
48 | 0, 0, 0, 0 | ||
49 | }; | ||
50 | |||
51 | static const unsigned char tran_mant[] = { | ||
52 | 0, 10, 12, 13, 15, 20, 25, 30, | ||
53 | 35, 40, 45, 50, 55, 60, 70, 80, | ||
54 | }; | ||
55 | |||
56 | static const unsigned int tacc_exp[] = { | ||
57 | 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, | ||
58 | }; | ||
59 | |||
60 | static const unsigned int tacc_mant[] = { | ||
61 | 0, 10, 12, 13, 15, 20, 25, 30, | ||
62 | 35, 40, 45, 50, 55, 60, 70, 80, | ||
63 | }; | ||
64 | |||
65 | 37 | ||
66 | /** | 38 | /** |
67 | * mmc_request_done - finish processing an MMC request | 39 | * mmc_request_done - finish processing an MMC request |
@@ -303,6 +275,10 @@ void mmc_release_host(struct mmc_host *host) | |||
303 | 275 | ||
304 | EXPORT_SYMBOL(mmc_release_host); | 276 | EXPORT_SYMBOL(mmc_release_host); |
305 | 277 | ||
278 | /* | ||
279 | * Internal function that does the actual ios call to the host driver, | ||
280 | * optionally printing some debug output. | ||
281 | */ | ||
306 | static inline void mmc_set_ios(struct mmc_host *host) | 282 | static inline void mmc_set_ios(struct mmc_host *host) |
307 | { | 283 | { |
308 | struct mmc_ios *ios = &host->ios; | 284 | struct mmc_ios *ios = &host->ios; |
@@ -316,6 +292,9 @@ static inline void mmc_set_ios(struct mmc_host *host) | |||
316 | host->ops->set_ios(host, ios); | 292 | host->ops->set_ios(host, ios); |
317 | } | 293 | } |
318 | 294 | ||
295 | /* | ||
296 | * Control chip select pin on a host. | ||
297 | */ | ||
319 | void mmc_set_chip_select(struct mmc_host *host, int mode) | 298 | void mmc_set_chip_select(struct mmc_host *host, int mode) |
320 | { | 299 | { |
321 | host->ios.chip_select = mode; | 300 | host->ios.chip_select = mode; |
@@ -323,10 +302,43 @@ void mmc_set_chip_select(struct mmc_host *host, int mode) | |||
323 | } | 302 | } |
324 | 303 | ||
325 | /* | 304 | /* |
305 | * Sets the host clock to the highest possible frequency that | ||
306 | * is below "hz". | ||
307 | */ | ||
308 | void mmc_set_clock(struct mmc_host *host, unsigned int hz) | ||
309 | { | ||
310 | WARN_ON(hz < host->f_min); | ||
311 | |||
312 | if (hz > host->f_max) | ||
313 | hz = host->f_max; | ||
314 | |||
315 | host->ios.clock = hz; | ||
316 | mmc_set_ios(host); | ||
317 | } | ||
318 | |||
319 | /* | ||
320 | * Change the bus mode (open drain/push-pull) of a host. | ||
321 | */ | ||
322 | void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode) | ||
323 | { | ||
324 | host->ios.bus_mode = mode; | ||
325 | mmc_set_ios(host); | ||
326 | } | ||
327 | |||
328 | /* | ||
329 | * Change data bus width of a host. | ||
330 | */ | ||
331 | void mmc_set_bus_width(struct mmc_host *host, unsigned int width) | ||
332 | { | ||
333 | host->ios.bus_width = width; | ||
334 | mmc_set_ios(host); | ||
335 | } | ||
336 | |||
337 | /* | ||
326 | * Mask off any voltages we don't support and select | 338 | * Mask off any voltages we don't support and select |
327 | * the lowest voltage | 339 | * the lowest voltage |
328 | */ | 340 | */ |
329 | static u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) | 341 | u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) |
330 | { | 342 | { |
331 | int bit; | 343 | int bit; |
332 | 344 | ||
@@ -347,235 +359,19 @@ static u32 mmc_select_voltage(struct mmc_host *host, u32 ocr) | |||
347 | return ocr; | 359 | return ocr; |
348 | } | 360 | } |
349 | 361 | ||
350 | #define UNSTUFF_BITS(resp,start,size) \ | ||
351 | ({ \ | ||
352 | const int __size = size; \ | ||
353 | const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \ | ||
354 | const int __off = 3 - ((start) / 32); \ | ||
355 | const int __shft = (start) & 31; \ | ||
356 | u32 __res; \ | ||
357 | \ | ||
358 | __res = resp[__off] >> __shft; \ | ||
359 | if (__size + __shft > 32) \ | ||
360 | __res |= resp[__off-1] << ((32 - __shft) % 32); \ | ||
361 | __res & __mask; \ | ||
362 | }) | ||
363 | |||
364 | /* | ||
365 | * Given the decoded CSD structure, decode the raw CID to our CID structure. | ||
366 | */ | ||
367 | static void mmc_decode_cid(struct mmc_card *card) | ||
368 | { | ||
369 | u32 *resp = card->raw_cid; | ||
370 | |||
371 | memset(&card->cid, 0, sizeof(struct mmc_cid)); | ||
372 | |||
373 | if (mmc_card_sd(card)) { | ||
374 | /* | ||
375 | * SD doesn't currently have a version field so we will | ||
376 | * have to assume we can parse this. | ||
377 | */ | ||
378 | card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); | ||
379 | card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); | ||
380 | card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); | ||
381 | card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); | ||
382 | card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); | ||
383 | card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); | ||
384 | card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); | ||
385 | card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4); | ||
386 | card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4); | ||
387 | card->cid.serial = UNSTUFF_BITS(resp, 24, 32); | ||
388 | card->cid.year = UNSTUFF_BITS(resp, 12, 8); | ||
389 | card->cid.month = UNSTUFF_BITS(resp, 8, 4); | ||
390 | |||
391 | card->cid.year += 2000; /* SD cards year offset */ | ||
392 | } else { | ||
393 | /* | ||
394 | * The selection of the format here is based upon published | ||
395 | * specs from sandisk and from what people have reported. | ||
396 | */ | ||
397 | switch (card->csd.mmca_vsn) { | ||
398 | case 0: /* MMC v1.0 - v1.2 */ | ||
399 | case 1: /* MMC v1.4 */ | ||
400 | card->cid.manfid = UNSTUFF_BITS(resp, 104, 24); | ||
401 | card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); | ||
402 | card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); | ||
403 | card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); | ||
404 | card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); | ||
405 | card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); | ||
406 | card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); | ||
407 | card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8); | ||
408 | card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4); | ||
409 | card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4); | ||
410 | card->cid.serial = UNSTUFF_BITS(resp, 16, 24); | ||
411 | card->cid.month = UNSTUFF_BITS(resp, 12, 4); | ||
412 | card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; | ||
413 | break; | ||
414 | |||
415 | case 2: /* MMC v2.0 - v2.2 */ | ||
416 | case 3: /* MMC v3.1 - v3.3 */ | ||
417 | case 4: /* MMC v4 */ | ||
418 | card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); | ||
419 | card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); | ||
420 | card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); | ||
421 | card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); | ||
422 | card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); | ||
423 | card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); | ||
424 | card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); | ||
425 | card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); | ||
426 | card->cid.serial = UNSTUFF_BITS(resp, 16, 32); | ||
427 | card->cid.month = UNSTUFF_BITS(resp, 12, 4); | ||
428 | card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; | ||
429 | break; | ||
430 | |||
431 | default: | ||
432 | printk("%s: card has unknown MMCA version %d\n", | ||
433 | mmc_hostname(card->host), card->csd.mmca_vsn); | ||
434 | mmc_card_set_bad(card); | ||
435 | break; | ||
436 | } | ||
437 | } | ||
438 | } | ||
439 | |||
440 | /* | ||
441 | * Given a 128-bit response, decode to our card CSD structure. | ||
442 | */ | ||
443 | static void mmc_decode_csd(struct mmc_card *card) | ||
444 | { | ||
445 | struct mmc_csd *csd = &card->csd; | ||
446 | unsigned int e, m, csd_struct; | ||
447 | u32 *resp = card->raw_csd; | ||
448 | |||
449 | if (mmc_card_sd(card)) { | ||
450 | csd_struct = UNSTUFF_BITS(resp, 126, 2); | ||
451 | |||
452 | switch (csd_struct) { | ||
453 | case 0: | ||
454 | m = UNSTUFF_BITS(resp, 115, 4); | ||
455 | e = UNSTUFF_BITS(resp, 112, 3); | ||
456 | csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; | ||
457 | csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; | ||
458 | |||
459 | m = UNSTUFF_BITS(resp, 99, 4); | ||
460 | e = UNSTUFF_BITS(resp, 96, 3); | ||
461 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
462 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
463 | |||
464 | e = UNSTUFF_BITS(resp, 47, 3); | ||
465 | m = UNSTUFF_BITS(resp, 62, 12); | ||
466 | csd->capacity = (1 + m) << (e + 2); | ||
467 | |||
468 | csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); | ||
469 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | ||
470 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | ||
471 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | ||
472 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
473 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | ||
474 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | ||
475 | break; | ||
476 | case 1: | ||
477 | /* | ||
478 | * This is a block-addressed SDHC card. Most | ||
479 | * interesting fields are unused and have fixed | ||
480 | * values. To avoid getting tripped by buggy cards, | ||
481 | * we assume those fixed values ourselves. | ||
482 | */ | ||
483 | mmc_card_set_blockaddr(card); | ||
484 | |||
485 | csd->tacc_ns = 0; /* Unused */ | ||
486 | csd->tacc_clks = 0; /* Unused */ | ||
487 | |||
488 | m = UNSTUFF_BITS(resp, 99, 4); | ||
489 | e = UNSTUFF_BITS(resp, 96, 3); | ||
490 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
491 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
492 | |||
493 | m = UNSTUFF_BITS(resp, 48, 22); | ||
494 | csd->capacity = (1 + m) << 10; | ||
495 | |||
496 | csd->read_blkbits = 9; | ||
497 | csd->read_partial = 0; | ||
498 | csd->write_misalign = 0; | ||
499 | csd->read_misalign = 0; | ||
500 | csd->r2w_factor = 4; /* Unused */ | ||
501 | csd->write_blkbits = 9; | ||
502 | csd->write_partial = 0; | ||
503 | break; | ||
504 | default: | ||
505 | printk("%s: unrecognised CSD structure version %d\n", | ||
506 | mmc_hostname(card->host), csd_struct); | ||
507 | mmc_card_set_bad(card); | ||
508 | return; | ||
509 | } | ||
510 | } else { | ||
511 | /* | ||
512 | * We only understand CSD structure v1.1 and v1.2. | ||
513 | * v1.2 has extra information in bits 15, 11 and 10. | ||
514 | */ | ||
515 | csd_struct = UNSTUFF_BITS(resp, 126, 2); | ||
516 | if (csd_struct != 1 && csd_struct != 2) { | ||
517 | printk("%s: unrecognised CSD structure version %d\n", | ||
518 | mmc_hostname(card->host), csd_struct); | ||
519 | mmc_card_set_bad(card); | ||
520 | return; | ||
521 | } | ||
522 | |||
523 | csd->mmca_vsn = UNSTUFF_BITS(resp, 122, 4); | ||
524 | m = UNSTUFF_BITS(resp, 115, 4); | ||
525 | e = UNSTUFF_BITS(resp, 112, 3); | ||
526 | csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; | ||
527 | csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; | ||
528 | |||
529 | m = UNSTUFF_BITS(resp, 99, 4); | ||
530 | e = UNSTUFF_BITS(resp, 96, 3); | ||
531 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
532 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
533 | |||
534 | e = UNSTUFF_BITS(resp, 47, 3); | ||
535 | m = UNSTUFF_BITS(resp, 62, 12); | ||
536 | csd->capacity = (1 + m) << (e + 2); | ||
537 | |||
538 | csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); | ||
539 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | ||
540 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | ||
541 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | ||
542 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
543 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | ||
544 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | ||
545 | } | ||
546 | } | ||
547 | |||
548 | /* | 362 | /* |
549 | * Given a 64-bit response, decode to our card SCR structure. | 363 | * Select timing parameters for host. |
550 | */ | 364 | */ |
551 | static void mmc_decode_scr(struct mmc_card *card) | 365 | void mmc_set_timing(struct mmc_host *host, unsigned int timing) |
552 | { | 366 | { |
553 | struct sd_scr *scr = &card->scr; | 367 | host->ios.timing = timing; |
554 | unsigned int scr_struct; | 368 | mmc_set_ios(host); |
555 | u32 resp[4]; | ||
556 | |||
557 | BUG_ON(!mmc_card_sd(card)); | ||
558 | |||
559 | resp[3] = card->raw_scr[1]; | ||
560 | resp[2] = card->raw_scr[0]; | ||
561 | |||
562 | scr_struct = UNSTUFF_BITS(resp, 60, 4); | ||
563 | if (scr_struct != 0) { | ||
564 | printk("%s: unrecognised SCR structure version %d\n", | ||
565 | mmc_hostname(card->host), scr_struct); | ||
566 | mmc_card_set_bad(card); | ||
567 | return; | ||
568 | } | ||
569 | |||
570 | scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4); | ||
571 | scr->bus_widths = UNSTUFF_BITS(resp, 48, 4); | ||
572 | } | 369 | } |
573 | 370 | ||
574 | /* | 371 | /* |
575 | * Allocate a new MMC card | 372 | * Allocate a new MMC card |
576 | */ | 373 | */ |
577 | static struct mmc_card * | 374 | struct mmc_card *mmc_alloc_card(struct mmc_host *host) |
578 | mmc_alloc_card(struct mmc_host *host, u32 *raw_cid) | ||
579 | { | 375 | { |
580 | struct mmc_card *card; | 376 | struct mmc_card *card; |
581 | 377 | ||
@@ -584,7 +380,6 @@ mmc_alloc_card(struct mmc_host *host, u32 *raw_cid) | |||
584 | return ERR_PTR(-ENOMEM); | 380 | return ERR_PTR(-ENOMEM); |
585 | 381 | ||
586 | mmc_init_card(card, host); | 382 | mmc_init_card(card, host); |
587 | memcpy(card->raw_cid, raw_cid, sizeof(card->raw_cid)); | ||
588 | 383 | ||
589 | return card; | 384 | return card; |
590 | } | 385 | } |
@@ -634,406 +429,66 @@ static void mmc_power_off(struct mmc_host *host) | |||
634 | } | 429 | } |
635 | 430 | ||
636 | /* | 431 | /* |
637 | * Discover the card by requesting its CID. | 432 | * Assign a mmc bus handler to a host. Only one bus handler may control a |
638 | * | 433 | * host at any given time. |
639 | * Create a mmc_card entry for the discovered card, assigning | ||
640 | * it an RCA, and save the raw CID for decoding later. | ||
641 | */ | 434 | */ |
642 | static void mmc_discover_card(struct mmc_host *host) | 435 | void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops) |
643 | { | 436 | { |
644 | unsigned int err; | 437 | unsigned long flags; |
645 | u32 cid[4]; | ||
646 | |||
647 | BUG_ON(host->card); | ||
648 | |||
649 | err = mmc_all_send_cid(host, cid); | ||
650 | if (err != MMC_ERR_NONE) { | ||
651 | printk(KERN_ERR "%s: error requesting CID: %d\n", | ||
652 | mmc_hostname(host), err); | ||
653 | return; | ||
654 | } | ||
655 | |||
656 | host->card = mmc_alloc_card(host, cid); | ||
657 | if (IS_ERR(host->card)) { | ||
658 | err = PTR_ERR(host->card); | ||
659 | host->card = NULL; | ||
660 | return; | ||
661 | } | ||
662 | |||
663 | if (host->mode == MMC_MODE_SD) { | ||
664 | host->card->type = MMC_TYPE_SD; | ||
665 | |||
666 | err = mmc_send_relative_addr(host, &host->card->rca); | ||
667 | if (err != MMC_ERR_NONE) | ||
668 | mmc_card_set_dead(host->card); | ||
669 | else { | ||
670 | if (!host->ops->get_ro) { | ||
671 | printk(KERN_WARNING "%s: host does not " | ||
672 | "support reading read-only " | ||
673 | "switch. assuming write-enable.\n", | ||
674 | mmc_hostname(host)); | ||
675 | } else { | ||
676 | if (host->ops->get_ro(host)) | ||
677 | mmc_card_set_readonly(host->card); | ||
678 | } | ||
679 | } | ||
680 | } else { | ||
681 | host->card->type = MMC_TYPE_MMC; | ||
682 | host->card->rca = 1; | ||
683 | |||
684 | err = mmc_set_relative_addr(host->card); | ||
685 | if (err != MMC_ERR_NONE) | ||
686 | mmc_card_set_dead(host->card); | ||
687 | } | ||
688 | } | ||
689 | |||
690 | static void mmc_read_csd(struct mmc_host *host) | ||
691 | { | ||
692 | int err; | ||
693 | |||
694 | if (!host->card) | ||
695 | return; | ||
696 | if (mmc_card_dead(host->card)) | ||
697 | return; | ||
698 | |||
699 | err = mmc_send_csd(host->card, host->card->raw_csd); | ||
700 | if (err != MMC_ERR_NONE) { | ||
701 | mmc_card_set_dead(host->card); | ||
702 | return; | ||
703 | } | ||
704 | |||
705 | mmc_decode_csd(host->card); | ||
706 | mmc_decode_cid(host->card); | ||
707 | } | ||
708 | |||
709 | static void mmc_process_ext_csd(struct mmc_host *host) | ||
710 | { | ||
711 | int err; | ||
712 | u8 *ext_csd; | ||
713 | |||
714 | if (!host->card) | ||
715 | return; | ||
716 | if (mmc_card_dead(host->card)) | ||
717 | return; | ||
718 | if (mmc_card_sd(host->card)) | ||
719 | return; | ||
720 | if (host->card->csd.mmca_vsn < CSD_SPEC_VER_4) | ||
721 | return; | ||
722 | |||
723 | /* | ||
724 | * As the ext_csd is so large and mostly unused, we don't store the | ||
725 | * raw block in mmc_card. | ||
726 | */ | ||
727 | ext_csd = kmalloc(512, GFP_KERNEL); | ||
728 | if (!ext_csd) { | ||
729 | printk("%s: could not allocate a buffer to receive the ext_csd." | ||
730 | "mmc v4 cards will be treated as v3.\n", | ||
731 | mmc_hostname(host)); | ||
732 | return; | ||
733 | } | ||
734 | |||
735 | err = mmc_send_ext_csd(host->card, ext_csd); | ||
736 | if (err != MMC_ERR_NONE) { | ||
737 | if (host->card->csd.capacity == (4096 * 512)) { | ||
738 | printk(KERN_ERR "%s: unable to read EXT_CSD " | ||
739 | "on a possible high capacity card. " | ||
740 | "Card will be ignored.\n", | ||
741 | mmc_hostname(host)); | ||
742 | mmc_card_set_dead(host->card); | ||
743 | } else { | ||
744 | printk(KERN_WARNING "%s: unable to read " | ||
745 | "EXT_CSD, performance might " | ||
746 | "suffer.\n", | ||
747 | mmc_hostname(host)); | ||
748 | } | ||
749 | goto out; | ||
750 | } | ||
751 | |||
752 | host->card->ext_csd.sectors = | ||
753 | ext_csd[EXT_CSD_SEC_CNT + 0] << 0 | | ||
754 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8 | | ||
755 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16 | | ||
756 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24; | ||
757 | if (host->card->ext_csd.sectors) | ||
758 | mmc_card_set_blockaddr(host->card); | ||
759 | |||
760 | switch (ext_csd[EXT_CSD_CARD_TYPE]) { | ||
761 | case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: | ||
762 | host->card->ext_csd.hs_max_dtr = 52000000; | ||
763 | break; | ||
764 | case EXT_CSD_CARD_TYPE_26: | ||
765 | host->card->ext_csd.hs_max_dtr = 26000000; | ||
766 | break; | ||
767 | default: | ||
768 | /* MMC v4 spec says this cannot happen */ | ||
769 | printk("%s: card is mmc v4 but doesn't support " | ||
770 | "any high-speed modes.\n", | ||
771 | mmc_hostname(host)); | ||
772 | goto out; | ||
773 | } | ||
774 | |||
775 | if (host->caps & MMC_CAP_MMC_HIGHSPEED) { | ||
776 | /* Activate highspeed support. */ | ||
777 | err = mmc_switch(host->card, MMC_SWITCH_MODE_WRITE_BYTE, | ||
778 | EXT_CSD_HS_TIMING, 1); | ||
779 | if (err != MMC_ERR_NONE) { | ||
780 | printk("%s: failed to switch card to mmc v4 " | ||
781 | "high-speed mode.\n", | ||
782 | mmc_hostname(host)); | ||
783 | goto out; | ||
784 | } | ||
785 | |||
786 | mmc_card_set_highspeed(host->card); | ||
787 | |||
788 | host->ios.timing = MMC_TIMING_MMC_HS; | ||
789 | mmc_set_ios(host); | ||
790 | } | ||
791 | 438 | ||
792 | /* Check for host support for wide-bus modes. */ | 439 | BUG_ON(!host); |
793 | if (host->caps & MMC_CAP_4_BIT_DATA) { | 440 | BUG_ON(!ops); |
794 | /* Activate 4-bit support. */ | ||
795 | err = mmc_switch(host->card, MMC_SWITCH_MODE_WRITE_BYTE, | ||
796 | EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_4 | | ||
797 | EXT_CSD_CMD_SET_NORMAL); | ||
798 | if (err != MMC_ERR_NONE) { | ||
799 | printk("%s: failed to switch card to " | ||
800 | "mmc v4 4-bit bus mode.\n", | ||
801 | mmc_hostname(host)); | ||
802 | goto out; | ||
803 | } | ||
804 | 441 | ||
805 | host->ios.bus_width = MMC_BUS_WIDTH_4; | 442 | BUG_ON(!host->claimed); |
806 | mmc_set_ios(host); | ||
807 | } | ||
808 | 443 | ||
809 | out: | 444 | spin_lock_irqsave(&host->lock, flags); |
810 | kfree(ext_csd); | ||
811 | } | ||
812 | 445 | ||
813 | static void mmc_read_scr(struct mmc_host *host) | 446 | BUG_ON(host->bus_ops); |
814 | { | 447 | BUG_ON(host->bus_refs); |
815 | int err; | ||
816 | 448 | ||
817 | if (!host->card) | 449 | host->bus_ops = ops; |
818 | return; | 450 | host->bus_refs = 1; |
819 | if (mmc_card_dead(host->card)) | 451 | host->bus_dead = 0; |
820 | return; | ||
821 | if (!mmc_card_sd(host->card)) | ||
822 | return; | ||
823 | |||
824 | err = mmc_app_send_scr(host->card, host->card->raw_scr); | ||
825 | if (err != MMC_ERR_NONE) { | ||
826 | mmc_card_set_dead(host->card); | ||
827 | return; | ||
828 | } | ||
829 | 452 | ||
830 | mmc_decode_scr(host->card); | 453 | spin_unlock_irqrestore(&host->lock, flags); |
831 | } | 454 | } |
832 | 455 | ||
833 | static void mmc_read_switch_caps(struct mmc_host *host) | 456 | /* |
457 | * Remove the current bus handler from a host. Assumes that there are | ||
458 | * no interesting cards left, so the bus is powered down. | ||
459 | */ | ||
460 | void mmc_detach_bus(struct mmc_host *host) | ||
834 | { | 461 | { |
835 | int err; | 462 | unsigned long flags; |
836 | unsigned char *status; | ||
837 | |||
838 | if (!(host->caps & MMC_CAP_SD_HIGHSPEED)) | ||
839 | return; | ||
840 | |||
841 | if (!host->card) | ||
842 | return; | ||
843 | if (mmc_card_dead(host->card)) | ||
844 | return; | ||
845 | if (!mmc_card_sd(host->card)) | ||
846 | return; | ||
847 | if (host->card->scr.sda_vsn < SCR_SPEC_VER_1) | ||
848 | return; | ||
849 | |||
850 | status = kmalloc(64, GFP_KERNEL); | ||
851 | if (!status) { | ||
852 | printk(KERN_WARNING "%s: Unable to allocate buffer for " | ||
853 | "reading switch capabilities.\n", | ||
854 | mmc_hostname(host)); | ||
855 | return; | ||
856 | } | ||
857 | |||
858 | err = mmc_sd_switch(host->card, SD_SWITCH_CHECK, | ||
859 | SD_SWITCH_GRP_ACCESS, SD_SWITCH_ACCESS_HS, status); | ||
860 | if (err != MMC_ERR_NONE) { | ||
861 | printk("%s: unable to read switch capabilities, " | ||
862 | "performance might suffer.\n", | ||
863 | mmc_hostname(host)); | ||
864 | goto out; | ||
865 | } | ||
866 | |||
867 | if (status[13] & 0x02) | ||
868 | host->card->sw_caps.hs_max_dtr = 50000000; | ||
869 | 463 | ||
870 | err = mmc_sd_switch(host->card, SD_SWITCH_SET, | 464 | BUG_ON(!host); |
871 | SD_SWITCH_GRP_ACCESS, SD_SWITCH_ACCESS_HS, status); | ||
872 | if (err != MMC_ERR_NONE || (status[16] & 0xF) != 1) { | ||
873 | printk(KERN_WARNING "%s: Problem switching card " | ||
874 | "into high-speed mode!\n", | ||
875 | mmc_hostname(host)); | ||
876 | goto out; | ||
877 | } | ||
878 | 465 | ||
879 | mmc_card_set_highspeed(host->card); | 466 | BUG_ON(!host->claimed); |
467 | BUG_ON(!host->bus_ops); | ||
880 | 468 | ||
881 | host->ios.timing = MMC_TIMING_SD_HS; | 469 | spin_lock_irqsave(&host->lock, flags); |
882 | mmc_set_ios(host); | ||
883 | 470 | ||
884 | out: | 471 | host->bus_dead = 1; |
885 | kfree(status); | ||
886 | } | ||
887 | 472 | ||
888 | static unsigned int mmc_calculate_clock(struct mmc_host *host) | 473 | spin_unlock_irqrestore(&host->lock, flags); |
889 | { | ||
890 | unsigned int max_dtr = host->f_max; | ||
891 | |||
892 | if (host->card && !mmc_card_dead(host->card)) { | ||
893 | if (mmc_card_highspeed(host->card) && mmc_card_sd(host->card)) { | ||
894 | if (max_dtr > host->card->sw_caps.hs_max_dtr) | ||
895 | max_dtr = host->card->sw_caps.hs_max_dtr; | ||
896 | } else if (mmc_card_highspeed(host->card) && !mmc_card_sd(host->card)) { | ||
897 | if (max_dtr > host->card->ext_csd.hs_max_dtr) | ||
898 | max_dtr = host->card->ext_csd.hs_max_dtr; | ||
899 | } else if (max_dtr > host->card->csd.max_dtr) { | ||
900 | max_dtr = host->card->csd.max_dtr; | ||
901 | } | ||
902 | } | ||
903 | 474 | ||
904 | pr_debug("%s: selected %d.%03dMHz transfer rate\n", | 475 | mmc_power_off(host); |
905 | mmc_hostname(host), | ||
906 | max_dtr / 1000000, (max_dtr / 1000) % 1000); | ||
907 | 476 | ||
908 | return max_dtr; | 477 | mmc_bus_put(host); |
909 | } | 478 | } |
910 | 479 | ||
911 | /* | 480 | /* |
912 | * Check whether cards we already know about are still present. | 481 | * Cleanup when the last reference to the bus operator is dropped. |
913 | * We do this by requesting status, and checking whether a card | ||
914 | * responds. | ||
915 | * | ||
916 | * A request for status does not cause a state change in data | ||
917 | * transfer mode. | ||
918 | */ | 482 | */ |
919 | static void mmc_check_card(struct mmc_card *card) | 483 | void __mmc_release_bus(struct mmc_host *host) |
920 | { | 484 | { |
921 | int err; | 485 | BUG_ON(!host); |
922 | 486 | BUG_ON(host->bus_refs); | |
923 | BUG_ON(!card); | 487 | BUG_ON(!host->bus_dead); |
924 | 488 | ||
925 | err = mmc_send_status(card, NULL); | 489 | host->bus_ops = NULL; |
926 | if (err == MMC_ERR_NONE) | ||
927 | return; | ||
928 | |||
929 | mmc_card_set_dead(card); | ||
930 | } | 490 | } |
931 | 491 | ||
932 | static void mmc_setup(struct mmc_host *host) | ||
933 | { | ||
934 | int err; | ||
935 | u32 ocr; | ||
936 | |||
937 | host->mode = MMC_MODE_SD; | ||
938 | |||
939 | mmc_power_up(host); | ||
940 | mmc_go_idle(host); | ||
941 | |||
942 | err = mmc_send_if_cond(host, host->ocr_avail); | ||
943 | if (err != MMC_ERR_NONE) { | ||
944 | return; | ||
945 | } | ||
946 | err = mmc_send_app_op_cond(host, 0, &ocr); | ||
947 | |||
948 | /* | ||
949 | * If we fail to detect any SD cards then try | ||
950 | * searching for MMC cards. | ||
951 | */ | ||
952 | if (err != MMC_ERR_NONE) { | ||
953 | host->mode = MMC_MODE_MMC; | ||
954 | |||
955 | err = mmc_send_op_cond(host, 0, &ocr); | ||
956 | if (err != MMC_ERR_NONE) | ||
957 | return; | ||
958 | } | ||
959 | |||
960 | host->ocr = mmc_select_voltage(host, ocr); | ||
961 | |||
962 | if (host->ocr == 0) | ||
963 | return; | ||
964 | |||
965 | /* | ||
966 | * Since we're changing the OCR value, we seem to | ||
967 | * need to tell some cards to go back to the idle | ||
968 | * state. We wait 1ms to give cards time to | ||
969 | * respond. | ||
970 | */ | ||
971 | mmc_go_idle(host); | ||
972 | |||
973 | /* | ||
974 | * Send the selected OCR multiple times... until the cards | ||
975 | * all get the idea that they should be ready for CMD2. | ||
976 | * (My SanDisk card seems to need this.) | ||
977 | */ | ||
978 | if (host->mode == MMC_MODE_SD) { | ||
979 | /* | ||
980 | * If SD_SEND_IF_COND indicates an SD 2.0 | ||
981 | * compliant card and we should set bit 30 | ||
982 | * of the ocr to indicate that we can handle | ||
983 | * block-addressed SDHC cards. | ||
984 | */ | ||
985 | err = mmc_send_if_cond(host, host->ocr); | ||
986 | if (err == MMC_ERR_NONE) | ||
987 | ocr = host->ocr | (1 << 30); | ||
988 | |||
989 | mmc_send_app_op_cond(host, ocr, NULL); | ||
990 | } else { | ||
991 | /* The extra bit indicates that we support high capacity */ | ||
992 | mmc_send_op_cond(host, host->ocr | (1 << 30), NULL); | ||
993 | } | ||
994 | |||
995 | mmc_discover_card(host); | ||
996 | |||
997 | /* | ||
998 | * Ok, now switch to push-pull mode. | ||
999 | */ | ||
1000 | host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; | ||
1001 | mmc_set_ios(host); | ||
1002 | |||
1003 | mmc_read_csd(host); | ||
1004 | |||
1005 | if (host->card && !mmc_card_dead(host->card)) { | ||
1006 | err = mmc_select_card(host->card); | ||
1007 | if (err != MMC_ERR_NONE) | ||
1008 | mmc_card_set_dead(host->card); | ||
1009 | } | ||
1010 | |||
1011 | /* | ||
1012 | * The card is in 1 bit mode by default so | ||
1013 | * we only need to change if it supports the | ||
1014 | * wider version. | ||
1015 | */ | ||
1016 | if (host->card && !mmc_card_dead(host->card) && | ||
1017 | mmc_card_sd(host->card) && | ||
1018 | (host->card->scr.bus_widths & SD_SCR_BUS_WIDTH_4) && | ||
1019 | (host->card->host->caps & MMC_CAP_4_BIT_DATA)) { | ||
1020 | err = mmc_app_set_bus_width(host->card, SD_BUS_WIDTH_4); | ||
1021 | if (err != MMC_ERR_NONE) | ||
1022 | mmc_card_set_dead(host->card); | ||
1023 | else { | ||
1024 | host->ios.bus_width = MMC_BUS_WIDTH_4; | ||
1025 | mmc_set_ios(host); | ||
1026 | } | ||
1027 | } | ||
1028 | |||
1029 | if (host->mode == MMC_MODE_SD) { | ||
1030 | mmc_read_scr(host); | ||
1031 | mmc_read_switch_caps(host); | ||
1032 | } else | ||
1033 | mmc_process_ext_csd(host); | ||
1034 | } | ||
1035 | |||
1036 | |||
1037 | /** | 492 | /** |
1038 | * mmc_detect_change - process change of state on a MMC socket | 493 | * mmc_detect_change - process change of state on a MMC socket |
1039 | * @host: host which changed state. | 494 | * @host: host which changed state. |
@@ -1060,62 +515,49 @@ static void mmc_rescan(struct work_struct *work) | |||
1060 | { | 515 | { |
1061 | struct mmc_host *host = | 516 | struct mmc_host *host = |
1062 | container_of(work, struct mmc_host, detect.work); | 517 | container_of(work, struct mmc_host, detect.work); |
518 | u32 ocr; | ||
519 | int err; | ||
1063 | 520 | ||
1064 | mmc_claim_host(host); | 521 | mmc_bus_get(host); |
1065 | |||
1066 | /* | ||
1067 | * Check for removed card and newly inserted ones. We check for | ||
1068 | * removed cards first so we can intelligently re-select the VDD. | ||
1069 | */ | ||
1070 | if (host->card) { | ||
1071 | mmc_check_card(host->card); | ||
1072 | |||
1073 | mmc_release_host(host); | ||
1074 | |||
1075 | if (mmc_card_dead(host->card)) { | ||
1076 | mmc_remove_card(host->card); | ||
1077 | host->card = NULL; | ||
1078 | } | ||
1079 | |||
1080 | goto out; | ||
1081 | } | ||
1082 | |||
1083 | mmc_setup(host); | ||
1084 | 522 | ||
1085 | if (host->card && !mmc_card_dead(host->card)) { | 523 | if (host->bus_ops == NULL) { |
1086 | /* | 524 | /* |
1087 | * (Re-)calculate the fastest clock rate which the | 525 | * Only we can add a new handler, so it's safe to |
1088 | * attached cards and the host support. | 526 | * release the lock here. |
1089 | */ | 527 | */ |
1090 | host->ios.clock = mmc_calculate_clock(host); | 528 | mmc_bus_put(host); |
1091 | mmc_set_ios(host); | ||
1092 | } | ||
1093 | 529 | ||
1094 | mmc_release_host(host); | 530 | mmc_claim_host(host); |
1095 | 531 | ||
1096 | /* | 532 | mmc_power_up(host); |
1097 | * If this is a new and good card, register it. | 533 | mmc_go_idle(host); |
1098 | */ | ||
1099 | if (host->card && !mmc_card_dead(host->card)) { | ||
1100 | if (mmc_register_card(host->card)) | ||
1101 | mmc_card_set_dead(host->card); | ||
1102 | } | ||
1103 | 534 | ||
1104 | /* | 535 | mmc_send_if_cond(host, host->ocr_avail); |
1105 | * If this card is dead, destroy it. | ||
1106 | */ | ||
1107 | if (host->card && mmc_card_dead(host->card)) { | ||
1108 | mmc_remove_card(host->card); | ||
1109 | host->card = NULL; | ||
1110 | } | ||
1111 | 536 | ||
1112 | out: | 537 | err = mmc_send_app_op_cond(host, 0, &ocr); |
1113 | /* | 538 | if (err == MMC_ERR_NONE) { |
1114 | * If we discover that there are no cards on the | 539 | if (mmc_attach_sd(host, ocr)) |
1115 | * bus, turn off the clock and power down. | 540 | mmc_power_off(host); |
1116 | */ | 541 | } else { |
1117 | if (!host->card) | 542 | /* |
1118 | mmc_power_off(host); | 543 | * If we fail to detect any SD cards then try |
544 | * searching for MMC cards. | ||
545 | */ | ||
546 | err = mmc_send_op_cond(host, 0, &ocr); | ||
547 | if (err == MMC_ERR_NONE) { | ||
548 | if (mmc_attach_mmc(host, ocr)) | ||
549 | mmc_power_off(host); | ||
550 | } else { | ||
551 | mmc_power_off(host); | ||
552 | mmc_release_host(host); | ||
553 | } | ||
554 | } | ||
555 | } else { | ||
556 | if (host->bus_ops->detect && !host->bus_dead) | ||
557 | host->bus_ops->detect(host); | ||
558 | |||
559 | mmc_bus_put(host); | ||
560 | } | ||
1119 | } | 561 | } |
1120 | 562 | ||
1121 | 563 | ||
@@ -1190,10 +632,18 @@ void mmc_remove_host(struct mmc_host *host) | |||
1190 | 632 | ||
1191 | mmc_flush_scheduled_work(); | 633 | mmc_flush_scheduled_work(); |
1192 | 634 | ||
1193 | if (host->card) { | 635 | mmc_bus_get(host); |
1194 | mmc_remove_card(host->card); | 636 | if (host->bus_ops && !host->bus_dead) { |
1195 | host->card = NULL; | 637 | if (host->bus_ops->remove) |
638 | host->bus_ops->remove(host); | ||
639 | |||
640 | mmc_claim_host(host); | ||
641 | mmc_detach_bus(host); | ||
642 | mmc_release_host(host); | ||
1196 | } | 643 | } |
644 | mmc_bus_put(host); | ||
645 | |||
646 | BUG_ON(host->card); | ||
1197 | 647 | ||
1198 | mmc_power_off(host); | 648 | mmc_power_off(host); |
1199 | mmc_remove_host_sysfs(host); | 649 | mmc_remove_host_sysfs(host); |
@@ -1225,10 +675,15 @@ int mmc_suspend_host(struct mmc_host *host, pm_message_t state) | |||
1225 | { | 675 | { |
1226 | mmc_flush_scheduled_work(); | 676 | mmc_flush_scheduled_work(); |
1227 | 677 | ||
1228 | if (host->card) { | 678 | mmc_bus_get(host); |
1229 | mmc_remove_card(host->card); | 679 | if (host->bus_ops && !host->bus_dead) { |
1230 | host->card = NULL; | 680 | if (host->bus_ops->remove) |
681 | host->bus_ops->remove(host); | ||
682 | mmc_detach_bus(host); | ||
1231 | } | 683 | } |
684 | mmc_bus_put(host); | ||
685 | |||
686 | BUG_ON(host->card); | ||
1232 | 687 | ||
1233 | mmc_power_off(host); | 688 | mmc_power_off(host); |
1234 | 689 | ||
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h index 1c1066342fba..fad8edc38099 100644 --- a/drivers/mmc/core/core.h +++ b/drivers/mmc/core/core.h | |||
@@ -15,7 +15,44 @@ | |||
15 | 15 | ||
16 | #define MMC_CMD_RETRIES 3 | 16 | #define MMC_CMD_RETRIES 3 |
17 | 17 | ||
18 | struct mmc_bus_ops { | ||
19 | void (*remove)(struct mmc_host *); | ||
20 | void (*detect)(struct mmc_host *); | ||
21 | }; | ||
22 | |||
23 | void mmc_attach_bus(struct mmc_host *host, const struct mmc_bus_ops *ops); | ||
24 | void mmc_detach_bus(struct mmc_host *host); | ||
25 | |||
26 | void __mmc_release_bus(struct mmc_host *host); | ||
27 | |||
28 | static inline void mmc_bus_get(struct mmc_host *host) | ||
29 | { | ||
30 | unsigned long flags; | ||
31 | |||
32 | spin_lock_irqsave(&host->lock, flags); | ||
33 | host->bus_refs++; | ||
34 | spin_unlock_irqrestore(&host->lock, flags); | ||
35 | } | ||
36 | |||
37 | static inline void mmc_bus_put(struct mmc_host *host) | ||
38 | { | ||
39 | unsigned long flags; | ||
40 | |||
41 | spin_lock_irqsave(&host->lock, flags); | ||
42 | host->bus_refs--; | ||
43 | if ((host->bus_refs == 0) && host->bus_ops) | ||
44 | __mmc_release_bus(host); | ||
45 | spin_unlock_irqrestore(&host->lock, flags); | ||
46 | } | ||
47 | |||
18 | void mmc_set_chip_select(struct mmc_host *host, int mode); | 48 | void mmc_set_chip_select(struct mmc_host *host, int mode); |
49 | void mmc_set_clock(struct mmc_host *host, unsigned int hz); | ||
50 | void mmc_set_bus_mode(struct mmc_host *host, unsigned int mode); | ||
51 | void mmc_set_bus_width(struct mmc_host *host, unsigned int width); | ||
52 | u32 mmc_select_voltage(struct mmc_host *host, u32 ocr); | ||
53 | void mmc_set_timing(struct mmc_host *host, unsigned int timing); | ||
54 | |||
55 | struct mmc_card *mmc_alloc_card(struct mmc_host *host); | ||
19 | 56 | ||
20 | static inline void mmc_delay(unsigned int ms) | 57 | static inline void mmc_delay(unsigned int ms) |
21 | { | 58 | { |
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c new file mode 100644 index 000000000000..c528017d6128 --- /dev/null +++ b/drivers/mmc/core/mmc.c | |||
@@ -0,0 +1,430 @@ | |||
1 | /* | ||
2 | * linux/drivers/mmc/mmc.c | ||
3 | * | ||
4 | * Copyright (C) 2003-2004 Russell King, All Rights Reserved. | ||
5 | * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved. | ||
6 | * MMCv4 support Copyright (C) 2006 Philip Langdale, All Rights Reserved. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/err.h> | ||
14 | |||
15 | #include <linux/mmc/host.h> | ||
16 | #include <linux/mmc/card.h> | ||
17 | #include <linux/mmc/mmc.h> | ||
18 | |||
19 | #include "core.h" | ||
20 | #include "sysfs.h" | ||
21 | #include "mmc_ops.h" | ||
22 | |||
23 | static const unsigned int tran_exp[] = { | ||
24 | 10000, 100000, 1000000, 10000000, | ||
25 | 0, 0, 0, 0 | ||
26 | }; | ||
27 | |||
28 | static const unsigned char tran_mant[] = { | ||
29 | 0, 10, 12, 13, 15, 20, 25, 30, | ||
30 | 35, 40, 45, 50, 55, 60, 70, 80, | ||
31 | }; | ||
32 | |||
33 | static const unsigned int tacc_exp[] = { | ||
34 | 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, | ||
35 | }; | ||
36 | |||
37 | static const unsigned int tacc_mant[] = { | ||
38 | 0, 10, 12, 13, 15, 20, 25, 30, | ||
39 | 35, 40, 45, 50, 55, 60, 70, 80, | ||
40 | }; | ||
41 | |||
42 | #define UNSTUFF_BITS(resp,start,size) \ | ||
43 | ({ \ | ||
44 | const int __size = size; \ | ||
45 | const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \ | ||
46 | const int __off = 3 - ((start) / 32); \ | ||
47 | const int __shft = (start) & 31; \ | ||
48 | u32 __res; \ | ||
49 | \ | ||
50 | __res = resp[__off] >> __shft; \ | ||
51 | if (__size + __shft > 32) \ | ||
52 | __res |= resp[__off-1] << ((32 - __shft) % 32); \ | ||
53 | __res & __mask; \ | ||
54 | }) | ||
55 | |||
56 | /* | ||
57 | * Given the decoded CSD structure, decode the raw CID to our CID structure. | ||
58 | */ | ||
59 | static void mmc_decode_cid(struct mmc_card *card) | ||
60 | { | ||
61 | u32 *resp = card->raw_cid; | ||
62 | |||
63 | /* | ||
64 | * The selection of the format here is based upon published | ||
65 | * specs from sandisk and from what people have reported. | ||
66 | */ | ||
67 | switch (card->csd.mmca_vsn) { | ||
68 | case 0: /* MMC v1.0 - v1.2 */ | ||
69 | case 1: /* MMC v1.4 */ | ||
70 | card->cid.manfid = UNSTUFF_BITS(resp, 104, 24); | ||
71 | card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); | ||
72 | card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); | ||
73 | card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); | ||
74 | card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); | ||
75 | card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); | ||
76 | card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); | ||
77 | card->cid.prod_name[6] = UNSTUFF_BITS(resp, 48, 8); | ||
78 | card->cid.hwrev = UNSTUFF_BITS(resp, 44, 4); | ||
79 | card->cid.fwrev = UNSTUFF_BITS(resp, 40, 4); | ||
80 | card->cid.serial = UNSTUFF_BITS(resp, 16, 24); | ||
81 | card->cid.month = UNSTUFF_BITS(resp, 12, 4); | ||
82 | card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; | ||
83 | break; | ||
84 | |||
85 | case 2: /* MMC v2.0 - v2.2 */ | ||
86 | case 3: /* MMC v3.1 - v3.3 */ | ||
87 | case 4: /* MMC v4 */ | ||
88 | card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); | ||
89 | card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); | ||
90 | card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); | ||
91 | card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); | ||
92 | card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); | ||
93 | card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); | ||
94 | card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); | ||
95 | card->cid.prod_name[5] = UNSTUFF_BITS(resp, 56, 8); | ||
96 | card->cid.serial = UNSTUFF_BITS(resp, 16, 32); | ||
97 | card->cid.month = UNSTUFF_BITS(resp, 12, 4); | ||
98 | card->cid.year = UNSTUFF_BITS(resp, 8, 4) + 1997; | ||
99 | break; | ||
100 | |||
101 | default: | ||
102 | printk("%s: card has unknown MMCA version %d\n", | ||
103 | mmc_hostname(card->host), card->csd.mmca_vsn); | ||
104 | mmc_card_set_bad(card); | ||
105 | break; | ||
106 | } | ||
107 | } | ||
108 | |||
109 | /* | ||
110 | * Given a 128-bit response, decode to our card CSD structure. | ||
111 | */ | ||
112 | static void mmc_decode_csd(struct mmc_card *card) | ||
113 | { | ||
114 | struct mmc_csd *csd = &card->csd; | ||
115 | unsigned int e, m, csd_struct; | ||
116 | u32 *resp = card->raw_csd; | ||
117 | |||
118 | /* | ||
119 | * We only understand CSD structure v1.1 and v1.2. | ||
120 | * v1.2 has extra information in bits 15, 11 and 10. | ||
121 | */ | ||
122 | csd_struct = UNSTUFF_BITS(resp, 126, 2); | ||
123 | if (csd_struct != 1 && csd_struct != 2) { | ||
124 | printk("%s: unrecognised CSD structure version %d\n", | ||
125 | mmc_hostname(card->host), csd_struct); | ||
126 | mmc_card_set_bad(card); | ||
127 | return; | ||
128 | } | ||
129 | |||
130 | csd->mmca_vsn = UNSTUFF_BITS(resp, 122, 4); | ||
131 | m = UNSTUFF_BITS(resp, 115, 4); | ||
132 | e = UNSTUFF_BITS(resp, 112, 3); | ||
133 | csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; | ||
134 | csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; | ||
135 | |||
136 | m = UNSTUFF_BITS(resp, 99, 4); | ||
137 | e = UNSTUFF_BITS(resp, 96, 3); | ||
138 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
139 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
140 | |||
141 | e = UNSTUFF_BITS(resp, 47, 3); | ||
142 | m = UNSTUFF_BITS(resp, 62, 12); | ||
143 | csd->capacity = (1 + m) << (e + 2); | ||
144 | |||
145 | csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); | ||
146 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | ||
147 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | ||
148 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | ||
149 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
150 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | ||
151 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | ||
152 | } | ||
153 | |||
154 | /* | ||
155 | * Read and decode extended CSD. Switch to high-speed and wide bus | ||
156 | * if supported. | ||
157 | */ | ||
158 | static int mmc_process_ext_csd(struct mmc_card *card) | ||
159 | { | ||
160 | int err; | ||
161 | u8 *ext_csd; | ||
162 | |||
163 | BUG_ON(!card); | ||
164 | |||
165 | err = MMC_ERR_FAILED; | ||
166 | |||
167 | if (card->csd.mmca_vsn < CSD_SPEC_VER_4) | ||
168 | return MMC_ERR_NONE; | ||
169 | |||
170 | /* | ||
171 | * As the ext_csd is so large and mostly unused, we don't store the | ||
172 | * raw block in mmc_card. | ||
173 | */ | ||
174 | ext_csd = kmalloc(512, GFP_KERNEL); | ||
175 | if (!ext_csd) { | ||
176 | printk(KERN_ERR "%s: could not allocate a buffer to " | ||
177 | "receive the ext_csd. mmc v4 cards will be " | ||
178 | "treated as v3.\n", mmc_hostname(card->host)); | ||
179 | return MMC_ERR_FAILED; | ||
180 | } | ||
181 | |||
182 | err = mmc_send_ext_csd(card, ext_csd); | ||
183 | if (err != MMC_ERR_NONE) { | ||
184 | /* | ||
185 | * High capacity cards should have this "magic" size | ||
186 | * stored in their CSD. | ||
187 | */ | ||
188 | if (card->csd.capacity == (4096 * 512)) { | ||
189 | printk(KERN_ERR "%s: unable to read EXT_CSD " | ||
190 | "on a possible high capacity card. " | ||
191 | "Card will be ignored.\n", | ||
192 | mmc_hostname(card->host)); | ||
193 | } else { | ||
194 | printk(KERN_WARNING "%s: unable to read " | ||
195 | "EXT_CSD, performance might " | ||
196 | "suffer.\n", | ||
197 | mmc_hostname(card->host)); | ||
198 | err = MMC_ERR_NONE; | ||
199 | } | ||
200 | goto out; | ||
201 | } | ||
202 | |||
203 | card->ext_csd.sectors = | ||
204 | ext_csd[EXT_CSD_SEC_CNT + 0] << 0 | | ||
205 | ext_csd[EXT_CSD_SEC_CNT + 1] << 8 | | ||
206 | ext_csd[EXT_CSD_SEC_CNT + 2] << 16 | | ||
207 | ext_csd[EXT_CSD_SEC_CNT + 3] << 24; | ||
208 | if (card->ext_csd.sectors) | ||
209 | mmc_card_set_blockaddr(card); | ||
210 | |||
211 | switch (ext_csd[EXT_CSD_CARD_TYPE]) { | ||
212 | case EXT_CSD_CARD_TYPE_52 | EXT_CSD_CARD_TYPE_26: | ||
213 | card->ext_csd.hs_max_dtr = 52000000; | ||
214 | break; | ||
215 | case EXT_CSD_CARD_TYPE_26: | ||
216 | card->ext_csd.hs_max_dtr = 26000000; | ||
217 | break; | ||
218 | default: | ||
219 | /* MMC v4 spec says this cannot happen */ | ||
220 | printk(KERN_WARNING "%s: card is mmc v4 but doesn't " | ||
221 | "support any high-speed modes.\n", | ||
222 | mmc_hostname(card->host)); | ||
223 | goto out; | ||
224 | } | ||
225 | |||
226 | if (card->host->caps & MMC_CAP_MMC_HIGHSPEED) { | ||
227 | /* Activate highspeed support. */ | ||
228 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | ||
229 | EXT_CSD_HS_TIMING, 1); | ||
230 | if (err != MMC_ERR_NONE) { | ||
231 | printk(KERN_WARNING "%s: failed to switch " | ||
232 | "card to mmc v4 high-speed mode.\n", | ||
233 | mmc_hostname(card->host)); | ||
234 | err = MMC_ERR_NONE; | ||
235 | goto out; | ||
236 | } | ||
237 | |||
238 | mmc_card_set_highspeed(card); | ||
239 | |||
240 | mmc_set_timing(card->host, MMC_TIMING_MMC_HS); | ||
241 | } | ||
242 | |||
243 | /* Check for host support for wide-bus modes. */ | ||
244 | if (card->host->caps & MMC_CAP_4_BIT_DATA) { | ||
245 | /* Activate 4-bit support. */ | ||
246 | err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, | ||
247 | EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_4); | ||
248 | if (err != MMC_ERR_NONE) { | ||
249 | printk(KERN_WARNING "%s: failed to switch " | ||
250 | "card to mmc v4 4-bit bus mode.\n", | ||
251 | mmc_hostname(card->host)); | ||
252 | err = MMC_ERR_NONE; | ||
253 | goto out; | ||
254 | } | ||
255 | |||
256 | mmc_set_bus_width(card->host, MMC_BUS_WIDTH_4); | ||
257 | } | ||
258 | |||
259 | out: | ||
260 | kfree(ext_csd); | ||
261 | |||
262 | return err; | ||
263 | } | ||
264 | |||
265 | /* | ||
266 | * Host is being removed. Free up the current card. | ||
267 | */ | ||
268 | static void mmc_remove(struct mmc_host *host) | ||
269 | { | ||
270 | BUG_ON(!host); | ||
271 | BUG_ON(!host->card); | ||
272 | |||
273 | mmc_remove_card(host->card); | ||
274 | host->card = NULL; | ||
275 | } | ||
276 | |||
277 | /* | ||
278 | * Card detection callback from host. | ||
279 | */ | ||
280 | static void mmc_detect(struct mmc_host *host) | ||
281 | { | ||
282 | int err; | ||
283 | |||
284 | BUG_ON(!host); | ||
285 | BUG_ON(!host->card); | ||
286 | |||
287 | mmc_claim_host(host); | ||
288 | |||
289 | /* | ||
290 | * Just check if our card has been removed. | ||
291 | */ | ||
292 | err = mmc_send_status(host->card, NULL); | ||
293 | |||
294 | mmc_release_host(host); | ||
295 | |||
296 | if (err != MMC_ERR_NONE) { | ||
297 | mmc_remove_card(host->card); | ||
298 | host->card = NULL; | ||
299 | |||
300 | mmc_claim_host(host); | ||
301 | mmc_detach_bus(host); | ||
302 | mmc_release_host(host); | ||
303 | } | ||
304 | } | ||
305 | |||
306 | static const struct mmc_bus_ops mmc_ops = { | ||
307 | .remove = mmc_remove, | ||
308 | .detect = mmc_detect, | ||
309 | }; | ||
310 | |||
311 | /* | ||
312 | * Starting point for MMC card init. | ||
313 | */ | ||
314 | int mmc_attach_mmc(struct mmc_host *host, u32 ocr) | ||
315 | { | ||
316 | struct mmc_card *card; | ||
317 | int err; | ||
318 | u32 cid[4]; | ||
319 | unsigned int max_dtr; | ||
320 | |||
321 | BUG_ON(!host); | ||
322 | BUG_ON(!host->claimed); | ||
323 | |||
324 | mmc_attach_bus(host, &mmc_ops); | ||
325 | |||
326 | host->ocr = mmc_select_voltage(host, ocr); | ||
327 | |||
328 | /* | ||
329 | * Can we support the voltage of the card? | ||
330 | */ | ||
331 | if (!host->ocr) | ||
332 | goto err; | ||
333 | |||
334 | /* | ||
335 | * Since we're changing the OCR value, we seem to | ||
336 | * need to tell some cards to go back to the idle | ||
337 | * state. We wait 1ms to give cards time to | ||
338 | * respond. | ||
339 | */ | ||
340 | mmc_go_idle(host); | ||
341 | |||
342 | /* The extra bit indicates that we support high capacity */ | ||
343 | mmc_send_op_cond(host, host->ocr | (1 << 30), NULL); | ||
344 | |||
345 | /* | ||
346 | * Fetch CID from card. | ||
347 | */ | ||
348 | err = mmc_all_send_cid(host, cid); | ||
349 | if (err != MMC_ERR_NONE) | ||
350 | goto err; | ||
351 | |||
352 | /* | ||
353 | * Allocate card structure. | ||
354 | */ | ||
355 | card = mmc_alloc_card(host); | ||
356 | if (IS_ERR(card)) | ||
357 | goto err; | ||
358 | |||
359 | card->type = MMC_TYPE_MMC; | ||
360 | card->rca = 1; | ||
361 | memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); | ||
362 | |||
363 | /* | ||
364 | * Set card RCA. | ||
365 | */ | ||
366 | err = mmc_set_relative_addr(card); | ||
367 | if (err != MMC_ERR_NONE) | ||
368 | goto free_card; | ||
369 | |||
370 | mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL); | ||
371 | |||
372 | /* | ||
373 | * Fetch CSD from card. | ||
374 | */ | ||
375 | err = mmc_send_csd(card, card->raw_csd); | ||
376 | if (err != MMC_ERR_NONE) | ||
377 | goto free_card; | ||
378 | |||
379 | mmc_decode_csd(card); | ||
380 | mmc_decode_cid(card); | ||
381 | |||
382 | /* | ||
383 | * Fetch and process extened CSD. | ||
384 | * This will switch into high-speed and wide bus modes, | ||
385 | * as available. | ||
386 | */ | ||
387 | err = mmc_select_card(card); | ||
388 | if (err != MMC_ERR_NONE) | ||
389 | goto free_card; | ||
390 | |||
391 | err = mmc_process_ext_csd(card); | ||
392 | if (err != MMC_ERR_NONE) | ||
393 | goto free_card; | ||
394 | |||
395 | /* | ||
396 | * Compute bus speed. | ||
397 | */ | ||
398 | max_dtr = (unsigned int)-1; | ||
399 | |||
400 | if (mmc_card_highspeed(card)) { | ||
401 | if (max_dtr > card->ext_csd.hs_max_dtr) | ||
402 | max_dtr = card->ext_csd.hs_max_dtr; | ||
403 | } else if (max_dtr > card->csd.max_dtr) { | ||
404 | max_dtr = card->csd.max_dtr; | ||
405 | } | ||
406 | |||
407 | mmc_set_clock(host, max_dtr); | ||
408 | |||
409 | host->card = card; | ||
410 | |||
411 | mmc_release_host(host); | ||
412 | |||
413 | err = mmc_register_card(card); | ||
414 | if (err) | ||
415 | goto reclaim_host; | ||
416 | |||
417 | return 0; | ||
418 | |||
419 | reclaim_host: | ||
420 | mmc_claim_host(host); | ||
421 | free_card: | ||
422 | mmc_remove_card(card); | ||
423 | host->card = NULL; | ||
424 | err: | ||
425 | mmc_detach_bus(host); | ||
426 | mmc_release_host(host); | ||
427 | |||
428 | return 0; | ||
429 | } | ||
430 | |||
diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c new file mode 100644 index 000000000000..6c6beb48f3a8 --- /dev/null +++ b/drivers/mmc/core/sd.c | |||
@@ -0,0 +1,431 @@ | |||
1 | /* | ||
2 | * linux/drivers/mmc/sd.c | ||
3 | * | ||
4 | * Copyright (C) 2003-2004 Russell King, All Rights Reserved. | ||
5 | * SD support Copyright (C) 2004 Ian Molton, All Rights Reserved. | ||
6 | * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/err.h> | ||
14 | |||
15 | #include <linux/mmc/host.h> | ||
16 | #include <linux/mmc/card.h> | ||
17 | #include <linux/mmc/mmc.h> | ||
18 | |||
19 | #include "core.h" | ||
20 | #include "sysfs.h" | ||
21 | #include "mmc_ops.h" | ||
22 | #include "sd_ops.h" | ||
23 | |||
24 | #include "core.h" | ||
25 | |||
26 | static const unsigned int tran_exp[] = { | ||
27 | 10000, 100000, 1000000, 10000000, | ||
28 | 0, 0, 0, 0 | ||
29 | }; | ||
30 | |||
31 | static const unsigned char tran_mant[] = { | ||
32 | 0, 10, 12, 13, 15, 20, 25, 30, | ||
33 | 35, 40, 45, 50, 55, 60, 70, 80, | ||
34 | }; | ||
35 | |||
36 | static const unsigned int tacc_exp[] = { | ||
37 | 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, | ||
38 | }; | ||
39 | |||
40 | static const unsigned int tacc_mant[] = { | ||
41 | 0, 10, 12, 13, 15, 20, 25, 30, | ||
42 | 35, 40, 45, 50, 55, 60, 70, 80, | ||
43 | }; | ||
44 | |||
45 | #define UNSTUFF_BITS(resp,start,size) \ | ||
46 | ({ \ | ||
47 | const int __size = size; \ | ||
48 | const u32 __mask = (__size < 32 ? 1 << __size : 0) - 1; \ | ||
49 | const int __off = 3 - ((start) / 32); \ | ||
50 | const int __shft = (start) & 31; \ | ||
51 | u32 __res; \ | ||
52 | \ | ||
53 | __res = resp[__off] >> __shft; \ | ||
54 | if (__size + __shft > 32) \ | ||
55 | __res |= resp[__off-1] << ((32 - __shft) % 32); \ | ||
56 | __res & __mask; \ | ||
57 | }) | ||
58 | |||
59 | /* | ||
60 | * Given the decoded CSD structure, decode the raw CID to our CID structure. | ||
61 | */ | ||
62 | static void mmc_decode_cid(struct mmc_card *card) | ||
63 | { | ||
64 | u32 *resp = card->raw_cid; | ||
65 | |||
66 | memset(&card->cid, 0, sizeof(struct mmc_cid)); | ||
67 | |||
68 | /* | ||
69 | * SD doesn't currently have a version field so we will | ||
70 | * have to assume we can parse this. | ||
71 | */ | ||
72 | card->cid.manfid = UNSTUFF_BITS(resp, 120, 8); | ||
73 | card->cid.oemid = UNSTUFF_BITS(resp, 104, 16); | ||
74 | card->cid.prod_name[0] = UNSTUFF_BITS(resp, 96, 8); | ||
75 | card->cid.prod_name[1] = UNSTUFF_BITS(resp, 88, 8); | ||
76 | card->cid.prod_name[2] = UNSTUFF_BITS(resp, 80, 8); | ||
77 | card->cid.prod_name[3] = UNSTUFF_BITS(resp, 72, 8); | ||
78 | card->cid.prod_name[4] = UNSTUFF_BITS(resp, 64, 8); | ||
79 | card->cid.hwrev = UNSTUFF_BITS(resp, 60, 4); | ||
80 | card->cid.fwrev = UNSTUFF_BITS(resp, 56, 4); | ||
81 | card->cid.serial = UNSTUFF_BITS(resp, 24, 32); | ||
82 | card->cid.year = UNSTUFF_BITS(resp, 12, 8); | ||
83 | card->cid.month = UNSTUFF_BITS(resp, 8, 4); | ||
84 | |||
85 | card->cid.year += 2000; /* SD cards year offset */ | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * Given a 128-bit response, decode to our card CSD structure. | ||
90 | */ | ||
91 | static void mmc_decode_csd(struct mmc_card *card) | ||
92 | { | ||
93 | struct mmc_csd *csd = &card->csd; | ||
94 | unsigned int e, m, csd_struct; | ||
95 | u32 *resp = card->raw_csd; | ||
96 | |||
97 | csd_struct = UNSTUFF_BITS(resp, 126, 2); | ||
98 | |||
99 | switch (csd_struct) { | ||
100 | case 0: | ||
101 | m = UNSTUFF_BITS(resp, 115, 4); | ||
102 | e = UNSTUFF_BITS(resp, 112, 3); | ||
103 | csd->tacc_ns = (tacc_exp[e] * tacc_mant[m] + 9) / 10; | ||
104 | csd->tacc_clks = UNSTUFF_BITS(resp, 104, 8) * 100; | ||
105 | |||
106 | m = UNSTUFF_BITS(resp, 99, 4); | ||
107 | e = UNSTUFF_BITS(resp, 96, 3); | ||
108 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
109 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
110 | |||
111 | e = UNSTUFF_BITS(resp, 47, 3); | ||
112 | m = UNSTUFF_BITS(resp, 62, 12); | ||
113 | csd->capacity = (1 + m) << (e + 2); | ||
114 | |||
115 | csd->read_blkbits = UNSTUFF_BITS(resp, 80, 4); | ||
116 | csd->read_partial = UNSTUFF_BITS(resp, 79, 1); | ||
117 | csd->write_misalign = UNSTUFF_BITS(resp, 78, 1); | ||
118 | csd->read_misalign = UNSTUFF_BITS(resp, 77, 1); | ||
119 | csd->r2w_factor = UNSTUFF_BITS(resp, 26, 3); | ||
120 | csd->write_blkbits = UNSTUFF_BITS(resp, 22, 4); | ||
121 | csd->write_partial = UNSTUFF_BITS(resp, 21, 1); | ||
122 | break; | ||
123 | case 1: | ||
124 | /* | ||
125 | * This is a block-addressed SDHC card. Most | ||
126 | * interesting fields are unused and have fixed | ||
127 | * values. To avoid getting tripped by buggy cards, | ||
128 | * we assume those fixed values ourselves. | ||
129 | */ | ||
130 | mmc_card_set_blockaddr(card); | ||
131 | |||
132 | csd->tacc_ns = 0; /* Unused */ | ||
133 | csd->tacc_clks = 0; /* Unused */ | ||
134 | |||
135 | m = UNSTUFF_BITS(resp, 99, 4); | ||
136 | e = UNSTUFF_BITS(resp, 96, 3); | ||
137 | csd->max_dtr = tran_exp[e] * tran_mant[m]; | ||
138 | csd->cmdclass = UNSTUFF_BITS(resp, 84, 12); | ||
139 | |||
140 | m = UNSTUFF_BITS(resp, 48, 22); | ||
141 | csd->capacity = (1 + m) << 10; | ||
142 | |||
143 | csd->read_blkbits = 9; | ||
144 | csd->read_partial = 0; | ||
145 | csd->write_misalign = 0; | ||
146 | csd->read_misalign = 0; | ||
147 | csd->r2w_factor = 4; /* Unused */ | ||
148 | csd->write_blkbits = 9; | ||
149 | csd->write_partial = 0; | ||
150 | break; | ||
151 | default: | ||
152 | printk("%s: unrecognised CSD structure version %d\n", | ||
153 | mmc_hostname(card->host), csd_struct); | ||
154 | mmc_card_set_bad(card); | ||
155 | return; | ||
156 | } | ||
157 | } | ||
158 | |||
159 | /* | ||
160 | * Given a 64-bit response, decode to our card SCR structure. | ||
161 | */ | ||
162 | static void mmc_decode_scr(struct mmc_card *card) | ||
163 | { | ||
164 | struct sd_scr *scr = &card->scr; | ||
165 | unsigned int scr_struct; | ||
166 | u32 resp[4]; | ||
167 | |||
168 | BUG_ON(!mmc_card_sd(card)); | ||
169 | |||
170 | resp[3] = card->raw_scr[1]; | ||
171 | resp[2] = card->raw_scr[0]; | ||
172 | |||
173 | scr_struct = UNSTUFF_BITS(resp, 60, 4); | ||
174 | if (scr_struct != 0) { | ||
175 | printk("%s: unrecognised SCR structure version %d\n", | ||
176 | mmc_hostname(card->host), scr_struct); | ||
177 | mmc_card_set_bad(card); | ||
178 | return; | ||
179 | } | ||
180 | |||
181 | scr->sda_vsn = UNSTUFF_BITS(resp, 56, 4); | ||
182 | scr->bus_widths = UNSTUFF_BITS(resp, 48, 4); | ||
183 | } | ||
184 | |||
185 | /* | ||
186 | * Test if the card supports high-speed mode and, if so, switch to it. | ||
187 | */ | ||
188 | static int mmc_switch_hs(struct mmc_card *card) | ||
189 | { | ||
190 | int err; | ||
191 | u8 *status; | ||
192 | |||
193 | if (!(card->host->caps & MMC_CAP_SD_HIGHSPEED)) | ||
194 | return MMC_ERR_NONE; | ||
195 | |||
196 | err = MMC_ERR_FAILED; | ||
197 | |||
198 | status = kmalloc(64, GFP_KERNEL); | ||
199 | if (!status) { | ||
200 | printk("%s: could not allocate a buffer for switch " | ||
201 | "capabilities.\n", | ||
202 | mmc_hostname(card->host)); | ||
203 | return err; | ||
204 | } | ||
205 | |||
206 | err = mmc_sd_switch(card, 0, 0, 1, status); | ||
207 | if (err != MMC_ERR_NONE) { | ||
208 | /* | ||
209 | * Card not supporting high-speed will ignore the | ||
210 | * command. | ||
211 | */ | ||
212 | if (err == MMC_ERR_TIMEOUT) | ||
213 | err = MMC_ERR_NONE; | ||
214 | goto out; | ||
215 | } | ||
216 | |||
217 | if (status[13] & 0x02) | ||
218 | card->sw_caps.hs_max_dtr = 50000000; | ||
219 | |||
220 | err = mmc_sd_switch(card, 1, 0, 1, status); | ||
221 | if (err != MMC_ERR_NONE) | ||
222 | goto out; | ||
223 | |||
224 | if ((status[16] & 0xF) != 1) { | ||
225 | printk(KERN_WARNING "%s: Problem switching card " | ||
226 | "into high-speed mode!\n", | ||
227 | mmc_hostname(card->host)); | ||
228 | } else { | ||
229 | mmc_card_set_highspeed(card); | ||
230 | mmc_set_timing(card->host, MMC_TIMING_SD_HS); | ||
231 | } | ||
232 | |||
233 | out: | ||
234 | kfree(status); | ||
235 | |||
236 | return err; | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * Host is being removed. Free up the current card. | ||
241 | */ | ||
242 | static void mmc_sd_remove(struct mmc_host *host) | ||
243 | { | ||
244 | BUG_ON(!host); | ||
245 | BUG_ON(!host->card); | ||
246 | |||
247 | mmc_remove_card(host->card); | ||
248 | host->card = NULL; | ||
249 | } | ||
250 | |||
251 | /* | ||
252 | * Card detection callback from host. | ||
253 | */ | ||
254 | static void mmc_sd_detect(struct mmc_host *host) | ||
255 | { | ||
256 | int err; | ||
257 | |||
258 | BUG_ON(!host); | ||
259 | BUG_ON(!host->card); | ||
260 | |||
261 | mmc_claim_host(host); | ||
262 | |||
263 | /* | ||
264 | * Just check if our card has been removed. | ||
265 | */ | ||
266 | err = mmc_send_status(host->card, NULL); | ||
267 | |||
268 | mmc_release_host(host); | ||
269 | |||
270 | if (err != MMC_ERR_NONE) { | ||
271 | mmc_remove_card(host->card); | ||
272 | host->card = NULL; | ||
273 | |||
274 | mmc_claim_host(host); | ||
275 | mmc_detach_bus(host); | ||
276 | mmc_release_host(host); | ||
277 | } | ||
278 | } | ||
279 | |||
280 | static const struct mmc_bus_ops mmc_sd_ops = { | ||
281 | .remove = mmc_sd_remove, | ||
282 | .detect = mmc_sd_detect, | ||
283 | }; | ||
284 | |||
285 | /* | ||
286 | * Starting point for SD card init. | ||
287 | */ | ||
288 | int mmc_attach_sd(struct mmc_host *host, u32 ocr) | ||
289 | { | ||
290 | struct mmc_card *card; | ||
291 | int err; | ||
292 | u32 cid[4]; | ||
293 | unsigned int max_dtr; | ||
294 | |||
295 | BUG_ON(!host); | ||
296 | BUG_ON(!host->claimed); | ||
297 | |||
298 | mmc_attach_bus(host, &mmc_sd_ops); | ||
299 | |||
300 | host->ocr = mmc_select_voltage(host, ocr); | ||
301 | |||
302 | /* | ||
303 | * Can we support the voltage(s) of the card(s)? | ||
304 | */ | ||
305 | if (!host->ocr) | ||
306 | goto err; | ||
307 | |||
308 | /* | ||
309 | * Since we're changing the OCR value, we seem to | ||
310 | * need to tell some cards to go back to the idle | ||
311 | * state. We wait 1ms to give cards time to | ||
312 | * respond. | ||
313 | */ | ||
314 | mmc_go_idle(host); | ||
315 | |||
316 | /* | ||
317 | * If SD_SEND_IF_COND indicates an SD 2.0 | ||
318 | * compliant card and we should set bit 30 | ||
319 | * of the ocr to indicate that we can handle | ||
320 | * block-addressed SDHC cards. | ||
321 | */ | ||
322 | err = mmc_send_if_cond(host, host->ocr); | ||
323 | if (err == MMC_ERR_NONE) | ||
324 | ocr = host->ocr | (1 << 30); | ||
325 | |||
326 | mmc_send_app_op_cond(host, ocr, NULL); | ||
327 | |||
328 | /* | ||
329 | * Fetch CID from card. | ||
330 | */ | ||
331 | err = mmc_all_send_cid(host, cid); | ||
332 | if (err != MMC_ERR_NONE) | ||
333 | goto err; | ||
334 | |||
335 | /* | ||
336 | * Allocate card structure. | ||
337 | */ | ||
338 | card = mmc_alloc_card(host); | ||
339 | if (IS_ERR(card)) | ||
340 | goto err; | ||
341 | |||
342 | card->type = MMC_TYPE_SD; | ||
343 | memcpy(card->raw_cid, cid, sizeof(card->raw_cid)); | ||
344 | |||
345 | /* | ||
346 | * Set card RCA. | ||
347 | */ | ||
348 | err = mmc_send_relative_addr(host, &card->rca); | ||
349 | if (err != MMC_ERR_NONE) | ||
350 | goto free_card; | ||
351 | |||
352 | mmc_set_bus_mode(host, MMC_BUSMODE_PUSHPULL); | ||
353 | |||
354 | /* | ||
355 | * Fetch CSD from card. | ||
356 | */ | ||
357 | err = mmc_send_csd(card, card->raw_csd); | ||
358 | if (err != MMC_ERR_NONE) | ||
359 | goto free_card; | ||
360 | |||
361 | mmc_decode_csd(card); | ||
362 | mmc_decode_cid(card); | ||
363 | |||
364 | /* | ||
365 | * Fetch SCR from card. | ||
366 | */ | ||
367 | err = mmc_select_card(card); | ||
368 | if (err != MMC_ERR_NONE) | ||
369 | goto free_card; | ||
370 | |||
371 | err = mmc_app_send_scr(card, card->raw_scr); | ||
372 | if (err != MMC_ERR_NONE) | ||
373 | goto free_card; | ||
374 | |||
375 | mmc_decode_scr(card); | ||
376 | |||
377 | /* | ||
378 | * Check if card can be switched into high-speed mode. | ||
379 | */ | ||
380 | err = mmc_switch_hs(card); | ||
381 | if (err != MMC_ERR_NONE) | ||
382 | goto free_card; | ||
383 | |||
384 | /* | ||
385 | * Compute bus speed. | ||
386 | */ | ||
387 | max_dtr = (unsigned int)-1; | ||
388 | |||
389 | if (mmc_card_highspeed(card)) { | ||
390 | if (max_dtr > card->sw_caps.hs_max_dtr) | ||
391 | max_dtr = card->sw_caps.hs_max_dtr; | ||
392 | } else if (max_dtr > card->csd.max_dtr) { | ||
393 | max_dtr = card->csd.max_dtr; | ||
394 | } | ||
395 | |||
396 | mmc_set_clock(host, max_dtr); | ||
397 | |||
398 | /* | ||
399 | * Switch to wider bus (if supported). | ||
400 | */ | ||
401 | if ((host->caps && MMC_CAP_4_BIT_DATA) && | ||
402 | (card->scr.bus_widths & SD_SCR_BUS_WIDTH_4)) { | ||
403 | err = mmc_app_set_bus_width(card, MMC_BUS_WIDTH_4); | ||
404 | if (err != MMC_ERR_NONE) | ||
405 | goto free_card; | ||
406 | |||
407 | mmc_set_bus_width(host, MMC_BUS_WIDTH_4); | ||
408 | } | ||
409 | |||
410 | host->card = card; | ||
411 | |||
412 | mmc_release_host(host); | ||
413 | |||
414 | err = mmc_register_card(card); | ||
415 | if (err) | ||
416 | goto reclaim_host; | ||
417 | |||
418 | return 0; | ||
419 | |||
420 | reclaim_host: | ||
421 | mmc_claim_host(host); | ||
422 | free_card: | ||
423 | mmc_remove_card(card); | ||
424 | host->card = NULL; | ||
425 | err: | ||
426 | mmc_detach_bus(host); | ||
427 | mmc_release_host(host); | ||
428 | |||
429 | return 0; | ||
430 | } | ||
431 | |||
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 43bf6a5c398d..efae87b5c4e7 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
@@ -131,6 +131,8 @@ struct mmc_host { | |||
131 | unsigned int max_blk_count; /* maximum number of blocks in one req */ | 131 | unsigned int max_blk_count; /* maximum number of blocks in one req */ |
132 | 132 | ||
133 | /* private data */ | 133 | /* private data */ |
134 | spinlock_t lock; /* lock for claim and bus ops */ | ||
135 | |||
134 | struct mmc_ios ios; /* current io bus settings */ | 136 | struct mmc_ios ios; /* current io bus settings */ |
135 | u32 ocr; /* the current OCR setting */ | 137 | u32 ocr; /* the current OCR setting */ |
136 | 138 | ||
@@ -141,7 +143,6 @@ struct mmc_host { | |||
141 | struct mmc_card *card; /* device attached to this host */ | 143 | struct mmc_card *card; /* device attached to this host */ |
142 | 144 | ||
143 | wait_queue_head_t wq; | 145 | wait_queue_head_t wq; |
144 | spinlock_t lock; /* claimed lock */ | ||
145 | unsigned int claimed:1; /* host exclusively claimed */ | 146 | unsigned int claimed:1; /* host exclusively claimed */ |
146 | 147 | ||
147 | struct delayed_work detect; | 148 | struct delayed_work detect; |
@@ -149,6 +150,10 @@ struct mmc_host { | |||
149 | unsigned int removed:1; /* host is being removed */ | 150 | unsigned int removed:1; /* host is being removed */ |
150 | #endif | 151 | #endif |
151 | 152 | ||
153 | const struct mmc_bus_ops *bus_ops; /* current bus driver */ | ||
154 | unsigned int bus_refs; /* reference counter */ | ||
155 | unsigned int bus_dead:1; /* bus has been released */ | ||
156 | |||
152 | unsigned long private[0] ____cacheline_aligned; | 157 | unsigned long private[0] ____cacheline_aligned; |
153 | }; | 158 | }; |
154 | 159 | ||