Commit 2c9b3ebd authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mmc-v4.5-rc1' of git://git.linaro.org/people/ulf.hansson/mmc

Pull MMC fixes from Ulf Hansson:
 "Here are some mmc fixes intended for v4.5 rc1.

  MMC core:
   - Restore reset-gpios to be optional in pwrseq_simple
   - Allow SDIO tuple for CISTPL_SDIO_STD
   - Print correct voltage value in debugfs
   - Enable tuning according to the actual timing
   - Limit SD card power limit according to cards capabilities

  MMC host:
   - tmio_mmc_dma: don't print invalid DMA cookie
   - mmci: Pick the correct variant and allow 8-bit mode for Nomadik"

* tag 'mmc-v4.5-rc1' of git://git.linaro.org/people/ulf.hansson/mmc:
  mmc: pwrseq_simple: Make reset-gpios optional to match doc
  mmc: sdio_cis: fix unknown tuple for CISTPL_SDIO_STD
  mmc: debugfs: correct wrong voltage value
  mmc: tmio_mmc_dma: don't print invalid DMA cookie
  mmc: core: Enable tuning according to the actual timing
  mmc: mmci: support 8bit mode on the Nomadik
  mmc: mmci: fix an ages old detection error
  mmc: sd: limit SD card power limit according to cards capabilities
