[PATCH v12 2/7] i2c: mux: add idle_state property to i2c_mux_core
Marcus Folkesson <[email protected]>
| Newsgroups | org.kernel.vger.linux-i2c,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
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. + */ +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) -- 2.54.0