Skip to content

Commit 2a85ef2

Browse files
ahunter6storulf
authored andcommitted
mmc: sdhci: Reduce spin lock usage in sdhci_execute_tuning
Tuning execution is already synchronized with respect to other host operations by upper layers "claiming" the host, which also takes care of runtime pm. There can be no requests in progress. Retain the spin lock usage only for ensuring that sending tuning commands is synchronized with respect to the interrupt handler. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Tested-by: Ludovic Desroches <ludovic.desroches@microchip.com>
1 parent d1e4f74 commit 2a85ef2

File tree

1 file changed

+14
-22
lines changed

1 file changed

+14
-22
lines changed

drivers/mmc/host/sdhci.c

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1993,8 +1993,7 @@ static void sdhci_reset_tuning(struct sdhci_host *host)
19931993
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
19941994
}
19951995

1996-
static void sdhci_abort_tuning(struct sdhci_host *host, u32 opcode,
1997-
unsigned long flags)
1996+
static void sdhci_abort_tuning(struct sdhci_host *host, u32 opcode)
19981997
{
19991998
sdhci_reset_tuning(host);
20001999

@@ -2003,9 +2002,7 @@ static void sdhci_abort_tuning(struct sdhci_host *host, u32 opcode,
20032002

20042003
sdhci_end_tuning(host);
20052004

2006-
spin_unlock_irqrestore(&host->lock, flags);
20072005
mmc_abort_tuning(host->mmc, opcode);
2008-
spin_lock_irqsave(&host->lock, flags);
20092006
}
20102007

20112008
/*
@@ -2015,12 +2012,14 @@ static void sdhci_abort_tuning(struct sdhci_host *host, u32 opcode,
20152012
* interrupt setup is different to other commands and there is no timeout
20162013
* interrupt so special handling is needed.
20172014
*/
2018-
static void sdhci_send_tuning(struct sdhci_host *host, u32 opcode,
2019-
unsigned long flags)
2015+
static void sdhci_send_tuning(struct sdhci_host *host, u32 opcode)
20202016
{
20212017
struct mmc_host *mmc = host->mmc;
20222018
struct mmc_command cmd = {};
20232019
struct mmc_request mrq = {};
2020+
unsigned long flags;
2021+
2022+
spin_lock_irqsave(&host->lock, flags);
20242023

20252024
cmd.opcode = opcode;
20262025
cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
@@ -2054,17 +2053,16 @@ static void sdhci_send_tuning(struct sdhci_host *host, u32 opcode,
20542053

20552054
host->tuning_done = 0;
20562055

2056+
mmiowb();
20572057
spin_unlock_irqrestore(&host->lock, flags);
20582058

20592059
/* Wait for Buffer Read Ready interrupt */
20602060
wait_event_timeout(host->buf_ready_int, (host->tuning_done == 1),
20612061
msecs_to_jiffies(50));
20622062

2063-
spin_lock_irqsave(&host->lock, flags);
20642063
}
20652064

2066-
static void __sdhci_execute_tuning(struct sdhci_host *host, u32 opcode,
2067-
unsigned long flags)
2065+
static void __sdhci_execute_tuning(struct sdhci_host *host, u32 opcode)
20682066
{
20692067
int i;
20702068

@@ -2075,12 +2073,12 @@ static void __sdhci_execute_tuning(struct sdhci_host *host, u32 opcode,
20752073
for (i = 0; i < MAX_TUNING_LOOP; i++) {
20762074
u16 ctrl;
20772075

2078-
sdhci_send_tuning(host, opcode, flags);
2076+
sdhci_send_tuning(host, opcode);
20792077

20802078
if (!host->tuning_done) {
20812079
pr_info("%s: Tuning timeout, falling back to fixed sampling clock\n",
20822080
mmc_hostname(host->mmc));
2083-
sdhci_abort_tuning(host, opcode, flags);
2081+
sdhci_abort_tuning(host, opcode);
20842082
return;
20852083
}
20862084

@@ -2105,12 +2103,9 @@ int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
21052103
{
21062104
struct sdhci_host *host = mmc_priv(mmc);
21072105
int err = 0;
2108-
unsigned long flags;
21092106
unsigned int tuning_count = 0;
21102107
bool hs400_tuning;
21112108

2112-
spin_lock_irqsave(&host->lock, flags);
2113-
21142109
hs400_tuning = host->flags & SDHCI_HS400_TUNING;
21152110

21162111
if (host->tuning_mode == SDHCI_TUNING_MODE_1)
@@ -2127,7 +2122,7 @@ int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
21272122
/* HS400 tuning is done in HS200 mode */
21282123
case MMC_TIMING_MMC_HS400:
21292124
err = -EINVAL;
2130-
goto out_unlock;
2125+
goto out;
21312126

21322127
case MMC_TIMING_MMC_HS200:
21332128
/*
@@ -2148,26 +2143,23 @@ int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
21482143
/* FALLTHROUGH */
21492144

21502145
default:
2151-
goto out_unlock;
2146+
goto out;
21522147
}
21532148

21542149
if (host->ops->platform_execute_tuning) {
2155-
spin_unlock_irqrestore(&host->lock, flags);
21562150
err = host->ops->platform_execute_tuning(host, opcode);
2157-
spin_lock_irqsave(&host->lock, flags);
2158-
goto out_unlock;
2151+
goto out;
21592152
}
21602153

21612154
host->mmc->retune_period = tuning_count;
21622155

21632156
sdhci_start_tuning(host);
21642157

2165-
__sdhci_execute_tuning(host, opcode, flags);
2158+
__sdhci_execute_tuning(host, opcode);
21662159

21672160
sdhci_end_tuning(host);
2168-
out_unlock:
2161+
out:
21692162
host->flags &= ~SDHCI_HS400_TUNING;
2170-
spin_unlock_irqrestore(&host->lock, flags);
21712163

21722164
return err;
21732165
}

0 commit comments

Comments
 (0)