Merge tag 'mmc-v5.2-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
Pull MMC fixes from Ulf Hansson: "Here's a couple of MMC and MEMSTICK fixes: MMC host: - sdhci: Fix SDIO IRQ thread deadlock - sdhci-tegra: Fix a warning message - sdhci_am654: Fix SLOTTYPE write - meson-gx: Fix IRQ ack - tmio: Fix SCC error handling to avoid false positive CRC error MEMSTICK core: - mspro_block: Fix returning a correct error code" * tag 'mmc-v5.2-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: mmc: sdhci_am654: Fix SLOTTYPE write mmc: sdhci: Fix SDIO IRQ thread deadlock mmc: meson-gx: fix irq ack mmc: tmio: fix SCC error handling to avoid false positive CRC error mmc: tegra: Fix a warning message memstick: mspro_block: Fix an error code in mspro_block_issue_req()
This commit is contained in:
@@ -859,6 +859,9 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
|
||||
if (WARN_ON(!host) || WARN_ON(!host->cmd))
|
||||
return IRQ_NONE;
|
||||
|
||||
/* ack all raised interrupts */
|
||||
writel(status, host->regs + SD_EMMC_STATUS);
|
||||
|
||||
cmd = host->cmd;
|
||||
data = cmd->data;
|
||||
cmd->error = 0;
|
||||
@@ -905,9 +908,6 @@ out:
|
||||
if (ret == IRQ_HANDLED)
|
||||
meson_mmc_request_done(host->mmc, cmd->mrq);
|
||||
|
||||
/* ack all raised interrupts */
|
||||
writel(status, host->regs + SD_EMMC_STATUS);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -865,7 +865,7 @@ static void tegra_sdhci_tap_correction(struct sdhci_host *host, u8 thd_up,
|
||||
}
|
||||
|
||||
if (!first_fail) {
|
||||
WARN_ON("no edge detected, continue with hw tuned delay.\n");
|
||||
WARN(1, "no edge detected, continue with hw tuned delay.\n");
|
||||
} else if (first_pass) {
|
||||
/* set tap location at fixed tap relative to the first edge */
|
||||
edge1 = first_fail_tap + (first_pass_tap - first_fail_tap) / 2;
|
||||
|
@@ -2133,6 +2133,17 @@ void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sdhci_enable_sdio_irq);
|
||||
|
||||
static void sdhci_ack_sdio_irq(struct mmc_host *mmc)
|
||||
{
|
||||
struct sdhci_host *host = mmc_priv(mmc);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
if (host->flags & SDHCI_SDIO_IRQ_ENABLED)
|
||||
sdhci_enable_sdio_irq_nolock(host, true);
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
}
|
||||
|
||||
int sdhci_start_signal_voltage_switch(struct mmc_host *mmc,
|
||||
struct mmc_ios *ios)
|
||||
{
|
||||
@@ -2581,6 +2592,7 @@ static const struct mmc_host_ops sdhci_ops = {
|
||||
.get_ro = sdhci_get_ro,
|
||||
.hw_reset = sdhci_hw_reset,
|
||||
.enable_sdio_irq = sdhci_enable_sdio_irq,
|
||||
.ack_sdio_irq = sdhci_ack_sdio_irq,
|
||||
.start_signal_voltage_switch = sdhci_start_signal_voltage_switch,
|
||||
.prepare_hs400_tuning = sdhci_prepare_hs400_tuning,
|
||||
.execute_tuning = sdhci_execute_tuning,
|
||||
@@ -3083,8 +3095,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
|
||||
if ((intmask & SDHCI_INT_CARD_INT) &&
|
||||
(host->ier & SDHCI_INT_CARD_INT)) {
|
||||
sdhci_enable_sdio_irq_nolock(host, false);
|
||||
host->thread_isr |= SDHCI_INT_CARD_INT;
|
||||
result = IRQ_WAKE_THREAD;
|
||||
sdio_signal_irq(host->mmc);
|
||||
}
|
||||
|
||||
intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE |
|
||||
@@ -3156,15 +3167,6 @@ static irqreturn_t sdhci_thread_irq(int irq, void *dev_id)
|
||||
mmc_detect_change(mmc, msecs_to_jiffies(200));
|
||||
}
|
||||
|
||||
if (isr & SDHCI_INT_CARD_INT) {
|
||||
sdio_run_irqs(host->mmc);
|
||||
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
if (host->flags & SDHCI_SDIO_IRQ_ENABLED)
|
||||
sdhci_enable_sdio_irq_nolock(host, true);
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@@ -231,7 +231,7 @@ static int sdhci_am654_init(struct sdhci_host *host)
|
||||
ctl_cfg_2 = SLOTTYPE_EMBEDDED;
|
||||
|
||||
regmap_update_bits(sdhci_am654->base, CTL_CFG_2,
|
||||
ctl_cfg_2, SLOTTYPE_MASK);
|
||||
SLOTTYPE_MASK, ctl_cfg_2);
|
||||
|
||||
return sdhci_add_host(host);
|
||||
}
|
||||
|
@@ -842,8 +842,9 @@ static void tmio_mmc_finish_request(struct tmio_mmc_host *host)
|
||||
if (mrq->cmd->error || (mrq->data && mrq->data->error))
|
||||
tmio_mmc_abort_dma(host);
|
||||
|
||||
/* SCC error means retune, but executed command was still successful */
|
||||
if (host->check_scc_error && host->check_scc_error(host))
|
||||
mrq->cmd->error = -EILSEQ;
|
||||
mmc_retune_needed(host->mmc);
|
||||
|
||||
/* If SET_BLOCK_COUNT, continue with main command */
|
||||
if (host->mrq && !mrq->cmd->error) {
|
||||
|
Reference in New Issue
Block a user