All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RESEND] mux: gpio-mux: add support for 4:1 2-channels mux
@ 2026-04-30 14:11 Andrea Tomassetti
  2026-05-05  8:23 ` Linus Walleij
  0 siblings, 1 reply; 9+ messages in thread
From: Andrea Tomassetti @ 2026-04-30 14:11 UTC (permalink / raw)
  To: Peter Rosin
  Cc: linusw, Andrea Tomassetti, Johan Hovold, Krzysztof Kozlowski,
	Srinivas Kandagatla, linux-kernel

Some gpio multiplexers, like TMUX1209, offer differential 4:1
or dual 4:1 single-ended channels. Similarly to what already done by
the adg792a driver, the gpio-mux driver has to take into account
the #mux-control-cells property and allocate as many controllers
as advised by it.

So, in the DTS you can now define:

	tmux1209: mux-controller {
		compatible = "gpio-mux";
		#mux-control-cells = <1>;

		mux-gpios = <&gpio_expander 01 GPIO_ACTIVE_HIGH>,
					<&gpio_expander 02 GPIO_ACTIVE_HIGH>;
	};

	adcmux30: adcmux30 {
		compatible = "io-channel-mux";
		io-channels = <&adc1 4>;
		io-channel-names = "parent";
		#io-channel-cells = <1>;
		mux-controls = <&tmux1209 0>;

		channels = "S1A", "S2A", "S3A", "S4A";
	};

	adcmux31: adcmux31 {
		compatible = "io-channel-mux";
		io-channels = <&adc1 5>;
		io-channel-names = "parent";
		#io-channel-cells = <1>;
		mux-controls = <&tmux1209 1>;

		channels = "S1B", "S2B", "S3B", "S4B";
	};

Signed-off-by: Andrea Tomassetti <andrea.tomassetti@sipearl.com>
---
 drivers/mux/gpio.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/mux/gpio.c b/drivers/mux/gpio.c
index 4cc3202c58f3..01ce3f878b9e 100644
--- a/drivers/mux/gpio.c
+++ b/drivers/mux/gpio.c
@@ -52,12 +52,23 @@ static int mux_gpio_probe(struct platform_device *pdev)
 	int pins;
 	s32 idle_state;
 	int ret;
+	u32 cells;
+	int i;

 	pins = gpiod_count(dev, "mux");
 	if (pins < 0)
 		return pins;

-	mux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*mux_gpio));
+	ret = device_property_read_u32(dev, "#mux-control-cells", &cells);
+	if (ret < 0)
+		cells = 0;
+
+	if (cells >= 2) {
+		dev_err(dev, "invalid control-cells %u\n", cells);
+		return -EINVAL;
+	}
+
+	mux_chip = devm_mux_chip_alloc(dev, cells + 1, sizeof(*mux_gpio));
 	if (IS_ERR(mux_chip))
 		return PTR_ERR(mux_chip);

@@ -69,7 +80,9 @@ static int mux_gpio_probe(struct platform_device *pdev)
 		return dev_err_probe(dev, PTR_ERR(mux_gpio->gpios),
 				     "failed to get gpios\n");
 	WARN_ON(pins != mux_gpio->gpios->ndescs);
-	mux_chip->mux->states = BIT(pins);
+
+	for (i = 0; i < mux_chip->controllers; ++i)
+		mux_chip->mux[i].states = BIT(pins);

 	ret = device_property_read_u32(dev, "idle-state", (u32 *)&idle_state);
 	if (ret >= 0 && idle_state != MUX_IDLE_AS_IS) {

base-commit: 80234b5ab240f52fa45d201e899e207b9265ef91
--
2.51.2


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

* Re: [PATCH RESEND] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-04-30 14:11 [PATCH RESEND] mux: gpio-mux: add support for 4:1 2-channels mux Andrea Tomassetti
@ 2026-05-05  8:23 ` Linus Walleij
  2026-05-05 15:20   ` Andrea Tomassetti
  0 siblings, 1 reply; 9+ messages in thread
From: Linus Walleij @ 2026-05-05  8:23 UTC (permalink / raw)
  To: Andrea Tomassetti
  Cc: Peter Rosin, Johan Hovold, Krzysztof Kozlowski,
	Srinivas Kandagatla, linux-kernel

Hi Andrea,

thanks for your patch!

On Thu, Apr 30, 2026 at 4:13 PM Andrea Tomassetti
<andrea.tomassetti@sipearl.com> wrote:

> Some gpio multiplexers, like TMUX1209, offer differential 4:1
> or dual 4:1 single-ended channels. Similarly to what already done by
> the adg792a driver, the gpio-mux driver has to take into account
> the #mux-control-cells property and allocate as many controllers
> as advised by it.
>
> So, in the DTS you can now define:
>
>         tmux1209: mux-controller {
>                 compatible = "gpio-mux";
>                 #mux-control-cells = <1>;
>
>                 mux-gpios = <&gpio_expander 01 GPIO_ACTIVE_HIGH>,
>                                         <&gpio_expander 02 GPIO_ACTIVE_HIGH>;
>         };
>
>         adcmux30: adcmux30 {
>                 compatible = "io-channel-mux";
>                 io-channels = <&adc1 4>;
>                 io-channel-names = "parent";
>                 #io-channel-cells = <1>;
>                 mux-controls = <&tmux1209 0>;
>
>                 channels = "S1A", "S2A", "S3A", "S4A";
>         };
>
>         adcmux31: adcmux31 {
>                 compatible = "io-channel-mux";
>                 io-channels = <&adc1 5>;
>                 io-channel-names = "parent";
>                 #io-channel-cells = <1>;
>                 mux-controls = <&tmux1209 1>;
>
>                 channels = "S1B", "S2B", "S3B", "S4B";
>         };
>
> Signed-off-by: Andrea Tomassetti <andrea.tomassetti@sipearl.com>

The mux controller binding looks like this:

properties:
  '#mux-control-cells':
    enum: [ 0, 1 ]

So you do not patch the bindings, you actually implement this
for the case when #mux-control-cells is 1.

Please detail this in the commit.

> -       mux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*mux_gpio));
> +       ret = device_property_read_u32(dev, "#mux-control-cells", &cells);
> +       if (ret < 0)
> +               cells = 0;
> +
> +       if (cells >= 2) {
> +               dev_err(dev, "invalid control-cells %u\n", cells);
> +               return -EINVAL;
> +       }

Maybe put in a comment that the bindings only allow 0 or 1 cell.

> +
> +       mux_chip = devm_mux_chip_alloc(dev, cells + 1, sizeof(*mux_gpio));

Otherwise looks correct to me.

> -       mux_chip->mux->states = BIT(pins);
> +
> +       for (i = 0; i < mux_chip->controllers; ++i)
> +               mux_chip->mux[i].states = BIT(pins);

Is the mux core handling any other specifics? (I guess so...)

With the above added comments, details:
Reviewed-by: Linus Walleij <linusw@kernel.org>

Thanks!
Linus Walleij

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

* Re: [PATCH RESEND] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-05-05  8:23 ` Linus Walleij
@ 2026-05-05 15:20   ` Andrea Tomassetti
  2026-05-06  7:58     ` Linus Walleij
  0 siblings, 1 reply; 9+ messages in thread
