On 24/10/22 20:54, Brian Norris wrote:
Several SDHCI drivers need to deactivate command queueing in their reset hook (see sdhci_cqhci_reset() / sdhci-pci-core.c, for example), and several more are coming.
Those reset implementations have some small subtleties (e.g., ordering of initialization of SDHCI vs. CQHCI might leave us resetting with a NULL ->cqe_private), and are often identical across different host drivers.
We also don't want to force a dependency between SDHCI and CQHCI, or vice versa; non-SDHCI drivers use CQHCI, and SDHCI drivers might support command queueing through some other means.
So, implement a small helper, to avoid repeating the same mistakes in different drivers. Simply stick it in a header, because it's so small it doesn't deserve its own module right now, and inlining to each driver is pretty reasonable.
This is marked for -stable, as it is an important prerequisite patch for several SDHCI controller bugfixes that follow.
Cc: stable@vger.kernel.org Signed-off-by: Brian Norris briannorris@chromium.org
One cosmetic nit, otherwise:
Acked-by: Adrian Hunter adrian.hunter@intel.com
Changes in v3:
- New in v3 (replacing a simple 'cqe_private == NULL' patch in v2)
drivers/mmc/host/sdhci-cqhci.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 drivers/mmc/host/sdhci-cqhci.h
diff --git a/drivers/mmc/host/sdhci-cqhci.h b/drivers/mmc/host/sdhci-cqhci.h new file mode 100644 index 000000000000..270ab1f1de3c --- /dev/null +++ b/drivers/mmc/host/sdhci-cqhci.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/*
- Copyright 2022 The Chromium OS Authors
- Support that applies to the combination of SDHCI and CQHCI, while not
- expressing a dependency between the two modules.
- */
+#ifndef __MMC_HOST_SDHCI_CQHCI_H__ +#define __MMC_HOST_SDHCI_CQHCI_H__
+#include "cqhci.h" +#include "sdhci.h"
+static inline void sdhci_and_cqhci_reset(struct sdhci_host *host, u8 mask) +{
- if ((host->mmc->caps2 & MMC_CAP2_CQE) && (mask & SDHCI_RESET_ALL) &&
host->mmc->cqe_private)
cqhci_deactivate(host->mmc);
- sdhci_reset(host, mask);
+}
Double blank line
+#endif /* __MMC_HOST_SDHCI_CQHCI_H__ */