From: adrian.hunter@intel.com (Adrian Hunter)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V2 08/15] mmc: sdhci: add standard hw auto retuning support
Date: Thu, 21 Jul 2016 10:46:57 +0300 [thread overview]
Message-ID: <57907DF1.60104@intel.com> (raw)
In-Reply-To: <1468309584-3591-9-git-send-email-aisheng.dong@nxp.com>
On 12/07/16 10:46, Dong Aisheng wrote:
> If HW supports SDHCI_TUNING_MODE_3 which is auto retuning, we won't
> retune during runtime suspend and resume, instead we use Re-tuning
> Request signaled via SDHCI_INT_RETUNE interrupt to do retuning and
> hw auto retuning during data transfer to guarantee the signal sample
> window correction.
>
> This can avoid a mass of repeatedly retuning during small file system
> data access and improve the performance.
>
> Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
> ---
> drivers/mmc/host/sdhci.c | 15 ++++++++++++---
> drivers/mmc/host/sdhci.h | 3 +++
> 2 files changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 7894652b9929..31c14b0ff8e2 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -229,6 +229,10 @@ static void sdhci_init(struct sdhci_host *host, int soft)
> SDHCI_INT_TIMEOUT | SDHCI_INT_DATA_END |
> SDHCI_INT_RESPONSE;
>
> + if (host->tuning_mode == SDHCI_TUNING_MODE_2 ||
> + host->tuning_mode == SDHCI_TUNING_MODE_3)
> + host->ier |= SDHCI_INT_RETUNE;
> +
> sdhci_writel(host, host->ier, SDHCI_INT_ENABLE);
> sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);
>
> @@ -2673,6 +2677,9 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
> pr_err("%s: Card is consuming too much power!\n",
> mmc_hostname(host->mmc));
>
> + if (intmask & SDHCI_INT_RETUNE)
> + mmc_retune_needed(host->mmc);
> +
> if (intmask & SDHCI_INT_CARD_INT) {
> sdhci_enable_sdio_irq_nolock(host, false);
> host->thread_isr |= SDHCI_INT_CARD_INT;
> @@ -2682,7 +2689,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
> intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE |
> SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK |
> SDHCI_INT_ERROR | SDHCI_INT_BUS_POWER |
> - SDHCI_INT_CARD_INT);
> + SDHCI_INT_RETUNE | SDHCI_INT_CARD_INT);
>
> if (intmask) {
> unexpected |= intmask;
> @@ -2787,7 +2794,8 @@ int sdhci_suspend_host(struct sdhci_host *host)
> sdhci_disable_card_detection(host);
>
> mmc_retune_timer_stop(host->mmc);
> - mmc_retune_needed(host->mmc);
> + if (host->tuning_mode != SDHCI_TUNING_MODE_3)
> + mmc_retune_needed(host->mmc);
>
> if (!device_may_wakeup(mmc_dev(host->mmc))) {
> host->ier = 0;
> @@ -2848,7 +2856,8 @@ int sdhci_runtime_suspend_host(struct sdhci_host *host)
> unsigned long flags;
>
> mmc_retune_timer_stop(host->mmc);
> - mmc_retune_needed(host->mmc);
> + if (host->tuning_mode != SDHCI_TUNING_MODE_3)
> + mmc_retune_needed(host->mmc);
>
> spin_lock_irqsave(&host->lock, flags);
> host->ier &= SDHCI_INT_CARD_INT;
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index e241e11a90d0..0411c9f36461 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -128,6 +128,7 @@
> #define SDHCI_INT_CARD_INSERT 0x00000040
> #define SDHCI_INT_CARD_REMOVE 0x00000080
> #define SDHCI_INT_CARD_INT 0x00000100
> +#define SDHCI_INT_RETUNE 0x00001000
> #define SDHCI_INT_ERROR 0x00008000
> #define SDHCI_INT_TIMEOUT 0x00010000
> #define SDHCI_INT_CRC 0x00020000
> @@ -518,6 +519,8 @@ struct sdhci_host {
> unsigned int tuning_count; /* Timer count for re-tuning */
> unsigned int tuning_mode; /* Re-tuning mode supported by host */
> #define SDHCI_TUNING_MODE_1 0
> +#define SDHCI_TUNING_MODE_2 1
> +#define SDHCI_TUNING_MODE_3 2
>
> unsigned long private[0] ____cacheline_aligned;
> };
>
next prev parent reply other threads:[~2016-07-21 7:46 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-12 7:46 [PATCH V2 00/15] a few sdhci/imx clean up and fix patches Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 01/15] mmc: sdhci: using common mmc_regulator_set_vqmmc() Dong Aisheng
2016-07-21 7:06 ` Adrian Hunter
2016-07-12 7:46 ` [PATCH V2 02/15] mmc: sdhci-esdhc-imx: remove SDHCI_QUIRK_BROKEN_TIMEOUT_VAL Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 03/15] mmc: sdhci-esdhc-imx: add esdhc specific suspend resume callback Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 04/15] mmc: sdhci-esdhc-imx: restore watermark level setting after resume Dong Aisheng
2016-07-21 7:18 ` Adrian Hunter
2016-07-12 7:46 ` [PATCH V2 05/15] mmc: sdhci-esdhci-imx: disable DLL delay line settings explicitly Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 06/15] mmc: sdhci-esdhc-imx: support setting tuning start point Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 07/15] doc: dt: fsl-imx-esdhc: add set tuning start point binding Dong Aisheng
2016-07-12 13:59 ` Andrew Lunn
2016-07-13 9:10 ` Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 08/15] mmc: sdhci: add standard hw auto retuning support Dong Aisheng
2016-07-21 7:46 ` Adrian Hunter [this message]
2016-07-12 7:46 ` [PATCH V2 09/15] mmc: sdhci-esdhc-imx: enable hw auto retuning for STD_TUNING Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 10/15] mmc: sdhci-esdhc-imx: enable hw auto retuning for MAN_TUNING Dong Aisheng
2016-08-15 14:59 ` [V2, " Gary Bisson
2016-08-16 10:18 ` Dong Aisheng
2016-08-16 12:44 ` Gary Bisson
2016-08-17 14:31 ` Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 11/15] mmc: sdhci-esdhc-imx: fix strobe DLL lock wrong clock issue Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 12/15] mmc: sdhci-esdhc-imx: factor out hw related initialization into function Dong Aisheng
2016-07-21 8:11 ` Adrian Hunter
2016-07-12 7:46 ` [PATCH V2 13/15] mmc: sdhci-esdhc-imx: move tuning static configuration into hwinit function Dong Aisheng
2016-07-12 7:46 ` [PATCH V2 14/15] mmc: sdhci-esdhci-imx: re-initialize hw state after resume Dong Aisheng
2016-07-21 8:11 ` Adrian Hunter
2016-07-12 7:46 ` [PATCH V2 15/15] mmc: sdhci-esdhc-imx: clear tuning bits during driver probe Dong Aisheng
2016-07-21 8:33 ` Adrian Hunter
2016-07-12 13:54 ` [PATCH V2 00/15] a few sdhci/imx clean up and fix patches Andrew Lunn
2016-07-13 8:55 ` Dong Aisheng
2016-07-13 13:40 ` Andrew Lunn
2016-07-21 9:32 ` Adrian Hunter
2016-07-21 10:23 ` Dong Aisheng
2016-07-23 9:37 ` Ulf Hansson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=57907DF1.60104@intel.com \
--to=adrian.hunter@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).