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";
|
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 {
|
||||||
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)
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
* 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)
|
||||||
* 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)
|
||||||
* 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)
|
||||||
* 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[] = {
|
||||||
{ 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 = {
|
||||||
.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[] = {
|
||||||
{
|
{
|
||||||
.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)
|
||||||
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 @@ pio:
|
||||||
"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)
|
||||||
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 @@ pio:
|
||||||
"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,
|
||||||
|
|
Loading…
Reference in a new issue