From: Andrea Tomassetti @ 2026-05-05 15:20 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Peter Rosin, Johan Hovold, Krzysztof Kozlowski,
	Srinivas Kandagatla, linux-kernel@vger.kernel.org

Hi Linus,
thank you very much for taking the time to review and reply.

On 5/5/26 10:23, Linus Walleij wrote:
> **Warning** This email is from an external address. Please take care to proceed.
> 
> 
> Hi Andrea,
> 
> thanks for your patch!
> 
> On Thu, Apr 30, 2026 at 4:13 PM Andrea Tomassetti
> <andrea.tomassetti@sipearl.com> wrote:
> 
>> Some gpio multiplexers, like TMUX1209, offer differential 4:1
>> or dual 4:1 single-ended channels. Similarly to what already done by
>> the adg792a driver, the gpio-mux driver has to take into account
>> the #mux-control-cells property and allocate as many controllers
>> as advised by it.
>>
>> So, in the DTS you can now define:
>>
>>         tmux1209: mux-controller {
>>                 compatible = "gpio-mux";
>>                 #mux-control-cells = <1>;
>>
>>                 mux-gpios = <&gpio_expander 01 GPIO_ACTIVE_HIGH>,
>>                                         <&gpio_expander 02 GPIO_ACTIVE_HIGH>;
>>         };
>>
>>         adcmux30: adcmux30 {
>>                 compatible = "io-channel-mux";
>>                 io-channels = <&adc1 4>;
>>                 io-channel-names = "parent";
>>                 #io-channel-cells = <1>;
>>                 mux-controls = <&tmux1209 0>;
>>
>>                 channels = "S1A", "S2A", "S3A", "S4A";
>>         };
>>
>>         adcmux31: adcmux31 {
>>                 compatible = "io-channel-mux";
>>                 io-channels = <&adc1 5>;
>>                 io-channel-names = "parent";
>>                 #io-channel-cells = <1>;
>>                 mux-controls = <&tmux1209 1>;
>>
>>                 channels = "S1B", "S2B", "S3B", "S4B";
>>         };
>>
>> Signed-off-by: Andrea Tomassetti <andrea.tomassetti@sipearl.com>
> 
> The mux controller binding looks like this:
> 
> properties:
>   '#mux-control-cells':
>     enum: [ 0, 1 ]
> 
> So you do not patch the bindings, you actually implement this
> for the case when #mux-control-cells is 1.
> 
> Please detail this in the commit.
> 
Exactly, I'm not patching the bindings, there's no need. I tried to detail this
in my commit message:

    [...] the gpio-mux driver has to take into account
    the #mux-control-cells property and allocate as many controllers
    as advised by it.

