Commit 45b8ee71 authored by Bastien Curutchet's avatar Bastien Curutchet Committed by Andi Shyti
Browse files

i2c: mux: gpio: Add support for the 'settle-time-us' property



Some hardware need some time to switch from a bus to another. This can
cause the first transfers following the selection of a bus to fail.
There is no way to configure this kind of waiting time in the driver.

Add support for the 'settle-time-us' device-tree property. When set,
the i2c_mux_gpio_select() applies a delay before returning, leaving
enough time to the hardware to switch to the new bus.

Signed-off-by: default avatarBastien Curutchet <bastien.curutchet@bootlin.com>
Reviewed-by: default avatarAndi Shyti <andi.shyti@kernel.org>
Acked-by: default avatarPeter Rosin <peda@axentia.se>
Signed-off-by: default avatarAndi Shyti <andi.shyti@kernel.org>
parent a618d86d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
 */

#include <linux/bits.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/gpio/driver.h>
#include <linux/i2c.h>
@@ -37,6 +38,9 @@ static int i2c_mux_gpio_select(struct i2c_mux_core *muxc, u32 chan)

	i2c_mux_gpio_set(mux, chan);

	if (mux->data.settle_time)
		fsleep(mux->data.settle_time);

	return 0;
}

@@ -116,6 +120,8 @@ static int i2c_mux_gpio_probe_fw(struct gpiomux *mux,
	if (device_property_read_u32(dev, "idle-state", &mux->data.idle))
		mux->data.idle = I2C_MUX_GPIO_NO_IDLE;

	device_property_read_u32(dev, "settle-time-us", &mux->data.settle_time);

	return 0;
}

+2 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
 *	position
 * @n_values: Number of multiplexer positions (busses to instantiate)
 * @idle: Bitmask to write to MUX when idle or GPIO_I2CMUX_NO_IDLE if not used
 * @settle_time: Delay to wait when a new bus is selected
 */
struct i2c_mux_gpio_platform_data {
	int parent;
@@ -26,6 +27,7 @@ struct i2c_mux_gpio_platform_data {
	const unsigned *values;
	int n_values;
	unsigned idle;
	u32 settle_time;
};

#endif /* _LINUX_I2C_MUX_GPIO_H */