diff options
| author | Juha Yrjola <juha.yrjola@solidboot.com> | 2008-03-26 16:09:26 -0400 |
|---|---|---|
| committer | Pierre Ossman <drzeus@drzeus.cx> | 2008-04-18 14:05:29 -0400 |
| commit | 2a50b8889b707b9c7bcd09c0ae4cbcef7dca4e29 (patch) | |
| tree | 65046acddb2847a29a38a94462f3c8d176e1aa9f | |
| parent | 65b5b6e51bdeab1934a147aec41ecea82d3cc31d (diff) | |
MMC: OMAP: General cleanup for MMC multislot support
General code cleanup, modifications at some dev_* functions and
other hacks at mmc_omap_irq() for MMC multislot support.
Signed-off-by: Juha Yrjola <juha.yrjola@solidboot.com>
Signed-off-by: Carlos Eduardo Aguiar <carlos.aguiar@indt.org.br>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
| -rw-r--r-- | drivers/mmc/host/omap.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index c80cd58cfa07..535499f11e7c 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c | |||
| @@ -547,11 +547,12 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 547 | u16 status; | 547 | u16 status; |
| 548 | int end_command; | 548 | int end_command; |
| 549 | int end_transfer; | 549 | int end_transfer; |
| 550 | int transfer_error; | 550 | int transfer_error, cmd_error; |
| 551 | 551 | ||
| 552 | if (host->cmd == NULL && host->data == NULL) { | 552 | if (host->cmd == NULL && host->data == NULL) { |
| 553 | status = OMAP_MMC_READ(host, STAT); | 553 | status = OMAP_MMC_READ(host, STAT); |
| 554 | dev_info(mmc_dev(host->mmc),"spurious irq 0x%04x\n", status); | 554 | dev_info(mmc_dev(host->slots[0]->mmc), |
| 555 | "Spurious IRQ 0x%04x\n", status); | ||
| 555 | if (status != 0) { | 556 | if (status != 0) { |
| 556 | OMAP_MMC_WRITE(host, STAT, status); | 557 | OMAP_MMC_WRITE(host, STAT, status); |
| 557 | OMAP_MMC_WRITE(host, IE, 0); | 558 | OMAP_MMC_WRITE(host, IE, 0); |
| @@ -562,12 +563,19 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 562 | end_command = 0; | 563 | end_command = 0; |
| 563 | end_transfer = 0; | 564 | end_transfer = 0; |
| 564 | transfer_error = 0; | 565 | transfer_error = 0; |
| 566 | cmd_error = 0; | ||
| 565 | 567 | ||
| 566 | while ((status = OMAP_MMC_READ(host, STAT)) != 0) { | 568 | while ((status = OMAP_MMC_READ(host, STAT)) != 0) { |
| 569 | int cmd; | ||
| 570 | |||
| 567 | OMAP_MMC_WRITE(host, STAT, status); | 571 | OMAP_MMC_WRITE(host, STAT, status); |
| 572 | if (host->cmd != NULL) | ||
| 573 | cmd = host->cmd->opcode; | ||
| 574 | else | ||
| 575 | cmd = -1; | ||
| 568 | #ifdef CONFIG_MMC_DEBUG | 576 | #ifdef CONFIG_MMC_DEBUG |
| 569 | dev_dbg(mmc_dev(host->mmc), "MMC IRQ %04x (CMD %d): ", | 577 | dev_dbg(mmc_dev(host->mmc), "MMC IRQ %04x (CMD %d): ", |
| 570 | status, host->cmd != NULL ? host->cmd->opcode : -1); | 578 | status, cmd); |
| 571 | mmc_omap_report_irq(status); | 579 | mmc_omap_report_irq(status); |
| 572 | printk("\n"); | 580 | printk("\n"); |
| 573 | #endif | 581 | #endif |
| @@ -579,12 +587,12 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 579 | mmc_omap_xfer_data(host, 1); | 587 | mmc_omap_xfer_data(host, 1); |
| 580 | } | 588 | } |
| 581 | 589 | ||
| 582 | if (status & OMAP_MMC_STAT_END_OF_DATA) { | 590 | if (status & OMAP_MMC_STAT_END_OF_DATA) |
| 583 | end_transfer = 1; | 591 | end_transfer = 1; |
| 584 | } | ||
| 585 | 592 | ||
| 586 | if (status & OMAP_MMC_STAT_DATA_TOUT) { | 593 | if (status & OMAP_MMC_STAT_DATA_TOUT) { |
| 587 | dev_dbg(mmc_dev(host->mmc), "data timeout\n"); | 594 | dev_dbg(mmc_dev(host->mmc), "data timeout (CMD%d)\n", |
| 595 | cmd); | ||
| 588 | if (host->data) { | 596 | if (host->data) { |
| 589 | host->data->error = -ETIMEDOUT; | 597 | host->data->error = -ETIMEDOUT; |
| 590 | transfer_error = 1; | 598 | transfer_error = 1; |
| @@ -608,12 +616,14 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 608 | if (host->cmd) { | 616 | if (host->cmd) { |
| 609 | struct mmc_omap_slot *slot = | 617 | struct mmc_omap_slot *slot = |
| 610 | host->current_slot; | 618 | host->current_slot; |
| 611 | if (!mmc_omap_cover_is_open(slot)) | 619 | if (slot == NULL || |
| 620 | !mmc_omap_cover_is_open(slot)) | ||
| 612 | dev_err(mmc_dev(host->mmc), | 621 | dev_err(mmc_dev(host->mmc), |
| 613 | "command timeout, CMD %d\n", | 622 | "command timeout (CMD%d)\n", |
| 614 | host->cmd->opcode); | 623 | cmd); |
| 615 | host->cmd->error = -ETIMEDOUT; | 624 | host->cmd->error = -ETIMEDOUT; |
| 616 | end_command = 1; | 625 | end_command = 1; |
| 626 | cmd_error = 1; | ||
| 617 | } | 627 | } |
| 618 | } | 628 | } |
| 619 | 629 | ||
| @@ -621,9 +631,10 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 621 | if (host->cmd) { | 631 | if (host->cmd) { |
| 622 | dev_err(mmc_dev(host->mmc), | 632 | dev_err(mmc_dev(host->mmc), |
| 623 | "command CRC error (CMD%d, arg 0x%08x)\n", | 633 | "command CRC error (CMD%d, arg 0x%08x)\n", |
| 624 | host->cmd->opcode, host->cmd->arg); | 634 | cmd, host->cmd->arg); |
| 625 | host->cmd->error = -EILSEQ; | 635 | host->cmd->error = -EILSEQ; |
| 626 | end_command = 1; | 636 | end_command = 1; |
| 637 | cmd_error = 1; | ||
| 627 | } else | 638 | } else |
| 628 | dev_err(mmc_dev(host->mmc), | 639 | dev_err(mmc_dev(host->mmc), |
| 629 | "command CRC error without cmd?\n"); | 640 | "command CRC error without cmd?\n"); |
| @@ -632,13 +643,13 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 632 | if (status & OMAP_MMC_STAT_CARD_ERR) { | 643 | if (status & OMAP_MMC_STAT_CARD_ERR) { |
| 633 | dev_dbg(mmc_dev(host->mmc), | 644 | dev_dbg(mmc_dev(host->mmc), |
| 634 | "ignoring card status error (CMD%d)\n", | 645 | "ignoring card status error (CMD%d)\n", |
| 635 | host->cmd->opcode); | 646 | cmd); |
| 636 | end_command = 1; | 647 | end_command = 1; |
| 637 | } | 648 | } |
| 638 | 649 | ||
| 639 | /* | 650 | /* |
| 640 | * NOTE: On 1610 the END_OF_CMD may come too early when | 651 | * NOTE: On 1610 the END_OF_CMD may come too early when |
| 641 | * starting a write | 652 | * starting a write |
| 642 | */ | 653 | */ |
| 643 | if ((status & OMAP_MMC_STAT_END_OF_CMD) && | 654 | if ((status & OMAP_MMC_STAT_END_OF_CMD) && |
| 644 | (!(status & OMAP_MMC_STAT_A_EMPTY))) { | 655 | (!(status & OMAP_MMC_STAT_A_EMPTY))) { |
| @@ -646,13 +657,14 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) | |||
| 646 | } | 657 | } |
| 647 | } | 658 | } |
| 648 | 659 | ||
| 649 | if (end_command) { | 660 | if (end_command) |
| 650 | mmc_omap_cmd_done(host, host->cmd); | 661 | mmc_omap_cmd_done(host, host->cmd); |
| 662 | if (host->data != NULL) { | ||
| 663 | if (transfer_error) | ||
| 664 | mmc_omap_xfer_done(host, host->data); | ||
| 665 | else if (end_transfer) | ||
| 666 | mmc_omap_end_of_data(host, host->data); | ||
| 651 | } | 667 | } |
| 652 | if (transfer_error) | ||
| 653 | mmc_omap_xfer_done(host, host->data); | ||
| 654 | else if (end_transfer) | ||
| 655 | mmc_omap_end_of_data(host, host->data); | ||
| 656 | 668 | ||
| 657 | return IRQ_HANDLED; | 669 | return IRQ_HANDLED; |
| 658 | } | 670 | } |
