linux-phy.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux
@ 2025-12-10 17:38 Josua Mayer
  2025-12-10 17:38 ` [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict Josua Mayer
                   ` (6 more replies)
  0 siblings, 7 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-10 17:38 UTC (permalink / raw)
  To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti
  Cc: Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c, Josua Mayer

Some Renesas SoC based boards mux SD and eMMC on a single sdio
controller, exposing user control by dip switch and software control by
gpio.

Purpose is to simplify development and provisioning by selecting boot
media at power-on, and again before starting linux.

Add binding and driver support for linking a (gpio) mux to renesas sdio
controller.

Introduce generic helper functions for getting managed and selected
mux-state objects, and switch i2c-omap and phy-can-transceiver drivers.

Signed-off-by: Josua Mayer <josua@solid-run.com>
---
Changes in v3:
- updated omap-i2c and phy-can-transceiver to use new helpers.
- created generic helper functions for getting managed optional mux-state.
  (Reported-by: Rob Herring <robh@kernel.org>)
- picked up binding ack by Rob Herring.
- replaced use of "SDIO" with "SD/SDIO/eMMC" in binding document and
  commit descriptions.
  (Reported-by: Ulf Hansson <ulf.hansson@linaro.org>)
- Link to v2: https://lore.kernel.org/r/20251201-rz-sdio-mux-v2-0-bcb581b88dd7@solid-run.com

Changes in v2:
- dropped mux-controller node from dt binding example
  (Reported-by: Conor Dooley <conor@kernel.org>
   Reported-by: Krzysztof Kozlowski <krzk@kernel.org>)
- Link to v1: https://lore.kernel.org/r/20251128-rz-sdio-mux-v1-0-1ede318d160f@solid-run.com

---
Josua Mayer (6):
      phy: can-transceiver: rename temporary helper function to avoid conflict
      mux: Add helper functions for getting optional and selected mux-state
      phy: can-transceiver: drop temporary helper getting optional mux-state
      i2c: omap: switch to new generic helper for getting selected mux-state
      dt-bindings: mmc: renesas,sdhi: Add mux-states property
      mmc: host: renesas_sdhi_core: support selecting an optional mux

 .../devicetree/bindings/mmc/renesas,sdhi.yaml      |  6 ++
 drivers/i2c/busses/i2c-omap.c                      | 19 ++----
 drivers/mmc/host/Kconfig                           |  1 +
 drivers/mmc/host/renesas_sdhi.h                    |  1 +
 drivers/mmc/host/renesas_sdhi_core.c               | 16 +++++-
 drivers/mux/core.c                                 | 67 +++++++++++++++++++---
 drivers/phy/phy-can-transceiver.c                  | 10 ----
 include/linux/mux/consumer.h                       |  4 ++
 8 files changed, 89 insertions(+), 35 deletions(-)
---
base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787
change-id: 20251128-rz-sdio-mux-acc5137f1618

Best regards,
-- 
Josua Mayer <josua@solid-run.com>



-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict
  2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
