mmc: Merge branch fixes into next
Merge the mmc fixes for v6.6-rc[n] into the next branch, to allow them to get tested together with the new mmc changes that are targeted for v6.7. Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
commit
3e65dba664
@ -69,7 +69,7 @@ properties:
|
||||
maxItems: 4
|
||||
|
||||
clocks:
|
||||
minItems: 3
|
||||
minItems: 2
|
||||
items:
|
||||
- description: Main peripheral bus clock, PCLK/HCLK - AHB Bus clock
|
||||
- description: SDC MMC clock, MCLK
|
||||
|
@ -179,6 +179,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
|
||||
struct mmc_queue *mq);
|
||||
static void mmc_blk_hsq_req_done(struct mmc_request *mrq);
|
||||
static int mmc_spi_err_check(struct mmc_card *card);
|
||||
static int mmc_blk_busy_cb(void *cb_data, bool *busy);
|
||||
|
||||
static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk)
|
||||
{
|
||||
@ -470,7 +471,7 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
|
||||
struct mmc_data data = {};
|
||||
struct mmc_request mrq = {};
|
||||
struct scatterlist sg;
|
||||
bool r1b_resp, use_r1b_resp = false;
|
||||
bool r1b_resp;
|
||||
unsigned int busy_timeout_ms;
|
||||
int err;
|
||||
unsigned int target_part;
|
||||
@ -551,8 +552,7 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
|
||||
busy_timeout_ms = idata->ic.cmd_timeout_ms ? : MMC_BLK_TIMEOUT_MS;
|
||||
r1b_resp = (cmd.flags & MMC_RSP_R1B) == MMC_RSP_R1B;
|
||||
if (r1b_resp)
|
||||
use_r1b_resp = mmc_prepare_busy_cmd(card->host, &cmd,
|
||||
busy_timeout_ms);
|
||||
mmc_prepare_busy_cmd(card->host, &cmd, busy_timeout_ms);
|
||||
|
||||
mmc_wait_for_req(card->host, &mrq);
|
||||
memcpy(&idata->ic.response, cmd.resp, sizeof(cmd.resp));
|
||||
@ -605,19 +605,28 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
|
||||
if (idata->ic.postsleep_min_us)
|
||||
usleep_range(idata->ic.postsleep_min_us, idata->ic.postsleep_max_us);
|
||||
|
||||
/* No need to poll when using HW busy detection. */
|
||||
if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) && use_r1b_resp)
|
||||
return 0;
|
||||
|
||||
if (mmc_host_is_spi(card->host)) {
|
||||
if (idata->ic.write_flag || r1b_resp || cmd.flags & MMC_RSP_SPI_BUSY)
|
||||
return mmc_spi_err_check(card);
|
||||
return err;
|
||||
}
|
||||
/* Ensure RPMB/R1B command has completed by polling with CMD13. */
|
||||
if (idata->rpmb || r1b_resp)
|
||||
err = mmc_poll_for_busy(card, busy_timeout_ms, false,
|
||||
MMC_BUSY_IO);
|
||||
|
||||
/*
|
||||
* Ensure RPMB, writes and R1B responses are completed by polling with
|
||||
* CMD13. Note that, usually we don't need to poll when using HW busy
|
||||
* detection, but here it's needed since some commands may indicate the
|
||||
* error through the R1 status bits.
|
||||
*/
|
||||
if (idata->rpmb || idata->ic.write_flag || r1b_resp) {
|
||||
struct mmc_blk_busy_data cb_data = {
|
||||
.card = card,
|
||||
};
|
||||
|
||||
err = __mmc_poll_for_busy(card->host, 0, busy_timeout_ms,
|
||||
&mmc_blk_busy_cb, &cb_data);
|
||||
|
||||
idata->ic.response[0] = cb_data.status;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -1089,8 +1089,14 @@ static int mmc_sdio_resume(struct mmc_host *host)
|
||||
}
|
||||
err = mmc_sdio_reinit_card(host);
|
||||
} else if (mmc_card_wake_sdio_irq(host)) {
|
||||
/* We may have switched to 1-bit mode during suspend */
|
||||
/*
|
||||
* We may have switched to 1-bit mode during suspend,
|
||||
* need to hold retuning, because tuning only supprt
|
||||
* 4-bit mode or 8 bit mode.
|
||||
*/
|
||||
mmc_retune_hold_now(host);
|
||||
err = sdio_enable_4bit_bus(host->card);
|
||||
mmc_retune_release(host);
|
||||
}
|
||||
|
||||
if (err)
|
||||
|
@ -669,11 +669,11 @@ static void msdc_reset_hw(struct msdc_host *host)
|
||||
u32 val;
|
||||
|
||||
sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_RST);
|
||||
readl_poll_timeout(host->base + MSDC_CFG, val, !(val & MSDC_CFG_RST), 0, 0);
|
||||
readl_poll_timeout_atomic(host->base + MSDC_CFG, val, !(val & MSDC_CFG_RST), 0, 0);
|
||||
|
||||
sdr_set_bits(host->base + MSDC_FIFOCS, MSDC_FIFOCS_CLR);
|
||||
readl_poll_timeout(host->base + MSDC_FIFOCS, val,
|
||||
!(val & MSDC_FIFOCS_CLR), 0, 0);
|
||||
readl_poll_timeout_atomic(host->base + MSDC_FIFOCS, val,
|
||||
!(val & MSDC_FIFOCS_CLR), 0, 0);
|
||||
|
||||
val = readl(host->base + MSDC_INT);
|
||||
writel(val, host->base + MSDC_INT);
|
||||
|
@ -1158,42 +1158,6 @@ static u32 sdhci_gl9750_readl(struct sdhci_host *host, int reg)
|
||||
return value;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int sdhci_pci_gli_resume(struct sdhci_pci_chip *chip)
|
||||
{
|
||||
struct sdhci_pci_slot *slot = chip->slots[0];
|
||||
|
||||
pci_free_irq_vectors(slot->chip->pdev);
|
||||
gli_pcie_enable_msi(slot);
|
||||
|
||||
return sdhci_pci_resume_host(chip);
|
||||
}
|
||||
|
||||
static int sdhci_cqhci_gli_resume(struct sdhci_pci_chip *chip)
|
||||
{
|
||||
struct sdhci_pci_slot *slot = chip->slots[0];
|
||||
int ret;
|
||||
|
||||
ret = sdhci_pci_gli_resume(chip);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return cqhci_resume(slot->host->mmc);
|
||||
}
|
||||
|
||||
static int sdhci_cqhci_gli_suspend(struct sdhci_pci_chip *chip)
|
||||
{
|
||||
struct sdhci_pci_slot *slot = chip->slots[0];
|
||||
int ret;
|
||||
|
||||
ret = cqhci_suspend(slot->host->mmc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return sdhci_suspend_host(slot->host);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void gl9763e_hs400_enhanced_strobe(struct mmc_host *mmc,
|
||||
struct mmc_ios *ios)
|
||||
{
|
||||
@ -1434,6 +1398,70 @@ static int gl9763e_runtime_resume(struct sdhci_pci_chip *chip)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int sdhci_pci_gli_resume(struct sdhci_pci_chip *chip)
|
||||
{
|
||||
struct sdhci_pci_slot *slot = chip->slots[0];
|
||||
|
||||
pci_free_irq_vectors(slot->chip->pdev);
|
||||
gli_pcie_enable_msi(slot);
|
||||
|
||||
return sdhci_pci_resume_host(chip);
|
||||
}
|
||||
|
||||
static int gl9763e_resume(struct sdhci_pci_chip *chip)
|
||||
{
|
||||
struct sdhci_pci_slot *slot = chip->slots[0];
|
||||
int ret;
|
||||
|
||||
ret = sdhci_pci_gli_resume(chip);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = cqhci_resume(slot->host->mmc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Disable LPM negotiation to bring device back in sync
|
||||
* with its runtime_pm state.
|
||||
*/
|
||||
gl9763e_set_low_power_negotiation(slot, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gl9763e_suspend(struct sdhci_pci_chip *chip)
|
||||
{
|
||||
struct sdhci_pci_slot *slot = chip->slots[0];
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Certain SoCs can suspend only with the bus in low-
|
||||
* power state, notably x86 SoCs when using S0ix.
|
||||
* Re-enable LPM negotiation to allow entering L1 state
|
||||
* and entering system suspend.
|
||||
*/
|
||||
gl9763e_set_low_power_negotiation(slot, true);
|
||||
|
||||
ret = cqhci_suspend(slot->host->mmc);
|
||||
if (ret)
|
||||
goto err_suspend;
|
||||
|
||||
ret = sdhci_suspend_host(slot->host);
|
||||
if (ret)
|
||||
goto err_suspend_host;
|
||||
|
||||
return 0;
|
||||
|
||||
err_suspend_host:
|
||||
cqhci_resume(slot->host->mmc);
|
||||
err_suspend:
|
||||
gl9763e_set_low_power_negotiation(slot, false);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int gli_probe_slot_gl9763e(struct sdhci_pci_slot *slot)
|
||||
{
|
||||
struct pci_dev *pdev = slot->chip->pdev;
|
||||
@ -1541,8 +1569,8 @@ const struct sdhci_pci_fixes sdhci_gl9763e = {
|
||||
.probe_slot = gli_probe_slot_gl9763e,
|
||||
.ops = &sdhci_gl9763e_ops,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.resume = sdhci_cqhci_gli_resume,
|
||||
.suspend = sdhci_cqhci_gli_suspend,
|
||||
.resume = gl9763e_resume,
|
||||
.suspend = gl9763e_suspend,
|
||||
#endif
|
||||
#ifdef CONFIG_PM
|
||||
.runtime_suspend = gl9763e_runtime_suspend,
|
||||
|
@ -644,6 +644,7 @@ static int sdhci_sprd_tuning(struct mmc_host *mmc, struct mmc_card *card,
|
||||
best_clk_sample = sdhci_sprd_get_best_clk_sample(mmc, value);
|
||||
if (best_clk_sample < 0) {
|
||||
dev_err(mmc_dev(host->mmc), "all tuning phase fail!\n");
|
||||
err = best_clk_sample;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user