mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
hwmon: chipcap2: balance regulator state
The current implementation does not guarantee that the calls to
regulator_enable() and regulator_disable() are balanced.
regulator_is_enabled() might return a negative value, and an always-on
attribute in the DT might break the symmetry anyway.
Add a regulator_enabled flag to keep balance within this regulator
consumer.
Fixes: 3af350929e ("hwmon: Add support for Amphenol ChipCap 2")
Cc: stable@vger.kernel.org
Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Link: https://patch.msgid.link/20261014-chipcap2_locks-v3-8-27ebfc2c5b9e@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
parent
d1ce827a9c
commit
378add65fd
|
|
@ -91,6 +91,7 @@ struct cc2_data {
|
|||
int irq_low;
|
||||
int irq_high;
|
||||
bool process_irqs;
|
||||
bool regulator_enabled;
|
||||
};
|
||||
|
||||
/* %RH as a per cent mille from a register value */
|
||||
|
|
@ -120,7 +121,7 @@ static int cc2_enable(struct cc2_data *data)
|
|||
int ret;
|
||||
|
||||
/* exclusive regulator, check in case a disable failed */
|
||||
if (regulator_is_enabled(data->regulator)) {
|
||||
if (data->regulator_enabled) {
|
||||
data->process_irqs = true;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -132,6 +133,8 @@ static int cc2_enable(struct cc2_data *data)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
data->regulator_enabled = true;
|
||||
|
||||
usleep_range(CC2_STARTUP_TIME_US, CC2_STARTUP_TIME_US + 125);
|
||||
|
||||
data->process_irqs = true;
|
||||
|
|
@ -147,11 +150,16 @@ static void cc2_disable(struct cc2_data *data)
|
|||
data->process_irqs = false;
|
||||
|
||||
/* exclusive regulator, check in case an enable failed */
|
||||
if (regulator_is_enabled(data->regulator)) {
|
||||
err = regulator_disable(data->regulator);
|
||||
if (err)
|
||||
dev_dbg(&data->client->dev, "Failed to disable device");
|
||||
if (!data->regulator_enabled)
|
||||
return;
|
||||
|
||||
err = regulator_disable(data->regulator);
|
||||
if (err) {
|
||||
dev_dbg(&data->client->dev, "Failed to disable device");
|
||||
return;
|
||||
}
|
||||
|
||||
data->regulator_enabled = false;
|
||||
}
|
||||
|
||||
static void cc2_disable_action(void *data)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user