diff options
Diffstat (limited to 'drivers/mmc/host/sdhci.c')
-rw-r--r-- | drivers/mmc/host/sdhci.c | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index a25db426c910..9e15f41f87be 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #include <linux/leds.h> | 24 | #include <linux/leds.h> |
25 | 25 | ||
26 | #include <linux/mmc/mmc.h> | ||
26 | #include <linux/mmc/host.h> | 27 | #include <linux/mmc/host.h> |
27 | 28 | ||
28 | #include "sdhci.h" | 29 | #include "sdhci.h" |
@@ -77,8 +78,11 @@ static void sdhci_dumpregs(struct sdhci_host *host) | |||
77 | printk(KERN_DEBUG DRIVER_NAME ": AC12 err: 0x%08x | Slot int: 0x%08x\n", | 78 | printk(KERN_DEBUG DRIVER_NAME ": AC12 err: 0x%08x | Slot int: 0x%08x\n", |
78 | sdhci_readw(host, SDHCI_ACMD12_ERR), | 79 | sdhci_readw(host, SDHCI_ACMD12_ERR), |
79 | sdhci_readw(host, SDHCI_SLOT_INT_STATUS)); | 80 | sdhci_readw(host, SDHCI_SLOT_INT_STATUS)); |
80 | printk(KERN_DEBUG DRIVER_NAME ": Caps: 0x%08x | Max curr: 0x%08x\n", | 81 | printk(KERN_DEBUG DRIVER_NAME ": Caps: 0x%08x | Caps_1: 0x%08x\n", |
81 | sdhci_readl(host, SDHCI_CAPABILITIES), | 82 | sdhci_readl(host, SDHCI_CAPABILITIES), |
83 | sdhci_readl(host, SDHCI_CAPABILITIES_1)); | ||
84 | printk(KERN_DEBUG DRIVER_NAME ": Cmd: 0x%08x | Max curr: 0x%08x\n", | ||
85 | sdhci_readw(host, SDHCI_COMMAND), | ||
82 | sdhci_readl(host, SDHCI_MAX_CURRENT)); | 86 | sdhci_readl(host, SDHCI_MAX_CURRENT)); |
83 | 87 | ||
84 | if (host->flags & SDHCI_USE_ADMA) | 88 | if (host->flags & SDHCI_USE_ADMA) |
@@ -1518,7 +1522,11 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) | |||
1518 | 1522 | ||
1519 | if (intmask & SDHCI_INT_DATA_TIMEOUT) | 1523 | if (intmask & SDHCI_INT_DATA_TIMEOUT) |
1520 | host->data->error = -ETIMEDOUT; | 1524 | host->data->error = -ETIMEDOUT; |
1521 | else if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_END_BIT)) | 1525 | else if (intmask & SDHCI_INT_DATA_END_BIT) |
1526 | host->data->error = -EILSEQ; | ||
1527 | else if ((intmask & SDHCI_INT_DATA_CRC) && | ||
1528 | SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)) | ||
1529 | != MMC_BUS_TEST_R) | ||
1522 | host->data->error = -EILSEQ; | 1530 | host->data->error = -EILSEQ; |
1523 | else if (intmask & SDHCI_INT_ADMA_ERROR) { | 1531 | else if (intmask & SDHCI_INT_ADMA_ERROR) { |
1524 | printk(KERN_ERR "%s: ADMA error\n", mmc_hostname(host->mmc)); | 1532 | printk(KERN_ERR "%s: ADMA error\n", mmc_hostname(host->mmc)); |
@@ -1736,7 +1744,7 @@ EXPORT_SYMBOL_GPL(sdhci_alloc_host); | |||
1736 | int sdhci_add_host(struct sdhci_host *host) | 1744 | int sdhci_add_host(struct sdhci_host *host) |
1737 | { | 1745 | { |
1738 | struct mmc_host *mmc; | 1746 | struct mmc_host *mmc; |
1739 | unsigned int caps; | 1747 | unsigned int caps, ocr_avail; |
1740 | int ret; | 1748 | int ret; |
1741 | 1749 | ||
1742 | WARN_ON(host == NULL); | 1750 | WARN_ON(host == NULL); |
@@ -1890,13 +1898,26 @@ int sdhci_add_host(struct sdhci_host *host) | |||
1890 | mmc_card_is_removable(mmc)) | 1898 | mmc_card_is_removable(mmc)) |
1891 | mmc->caps |= MMC_CAP_NEEDS_POLL; | 1899 | mmc->caps |= MMC_CAP_NEEDS_POLL; |
1892 | 1900 | ||
1893 | mmc->ocr_avail = 0; | 1901 | ocr_avail = 0; |
1894 | if (caps & SDHCI_CAN_VDD_330) | 1902 | if (caps & SDHCI_CAN_VDD_330) |
1895 | mmc->ocr_avail |= MMC_VDD_32_33|MMC_VDD_33_34; | 1903 | ocr_avail |= MMC_VDD_32_33 | MMC_VDD_33_34; |
1896 | if (caps & SDHCI_CAN_VDD_300) | 1904 | if (caps & SDHCI_CAN_VDD_300) |
1897 | mmc->ocr_avail |= MMC_VDD_29_30|MMC_VDD_30_31; | 1905 | ocr_avail |= MMC_VDD_29_30 | MMC_VDD_30_31; |
1898 | if (caps & SDHCI_CAN_VDD_180) | 1906 | if (caps & SDHCI_CAN_VDD_180) |
1899 | mmc->ocr_avail |= MMC_VDD_165_195; | 1907 | ocr_avail |= MMC_VDD_165_195; |
1908 | |||
1909 | mmc->ocr_avail = ocr_avail; | ||
1910 | mmc->ocr_avail_sdio = ocr_avail; | ||
1911 | if (host->ocr_avail_sdio) | ||
1912 | mmc->ocr_avail_sdio &= host->ocr_avail_sdio; | ||
1913 | mmc->ocr_avail_sd = ocr_avail; | ||
1914 | if (host->ocr_avail_sd) | ||
1915 | mmc->ocr_avail_sd &= host->ocr_avail_sd; | ||
1916 | else /* normal SD controllers don't support 1.8V */ | ||
1917 | mmc->ocr_avail_sd &= ~MMC_VDD_165_195; | ||
1918 | mmc->ocr_avail_mmc = ocr_avail; | ||
1919 | if (host->ocr_avail_mmc) | ||
1920 | mmc->ocr_avail_mmc &= host->ocr_avail_mmc; | ||
1900 | 1921 | ||
1901 | if (mmc->ocr_avail == 0) { | 1922 | if (mmc->ocr_avail == 0) { |
1902 | printk(KERN_ERR "%s: Hardware doesn't report any " | 1923 | printk(KERN_ERR "%s: Hardware doesn't report any " |
@@ -1928,10 +1949,14 @@ int sdhci_add_host(struct sdhci_host *host) | |||
1928 | * of bytes. When doing hardware scatter/gather, each entry cannot | 1949 | * of bytes. When doing hardware scatter/gather, each entry cannot |
1929 | * be larger than 64 KiB though. | 1950 | * be larger than 64 KiB though. |
1930 | */ | 1951 | */ |
1931 | if (host->flags & SDHCI_USE_ADMA) | 1952 | if (host->flags & SDHCI_USE_ADMA) { |
1932 | mmc->max_seg_size = 65536; | 1953 | if (host->quirks & SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC) |
1933 | else | 1954 | mmc->max_seg_size = 65535; |
1955 | else | ||
1956 | mmc->max_seg_size = 65536; | ||
1957 | } else { | ||
1934 | mmc->max_seg_size = mmc->max_req_size; | 1958 | mmc->max_seg_size = mmc->max_req_size; |
1959 | } | ||
1935 | 1960 | ||
1936 | /* | 1961 | /* |
1937 | * Maximum block size. This varies from controller to controller and | 1962 | * Maximum block size. This varies from controller to controller and |