diff options
| -rw-r--r-- | drivers/mmc/core/sdio.c | 6 | ||||
| -rw-r--r-- | drivers/mmc/host/mxcmmc.c | 16 | ||||
| -rw-r--r-- | include/linux/mmc/host.h | 3 |
3 files changed, 25 insertions, 0 deletions
diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 2dd4cfe7ca17..b9dee28ee7d0 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c | |||
| @@ -296,6 +296,12 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, | |||
| 296 | card->type = MMC_TYPE_SDIO; | 296 | card->type = MMC_TYPE_SDIO; |
| 297 | 297 | ||
| 298 | /* | 298 | /* |
| 299 | * Call the optional HC's init_card function to handle quirks. | ||
| 300 | */ | ||
| 301 | if (host->ops->init_card) | ||
| 302 | host->ops->init_card(host, card); | ||
| 303 | |||
| 304 | /* | ||
| 299 | * For native busses: set card RCA and quit open drain mode. | 305 | * For native busses: set card RCA and quit open drain mode. |
| 300 | */ | 306 | */ |
| 301 | if (!powered_resume && !mmc_host_is_spi(host)) { | 307 | if (!powered_resume && !mmc_host_is_spi(host)) { |
diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 51e880c8f193..2c53024ee439 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c | |||
| @@ -724,11 +724,27 @@ static void mxcmci_enable_sdio_irq(struct mmc_host *mmc, int enable) | |||
| 724 | spin_unlock_irqrestore(&host->lock, flags); | 724 | spin_unlock_irqrestore(&host->lock, flags); |
| 725 | } | 725 | } |
| 726 | 726 | ||
| 727 | static void mxcmci_init_card(struct mmc_host *host, struct mmc_card *card) | ||
| 728 | { | ||
| 729 | /* | ||
| 730 | * MX3 SoCs have a silicon bug which corrupts CRC calculation of | ||
| 731 | * multi-block transfers when connected SDIO peripheral doesn't | ||
| 732 | * drive the BUSY line as required by the specs. | ||
| 733 | * One way to prevent this is to only allow 1-bit transfers. | ||
| 734 | */ | ||
| 735 | |||
| 736 | if (cpu_is_mx3() && card->type == MMC_TYPE_SDIO) | ||
| 737 | host->caps &= ~MMC_CAP_4_BIT_DATA; | ||
| 738 | else | ||
| 739 | host->caps |= MMC_CAP_4_BIT_DATA; | ||
| 740 | } | ||
| 741 | |||
| 727 | static const struct mmc_host_ops mxcmci_ops = { | 742 | static const struct mmc_host_ops mxcmci_ops = { |
| 728 | .request = mxcmci_request, | 743 | .request = mxcmci_request, |
| 729 | .set_ios = mxcmci_set_ios, | 744 | .set_ios = mxcmci_set_ios, |
| 730 | .get_ro = mxcmci_get_ro, | 745 | .get_ro = mxcmci_get_ro, |
| 731 | .enable_sdio_irq = mxcmci_enable_sdio_irq, | 746 | .enable_sdio_irq = mxcmci_enable_sdio_irq, |
| 747 | .init_card = mxcmci_init_card, | ||
| 732 | }; | 748 | }; |
| 733 | 749 | ||
| 734 | static int mxcmci_probe(struct platform_device *pdev) | 750 | static int mxcmci_probe(struct platform_device *pdev) |
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 43eaf5ca5848..3196c84cc630 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -108,6 +108,9 @@ struct mmc_host_ops { | |||
| 108 | int (*get_cd)(struct mmc_host *host); | 108 | int (*get_cd)(struct mmc_host *host); |
| 109 | 109 | ||
| 110 | void (*enable_sdio_irq)(struct mmc_host *host, int enable); | 110 | void (*enable_sdio_irq)(struct mmc_host *host, int enable); |
| 111 | |||
| 112 | /* optional callback for HC quirks */ | ||
| 113 | void (*init_card)(struct mmc_host *host, struct mmc_card *card); | ||
| 111 | }; | 114 | }; |
| 112 | 115 | ||
| 113 | struct mmc_card; | 116 | struct mmc_card; |
