diff options
| -rw-r--r-- | drivers/mmc/host/dw_mmc-exynos.c | 8 | ||||
| -rw-r--r-- | drivers/mmc/host/dw_mmc-pltfm.c | 6 | ||||
| -rw-r--r-- | drivers/mmc/host/dw_mmc-pltfm.h | 2 | ||||
| -rw-r--r-- | drivers/mmc/host/dw_mmc.c | 62 | ||||
| -rw-r--r-- | drivers/mmc/host/mxcmmc.c | 2 | ||||
| -rw-r--r-- | drivers/mmc/host/omap_hsmmc.c | 19 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-dove.c | 38 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-of-esdhc.c | 11 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-pci.c | 2 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-pltfm.c | 7 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-s3c.c | 30 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci.c | 44 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci.h | 1 | ||||
| -rw-r--r-- | drivers/mmc/host/sh_mmcif.c | 2 | ||||
| -rw-r--r-- | include/linux/mmc/dw_mmc.h | 6 | ||||
| -rw-r--r-- | include/linux/mmc/sdhci.h | 1 |
16 files changed, 144 insertions, 97 deletions
diff --git a/drivers/mmc/host/dw_mmc-exynos.c b/drivers/mmc/host/dw_mmc-exynos.c index 660bbc528862..4d50da618166 100644 --- a/drivers/mmc/host/dw_mmc-exynos.c +++ b/drivers/mmc/host/dw_mmc-exynos.c | |||
| @@ -208,7 +208,7 @@ static unsigned long exynos5250_dwmmc_caps[4] = { | |||
| 208 | MMC_CAP_CMD23, | 208 | MMC_CAP_CMD23, |
| 209 | }; | 209 | }; |
| 210 | 210 | ||
| 211 | static struct dw_mci_drv_data exynos5250_drv_data = { | 211 | static const struct dw_mci_drv_data exynos5250_drv_data = { |
| 212 | .caps = exynos5250_dwmmc_caps, | 212 | .caps = exynos5250_dwmmc_caps, |
| 213 | .init = dw_mci_exynos_priv_init, | 213 | .init = dw_mci_exynos_priv_init, |
| 214 | .setup_clock = dw_mci_exynos_setup_clock, | 214 | .setup_clock = dw_mci_exynos_setup_clock, |
| @@ -220,14 +220,14 @@ static struct dw_mci_drv_data exynos5250_drv_data = { | |||
| 220 | 220 | ||
| 221 | static const struct of_device_id dw_mci_exynos_match[] = { | 221 | static const struct of_device_id dw_mci_exynos_match[] = { |
| 222 | { .compatible = "samsung,exynos5250-dw-mshc", | 222 | { .compatible = "samsung,exynos5250-dw-mshc", |
| 223 | .data = (void *)&exynos5250_drv_data, }, | 223 | .data = &exynos5250_drv_data, }, |
| 224 | {}, | 224 | {}, |
| 225 | }; | 225 | }; |
| 226 | MODULE_DEVICE_TABLE(of, dw_mci_pltfm_match); | 226 | MODULE_DEVICE_TABLE(of, dw_mci_exynos_match); |
| 227 | 227 | ||
| 228 | int dw_mci_exynos_probe(struct platform_device *pdev) | 228 | int dw_mci_exynos_probe(struct platform_device *pdev) |
| 229 | { | 229 | { |
| 230 | struct dw_mci_drv_data *drv_data; | 230 | const struct dw_mci_drv_data *drv_data; |
| 231 | const struct of_device_id *match; | 231 | const struct of_device_id *match; |
| 232 | 232 | ||
| 233 | match = of_match_node(dw_mci_exynos_match, pdev->dev.of_node); | 233 | match = of_match_node(dw_mci_exynos_match, pdev->dev.of_node); |
diff --git a/drivers/mmc/host/dw_mmc-pltfm.c b/drivers/mmc/host/dw_mmc-pltfm.c index c960ca7ffbe6..917936bee5d5 100644 --- a/drivers/mmc/host/dw_mmc-pltfm.c +++ b/drivers/mmc/host/dw_mmc-pltfm.c | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | #include "dw_mmc.h" | 24 | #include "dw_mmc.h" |
| 25 | 25 | ||
| 26 | int dw_mci_pltfm_register(struct platform_device *pdev, | 26 | int dw_mci_pltfm_register(struct platform_device *pdev, |
| 27 | struct dw_mci_drv_data *drv_data) | 27 | const struct dw_mci_drv_data *drv_data) |
| 28 | { | 28 | { |
| 29 | struct dw_mci *host; | 29 | struct dw_mci *host; |
| 30 | struct resource *regs; | 30 | struct resource *regs; |
| @@ -50,8 +50,8 @@ int dw_mci_pltfm_register(struct platform_device *pdev, | |||
| 50 | if (!host->regs) | 50 | if (!host->regs) |
| 51 | return -ENOMEM; | 51 | return -ENOMEM; |
| 52 | 52 | ||
| 53 | if (host->drv_data->init) { | 53 | if (drv_data && drv_data->init) { |
| 54 | ret = host->drv_data->init(host); | 54 | ret = drv_data->init(host); |
| 55 | if (ret) | 55 | if (ret) |
| 56 | return ret; | 56 | return ret; |
| 57 | } | 57 | } |
diff --git a/drivers/mmc/host/dw_mmc-pltfm.h b/drivers/mmc/host/dw_mmc-pltfm.h index 301f24541fc2..2ac37b81de4d 100644 --- a/drivers/mmc/host/dw_mmc-pltfm.h +++ b/drivers/mmc/host/dw_mmc-pltfm.h | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #define _DW_MMC_PLTFM_H_ | 13 | #define _DW_MMC_PLTFM_H_ |
| 14 | 14 | ||
| 15 | extern int dw_mci_pltfm_register(struct platform_device *pdev, | 15 | extern int dw_mci_pltfm_register(struct platform_device *pdev, |
| 16 | struct dw_mci_drv_data *drv_data); | 16 | const struct dw_mci_drv_data *drv_data); |
| 17 | extern int __devexit dw_mci_pltfm_remove(struct platform_device *pdev); | 17 | extern int __devexit dw_mci_pltfm_remove(struct platform_device *pdev); |
| 18 | extern const struct dev_pm_ops dw_mci_pltfm_pmops; | 18 | extern const struct dev_pm_ops dw_mci_pltfm_pmops; |
| 19 | 19 | ||
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index c2828f35c3b8..c0667c8af2bd 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c | |||
| @@ -232,6 +232,7 @@ static u32 dw_mci_prepare_command(struct mmc_host *mmc, struct mmc_command *cmd) | |||
| 232 | { | 232 | { |
| 233 | struct mmc_data *data; | 233 | struct mmc_data *data; |
| 234 | struct dw_mci_slot *slot = mmc_priv(mmc); | 234 | struct dw_mci_slot *slot = mmc_priv(mmc); |
| 235 | struct dw_mci_drv_data *drv_data = slot->host->drv_data; | ||
| 235 | u32 cmdr; | 236 | u32 cmdr; |
| 236 | cmd->error = -EINPROGRESS; | 237 | cmd->error = -EINPROGRESS; |
| 237 | 238 | ||
| @@ -261,8 +262,8 @@ static u32 dw_mci_prepare_command(struct mmc_host *mmc, struct mmc_command *cmd) | |||
| 261 | cmdr |= SDMMC_CMD_DAT_WR; | 262 | cmdr |= SDMMC_CMD_DAT_WR; |
| 262 | } | 263 | } |
| 263 | 264 | ||
| 264 | if (slot->host->drv_data->prepare_command) | 265 | if (drv_data && drv_data->prepare_command) |
| 265 | slot->host->drv_data->prepare_command(slot->host, &cmdr); | 266 | drv_data->prepare_command(slot->host, &cmdr); |
| 266 | 267 | ||
| 267 | return cmdr; | 268 | return cmdr; |
| 268 | } | 269 | } |
| @@ -434,7 +435,7 @@ static int dw_mci_idmac_init(struct dw_mci *host) | |||
| 434 | return 0; | 435 | return 0; |
| 435 | } | 436 | } |
| 436 | 437 | ||
| 437 | static struct dw_mci_dma_ops dw_mci_idmac_ops = { | 438 | static const struct dw_mci_dma_ops dw_mci_idmac_ops = { |
| 438 | .init = dw_mci_idmac_init, | 439 | .init = dw_mci_idmac_init, |
| 439 | .start = dw_mci_idmac_start_dma, | 440 | .start = dw_mci_idmac_start_dma, |
| 440 | .stop = dw_mci_idmac_stop_dma, | 441 | .stop = dw_mci_idmac_stop_dma, |
| @@ -772,6 +773,7 @@ static void dw_mci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
| 772 | static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | 773 | static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) |
| 773 | { | 774 | { |
| 774 | struct dw_mci_slot *slot = mmc_priv(mmc); | 775 | struct dw_mci_slot *slot = mmc_priv(mmc); |
| 776 | struct dw_mci_drv_data *drv_data = slot->host->drv_data; | ||
| 775 | u32 regs; | 777 | u32 regs; |
| 776 | 778 | ||
| 777 | /* set default 1 bit mode */ | 779 | /* set default 1 bit mode */ |
| @@ -807,8 +809,8 @@ static void dw_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 807 | slot->clock = ios->clock; | 809 | slot->clock = ios->clock; |
| 808 | } | 810 | } |
| 809 | 811 | ||
| 810 | if (slot->host->drv_data->set_ios) | 812 | if (drv_data && drv_data->set_ios) |
| 811 | slot->host->drv_data->set_ios(slot->host, ios); | 813 | drv_data->set_ios(slot->host, ios); |
| 812 | 814 | ||
| 813 | switch (ios->power_mode) { | 815 | switch (ios->power_mode) { |
| 814 | case MMC_POWER_UP: | 816 | case MMC_POWER_UP: |
| @@ -1815,6 +1817,7 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) | |||
| 1815 | { | 1817 | { |
| 1816 | struct mmc_host *mmc; | 1818 | struct mmc_host *mmc; |
| 1817 | struct dw_mci_slot *slot; | 1819 | struct dw_mci_slot *slot; |
| 1820 | struct dw_mci_drv_data *drv_data = host->drv_data; | ||
| 1818 | int ctrl_id, ret; | 1821 | int ctrl_id, ret; |
| 1819 | u8 bus_width; | 1822 | u8 bus_width; |
| 1820 | 1823 | ||
| @@ -1854,8 +1857,8 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) | |||
| 1854 | } else { | 1857 | } else { |
| 1855 | ctrl_id = to_platform_device(host->dev)->id; | 1858 | ctrl_id = to_platform_device(host->dev)->id; |
| 1856 | } | 1859 | } |
| 1857 | if (host->drv_data && host->drv_data->caps) | 1860 | if (drv_data && drv_data->caps) |
| 1858 | mmc->caps |= host->drv_data->caps[ctrl_id]; | 1861 | mmc->caps |= drv_data->caps[ctrl_id]; |
| 1859 | 1862 | ||
| 1860 | if (host->pdata->caps2) | 1863 | if (host->pdata->caps2) |
| 1861 | mmc->caps2 = host->pdata->caps2; | 1864 | mmc->caps2 = host->pdata->caps2; |
| @@ -1867,10 +1870,10 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) | |||
| 1867 | else | 1870 | else |
| 1868 | bus_width = 1; | 1871 | bus_width = 1; |
| 1869 | 1872 | ||
| 1870 | if (host->drv_data->setup_bus) { | 1873 | if (drv_data && drv_data->setup_bus) { |
| 1871 | struct device_node *slot_np; | 1874 | struct device_node *slot_np; |
| 1872 | slot_np = dw_mci_of_find_slot_node(host->dev, slot->id); | 1875 | slot_np = dw_mci_of_find_slot_node(host->dev, slot->id); |
| 1873 | ret = host->drv_data->setup_bus(host, slot_np, bus_width); | 1876 | ret = drv_data->setup_bus(host, slot_np, bus_width); |
| 1874 | if (ret) | 1877 | if (ret) |
| 1875 | goto err_setup_bus; | 1878 | goto err_setup_bus; |
| 1876 | } | 1879 | } |
| @@ -1968,7 +1971,7 @@ static void dw_mci_init_dma(struct dw_mci *host) | |||
| 1968 | /* Determine which DMA interface to use */ | 1971 | /* Determine which DMA interface to use */ |
| 1969 | #ifdef CONFIG_MMC_DW_IDMAC | 1972 | #ifdef CONFIG_MMC_DW_IDMAC |
| 1970 | host->dma_ops = &dw_mci_idmac_ops; | 1973 | host->dma_ops = &dw_mci_idmac_ops; |
| 1971 | dev_info(&host->dev, "Using internal DMA controller.\n"); | 1974 | dev_info(host->dev, "Using internal DMA controller.\n"); |
| 1972 | #endif | 1975 | #endif |
| 1973 | 1976 | ||
| 1974 | if (!host->dma_ops) | 1977 | if (!host->dma_ops) |
| @@ -2035,6 +2038,7 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) | |||
| 2035 | struct dw_mci_board *pdata; | 2038 | struct dw_mci_board *pdata; |
| 2036 | struct device *dev = host->dev; | 2039 | struct device *dev = host->dev; |
| 2037 | struct device_node *np = dev->of_node; | 2040 | struct device_node *np = dev->of_node; |
| 2041 | struct dw_mci_drv_data *drv_data = host->drv_data; | ||
| 2038 | int idx, ret; | 2042 | int idx, ret; |
| 2039 | 2043 | ||
| 2040 | pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); | 2044 | pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); |
| @@ -2062,8 +2066,8 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) | |||
| 2062 | 2066 | ||
| 2063 | of_property_read_u32(np, "card-detect-delay", &pdata->detect_delay_ms); | 2067 | of_property_read_u32(np, "card-detect-delay", &pdata->detect_delay_ms); |
| 2064 | 2068 | ||
| 2065 | if (host->drv_data->parse_dt) { | 2069 | if (drv_data && drv_data->parse_dt) { |
| 2066 | ret = host->drv_data->parse_dt(host); | 2070 | ret = drv_data->parse_dt(host); |
| 2067 | if (ret) | 2071 | if (ret) |
| 2068 | return ERR_PTR(ret); | 2072 | return ERR_PTR(ret); |
| 2069 | } | 2073 | } |
| @@ -2080,6 +2084,7 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) | |||
| 2080 | 2084 | ||
| 2081 | int dw_mci_probe(struct dw_mci *host) | 2085 | int dw_mci_probe(struct dw_mci *host) |
| 2082 | { | 2086 | { |
| 2087 | struct dw_mci_drv_data *drv_data = host->drv_data; | ||
| 2083 | int width, i, ret = 0; | 2088 | int width, i, ret = 0; |
| 2084 | u32 fifo_size; | 2089 | u32 fifo_size; |
| 2085 | int init_slots = 0; | 2090 | int init_slots = 0; |
| @@ -2127,8 +2132,8 @@ int dw_mci_probe(struct dw_mci *host) | |||
| 2127 | else | 2132 | else |
| 2128 | host->bus_hz = clk_get_rate(host->ciu_clk); | 2133 | host->bus_hz = clk_get_rate(host->ciu_clk); |
| 2129 | 2134 | ||
| 2130 | if (host->drv_data->setup_clock) { | 2135 | if (drv_data && drv_data->setup_clock) { |
| 2131 | ret = host->drv_data->setup_clock(host); | 2136 | ret = drv_data->setup_clock(host); |
| 2132 | if (ret) { | 2137 | if (ret) { |
| 2133 | dev_err(host->dev, | 2138 | dev_err(host->dev, |
| 2134 | "implementation specific clock setup failed\n"); | 2139 | "implementation specific clock setup failed\n"); |
| @@ -2228,6 +2233,21 @@ int dw_mci_probe(struct dw_mci *host) | |||
| 2228 | else | 2233 | else |
| 2229 | host->num_slots = ((mci_readl(host, HCON) >> 1) & 0x1F) + 1; | 2234 | host->num_slots = ((mci_readl(host, HCON) >> 1) & 0x1F) + 1; |
| 2230 | 2235 | ||
| 2236 | /* | ||
| 2237 | * Enable interrupts for command done, data over, data empty, card det, | ||
| 2238 | * receive ready and error such as transmit, receive timeout, crc error | ||
| 2239 | */ | ||
| 2240 | mci_writel(host, RINTSTS, 0xFFFFFFFF); | ||
| 2241 | mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER | | ||
| 2242 | SDMMC_INT_TXDR | SDMMC_INT_RXDR | | ||
| 2243 | DW_MCI_ERROR_FLAGS | SDMMC_INT_CD); | ||
| 2244 | mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci interrupt */ | ||
| 2245 | |||
| 2246 | dev_info(host->dev, "DW MMC controller at irq %d, " | ||
| 2247 | "%d bit host data width, " | ||
| 2248 | "%u deep fifo\n", | ||
| 2249 | host->irq, width, fifo_size); | ||
| 2250 | |||
| 2231 | /* We need at least one slot to succeed */ | 2251 | /* We need at least one slot to succeed */ |
| 2232 | for (i = 0; i < host->num_slots; i++) { | 2252 | for (i = 0; i < host->num_slots; i++) { |
| 2233 | ret = dw_mci_init_slot(host, i); | 2253 | ret = dw_mci_init_slot(host, i); |
| @@ -2257,20 +2277,6 @@ int dw_mci_probe(struct dw_mci *host) | |||
| 2257 | else | 2277 | else |
| 2258 | host->data_offset = DATA_240A_OFFSET; | 2278 | host->data_offset = DATA_240A_OFFSET; |
| 2259 | 2279 | ||
| 2260 | /* | ||
| 2261 | * Enable interrupts for command done, data over, data empty, card det, | ||
| 2262 | * receive ready and error such as transmit, receive timeout, crc error | ||
| 2263 | */ | ||
| 2264 | mci_writel(host, RINTSTS, 0xFFFFFFFF); | ||
| 2265 | mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER | | ||
| 2266 | SDMMC_INT_TXDR | SDMMC_INT_RXDR | | ||
| 2267 | DW_MCI_ERROR_FLAGS | SDMMC_INT_CD); | ||
| 2268 | mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci interrupt */ | ||
| 2269 | |||
| 2270 | dev_info(host->dev, "DW MMC controller at irq %d, " | ||
| 2271 | "%d bit host data width, " | ||
| 2272 | "%u deep fifo\n", | ||
| 2273 | host->irq, width, fifo_size); | ||
| 2274 | if (host->quirks & DW_MCI_QUIRK_IDMAC_DTO) | 2280 | if (host->quirks & DW_MCI_QUIRK_IDMAC_DTO) |
| 2275 | dev_info(host->dev, "Internal DMAC interrupt fix enabled.\n"); | 2281 | dev_info(host->dev, "Internal DMAC interrupt fix enabled.\n"); |
| 2276 | 2282 | ||
diff --git a/drivers/mmc/host/mxcmmc.c b/drivers/mmc/host/mxcmmc.c index 565c2e4fac75..6290b7f1ccfe 100644 --- a/drivers/mmc/host/mxcmmc.c +++ b/drivers/mmc/host/mxcmmc.c | |||
| @@ -1134,4 +1134,4 @@ module_platform_driver(mxcmci_driver); | |||
| 1134 | MODULE_DESCRIPTION("i.MX Multimedia Card Interface Driver"); | 1134 | MODULE_DESCRIPTION("i.MX Multimedia Card Interface Driver"); |
| 1135 | MODULE_AUTHOR("Sascha Hauer, Pengutronix"); | 1135 | MODULE_AUTHOR("Sascha Hauer, Pengutronix"); |
| 1136 | MODULE_LICENSE("GPL"); | 1136 | MODULE_LICENSE("GPL"); |
| 1137 | MODULE_ALIAS("platform:imx-mmc"); | 1137 | MODULE_ALIAS("platform:mxc-mmc"); |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 54bfd0cc106b..fedd258cc4ea 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -178,7 +178,8 @@ struct omap_hsmmc_host { | |||
| 178 | 178 | ||
| 179 | static int omap_hsmmc_card_detect(struct device *dev, int slot) | 179 | static int omap_hsmmc_card_detect(struct device *dev, int slot) |
| 180 | { | 180 | { |
| 181 | struct omap_mmc_platform_data *mmc = dev->platform_data; | 181 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
| 182 | struct omap_mmc_platform_data *mmc = host->pdata; | ||
| 182 | 183 | ||
| 183 | /* NOTE: assumes card detect signal is active-low */ | 184 | /* NOTE: assumes card detect signal is active-low */ |
| 184 | return !gpio_get_value_cansleep(mmc->slots[0].switch_pin); | 185 | return !gpio_get_value_cansleep(mmc->slots[0].switch_pin); |
| @@ -186,7 +187,8 @@ static int omap_hsmmc_card_detect(struct device *dev, int slot) | |||
| 186 | 187 | ||
| 187 | static int omap_hsmmc_get_wp(struct device *dev, int slot) | 188 | static int omap_hsmmc_get_wp(struct device *dev, int slot) |
| 188 | { | 189 | { |
| 189 | struct omap_mmc_platform_data *mmc = dev->platform_data; | 190 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
| 191 | struct omap_mmc_platform_data *mmc = host->pdata; | ||
| 190 | 192 | ||
| 191 | /* NOTE: assumes write protect signal is active-high */ | 193 | /* NOTE: assumes write protect signal is active-high */ |
| 192 | return gpio_get_value_cansleep(mmc->slots[0].gpio_wp); | 194 | return gpio_get_value_cansleep(mmc->slots[0].gpio_wp); |
| @@ -194,7 +196,8 @@ static int omap_hsmmc_get_wp(struct device *dev, int slot) | |||
| 194 | 196 | ||
| 195 | static int omap_hsmmc_get_cover_state(struct device *dev, int slot) | 197 | static int omap_hsmmc_get_cover_state(struct device *dev, int slot) |
| 196 | { | 198 | { |
| 197 | struct omap_mmc_platform_data *mmc = dev->platform_data; | 199 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
| 200 | struct omap_mmc_platform_data *mmc = host->pdata; | ||
| 198 | 201 | ||
| 199 | /* NOTE: assumes card detect signal is active-low */ | 202 | /* NOTE: assumes card detect signal is active-low */ |
| 200 | return !gpio_get_value_cansleep(mmc->slots[0].switch_pin); | 203 | return !gpio_get_value_cansleep(mmc->slots[0].switch_pin); |
| @@ -204,7 +207,8 @@ static int omap_hsmmc_get_cover_state(struct device *dev, int slot) | |||
| 204 | 207 | ||
| 205 | static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot) | 208 | static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot) |
| 206 | { | 209 | { |
| 207 | struct omap_mmc_platform_data *mmc = dev->platform_data; | 210 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
| 211 | struct omap_mmc_platform_data *mmc = host->pdata; | ||
| 208 | 212 | ||
| 209 | disable_irq(mmc->slots[0].card_detect_irq); | 213 | disable_irq(mmc->slots[0].card_detect_irq); |
| 210 | return 0; | 214 | return 0; |
| @@ -212,7 +216,8 @@ static int omap_hsmmc_suspend_cdirq(struct device *dev, int slot) | |||
| 212 | 216 | ||
| 213 | static int omap_hsmmc_resume_cdirq(struct device *dev, int slot) | 217 | static int omap_hsmmc_resume_cdirq(struct device *dev, int slot) |
| 214 | { | 218 | { |
| 215 | struct omap_mmc_platform_data *mmc = dev->platform_data; | 219 | struct omap_hsmmc_host *host = dev_get_drvdata(dev); |
| 220 | struct omap_mmc_platform_data *mmc = host->pdata; | ||
| 216 | 221 | ||
| 217 | enable_irq(mmc->slots[0].card_detect_irq); | 222 | enable_irq(mmc->slots[0].card_detect_irq); |
| 218 | return 0; | 223 | return 0; |
| @@ -2009,9 +2014,9 @@ static int __devexit omap_hsmmc_remove(struct platform_device *pdev) | |||
| 2009 | clk_put(host->dbclk); | 2014 | clk_put(host->dbclk); |
| 2010 | } | 2015 | } |
| 2011 | 2016 | ||
| 2012 | mmc_free_host(host->mmc); | 2017 | omap_hsmmc_gpio_free(host->pdata); |
| 2013 | iounmap(host->base); | 2018 | iounmap(host->base); |
| 2014 | omap_hsmmc_gpio_free(pdev->dev.platform_data); | 2019 | mmc_free_host(host->mmc); |
| 2015 | 2020 | ||
| 2016 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2021 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 2017 | if (res) | 2022 | if (res) |
diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c index 90140eb03e36..8fd50a211037 100644 --- a/drivers/mmc/host/sdhci-dove.c +++ b/drivers/mmc/host/sdhci-dove.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include <linux/err.h> | ||
| 22 | #include <linux/io.h> | 23 | #include <linux/io.h> |
| 23 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
| 24 | #include <linux/err.h> | 25 | #include <linux/err.h> |
| @@ -84,30 +85,32 @@ static int __devinit sdhci_dove_probe(struct platform_device *pdev) | |||
| 84 | struct sdhci_dove_priv *priv; | 85 | struct sdhci_dove_priv *priv; |
| 85 | int ret; | 86 | int ret; |
| 86 | 87 | ||
| 87 | ret = sdhci_pltfm_register(pdev, &sdhci_dove_pdata); | ||
| 88 | if (ret) | ||
| 89 | goto sdhci_dove_register_fail; | ||
| 90 | |||
| 91 | priv = devm_kzalloc(&pdev->dev, sizeof(struct sdhci_dove_priv), | 88 | priv = devm_kzalloc(&pdev->dev, sizeof(struct sdhci_dove_priv), |
| 92 | GFP_KERNEL); | 89 | GFP_KERNEL); |
| 93 | if (!priv) { | 90 | if (!priv) { |
| 94 | dev_err(&pdev->dev, "unable to allocate private data"); | 91 | dev_err(&pdev->dev, "unable to allocate private data"); |
| 95 | ret = -ENOMEM; | 92 | return -ENOMEM; |
| 96 | goto sdhci_dove_allocate_fail; | ||
| 97 | } | 93 | } |
| 98 | 94 | ||
| 95 | priv->clk = clk_get(&pdev->dev, NULL); | ||
| 96 | if (!IS_ERR(priv->clk)) | ||
| 97 | clk_prepare_enable(priv->clk); | ||
| 98 | |||
| 99 | ret = sdhci_pltfm_register(pdev, &sdhci_dove_pdata); | ||
| 100 | if (ret) | ||
| 101 | goto sdhci_dove_register_fail; | ||
| 102 | |||
| 99 | host = platform_get_drvdata(pdev); | 103 | host = platform_get_drvdata(pdev); |
| 100 | pltfm_host = sdhci_priv(host); | 104 | pltfm_host = sdhci_priv(host); |
| 101 | pltfm_host->priv = priv; | 105 | pltfm_host->priv = priv; |
| 102 | 106 | ||
| 103 | priv->clk = clk_get(&pdev->dev, NULL); | ||
| 104 | if (!IS_ERR(priv->clk)) | ||
| 105 | clk_prepare_enable(priv->clk); | ||
| 106 | return 0; | 107 | return 0; |
| 107 | 108 | ||
| 108 | sdhci_dove_allocate_fail: | ||
| 109 | sdhci_pltfm_unregister(pdev); | ||
| 110 | sdhci_dove_register_fail: | 109 | sdhci_dove_register_fail: |
| 110 | if (!IS_ERR(priv->clk)) { | ||
| 111 | clk_disable_unprepare(priv->clk); | ||
| 112 | clk_put(priv->clk); | ||
| 113 | } | ||
| 111 | return ret; | 114 | return ret; |
| 112 | } | 115 | } |
| 113 | 116 | ||
| @@ -117,14 +120,13 @@ static int __devexit sdhci_dove_remove(struct platform_device *pdev) | |||
| 117 | struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); | 120 | struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); |
| 118 | struct sdhci_dove_priv *priv = pltfm_host->priv; | 121 | struct sdhci_dove_priv *priv = pltfm_host->priv; |
| 119 | 122 | ||
| 120 | if (priv->clk) { | 123 | sdhci_pltfm_unregister(pdev); |
| 121 | if (!IS_ERR(priv->clk)) { | 124 | |
| 122 | clk_disable_unprepare(priv->clk); | 125 | if (!IS_ERR(priv->clk)) { |
| 123 | clk_put(priv->clk); | 126 | clk_disable_unprepare(priv->clk); |
| 124 | } | 127 | clk_put(priv->clk); |
| 125 | devm_kfree(&pdev->dev, priv->clk); | ||
| 126 | } | 128 | } |
| 127 | return sdhci_pltfm_unregister(pdev); | 129 | return 0; |
| 128 | } | 130 | } |
| 129 | 131 | ||
| 130 | static const struct of_device_id sdhci_dove_of_match_table[] __devinitdata = { | 132 | static const struct of_device_id sdhci_dove_of_match_table[] __devinitdata = { |
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c index ae5fcbfa1eef..63d219f57cae 100644 --- a/drivers/mmc/host/sdhci-of-esdhc.c +++ b/drivers/mmc/host/sdhci-of-esdhc.c | |||
| @@ -169,6 +169,16 @@ static void esdhc_of_resume(struct sdhci_host *host) | |||
| 169 | } | 169 | } |
| 170 | #endif | 170 | #endif |
| 171 | 171 | ||
| 172 | static void esdhc_of_platform_init(struct sdhci_host *host) | ||
| 173 | { | ||
| 174 | u32 vvn; | ||
| 175 | |||
| 176 | vvn = in_be32(host->ioaddr + SDHCI_SLOT_INT_STATUS); | ||
| 177 | vvn = (vvn & SDHCI_VENDOR_VER_MASK) >> SDHCI_VENDOR_VER_SHIFT; | ||
| 178 | if (vvn == VENDOR_V_22) | ||
| 179 | host->quirks2 |= SDHCI_QUIRK2_HOST_NO_CMD23; | ||
| 180 | } | ||
| 181 | |||
| 172 | static struct sdhci_ops sdhci_esdhc_ops = { | 182 | static struct sdhci_ops sdhci_esdhc_ops = { |
| 173 | .read_l = esdhc_readl, | 183 | .read_l = esdhc_readl, |
| 174 | .read_w = esdhc_readw, | 184 | .read_w = esdhc_readw, |
| @@ -180,6 +190,7 @@ static struct sdhci_ops sdhci_esdhc_ops = { | |||
| 180 | .enable_dma = esdhc_of_enable_dma, | 190 | .enable_dma = esdhc_of_enable_dma, |
| 181 | .get_max_clock = esdhc_of_get_max_clock, | 191 | .get_max_clock = esdhc_of_get_max_clock, |
| 182 | .get_min_clock = esdhc_of_get_min_clock, | 192 | .get_min_clock = esdhc_of_get_min_clock, |
| 193 | .platform_init = esdhc_of_platform_init, | ||
| 183 | #ifdef CONFIG_PM | 194 | #ifdef CONFIG_PM |
| 184 | .platform_suspend = esdhc_of_suspend, | 195 | .platform_suspend = esdhc_of_suspend, |
| 185 | .platform_resume = esdhc_of_resume, | 196 | .platform_resume = esdhc_of_resume, |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index 4bb74b042a06..04936f353ced 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
| @@ -1196,7 +1196,7 @@ static struct sdhci_pci_slot * __devinit sdhci_pci_probe_slot( | |||
| 1196 | return ERR_PTR(-ENODEV); | 1196 | return ERR_PTR(-ENODEV); |
| 1197 | } | 1197 | } |
| 1198 | 1198 | ||
| 1199 | if (pci_resource_len(pdev, bar) != 0x100) { | 1199 | if (pci_resource_len(pdev, bar) < 0x100) { |
| 1200 | dev_err(&pdev->dev, "Invalid iomem size. You may " | 1200 | dev_err(&pdev->dev, "Invalid iomem size. You may " |
| 1201 | "experience problems.\n"); | 1201 | "experience problems.\n"); |
| 1202 | } | 1202 | } |
diff --git a/drivers/mmc/host/sdhci-pltfm.c b/drivers/mmc/host/sdhci-pltfm.c index 65551a9709cc..27164457f861 100644 --- a/drivers/mmc/host/sdhci-pltfm.c +++ b/drivers/mmc/host/sdhci-pltfm.c | |||
| @@ -150,6 +150,13 @@ struct sdhci_host *sdhci_pltfm_init(struct platform_device *pdev, | |||
| 150 | goto err_remap; | 150 | goto err_remap; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /* | ||
| 154 | * Some platforms need to probe the controller to be able to | ||
| 155 | * determine which caps should be used. | ||
| 156 | */ | ||
| 157 | if (host->ops && host->ops->platform_init) | ||
| 158 | host->ops->platform_init(host); | ||
| 159 | |||
| 153 | platform_set_drvdata(pdev, host); | 160 | platform_set_drvdata(pdev, host); |
| 154 | 161 | ||
| 155 | return host; | 162 | return host; |
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index 2903949594c6..a54dd5d7a5f9 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
| @@ -211,8 +211,8 @@ static void sdhci_s3c_set_clock(struct sdhci_host *host, unsigned int clock) | |||
| 211 | if (ourhost->cur_clk != best_src) { | 211 | if (ourhost->cur_clk != best_src) { |
| 212 | struct clk *clk = ourhost->clk_bus[best_src]; | 212 | struct clk *clk = ourhost->clk_bus[best_src]; |
| 213 | 213 | ||
| 214 | clk_enable(clk); | 214 | clk_prepare_enable(clk); |
| 215 | clk_disable(ourhost->clk_bus[ourhost->cur_clk]); | 215 | clk_disable_unprepare(ourhost->clk_bus[ourhost->cur_clk]); |
| 216 | 216 | ||
| 217 | /* turn clock off to card before changing clock source */ | 217 | /* turn clock off to card before changing clock source */ |
| 218 | writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL); | 218 | writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL); |
| @@ -607,7 +607,7 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 607 | } | 607 | } |
| 608 | 608 | ||
| 609 | /* enable the local io clock and keep it running for the moment. */ | 609 | /* enable the local io clock and keep it running for the moment. */ |
| 610 | clk_enable(sc->clk_io); | 610 | clk_prepare_enable(sc->clk_io); |
| 611 | 611 | ||
| 612 | for (clks = 0, ptr = 0; ptr < MAX_BUS_CLK; ptr++) { | 612 | for (clks = 0, ptr = 0; ptr < MAX_BUS_CLK; ptr++) { |
| 613 | struct clk *clk; | 613 | struct clk *clk; |
| @@ -638,7 +638,7 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | #ifndef CONFIG_PM_RUNTIME | 640 | #ifndef CONFIG_PM_RUNTIME |
| 641 | clk_enable(sc->clk_bus[sc->cur_clk]); | 641 | clk_prepare_enable(sc->clk_bus[sc->cur_clk]); |
| 642 | #endif | 642 | #endif |
| 643 | 643 | ||
| 644 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 644 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -747,13 +747,14 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 747 | sdhci_s3c_setup_card_detect_gpio(sc); | 747 | sdhci_s3c_setup_card_detect_gpio(sc); |
| 748 | 748 | ||
| 749 | #ifdef CONFIG_PM_RUNTIME | 749 | #ifdef CONFIG_PM_RUNTIME |
| 750 | clk_disable(sc->clk_io); | 750 | if (pdata->cd_type != S3C_SDHCI_CD_INTERNAL) |
| 751 | clk_disable_unprepare(sc->clk_io); | ||
| 751 | #endif | 752 | #endif |
| 752 | return 0; | 753 | return 0; |
| 753 | 754 | ||
| 754 | err_req_regs: | 755 | err_req_regs: |
| 755 | #ifndef CONFIG_PM_RUNTIME | 756 | #ifndef CONFIG_PM_RUNTIME |
| 756 | clk_disable(sc->clk_bus[sc->cur_clk]); | 757 | clk_disable_unprepare(sc->clk_bus[sc->cur_clk]); |
| 757 | #endif | 758 | #endif |
| 758 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { | 759 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { |
| 759 | if (sc->clk_bus[ptr]) { | 760 | if (sc->clk_bus[ptr]) { |
| @@ -762,7 +763,7 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | |||
| 762 | } | 763 | } |
| 763 | 764 | ||
| 764 | err_no_busclks: | 765 | err_no_busclks: |
| 765 | clk_disable(sc->clk_io); | 766 | clk_disable_unprepare(sc->clk_io); |
| 766 | clk_put(sc->clk_io); | 767 | clk_put(sc->clk_io); |
| 767 | 768 | ||
| 768 | err_io_clk: | 769 | err_io_clk: |
| @@ -794,7 +795,8 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
| 794 | gpio_free(sc->ext_cd_gpio); | 795 | gpio_free(sc->ext_cd_gpio); |
| 795 | 796 | ||
| 796 | #ifdef CONFIG_PM_RUNTIME | 797 | #ifdef CONFIG_PM_RUNTIME |
| 797 | clk_enable(sc->clk_io); | 798 | if (pdata->cd_type != S3C_SDHCI_CD_INTERNAL) |
| 799 | clk_prepare_enable(sc->clk_io); | ||
| 798 | #endif | 800 | #endif |
| 799 | sdhci_remove_host(host, 1); | 801 | sdhci_remove_host(host, 1); |
| 800 | 802 | ||
| @@ -802,14 +804,14 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | |||
| 802 | pm_runtime_disable(&pdev->dev); | 804 | pm_runtime_disable(&pdev->dev); |
| 803 | 805 | ||
| 804 | #ifndef CONFIG_PM_RUNTIME | 806 | #ifndef CONFIG_PM_RUNTIME |
| 805 | clk_disable(sc->clk_bus[sc->cur_clk]); | 807 | clk_disable_unprepare(sc->clk_bus[sc->cur_clk]); |
| 806 | #endif | 808 | #endif |
| 807 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { | 809 | for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) { |
| 808 | if (sc->clk_bus[ptr]) { | 810 | if (sc->clk_bus[ptr]) { |
| 809 | clk_put(sc->clk_bus[ptr]); | 811 | clk_put(sc->clk_bus[ptr]); |
| 810 | } | 812 | } |
| 811 | } | 813 | } |
| 812 | clk_disable(sc->clk_io); | 814 | clk_disable_unprepare(sc->clk_io); |
| 813 | clk_put(sc->clk_io); | 815 | clk_put(sc->clk_io); |
| 814 | 816 | ||
| 815 | if (pdev->dev.of_node) { | 817 | if (pdev->dev.of_node) { |
| @@ -849,8 +851,8 @@ static int sdhci_s3c_runtime_suspend(struct device *dev) | |||
| 849 | 851 | ||
| 850 | ret = sdhci_runtime_suspend_host(host); | 852 | ret = sdhci_runtime_suspend_host(host); |
| 851 | 853 | ||
| 852 | clk_disable(ourhost->clk_bus[ourhost->cur_clk]); | 854 | clk_disable_unprepare(ourhost->clk_bus[ourhost->cur_clk]); |
| 853 | clk_disable(busclk); | 855 | clk_disable_unprepare(busclk); |
| 854 | return ret; | 856 | return ret; |
| 855 | } | 857 | } |
| 856 | 858 | ||
| @@ -861,8 +863,8 @@ static int sdhci_s3c_runtime_resume(struct device *dev) | |||
| 861 | struct clk *busclk = ourhost->clk_io; | 863 | struct clk *busclk = ourhost->clk_io; |
| 862 | int ret; | 864 | int ret; |
| 863 | 865 | ||
| 864 | clk_enable(busclk); | 866 | clk_prepare_enable(busclk); |
| 865 | clk_enable(ourhost->clk_bus[ourhost->cur_clk]); | 867 | clk_prepare_enable(ourhost->clk_bus[ourhost->cur_clk]); |
| 866 | ret = sdhci_runtime_resume_host(host); | 868 | ret = sdhci_runtime_resume_host(host); |
| 867 | return ret; | 869 | return ret; |
| 868 | } | 870 | } |
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 7922adb42386..c7851c0aabce 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c | |||
| @@ -1315,16 +1315,19 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
| 1315 | */ | 1315 | */ |
| 1316 | if ((host->flags & SDHCI_NEEDS_RETUNING) && | 1316 | if ((host->flags & SDHCI_NEEDS_RETUNING) && |
| 1317 | !(present_state & (SDHCI_DOING_WRITE | SDHCI_DOING_READ))) { | 1317 | !(present_state & (SDHCI_DOING_WRITE | SDHCI_DOING_READ))) { |
| 1318 | /* eMMC uses cmd21 while sd and sdio use cmd19 */ | 1318 | if (mmc->card) { |
| 1319 | tuning_opcode = mmc->card->type == MMC_TYPE_MMC ? | 1319 | /* eMMC uses cmd21 but sd and sdio use cmd19 */ |
| 1320 | MMC_SEND_TUNING_BLOCK_HS200 : | 1320 | tuning_opcode = |
| 1321 | MMC_SEND_TUNING_BLOCK; | 1321 | mmc->card->type == MMC_TYPE_MMC ? |
| 1322 | spin_unlock_irqrestore(&host->lock, flags); | 1322 | MMC_SEND_TUNING_BLOCK_HS200 : |
| 1323 | sdhci_execute_tuning(mmc, tuning_opcode); | 1323 | MMC_SEND_TUNING_BLOCK; |
| 1324 | spin_lock_irqsave(&host->lock, flags); | 1324 | spin_unlock_irqrestore(&host->lock, flags); |
| 1325 | 1325 | sdhci_execute_tuning(mmc, tuning_opcode); | |
| 1326 | /* Restore original mmc_request structure */ | 1326 | spin_lock_irqsave(&host->lock, flags); |
| 1327 | host->mrq = mrq; | 1327 | |
| 1328 | /* Restore original mmc_request structure */ | ||
| 1329 | host->mrq = mrq; | ||
| 1330 | } | ||
| 1328 | } | 1331 | } |
| 1329 | 1332 | ||
| 1330 | if (mrq->sbc && !(host->flags & SDHCI_AUTO_CMD23)) | 1333 | if (mrq->sbc && !(host->flags & SDHCI_AUTO_CMD23)) |
| @@ -2837,6 +2840,9 @@ int sdhci_add_host(struct sdhci_host *host) | |||
| 2837 | if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA)) | 2840 | if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA)) |
| 2838 | mmc->caps |= MMC_CAP_4_BIT_DATA; | 2841 | mmc->caps |= MMC_CAP_4_BIT_DATA; |
| 2839 | 2842 | ||
| 2843 | if (host->quirks2 & SDHCI_QUIRK2_HOST_NO_CMD23) | ||
| 2844 | mmc->caps &= ~MMC_CAP_CMD23; | ||
| 2845 | |||
| 2840 | if (caps[0] & SDHCI_CAN_DO_HISPD) | 2846 | if (caps[0] & SDHCI_CAN_DO_HISPD) |
| 2841 | mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; | 2847 | mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED; |
| 2842 | 2848 | ||
| @@ -2846,9 +2852,12 @@ int sdhci_add_host(struct sdhci_host *host) | |||
| 2846 | 2852 | ||
| 2847 | /* If vqmmc regulator and no 1.8V signalling, then there's no UHS */ | 2853 | /* If vqmmc regulator and no 1.8V signalling, then there's no UHS */ |
| 2848 | host->vqmmc = regulator_get(mmc_dev(mmc), "vqmmc"); | 2854 | host->vqmmc = regulator_get(mmc_dev(mmc), "vqmmc"); |
| 2849 | if (IS_ERR(host->vqmmc)) { | 2855 | if (IS_ERR_OR_NULL(host->vqmmc)) { |
| 2850 | pr_info("%s: no vqmmc regulator found\n", mmc_hostname(mmc)); | 2856 | if (PTR_ERR(host->vqmmc) < 0) { |
| 2851 | host->vqmmc = NULL; | 2857 | pr_info("%s: no vqmmc regulator found\n", |
| 2858 | mmc_hostname(mmc)); | ||
| 2859 | host->vqmmc = NULL; | ||
| 2860 | } | ||
| 2852 | } | 2861 | } |
| 2853 | else if (regulator_is_supported_voltage(host->vqmmc, 1800000, 1800000)) | 2862 | else if (regulator_is_supported_voltage(host->vqmmc, 1800000, 1800000)) |
| 2854 | regulator_enable(host->vqmmc); | 2863 | regulator_enable(host->vqmmc); |
| @@ -2904,9 +2913,12 @@ int sdhci_add_host(struct sdhci_host *host) | |||
| 2904 | ocr_avail = 0; | 2913 | ocr_avail = 0; |
| 2905 | 2914 | ||
| 2906 | host->vmmc = regulator_get(mmc_dev(mmc), "vmmc"); | 2915 | host->vmmc = regulator_get(mmc_dev(mmc), "vmmc"); |
| 2907 | if (IS_ERR(host->vmmc)) { | 2916 | if (IS_ERR_OR_NULL(host->vmmc)) { |
| 2908 | pr_info("%s: no vmmc regulator found\n", mmc_hostname(mmc)); | 2917 | if (PTR_ERR(host->vmmc) < 0) { |
| 2909 | host->vmmc = NULL; | 2918 | pr_info("%s: no vmmc regulator found\n", |
| 2919 | mmc_hostname(mmc)); | ||
| 2920 | host->vmmc = NULL; | ||
| 2921 | } | ||
| 2910 | } else | 2922 | } else |
| 2911 | regulator_enable(host->vmmc); | 2923 | regulator_enable(host->vmmc); |
| 2912 | 2924 | ||
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 97653ea8942b..71a4a7ed46c5 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
| @@ -278,6 +278,7 @@ struct sdhci_ops { | |||
| 278 | void (*hw_reset)(struct sdhci_host *host); | 278 | void (*hw_reset)(struct sdhci_host *host); |
| 279 | void (*platform_suspend)(struct sdhci_host *host); | 279 | void (*platform_suspend)(struct sdhci_host *host); |
| 280 | void (*platform_resume)(struct sdhci_host *host); | 280 | void (*platform_resume)(struct sdhci_host *host); |
| 281 | void (*platform_init)(struct sdhci_host *host); | ||
| 281 | }; | 282 | }; |
| 282 | 283 | ||
| 283 | #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS | 284 | #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS |
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index 11d2bc3b51d5..d25bc97dc5c6 100644 --- a/drivers/mmc/host/sh_mmcif.c +++ b/drivers/mmc/host/sh_mmcif.c | |||
| @@ -1466,9 +1466,9 @@ static int __devexit sh_mmcif_remove(struct platform_device *pdev) | |||
| 1466 | 1466 | ||
| 1467 | platform_set_drvdata(pdev, NULL); | 1467 | platform_set_drvdata(pdev, NULL); |
| 1468 | 1468 | ||
| 1469 | clk_disable(host->hclk); | ||
| 1469 | mmc_free_host(host->mmc); | 1470 | mmc_free_host(host->mmc); |
| 1470 | pm_runtime_put_sync(&pdev->dev); | 1471 | pm_runtime_put_sync(&pdev->dev); |
| 1471 | clk_disable(host->hclk); | ||
| 1472 | pm_runtime_disable(&pdev->dev); | 1472 | pm_runtime_disable(&pdev->dev); |
| 1473 | 1473 | ||
| 1474 | return 0; | 1474 | return 0; |
diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 7c6a1139d8fa..96531664a061 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h | |||
| @@ -137,7 +137,7 @@ struct dw_mci { | |||
| 137 | 137 | ||
| 138 | dma_addr_t sg_dma; | 138 | dma_addr_t sg_dma; |
| 139 | void *sg_cpu; | 139 | void *sg_cpu; |
| 140 | struct dw_mci_dma_ops *dma_ops; | 140 | const struct dw_mci_dma_ops *dma_ops; |
| 141 | #ifdef CONFIG_MMC_DW_IDMAC | 141 | #ifdef CONFIG_MMC_DW_IDMAC |
| 142 | unsigned int ring_size; | 142 | unsigned int ring_size; |
| 143 | #else | 143 | #else |
| @@ -162,7 +162,7 @@ struct dw_mci { | |||
| 162 | u16 data_offset; | 162 | u16 data_offset; |
| 163 | struct device *dev; | 163 | struct device *dev; |
| 164 | struct dw_mci_board *pdata; | 164 | struct dw_mci_board *pdata; |
| 165 | struct dw_mci_drv_data *drv_data; | 165 | const struct dw_mci_drv_data *drv_data; |
| 166 | void *priv; | 166 | void *priv; |
| 167 | struct clk *biu_clk; | 167 | struct clk *biu_clk; |
| 168 | struct clk *ciu_clk; | 168 | struct clk *ciu_clk; |
| @@ -186,7 +186,7 @@ struct dw_mci { | |||
| 186 | 186 | ||
| 187 | struct regulator *vmmc; /* Power regulator */ | 187 | struct regulator *vmmc; /* Power regulator */ |
| 188 | unsigned long irq_flags; /* IRQ flags */ | 188 | unsigned long irq_flags; /* IRQ flags */ |
| 189 | unsigned int irq; | 189 | int irq; |
| 190 | }; | 190 | }; |
| 191 | 191 | ||
| 192 | /* DMA ops for Internal/External DMAC interface */ | 192 | /* DMA ops for Internal/External DMAC interface */ |
diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index fa8529a859b8..1edcb4dad8c4 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h | |||
| @@ -91,6 +91,7 @@ struct sdhci_host { | |||
| 91 | unsigned int quirks2; /* More deviations from spec. */ | 91 | unsigned int quirks2; /* More deviations from spec. */ |
| 92 | 92 | ||
| 93 | #define SDHCI_QUIRK2_HOST_OFF_CARD_ON (1<<0) | 93 | #define SDHCI_QUIRK2_HOST_OFF_CARD_ON (1<<0) |
| 94 | #define SDHCI_QUIRK2_HOST_NO_CMD23 (1<<1) | ||
| 94 | 95 | ||
| 95 | int irq; /* Device IRQ */ | 96 | int irq; /* Device IRQ */ |
| 96 | void __iomem *ioaddr; /* Mapped address */ | 97 | void __iomem *ioaddr; /* Mapped address */ |
