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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWoNsyAAoJEP4mhCVzWIwpIRIQAI810eEDwpDD1JLbnZ+X+ud1 PrnIWWtZb1jFCrcwwUXISBoDVuP7MRiysZYlxSmphPsObV9CbH1lLPjbIM6VkIep kOTwvq0YEhkQY+hfCD1JgvJS5Pw2XmVxpMveCq5ZifOhslTYJ5Uolo1DY2sLTBbc kqbIKJAGgWStrKiUp95RVfUsZ5b2cbE7wOslCHuhmgT7RGa6Ot1z6dIcRN+rmLcx s8EYlvbjOXEJApNl0Rm3pBQvTrb/u91imomYnnopugmLsvLqqyeo6Mv9RSkTKbJ/ VejMrctt+bw7yA0I+y2swf8phpG+8zkmdMnNC0DyUhNU6UTgPgQqaKO5HIpXN3+U iJD2zQIS+e+s41JETR3e0JxTrCTMDZ8bt+nL/bIrvaTekOobtaQSM55N9tJfNhEq mp6chv5VkbGQdZg6k42pCSWoKabHVLVLB2MR1sDeiUshPf8vORbGBoidv3uh9wWh dUj/nTrvhmBu0BkuWridKDxDfWJv9wBXXYAhWihfFX6O47ljsLu+IQN7u7669m/h JAEjDN+rdXJZdF45xkSpX4Y62f0GaIO0LQxgDUnqjVE17i/J6BOAXzVhwc0WKA7F p3YeOCg1Y+aDY4yu8zYZb7okaZFZhrvCMuSgqq0dRGukPaakiLxsVkUCvOaQTBKX EoeErl0SKiLTYz/uQrFS =dHj5 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
2c9b3ebd59
@ -170,7 +170,7 @@ static int mmc_ios_show(struct seq_file *s, void *data)
|
||||
str = "invalid";
|
||||
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) {
|
||||
case MMC_SET_DRIVER_TYPE_A:
|
||||
|
@ -29,15 +29,18 @@ struct mmc_pwrseq_simple {
|
||||
static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq,
|
||||
int value)
|
||||
{
|
||||
int i;
|
||||
struct gpio_descs *reset_gpios = pwrseq->reset_gpios;
|
||||
int values[reset_gpios->ndescs];
|
||||
|
||||
for (i = 0; i < reset_gpios->ndescs; i++)
|
||||
values[i] = value;
|
||||
if (!IS_ERR(reset_gpios)) {
|
||||
int i;
|
||||
int values[reset_gpios->ndescs];
|
||||
|
||||
gpiod_set_array_value_cansleep(reset_gpios->ndescs, reset_gpios->desc,
|
||||
values);
|
||||
for (i = 0; i < reset_gpios->ndescs; i++)
|
||||
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)
|
||||
@ -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);
|
||||
|
||||
gpiod_put_array(pwrseq->reset_gpios);
|
||||
if (!IS_ERR(pwrseq->reset_gpios))
|
||||
gpiod_put_array(pwrseq->reset_gpios);
|
||||
|
||||
if (!IS_ERR(pwrseq->ext_clk))
|
||||
clk_put(pwrseq->ext_clk);
|
||||
@ -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);
|
||||
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);
|
||||
goto clk_put;
|
||||
}
|
||||
|
@ -329,6 +329,7 @@ static int mmc_read_switch(struct mmc_card *card)
|
||||
card->sw_caps.sd3_bus_mode = status[13];
|
||||
/* Driver Strengths supported by the card */
|
||||
card->sw_caps.sd3_drv_type = status[9];
|
||||
card->sw_caps.sd3_curr_limit = status[7] | status[6] << 8;
|
||||
}
|
||||
|
||||
out:
|
||||
@ -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 400/600/800ma, the card will draw its
|
||||
* 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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
if (current_limit != SD_SET_CURRENT_NO_CHANGE) {
|
||||
@ -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.
|
||||
*/
|
||||
if (!mmc_host_is_spi(card->host) &&
|
||||
(card->sd_bus_speed == UHS_SDR50_BUS_SPEED ||
|
||||
card->sd_bus_speed == UHS_DDR50_BUS_SPEED ||
|
||||
card->sd_bus_speed == UHS_SDR104_BUS_SPEED)) {
|
||||
(card->host->ios.timing == MMC_TIMING_UHS_SDR50 ||
|
||||
card->host->ios.timing == MMC_TIMING_UHS_DDR50 ||
|
||||
card->host->ios.timing == MMC_TIMING_UHS_SDR104)) {
|
||||
err = mmc_execute_tuning(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
|
||||
* 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",
|
||||
mmc_hostname(card->host));
|
||||
err = 0;
|
||||
|
@ -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.
|
||||
*/
|
||||
if (!mmc_host_is_spi(card->host) &&
|
||||
((card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR50) ||
|
||||
(card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104)))
|
||||
((card->host->ios.timing == MMC_TIMING_UHS_SDR50) ||
|
||||
(card->host->ios.timing == MMC_TIMING_UHS_SDR104)))
|
||||
err = mmc_execute_tuning(card);
|
||||
out:
|
||||
return err;
|
||||
|
@ -223,6 +223,7 @@ static const struct cis_tpl cis_tpl_list[] = {
|
||||
{ 0x20, 4, cistpl_manfid },
|
||||
{ 0x21, 2, /* cistpl_funcid */ },
|
||||
{ 0x22, 0, cistpl_funce },
|
||||
{ 0x91, 2, /* cistpl_sdio_std */ },
|
||||
};
|
||||
|
||||
static int sdio_read_cis(struct mmc_card *card, struct sdio_func *func)
|
||||
|
@ -151,6 +151,7 @@ static struct variant_data variant_nomadik = {
|
||||
.fifosize = 16 * 4,
|
||||
.fifohalfsize = 8 * 4,
|
||||
.clkreg = MCI_CLK_ENABLE,
|
||||
.clkreg_8bit_bus_enable = MCI_ST_8BIT_BUS,
|
||||
.datalength_bits = 24,
|
||||
.datactrl_mask_sdio = MCI_ST_DPSM_SDIOEN,
|
||||
.st_sdio = true,
|
||||
@ -1886,7 +1887,7 @@ static struct amba_id mmci_ids[] = {
|
||||
{
|
||||
.id = 0x00280180,
|
||||
.mask = 0x00ffffff,
|
||||
.data = &variant_u300,
|
||||
.data = &variant_nomadik,
|
||||
},
|
||||
{
|
||||
.id = 0x00480180,
|
||||
|
@ -94,9 +94,9 @@ static void tmio_mmc_start_dma_rx(struct tmio_mmc_host *host)
|
||||
desc = NULL;
|
||||
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:
|
||||
if (!desc) {
|
||||
@ -116,8 +116,8 @@ pio:
|
||||
"DMA failed: %d, falling back to PIO\n", ret);
|
||||
}
|
||||
|
||||
dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d, sg[%d]\n", __func__,
|
||||
desc, cookie, host->sg_len);
|
||||
dev_dbg(&host->pdev->dev, "%s(): desc %p, sg[%d]\n", __func__,
|
||||
desc, host->sg_len);
|
||||
}
|
||||
|
||||
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;
|
||||
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:
|
||||
if (!desc) {
|
||||
@ -196,8 +196,7 @@ pio:
|
||||
"DMA failed: %d, falling back to PIO\n", ret);
|
||||
}
|
||||
|
||||
dev_dbg(&host->pdev->dev, "%s(): desc %p, cookie %d\n", __func__,
|
||||
desc, cookie);
|
||||
dev_dbg(&host->pdev->dev, "%s(): desc %p\n", __func__, desc);
|
||||
}
|
||||
|
||||
void tmio_mmc_start_dma(struct tmio_mmc_host *host,
|
||||
|
Loading…
Reference in New Issue
Block a user