Skip to content

Commit bab8c6f

Browse files
abdurrahman-nexthopgroeck
authored andcommitted
hwmon: (pmbus/adm1266) serialize GPIO PMBus accesses with pmbus_lock
adm1266_gpio_get(), adm1266_gpio_get_multiple(), and adm1266_gpio_dbg_show() all issue PMBus reads against the device but none of them take pmbus_lock. The pmbus_core framework holds pmbus_lock around its own multi-transaction sequences (notably the "set PAGE, then read paged register" pattern used by hwmon attributes), so an unlocked GPIO accessor can land between a PAGE write and the subsequent paged read in another thread and corrupt either side's view of the device state machine. Take pmbus_lock at the top of each of the three accessors via the scope-based guard(). The lock is uncontended in the common case and adds only a single mutex round-trip per call. Fixes: d98dfad ("hwmon: (pmbus/adm1266) Add support for GPIOs") Cc: stable@vger.kernel.org Signed-off-by: Abdurrahman Hussain <abdurrahman@nexthop.ai> Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> Link: https://lore.kernel.org/r/20260518-adm1266-gpio-fixes-v3-6-e425e4f88139@nexthop.ai Signed-off-by: Guenter Roeck <linux@roeck-us.net>
1 parent 6af713a commit bab8c6f

1 file changed

Lines changed: 6 additions & 0 deletions

File tree

drivers/hwmon/pmbus/adm1266.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ static int adm1266_gpio_get(struct gpio_chip *chip, unsigned int offset)
173173
else
174174
pmbus_cmd = ADM1266_PDIO_STATUS;
175175

176+
guard(pmbus_lock)(data->client);
177+
176178
ret = i2c_smbus_read_block_data(data->client, pmbus_cmd, read_buf);
177179
if (ret < 0)
178180
return ret;
@@ -195,6 +197,8 @@ static int adm1266_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask
195197
unsigned int gpio_nr;
196198
int ret;
197199

200+
guard(pmbus_lock)(data->client);
201+
198202
ret = i2c_smbus_read_block_data(data->client, ADM1266_GPIO_STATUS, read_buf);
199203
if (ret < 0)
200204
return ret;
@@ -236,6 +240,8 @@ static void adm1266_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
236240
int ret;
237241
int i;
238242

243+
guard(pmbus_lock)(data->client);
244+
239245
for (i = 0; i < ADM1266_GPIO_NR; i++) {
240246
write_cmd = adm1266_gpio_mapping[i][1];
241247
ret = adm1266_pmbus_block_xfer(data, ADM1266_GPIO_CONFIG, 1, &write_cmd, read_buf);

0 commit comments

Comments
 (0)