Commit 7e84b303 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mmc-v4.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

Pull MMC fixes from Ulf Hansson:
 "MMC core:
   - fix regressions detecting HS/HS DDR eMMC cards related to CMD6

  MMC host:
   - mmc: mxs-mmc: Fix additional cycles after transmission stop
   - sdhci-acpi: Only powered up enabled acpi child devices
   - meson: avoid possible NULL dereference"

* tag 'mmc-v4.10-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
  mmc: core: Restore parts of the polling policy when switch to HS/HS DDR
  mmc: mxs-mmc: Fix additional cycles after transmission stop
  mmc: sdhci-acpi: Only powered up enabled acpi child devices
  MMC: meson: avoid possible NULL dereference
parents 7d8b8c09 ee6ff743
...@@ -506,9 +506,6 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, ...@@ -506,9 +506,6 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
} }
} while (busy); } while (busy);
if (host->ops->card_busy && send_status)
return mmc_switch_status(card);
return 0; return 0;
} }
...@@ -577,24 +574,26 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, ...@@ -577,24 +574,26 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
if (!use_busy_signal) if (!use_busy_signal)
goto out; goto out;
/* Switch to new timing before poll and check switch status. */
if (timing)
mmc_set_timing(host, timing);
/*If SPI or used HW busy detection above, then we don't need to poll. */ /*If SPI or used HW busy detection above, then we don't need to poll. */
if (((host->caps & MMC_CAP_WAIT_WHILE_BUSY) && use_r1b_resp) || if (((host->caps & MMC_CAP_WAIT_WHILE_BUSY) && use_r1b_resp) ||
mmc_host_is_spi(host)) { mmc_host_is_spi(host))
if (send_status)
err = mmc_switch_status(card);
goto out_tim; goto out_tim;
}
/* Let's try to poll to find out when the command is completed. */ /* Let's try to poll to find out when the command is completed. */
err = mmc_poll_for_busy(card, timeout_ms, send_status, retry_crc_err); err = mmc_poll_for_busy(card, timeout_ms, send_status, retry_crc_err);
if (err)
goto out;
out_tim: out_tim:
if (err && timing) /* Switch to new timing before check switch status. */
mmc_set_timing(host, old_timing); if (timing)
mmc_set_timing(host, timing);
if (send_status) {
err = mmc_switch_status(card);
if (err && timing)
mmc_set_timing(host, old_timing);
}
out: out:
mmc_retune_release(host); mmc_retune_release(host);
......
...@@ -578,13 +578,15 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) ...@@ -578,13 +578,15 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
{ {
struct meson_host *host = dev_id; struct meson_host *host = dev_id;
struct mmc_request *mrq; struct mmc_request *mrq;
struct mmc_command *cmd = host->cmd; struct mmc_command *cmd;
u32 irq_en, status, raw_status; u32 irq_en, status, raw_status;
irqreturn_t ret = IRQ_HANDLED; irqreturn_t ret = IRQ_HANDLED;
if (WARN_ON(!host)) if (WARN_ON(!host))
return IRQ_NONE; return IRQ_NONE;
cmd = host->cmd;
mrq = host->mrq; mrq = host->mrq;
if (WARN_ON(!mrq)) if (WARN_ON(!mrq))
...@@ -670,10 +672,10 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id) ...@@ -670,10 +672,10 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
int ret = IRQ_HANDLED; int ret = IRQ_HANDLED;
if (WARN_ON(!mrq)) if (WARN_ON(!mrq))
ret = IRQ_NONE; return IRQ_NONE;
if (WARN_ON(!cmd)) if (WARN_ON(!cmd))
ret = IRQ_NONE; return IRQ_NONE;
data = cmd->data; data = cmd->data;
if (data) { if (data) {
......
...@@ -309,6 +309,9 @@ static void mxs_mmc_ac(struct mxs_mmc_host *host) ...@@ -309,6 +309,9 @@ static void mxs_mmc_ac(struct mxs_mmc_host *host)
cmd0 = BF_SSP(cmd->opcode, CMD0_CMD); cmd0 = BF_SSP(cmd->opcode, CMD0_CMD);
cmd1 = cmd->arg; cmd1 = cmd->arg;
if (cmd->opcode == MMC_STOP_TRANSMISSION)
cmd0 |= BM_SSP_CMD0_APPEND_8CYC;
if (host->sdio_irq_en) { if (host->sdio_irq_en) {
ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK; ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK;
cmd0 |= BM_SSP_CMD0_CONT_CLKING_EN | BM_SSP_CMD0_SLOW_CLKING_EN; cmd0 |= BM_SSP_CMD0_CONT_CLKING_EN | BM_SSP_CMD0_SLOW_CLKING_EN;
...@@ -417,8 +420,7 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host) ...@@ -417,8 +420,7 @@ static void mxs_mmc_adtc(struct mxs_mmc_host *host)
ssp->base + HW_SSP_BLOCK_SIZE); ssp->base + HW_SSP_BLOCK_SIZE);
} }
if ((cmd->opcode == MMC_STOP_TRANSMISSION) || if (cmd->opcode == SD_IO_RW_EXTENDED)
(cmd->opcode == SD_IO_RW_EXTENDED))
cmd0 |= BM_SSP_CMD0_APPEND_8CYC; cmd0 |= BM_SSP_CMD0_APPEND_8CYC;
cmd1 = cmd->arg; cmd1 = cmd->arg;
......
...@@ -395,7 +395,8 @@ static int sdhci_acpi_probe(struct platform_device *pdev) ...@@ -395,7 +395,8 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
/* Power on the SDHCI controller and its children */ /* Power on the SDHCI controller and its children */
acpi_device_fix_up_power(device); acpi_device_fix_up_power(device);
list_for_each_entry(child, &device->children, node) list_for_each_entry(child, &device->children, node)
acpi_device_fix_up_power(child); if (child->status.present && child->status.enabled)
acpi_device_fix_up_power(child);
if (acpi_bus_get_status(device) || !device->status.present) if (acpi_bus_get_status(device) || !device->status.present)
return -ENODEV; return -ENODEV;
......
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