On Fri, Feb 25, 2022 at 08:06:09AM PST, Marcello Sylvester Bauer wrote: >From: Patrick Rudolph <patrick.rudolph@xxxxxxxxxxxxx> > >On PMBUS devices with multiple pages, the regulator ops need to be >protected with the update mutex. This prevents accidentally changing >the page in a separate thread while operating on the PMBUS_OPERATION >register. > >Tested on Infineon xdpe11280 while a separate thread polls for sensor >data. > >Signed-off-by: Patrick Rudolph <patrick.rudolph@xxxxxxxxxxxxx> >Signed-off-by: Marcello Sylvester Bauer <sylv@xxxxxxx> >--- > drivers/hwmon/pmbus/pmbus_core.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > >diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c >index 776ee2237be2..f79930162256 100644 >--- a/drivers/hwmon/pmbus/pmbus_core.c >+++ b/drivers/hwmon/pmbus/pmbus_core.c >@@ -2386,10 +2386,14 @@ static int pmbus_regulator_is_enabled(struct regulator_dev *rdev) > { > struct device *dev = rdev_get_dev(rdev); > struct i2c_client *client = to_i2c_client(dev->parent); >+ struct pmbus_data *data = i2c_get_clientdata(client); > u8 page = rdev_get_id(rdev); > int ret; > >+ mutex_lock(&data->update_lock); > ret = pmbus_read_byte_data(client, page, PMBUS_OPERATION); >+ mutex_unlock(&data->update_lock); >+ > if (ret < 0) > return ret; > >@@ -2400,11 +2404,17 @@ static int _pmbus_regulator_on_off(struct regulator_dev *rdev, bool enable) > { > struct device *dev = rdev_get_dev(rdev); > struct i2c_client *client = to_i2c_client(dev->parent); >+ struct pmbus_data *data = i2c_get_clientdata(client); > u8 page = rdev_get_id(rdev); >+ int ret; > >- return pmbus_update_byte_data(client, page, PMBUS_OPERATION, >- PB_OPERATION_CONTROL_ON, >- enable ? PB_OPERATION_CONTROL_ON : 0); >+ mutex_lock(&data->update_lock); >+ ret = pmbus_update_byte_data(client, page, PMBUS_OPERATION, >+ PB_OPERATION_CONTROL_ON, >+ enable ? PB_OPERATION_CONTROL_ON : 0); >+ mutex_unlock(&data->update_lock); >+ >+ return ret; > } > > static int pmbus_regulator_enable(struct regulator_dev *rdev) >-- >2.35.1 > > Looks like this doesn't cover pmbus_regulator_get_error_flags(), which was added recently -- perhaps rebase onto hwmon-next? Zev