On Fri, Feb 25, 2022 at 05:06:09PM +0100, 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> Good catch. Applied. Thanks, Guenter > --- > 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)