]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hwmon: (pmbus/adm1266) register the gpio_chip after pmbus_do_probe()
authorAbdurrahman Hussain <abdurrahman@nexthop.ai>
Tue, 19 May 2026 00:52:28 +0000 (17:52 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Thu, 21 May 2026 14:00:03 +0000 (07:00 -0700)
adm1266_probe() calls adm1266_config_gpio() -- which goes on to
devm_gpiochip_add_data() and exposes the gpio_chip callbacks to
gpiolib -- before pmbus_do_probe() has initialised the per-client
PMBus state (notably the pmbus_lock mutex the core hands out via
pmbus_get_data()).

That ordering is already a latent hazard: any GPIO access that lands
between adm1266_config_gpio() and the end of pmbus_do_probe() (for
example a sysfs read from a user space agent that opens the gpiochip
the instant gpiolib advertises it) races pmbus_do_probe()'s own
device accesses with no serialisation.

Move adm1266_config_gpio() down past pmbus_do_probe() so the chip
isn't reachable from userspace until the PMBus state it depends on
is fully initialised.

Fixes: d98dfad35c38 ("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-4-e425e4f88139@nexthop.ai
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/pmbus/adm1266.c

index 6f904a5a8ea6b3271fe24b6cc16449a4f30db697..c2ac5d228b7dc584959c8a01c703f02436db3dcb 100644 (file)
@@ -473,10 +473,6 @@ static int adm1266_probe(struct i2c_client *client)
        crc8_populate_msb(pmbus_crc_table, 0x7);
        mutex_init(&data->buf_mutex);
 
-       ret = adm1266_config_gpio(data);
-       if (ret < 0)
-               return ret;
-
        ret = adm1266_set_rtc(data);
        if (ret < 0)
                return ret;
@@ -489,6 +485,10 @@ static int adm1266_probe(struct i2c_client *client)
        if (ret)
                return ret;
 
+       ret = adm1266_config_gpio(data);
+       if (ret < 0)
+               return ret;
+
        adm1266_init_debugfs(data);
 
        return 0;