Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mmc: cqhci: Provide helper for resetting both SDHCI and CQHCI

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>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20221026124150.v4.1.Ie85faa09432bfe1b0890d8c24ff95e17f3097317@changeid
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Brian Norris and committed by
Ulf Hansson
ebb5fd38 f0c4d9fc

+24
+24
drivers/mmc/host/sdhci-cqhci.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* 3 + * Copyright 2022 The Chromium OS Authors 4 + * 5 + * Support that applies to the combination of SDHCI and CQHCI, while not 6 + * expressing a dependency between the two modules. 7 + */ 8 + 9 + #ifndef __MMC_HOST_SDHCI_CQHCI_H__ 10 + #define __MMC_HOST_SDHCI_CQHCI_H__ 11 + 12 + #include "cqhci.h" 13 + #include "sdhci.h" 14 + 15 + static inline void sdhci_and_cqhci_reset(struct sdhci_host *host, u8 mask) 16 + { 17 + if ((host->mmc->caps2 & MMC_CAP2_CQE) && (mask & SDHCI_RESET_ALL) && 18 + host->mmc->cqe_private) 19 + cqhci_deactivate(host->mmc); 20 + 21 + sdhci_reset(host, mask); 22 + } 23 + 24 + #endif /* __MMC_HOST_SDHCI_CQHCI_H__ */