but it looks like is not as clear as I thought. Maybe I can add the fact that
"patching the binding is not needed because the binding already supports
#mux-control-cells 0 and 1". What do you think?


>> -       mux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*mux_gpio));
>> +       ret = device_property_read_u32(dev, "#mux-control-cells", &cells);
>> +       if (ret < 0)
>> +               cells = 0;
>> +
>> +       if (cells >= 2) {
>> +               dev_err(dev, "invalid control-cells %u\n", cells);
>> +               return -EINVAL;
>> +       }
> 
> Maybe put in a comment that the bindings only allow 0 or 1 cell.
> 
Noted it!

>> +
>> +       mux_chip = devm_mux_chip_alloc(dev, cells + 1, sizeof(*mux_gpio));
> 
> Otherwise looks correct to me.
> 
>> -       mux_chip->mux->states = BIT(pins);
>> +
>> +       for (i = 0; i < mux_chip->controllers; ++i)
>> +               mux_chip->mux[i].states = BIT(pins);
> 
> Is the mux core handling any other specifics? (I guess so...)
> 
I guess so too but if there's something specific I'm missing, please let me know.

Moreover, I just realized that I missed two lines that should be probably
adjusted as well:

@@ -78,7 +91,8 @@ static int mux_gpio_probe(struct platform_device *pdev)
                        return -EINVAL;
                }

-               mux_chip->mux->idle_state = idle_state;
+               for (i = 0; i < mux_chip->controllers; ++i)
+                       mux_chip->mux[i].idle_state = idle_state;
        }

        ret = devm_regulator_get_enable_optional(dev, "mux");
@@ -89,8 +103,8 @@ static int mux_gpio_probe(struct platform_device *pdev)
        if (ret < 0)
                return ret;

