diff mbox series

[08/18] header: Add sdio_retune*() functions

Message ID 20190701214914.8066-9-hauke@hauke-m.de (mailing list archive)
State Accepted
Headers show
Series backports: Update for kernel 5.2 | expand

Commit Message

Hauke Mehrtens July 1, 2019, 9:49 p.m. UTC
The brcmfmac driver now uses new sdio_retune*() functions. They are
added with kernel 5.2-rc6 and are backported to kernel 4.19.56 and
5.1.15

sdio_retune_hold_now() and sdio_retune_release() should work like in the
upstream kernel, the implementation of mmc_retune_release() and
mmc_retune_hold() was copied to backports into these functions. On
kernel < 4.3 backporting this is not so easy, so just use an empty
implementation there.

It is not possible to backport sdio_retune_crc_disable() and
sdio_retune_crc_enable() because they need an additional member in a
structure, just add an empty implementation.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
 .../backport-include/linux/mmc/sdio_func.h    | 76 +++++++++++++++++++
 1 file changed, 76 insertions(+)
diff mbox series

Patch

diff --git a/backport/backport-include/linux/mmc/sdio_func.h b/backport/backport-include/linux/mmc/sdio_func.h
index 2d3e92b6..0a67f992 100644
--- a/backport/backport-include/linux/mmc/sdio_func.h
+++ b/backport/backport-include/linux/mmc/sdio_func.h
@@ -7,4 +7,80 @@ 
 #define dev_to_sdio_func(d)	container_of(d, struct sdio_func, dev)
 #endif
 
+#if LINUX_VERSION_IS_LESS(5,2,0) && \
+    !LINUX_VERSION_IN_RANGE(5,1,15, 5,2,0) && \
+    !LINUX_VERSION_IN_RANGE(4,19,56, 4,20,0)
+    
+#include <linux/mmc/card.h>
+#include <linux/mmc/host.h>
+
+/**
+ *	sdio_retune_hold_now - start deferring retuning requests till release
+ *	@func: SDIO function attached to host
+ *
+ *	This function can be called if it's currently a bad time to do
+ *	a retune of the SDIO card.  Retune requests made during this time
+ *	will be held and we'll actually do the retune sometime after the
+ *	release.
+ *
+ *	This function could be useful if an SDIO card is in a power state
+ *	where it can respond to a small subset of commands that doesn't
+ *	include the retuning command.  Care should be taken when using
+ *	this function since (presumably) the retuning request we might be
+ *	deferring was made for a good reason.
+ *
+ *	This function should be called while the host is claimed.
+ */
+#define sdio_retune_hold_now LINUX_BACKPORT(sdio_retune_hold_now)
+#if LINUX_VERSION_IS_LESS(4,3,0)
+static inline void sdio_retune_hold_now(struct sdio_func *func)
+{
+}
+#else
+static inline void sdio_retune_hold_now(struct sdio_func *func)
+{
+	struct mmc_host *host = func->card->host;
+
+	host->retune_now = 0;
+	host->hold_retune += 1;
+}
+#endif /* < 4.3 */
+
+/**
+ *	sdio_retune_release - signal that it's OK to retune now
+ *	@func: SDIO function attached to host
+ *
+ *	This is the complement to sdio_retune_hold_now().  Calling this
+ *	function won't make a retune happen right away but will allow
+ *	them to be scheduled normally.
+ *
+ *	This function should be called while the host is claimed.
+ */
+#define sdio_retune_release LINUX_BACKPORT(sdio_retune_release)
+#if LINUX_VERSION_IS_LESS(4,3,0)
+static inline void sdio_retune_release(struct sdio_func *func)
+{
+}
+#else
+static inline void sdio_retune_release(struct sdio_func *func)
+{
+	struct mmc_host *host = func->card->host;
+
+	if (host->hold_retune)
+		host->hold_retune -= 1;
+	else
+		WARN_ON(1);
+}
+#endif
+
+#define sdio_retune_crc_disable LINUX_BACKPORT(sdio_retune_crc_disable)
+static inline void sdio_retune_crc_disable(struct sdio_func *func)
+{
+}
+#define sdio_retune_crc_enable LINUX_BACKPORT(sdio_retune_crc_enable)
+static inline void sdio_retune_crc_enable(struct sdio_func *func)
+{
+}
+#endif /* < 5.2 */
+
 #endif /* __BACKPORT_MMC_SDIO_FUNC_H */