@ 2025-12-10 17:38 ` Josua Mayer
  2025-12-22 10:59   ` Geert Uytterhoeven
  2025-12-23 14:08   ` Vinod Koul
  2025-12-10 17:38 ` [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state Josua Mayer
                   ` (5 subsequent siblings)
  6 siblings, 2 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-10 17:38 UTC (permalink / raw)
  To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti
  Cc: Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c, Josua Mayer

Rename the temporary devm_mux_state_get_optional function to avoid
conflict with upcoming implementation in multiplexer subsystem.

Signed-off-by: Josua Mayer <josua@solid-run.com>
---
 drivers/phy/phy-can-transceiver.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/phy/phy-can-transceiver.c b/drivers/phy/phy-can-transceiver.c
index f59caff4b3d4c..c02d99f0f29fc 100644
--- a/drivers/phy/phy-can-transceiver.c
+++ b/drivers/phy/phy-can-transceiver.c
@@ -95,7 +95,7 @@ MODULE_DEVICE_TABLE(of, can_transceiver_phy_ids);
 
 /* Temporary wrapper until the multiplexer subsystem supports optional muxes */
 static inline struct mux_state *
-devm_mux_state_get_optional(struct device *dev, const char *mux_name)
+temp_devm_mux_state_get_optional(struct device *dev, const char *mux_name)
 {
 	if (!of_property_present(dev->of_node, "mux-states"))
 		return NULL;
@@ -124,7 +124,7 @@ static int can_transceiver_phy_probe(struct platform_device *pdev)
 	match = of_match_node(can_transceiver_phy_ids, pdev->dev.of_node);
 	drvdata = match->data;
 
-	mux_state = devm_mux_state_get_optional(dev, NULL);
+	mux_state = temp_devm_mux_state_get_optional(dev, NULL);
 	if (IS_ERR(mux_state))
 		return PTR_ERR(mux_state);
 

-- 
2.51.0



-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
  2025-12-10 17:38 ` [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict Josua Mayer
@ 2025-12-10 17:38 ` Josua Mayer
  2025-12-17 13:38   ` Ulf Hansson
  2025-12-22 10:08   ` Geert Uytterhoeven
  2025-12-10 17:38 ` [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state Josua Mayer
                   ` (4 subsequent siblings)
  6 siblings, 2 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-10 17:38 UTC (permalink / raw)
  To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti
  Cc: Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c, Josua Mayer

In-tree phy-can-transceiver driver has already implemented a local
version of devm_mux_state_get_optional.

The omap-i2c driver gets and selects an optional mux in its probe
function without using any helper.

Add new helper functions covering both aforementioned use-cases:

- devm_mux_state_get_optional:
  Get a mux-state if specified in dt, return NULL otherwise.
- devm_mux_state_get_optional_selected:
  Get and select a mux-state if specified in dt, return error or NULL.

Existing mux_get helper function is changed to return -ENOENT in case dt
did not specify a mux-state or -control matching given name (if valid).
This matches of_parse_phandle_with_args semantics which also returns
-ENOENT if the property does nto exists, or its value is zero.

The new helper functions check for ENOENT to return NULL for optional
muxes.

Commit e153fdea9db04 ("phy: can-transceiver: Re-instate "mux-states"
property presence check") noted that "mux_get() always prints an error
message in case of an error, including when the property is not present,
confusing the user."

The first error message covers the case that a mux name is not matched
in dt. This is removed as the returned error code (-ENOENT) is clear.

The second error message is based on of_parse_phandle_with_args return
value. In case mux description is missing from DT, it returns -ENOENT.
Print error message only for other error codes.

This ensures that the new helper functions will not confuse the user
either.

Signed-off-by: Josua Mayer <josua@solid-run.com>
---
 drivers/mux/core.c           | 67 +++++++++++++++++++++++++++++++++++++++-----
 include/linux/mux/consumer.h |  4 +++
 2 files changed, 64 insertions(+), 7 deletions(-)

diff --git a/drivers/mux/core.c b/drivers/mux/core.c
index a3840fe0995fe..130ca47a8be37 100644
--- a/drivers/mux/core.c
+++ b/drivers/mux/core.c
@@ -542,11 +542,8 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
 		else
 			index = of_property_match_string(np, "mux-control-names",
 							 mux_name);
-		if (index < 0) {
-			dev_err(dev, "mux controller '%s' not found\n",
-				mux_name);
-			return ERR_PTR(index);
-		}
+		if (index < 0)
+			return ERR_PTR(-ENOENT);
 	}
 
 	if (state)
@@ -558,8 +555,10 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
 						 "mux-controls", "#mux-control-cells",
 						 index, &args);
 	if (ret) {
-		dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
-			np, state ? "state" : "control", mux_name ?: "", index);
+		if (ret != -ENOENT)
+			dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
+				np, state ? "state" : "control",
+				mux_name ?: "", index);
 		return ERR_PTR(ret);
 	}
 
@@ -745,6 +744,60 @@ struct mux_state *devm_mux_state_get(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(devm_mux_state_get);
 
+/**
+ * devm_mux_state_get_optional() - Get the optional mux-state for a device,
+ *				   with resource management.
+ * @dev: The device that needs a mux-state.
+ * @mux_name: The name identifying the mux-state.
+ *
+ * Return: Pointer to the mux-state, or an ERR_PTR with a negative errno.
+ */
+struct mux_state *devm_mux_state_get_optional(struct device *dev,
+					      const char *mux_name)
+{
+	struct mux_state *mux_state = devm_mux_state_get(dev, mux_name);
+
+	if (IS_ERR(mux_state) && PTR_ERR(mux_state) == -ENOENT)
+		return NULL;
+
+	return mux_state;
+}
+EXPORT_SYMBOL_GPL(devm_mux_state_get_optional);
+
+/**
+ * devm_mux_state_get_optional_selected() - Get the optional mux-state for
+ *					    a device, with resource management.
+ * @dev: The device that needs a mux-state.
+ * @mux_name: The name identifying the mux-state.
+ *
+ * Return: Pointer to the mux-state, or an ERR_PTR with a negative errno.
+ *
+ * The returned mux-state (if valid) is already selected.
+ */
+struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
+						       const char *mux_name)
+{
+	struct mux_state *mux_state;
+	int ret;
+
+	mux_state = devm_mux_state_get_optional(dev, mux_name);
+	if (IS_ERR_OR_NULL(mux_state))
+		return mux_state;
+
+	ret = mux_state_select(mux_state);
+	if (ret) {
+		if (ret != -EPROBE_DEFER)
+			dev_err(dev, "failed to select mux-state %s: %d\n",
+				mux_name ?: "", ret);
+
+		mux_state_put(mux_state);
+		return ERR_PTR(ret);
+	}
+
+	return mux_state;
+}
+EXPORT_SYMBOL_GPL(devm_mux_state_get_optional_selected);
+
 /*
  * Using subsys_initcall instead of module_init here to try to ensure - for
  * the non-modular case - that the subsystem is initialized when mux consumers
diff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h
index 2e25c838f8312..a5da2e33a45c0 100644
--- a/include/linux/mux/consumer.h
+++ b/include/linux/mux/consumer.h
@@ -60,5 +60,9 @@ struct mux_control *devm_mux_control_get(struct device *dev,
 					 const char *mux_name);
 struct mux_state *devm_mux_state_get(struct device *dev,
 				     const char *mux_name);
+struct mux_state *devm_mux_state_get_optional(struct device *dev,
+					      const char *mux_name);
+struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
+						       const char *mux_name);
 
 #endif /* _LINUX_MUX_CONSUMER_H */

-- 
2.51.0



-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state
  2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
  2025-12-10 17:38 ` [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict Josua Mayer
  2025-12-10 17:38 ` [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state Josua Mayer
@ 2025-12-10 17:38 ` Josua Mayer
  2025-12-22 11:00   ` Geert Uytterhoeven
  2025-12-23 14:08   ` Vinod Koul
  2025-12-10 17:38 ` [PATCH v3 4/6] i2c: omap: switch to new generic helper for getting selected mux-state Josua Mayer
                   ` (3 subsequent siblings)
  6 siblings, 2 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-10 17:38 UTC (permalink / raw)
  To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti
  Cc: Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c, Josua Mayer

Multiplexer subsystem has now added helpers for getting managed optional
mux-state.

Switch to the new devm_mux_state_get_optional helper.

This change is only compile-tested.

Signed-off-by: Josua Mayer <josua@solid-run.com>
---
 drivers/phy/phy-can-transceiver.c | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/drivers/phy/phy-can-transceiver.c b/drivers/phy/phy-can-transceiver.c
index c02d99f0f29fc..68d72d8d49251 100644
--- a/drivers/phy/phy-can-transceiver.c
+++ b/drivers/phy/phy-can-transceiver.c
@@ -93,16 +93,6 @@ static const struct of_device_id can_transceiver_phy_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, can_transceiver_phy_ids);
 
-/* Temporary wrapper until the multiplexer subsystem supports optional muxes */
-static inline struct mux_state *
-temp_devm_mux_state_get_optional(struct device *dev, const char *mux_name)
-{
-	if (!of_property_present(dev->of_node, "mux-states"))
-		return NULL;
-
-	return devm_mux_state_get(dev, mux_name);
-}
-
 static int can_transceiver_phy_probe(struct platform_device *pdev)
 {
 	struct phy_provider *phy_provider;
@@ -124,7 +114,7 @@ static int can_transceiver_phy_probe(struct platform_device *pdev)
 	match = of_match_node(can_transceiver_phy_ids, pdev->dev.of_node);
 	drvdata = match->data;
 
-	mux_state = temp_devm_mux_state_get_optional(dev, NULL);
+	mux_state = devm_mux_state_get_optional(dev, NULL);
 	if (IS_ERR(mux_state))
 		return PTR_ERR(mux_state);
 

-- 
2.51.0



-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 4/6] i2c: omap: switch to new generic helper for getting selected mux-state
  2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
                   ` (2 preceding siblings ...)
  2025-12-10 17:38 ` [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state Josua Mayer
@ 2025-12-10 17:38 ` Josua Mayer
  2025-12-23 17:11   ` Andreas Kemnade
  2025-12-10 17:38 ` [PATCH v3 5/6] dt-bindings: mmc: renesas,sdhi: Add mux-states property Josua Mayer
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 22+ messages in thread
From: Josua Mayer @ 2025-12-10 17:38 UTC (permalink / raw)
  To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti
  Cc: Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c, Josua Mayer

Multiplexer subsystem has added generic helper functiosn for getting an
already selected mux-state object.

Replace existing logic in probe with the equivalent helper function.

This change is only compile-tested.

Signed-off-by: Josua Mayer <josua@solid-run.com>
---
 drivers/i2c/busses/i2c-omap.c | 19 ++++---------------
 1 file changed, 4 insertions(+), 15 deletions(-)

diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 5fcc9f6c33e5b..89802027a3eac 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -1454,21 +1454,10 @@ omap_i2c_probe(struct platform_device *pdev)
 				       (1000 * omap->speed / 8);
 	}
 
-	if (of_property_present(node, "mux-states")) {
-		struct mux_state *mux_state;
-
-		mux_state = devm_mux_state_get(&pdev->dev, NULL);
-		if (IS_ERR(mux_state)) {
-			r = PTR_ERR(mux_state);
-			dev_dbg(&pdev->dev, "failed to get I2C mux: %d\n", r);
-			goto err_put_pm;
-		}
-		omap->mux_state = mux_state;
-		r = mux_state_select(omap->mux_state);
-		if (r) {
-			dev_err(&pdev->dev, "failed to select I2C mux: %d\n", r);
-			goto err_put_pm;
-		}
+	omap->mux_state = devm_mux_state_get_optional_selected(&pdev->dev, NULL);
+	if (IS_ERR(omap->mux_state)) {
+		r = PTR_ERR(omap->mux_state);
+		goto err_put_pm;
 	}
 
 	/* reset ASAP, clearing any IRQs */

-- 
2.51.0



-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 5/6] dt-bindings: mmc: renesas,sdhi: Add mux-states property
  2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
                   ` (3 preceding siblings ...)
  2025-12-10 17:38 ` [PATCH v3 4/6] i2c: omap: switch to new generic helper for getting selected mux-state Josua Mayer
@ 2025-12-10 17:38 ` Josua Mayer
  2025-12-10 17:38 ` [PATCH v3 6/6] mmc: host: renesas_sdhi_core: support selecting an optional mux Josua Mayer
  2025-12-17 13:42 ` [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Ulf Hansson
  6 siblings, 0 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-10 17:38 UTC (permalink / raw)
  To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti
  Cc: Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c, Josua Mayer

Add mux controller support for data or control lines that are muxed
between a host and multiple cards.

There are several devices supporting a choice of eMMC or SD on a single
board by both dip switch and gpio, e.g. Renesas RZ/G2L SMARC SoM and
SolidRun RZ/G2L SoM.

In-tree dts for the Renesas boards currently rely on preprocessor macros
and gpio hogs to describe the respective cards.

By adding mux-states property to sdhi controller description, boards can
correctly describe the mux that already exists in hardware - and drivers
can coordinate between mux selection and probing for cards.

Acked-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Josua Mayer <josua@solid-run.com>
---
 Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml b/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml
index c754ea71f51f7..64fac0d11329a 100644
--- a/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml
+++ b/Documentation/devicetree/bindings/mmc/renesas,sdhi.yaml
@@ -106,6 +106,11 @@ properties:
   iommus:
     maxItems: 1
 
+  mux-states:
+    description:
+      mux controller node to route the SD/SDIO/eMMC signals from SoC to cards.
+    maxItems: 1
+
   power-domains:
     maxItems: 1
 
@@ -275,6 +280,7 @@ examples:
         max-frequency = <195000000>;
         power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
         resets = <&cpg 314>;
+        mux-states = <&mux 0>;
     };
 
     sdhi1: mmc@ee120000 {

-- 
2.51.0



-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* [PATCH v3 6/6] mmc: host: renesas_sdhi_core: support selecting an optional mux
  2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
                   ` (4 preceding siblings ...)
  2025-12-10 17:38 ` [PATCH v3 5/6] dt-bindings: mmc: renesas,sdhi: Add mux-states property Josua Mayer
@ 2025-12-10 17:38 ` Josua Mayer
  2025-12-17 13:42 ` [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Ulf Hansson
  6 siblings, 0 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-10 17:38 UTC (permalink / raw)
  To: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti
  Cc: Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c, Josua Mayer

Some hardware designs route data or control signals through a mux to
support multiple devices on a single sdhi controller.

In particular SolidRun RZ/G2L/G2LC/V2L System on Module use a mux for
switching between soldered eMMC and an optional microSD on a carrier
board, e.g. for development or provisioning.

SD/SDIO/eMMC are not well suited for runtime switching between different
cards, however boot-time selection is possible and useful - in
particular considering dt overlays.

Add support for an optional SD/SDIO/eMMC mux defined in dt, and select
it during probe.

Similar functionality already exists in other places, e.g. i2c-omap.

Signed-off-by: Josua Mayer <josua@solid-run.com>
---
 drivers/mmc/host/Kconfig             |  1 +
 drivers/mmc/host/renesas_sdhi.h      |  1 +
 drivers/mmc/host/renesas_sdhi_core.c | 16 +++++++++++++---
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 2c963cb6724b9..c01ab7d81a5af 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -707,6 +707,7 @@ config MMC_SDHI
 	depends on SUPERH || ARCH_RENESAS || COMPILE_TEST
 	depends on (RESET_CONTROLLER && REGULATOR) || !OF
 	select MMC_TMIO_CORE
+	select MULTIPLEXER
 	help
 	  This provides support for the SDHI SD/SDIO controller found in
 	  Renesas SuperH, ARM and ARM64 based SoCs
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index 084964cecf9d8..9508908d8179f 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -97,6 +97,7 @@ struct renesas_sdhi {
 	struct reset_control *rstc;
 	struct tmio_mmc_host *host;
 	struct regulator_dev *rdev;
+	struct mux_state *mux_state;
 };
 
 #define host_to_priv(host) \
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index f56fa2cd208dd..3d833a325c61f 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -26,6 +26,7 @@
 #include <linux/mmc/mmc.h>
 #include <linux/mmc/slot-gpio.h>
 #include <linux/module.h>
+#include <linux/mux/consumer.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pinctrl/pinctrl-state.h>
 #include <linux/platform_data/tmio.h>
@@ -1115,9 +1116,15 @@ int renesas_sdhi_probe(struct platform_device *pdev,
 						"state_uhs");
 	}
 
+	priv->mux_state = devm_mux_state_get_optional_selected(&pdev->dev, NULL);
+	if (IS_ERR(priv->mux_state))
+		return PTR_ERR(priv->mux_state);
+
 	host = tmio_mmc_host_alloc(pdev, mmc_data);
-	if (IS_ERR(host))
-		return PTR_ERR(host);
+	if (IS_ERR(host)) {
+		ret = PTR_ERR(host);
+		goto edselmux;
+	}
 
 	priv->host = host;
 
@@ -1200,7 +1207,7 @@ int renesas_sdhi_probe(struct platform_device *pdev,
 
 	ret = renesas_sdhi_clk_enable(host);
 	if (ret)
-		return ret;
+		goto edselmux;
 
 	rcfg.of_node = of_get_available_child_by_name(dev->of_node, "vqmmc-regulator");
 	if (rcfg.of_node) {
@@ -1304,6 +1311,9 @@ int renesas_sdhi_probe(struct platform_device *pdev,
 
 edisclk:
 	renesas_sdhi_clk_disable(host);
+edselmux:
+	if (priv->mux_state)
+		mux_state_deselect(priv->mux_state);
 	return ret;
 }
 EXPORT_SYMBOL_GPL(renesas_sdhi_probe);

-- 
2.51.0



-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply related	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-10 17:38 ` [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state Josua Mayer
@ 2025-12-17 13:38   ` Ulf Hansson
  2025-12-21 10:37     ` Josua Mayer
  2025-12-22 10:08   ` Geert Uytterhoeven
  1 sibling, 1 reply; 22+ messages in thread
From: Ulf Hansson @ 2025-12-17 13:38 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c

On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
>
> In-tree phy-can-transceiver driver has already implemented a local
> version of devm_mux_state_get_optional.
>
> The omap-i2c driver gets and selects an optional mux in its probe
> function without using any helper.
>
> Add new helper functions covering both aforementioned use-cases:
>
> - devm_mux_state_get_optional:
>   Get a mux-state if specified in dt, return NULL otherwise.
> - devm_mux_state_get_optional_selected:
>   Get and select a mux-state if specified in dt, return error or NULL.
>
> Existing mux_get helper function is changed to return -ENOENT in case dt
> did not specify a mux-state or -control matching given name (if valid).
> This matches of_parse_phandle_with_args semantics which also returns
> -ENOENT if the property does nto exists, or its value is zero.
>
> The new helper functions check for ENOENT to return NULL for optional
> muxes.
>
> Commit e153fdea9db04 ("phy: can-transceiver: Re-instate "mux-states"
> property presence check") noted that "mux_get() always prints an error
> message in case of an error, including when the property is not present,
> confusing the user."
>
> The first error message covers the case that a mux name is not matched
> in dt. This is removed as the returned error code (-ENOENT) is clear.
>
> The second error message is based on of_parse_phandle_with_args return
> value. In case mux description is missing from DT, it returns -ENOENT.
> Print error message only for other error codes.
>
> This ensures that the new helper functions will not confuse the user
> either.
>
> Signed-off-by: Josua Mayer <josua@solid-run.com>
> ---
>  drivers/mux/core.c           | 67 +++++++++++++++++++++++++++++++++++++++-----
>  include/linux/mux/consumer.h |  4 +++
>  2 files changed, 64 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/mux/core.c b/drivers/mux/core.c
> index a3840fe0995fe..130ca47a8be37 100644
> --- a/drivers/mux/core.c
> +++ b/drivers/mux/core.c
> @@ -542,11 +542,8 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>                 else
>                         index = of_property_match_string(np, "mux-control-names",
>                                                          mux_name);
> -               if (index < 0) {
> -                       dev_err(dev, "mux controller '%s' not found\n",
> -                               mux_name);
> -                       return ERR_PTR(index);
> -               }
> +               if (index < 0)
> +                       return ERR_PTR(-ENOENT);
>         }
>
>         if (state)
> @@ -558,8 +555,10 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>                                                  "mux-controls", "#mux-control-cells",
>                                                  index, &args);
>         if (ret) {
> -               dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
> -                       np, state ? "state" : "control", mux_name ?: "", index);
> +               if (ret != -ENOENT)
> +                       dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
> +                               np, state ? "state" : "control",
> +                               mux_name ?: "", index);
>                 return ERR_PTR(ret);
>         }
>
> @@ -745,6 +744,60 @@ struct mux_state *devm_mux_state_get(struct device *dev,
>  }
>  EXPORT_SYMBOL_GPL(devm_mux_state_get);
>
> +/**
> + * devm_mux_state_get_optional() - Get the optional mux-state for a device,
> + *                                with resource management.
> + * @dev: The device that needs a mux-state.
> + * @mux_name: The name identifying the mux-state.
> + *
> + * Return: Pointer to the mux-state, or an ERR_PTR with a negative errno.
> + */
> +struct mux_state *devm_mux_state_get_optional(struct device *dev,
> +                                             const char *mux_name)
> +{
> +       struct mux_state *mux_state = devm_mux_state_get(dev, mux_name);
> +
> +       if (IS_ERR(mux_state) && PTR_ERR(mux_state) == -ENOENT)
> +               return NULL;
> +
> +       return mux_state;
> +}
> +EXPORT_SYMBOL_GPL(devm_mux_state_get_optional);
> +
> +/**
> + * devm_mux_state_get_optional_selected() - Get the optional mux-state for
> + *                                         a device, with resource management.
> + * @dev: The device that needs a mux-state.
> + * @mux_name: The name identifying the mux-state.
> + *
> + * Return: Pointer to the mux-state, or an ERR_PTR with a negative errno.
> + *
> + * The returned mux-state (if valid) is already selected.
> + */
> +struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
> +                                                      const char *mux_name)
> +{
> +       struct mux_state *mux_state;
> +       int ret;
> +
> +       mux_state = devm_mux_state_get_optional(dev, mux_name);
> +       if (IS_ERR_OR_NULL(mux_state))
> +               return mux_state;
> +
> +       ret = mux_state_select(mux_state);
> +       if (ret) {
> +               if (ret != -EPROBE_DEFER)
> +                       dev_err(dev, "failed to select mux-state %s: %d\n",
> +                               mux_name ?: "", ret);
> +
> +               mux_state_put(mux_state);
> +               return ERR_PTR(ret);
> +       }
> +
> +       return mux_state;
> +}
> +EXPORT_SYMBOL_GPL(devm_mux_state_get_optional_selected);
> +
>  /*
>   * Using subsys_initcall instead of module_init here to try to ensure - for
>   * the non-modular case - that the subsystem is initialized when mux consumers
> diff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h
> index 2e25c838f8312..a5da2e33a45c0 100644
> --- a/include/linux/mux/consumer.h
> +++ b/include/linux/mux/consumer.h
> @@ -60,5 +60,9 @@ struct mux_control *devm_mux_control_get(struct device *dev,
>                                          const char *mux_name);
>  struct mux_state *devm_mux_state_get(struct device *dev,
>                                      const char *mux_name);
> +struct mux_state *devm_mux_state_get_optional(struct device *dev,
> +                                             const char *mux_name);
> +struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
> +                                                      const char *mux_name);

Seems like we need stub-functions of these too. Otherwise
subsystems/drivers need to have a "depends on MULTIPLEXER" in their
Kconfigs.

Kind regards
Uffe

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux
  2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
                   ` (5 preceding siblings ...)
  2025-12-10 17:38 ` [PATCH v3 6/6] mmc: host: renesas_sdhi_core: support selecting an optional mux Josua Mayer
@ 2025-12-17 13:42 ` Ulf Hansson
  2025-12-21 10:45   ` Josua Mayer
  6 siblings, 1 reply; 22+ messages in thread
From: Ulf Hansson @ 2025-12-17 13:42 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c

On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
>
> Some Renesas SoC based boards mux SD and eMMC on a single sdio
> controller, exposing user control by dip switch and software control by
> gpio.
>
> Purpose is to simplify development and provisioning by selecting boot
> media at power-on, and again before starting linux.
>
> Add binding and driver support for linking a (gpio) mux to renesas sdio
> controller.
>
> Introduce generic helper functions for getting managed and selected
> mux-state objects, and switch i2c-omap and phy-can-transceiver drivers.
>
> Signed-off-by: Josua Mayer <josua@solid-run.com>
> ---
> Changes in v3:
> - updated omap-i2c and phy-can-transceiver to use new helpers.
> - created generic helper functions for getting managed optional mux-state.
>   (Reported-by: Rob Herring <robh@kernel.org>)
> - picked up binding ack by Rob Herring.
> - replaced use of "SDIO" with "SD/SDIO/eMMC" in binding document and
>   commit descriptions.
>   (Reported-by: Ulf Hansson <ulf.hansson@linaro.org>)
> - Link to v2: https://lore.kernel.org/r/20251201-rz-sdio-mux-v2-0-bcb581b88dd7@solid-run.com
>
> Changes in v2:
> - dropped mux-controller node from dt binding example
>   (Reported-by: Conor Dooley <conor@kernel.org>
>    Reported-by: Krzysztof Kozlowski <krzk@kernel.org>)
> - Link to v1: https://lore.kernel.org/r/20251128-rz-sdio-mux-v1-0-1ede318d160f@solid-run.com
>
> ---
> Josua Mayer (6):
>       phy: can-transceiver: rename temporary helper function to avoid conflict
>       mux: Add helper functions for getting optional and selected mux-state
>       phy: can-transceiver: drop temporary helper getting optional mux-state
>       i2c: omap: switch to new generic helper for getting selected mux-state
>       dt-bindings: mmc: renesas,sdhi: Add mux-states property
>       mmc: host: renesas_sdhi_core: support selecting an optional mux
>
>  .../devicetree/bindings/mmc/renesas,sdhi.yaml      |  6 ++
>  drivers/i2c/busses/i2c-omap.c                      | 19 ++----
>  drivers/mmc/host/Kconfig                           |  1 +
>  drivers/mmc/host/renesas_sdhi.h                    |  1 +
>  drivers/mmc/host/renesas_sdhi_core.c               | 16 +++++-
>  drivers/mux/core.c                                 | 67 +++++++++++++++++++---
>  drivers/phy/phy-can-transceiver.c                  | 10 ----
>  include/linux/mux/consumer.h                       |  4 ++
>  8 files changed, 89 insertions(+), 35 deletions(-)
> ---
> base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787
> change-id: 20251128-rz-sdio-mux-acc5137f1618
>
> Best regards,
> --
> Josua Mayer <josua@solid-run.com>

Looks like this needs to go together or if someone can host the common
parts via an immutable branch.

Anyway, I am expecting some discussion or update for patch2 first.

Kind regards
Uffe

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-17 13:38   ` Ulf Hansson
@ 2025-12-21 10:37     ` Josua Mayer
  2025-12-22 14:47       ` Ulf Hansson
  0 siblings, 1 reply; 22+ messages in thread
From: Josua Mayer @ 2025-12-21 10:37 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton,
	linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-can@vger.kernel.org, linux-phy@lists.infradead.org,
	linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org

Hi Ulf,

Am 17.12.25 um 14:38 schrieb Ulf Hansson:
> On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:

cut

>>  /*
>>   * Using subsys_initcall instead of module_init here to try to ensure - for
>>   * the non-modular case - that the subsystem is initialized when mux consumers
>> diff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h
>> index 2e25c838f8312..a5da2e33a45c0 100644
>> --- a/include/linux/mux/consumer.h
>> +++ b/include/linux/mux/consumer.h
>> @@ -60,5 +60,9 @@ struct mux_control *devm_mux_control_get(struct device *dev,
>>                                          const char *mux_name);
>>  struct mux_state *devm_mux_state_get(struct device *dev,
>>                                      const char *mux_name);
>> +struct mux_state *devm_mux_state_get_optional(struct device *dev,
>> +                                             const char *mux_name);
>> +struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
>> +                                                      const char *mux_name);
> Seems like we need stub-functions of these too. Otherwise
> subsystems/drivers need to have a "depends on MULTIPLEXER" in their
> Kconfigs.

Currently the drivers that can use a mux select MULTIPLEXER in Kconfig.

There already exist a few mux helpers both for mux-state and for mux-control,
and they might all need stubs.

I'd prefer the restructuring of kconfig dependencies being independent from
adding mux-state functionality to renesas sdhi driver.

sincerely
Josua Mayer
-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux
  2025-12-17 13:42 ` [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Ulf Hansson
@ 2025-12-21 10:45   ` Josua Mayer
  0 siblings, 0 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-21 10:45 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton,
	linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-can@vger.kernel.org, linux-phy@lists.infradead.org,
	linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org

Am 17.12.25 um 14:42 schrieb Ulf Hansson:
> On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
>> Some Renesas SoC based boards mux SD and eMMC on a single sdio
>> controller, exposing user control by dip switch and software control by
>> gpio.
>>
>> Purpose is to simplify development and provisioning by selecting boot
>> media at power-on, and again before starting linux.
>>
>> Add binding and driver support for linking a (gpio) mux to renesas sdio
>> controller.
>>
>> Introduce generic helper functions for getting managed and selected
>> mux-state objects, and switch i2c-omap and phy-can-transceiver drivers.
>>
>> Signed-off-by: Josua Mayer <josua@solid-run.com>
>> ---
>> Changes in v3:
>> - updated omap-i2c and phy-can-transceiver to use new helpers.
>> - created generic helper functions for getting managed optional mux-state.
>>   (Reported-by: Rob Herring <robh@kernel.org>)
>> - picked up binding ack by Rob Herring.
>> - replaced use of "SDIO" with "SD/SDIO/eMMC" in binding document and
>>   commit descriptions.
>>   (Reported-by: Ulf Hansson <ulf.hansson@linaro.org>)
>> - Link to v2: https://lore.kernel.org/r/20251201-rz-sdio-mux-v2-0-bcb581b88dd7@solid-run.com
>>
>> Changes in v2:
>> - dropped mux-controller node from dt binding example
>>   (Reported-by: Conor Dooley <conor@kernel.org>
>>    Reported-by: Krzysztof Kozlowski <krzk@kernel.org>)
>> - Link to v1: https://lore.kernel.org/r/20251128-rz-sdio-mux-v1-0-1ede318d160f@solid-run.com
>>
>> ---
>> Josua Mayer (6):
>>       phy: can-transceiver: rename temporary helper function to avoid conflict
>>       mux: Add helper functions for getting optional and selected mux-state
>>       phy: can-transceiver: drop temporary helper getting optional mux-state
>>       i2c: omap: switch to new generic helper for getting selected mux-state
>>       dt-bindings: mmc: renesas,sdhi: Add mux-states property
>>       mmc: host: renesas_sdhi_core: support selecting an optional mux
>>
>>  .../devicetree/bindings/mmc/renesas,sdhi.yaml      |  6 ++
>>  drivers/i2c/busses/i2c-omap.c                      | 19 ++----
>>  drivers/mmc/host/Kconfig                           |  1 +
>>  drivers/mmc/host/renesas_sdhi.h                    |  1 +
>>  drivers/mmc/host/renesas_sdhi_core.c               | 16 +++++-
>>  drivers/mux/core.c                                 | 67 +++++++++++++++++++---
>>  drivers/phy/phy-can-transceiver.c                  | 10 ----
>>  include/linux/mux/consumer.h                       |  4 ++
>>  8 files changed, 89 insertions(+), 35 deletions(-)
>> ---
>> base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787
>> change-id: 20251128-rz-sdio-mux-acc5137f1618
>>
>> Best regards,
>> --
>> Josua Mayer <josua@solid-run.com>
> Looks like this needs to go together or if someone can host the common
> parts via an immutable branch.
Yes. Patch 1 is critical and must be applied before 2. Patches 3-5 require 2.
>
> Anyway, I am expecting some discussion or update for patch2 first.
>
> Kind regards
> Uffe
>
-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-10 17:38 ` [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state Josua Mayer
  2025-12-17 13:38   ` Ulf Hansson
@ 2025-12-22 10:08   ` Geert Uytterhoeven
  2025-12-29 12:01     ` Josua Mayer
  1 sibling, 1 reply; 22+ messages in thread
From: Geert Uytterhoeven @ 2025-12-22 10:08 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c

Hi Josua,

On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
> In-tree phy-can-transceiver driver has already implemented a local
> version of devm_mux_state_get_optional.
>
> The omap-i2c driver gets and selects an optional mux in its probe
> function without using any helper.
>
> Add new helper functions covering both aforementioned use-cases:
>
> - devm_mux_state_get_optional:
>   Get a mux-state if specified in dt, return NULL otherwise.
> - devm_mux_state_get_optional_selected:
>   Get and select a mux-state if specified in dt, return error or NULL.
>
> Existing mux_get helper function is changed to return -ENOENT in case dt
> did not specify a mux-state or -control matching given name (if valid).
> This matches of_parse_phandle_with_args semantics which also returns
> -ENOENT if the property does nto exists, or its value is zero.
>
> The new helper functions check for ENOENT to return NULL for optional
> muxes.
>
> Commit e153fdea9db04 ("phy: can-transceiver: Re-instate "mux-states"
> property presence check") noted that "mux_get() always prints an error
> message in case of an error, including when the property is not present,
> confusing the user."
>
> The first error message covers the case that a mux name is not matched
> in dt. This is removed as the returned error code (-ENOENT) is clear.
>
> The second error message is based on of_parse_phandle_with_args return
> value. In case mux description is missing from DT, it returns -ENOENT.
> Print error message only for other error codes.
>
> This ensures that the new helper functions will not confuse the user
> either.
>
> Signed-off-by: Josua Mayer <josua@solid-run.com>

Thanks for your patch!

> --- a/drivers/mux/core.c
> +++ b/drivers/mux/core.c
> @@ -542,11 +542,8 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>                 else
>                         index = of_property_match_string(np, "mux-control-names",
>                                                          mux_name);
> -               if (index < 0) {
> -                       dev_err(dev, "mux controller '%s' not found\n",
> -                               mux_name);
> -                       return ERR_PTR(index);
> -               }
> +               if (index < 0)
> +                       return ERR_PTR(-ENOENT);
>         }
>
>         if (state)
> @@ -558,8 +555,10 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>                                                  "mux-controls", "#mux-control-cells",
>                                                  index, &args);
>         if (ret) {
> -               dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
> -                       np, state ? "state" : "control", mux_name ?: "", index);
> +               if (ret != -ENOENT)

I think the non-optional variant should still print an error message in
case of -ENOENT, else this has to be duplicated in all drivers using it.

This is typically handled by having a non-printing core helper function,
and having printing non-optional, and non-printing/ignoring optional wrappers
around the former.

> +                       dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
> +                               np, state ? "state" : "control",
> +                               mux_name ?: "", index);
>                 return ERR_PTR(ret);
>         }
>

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict
  2025-12-10 17:38 ` [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict Josua Mayer
@ 2025-12-22 10:59   ` Geert Uytterhoeven
  2025-12-23 14:08   ` Vinod Koul
  1 sibling, 0 replies; 22+ messages in thread
From: Geert Uytterhoeven @ 2025-12-22 10:59 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Magnus Damm, Wolfram Sang, Marc Kleine-Budde, Vincent Mailhol,
	Vinod Koul, Kishon Vijay Abraham I, Peter Rosin, Aaro Koskinen,
	Andreas Kemnade, Kevin Hilman, Roger Quadros, Tony Lindgren,
	Vignesh R, Janusz Krzysztofik, Andi Shyti, Mikhail Anikin,
	Yazan Shhady, Jon Nettleton, linux-mmc, devicetree, linux-kernel,
	linux-renesas-soc, linux-can, linux-phy, linux-omap, linux-i2c

On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
> Rename the temporary devm_mux_state_get_optional function to avoid
> conflict with upcoming implementation in multiplexer subsystem.
>
> Signed-off-by: Josua Mayer <josua@solid-run.com>

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state
  2025-12-10 17:38 ` [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state Josua Mayer
@ 2025-12-22 11:00   ` Geert Uytterhoeven
  2025-12-23 14:08   ` Vinod Koul
  1 sibling, 0 replies; 22+ messages in thread
From: Geert Uytterhoeven @ 2025-12-22 11:00 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Magnus Damm, Wolfram Sang, Marc Kleine-Budde, Vincent Mailhol,
	Vinod Koul, Kishon Vijay Abraham I, Peter Rosin, Aaro Koskinen,
	Andreas Kemnade, Kevin Hilman, Roger Quadros, Tony Lindgren,
	Vignesh R, Janusz Krzysztofik, Andi Shyti, Mikhail Anikin,
	Yazan Shhady, Jon Nettleton, linux-mmc, devicetree, linux-kernel,
	linux-renesas-soc, linux-can, linux-phy, linux-omap, linux-i2c

On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
> Multiplexer subsystem has now added helpers for getting managed optional
> mux-state.
>
> Switch to the new devm_mux_state_get_optional helper.
>
> This change is only compile-tested.
>
> Signed-off-by: Josua Mayer <josua@solid-run.com>

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-21 10:37     ` Josua Mayer
@ 2025-12-22 14:47       ` Ulf Hansson
  2025-12-29 11:30         ` Josua Mayer
  0 siblings, 1 reply; 22+ messages in thread
From: Ulf Hansson @ 2025-12-22 14:47 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton,
	linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-can@vger.kernel.org, linux-phy@lists.infradead.org,
	linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org

On Sun, 21 Dec 2025 at 11:38, Josua Mayer <josua@solid-run.com> wrote:
>
> Hi Ulf,
>
> Am 17.12.25 um 14:38 schrieb Ulf Hansson:
> > On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
>
> cut
>
> >>  /*
> >>   * Using subsys_initcall instead of module_init here to try to ensure - for
> >>   * the non-modular case - that the subsystem is initialized when mux consumers
> >> diff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h
> >> index 2e25c838f8312..a5da2e33a45c0 100644
> >> --- a/include/linux/mux/consumer.h
> >> +++ b/include/linux/mux/consumer.h
> >> @@ -60,5 +60,9 @@ struct mux_control *devm_mux_control_get(struct device *dev,
> >>                                          const char *mux_name);
> >>  struct mux_state *devm_mux_state_get(struct device *dev,
> >>                                      const char *mux_name);
> >> +struct mux_state *devm_mux_state_get_optional(struct device *dev,
> >> +                                             const char *mux_name);
> >> +struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
> >> +                                                      const char *mux_name);
> > Seems like we need stub-functions of these too. Otherwise
> > subsystems/drivers need to have a "depends on MULTIPLEXER" in their
> > Kconfigs.
>
> Currently the drivers that can use a mux select MULTIPLEXER in Kconfig.

Yes, but that's not generally how we do this. The driver may not need
MULTIPLEXER for all platforms that driver is being used on.

>
> There already exist a few mux helpers both for mux-state and for mux-control,
> and they might all need stubs.

Correct. I think we should add subs for all of them.

>
> I'd prefer the restructuring of kconfig dependencies being independent from
> adding mux-state functionality to renesas sdhi driver.

I understand your point, but adding the stubs isn't really a big thing
- unless someone has some good arguments not to!?

Moreover, since the series changes the mux-core anyways - and
subsequent changes depend on it, I don't see an issue to fold in yet
another patch to add the stubs.

Kind regards
Uffe

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict
  2025-12-10 17:38 ` [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict Josua Mayer
  2025-12-22 10:59   ` Geert Uytterhoeven
@ 2025-12-23 14:08   ` Vinod Koul
  1 sibling, 0 replies; 22+ messages in thread
From: Vinod Koul @ 2025-12-23 14:08 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c

On 10-12-25, 18:38, Josua Mayer wrote:
> Rename the temporary devm_mux_state_get_optional function to avoid
> conflict with upcoming implementation in multiplexer subsystem.

Acked-by: Vinod Koul <vkoul@kernel.org>


-- 
~Vinod

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state
  2025-12-10 17:38 ` [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state Josua Mayer
  2025-12-22 11:00   ` Geert Uytterhoeven
@ 2025-12-23 14:08   ` Vinod Koul
  1 sibling, 0 replies; 22+ messages in thread
From: Vinod Koul @ 2025-12-23 14:08 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton, linux-mmc,
	devicetree, linux-kernel, linux-renesas-soc, linux-can, linux-phy,
	linux-omap, linux-i2c

On 10-12-25, 18:38, Josua Mayer wrote:
> Multiplexer subsystem has now added helpers for getting managed optional
> mux-state.

Acked-by: Vinod Koul <vkoul@kernel.org>


-- 
~Vinod

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 4/6] i2c: omap: switch to new generic helper for getting selected mux-state
  2025-12-10 17:38 ` [PATCH v3 4/6] i2c: omap: switch to new generic helper for getting selected mux-state Josua Mayer
@ 2025-12-23 17:11   ` Andreas Kemnade
  0 siblings, 0 replies; 22+ messages in thread
From: Andreas Kemnade @ 2025-12-23 17:11 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Kevin Hilman, Roger Quadros, Tony Lindgren,
	Vignesh R, Janusz Krzysztofik, Andi Shyti, Mikhail Anikin,
	Yazan Shhady, Jon Nettleton, linux-mmc, devicetree, linux-kernel,
	linux-renesas-soc, linux-can, linux-phy, linux-omap, linux-i2c

On Wed, 10 Dec 2025 18:38:38 +0100
Josua Mayer <josua@solid-run.com> wrote:

> Multiplexer subsystem has added generic helper functiosn for getting an
> already selected mux-state object.
> 
> Replace existing logic in probe with the equivalent helper function.
> 
> This change is only compile-tested.
> 
> Signed-off-by: Josua Mayer <josua@solid-run.com>

Reviewed-by: Andreas Kemnade <andreas@kemnade.info>


-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-22 14:47       ` Ulf Hansson
@ 2025-12-29 11:30         ` Josua Mayer
  2025-12-29 14:46           ` Ulf Hansson
  0 siblings, 1 reply; 22+ messages in thread
From: Josua Mayer @ 2025-12-29 11:30 UTC (permalink / raw)
  To: Ulf Hansson
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton,
	linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-can@vger.kernel.org, linux-phy@lists.infradead.org,
	linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org

Am 22.12.25 um 15:47 schrieb Ulf Hansson:
> On Sun, 21 Dec 2025 at 11:38, Josua Mayer <josua@solid-run.com> wrote:
>> Hi Ulf,
>>
>> Am 17.12.25 um 14:38 schrieb Ulf Hansson:
>>> On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
>> cut
>>
>>>>  /*
>>>>   * Using subsys_initcall instead of module_init here to try to ensure - for
>>>>   * the non-modular case - that the subsystem is initialized when mux consumers
>>>> diff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h
>>>> index 2e25c838f8312..a5da2e33a45c0 100644
>>>> --- a/include/linux/mux/consumer.h
>>>> +++ b/include/linux/mux/consumer.h
>>>> @@ -60,5 +60,9 @@ struct mux_control *devm_mux_control_get(struct device *dev,
>>>>                                          const char *mux_name);
>>>>  struct mux_state *devm_mux_state_get(struct device *dev,
>>>>                                      const char *mux_name);
>>>> +struct mux_state *devm_mux_state_get_optional(struct device *dev,
>>>> +                                             const char *mux_name);
>>>> +struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
>>>> +                                                      const char *mux_name);
>>> Seems like we need stub-functions of these too. Otherwise
>>> subsystems/drivers need to have a "depends on MULTIPLEXER" in their
>>> Kconfigs.
>> Currently the drivers that can use a mux select MULTIPLEXER in Kconfig.
> Yes, but that's not generally how we do this. The driver may not need
> MULTIPLEXER for all platforms that driver is being used on.
>
>> There already exist a few mux helpers both for mux-state and for mux-control,
>> and they might all need stubs.
> Correct. I think we should add subs for all of them.
>
>> I'd prefer the restructuring of kconfig dependencies being independent from
>> adding mux-state functionality to renesas sdhi driver.
> I understand your point, but adding the stubs isn't really a big thing
> - unless someone has some good arguments not to!?
>
> Moreover, since the series changes the mux-core anyways - and
> subsequent changes depend on it, I don't see an issue to fold in yet
> another patch to add the stubs.
Would this also cause changing all the Kconfig "select MULTIPLEXER"?
If it is only the stubs - sure.

And then in the renesas sdhi patch I can drop my change to kconfig.

sincerely
Josua Mayer
-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-22 10:08   ` Geert Uytterhoeven
@ 2025-12-29 12:01     ` Josua Mayer
  2025-12-29 12:07       ` Josua Mayer
  0 siblings, 1 reply; 22+ messages in thread
From: Josua Mayer @ 2025-12-29 12:01 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton,
	linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-can@vger.kernel.org, linux-phy@lists.infradead.org,
	linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org


Am 22.12.25 um 11:08 schrieb Geert Uytterhoeven:
> Hi Josua,
>
> On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
>> In-tree phy-can-transceiver driver has already implemented a local
>> version of devm_mux_state_get_optional.
>>
>> The omap-i2c driver gets and selects an optional mux in its probe
>> function without using any helper.
>>
>> Add new helper functions covering both aforementioned use-cases:
>>
>> - devm_mux_state_get_optional:
>>   Get a mux-state if specified in dt, return NULL otherwise.
>> - devm_mux_state_get_optional_selected:
>>   Get and select a mux-state if specified in dt, return error or NULL.
>>
>> Existing mux_get helper function is changed to return -ENOENT in case dt
>> did not specify a mux-state or -control matching given name (if valid).
>> This matches of_parse_phandle_with_args semantics which also returns
>> -ENOENT if the property does nto exists, or its value is zero.
>>
>> The new helper functions check for ENOENT to return NULL for optional
>> muxes.
>>
>> Commit e153fdea9db04 ("phy: can-transceiver: Re-instate "mux-states"
>> property presence check") noted that "mux_get() always prints an error
>> message in case of an error, including when the property is not present,
>> confusing the user."
>>
>> The first error message covers the case that a mux name is not matched
>> in dt. This is removed as the returned error code (-ENOENT) is clear.
>>
>> The second error message is based on of_parse_phandle_with_args return
>> value. In case mux description is missing from DT, it returns -ENOENT.
>> Print error message only for other error codes.
>>
>> This ensures that the new helper functions will not confuse the user
>> either.
>>
>> Signed-off-by: Josua Mayer <josua@solid-run.com>
> Thanks for your patch!
>
>> --- a/drivers/mux/core.c
>> +++ b/drivers/mux/core.c
>> @@ -542,11 +542,8 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>>                 else
>>                         index = of_property_match_string(np, "mux-control-names",
>>                                                          mux_name);
>> -               if (index < 0) {
>> -                       dev_err(dev, "mux controller '%s' not found\n",
>> -                               mux_name);
>> -                       return ERR_PTR(index);
>> -               }
>> +               if (index < 0)
>> +                       return ERR_PTR(-ENOENT);
>>         }
>>
>>         if (state)
>> @@ -558,8 +555,10 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>>                                                  "mux-controls", "#mux-control-cells",
>>                                                  index, &args);
>>         if (ret) {
>> -               dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
>> -                       np, state ? "state" : "control", mux_name ?: "", index);
>> +               if (ret != -ENOENT)
> I think the non-optional variant should still print an error message in
> case of -ENOENT, else this has to be duplicated in all drivers using it.
>
> This is typically handled by having a non-printing core helper function,
> and having printing non-optional, and non-printing/ignoring optional wrappers
> around the former.

I would prefer letting drivers use dev_err_probe.
Silent helper functions can more easily share code between them ...

If this is a strong preference I can rework the error behaviour and modify
the relevant mux_state_get and mux_control_get.

>
>> +                       dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
>> +                               np, state ? "state" : "control",
>> +                               mux_name ?: "", index);
>>                 return ERR_PTR(ret);
>>         }
>>
> Gr{oetje,eeting}s,
>
>                         Geert
>
-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-29 12:01     ` Josua Mayer
@ 2025-12-29 12:07       ` Josua Mayer
  0 siblings, 0 replies; 22+ messages in thread
From: Josua Mayer @ 2025-12-29 12:07 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Ulf Hansson, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton,
	linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-can@vger.kernel.org, linux-phy@lists.infradead.org,
	linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org


Am 29.12.25 um 13:01 schrieb Josua Mayer:
> Am 22.12.25 um 11:08 schrieb Geert Uytterhoeven:
>> Hi Josua,
>>
>> On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
>>> In-tree phy-can-transceiver driver has already implemented a local
>>> version of devm_mux_state_get_optional.
>>>
>>> The omap-i2c driver gets and selects an optional mux in its probe
>>> function without using any helper.
>>>
>>> Add new helper functions covering both aforementioned use-cases:
>>>
>>> - devm_mux_state_get_optional:
>>>   Get a mux-state if specified in dt, return NULL otherwise.
>>> - devm_mux_state_get_optional_selected:
>>>   Get and select a mux-state if specified in dt, return error or NULL.
>>>
>>> Existing mux_get helper function is changed to return -ENOENT in case dt
>>> did not specify a mux-state or -control matching given name (if valid).
>>> This matches of_parse_phandle_with_args semantics which also returns
>>> -ENOENT if the property does nto exists, or its value is zero.
>>>
>>> The new helper functions check for ENOENT to return NULL for optional
>>> muxes.
>>>
>>> Commit e153fdea9db04 ("phy: can-transceiver: Re-instate "mux-states"
>>> property presence check") noted that "mux_get() always prints an error
>>> message in case of an error, including when the property is not present,
>>> confusing the user."
>>>
>>> The first error message covers the case that a mux name is not matched
>>> in dt. This is removed as the returned error code (-ENOENT) is clear.
>>>
>>> The second error message is based on of_parse_phandle_with_args return
>>> value. In case mux description is missing from DT, it returns -ENOENT.
>>> Print error message only for other error codes.
>>>
>>> This ensures that the new helper functions will not confuse the user
>>> either.
>>>
>>> Signed-off-by: Josua Mayer <josua@solid-run.com>
>> Thanks for your patch!
>>
>>> --- a/drivers/mux/core.c
>>> +++ b/drivers/mux/core.c
>>> @@ -542,11 +542,8 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>>>                 else
>>>                         index = of_property_match_string(np, "mux-control-names",
>>>                                                          mux_name);
>>> -               if (index < 0) {
>>> -                       dev_err(dev, "mux controller '%s' not found\n",
>>> -                               mux_name);
>>> -                       return ERR_PTR(index);
>>> -               }
>>> +               if (index < 0)
>>> +                       return ERR_PTR(-ENOENT);
>>>         }
>>>
>>>         if (state)
>>> @@ -558,8 +555,10 @@ static struct mux_control *mux_get(struct device *dev, const char *mux_name,
>>>                                                  "mux-controls", "#mux-control-cells",
>>>                                                  index, &args);
>>>         if (ret) {
>>> -               dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
>>> -                       np, state ? "state" : "control", mux_name ?: "", index);
>>> +               if (ret != -ENOENT)
>> I think the non-optional variant should still print an error message in
>> case of -ENOENT, else this has to be duplicated in all drivers using it.
>>
>> This is typically handled by having a non-printing core helper function,
>> and having printing non-optional, and non-printing/ignoring optional wrappers
>> around the former.
> I would prefer letting drivers use dev_err_probe.
> Silent helper functions can more easily share code between them ...
>
> If this is a strong preference I can rework the error behaviour and modify
> the relevant mux_state_get and mux_control_get.
Thinking further ... The main issue is that the core mux_get functio is quite
verbose printing message for each error condition.

Now I have silenced the ENOENT case - because it should be silent for optional
muxes.

So ... actually I propose to update direct callers of mux_get function,
and re-add error message specifically for non-optional variants in case of ENOENT.

>
>>> +                       dev_err(dev, "%pOF: failed to get mux-%s %s(%i)\n",
>>> +                               np, state ? "state" : "control",
>>> +                               mux_name ?: "", index);
>>>                 return ERR_PTR(ret);
>>>         }
>>>
>> Gr{oetje,eeting}s,
>>
>>                         Geert
> >
-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state
  2025-12-29 11:30         ` Josua Mayer
@ 2025-12-29 14:46           ` Ulf Hansson
  0 siblings, 0 replies; 22+ messages in thread
From: Ulf Hansson @ 2025-12-29 14:46 UTC (permalink / raw)
  To: Josua Mayer
  Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Geert Uytterhoeven, Magnus Damm, Wolfram Sang, Marc Kleine-Budde,
	Vincent Mailhol, Vinod Koul, Kishon Vijay Abraham I, Peter Rosin,
	Aaro Koskinen, Andreas Kemnade, Kevin Hilman, Roger Quadros,
	Tony Lindgren, Vignesh R, Janusz Krzysztofik, Andi Shyti,
	Mikhail Anikin, Yazan Shhady, Jon Nettleton,
	linux-mmc@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	linux-can@vger.kernel.org, linux-phy@lists.infradead.org,
	linux-omap@vger.kernel.org, linux-i2c@vger.kernel.org

On Mon, 29 Dec 2025 at 12:30, Josua Mayer <josua@solid-run.com> wrote:
>
> Am 22.12.25 um 15:47 schrieb Ulf Hansson:
> > On Sun, 21 Dec 2025 at 11:38, Josua Mayer <josua@solid-run.com> wrote:
> >> Hi Ulf,
> >>
> >> Am 17.12.25 um 14:38 schrieb Ulf Hansson:
> >>> On Wed, 10 Dec 2025 at 18:39, Josua Mayer <josua@solid-run.com> wrote:
> >> cut
> >>
> >>>>  /*
> >>>>   * Using subsys_initcall instead of module_init here to try to ensure - for
> >>>>   * the non-modular case - that the subsystem is initialized when mux consumers
> >>>> diff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h
> >>>> index 2e25c838f8312..a5da2e33a45c0 100644
> >>>> --- a/include/linux/mux/consumer.h
> >>>> +++ b/include/linux/mux/consumer.h
> >>>> @@ -60,5 +60,9 @@ struct mux_control *devm_mux_control_get(struct device *dev,
> >>>>                                          const char *mux_name);
> >>>>  struct mux_state *devm_mux_state_get(struct device *dev,
> >>>>                                      const char *mux_name);
> >>>> +struct mux_state *devm_mux_state_get_optional(struct device *dev,
> >>>> +                                             const char *mux_name);
> >>>> +struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
> >>>> +                                                      const char *mux_name);
> >>> Seems like we need stub-functions of these too. Otherwise
> >>> subsystems/drivers need to have a "depends on MULTIPLEXER" in their
> >>> Kconfigs.
> >> Currently the drivers that can use a mux select MULTIPLEXER in Kconfig.
> > Yes, but that's not generally how we do this. The driver may not need
> > MULTIPLEXER for all platforms that driver is being used on.
> >
> >> There already exist a few mux helpers both for mux-state and for mux-control,
> >> and they might all need stubs.
> > Correct. I think we should add subs for all of them.
> >
> >> I'd prefer the restructuring of kconfig dependencies being independent from
> >> adding mux-state functionality to renesas sdhi driver.
> > I understand your point, but adding the stubs isn't really a big thing
> > - unless someone has some good arguments not to!?
> >
> > Moreover, since the series changes the mux-core anyways - and
> > subsequent changes depend on it, I don't see an issue to fold in yet
> > another patch to add the stubs.
> Would this also cause changing all the Kconfig "select MULTIPLEXER"?
> If it is only the stubs - sure.
>
> And then in the renesas sdhi patch I can drop my change to kconfig.

Correct!

Typically, it's better to do a "select MULTIPLEXER" in the platform's
Kconfig for those platforms that really need it.

Kind regards
Uffe

-- 
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2025-12-29 14:47 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-10 17:38 [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Josua Mayer
2025-12-10 17:38 ` [PATCH v3 1/6] phy: can-transceiver: rename temporary helper function to avoid conflict Josua Mayer
2025-12-22 10:59   ` Geert Uytterhoeven
2025-12-23 14:08   ` Vinod Koul
2025-12-10 17:38 ` [PATCH v3 2/6] mux: Add helper functions for getting optional and selected mux-state Josua Mayer
2025-12-17 13:38   ` Ulf Hansson
2025-12-21 10:37     ` Josua Mayer
2025-12-22 14:47       ` Ulf Hansson
2025-12-29 11:30         ` Josua Mayer
2025-12-29 14:46           ` Ulf Hansson
2025-12-22 10:08   ` Geert Uytterhoeven
2025-12-29 12:01     ` Josua Mayer
2025-12-29 12:07       ` Josua Mayer
2025-12-10 17:38 ` [PATCH v3 3/6] phy: can-transceiver: drop temporary helper getting optional mux-state Josua Mayer
2025-12-22 11:00   ` Geert Uytterhoeven
2025-12-23 14:08   ` Vinod Koul
2025-12-10 17:38 ` [PATCH v3 4/6] i2c: omap: switch to new generic helper for getting selected mux-state Josua Mayer
2025-12-23 17:11   ` Andreas Kemnade
2025-12-10 17:38 ` [PATCH v3 5/6] dt-bindings: mmc: renesas,sdhi: Add mux-states property Josua Mayer
2025-12-10 17:38 ` [PATCH v3 6/6] mmc: host: renesas_sdhi_core: support selecting an optional mux Josua Mayer
2025-12-17 13:42 ` [PATCH v3 0/6] mmc: host: renesas_sdhi_core: support configuring an optional sdio mux Ulf Hansson
2025-12-21 10:45   ` Josua Mayer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).