-       dev_info(dev, "%u-way mux-controller registered\n",
-                mux_chip->mux->states);
+       dev_info(dev, "%u-way mux-controller registered, %u controllers\n",
+                mux_chip->mux->states, mux_chip->controllers);

        return 0;
 }

Should I integrate these modifications on the next version of the patch?

Thank you very much,
Andrea

> With the above added comments, details:
> Reviewed-by: Linus Walleij <linusw@kernel.org>
> 
> Thanks!
> Linus Walleij
> 

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

* Re: [PATCH RESEND] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-05-05 15:20   ` Andrea Tomassetti
@ 2026-05-06  7:58     ` Linus Walleij
  2026-05-06 12:33       ` [PATCH v2] " Andrea Tomassetti
  0 siblings, 1 reply; 9+ messages in thread
From: Linus Walleij @ 2026-05-06  7:58 UTC (permalink / raw)
  To: Andrea Tomassetti
  Cc: Peter Rosin, Johan Hovold, Krzysztof Kozlowski,
	Srinivas Kandagatla, linux-kernel@vger.kernel.org

On Tue, May 5, 2026 at 5:21 PM Andrea Tomassetti
<andrea.tomassetti@sipearl.com> wrote:

> Should I integrate these modifications on the next version of the patch?

Yeah looks good, just respin it.

Yours,
Linus Walleij

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

* [PATCH v2] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-05-06  7:58     ` Linus Walleij
@ 2026-05-06 12:33       ` Andrea Tomassetti
  2026-06-03 11:43         ` Andrea Tomassetti
  0 siblings, 1 reply; 9+ messages in thread
From: Andrea Tomassetti @ 2026-05-06 12:33 UTC (permalink / raw)
  To: linusw; +Cc: andrea.tomassetti, johan+linaro, krzk, linux-kernel, peda, srini

Some gpio multiplexers, like TMUX1209, offer differential 4:1
or dual 4:1 single-ended channels. No binding changes are needed
because the DT binding already supports #mux-control-cells
with values 0 and 1. So, similarly to what was already done by the
adg792a driver, the gpio-mux driver has to take into account
the #mux-control-cells property and allocate as many controllers as
advised by it.

As an example, in the DTS you can now define:

	tmux1209: mux-controller {
		compatible = "gpio-mux";
		#mux-control-cells = <1>;

		mux-gpios = <&gpio_expander 01 GPIO_ACTIVE_HIGH>,
			    <&gpio_expander 02 GPIO_ACTIVE_HIGH>;
	};

And use it like this:

	adcmux30: adcmux30 {
		compatible = "io-channel-mux";
		io-channels = <&adc1 4>;
		io-channel-names = "parent";
		#io-channel-cells = <1>;
		mux-controls = <&tmux1209 0>;

		channels = "S1A", "S2A", "S3A", "S4A";
	};

	adcmux31: adcmux31 {
		compatible = "io-channel-mux";
		io-channels = <&adc1 5>;
		io-channel-names = "parent";
		#io-channel-cells = <1>;
		mux-controls = <&tmux1209 1>;

		channels = "S1B", "S2B", "S3B", "S4B";
	};

Signed-off-by: Andrea Tomassetti <andrea.tomassetti@sipearl.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
---
v2: Address feedback from Linus Walleij
  - reword commit message by making clear that patching the binding
    is not needed
  - make clear from error message that binding only allows 0 or 1
  - fix two other locations where `mux` was accessed

 drivers/mux/gpio.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/drivers/mux/gpio.c b/drivers/mux/gpio.c
index 4cc3202c58f3..ab3ed5247d2c 100644
--- a/drivers/mux/gpio.c
+++ b/drivers/mux/gpio.c
@@ -52,12 +52,23 @@ static int mux_gpio_probe(struct platform_device *pdev)
 	int pins;
 	s32 idle_state;
 	int ret;
+	u32 cells;
+	int i;

 	pins = gpiod_count(dev, "mux");
 	if (pins < 0)
 		return pins;

