MMC core:
- Restore (almost) the busy polling for MMC_SEND_OP_COND MMC host: - meson-gx: Fix DMA usage of meson_mmc_post_req() -----BEGIN PGP SIGNATURE----- iQJLBAABCgA1FiEEugLDXPmKSktSkQsV/iaEJXNYjCkFAmIrZXkXHHVsZi5oYW5z c29uQGxpbmFyby5vcmcACgkQ/iaEJXNYjCllWQ/+JJ2op5lW8Kca350ZNhEIl+Jt Kna82QGUiGye6a4zXVmWCmZKeDCbvx+iT0ercjlTOXvsZwm5dAFx0XLGIDXFXAV6 r0mkM9/CDaVJ2jqz6on/AKDjVmVDw4NPWtbsiRnouZ7It+SZowpLvUzMgnpEVTT5 nYxjkYICFWXMLyEE2Zgf+SiWtsx/Fhs6Nkj1XitCysLXDsTgPevw9SiLR22zxI1T KPBQAYZqcz7UIAVEo1ujZqInGGfaVXLWQQ6uce41h9bLGHOy3D1a+J7piVUt55c0 nO8MlAPIaqM3agB2smdlzPRd9X+j5V+kntfsTPATw8rp+hBBkfinEqiscz27hr+p m3bPiJcbLcszy9FANqbcAXv8NB9z1U14JVSl2xFX5VvBuJvMq4lNczx94tEI3Glm bzclYXxBHjrpTv65443ggO9v0mO/d6T/PFUw1sAQlvNynHnqd2QP/IAtLpiMMH9k Ddxati2fNwyYWsKFqENPGEV7DV0AFHApe3EkQPIDpbs45+AoHzt46KWfTb1glm3T iJWdSWqHCmd0pS+Zxhp09tCE+fmyRycYBdK/peLl1Cy/oABtZLvJRC2+ZFVgiPdA hpMdKH4UvHjAcnCQ8bLcdzhtna7kwVE6E5CMObi2fNRzT5zb+nJ1oX2cOOGPHhNz eBnpjMn8ZWZzSrNrCb0= =XKXe -----END PGP SIGNATURE----- Merge tag 'mmc-v5.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc Pull MMC fixes from Ulf Hansson: "MMC core: - Restore (mostly) the busy polling for MMC_SEND_OP_COND MMC host: - meson-gx: Fix DMA usage of meson_mmc_post_req()" * tag 'mmc-v5.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: mmc: core: Restore (almost) the busy polling for MMC_SEND_OP_COND mmc: meson: Fix usage of meson_mmc_post_req()
This commit is contained in:
Коммит
3977a3fb67
|
@ -1908,7 +1908,7 @@ static int mmc_blk_card_busy(struct mmc_card *card, struct request *req)
|
|||
|
||||
cb_data.card = card;
|
||||
cb_data.status = 0;
|
||||
err = __mmc_poll_for_busy(card->host, MMC_BLK_TIMEOUT_MS,
|
||||
err = __mmc_poll_for_busy(card->host, 0, MMC_BLK_TIMEOUT_MS,
|
||||
&mmc_blk_busy_cb, &cb_data);
|
||||
|
||||
/*
|
||||
|
|
|
@ -1962,7 +1962,7 @@ static int mmc_sleep(struct mmc_host *host)
|
|||
goto out_release;
|
||||
}
|
||||
|
||||
err = __mmc_poll_for_busy(host, timeout_ms, &mmc_sleep_busy_cb, host);
|
||||
err = __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_sleep_busy_cb, host);
|
||||
|
||||
out_release:
|
||||
mmc_retune_release(host);
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
#define MMC_BKOPS_TIMEOUT_MS (120 * 1000) /* 120s */
|
||||
#define MMC_SANITIZE_TIMEOUT_MS (240 * 1000) /* 240s */
|
||||
#define MMC_OP_COND_PERIOD_US (1 * 1000) /* 1ms */
|
||||
#define MMC_OP_COND_TIMEOUT_MS 1000 /* 1s */
|
||||
|
||||
static const u8 tuning_blk_pattern_4bit[] = {
|
||||
0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc,
|
||||
|
@ -232,7 +234,9 @@ int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
|
|||
cmd.arg = mmc_host_is_spi(host) ? 0 : ocr;
|
||||
cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR;
|
||||
|
||||
err = __mmc_poll_for_busy(host, 1000, &__mmc_send_op_cond_cb, &cb_data);
|
||||
err = __mmc_poll_for_busy(host, MMC_OP_COND_PERIOD_US,
|
||||
MMC_OP_COND_TIMEOUT_MS,
|
||||
&__mmc_send_op_cond_cb, &cb_data);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -495,13 +499,14 @@ static int mmc_busy_cb(void *cb_data, bool *busy)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms,
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int period_us,
|
||||
unsigned int timeout_ms,
|
||||
int (*busy_cb)(void *cb_data, bool *busy),
|
||||
void *cb_data)
|
||||
{
|
||||
int err;
|
||||
unsigned long timeout;
|
||||
unsigned int udelay = 32, udelay_max = 32768;
|
||||
unsigned int udelay = period_us ? period_us : 32, udelay_max = 32768;
|
||||
bool expired = false;
|
||||
bool busy = false;
|
||||
|
||||
|
@ -546,7 +551,7 @@ int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
|||
cb_data.retry_crc_err = retry_crc_err;
|
||||
cb_data.busy_cmd = busy_cmd;
|
||||
|
||||
return __mmc_poll_for_busy(host, timeout_ms, &mmc_busy_cb, &cb_data);
|
||||
return __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_busy_cb, &cb_data);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mmc_poll_for_busy);
|
||||
|
||||
|
|
|
@ -41,7 +41,8 @@ int mmc_can_ext_csd(struct mmc_card *card);
|
|||
int mmc_switch_status(struct mmc_card *card, bool crc_err_fatal);
|
||||
bool mmc_prepare_busy_cmd(struct mmc_host *host, struct mmc_command *cmd,
|
||||
unsigned int timeout_ms);
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms,
|
||||
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int period_us,
|
||||
unsigned int timeout_ms,
|
||||
int (*busy_cb)(void *cb_data, bool *busy),
|
||||
void *cb_data);
|
||||
int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
||||
|
|
|
@ -1672,7 +1672,7 @@ static int sd_poweroff_notify(struct mmc_card *card)
|
|||
|
||||
cb_data.card = card;
|
||||
cb_data.reg_buf = reg_buf;
|
||||
err = __mmc_poll_for_busy(card->host, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
|
||||
err = __mmc_poll_for_busy(card->host, 0, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
|
||||
&sd_busy_poweroff_notify_cb, &cb_data);
|
||||
|
||||
out:
|
||||
|
|
|
@ -173,6 +173,8 @@ struct meson_host {
|
|||
int irq;
|
||||
|
||||
bool vqmmc_enabled;
|
||||
bool needs_pre_post_req;
|
||||
|
||||
};
|
||||
|
||||
#define CMD_CFG_LENGTH_MASK GENMASK(8, 0)
|
||||
|
@ -663,6 +665,8 @@ static void meson_mmc_request_done(struct mmc_host *mmc,
|
|||
struct meson_host *host = mmc_priv(mmc);
|
||||
|
||||
host->cmd = NULL;
|
||||
if (host->needs_pre_post_req)
|
||||
meson_mmc_post_req(mmc, mrq, 0);
|
||||
mmc_request_done(host->mmc, mrq);
|
||||
}
|
||||
|
||||
|
@ -880,7 +884,7 @@ static int meson_mmc_validate_dram_access(struct mmc_host *mmc, struct mmc_data
|
|||
static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
||||
{
|
||||
struct meson_host *host = mmc_priv(mmc);
|
||||
bool needs_pre_post_req = mrq->data &&
|
||||
host->needs_pre_post_req = mrq->data &&
|
||||
!(mrq->data->host_cookie & SD_EMMC_PRE_REQ_DONE);
|
||||
|
||||
/*
|
||||
|
@ -896,22 +900,19 @@ static void meson_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|||
}
|
||||
}
|
||||
|
||||
if (needs_pre_post_req) {
|
||||
if (host->needs_pre_post_req) {
|
||||
meson_mmc_get_transfer_mode(mmc, mrq);
|
||||
if (!meson_mmc_desc_chain_mode(mrq->data))
|
||||
needs_pre_post_req = false;
|
||||
host->needs_pre_post_req = false;
|
||||
}
|
||||
|
||||
if (needs_pre_post_req)
|
||||
if (host->needs_pre_post_req)
|
||||
meson_mmc_pre_req(mmc, mrq);
|
||||
|
||||
/* Stop execution */
|
||||
writel(0, host->regs + SD_EMMC_START);
|
||||
|
||||
meson_mmc_start_cmd(mmc, mrq->sbc ?: mrq->cmd);
|
||||
|
||||
if (needs_pre_post_req)
|
||||
meson_mmc_post_req(mmc, mrq, 0);
|
||||
}
|
||||
|
||||
static void meson_mmc_read_resp(struct mmc_host *mmc, struct mmc_command *cmd)
|
||||
|
|
Загрузка…
Ссылка в новой задаче