MMC fixes 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. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJPVKonAAoJEHNBYZ7TNxYMipUP/3mLTeCnOr7zLRv1Oawl9T6C InsAO02aITGAUWINaIQlOzTTXPnjHEsVdTFc/FujnlJr96lfvYpI06RNzKu7GbLg NWA7VCvNOnbGfOY4GpmfHjx7urOm0kxBR3SBeWQWgB7npXECzqiMV6MI1yyfTm7C n4qZDSPzRlcsEaNE0IPuX8sNsSpR01geJm0mG5kCceGLDwVXI4dUsthrkza32pHl SIZFr3CJ5hp2JDUntJzuxYgyDacOae5Yk6yXYlEEubqGrOrPZjYpxcpqdm1AkefQ iy3wKCFVhK9HYD7/1PN2sKs9bYorXDtrY7M0iwOJKs9r1evlAvWWCvqm4ZtGEHIs PD9NC2x3RJlhk1snjyuIs5WG7LqtaqXarcHe6Yyejh67UVpiFrLfABcOV6G2gm4/ 2rWd0yc5AvKy2G2hfEDsLXRMlBbrmuxIrfka29iYDOnutiPPQiH4n138ksWmNq0+ MDtJMvYfz73MiXAKLSZ7RmSg0duGWdOvy8UpZ0AkhTUR0iVBhByN8UnIk5yUmVDK Uti2ivq/9GsGK9s9NHxFDpieU2iQzXEz7E+5JfkD23xUbxnFB/Uphn/lXobKbRhT mNTBz0bapE09UWXwV5vH/UAfD53CZbVX2h7Zc/RGj/oF4dBw3xkIe2Oe6d9u+jpv Bwe04US4nWqVHas8tcXW =Fby1 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
550cf00dbc
9 changed files with 38 additions and 25 deletions
|
@ -1310,7 +1310,7 @@ F: drivers/atm/
|
|||
F: include/linux/atm*
|
||||
|
||||
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)
|
||||
W: http://www.atmel.com/products/AT91/
|
||||
W: http://www.at91.com/
|
||||
|
@ -1318,7 +1318,7 @@ S: Maintained
|
|||
F: drivers/mmc/host/at91_mci.c
|
||||
|
||||
ATMEL AT91 / AT32 MCI DRIVER
|
||||
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
||||
M: Ludovic Desroches <ludovic.desroches@atmel.com>
|
||||
S: Maintained
|
||||
F: drivers/mmc/host/atmel-mci.c
|
||||
F: drivers/mmc/host/atmel-mci-regs.h
|
||||
|
|
|
@ -2068,6 +2068,9 @@ static int mmc_rescan_try_freq(struct mmc_host *host, unsigned freq)
|
|||
*/
|
||||
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
|
||||
* 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)
|
|||
/* Hold MCI clock for 8 cycles by default */
|
||||
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.
|
||||
*/
|
||||
host->clkgate_delay = 200;
|
||||
host->clkgate_delay = 0;
|
||||
host->clk_gated = false;
|
||||
INIT_DELAYED_WORK(&host->clk_gate_work, mmc_host_clk_gate_work);
|
||||
spin_lock_init(&host->clk_lock);
|
||||
|
|
|
@ -816,6 +816,9 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
|
|||
if (!mmc_host_is_spi(host))
|
||||
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
|
||||
* 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,
|
|||
BUG_ON(!host);
|
||||
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);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -1156,11 +1159,6 @@ int mmc_attach_sd(struct mmc_host *host)
|
|||
BUG_ON(!host);
|
||||
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 */
|
||||
if (host->ops->enable_preset_value) {
|
||||
mmc_host_clk_hold(host);
|
||||
|
|
|
@ -585,6 +585,9 @@ static int mmc_sdio_init_card(struct mmc_host *host, u32 ocr,
|
|||
* Inform the card of the voltage
|
||||
*/
|
||||
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);
|
||||
if (err)
|
||||
goto err;
|
||||
|
@ -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
|
||||
* 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);
|
||||
mmc_go_idle(host);
|
||||
mmc_send_if_cond(host, host->ocr_avail);
|
||||
|
|
|
@ -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;
|
||||
|
||||
if (host == NULL)
|
||||
return;
|
||||
return false;
|
||||
|
||||
pdata = host->pdev->dev.platform_data;
|
||||
|
||||
|
@ -1970,12 +1970,15 @@ static void atmci_configure_dma(struct atmel_mci *host)
|
|||
host->dma.chan =
|
||||
dma_request_channel(mask, atmci_filter, pdata->dma_slave);
|
||||
}
|
||||
if (!host->dma.chan)
|
||||
dev_notice(&host->pdev->dev, "DMA not available, using PIO\n");
|
||||
else
|
||||
if (!host->dma.chan) {
|
||||
dev_warn(&host->pdev->dev, "no DMA channel available\n");
|
||||
return false;
|
||||
} else {
|
||||
dev_info(&host->pdev->dev,
|
||||
"Using %s for DMA transfers\n",
|
||||
dma_chan_name(host->dma.chan));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static inline unsigned int atmci_get_version(struct atmel_mci *host)
|
||||
|
@ -2085,8 +2088,7 @@ static int __init atmci_probe(struct platform_device *pdev)
|
|||
|
||||
/* Get MCI capabilities and set operations according to it */
|
||||
atmci_get_cap(host);
|
||||
if (host->caps.has_dma) {
|
||||
dev_info(&pdev->dev, "using DMA\n");
|
||||
if (host->caps.has_dma && atmci_configure_dma(host)) {
|
||||
host->prepare_data = &atmci_prepare_data_dma;
|
||||
host->submit_data = &atmci_submit_data_dma;
|
||||
host->stop_transfer = &atmci_stop_transfer_dma;
|
||||
|
@ -2096,15 +2098,12 @@ static int __init atmci_probe(struct platform_device *pdev)
|
|||
host->submit_data = &atmci_submit_data_pdc;
|
||||
host->stop_transfer = &atmci_stop_transfer_pdc;
|
||||
} else {
|
||||
dev_info(&pdev->dev, "no DMA, no PDC\n");
|
||||
dev_info(&pdev->dev, "using PIO\n");
|
||||
host->prepare_data = &atmci_prepare_data;
|
||||
host->submit_data = &atmci_submit_data;
|
||||
host->stop_transfer = &atmci_stop_transfer;
|
||||
}
|
||||
|
||||
if (host->caps.has_dma)
|
||||
atmci_configure_dma(host);
|
||||
|
||||
platform_set_drvdata(pdev, host);
|
||||
|
||||
/* We need at least one slot to succeed */
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
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);
|
||||
|
||||
|
|
|
@ -269,8 +269,9 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)
|
|||
imx_data->scratchpad = val;
|
||||
return;
|
||||
case SDHCI_COMMAND:
|
||||
if ((host->cmd->opcode == MMC_STOP_TRANSMISSION)
|
||||
&& (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT))
|
||||
if ((host->cmd->opcode == MMC_STOP_TRANSMISSION ||
|
||||
host->cmd->opcode == MMC_SET_BLOCK_COUNT) &&
|
||||
(imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT))
|
||||
val |= SDHCI_CMD_ABORTCMD;
|
||||
|
||||
if (is_imx6q_usdhc(imx_data)) {
|
||||
|
|
Loading…
Reference in a new issue