-	mux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*mux_gpio));
+	ret = device_property_read_u32(dev, "#mux-control-cells", &cells);
+	if (ret < 0)
+		cells = 0;
+
+	if (cells >= 2) {
+		dev_err(dev, "invalid control-cells %u, must be 0 or 1\n", cells);
+		return -EINVAL;
+	}
+
+	mux_chip = devm_mux_chip_alloc(dev, cells + 1, sizeof(*mux_gpio));
 	if (IS_ERR(mux_chip))
 		return PTR_ERR(mux_chip);

@@ -69,7 +80,9 @@ static int mux_gpio_probe(struct platform_device *pdev)
 		return dev_err_probe(dev, PTR_ERR(mux_gpio->gpios),
 				     "failed to get gpios\n");
 	WARN_ON(pins != mux_gpio->gpios->ndescs);
-	mux_chip->mux->states = BIT(pins);
+
+	for (i = 0; i < mux_chip->controllers; ++i)
+		mux_chip->mux[i].states = BIT(pins);

 	ret = device_property_read_u32(dev, "idle-state", (u32 *)&idle_state);
 	if (ret >= 0 && idle_state != MUX_IDLE_AS_IS) {
@@ -78,7 +91,8 @@ static int mux_gpio_probe(struct platform_device *pdev)
 			return -EINVAL;
 		}

-		mux_chip->mux->idle_state = idle_state;
+		for (i = 0; i < mux_chip->controllers; ++i)
+			mux_chip->mux[i].idle_state = idle_state;
 	}

 	ret = devm_regulator_get_enable_optional(dev, "mux");
@@ -89,8 +103,8 @@ static int mux_gpio_probe(struct platform_device *pdev)
 	if (ret < 0)
 		return ret;

-	dev_info(dev, "%u-way mux-controller registered\n",
-		 mux_chip->mux->states);
+	dev_info(dev, "%u-way mux-controller registered, %u controllers\n",
+		 mux_chip->mux->states, mux_chip->controllers);

 	return 0;
 }

base-commit: 74fe02ce122a6103f207d29fafc8b3a53de6abaf
--
2.51.2


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

* Re: [PATCH v2] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-05-06 12:33       ` [PATCH v2] " Andrea Tomassetti
@ 2026-06-03 11:43         ` Andrea Tomassetti
  2026-06-03 14:00           ` Krzysztof Kozlowski
  2026-06-08 22:54           ` Linus Walleij
  0 siblings, 2 replies; 9+ messages in thread
From: Andrea Tomassetti @ 2026-06-03 11:43 UTC (permalink / raw)
  To: linusw@kernel.org
  Cc: johan+linaro@kernel.org, krzk@kernel.org,
	linux-kernel@vger.kernel.org, peda@axentia.se, srini@kernel.org

Hi Linus,
do you know if Peter Rosin is still actively maintaining this driver? I see that
there are other developers that sent patches months ago and that are still
waiting for a reply.

Do you have any insight? How's the process now?

Thank you very much,
Andrea

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