parents 48162a20 64a67d47
...@@ -170,7 +170,7 @@ static int mmc_ios_show(struct seq_file *s, void *data) ...@@ -170,7 +170,7 @@ static int mmc_ios_show(struct seq_file *s, void *data)
str = "invalid"; str = "invalid";
break; break;
} }
seq_printf(s, "signal voltage:\t%u (%s)\n", ios->chip_select, str); seq_printf(s, "signal voltage:\t%u (%s)\n", ios->signal_voltage, str);
switch (ios->drv_type) { switch (ios->drv_type) {
case MMC_SET_DRIVER_TYPE_A: case MMC_SET_DRIVER_TYPE_A:
......
...@@ -29,15 +29,18 @@ struct mmc_pwrseq_simple { ...@@ -29,15 +29,18 @@ struct mmc_pwrseq_simple {
static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq, static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq,
int value) int value)
{ {
int i;
struct gpio_descs *reset_gpios = pwrseq->reset_gpios; struct gpio_descs *reset_gpios = pwrseq->reset_gpios;
int values[reset_gpios->ndescs];
for (i = 0; i < reset_gpios->ndescs; i++) if (!IS_ERR(reset_gpios)) {
values[i] = value; int i;
int values[reset_gpios->ndescs];
gpiod_set_array_value_cansleep(reset_gpios->ndescs, reset_gpios->desc, for (i = 0; i < reset_gpios->ndescs; i++)
values); values[i] = value;
gpiod_set_array_value_cansleep(
reset_gpios->ndescs, reset_gpios->desc, values);
}
} }
static void mmc_pwrseq_simple_pre_power_on(struct mmc_host *host) static void mmc_pwrseq_simple_pre_power_on(struct mmc_host *host)
...@@ -79,7 +82,8 @@ static void mmc_pwrseq_simple_free(struct mmc_host *host) ...@@ -79,7 +82,8 @@ static void mmc_pwrseq_simple_free(struct mmc_host *host)
struct mmc_pwrseq_simple *pwrseq = container_of(host->pwrseq, struct mmc_pwrseq_simple *pwrseq = container_of(host->pwrseq,
struct mmc_pwrseq_simple, pwrseq); struct mmc_pwrseq_simple, pwrseq);
gpiod_put_array(pwrseq->reset_gpios); if (!IS_ERR(pwrseq->reset_gpios))
gpiod_put_array(pwrseq->reset_gpios);
if (!IS_ERR(pwrseq->ext_clk)) if (!IS_ERR(pwrseq->ext_clk))
clk_put(pwrseq->ext_clk); clk_put(pwrseq->ext_clk);
...@@ -112,7 +116,9 @@ struct mmc_pwrseq *mmc_pwrseq_simple_alloc(struct mmc_host *host, ...@@ -112,7 +116,9 @@ struct mmc_pwrseq *mmc_pwrseq_simple_alloc(struct mmc_host *host,
} }
pwrseq->reset_gpios = gpiod_get_array(dev, "reset", GPIOD_OUT_HIGH); pwrseq->reset_gpios = gpiod_get_array(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(pwrseq->reset_gpios)) { if (IS_ERR(pwrseq->reset_gpios) &&
PTR_ERR(pwrseq->reset_gpios) != -ENOENT &&
PTR_ERR(pwrseq->reset_gpios) != -ENOSYS) {
ret = PTR_ERR(pwrseq->reset_gpios); ret = PTR_ERR(pwrseq->reset_gpios);
goto clk_put; goto clk_put;
} }
......
...@@ -329,6 +329,7 @@ static int mmc_read_switch(struct mmc_card *card) ...@@ -329,6 +329,7 @@ static int mmc_read_switch(struct mmc_card *card)
card->sw_caps.sd3_bus_mode = status[13]; card->sw_caps.sd3_bus_mode = status[13];
/* Driver Strengths supported by the card */ /* Driver Strengths supported by the card */
card->sw_caps.sd3_drv_type = status[9]; card->sw_caps.sd3_drv_type = status[9];
card->sw_caps.sd3_curr_limit = status[7] | status[6] << 8;
} }
out: out:
...@@ -545,14 +546,25 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status) ...@@ -545,14 +546,25 @@ static int sd_set_current_limit(struct mmc_card *card, u8 *status)
* when we set current limit to 200ma, the card will draw 200ma, and * when we set current limit to 200ma, the card will draw 200ma, and
* when we set current limit to 400/600/800ma, the card will draw its * when we set current limit to 400/600/800ma, the card will draw its
* maximum 300ma from the host. * maximum 300ma from the host.
*
* The above is incorrect: if we try to set a current limit that is
* not supported by the card, the card can rightfully error out the
* attempt, and remain at the default current limit. This results
* in a 300mA card being limited to 200mA even though the host
* supports 800mA. Failures seen with SanDisk 8GB UHS cards with
* an iMX6 host. --rmk
*/ */
if (max_current >= 800) if (max_current >= 800 &&
card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_800)
current_limit = SD_SET_CURRENT_LIMIT_800; current_limit = SD_SET_CURRENT_LIMIT_800;
else if (max_current >= 600) else if (max_current >= 600 &&
card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_600)
current_limit = SD_SET_CURRENT_LIMIT_600; current_limit = SD_SET_CURRENT_LIMIT_600;
else if (max_current >= 400) else if (max_current >= 400 &&
card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_400)
current_limit = SD_SET_CURRENT_LIMIT_400; current_limit = SD_SET_CURRENT_LIMIT_400;
else if (max_current >= 200) else if (max_current >= 200 &&
card->sw_caps.sd3_curr_limit & SD_MAX_CURRENT_200)
current_limit = SD_SET_CURRENT_LIMIT_200; current_limit = SD_SET_CURRENT_LIMIT_200;
if (current_limit != SD_SET_CURRENT_NO_CHANGE) { if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
...@@ -626,9 +638,9 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) ...@@ -626,9 +638,9 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card)
* SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104.
*/ */
if (!mmc_host_is_spi(card->host) && if (!mmc_host_is_spi(card->host) &&
(card->sd_bus_speed == UHS_SDR50_BUS_SPEED || (card->host->ios.timing == MMC_TIMING_UHS_SDR50 ||
card->sd_bus_speed == UHS_DDR50_BUS_SPEED || card->host->ios.timing == MMC_TIMING_UHS_DDR50 ||
card->sd_bus_speed == UHS_SDR104_BUS_SPEED)) { card->host->ios.timing == MMC_TIMING_UHS_SDR104)) {
err = mmc_execute_tuning(card); err = mmc_execute_tuning(card);
/* /*
...@@ -638,7 +650,7 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) ...@@ -638,7 +650,7 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card)
* difference between v3.00 and 3.01 spec means that CMD19 * difference between v3.00 and 3.01 spec means that CMD19
* tuning is also available for DDR50 mode. * tuning is also available for DDR50 mode.
*/ */
if (err && card->sd_bus_speed == UHS_DDR50_BUS_SPEED) { if (err && card->host->ios.timing == MMC_TIMING_UHS_DDR50) {
pr_warn("%s: ddr50 tuning failed\n", pr_warn("%s: ddr50 tuning failed\n",
mmc_hostname(card->host)); mmc_hostname(card->host));
err = 0; err = 0;
......
...@@ -535,8 +535,8 @@ static int mmc_sdio_init_uhs_card(struct mmc_card *card) ...@@ -535,8 +535,8 @@ static int mmc_sdio_init_uhs_card(struct mmc_card *card)
* SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104.
*/ */
if (!mmc_host_is_spi(card->host) && if (!mmc_host_is_spi(card->host) &&
((card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR50) || ((card->host->ios.timing == MMC_TIMING_UHS_SDR50) ||
(card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104))) (card->host->ios.timing == MMC_TIMING_UHS_SDR104)))
err = mmc_execute_tuning(card); err = mmc_execute_tuning(card);
out: out:
return err; return err;
......
...@@ -223,6 +223,7 @@ static const struct cis_tpl cis_tpl_list[] = { ...@@ -223,6 +223,7 @@ static const struct cis_tpl cis_tpl_list[] = {
{ 0x20, 4, cistpl_manfid }, { 0x20, 4, cistpl_manfid },
{ 0x21, 2, /* cistpl_funcid */ }, { 0x21, 2, /* cistpl_funcid */ },
{ 0x22, 0, cistpl_funce }, { 0x22, 0, cistpl_funce },
{ 0x91, 2, /* cistpl_sdio_std */ },
}; };
static int sdio_read_cis(struct mmc_card *card, struct sdio_func *func) static int sdio_read_cis(struct mmc_card *card, struct sdio_func *func)
......
...@@ -151,6 +151,7 @@ static struct variant_data variant_nomadik = { ...@@ -151,6 +151,7 @@ static struct variant_data variant_nomadik = {
.fifosize = 16 * 4, .fifosize = 16 * 4,
.fifohalfsize = 8 * 4, .fifohalfsize = 8 * 4,
.clkreg = MCI_CLK_ENABLE, .clkreg = MCI_CLK_ENABLE,
.clkreg_8bit_bus_enable = MCI_ST_8BIT_BUS,
.datalength_bits = 24, .datalength_bits = 24,
.datactrl_mask_sdio = MCI_ST_DPSM_SDIOEN, .datactrl_mask_sdio = MCI_ST_DPSM_SDIOEN,
.st_sdio = true, .st_sdio = true,
...@@ -1886,7 +1887,7 @@ static struct amba_id mmci_ids[] = { ...@@ -1886,7 +1887,7 @@ static struct amba_id mmci_ids[] = {
{ {
.id = 0x00280180, .id = 0x00280180,
.mask = 0x00ffffff, .mask = 0x00ffffff,
.data = &variant_u300, .data = &variant_nomadik,
}, },
{ {
.id = 0x00480180, .id = 0x00480180,
......
...@@ -94,9 +94,9 @@ static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host) ...@@ -94,9 +94,9 @@ static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host)
desc = NULL; desc = NULL;
ret = cookie; ret = cookie;
} }
dev_dbg(&host->pdev->dev, "%s(): mapped %d -> %d, cookie %d, rq %p\n",
__func__, host->sg_len, ret, cookie, host->mrq);
} }
dev_dbg(&host->pdev->dev, "%s(): mapped %d -> %d, cookie %d, rq %p\n",
__func__, host->sg_len, ret, cookie, host->mrq);
pio: pio:
if (!desc) { if (!desc) {
...@@ -116,8 +116,8 @@ static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host) ...@@ -116,8 +116,8 @@ static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host)
"DMA failed: %d, falling back to PIO\n", ret); "DMA failed: %d, falling back to PIO\n", ret);
} }
dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d, sg[%d]\n", __func__, dev_dbg(&host->pdev->dev, "%s(): desc %p, sg[%d]\n", __func__,
desc, cookie, host->sg_len); desc, host->sg_len);
} }
static void tmio_mmc_start_dma_tx(struct tmio_mmc_host *host) static void tmio_mmc_start_dma_tx(struct tmio_mmc_host *host)
...@@ -174,9 +174,9 @@ static void tmio_mmc_start_dma_tx(struct tmio_mmc_host *host) ...@@ -174,9 +174,9 @@ static void tmio_mmc_start_dma_tx(struct tmio_mmc_host *host)
desc = NULL; desc = NULL;
ret = cookie; ret = cookie;
} }
dev_dbg(&host->pdev->dev, "%s(): mapped %d -> %d, cookie %d, rq %p\n",
__func__, host->sg_len, ret, cookie, host->mrq);
} }
dev_dbg(&host->pdev->dev, "%s(): mapped %d -> %d, cookie %d, rq %p\n",
__func__, host->sg_len, ret, cookie, host->mrq);
pio: pio:
if (!desc) { if (!desc) {
...@@ -196,8 +196,7 @@ static void tmio_mmc_start_dma_tx(struct tmio_mmc_host *host) ...@@ -196,8 +196,7 @@ static void tmio_mmc_start_dma_tx(struct tmio_mmc_host *host)
"DMA failed: %d, falling back to PIO\n", ret); "DMA failed: %d, falling back to PIO\n", ret);
} }
dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d\n", __func__, dev_dbg(&host->pdev->dev, "%s(): desc %p\n", __func__, desc);
desc, cookie);
} }
void tmio_mmc_start_dma(struct tmio_mmc_host *host, void tmio_mmc_start_dma(struct tmio_mmc_host *host,
......
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