Commit 550cf00d authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mmc-fixes-for-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc

MMC fixes from Chris Ball for 3.3:
 - atmel-mci: oops fix against regression introduced in 3.2
 - core: power saving regression fix against 3.3-rc1
 - core: suspend/resume fix for UHS-I cards
 - esdhc-imx: MMC card regression fix against 3.0
 - mmci: oops fix for ARM systems with large (64k) pages
 - MAINTAINERS update for atmel-mci.

* tag 'mmc-fixes-for-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc:
  mmc: core: Fixup suspend/resume issues for UHS-I cards
  mmc: mmci: reduce max_blk_count to avoid overflowing max_req_size
  mmc: sdhci-esdhc-imx: fix for mmc cards on i.MX5
  mmc: core: fix regression: set default clock gating delay to 0
  MAINTAINERS: hand over atmel-mci (sd/mmc interface)
  mmc: atmel-mci: don't use dma features when using DMA with no chan available
parents 5d329e24 e7747475
...@@ -1310,7 +1310,7 @@ F: drivers/atm/ ...@@ -1310,7 +1310,7 @@ F: drivers/atm/
F: include/linux/atm* F: include/linux/atm*
ATMEL AT91 MCI DRIVER ATMEL AT91 MCI DRIVER
M: Nicolas Ferre <nicolas.ferre@atmel.com> M: Ludovic Desroches <ludovic.desroches@atmel.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
W: http://www.atmel.com/products/AT91/ W: http://www.atmel.com/products/AT91/
W: http://www.at91.com/ W: http://www.at91.com/
...@@ -1318,7 +1318,7 @@ S: Maintained ...@@ -1318,7 +1318,7 @@ S: Maintained
F: drivers/mmc/host/at91_mci.c F: drivers/mmc/host/at91_mci.c
ATMEL AT91 / AT32 MCI DRIVER ATMEL AT91 / AT32 MCI DRIVER
M: Nicolas Ferre <nicolas.ferre@atmel.com> M: Ludovic Desroches <ludovic.desroches@atmel.com>
S: Maintained S: Maintained
F: drivers/mmc/host/atmel-mci.c F: drivers/mmc/host/atmel-mci.c
F: drivers/mmc/host/atmel-mci-regs.h F: drivers/mmc/host/atmel-mci-regs.h
......
...@@ -2068,6 +2068,9 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq) ...@@ -2068,6 +2068,9 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq)
*/ */
mmc_hw_reset_for_init(host); mmc_hw_reset_for_init(host);
/* Initialization should be done at 3.3 V I/O voltage. */
mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
/* /*
* sdio_reset sends CMD52 to reset card. Since we do not know * sdio_reset sends CMD52 to reset card. Since we do not know
* if the card is being re-initialized, just send it. CMD52 * if the card is being re-initialized, just send it. CMD52
......
...@@ -238,10 +238,10 @@ static inline void mmc_host_clk_init(struct mmc_host *host) ...@@ -238,10 +238,10 @@ static inline void mmc_host_clk_init(struct mmc_host *host)
/* Hold MCI clock for 8 cycles by default */ /* Hold MCI clock for 8 cycles by default */
host->clk_delay = 8; host->clk_delay = 8;
/* /*
* Default clock gating delay is 200ms. * Default clock gating delay is 0ms to avoid wasting power.
* This value can be tuned by writing into sysfs entry. * This value can be tuned by writing into sysfs entry.
*/ */
host->clkgate_delay = 200; host->clkgate_delay = 0;
host->clk_gated = false; host->clk_gated = false;
INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work); INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work);
spin_lock_init(&host->clk_lock); spin_lock_init(&host->clk_lock);
......
...@@ -816,6 +816,9 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, ...@@ -816,6 +816,9 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
if (!mmc_host_is_spi(host)) if (!mmc_host_is_spi(host))
mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN); mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);
/* Initialization should be done at 3.3 V I/O voltage. */
mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
/* /*
* Since we're changing the OCR value, we seem to * Since we're changing the OCR value, we seem to
* need to tell some cards to go back to the idle * need to tell some cards to go back to the idle
......
...@@ -911,6 +911,9 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr, ...@@ -911,6 +911,9 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
BUG_ON(!host); BUG_ON(!host);
WARN_ON(!host->claimed); WARN_ON(!host->claimed);
/* The initialization should be done at 3.3 V I/O voltage. */
mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
err = mmc_sd_get_cid(host, ocr, cid, &rocr); err = mmc_sd_get_cid(host, ocr, cid, &rocr);
if (err) if (err)
return err; return err;
...@@ -1156,11 +1159,6 @@ int mmc_attach_sd(struct mmc_host *host) ...@@ -1156,11 +1159,6 @@ int mmc_attach_sd(struct mmc_host *host)
BUG_ON(!host); BUG_ON(!host);
WARN_ON(!host->claimed); WARN_ON(!host->claimed);
/* Make sure we are at 3.3V signalling voltage */
err = mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, false);
if (err)
return err;
/* Disable preset value enable if already set since last time */ /* Disable preset value enable if already set since last time */
if (host->ops->enable_preset_value) { if (host->ops->enable_preset_value) {
mmc_host_clk_hold(host); mmc_host_clk_hold(host);
......
...@@ -585,6 +585,9 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr, ...@@ -585,6 +585,9 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,
* Inform the card of the voltage * Inform the card of the voltage
*/ */
if (!powered_resume) { if (!powered_resume) {
/* The initialization should be done at 3.3 V I/O voltage. */
mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
err = mmc_send_io_op_cond(host, host->ocr, &ocr); err = mmc_send_io_op_cond(host, host->ocr, &ocr);
if (err) if (err)
goto err; goto err;
...@@ -996,6 +999,11 @@ static int mmc_sdio_power_restore(struct mmc_host *host) ...@@ -996,6 +999,11 @@ static int mmc_sdio_power_restore(struct mmc_host *host)
* With these steps taken, mmc_select_voltage() is also required to * With these steps taken, mmc_select_voltage() is also required to
* restore the correct voltage setting of the card. * restore the correct voltage setting of the card.
*/ */
/* The initialization should be done at 3.3 V I/O voltage. */
if (!mmc_card_keep_power(host))
mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330, 0);
sdio_reset(host); sdio_reset(host);
mmc_go_idle(host); mmc_go_idle(host);
mmc_send_if_cond(host, host->ocr_avail); mmc_send_if_cond(host, host->ocr_avail);
......
...@@ -1948,12 +1948,12 @@ static bool atmci_filter(struct dma_chan *chan, void *slave) ...@@ -1948,12 +1948,12 @@ static bool atmci_filter(struct dma_chan *chan, void *slave)
} }
} }
static void atmci_configure_dma(struct atmel_mci *host) static bool atmci_configure_dma(struct atmel_mci *host)
{ {
struct mci_platform_data *pdata; struct mci_platform_data *pdata;
if (host == NULL) if (host == NULL)
return; return false;
pdata = host->pdev->dev.platform_data; pdata = host->pdev->dev.platform_data;
...@@ -1970,12 +1970,15 @@ static void atmci_configure_dma(struct atmel_mci *host) ...@@ -1970,12 +1970,15 @@ static void atmci_configure_dma(struct atmel_mci *host)
host->dma.chan = host->dma.chan =
dma_request_channel(mask, atmci_filter, pdata->dma_slave); dma_request_channel(mask, atmci_filter, pdata->dma_slave);
} }
if (!host->dma.chan) if (!host->dma.chan) {
dev_notice(&host->pdev->dev, "DMA not available, using PIO\n"); dev_warn(&host->pdev->dev, "no DMA channel available\n");
else return false;
} else {
dev_info(&host->pdev->dev, dev_info(&host->pdev->dev,
"Using %s for DMA transfers\n", "Using %s for DMA transfers\n",
dma_chan_name(host->dma.chan)); dma_chan_name(host->dma.chan));
return true;
}
} }
static inline unsigned int atmci_get_version(struct atmel_mci *host) static inline unsigned int atmci_get_version(struct atmel_mci *host)
...@@ -2085,8 +2088,7 @@ static int __init atmci_probe(struct platform_device *pdev) ...@@ -2085,8 +2088,7 @@ static int __init atmci_probe(struct platform_device *pdev)
/* Get MCI capabilities and set operations according to it */ /* Get MCI capabilities and set operations according to it */
atmci_get_cap(host); atmci_get_cap(host);
if (host->caps.has_dma) { if (host->caps.has_dma && atmci_configure_dma(host)) {
dev_info(&pdev->dev, "using DMA\n");
host->prepare_data = &atmci_prepare_data_dma; host->prepare_data = &atmci_prepare_data_dma;
host->submit_data = &atmci_submit_data_dma; host->submit_data = &atmci_submit_data_dma;
host->stop_transfer = &atmci_stop_transfer_dma; host->stop_transfer = &atmci_stop_transfer_dma;
...@@ -2096,15 +2098,12 @@ static int __init atmci_probe(struct platform_device *pdev) ...@@ -2096,15 +2098,12 @@ static int __init atmci_probe(struct platform_device *pdev)
host->submit_data = &atmci_submit_data_pdc; host->submit_data = &atmci_submit_data_pdc;
host->stop_transfer = &atmci_stop_transfer_pdc; host->stop_transfer = &atmci_stop_transfer_pdc;
} else { } else {
dev_info(&pdev->dev, "no DMA, no PDC\n"); dev_info(&pdev->dev, "using PIO\n");
host->prepare_data = &atmci_prepare_data; host->prepare_data = &atmci_prepare_data;
host->submit_data = &atmci_submit_data; host->submit_data = &atmci_submit_data;
host->stop_transfer = &atmci_stop_transfer; host->stop_transfer = &atmci_stop_transfer;
} }
if (host->caps.has_dma)
atmci_configure_dma(host);
platform_set_drvdata(pdev, host); platform_set_drvdata(pdev, host);
/* We need at least one slot to succeed */ /* We need at least one slot to succeed */
......
...@@ -1271,12 +1271,13 @@ static int __devinit mmci_probe(struct amba_device *dev, ...@@ -1271,12 +1271,13 @@ static int __devinit mmci_probe(struct amba_device *dev,
/* /*
* Block size can be up to 2048 bytes, but must be a power of two. * Block size can be up to 2048 bytes, but must be a power of two.
*/ */
mmc->max_blk_size = 2048; mmc->max_blk_size = 1 << 11;
/* /*
* No limit on the number of blocks transferred. * Limit the number of blocks transferred so that we don't overflow
* the maximum request size.
*/ */
mmc->max_blk_count = mmc->max_req_size; mmc->max_blk_count = mmc->max_req_size >> 11;
spin_lock_init(&host->lock); spin_lock_init(&host->lock);
......
...@@ -269,8 +269,9 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg) ...@@ -269,8 +269,9 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
imx_data->scratchpad = val; imx_data->scratchpad = val;
return; return;
case SDHCI_COMMAND: case SDHCI_COMMAND:
if ((host->cmd->opcode == MMC_STOP_TRANSMISSION) if ((host->cmd->opcode == MMC_STOP_TRANSMISSION ||
&& (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) host->cmd->opcode == MMC_SET_BLOCK_COUNT) &&
(imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT))
val |= SDHCI_CMD_ABORTCMD; val |= SDHCI_CMD_ABORTCMD;
if (is_imx6q_usdhc(imx_data)) { if (is_imx6q_usdhc(imx_data)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment