[PATCH linux dev-6.12 v1 6/6] iio: si7020: Lock root adapter to wait for reset

Ninad Palsule
2025-09-02T18:33:20Z

Use the new mux root operations to lock the root adapter while waiting for
the reset to complete. I2C commands issued after the SI7020 is starting up
or after reset can potentially upset the startup sequence. Therefore, the
host needs to wait for the startup sequence to finish before issuing
further I2C commands.

OpenBMC-Staging-Count: 4
Signed-off-by: Eddie James <eajames@linux.ibm.com>
Link: https://lore.kernel.org/r/20220906202829.1921114-3-eajames@linux.ibm.com
Signed-off-by: Joel Stanley <joel@jms.id.au>
---
drivers/iio/humidity/si7020.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/humidity/si7020.c b/drivers/iio/humidity/si7020.c
index ff2dba50c0a5b..7f24d54beb8d0 100644
--- a/drivers/iio/humidity/si7020.c
+++ b/drivers/iio/humidity/si7020.c
@@ -228,6 +228,7 @@ static const struct iio_info si7020_info = {

static int si7020_probe(struct i2c_client *client)
{
+ struct i2c_adapter *root;
struct iio_dev *indio_dev;
struct si7020_data *data;
int ret;
@@ -237,13 +238,24 @@ static int si7020_probe(struct i2c_client *client)
I2C_FUNC_SMBUS_READ_WORD_DATA))
return -EOPNOTSUPP;

+ root = i2c_lock_select_bus(client->adapter);
+ if (IS_ERR(root))
+ return PTR_ERR(root);
+
/* Reset device, loads default settings. */
- ret = i2c_smbus_write_byte(client, SI7020CMD_RESET);
- if (ret < 0)
+ ret = __i2c_smbus_xfer(root, client->addr, client->flags,
+ I2C_SMBUS_WRITE, SI7020CMD_RESET,
+ I2C_SMBUS_BYTE, NULL);
+ if (ret < 0) {
+ i2c_unlock_deselect_bus(client->adapter);
return ret;
+ }
+
/* Wait the maximum power-up time after software reset. */
msleep(15);

+ i2c_unlock_deselect_bus(client->adapter);
+
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
if (!indio_dev)
return -ENOMEM;
--
2.48.1