Commit da91a8f9 authored by Russell King's avatar Russell King Committed by Chris Ball

mmc: sdhci: track whether preset mode is currently enabled in hardware

Track whether preset mode is currently enabled in hardware, and use that
when making decisions elsewhere in the code rather than reading the
register and checking the bit.
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Tested-by: default avatarMarkus Pargmann <mpa@pengutronix.de>
Tested-by: default avatarStephen Warren <swarren@nvidia.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: default avatarChris Ball <chris@printf.net>
parent 24fbb3ca
...@@ -205,9 +205,14 @@ static void sdhci_do_reset(struct sdhci_host *host, u8 mask) ...@@ -205,9 +205,14 @@ static void sdhci_do_reset(struct sdhci_host *host, u8 mask)
host->ops->reset(host, mask); host->ops->reset(host, mask);
if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { if (mask & SDHCI_RESET_ALL) {
if ((host->ops->enable_dma) && (mask & SDHCI_RESET_ALL)) if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
host->ops->enable_dma(host); if (host->ops->enable_dma)
host->ops->enable_dma(host);
}
/* Resetting the controller clears many */
host->preset_enabled = false;
} }
} }
...@@ -1126,8 +1131,7 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) ...@@ -1126,8 +1131,7 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
return; return;
if (host->version >= SDHCI_SPEC_300) { if (host->version >= SDHCI_SPEC_300) {
if (sdhci_readw(host, SDHCI_HOST_CONTROL2) & if (host->preset_enabled) {
SDHCI_CTRL_PRESET_VAL_ENABLE) {
u16 pre_val; u16 pre_val;
clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
...@@ -1493,13 +1497,13 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) ...@@ -1493,13 +1497,13 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios)
(ios->timing == MMC_TIMING_UHS_SDR25)) (ios->timing == MMC_TIMING_UHS_SDR25))
ctrl |= SDHCI_CTRL_HISPD; ctrl |= SDHCI_CTRL_HISPD;
ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); if (!host->preset_enabled) {
if (!(ctrl_2 & SDHCI_CTRL_PRESET_VAL_ENABLE)) {
sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
/* /*
* We only need to set Driver Strength if the * We only need to set Driver Strength if the
* preset value enable is not set. * preset value enable is not set.
*/ */
ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
ctrl_2 &= ~SDHCI_CTRL_DRV_TYPE_MASK; ctrl_2 &= ~SDHCI_CTRL_DRV_TYPE_MASK;
if (ios->drv_type == MMC_SET_DRIVER_TYPE_A) if (ios->drv_type == MMC_SET_DRIVER_TYPE_A)
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_A; ctrl_2 |= SDHCI_CTRL_DRV_TYPE_A;
...@@ -2018,26 +2022,30 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) ...@@ -2018,26 +2022,30 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
static void sdhci_enable_preset_value(struct sdhci_host *host, bool enable) static void sdhci_enable_preset_value(struct sdhci_host *host, bool enable)
{ {
u16 ctrl;
/* Host Controller v3.00 defines preset value registers */ /* Host Controller v3.00 defines preset value registers */
if (host->version < SDHCI_SPEC_300) if (host->version < SDHCI_SPEC_300)
return; return;
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
/* /*
* We only enable or disable Preset Value if they are not already * We only enable or disable Preset Value if they are not already
* enabled or disabled respectively. Otherwise, we bail out. * enabled or disabled respectively. Otherwise, we bail out.
*/ */
if (enable && !(ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) { if (host->preset_enabled != enable) {
ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE; u16 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
host->flags |= SDHCI_PV_ENABLED; if (enable)
} else if (!enable && (ctrl & SDHCI_CTRL_PRESET_VAL_ENABLE)) { ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE;
ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE; else
ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE;
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
host->flags &= ~SDHCI_PV_ENABLED;
if (enable)
host->flags |= SDHCI_PV_ENABLED;
else
host->flags &= ~SDHCI_PV_ENABLED;
host->preset_enabled = enable;
} }
} }
......
...@@ -143,6 +143,7 @@ struct sdhci_host { ...@@ -143,6 +143,7 @@ struct sdhci_host {
bool runtime_suspended; /* Host is runtime suspended */ bool runtime_suspended; /* Host is runtime suspended */
bool bus_on; /* Bus power prevents runtime suspend */ bool bus_on; /* Bus power prevents runtime suspend */
bool preset_enabled; /* Preset is enabled */
struct mmc_request *mrq; /* Current request */ struct mmc_request *mrq; /* Current request */
struct mmc_command *cmd; /* Current command */ struct mmc_command *cmd; /* Current command */
......
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