| From 060522d89705f9d961ef1762dc1468645dd21fbd Mon Sep 17 00:00:00 2001 |
| From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
| Date: Thu, 3 Sep 2020 13:20:29 +1200 |
| Subject: mmc: sdhci-of-esdhc: Don't walk device-tree on every interrupt |
| |
| From: Chris Packham <chris.packham@alliedtelesis.co.nz> |
| |
| commit 060522d89705f9d961ef1762dc1468645dd21fbd upstream. |
| |
| Commit b214fe592ab7 ("mmc: sdhci-of-esdhc: add erratum eSDHC7 support") |
| added code to check for a specific compatible string in the device-tree |
| on every esdhc interrupat. Instead of doing this record the quirk in |
| struct sdhci_esdhc and lookup the struct in esdhc_irq. |
| |
| Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz> |
| Link: https://lore.kernel.org/r/20200903012029.25673-1-chris.packham@alliedtelesis.co.nz |
| Fixes: b214fe592ab7 ("mmc: sdhci-of-esdhc: add erratum eSDHC7 support") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mmc/host/sdhci-of-esdhc.c | 10 +++++++--- |
| 1 file changed, 7 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/mmc/host/sdhci-of-esdhc.c |
| +++ b/drivers/mmc/host/sdhci-of-esdhc.c |
| @@ -81,6 +81,7 @@ struct sdhci_esdhc { |
| bool quirk_tuning_erratum_type2; |
| bool quirk_ignore_data_inhibit; |
| bool quirk_delay_before_data_reset; |
| + bool quirk_trans_complete_erratum; |
| bool in_sw_tuning; |
| unsigned int peripheral_clock; |
| const struct esdhc_clk_fixup *clk_fixup; |
| @@ -1082,10 +1083,11 @@ static void esdhc_set_uhs_signaling(stru |
| |
| static u32 esdhc_irq(struct sdhci_host *host, u32 intmask) |
| { |
| + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); |
| + struct sdhci_esdhc *esdhc = sdhci_pltfm_priv(pltfm_host); |
| u32 command; |
| |
| - if (of_find_compatible_node(NULL, NULL, |
| - "fsl,p2020-esdhc")) { |
| + if (esdhc->quirk_trans_complete_erratum) { |
| command = SDHCI_GET_CMD(sdhci_readw(host, |
| SDHCI_COMMAND)); |
| if (command == MMC_WRITE_MULTIPLE_BLOCK && |
| @@ -1239,8 +1241,10 @@ static void esdhc_init(struct platform_d |
| esdhc->clk_fixup = match->data; |
| np = pdev->dev.of_node; |
| |
| - if (of_device_is_compatible(np, "fsl,p2020-esdhc")) |
| + if (of_device_is_compatible(np, "fsl,p2020-esdhc")) { |
| esdhc->quirk_delay_before_data_reset = true; |
| + esdhc->quirk_trans_complete_erratum = true; |
| + } |
| |
| clk = of_clk_get(np, 0); |
| if (!IS_ERR(clk)) { |