* Re: [PATCH v2] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-06-03 11:43         ` Andrea Tomassetti
@ 2026-06-03 14:00           ` Krzysztof Kozlowski
  2026-06-08 22:54           ` Linus Walleij
  1 sibling, 0 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2026-06-03 14:00 UTC (permalink / raw)
  To: Andrea Tomassetti, linusw@kernel.org
  Cc: johan+linaro@kernel.org, linux-kernel@vger.kernel.org,
	peda@axentia.se, srini@kernel.org

On 03/06/2026 13:43, Andrea Tomassetti wrote:
> Hi Linus,
> do you know if Peter Rosin is still actively maintaining this driver? I see that
> there are other developers that sent patches months ago and that are still
> waiting for a reply.
> 
> Do you have any insight? How's the process now?

I think Peter looks at mux subsystem only occasionally so that's I
marked it as Odd Fixes in commit ff91020412.

Best regards,
Krzysztof

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

* Re: [PATCH v2] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-06-03 11:43         ` Andrea Tomassetti
  2026-06-03 14:00           ` Krzysztof Kozlowski
@ 2026-06-08 22:54           ` Linus Walleij
  2026-06-17 13:09             ` Tommaso Merciai
  1 sibling, 1 reply; 9+ messages in thread
From: Linus Walleij @ 2026-06-08 22:54 UTC (permalink / raw)
  To: Andrea Tomassetti
  Cc: johan+linaro@kernel.org, krzk@kernel.org,
	linux-kernel@vger.kernel.org, peda@axentia.se, srini@kernel.org

On Wed, Jun 3, 2026 at 1:43 PM Andrea Tomassetti
<andrea.tomassetti@sipearl.com> wrote:

> Hi Linus,
> do you know if Peter Rosin is still actively maintaining this driver? I see that
> there are other developers that sent patches months ago and that are still
> waiting for a reply.
>
> Do you have any insight? How's the process now?

If Peter is unable to attend to it send a pull request to the SoC
tree (if this concerns an SoC) and explain the situation and the
SoC maintainers can pull it in while we are looking for a new
mux (co)maintainer. Unless you're interested in the job?

Yours,
Linus Walleij

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

* Re: [PATCH v2] mux: gpio-mux: add support for 4:1 2-channels mux
  2026-06-08 22:54           ` Linus Walleij
@ 2026-06-17 13:09             ` Tommaso Merciai
  0 siblings, 0 replies; 9+ messages in thread
From: Tommaso Merciai @ 2026-06-17 13:09 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Andrea Tomassetti, johan+linaro@kernel.org, krzk@kernel.org,
	linux-kernel@vger.kernel.org, peda@axentia.se, srini@kernel.org,
	Krzysztof Kozlowski

Hi Linus, Andrea, Krzysztof,

On Tue, Jun 09, 2026 at 12:54:10AM +0200, Linus Walleij wrote:
> On Wed, Jun 3, 2026 at 1:43 PM Andrea Tomassetti
> <andrea.tomassetti@sipearl.com> wrote:
> 
> > Hi Linus,
> > do you know if Peter Rosin is still actively maintaining this driver? I see that
> > there are other developers that sent patches months ago and that are still
> > waiting for a reply.
> >
> > Do you have any insight? How's the process now?
> 
> If Peter is unable to attend to it send a pull request to the SoC
> tree (if this concerns an SoC) and explain the situation and the
> SoC maintainers can pull it in while we are looking for a new
> mux (co)maintainer. Unless you're interested in the job?

I have the same issue with [1].

Starting from [2] (Date: Wed,  5 Nov 2025)
I have never received any feedback.

How should I proceed?
Maybe I'm missing something?

[1] https://lore.kernel.org/all/cover.1777294876.git.tommaso.merciai.xr@bp.renesas.com/
[2] https://lore.kernel.org/all/b0aeaea6408319ba7ae525d19bb6ff6dd566e2bb.1762354366.git.tommaso.merciai.xr@bp.renesas.com/

Thanks to all!

Kind Regards,
Tommaso

> 
> Yours,
> Linus Walleij

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

end of thread, other threads:[~2026-06-17 13:09 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-30 14:11 [PATCH RESEND] mux: gpio-mux: add support for 4:1 2-channels mux Andrea Tomassetti
2026-05-05  8:23 ` Linus Walleij
2026-05-05 15:20   ` Andrea Tomassetti
2026-05-06  7:58     ` Linus Walleij
2026-05-06 12:33       ` [PATCH v2] " Andrea Tomassetti
2026-06-03 11:43         ` Andrea Tomassetti
2026-06-03 14:00           ` Krzysztof Kozlowski
2026-06-08 22:54           ` Linus Walleij
2026-06-17 13:09             ` Tommaso Merciai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.