forked from Minki/linux
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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJYfjT3AAoJEP4mhCVzWIwpA5AQAI46BefvYn72YjrXygGDly2d NTHTvSE6TK+2M1v1fv0w8xlHTTJqfGydzPzpiOgPkOHF6jNp1zGbK0VK60HFstwy YZ6hxJxRvRcZc5tGOFw+UoN2Bfxxt8p7lFZFwWLOMS8b4b95rZrJoCIS3Xd0ED3t lAwJXDfUse0pi0gpR/WFqn1TnKh1lHqapoXe4G/9RWfbQdsRiW9UBBAG4Gk0M/aJ FzCSJJyD4OXgfwZZ2UbUMMWi40kwjC1ayrv+Ejw8g55lnbNZvVRqSg9zHRE5W1Xw pzMD5cbhFsDKOXakH/Gzqzk1HCUfBilgxZbOQ6Q9ysGMjxS/1U74NuvyI5NQEvah W+rV6Q6kKB1ztwbJ47Rn7zpP6bQ6fn73Z9aHYJgrP2hwuU5wG2CCqRQ5w1HIdjYc Fkfo+UHOeKlSVMAvC92t39chyisTVmvHvejyDejuAPrOWWn2aXHfMm92/bn/fvnz jXGoBIQ/D91XIAr/VkkSx2RiS1d8f1qFJ02AFx/mhUD0GiakYjSCgXauVLNy6C4b IKQIJi+SsE5LdSga9secIkItlYRKujAkG8iILRPRIdCALlV0UbUrxnTewK3Kg2NM Eh7wEEa0Sm6VLU1QypIrE9/hKDmLRQdscEb0xTcUozTfjmzRaIkWpFrNELr8Eram PfXBMfb4Bk7VhqQ1VJBq =X9oZ -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
7e84b30355
@ -506,9 +506,6 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
||||
}
|
||||
} while (busy);
|
||||
|
||||
if (host->ops->card_busy && send_status)
|
||||
return mmc_switch_status(card);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -577,24 +574,26 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
|
||||
if (!use_busy_signal)
|
||||
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 (((host->caps & MMC_CAP_WAIT_WHILE_BUSY) && use_r1b_resp) ||
|
||||
mmc_host_is_spi(host)) {
|
||||
if (send_status)
|
||||
err = mmc_switch_status(card);
|
||||
mmc_host_is_spi(host))
|
||||
goto out_tim;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
out_tim:
|
||||
if (err && timing)
|
||||
mmc_set_timing(host, old_timing);
|
||||
/* Switch to new timing before check switch status. */
|
||||
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:
|
||||
mmc_retune_release(host);
|
||||
|
||||
|
@ -578,13 +578,15 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct meson_host *host = dev_id;
|
||||
struct mmc_request *mrq;
|
||||
struct mmc_command *cmd = host->cmd;
|
||||
struct mmc_command *cmd;
|
||||
u32 irq_en, status, raw_status;
|
||||
irqreturn_t ret = IRQ_HANDLED;
|
||||
|
||||
if (WARN_ON(!host))
|
||||
return IRQ_NONE;
|
||||
|
||||
cmd = host->cmd;
|
||||
|
||||
mrq = host->mrq;
|
||||
|
||||
if (WARN_ON(!mrq))
|
||||
@ -670,10 +672,10 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id)
|
||||
int ret = IRQ_HANDLED;
|
||||
|
||||
if (WARN_ON(!mrq))
|
||||
ret = IRQ_NONE;
|
||||
return IRQ_NONE;
|
||||
|
||||
if (WARN_ON(!cmd))
|
||||
ret = IRQ_NONE;
|
||||
return IRQ_NONE;
|
||||
|
||||
data = cmd->data;
|
||||
if (data) {
|
||||
|
@ -309,6 +309,9 @@ static void mxs_mmc_ac(struct mxs_mmc_host *host)
|
||||
cmd0 = BF_SSP(cmd->opcode, CMD0_CMD);
|
||||
cmd1 = cmd->arg;
|
||||
|
||||
if (cmd->opcode == MMC_STOP_TRANSMISSION)
|
||||
cmd0 |= BM_SSP_CMD0_APPEND_8CYC;
|
||||
|
||||
if (host->sdio_irq_en) {
|
||||
ctrl0 |= BM_SSP_CTRL0_SDIO_IRQ_CHECK;
|
||||
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)
|
||||
ssp->base + HW_SSP_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
if ((cmd->opcode == MMC_STOP_TRANSMISSION) ||
|
||||
(cmd->opcode == SD_IO_RW_EXTENDED))
|
||||
if (cmd->opcode == SD_IO_RW_EXTENDED)
|
||||
cmd0 |= BM_SSP_CMD0_APPEND_8CYC;
|
||||
|
||||
cmd1 = cmd->arg;
|
||||
|
@ -395,7 +395,8 @@ static int sdhci_acpi_probe(struct platform_device *pdev)
|
||||
/* Power on the SDHCI controller and its children */
|
||||
acpi_device_fix_up_power(device);
|
||||
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)
|
||||
return -ENODEV;
|
||||
|
Loading…
Reference in New Issue
Block a user