Re: [PATCH v12 2/7] i2c: mux: add idle_state property to i2c_mux_core
Peter Rosin <[email protected]> Thu, 23 Jul 2026 13:04:11 +0200
| Newsgroups | org.kernel.vger.linux-i2c,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi! On 2026-07-19 16:59, Marcus Folkesson wrote: > Muxes treat their channels differently when idle. > Let the mux core have this information to make it available for > internal use. > > Possible idle states are: > - I2C_MUX_IDLE_AS_IS: Leave channels as is when idle > - I2C_MUX_IDLE_DISCONNECT: Disconnect channel (set HiZ when idle) > - I2C_MUX_IDLE_UNKNOWN: Unknown idle state > - <n>: Enable channel n (starting from 0) when idle" > > Default value is set to I2C_MUX_IDLE_UNKNOWN. > > Reviewed-by: Andy Shevchenko <[email protected]> > Signed-off-by: Marcus Folkesson <[email protected]> > --- > drivers/i2c/i2c-mux.c | 1 + > include/linux/i2c-mux.h | 30 ++++++++++++++++++++++++++++++ > 2 files changed, 31 insertions(+) > > diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c > index 681a201c239b..b126ce7338c2 100644 > --- a/drivers/i2c/i2c-mux.c > +++ b/drivers/i2c/i2c-mux.c > @@ -247,6 +247,7 @@ struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent, > muxc->select = select; > muxc->deselect = deselect; > muxc->max_adapters = max_adapters; > + muxc->idle_state = I2C_MUX_IDLE_UNKNOWN; > > return muxc; > } > diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h > index 1784ac7afb11..a348f81e7a90 100644 > --- a/include/linux/i2c-mux.h > +++ b/include/linux/i2c-mux.h > @@ -15,6 +15,10 @@ > > #include <linux/bitops.h> > > +#define I2C_MUX_IDLE_AS_IS (-1) > +#define I2C_MUX_IDLE_DISCONNECT (-2) > +#define I2C_MUX_IDLE_UNKNOWN (-3) > + > struct i2c_mux_core { > struct i2c_adapter *parent; > struct device *dev; > @@ -22,6 +26,18 @@ struct i2c_mux_core { > unsigned int arbitrator:1; > unsigned int gate:1; > > + /* > + * The mux state used by the driver when idle. > + * Possible idle states are: > + * - I2C_MUX_IDLE_AS_IS: Leave channels as is when idle > + * - I2C_MUX_IDLE_DISCONNECT: Disconnect channel (set HiZ when idle) > + * - I2C_MUX_IDLE_UNKNOWN: Unknown idle state > + * - <n>: Enable channel n (starting from 0) when idle" > + * > + * Default value is set to I2C_MUX_IDLE_UNKNOWN. > + */ > + int idle_state; > + > void *priv; > > int (*select)(struct i2c_mux_core *, u32 chan_id); > @@ -38,6 +54,20 @@ struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent, > int (*select)(struct i2c_mux_core *, u32), > int (*deselect)(struct i2c_mux_core *, u32)); > > +/* > + * Mux drivers may only change idle_state, and may only do so > + * between allocation and registration of the mux controller. This is simply not true. It is a limitation imposed by your series. The pca954x driver has a hook to change the idle state at runtime (the change takes effect the next time the mux is deselected). Cheers, Peter > + */ > +static inline void i2c_mux_set_idle_state(struct i2c_mux_core *muxc, int state) > +{ > + muxc->idle_state = state; > +} > + > +static inline int i2c_mux_idle_state(struct i2c_mux_core *muxc) > +{ > + return muxc->idle_state; > +} > + > /* flags for i2c_mux_alloc */ > #define I2C_MUX_LOCKED BIT(0) > #define I2C_MUX_ARBITRATOR BIT(1) >