| From 206c3a35beb1b3d453b90b0a1d822bf98754fdad Mon Sep 17 00:00:00 2001 |
| From: Faiz Abbas <faiz_abbas@ti.com> |
| Date: Thu, 16 Jan 2020 16:21:50 +0530 |
| Subject: [PATCH] mmc: sdhci: Refactor sdhci_set_timeout() |
| |
| commit 7d76ed77cfbd39468ae58d419f537d35ca892d83 upstream. |
| |
| Refactor sdhci_set_timeout() such that platform drivers can do some |
| functionality in a set_timeout() callback and then call |
| __sdhci_set_timeout() to complete the operation. |
| |
| Signed-off-by: Faiz Abbas <faiz_abbas@ti.com> |
| Acked-by: Adrian Hunter <adrian.hunter@intel.com> |
| Link: https://lore.kernel.org/r/20200116105154.7685-7-faiz_abbas@ti.com |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c |
| index 599abc124682..89ff43b43de9 100644 |
| --- a/drivers/mmc/host/sdhci.c |
| +++ b/drivers/mmc/host/sdhci.c |
| @@ -988,27 +988,29 @@ void sdhci_set_data_timeout_irq(struct sdhci_host *host, bool enable) |
| } |
| EXPORT_SYMBOL_GPL(sdhci_set_data_timeout_irq); |
| |
| -static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd) |
| +void __sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd) |
| { |
| - u8 count; |
| - |
| - if (host->ops->set_timeout) { |
| - host->ops->set_timeout(host, cmd); |
| - } else { |
| - bool too_big = false; |
| - |
| - count = sdhci_calc_timeout(host, cmd, &too_big); |
| + bool too_big = false; |
| + u8 count = sdhci_calc_timeout(host, cmd, &too_big); |
| + |
| + if (too_big && |
| + host->quirks2 & SDHCI_QUIRK2_DISABLE_HW_TIMEOUT) { |
| + sdhci_calc_sw_timeout(host, cmd); |
| + sdhci_set_data_timeout_irq(host, false); |
| + } else if (!(host->ier & SDHCI_INT_DATA_TIMEOUT)) { |
| + sdhci_set_data_timeout_irq(host, true); |
| + } |
| |
| - if (too_big && |
| - host->quirks2 & SDHCI_QUIRK2_DISABLE_HW_TIMEOUT) { |
| - sdhci_calc_sw_timeout(host, cmd); |
| - sdhci_set_data_timeout_irq(host, false); |
| - } else if (!(host->ier & SDHCI_INT_DATA_TIMEOUT)) { |
| - sdhci_set_data_timeout_irq(host, true); |
| - } |
| + sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL); |
| +} |
| +EXPORT_SYMBOL_GPL(__sdhci_set_timeout); |
| |
| - sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL); |
| - } |
| +static void sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd) |
| +{ |
| + if (host->ops->set_timeout) |
| + host->ops->set_timeout(host, cmd); |
| + else |
| + __sdhci_set_timeout(host, cmd); |
| } |
| |
| static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) |
| diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h |
| index 6e2c7c5ae818..f69bebe51520 100644 |
| --- a/drivers/mmc/host/sdhci.h |
| +++ b/drivers/mmc/host/sdhci.h |
| @@ -800,5 +800,6 @@ void sdhci_end_tuning(struct sdhci_host *host); |
| void sdhci_reset_tuning(struct sdhci_host *host); |
| void sdhci_send_tuning(struct sdhci_host *host, u32 opcode); |
| void sdhci_set_data_timeout_irq(struct sdhci_host *host, bool enable); |
| +void __sdhci_set_timeout(struct sdhci_host *host, struct mmc_command *cmd); |
| |
| #endif /* __SDHCI_HW_H */ |
| -- |
| 2.7.4 |
| |