Commit f76a30a9 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mmc-v6.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

Pull mmc fixes from Ulf Hansson:
 "MMC core:
   - Fix NULL dereference for mmc_test on allocation failure

  MMC host:
   - dw_mmc: Fix support for deferred probe for biu/ciu clocks
   - mtk-sd: Fix CMD8 support when fragile tuning settings"

* tag 'mmc-v6.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
  mmc: mmc_test: Fix NULL dereference on allocation failure
  mmc: dw_mmc: allow biu and ciu clocks to defer
  mmc: mtk-sd: receive cmd8 data when hs400 tuning fail
parents c2a905a6 a1e627af
...@@ -3125,13 +3125,13 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf, ...@@ -3125,13 +3125,13 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL); test->buffer = kzalloc(BUFFER_SIZE, GFP_KERNEL);
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
test->highmem = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, BUFFER_ORDER); test->highmem = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, BUFFER_ORDER);
if (!test->highmem) {
count = -ENOMEM;
goto free_test_buffer;
}
#endif #endif
#ifdef CONFIG_HIGHMEM
if (test->buffer && test->highmem) {
#else
if (test->buffer) { if (test->buffer) {
#endif
mutex_lock(&mmc_test_lock); mutex_lock(&mmc_test_lock);
mmc_test_run(test, testcase); mmc_test_run(test, testcase);
mutex_unlock(&mmc_test_lock); mutex_unlock(&mmc_test_lock);
...@@ -3139,6 +3139,7 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf, ...@@ -3139,6 +3139,7 @@ static ssize_t mtf_test_write(struct file *file, const char __user *buf,
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
__free_pages(test->highmem, BUFFER_ORDER); __free_pages(test->highmem, BUFFER_ORDER);
free_test_buffer:
#endif #endif
kfree(test->buffer); kfree(test->buffer);
kfree(test); kfree(test);
......
...@@ -3299,6 +3299,10 @@ int dw_mci_probe(struct dw_mci *host) ...@@ -3299,6 +3299,10 @@ int dw_mci_probe(struct dw_mci *host)
host->biu_clk = devm_clk_get(host->dev, "biu"); host->biu_clk = devm_clk_get(host->dev, "biu");
if (IS_ERR(host->biu_clk)) { if (IS_ERR(host->biu_clk)) {
dev_dbg(host->dev, "biu clock not available\n"); dev_dbg(host->dev, "biu clock not available\n");
ret = PTR_ERR(host->biu_clk);
if (ret == -EPROBE_DEFER)
return ret;
} else { } else {
ret = clk_prepare_enable(host->biu_clk); ret = clk_prepare_enable(host->biu_clk);
if (ret) { if (ret) {
...@@ -3310,6 +3314,10 @@ int dw_mci_probe(struct dw_mci *host) ...@@ -3310,6 +3314,10 @@ int dw_mci_probe(struct dw_mci *host)
host->ciu_clk = devm_clk_get(host->dev, "ciu"); host->ciu_clk = devm_clk_get(host->dev, "ciu");
if (IS_ERR(host->ciu_clk)) { if (IS_ERR(host->ciu_clk)) {
dev_dbg(host->dev, "ciu clock not available\n"); dev_dbg(host->dev, "ciu clock not available\n");
ret = PTR_ERR(host->ciu_clk);
if (ret == -EPROBE_DEFER)
goto err_clk_biu;
host->bus_hz = host->pdata->bus_hz; host->bus_hz = host->pdata->bus_hz;
} else { } else {
ret = clk_prepare_enable(host->ciu_clk); ret = clk_prepare_enable(host->ciu_clk);
......
...@@ -1230,7 +1230,7 @@ static bool msdc_cmd_done(struct msdc_host *host, int events, ...@@ -1230,7 +1230,7 @@ static bool msdc_cmd_done(struct msdc_host *host, int events,
} }
if (!sbc_error && !(events & MSDC_INT_CMDRDY)) { if (!sbc_error && !(events & MSDC_INT_CMDRDY)) {
if (events & MSDC_INT_CMDTMO || if ((events & MSDC_INT_CMDTMO && !host->hs400_tuning) ||
(!mmc_op_tuning(cmd->opcode) && !host->hs400_tuning)) (!mmc_op_tuning(cmd->opcode) && !host->hs400_tuning))
/* /*
* should not clear fifo/interrupt as the tune data * should not clear fifo/interrupt as the tune data
...@@ -1323,9 +1323,9 @@ static void msdc_start_command(struct msdc_host *host, ...@@ -1323,9 +1323,9 @@ static void msdc_start_command(struct msdc_host *host,
static void msdc_cmd_next(struct msdc_host *host, static void msdc_cmd_next(struct msdc_host *host,
struct mmc_request *mrq, struct mmc_command *cmd) struct mmc_request *mrq, struct mmc_command *cmd)
{ {
if ((cmd->error && if ((cmd->error && !host->hs400_tuning &&
!(cmd->error == -EILSEQ && !(cmd->error == -EILSEQ &&
(mmc_op_tuning(cmd->opcode) || host->hs400_tuning))) || mmc_op_tuning(cmd->opcode))) ||
(mrq->sbc && mrq->sbc->error)) (mrq->sbc && mrq->sbc->error))
msdc_request_done(host, mrq); msdc_request_done(host, mrq);
else if (cmd == mrq->sbc) else if (cmd == mrq->sbc)
......
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