* [PATCH 01/29] hwmon: (max127) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
@ 2025-10-17 13:01 ` Guenter Roeck
2025-10-17 13:01 ` [PATCH 02/29] hwmon: (lm95234) " Guenter Roeck
` (27 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:01 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/max127.c | 23 +++--------------------
1 file changed, 3 insertions(+), 20 deletions(-)
diff --git a/drivers/hwmon/max127.c b/drivers/hwmon/max127.c
index a9aab8862f5e..5102d86d2619 100644
--- a/drivers/hwmon/max127.c
+++ b/drivers/hwmon/max127.c
@@ -45,7 +45,6 @@
#define MAX127_SIGN_BIT BIT(11)
struct max127_data {
- struct mutex lock;
struct i2c_client *client;
u8 ctrl_byte[MAX127_NUM_CHANNELS];
};
@@ -121,21 +120,16 @@ static int max127_read_input(struct max127_data *data, int channel, long *val)
struct i2c_client *client = data->client;
u8 ctrl_byte = data->ctrl_byte[channel];
- mutex_lock(&data->lock);
-
status = max127_select_channel(client, ctrl_byte);
if (status)
- goto exit;
+ return status;
status = max127_read_channel(client, &raw);
if (status)
- goto exit;
+ return status;
*val = max127_process_raw(ctrl_byte, raw);
-
-exit:
- mutex_unlock(&data->lock);
- return status;
+ return 0;
}
static int max127_read_min(struct max127_data *data, int channel, long *val)
@@ -170,8 +164,6 @@ static int max127_write_min(struct max127_data *data, int channel, long val)
{
u8 ctrl;
- mutex_lock(&data->lock);
-
ctrl = data->ctrl_byte[channel];
if (val <= -MAX127_FULL_RANGE) {
ctrl |= (MAX127_CTRL_RNG | MAX127_CTRL_BIP);
@@ -182,23 +174,15 @@ static int max127_write_min(struct max127_data *data, int channel, long val)
ctrl &= ~MAX127_CTRL_BIP;
}
data->ctrl_byte[channel] = ctrl;
-
- mutex_unlock(&data->lock);
-
return 0;
}
static int max127_write_max(struct max127_data *data, int channel, long val)
{
- mutex_lock(&data->lock);
-
if (val >= MAX127_FULL_RANGE)
data->ctrl_byte[channel] |= MAX127_CTRL_RNG;
else
data->ctrl_byte[channel] &= ~MAX127_CTRL_RNG;
-
- mutex_unlock(&data->lock);
-
return 0;
}
@@ -315,7 +299,6 @@ static int max127_probe(struct i2c_client *client)
return -ENOMEM;
data->client = client;
- mutex_init(&data->lock);
for (i = 0; i < ARRAY_SIZE(data->ctrl_byte); i++)
data->ctrl_byte[i] = (MAX127_CTRL_START |
MAX127_SET_CHANNEL(i));
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 02/29] hwmon: (lm95234) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
2025-10-17 13:01 ` [PATCH 01/29] hwmon: (max127) Rely on subsystem locking Guenter Roeck
@ 2025-10-17 13:01 ` Guenter Roeck
2025-10-17 13:01 ` [PATCH 03/29] hwmon: (lm92) " Guenter Roeck
` (26 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:01 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/lm95234.c | 12 ++----------
1 file changed, 2 insertions(+), 10 deletions(-)
diff --git a/drivers/hwmon/lm95234.c b/drivers/hwmon/lm95234.c
index 7da6c8f07332..387b3ba81dbf 100644
--- a/drivers/hwmon/lm95234.c
+++ b/drivers/hwmon/lm95234.c
@@ -14,7 +14,6 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
-#include <linux/mutex.h>
#include <linux/regmap.h>
#include <linux/util_macros.h>
@@ -54,7 +53,6 @@ static const unsigned short normal_i2c[] = {
/* Client data (each client gets its own) */
struct lm95234_data {
struct regmap *regmap;
- struct mutex update_lock;
enum chips type;
};
@@ -107,19 +105,14 @@ static ssize_t lm95234_hyst_set(struct lm95234_data *data, long val)
u32 tcrit;
int ret;
- mutex_lock(&data->update_lock);
-
ret = regmap_read(data->regmap, LM95234_REG_TCRIT1(0), &tcrit);
if (ret)
- goto unlock;
+ return ret;
val = DIV_ROUND_CLOSEST(clamp_val(val, -255000, 255000), 1000);
val = clamp_val((int)tcrit - val, 0, 31);
- ret = regmap_write(data->regmap, LM95234_REG_TCRIT_HYST, val);
-unlock:
- mutex_unlock(&data->update_lock);
- return ret;
+ return regmap_write(data->regmap, LM95234_REG_TCRIT_HYST, val);
}
static int lm95234_crit_reg(int channel)
@@ -526,7 +519,6 @@ static int lm95234_probe(struct i2c_client *client)
return PTR_ERR(regmap);
data->regmap = regmap;
- mutex_init(&data->update_lock);
/* Initialize the LM95234 chip */
err = lm95234_init_client(dev, regmap);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 03/29] hwmon: (lm92) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
2025-10-17 13:01 ` [PATCH 01/29] hwmon: (max127) Rely on subsystem locking Guenter Roeck
2025-10-17 13:01 ` [PATCH 02/29] hwmon: (lm95234) " Guenter Roeck
@ 2025-10-17 13:01 ` Guenter Roeck
2025-10-17 13:01 ` [PATCH 04/29] hwmon: (hs3001) " Guenter Roeck
` (25 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:01 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/lm92.c | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/drivers/hwmon/lm92.c b/drivers/hwmon/lm92.c
index 0be439b38ee1..91a6b7525bb6 100644
--- a/drivers/hwmon/lm92.c
+++ b/drivers/hwmon/lm92.c
@@ -32,7 +32,6 @@
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/regmap.h>
#include <linux/slab.h>
@@ -78,7 +77,6 @@ static inline u8 ALARMS_FROM_REG(s16 reg)
/* Client data (each client gets its own) */
struct lm92_data {
struct regmap *regmap;
- struct mutex update_lock;
int resolution;
};
@@ -199,15 +197,11 @@ static int lm92_temp_write(struct lm92_data *data, u32 attr, long val)
break;
case hwmon_temp_crit_hyst:
val = clamp_val(val, -120000, 220000);
- mutex_lock(&data->update_lock);
err = regmap_read(regmap, LM92_REG_TEMP_CRIT, &temp);
if (err)
- goto unlock;
+ return err;
val = TEMP_TO_REG(TEMP_FROM_REG(temp) - val, data->resolution);
- err = regmap_write(regmap, LM92_REG_TEMP_HYST, val);
-unlock:
- mutex_unlock(&data->update_lock);
- return err;
+ return regmap_write(regmap, LM92_REG_TEMP_HYST, val);
default:
return -EOPNOTSUPP;
}
@@ -396,7 +390,6 @@ static int lm92_probe(struct i2c_client *client)
data->regmap = regmap;
data->resolution = (unsigned long)i2c_get_match_data(client);
- mutex_init(&data->update_lock);
/* Initialize the chipset */
err = lm92_init_client(regmap);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 04/29] hwmon: (hs3001) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (2 preceding siblings ...)
2025-10-17 13:01 ` [PATCH 03/29] hwmon: (lm92) " Guenter Roeck
@ 2025-10-17 13:01 ` Guenter Roeck
2025-10-17 13:01 ` [PATCH 05/29] hwmon: (sbtsi_temp) " Guenter Roeck
` (24 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:01 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/hs3001.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/drivers/hwmon/hs3001.c b/drivers/hwmon/hs3001.c
index 24ed3fb9a43a..50c6c15f8b18 100644
--- a/drivers/hwmon/hs3001.c
+++ b/drivers/hwmon/hs3001.c
@@ -42,7 +42,6 @@
struct hs3001_data {
struct i2c_client *client;
- struct mutex i2c_lock; /* lock for sending i2c commands */
u32 wait_time; /* in us */
int temperature; /* in milli degree */
u32 humidity; /* in milli % */
@@ -112,12 +111,9 @@ static int hs3001_read(struct device *dev, enum hwmon_sensor_types type,
struct i2c_client *client = data->client;
int ret;
- mutex_lock(&data->i2c_lock);
ret = i2c_master_send(client, NULL, 0);
- if (ret < 0) {
- mutex_unlock(&data->i2c_lock);
+ if (ret < 0)
return ret;
- }
/*
* Sensor needs some time to process measurement depending on
@@ -126,8 +122,6 @@ static int hs3001_read(struct device *dev, enum hwmon_sensor_types type,
fsleep(data->wait_time);
ret = hs3001_data_fetch_command(client, data);
- mutex_unlock(&data->i2c_lock);
-
if (ret < 0)
return ret;
@@ -211,8 +205,6 @@ static int hs3001_probe(struct i2c_client *client)
data->wait_time = (HS3001_WAKEUP_TIME + HS3001_14BIT_RESOLUTION +
HS3001_14BIT_RESOLUTION);
- mutex_init(&data->i2c_lock);
-
hwmon_dev = devm_hwmon_device_register_with_info(dev,
client->name,
data,
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 05/29] hwmon: (sbtsi_temp) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (3 preceding siblings ...)
2025-10-17 13:01 ` [PATCH 04/29] hwmon: (hs3001) " Guenter Roeck
@ 2025-10-17 13:01 ` Guenter Roeck
2025-10-17 13:01 ` [PATCH 06/29] hwmon: (ina2xx) " Guenter Roeck
` (23 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:01 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/sbtsi_temp.c | 17 ++---------------
1 file changed, 2 insertions(+), 15 deletions(-)
diff --git a/drivers/hwmon/sbtsi_temp.c b/drivers/hwmon/sbtsi_temp.c
index a6c439e376ff..c5b2488c4c7f 100644
--- a/drivers/hwmon/sbtsi_temp.c
+++ b/drivers/hwmon/sbtsi_temp.c
@@ -12,7 +12,6 @@
#include <linux/init.h>
#include <linux/hwmon.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/bitfield.h>
@@ -52,7 +51,6 @@
/* Each client has this additional data */
struct sbtsi_data {
struct i2c_client *client;
- struct mutex lock;
bool ext_range_mode;
bool read_order;
};
@@ -94,7 +92,6 @@ static int sbtsi_read(struct device *dev, enum hwmon_sensor_types type,
switch (attr) {
case hwmon_temp_input:
- mutex_lock(&data->lock);
if (data->read_order) {
temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_DEC);
temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_INT);
@@ -102,19 +99,14 @@ static int sbtsi_read(struct device *dev, enum hwmon_sensor_types type,
temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_INT);
temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_DEC);
}
- mutex_unlock(&data->lock);
break;
case hwmon_temp_max:
- mutex_lock(&data->lock);
temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_HIGH_INT);
temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_HIGH_DEC);
- mutex_unlock(&data->lock);
break;
case hwmon_temp_min:
- mutex_lock(&data->lock);
temp_int = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_LOW_INT);
temp_dec = i2c_smbus_read_byte_data(data->client, SBTSI_REG_TEMP_LOW_DEC);
- mutex_unlock(&data->lock);
break;
default:
return -EINVAL;
@@ -158,15 +150,11 @@ static int sbtsi_write(struct device *dev, enum hwmon_sensor_types type,
val = clamp_val(val, SBTSI_TEMP_MIN, SBTSI_TEMP_MAX);
sbtsi_mc_to_reg(val, &temp_int, &temp_dec);
- mutex_lock(&data->lock);
err = i2c_smbus_write_byte_data(data->client, reg_int, temp_int);
if (err)
- goto exit;
+ return err;
- err = i2c_smbus_write_byte_data(data->client, reg_dec, temp_dec);
-exit:
- mutex_unlock(&data->lock);
- return err;
+ return i2c_smbus_write_byte_data(data->client, reg_dec, temp_dec);
}
static umode_t sbtsi_is_visible(const void *data,
@@ -219,7 +207,6 @@ static int sbtsi_probe(struct i2c_client *client)
return -ENOMEM;
data->client = client;
- mutex_init(&data->lock);
err = i2c_smbus_read_byte_data(data->client, SBTSI_REG_CONFIG);
if (err < 0)
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 06/29] hwmon: (ina2xx) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (4 preceding siblings ...)
2025-10-17 13:01 ` [PATCH 05/29] hwmon: (sbtsi_temp) " Guenter Roeck
@ 2025-10-17 13:01 ` Guenter Roeck
2025-10-17 13:01 ` [PATCH 07/29] hwmon: (sht4x) " Guenter Roeck
` (22 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:01 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/ina2xx.c | 28 ++++++++++------------------
1 file changed, 10 insertions(+), 18 deletions(-)
diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c
index bc3c1f7314b3..69ac0468dee4 100644
--- a/drivers/hwmon/ina2xx.c
+++ b/drivers/hwmon/ina2xx.c
@@ -156,7 +156,6 @@ struct ina2xx_data {
long rshunt;
long current_lsb_uA;
long power_lsb_uW;
- struct mutex config_lock;
struct regmap *regmap;
struct i2c_client *client;
};
@@ -390,22 +389,19 @@ static int ina226_alert_limit_read(struct ina2xx_data *data, u32 mask, int reg,
int regval;
int ret;
- mutex_lock(&data->config_lock);
ret = regmap_read(regmap, INA226_MASK_ENABLE, ®val);
if (ret)
- goto abort;
+ return ret;
if (regval & mask) {
ret = regmap_read(regmap, INA226_ALERT_LIMIT, ®val);
if (ret)
- goto abort;
+ return ret;
*val = ina2xx_get_value(data, reg, regval);
} else {
*val = 0;
}
-abort:
- mutex_unlock(&data->config_lock);
- return ret;
+ return 0;
}
static int ina226_alert_limit_write(struct ina2xx_data *data, u32 mask, int reg, long val)
@@ -421,23 +417,20 @@ static int ina226_alert_limit_write(struct ina2xx_data *data, u32 mask, int reg,
* due to register write sequence. Then, only enable the alert
* if the value is non-zero.
*/
- mutex_lock(&data->config_lock);
ret = regmap_update_bits(regmap, INA226_MASK_ENABLE,
INA226_ALERT_CONFIG_MASK, 0);
if (ret < 0)
- goto abort;
+ return ret;
ret = regmap_write(regmap, INA226_ALERT_LIMIT,
ina226_alert_to_reg(data, reg, val));
if (ret < 0)
- goto abort;
+ return ret;
if (val)
- ret = regmap_update_bits(regmap, INA226_MASK_ENABLE,
- INA226_ALERT_CONFIG_MASK, mask);
-abort:
- mutex_unlock(&data->config_lock);
- return ret;
+ return regmap_update_bits(regmap, INA226_MASK_ENABLE,
+ INA226_ALERT_CONFIG_MASK, mask);
+ return 0;
}
static int ina2xx_chip_read(struct device *dev, u32 attr, long *val)
@@ -859,9 +852,9 @@ static ssize_t shunt_resistor_store(struct device *dev,
if (status < 0)
return status;
- mutex_lock(&data->config_lock);
+ hwmon_lock(dev);
status = ina2xx_set_shunt(data, val);
- mutex_unlock(&data->config_lock);
+ hwmon_unlock(dev);
if (status < 0)
return status;
return count;
@@ -951,7 +944,6 @@ static int ina2xx_probe(struct i2c_client *client)
data->client = client;
data->config = &ina2xx_config[chip];
data->chip = chip;
- mutex_init(&data->config_lock);
data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config);
if (IS_ERR(data->regmap)) {
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 07/29] hwmon: (sht4x) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (5 preceding siblings ...)
2025-10-17 13:01 ` [PATCH 06/29] hwmon: (ina2xx) " Guenter Roeck
@ 2025-10-17 13:01 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 08/29] hwmon: (ina3221) " Guenter Roeck
` (21 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:01 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/sht4x.c | 40 +++++++++++-----------------------------
1 file changed, 11 insertions(+), 29 deletions(-)
diff --git a/drivers/hwmon/sht4x.c b/drivers/hwmon/sht4x.c
index 6c9b776237c2..5abe1227e109 100644
--- a/drivers/hwmon/sht4x.c
+++ b/drivers/hwmon/sht4x.c
@@ -55,7 +55,6 @@ DECLARE_CRC8_TABLE(sht4x_crc8_table);
/**
* struct sht4x_data - All the data required to operate an SHT4X chip
* @client: the i2c client associated with the SHT4X
- * @lock: a mutex that is used to prevent parallel access to the i2c client
* @heating_complete: the time that the last heating finished
* @data_pending: true if and only if there are measurements to retrieve after heating
* @heater_power: the power at which the heater will be started
@@ -68,7 +67,6 @@ DECLARE_CRC8_TABLE(sht4x_crc8_table);
*/
struct sht4x_data {
struct i2c_client *client;
- struct mutex lock; /* atomic read data updates */
unsigned long heating_complete; /* in jiffies */
bool data_pending;
u32 heater_power; /* in milli-watts */
@@ -87,7 +85,7 @@ struct sht4x_data {
*/
static int sht4x_read_values(struct sht4x_data *data)
{
- int ret = 0;
+ int ret;
u16 t_ticks, rh_ticks;
unsigned long next_update;
struct i2c_client *client = data->client;
@@ -96,8 +94,6 @@ static int sht4x_read_values(struct sht4x_data *data)
u8 raw_data[SHT4X_RESPONSE_LENGTH];
unsigned long curr_jiffies;
- mutex_lock(&data->lock);
-
curr_jiffies = jiffies;
if (time_before(curr_jiffies, data->heating_complete))
msleep(jiffies_to_msecs(data->heating_complete - curr_jiffies));
@@ -110,11 +106,11 @@ static int sht4x_read_values(struct sht4x_data *data)
msecs_to_jiffies(data->update_interval);
if (data->valid && time_before_eq(jiffies, next_update))
- goto unlock;
+ return 0;
ret = i2c_master_send(client, cmd, SHT4X_CMD_LEN);
if (ret < 0)
- goto unlock;
+ return ret;
usleep_range(SHT4X_MEAS_DELAY_HPM, SHT4X_MEAS_DELAY_HPM + SHT4X_DELAY_EXTRA);
}
@@ -123,7 +119,7 @@ static int sht4x_read_values(struct sht4x_data *data)
if (ret != SHT4X_RESPONSE_LENGTH) {
if (ret >= 0)
ret = -ENODATA;
- goto unlock;
+ return ret;
}
t_ticks = raw_data[0] << 8 | raw_data[1];
@@ -132,26 +128,20 @@ static int sht4x_read_values(struct sht4x_data *data)
crc = crc8(sht4x_crc8_table, &raw_data[0], SHT4X_WORD_LEN, CRC8_INIT_VALUE);
if (crc != raw_data[2]) {
dev_err(&client->dev, "data integrity check failed\n");
- ret = -EIO;
- goto unlock;
+ return -EIO;
}
crc = crc8(sht4x_crc8_table, &raw_data[3], SHT4X_WORD_LEN, CRC8_INIT_VALUE);
if (crc != raw_data[5]) {
dev_err(&client->dev, "data integrity check failed\n");
- ret = -EIO;
- goto unlock;
+ return -EIO;
}
data->temperature = ((21875 * (int32_t)t_ticks) >> 13) - 45000;
data->humidity = ((15625 * (int32_t)rh_ticks) >> 13) - 6000;
data->last_updated = jiffies;
data->valid = true;
- ret = 0;
-
-unlock:
- mutex_unlock(&data->lock);
- return ret;
+ return 0;
}
static ssize_t sht4x_interval_write(struct sht4x_data *data, long val)
@@ -287,22 +277,16 @@ static ssize_t heater_enable_store(struct device *dev,
heating_time_bound = 1100;
}
- mutex_lock(&data->lock);
-
- if (time_before(jiffies, data->heating_complete)) {
- ret = -EBUSY;
- goto unlock;
- }
+ if (time_before(jiffies, data->heating_complete))
+ return -EBUSY;
ret = i2c_master_send(data->client, &cmd, SHT4X_CMD_LEN);
if (ret < 0)
- goto unlock;
+ return ret;
data->heating_complete = jiffies + msecs_to_jiffies(heating_time_bound);
data->data_pending = true;
-unlock:
- mutex_unlock(&data->lock);
- return ret;
+ return 0;
}
static ssize_t heater_power_show(struct device *dev,
@@ -422,8 +406,6 @@ static int sht4x_probe(struct i2c_client *client)
data->heater_time = 1000;
data->heating_complete = jiffies;
- mutex_init(&data->lock);
-
crc8_populate_msb(sht4x_crc8_table, SHT4X_CRC8_POLYNOMIAL);
ret = i2c_master_send(client, cmd, SHT4X_CMD_LEN);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 08/29] hwmon: (ina3221) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (6 preceding siblings ...)
2025-10-17 13:01 ` [PATCH 07/29] hwmon: (sht4x) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 09/29] hwmon: (k10temp) " Guenter Roeck
` (20 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/ina3221.c | 19 -------------------
1 file changed, 19 deletions(-)
diff --git a/drivers/hwmon/ina3221.c b/drivers/hwmon/ina3221.c
index ce0e3f214f5b..5ecc68dcf169 100644
--- a/drivers/hwmon/ina3221.c
+++ b/drivers/hwmon/ina3221.c
@@ -11,7 +11,6 @@
#include <linux/hwmon-sysfs.h>
#include <linux/i2c.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/pm_runtime.h>
#include <linux/regmap.h>
@@ -115,7 +114,6 @@ struct ina3221_input {
* @regmap: Register map of the device
* @fields: Register fields of the device
* @inputs: Array of channel input source specific structures
- * @lock: mutex lock to serialize sysfs attribute accesses
* @reg_config: Register value of INA3221_CONFIG
* @summation_shunt_resistor: equivalent shunt resistor value for summation
* @summation_channel_control: Value written to SCC field in INA3221_MASK_ENABLE
@@ -126,7 +124,6 @@ struct ina3221_data {
struct regmap *regmap;
struct regmap_field *fields[F_MAX_FIELDS];
struct ina3221_input inputs[INA3221_NUM_CHANNELS];
- struct mutex lock;
u32 reg_config;
int summation_shunt_resistor;
u32 summation_channel_control;
@@ -530,11 +527,8 @@ static int ina3221_write_enable(struct device *dev, int channel, bool enable)
static int ina3221_read(struct device *dev, enum hwmon_sensor_types type,
u32 attr, int channel, long *val)
{
- struct ina3221_data *ina = dev_get_drvdata(dev);
int ret;
- mutex_lock(&ina->lock);
-
switch (type) {
case hwmon_chip:
ret = ina3221_read_chip(dev, attr, val);
@@ -550,20 +544,14 @@ static int ina3221_read(struct device *dev, enum hwmon_sensor_types type,
ret = -EOPNOTSUPP;
break;
}
-
- mutex_unlock(&ina->lock);
-
return ret;
}
static int ina3221_write(struct device *dev, enum hwmon_sensor_types type,
u32 attr, int channel, long val)
{
- struct ina3221_data *ina = dev_get_drvdata(dev);
int ret;
- mutex_lock(&ina->lock);
-
switch (type) {
case hwmon_chip:
ret = ina3221_write_chip(dev, attr, val);
@@ -579,9 +567,6 @@ static int ina3221_write(struct device *dev, enum hwmon_sensor_types type,
ret = -EOPNOTSUPP;
break;
}
-
- mutex_unlock(&ina->lock);
-
return ret;
}
@@ -886,7 +871,6 @@ static int ina3221_probe(struct i2c_client *client)
}
ina->pm_dev = dev;
- mutex_init(&ina->lock);
dev_set_drvdata(dev, ina);
/* Enable PM runtime -- status is suspended by default */
@@ -925,7 +909,6 @@ static int ina3221_probe(struct i2c_client *client)
/* pm_runtime_put_noidle() will decrease the PM refcount until 0 */
for (i = 0; i < INA3221_NUM_CHANNELS; i++)
pm_runtime_put_noidle(ina->pm_dev);
- mutex_destroy(&ina->lock);
return ret;
}
@@ -941,8 +924,6 @@ static void ina3221_remove(struct i2c_client *client)
/* pm_runtime_put_noidle() will decrease the PM refcount until 0 */
for (i = 0; i < INA3221_NUM_CHANNELS; i++)
pm_runtime_put_noidle(ina->pm_dev);
-
- mutex_destroy(&ina->lock);
}
static int ina3221_suspend(struct device *dev)
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 09/29] hwmon: (k10temp) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (7 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 08/29] hwmon: (ina3221) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 10/29] hwmon: (mr75203) Drop unnecessary include file Guenter Roeck
` (19 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/k10temp.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
index b98d5ec72c4f..7fc1d97a9971 100644
--- a/drivers/hwmon/k10temp.c
+++ b/drivers/hwmon/k10temp.c
@@ -31,9 +31,6 @@ static bool force;
module_param(force, bool, 0444);
MODULE_PARM_DESC(force, "force loading on processors with erratum 319");
-/* Provide lock for writing to NB_SMU_IND_ADDR */
-static DEFINE_MUTEX(nb_smu_ind_mutex);
-
#ifndef PCI_DEVICE_ID_AMD_15H_M70H_NB_F3
#define PCI_DEVICE_ID_AMD_15H_M70H_NB_F3 0x15b3
#endif
@@ -137,12 +134,10 @@ static void read_tempreg_pci(struct pci_dev *pdev, u32 *regval)
static void amd_nb_index_read(struct pci_dev *pdev, unsigned int devfn,
unsigned int base, int offset, u32 *val)
{
- mutex_lock(&nb_smu_ind_mutex);
pci_bus_write_config_dword(pdev->bus, devfn,
base, offset);
pci_bus_read_config_dword(pdev->bus, devfn,
base + 4, val);
- mutex_unlock(&nb_smu_ind_mutex);
}
static void read_htcreg_nb_f15(struct pci_dev *pdev, u32 *regval)
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 10/29] hwmon: (mr75203) Drop unnecessary include file
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (8 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 09/29] hwmon: (k10temp) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 11/29] hwmon: (powr1220) Rely on subsystem locking Guenter Roeck
` (18 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
The driver does not perform any locking and thus does not need to
include mutex.h. Drop the unnecessary include file.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/mr75203.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/hwmon/mr75203.c b/drivers/hwmon/mr75203.c
index 7848198f8996..32c1e42e1278 100644
--- a/drivers/hwmon/mr75203.c
+++ b/drivers/hwmon/mr75203.c
@@ -14,7 +14,6 @@
#include <linux/kstrtox.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
-#include <linux/mutex.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/regmap.h>
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 11/29] hwmon: (powr1220) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (9 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 10/29] hwmon: (mr75203) Drop unnecessary include file Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 12/29] hwmon: (ftsteutates) " Guenter Roeck
` (17 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/powr1220.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/drivers/hwmon/powr1220.c b/drivers/hwmon/powr1220.c
index 5f9ca6543530..06a2c56016d1 100644
--- a/drivers/hwmon/powr1220.c
+++ b/drivers/hwmon/powr1220.c
@@ -16,7 +16,6 @@
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#include <linux/err.h>
-#include <linux/mutex.h>
#include <linux/delay.h>
#define ADC_STEP_MV 2
@@ -75,7 +74,6 @@ enum powr1220_adc_values {
struct powr1220_data {
struct i2c_client *client;
- struct mutex update_lock;
u8 max_channels;
bool adc_valid[MAX_POWR1220_ADC_VALUES];
/* the next value is in jiffies */
@@ -111,8 +109,6 @@ static int powr1220_read_adc(struct device *dev, int ch_num)
int result;
int adc_range = 0;
- mutex_lock(&data->update_lock);
-
if (time_after(jiffies, data->adc_last_updated[ch_num] + HZ) ||
!data->adc_valid[ch_num]) {
/*
@@ -128,8 +124,8 @@ static int powr1220_read_adc(struct device *dev, int ch_num)
/* set the attenuator and mux */
result = i2c_smbus_write_byte_data(data->client, ADC_MUX,
adc_range | ch_num);
- if (result)
- goto exit;
+ if (result < 0)
+ return result;
/*
* wait at least Tconvert time (200 us) for the
@@ -140,14 +136,14 @@ static int powr1220_read_adc(struct device *dev, int ch_num)
/* get the ADC reading */
result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_LOW);
if (result < 0)
- goto exit;
+ return result;
reading = result >> 4;
/* get the upper half of the reading */
result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_HIGH);
if (result < 0)
- goto exit;
+ return result;
reading |= result << 4;
@@ -163,10 +159,6 @@ static int powr1220_read_adc(struct device *dev, int ch_num)
} else {
result = data->adc_values[ch_num];
}
-
-exit:
- mutex_unlock(&data->update_lock);
-
return result;
}
@@ -302,7 +294,6 @@ static int powr1220_probe(struct i2c_client *client)
break;
}
- mutex_init(&data->update_lock);
data->client = client;
hwmon_dev = devm_hwmon_device_register_with_info(&client->dev,
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 12/29] hwmon: (ftsteutates) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (10 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 11/29] hwmon: (powr1220) Rely on subsystem locking Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 13/29] hwmon: (ina238) " Guenter Roeck
` (16 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/ftsteutates.c | 84 +++++++++++--------------------------
1 file changed, 25 insertions(+), 59 deletions(-)
diff --git a/drivers/hwmon/ftsteutates.c b/drivers/hwmon/ftsteutates.c
index 8aeec16a7a90..08dcc6a7fb62 100644
--- a/drivers/hwmon/ftsteutates.c
+++ b/drivers/hwmon/ftsteutates.c
@@ -12,7 +12,6 @@
#include <linux/jiffies.h>
#include <linux/math.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/watchdog.h>
@@ -62,10 +61,6 @@ enum WATCHDOG_RESOLUTION {
struct fts_data {
struct i2c_client *client;
- /* update sensor data lock */
- struct mutex update_lock;
- /* read/write register lock */
- struct mutex access_lock;
unsigned long last_updated; /* in jiffies */
struct watchdog_device wdd;
enum WATCHDOG_RESOLUTION resolution;
@@ -98,21 +93,15 @@ static int fts_read_byte(struct i2c_client *client, unsigned short reg)
{
int ret;
unsigned char page = reg >> 8;
- struct fts_data *data = dev_get_drvdata(&client->dev);
-
- mutex_lock(&data->access_lock);
dev_dbg(&client->dev, "page select - page: 0x%.02x\n", page);
ret = i2c_smbus_write_byte_data(client, FTS_PAGE_SELECT_REG, page);
if (ret < 0)
- goto error;
+ return ret;
reg &= 0xFF;
ret = i2c_smbus_read_byte_data(client, reg);
dev_dbg(&client->dev, "read - reg: 0x%.02x: val: 0x%.02x\n", reg, ret);
-
-error:
- mutex_unlock(&data->access_lock);
return ret;
}
@@ -121,22 +110,16 @@ static int fts_write_byte(struct i2c_client *client, unsigned short reg,
{
int ret;
unsigned char page = reg >> 8;
- struct fts_data *data = dev_get_drvdata(&client->dev);
-
- mutex_lock(&data->access_lock);
dev_dbg(&client->dev, "page select - page: 0x%.02x\n", page);
ret = i2c_smbus_write_byte_data(client, FTS_PAGE_SELECT_REG, page);
if (ret < 0)
- goto error;
+ return ret;
reg &= 0xFF;
dev_dbg(&client->dev,
"write - reg: 0x%.02x: val: 0x%.02x\n", reg, value);
ret = i2c_smbus_write_byte_data(client, reg, value);
-
-error:
- mutex_unlock(&data->access_lock);
return ret;
}
@@ -145,44 +128,40 @@ static int fts_write_byte(struct i2c_client *client, unsigned short reg,
/*****************************************************************************/
static int fts_update_device(struct fts_data *data)
{
- int i;
- int err = 0;
+ int i, err;
- mutex_lock(&data->update_lock);
if (!time_after(jiffies, data->last_updated + 2 * HZ) && data->valid)
- goto exit;
+ return 0;
err = fts_read_byte(data->client, FTS_DEVICE_STATUS_REG);
if (err < 0)
- goto exit;
+ return err;
data->valid = !!(err & 0x02); /* Data not ready yet */
- if (unlikely(!data->valid)) {
- err = -EAGAIN;
- goto exit;
- }
+ if (unlikely(!data->valid))
+ return -EAGAIN;
err = fts_read_byte(data->client, FTS_FAN_PRESENT_REG);
if (err < 0)
- goto exit;
+ return err;
data->fan_present = err;
err = fts_read_byte(data->client, FTS_FAN_EVENT_REG);
if (err < 0)
- goto exit;
+ return err;
data->fan_alarm = err;
for (i = 0; i < FTS_NO_FAN_SENSORS; i++) {
if (data->fan_present & BIT(i)) {
err = fts_read_byte(data->client, FTS_REG_FAN_INPUT(i));
if (err < 0)
- goto exit;
+ return err;
data->fan_input[i] = err;
err = fts_read_byte(data->client,
FTS_REG_FAN_SOURCE(i));
if (err < 0)
- goto exit;
+ return err;
data->fan_source[i] = err;
} else {
data->fan_input[i] = 0;
@@ -192,27 +171,24 @@ static int fts_update_device(struct fts_data *data)
err = fts_read_byte(data->client, FTS_SENSOR_EVENT_REG);
if (err < 0)
- goto exit;
+ return err;
data->temp_alarm = err;
for (i = 0; i < FTS_NO_TEMP_SENSORS; i++) {
err = fts_read_byte(data->client, FTS_REG_TEMP_INPUT(i));
if (err < 0)
- goto exit;
+ return err;
data->temp_input[i] = err;
}
for (i = 0; i < FTS_NO_VOLT_SENSORS; i++) {
err = fts_read_byte(data->client, FTS_REG_VOLT(i));
if (err < 0)
- goto exit;
+ return err;
data->volt[i] = err;
}
data->last_updated = jiffies;
- err = 0;
-exit:
- mutex_unlock(&data->update_lock);
- return err;
+ return 0;
}
/*****************************************************************************/
@@ -470,18 +446,14 @@ static int fts_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
if (val)
return -EINVAL;
- mutex_lock(&data->update_lock);
ret = fts_read_byte(data->client, FTS_REG_TEMP_CONTROL(channel));
- if (ret >= 0)
- ret = fts_write_byte(data->client, FTS_REG_TEMP_CONTROL(channel),
- ret | 0x1);
- if (ret >= 0)
- data->valid = false;
-
- mutex_unlock(&data->update_lock);
if (ret < 0)
return ret;
-
+ ret = fts_write_byte(data->client, FTS_REG_TEMP_CONTROL(channel),
+ ret | 0x1);
+ if (ret < 0)
+ return ret;
+ data->valid = false;
return 0;
default:
break;
@@ -493,18 +465,14 @@ static int fts_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
if (val)
return -EINVAL;
- mutex_lock(&data->update_lock);
ret = fts_read_byte(data->client, FTS_REG_FAN_CONTROL(channel));
- if (ret >= 0)
- ret = fts_write_byte(data->client, FTS_REG_FAN_CONTROL(channel),
- ret | 0x1);
- if (ret >= 0)
- data->valid = false;
-
- mutex_unlock(&data->update_lock);
if (ret < 0)
return ret;
-
+ ret = fts_write_byte(data->client, FTS_REG_FAN_CONTROL(channel),
+ ret | 0x1);
+ if (ret < 0)
+ return ret;
+ data->valid = false;
return 0;
default:
break;
@@ -648,8 +616,6 @@ static int fts_probe(struct i2c_client *client)
if (!data)
return -ENOMEM;
- mutex_init(&data->update_lock);
- mutex_init(&data->access_lock);
data->client = client;
dev_set_drvdata(&client->dev, data);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 13/29] hwmon: (ina238) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (11 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 12/29] hwmon: (ftsteutates) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 14/29] hwmon: (lm95241) " Guenter Roeck
` (15 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/ina238.c | 26 +++++---------------------
1 file changed, 5 insertions(+), 21 deletions(-)
diff --git a/drivers/hwmon/ina238.c b/drivers/hwmon/ina238.c
index 356d19b7675c..ff67b03189f7 100644
--- a/drivers/hwmon/ina238.c
+++ b/drivers/hwmon/ina238.c
@@ -117,7 +117,6 @@ struct ina238_config {
struct ina238_data {
const struct ina238_config *config;
struct i2c_client *client;
- struct mutex config_lock;
struct regmap *regmap;
u32 rshunt;
int gain;
@@ -607,31 +606,18 @@ static int ina238_read(struct device *dev, enum hwmon_sensor_types type,
static int ina238_write(struct device *dev, enum hwmon_sensor_types type,
u32 attr, int channel, long val)
{
- struct ina238_data *data = dev_get_drvdata(dev);
- int err;
-
- mutex_lock(&data->config_lock);
-
switch (type) {
case hwmon_in:
- err = ina238_write_in(dev, attr, channel, val);
- break;
+ return ina238_write_in(dev, attr, channel, val);
case hwmon_curr:
- err = ina238_write_curr(dev, attr, val);
- break;
+ return ina238_write_curr(dev, attr, val);
case hwmon_power:
- err = ina238_write_power_max(dev, val);
- break;
+ return ina238_write_power_max(dev, val);
case hwmon_temp:
- err = ina238_write_temp_max(dev, val);
- break;
+ return ina238_write_temp_max(dev, val);
default:
- err = -EOPNOTSUPP;
- break;
+ return -EOPNOTSUPP;
}
-
- mutex_unlock(&data->config_lock);
- return err;
}
static umode_t ina238_is_visible(const void *drvdata,
@@ -757,8 +743,6 @@ static int ina238_probe(struct i2c_client *client)
/* set the device type */
data->config = &ina238_config[chip];
- mutex_init(&data->config_lock);
-
data->regmap = devm_regmap_init_i2c(client, &ina238_regmap_config);
if (IS_ERR(data->regmap)) {
dev_err(dev, "failed to allocate register map\n");
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 14/29] hwmon: (lm95241) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (12 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 13/29] hwmon: (ina238) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 15/29] hwmon: (aht10) " Guenter Roeck
` (14 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/lm95241.c | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/drivers/hwmon/lm95241.c b/drivers/hwmon/lm95241.c
index cad0a0ff8416..456381b0938e 100644
--- a/drivers/hwmon/lm95241.c
+++ b/drivers/hwmon/lm95241.c
@@ -15,7 +15,6 @@
#include <linux/jiffies.h>
#include <linux/hwmon.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/slab.h>
#define DEVNAME "lm95241"
@@ -75,7 +74,6 @@ static const u8 lm95241_reg_address[] = {
/* Client data (each client gets its own) */
struct lm95241_data {
struct i2c_client *client;
- struct mutex update_lock;
unsigned long last_updated; /* in jiffies */
unsigned long interval; /* in milli-seconds */
bool valid; /* false until following fields are valid */
@@ -102,8 +100,6 @@ static struct lm95241_data *lm95241_update_device(struct device *dev)
struct lm95241_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->client;
- mutex_lock(&data->update_lock);
-
if (time_after(jiffies, data->last_updated
+ msecs_to_jiffies(data->interval)) ||
!data->valid) {
@@ -120,9 +116,6 @@ static struct lm95241_data *lm95241_update_device(struct device *dev)
data->last_updated = jiffies;
data->valid = true;
}
-
- mutex_unlock(&data->update_lock);
-
return data;
}
@@ -204,8 +197,6 @@ static int lm95241_write_chip(struct device *dev, u32 attr, int channel,
u8 config;
int ret;
- mutex_lock(&data->update_lock);
-
switch (attr) {
case hwmon_chip_update_interval:
config = data->config & ~CFG_CRMASK;
@@ -231,7 +222,6 @@ static int lm95241_write_chip(struct device *dev, u32 attr, int channel,
ret = -EOPNOTSUPP;
break;
}
- mutex_unlock(&data->update_lock);
return ret;
}
@@ -242,8 +232,6 @@ static int lm95241_write_temp(struct device *dev, u32 attr, int channel,
struct i2c_client *client = data->client;
int ret;
- mutex_lock(&data->update_lock);
-
switch (attr) {
case hwmon_temp_min:
if (channel == 1) {
@@ -313,9 +301,6 @@ static int lm95241_write_temp(struct device *dev, u32 attr, int channel,
ret = -EOPNOTSUPP;
break;
}
-
- mutex_unlock(&data->update_lock);
-
return ret;
}
@@ -443,7 +428,6 @@ static int lm95241_probe(struct i2c_client *client)
return -ENOMEM;
data->client = client;
- mutex_init(&data->update_lock);
/* Initialize the LM95241 chip */
lm95241_init_client(client, data);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 15/29] hwmon: (aht10) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (13 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 14/29] hwmon: (lm95241) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 16/29] hwmon: (adt7411) " Guenter Roeck
` (13 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/aht10.c | 24 +++---------------------
1 file changed, 3 insertions(+), 21 deletions(-)
diff --git a/drivers/hwmon/aht10.c b/drivers/hwmon/aht10.c
index d1c55e2eb479..8b90b661c393 100644
--- a/drivers/hwmon/aht10.c
+++ b/drivers/hwmon/aht10.c
@@ -60,8 +60,6 @@ MODULE_DEVICE_TABLE(i2c, aht10_id);
/**
* struct aht10_data - All the data required to operate an AHT10/AHT20 chip
* @client: the i2c client associated with the AHT10/AHT20
- * @lock: a mutex that is used to prevent parallel access to the
- * i2c client
* @min_poll_interval: the minimum poll interval
* While the poll rate limit is not 100% necessary,
* the datasheet recommends that a measurement
@@ -81,11 +79,6 @@ MODULE_DEVICE_TABLE(i2c, aht10_id);
struct aht10_data {
struct i2c_client *client;
- /*
- * Prevent simultaneous access to the i2c
- * client and previous_poll_time
- */
- struct mutex lock;
ktime_t min_poll_interval;
ktime_t previous_poll_time;
int temperature;
@@ -168,32 +161,24 @@ static int aht10_read_values(struct aht10_data *data)
u8 raw_data[AHT20_MEAS_SIZE];
struct i2c_client *client = data->client;
- mutex_lock(&data->lock);
- if (!aht10_polltime_expired(data)) {
- mutex_unlock(&data->lock);
+ if (!aht10_polltime_expired(data))
return 0;
- }
res = i2c_master_send(client, cmd_meas, sizeof(cmd_meas));
- if (res < 0) {
- mutex_unlock(&data->lock);
+ if (res < 0)
return res;
- }
usleep_range(AHT10_MEAS_DELAY, AHT10_MEAS_DELAY + AHT10_DELAY_EXTRA);
res = i2c_master_recv(client, raw_data, data->meas_size);
if (res != data->meas_size) {
- mutex_unlock(&data->lock);
if (res >= 0)
return -ENODATA;
return res;
}
- if (data->crc8 && crc8_check(raw_data, data->meas_size)) {
- mutex_unlock(&data->lock);
+ if (data->crc8 && crc8_check(raw_data, data->meas_size))
return -EIO;
- }
hum = ((u32)raw_data[1] << 12u) |
((u32)raw_data[2] << 4u) |
@@ -210,7 +195,6 @@ static int aht10_read_values(struct aht10_data *data)
data->humidity = hum;
data->previous_poll_time = ktime_get_boottime();
- mutex_unlock(&data->lock);
return 0;
}
@@ -358,8 +342,6 @@ static int aht10_probe(struct i2c_client *client)
break;
}
- mutex_init(&data->lock);
-
res = aht10_init(data);
if (res < 0)
return res;
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 16/29] hwmon: (adt7411) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (14 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 15/29] hwmon: (aht10) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 14:10 ` Nuno Sá
2025-10-17 13:02 ` [PATCH 17/29] hwmon: (ltc2947-core) " Guenter Roeck
` (12 subsequent siblings)
28 siblings, 1 reply; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/adt7411.c | 59 +++++++++++------------------------------
1 file changed, 16 insertions(+), 43 deletions(-)
diff --git a/drivers/hwmon/adt7411.c b/drivers/hwmon/adt7411.c
index 08d0effd97f7..b9991a69e6c6 100644
--- a/drivers/hwmon/adt7411.c
+++ b/drivers/hwmon/adt7411.c
@@ -11,7 +11,6 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/err.h>
-#include <linux/mutex.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/hwmon.h>
@@ -99,8 +98,6 @@ static const u8 adt7411_in_alarm_bits[] = {
};
struct adt7411_data {
- struct mutex device_lock; /* for "atomic" device accesses */
- struct mutex update_lock;
unsigned long next_update;
long vref_cached;
struct i2c_client *client;
@@ -110,55 +107,41 @@ struct adt7411_data {
/*
* When reading a register containing (up to 4) lsb, all associated
* msb-registers get locked by the hardware. After _one_ of those msb is read,
- * _all_ are unlocked. In order to use this locking correctly, reading lsb/msb
- * is protected here with a mutex, too.
+ * _all_ are unlocked.
*/
static int adt7411_read_10_bit(struct i2c_client *client, u8 lsb_reg,
- u8 msb_reg, u8 lsb_shift)
+ u8 msb_reg, u8 lsb_shift)
{
- struct adt7411_data *data = i2c_get_clientdata(client);
int val, tmp;
- mutex_lock(&data->device_lock);
-
val = i2c_smbus_read_byte_data(client, lsb_reg);
if (val < 0)
- goto exit_unlock;
+ return val;
tmp = (val >> lsb_shift) & 3;
val = i2c_smbus_read_byte_data(client, msb_reg);
+ if (val < 0)
+ return val;
- if (val >= 0)
- val = (val << 2) | tmp;
-
- exit_unlock:
- mutex_unlock(&data->device_lock);
-
+ val = (val << 2) | tmp;
return val;
}
static int adt7411_modify_bit(struct i2c_client *client, u8 reg, u8 bit,
- bool flag)
+ bool flag)
{
- struct adt7411_data *data = i2c_get_clientdata(client);
int ret, val;
- mutex_lock(&data->device_lock);
-
ret = i2c_smbus_read_byte_data(client, reg);
if (ret < 0)
- goto exit_unlock;
+ return ret;
if (flag)
val = ret | bit;
else
val = ret & ~bit;
- ret = i2c_smbus_write_byte_data(client, reg, val);
-
- exit_unlock:
- mutex_unlock(&data->device_lock);
- return ret;
+ return i2c_smbus_write_byte_data(client, reg, val);
}
static ssize_t adt7411_show_bit(struct device *dev,
@@ -186,12 +169,11 @@ static ssize_t adt7411_set_bit(struct device *dev,
if (ret || flag > 1)
return -EINVAL;
+ hwmon_lock(dev);
ret = adt7411_modify_bit(client, s_attr2->index, s_attr2->nr, flag);
-
/* force update */
- mutex_lock(&data->update_lock);
data->next_update = jiffies;
- mutex_unlock(&data->update_lock);
+ hwmon_unlock(dev);
return ret < 0 ? ret : count;
}
@@ -294,10 +276,9 @@ static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel,
int reg, lsb_reg, lsb_shift;
int nr = channel - 1;
- mutex_lock(&data->update_lock);
ret = adt7411_update_vref(dev);
if (ret < 0)
- goto exit_unlock;
+ return ret;
switch (attr) {
case hwmon_in_input:
@@ -307,7 +288,7 @@ static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel,
ADT7411_REG_EXT_TEMP_AIN1_MSB + nr,
lsb_shift);
if (ret < 0)
- goto exit_unlock;
+ return ret;
*val = ret * data->vref_cached / 1024;
ret = 0;
break;
@@ -318,7 +299,7 @@ static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel,
: ADT7411_REG_IN_HIGH(channel);
ret = i2c_smbus_read_byte_data(client, reg);
if (ret < 0)
- goto exit_unlock;
+ return ret;
*val = ret * data->vref_cached / 256;
ret = 0;
break;
@@ -329,8 +310,6 @@ static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel,
ret = -EOPNOTSUPP;
break;
}
- exit_unlock:
- mutex_unlock(&data->update_lock);
return ret;
}
@@ -457,10 +436,9 @@ static int adt7411_write_in_chan(struct device *dev, u32 attr, int channel,
struct i2c_client *client = data->client;
int ret, reg;
- mutex_lock(&data->update_lock);
ret = adt7411_update_vref(dev);
if (ret < 0)
- goto exit_unlock;
+ return ret;
val = clamp_val(val, 0, 255 * data->vref_cached / 256);
val = DIV_ROUND_CLOSEST(val * 256, data->vref_cached);
@@ -472,13 +450,10 @@ static int adt7411_write_in_chan(struct device *dev, u32 attr, int channel,
reg = ADT7411_REG_IN_HIGH(channel);
break;
default:
- ret = -EOPNOTSUPP;
- goto exit_unlock;
+ return -EOPNOTSUPP;
}
ret = i2c_smbus_write_byte_data(client, reg, val);
- exit_unlock:
- mutex_unlock(&data->update_lock);
return ret;
}
@@ -679,8 +654,6 @@ static int adt7411_probe(struct i2c_client *client)
i2c_set_clientdata(client, data);
data->client = client;
- mutex_init(&data->device_lock);
- mutex_init(&data->update_lock);
ret = adt7411_init_device(data);
if (ret < 0)
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* Re: [PATCH 16/29] hwmon: (adt7411) Rely on subsystem locking
2025-10-17 13:02 ` [PATCH 16/29] hwmon: (adt7411) " Guenter Roeck
@ 2025-10-17 14:10 ` Nuno Sá
0 siblings, 0 replies; 34+ messages in thread
From: Nuno Sá @ 2025-10-17 14:10 UTC (permalink / raw)
To: Guenter Roeck, Hardware Monitoring
On Fri, 2025-10-17 at 06:02 -0700, Guenter Roeck wrote:
> Attribute access is now serialized in the hardware monitoring core,
> so locking in the driver code is no longer necessary. Drop it.
>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> drivers/hwmon/adt7411.c | 59 +++++++++++------------------------------
> 1 file changed, 16 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/hwmon/adt7411.c b/drivers/hwmon/adt7411.c
> index 08d0effd97f7..b9991a69e6c6 100644
> --- a/drivers/hwmon/adt7411.c
> +++ b/drivers/hwmon/adt7411.c
> @@ -11,7 +11,6 @@
> #include <linux/module.h>
> #include <linux/init.h>
> #include <linux/err.h>
> -#include <linux/mutex.h>
> #include <linux/jiffies.h>
> #include <linux/i2c.h>
> #include <linux/hwmon.h>
> @@ -99,8 +98,6 @@ static const u8 adt7411_in_alarm_bits[] = {
> };
>
> struct adt7411_data {
> - struct mutex device_lock; /* for "atomic" device accesses */
> - struct mutex update_lock;
> unsigned long next_update;
> long vref_cached;
> struct i2c_client *client;
> @@ -110,55 +107,41 @@ struct adt7411_data {
> /*
> * When reading a register containing (up to 4) lsb, all associated
> * msb-registers get locked by the hardware. After _one_ of those msb is
> read,
> - * _all_ are unlocked. In order to use this locking correctly, reading
> lsb/msb
> - * is protected here with a mutex, too.
> + * _all_ are unlocked.
> */
> static int adt7411_read_10_bit(struct i2c_client *client, u8 lsb_reg,
> - u8 msb_reg, u8 lsb_shift)
> + u8 msb_reg, u8 lsb_shift)
> {
> - struct adt7411_data *data = i2c_get_clientdata(client);
> int val, tmp;
>
> - mutex_lock(&data->device_lock);
> -
> val = i2c_smbus_read_byte_data(client, lsb_reg);
> if (val < 0)
> - goto exit_unlock;
> + return val;
>
> tmp = (val >> lsb_shift) & 3;
> val = i2c_smbus_read_byte_data(client, msb_reg);
> + if (val < 0)
> + return val;
>
> - if (val >= 0)
> - val = (val << 2) | tmp;
> -
> - exit_unlock:
> - mutex_unlock(&data->device_lock);
> -
> + val = (val << 2) | tmp;
> return val;
> }
>
> static int adt7411_modify_bit(struct i2c_client *client, u8 reg, u8 bit,
> - bool flag)
> + bool flag)
> {
> - struct adt7411_data *data = i2c_get_clientdata(client);
> int ret, val;
>
> - mutex_lock(&data->device_lock);
> -
> ret = i2c_smbus_read_byte_data(client, reg);
> if (ret < 0)
> - goto exit_unlock;
> + return ret;
>
> if (flag)
> val = ret | bit;
> else
> val = ret & ~bit;
>
> - ret = i2c_smbus_write_byte_data(client, reg, val);
> -
> - exit_unlock:
> - mutex_unlock(&data->device_lock);
> - return ret;
> + return i2c_smbus_write_byte_data(client, reg, val);
> }
>
> static ssize_t adt7411_show_bit(struct device *dev,
> @@ -186,12 +169,11 @@ static ssize_t adt7411_set_bit(struct device *dev,
> if (ret || flag > 1)
> return -EINVAL;
>
> + hwmon_lock(dev);
> ret = adt7411_modify_bit(client, s_attr2->index, s_attr2->nr, flag);
> -
> /* force update */
> - mutex_lock(&data->update_lock);
> data->next_update = jiffies;
> - mutex_unlock(&data->update_lock);
> + hwmon_unlock(dev);
>
> return ret < 0 ? ret : count;
> }
> @@ -294,10 +276,9 @@ static int adt7411_read_in_chan(struct device *dev, u32
> attr, int channel,
> int reg, lsb_reg, lsb_shift;
> int nr = channel - 1;
>
> - mutex_lock(&data->update_lock);
> ret = adt7411_update_vref(dev);
> if (ret < 0)
> - goto exit_unlock;
> + return ret;
>
> switch (attr) {
> case hwmon_in_input:
> @@ -307,7 +288,7 @@ static int adt7411_read_in_chan(struct device *dev, u32
> attr, int channel,
> ADT7411_REG_EXT_TEMP_AIN1_MSB + nr,
> lsb_shift);
> if (ret < 0)
> - goto exit_unlock;
> + return ret;
> *val = ret * data->vref_cached / 1024;
> ret = 0;
> break;
> @@ -318,7 +299,7 @@ static int adt7411_read_in_chan(struct device *dev, u32
> attr, int channel,
> : ADT7411_REG_IN_HIGH(channel);
> ret = i2c_smbus_read_byte_data(client, reg);
> if (ret < 0)
> - goto exit_unlock;
> + return ret;
> *val = ret * data->vref_cached / 256;
> ret = 0;
> break;
> @@ -329,8 +310,6 @@ static int adt7411_read_in_chan(struct device *dev, u32
> attr, int channel,
> ret = -EOPNOTSUPP;
> break;
> }
> - exit_unlock:
> - mutex_unlock(&data->update_lock);
> return ret;
> }
>
> @@ -457,10 +436,9 @@ static int adt7411_write_in_chan(struct device *dev, u32
> attr, int channel,
> struct i2c_client *client = data->client;
> int ret, reg;
>
> - mutex_lock(&data->update_lock);
> ret = adt7411_update_vref(dev);
> if (ret < 0)
> - goto exit_unlock;
> + return ret;
> val = clamp_val(val, 0, 255 * data->vref_cached / 256);
> val = DIV_ROUND_CLOSEST(val * 256, data->vref_cached);
>
> @@ -472,13 +450,10 @@ static int adt7411_write_in_chan(struct device *dev, u32
> attr, int channel,
> reg = ADT7411_REG_IN_HIGH(channel);
> break;
> default:
> - ret = -EOPNOTSUPP;
> - goto exit_unlock;
> + return -EOPNOTSUPP;
> }
>
> ret = i2c_smbus_write_byte_data(client, reg, val);
> - exit_unlock:
> - mutex_unlock(&data->update_lock);
> return ret;
> }
>
> @@ -679,8 +654,6 @@ static int adt7411_probe(struct i2c_client *client)
>
> i2c_set_clientdata(client, data);
> data->client = client;
> - mutex_init(&data->device_lock);
> - mutex_init(&data->update_lock);
>
> ret = adt7411_init_device(data);
> if (ret < 0)
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH 17/29] hwmon: (ltc2947-core) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (15 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 16/29] hwmon: (adt7411) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 14:11 ` Nuno Sá
2025-10-17 13:02 ` [PATCH 18/29] hwmon: (peci) " Guenter Roeck
` (11 subsequent siblings)
28 siblings, 1 reply; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/ltc2947-core.c | 32 +++++---------------------------
1 file changed, 5 insertions(+), 27 deletions(-)
diff --git a/drivers/hwmon/ltc2947-core.c b/drivers/hwmon/ltc2947-core.c
index 90f70f732b41..ad7120d1e469 100644
--- a/drivers/hwmon/ltc2947-core.c
+++ b/drivers/hwmon/ltc2947-core.c
@@ -120,12 +120,6 @@
struct ltc2947_data {
struct regmap *map;
struct device *dev;
- /*
- * The mutex is needed because the device has 2 memory pages. When
- * reading/writing the correct page needs to be set so that, the
- * complete sequence select_page->read/write needs to be protected.
- */
- struct mutex lock;
u32 lsb_energy;
bool gpio_out;
};
@@ -181,13 +175,9 @@ static int ltc2947_val_read(struct ltc2947_data *st, const u8 reg,
int ret;
u64 __val = 0;
- mutex_lock(&st->lock);
-
ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
- if (ret) {
- mutex_unlock(&st->lock);
+ if (ret)
return ret;
- }
dev_dbg(st->dev, "Read val, reg:%02X, p:%d sz:%zu\n", reg, page,
size);
@@ -207,8 +197,6 @@ static int ltc2947_val_read(struct ltc2947_data *st, const u8 reg,
break;
}
- mutex_unlock(&st->lock);
-
if (ret)
return ret;
@@ -242,13 +230,10 @@ static int ltc2947_val_write(struct ltc2947_data *st, const u8 reg,
{
int ret;
- mutex_lock(&st->lock);
/* set device on correct page */
ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
- if (ret) {
- mutex_unlock(&st->lock);
+ if (ret)
return ret;
- }
dev_dbg(st->dev, "Write val, r:%02X, p:%d, sz:%zu, val:%016llX\n",
reg, page, size, val);
@@ -265,8 +250,6 @@ static int ltc2947_val_write(struct ltc2947_data *st, const u8 reg,
break;
}
- mutex_unlock(&st->lock);
-
return ret;
}
@@ -295,11 +278,9 @@ static int ltc2947_alarm_read(struct ltc2947_data *st, const u8 reg,
memset(alarms, 0, sizeof(alarms));
- mutex_lock(&st->lock);
-
ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, LTC2947_PAGE0);
if (ret)
- goto unlock;
+ return ret;
dev_dbg(st->dev, "Read alarm, reg:%02X, mask:%02X\n", reg, mask);
/*
@@ -310,13 +291,11 @@ static int ltc2947_alarm_read(struct ltc2947_data *st, const u8 reg,
ret = regmap_bulk_read(st->map, LTC2947_REG_STATUS, alarms,
sizeof(alarms));
if (ret)
- goto unlock;
+ return ret;
/* get the alarm */
*val = !!(alarms[offset] & mask);
-unlock:
- mutex_unlock(&st->lock);
- return ret;
+ return 0;
}
static int ltc2947_read_temp(struct device *dev, const u32 attr, long *val,
@@ -1100,7 +1079,6 @@ int ltc2947_core_probe(struct regmap *map, const char *name)
st->map = map;
st->dev = dev;
dev_set_drvdata(dev, st);
- mutex_init(&st->lock);
ret = ltc2947_setup(st);
if (ret)
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* Re: [PATCH 17/29] hwmon: (ltc2947-core) Rely on subsystem locking
2025-10-17 13:02 ` [PATCH 17/29] hwmon: (ltc2947-core) " Guenter Roeck
@ 2025-10-17 14:11 ` Nuno Sá
0 siblings, 0 replies; 34+ messages in thread
From: Nuno Sá @ 2025-10-17 14:11 UTC (permalink / raw)
To: Guenter Roeck, Hardware Monitoring
On Fri, 2025-10-17 at 06:02 -0700, Guenter Roeck wrote:
> Attribute access is now serialized in the hardware monitoring core,
> so locking in the driver code is no longer necessary. Drop it.
>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> drivers/hwmon/ltc2947-core.c | 32 +++++---------------------------
> 1 file changed, 5 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/hwmon/ltc2947-core.c b/drivers/hwmon/ltc2947-core.c
> index 90f70f732b41..ad7120d1e469 100644
> --- a/drivers/hwmon/ltc2947-core.c
> +++ b/drivers/hwmon/ltc2947-core.c
> @@ -120,12 +120,6 @@
> struct ltc2947_data {
> struct regmap *map;
> struct device *dev;
> - /*
> - * The mutex is needed because the device has 2 memory pages. When
> - * reading/writing the correct page needs to be set so that, the
> - * complete sequence select_page->read/write needs to be protected.
> - */
> - struct mutex lock;
> u32 lsb_energy;
> bool gpio_out;
> };
> @@ -181,13 +175,9 @@ static int ltc2947_val_read(struct ltc2947_data *st,
> const u8 reg,
> int ret;
> u64 __val = 0;
>
> - mutex_lock(&st->lock);
> -
> ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
> - if (ret) {
> - mutex_unlock(&st->lock);
> + if (ret)
> return ret;
> - }
>
> dev_dbg(st->dev, "Read val, reg:%02X, p:%d sz:%zu\n", reg, page,
> size);
> @@ -207,8 +197,6 @@ static int ltc2947_val_read(struct ltc2947_data *st, const
> u8 reg,
> break;
> }
>
> - mutex_unlock(&st->lock);
> -
> if (ret)
> return ret;
>
> @@ -242,13 +230,10 @@ static int ltc2947_val_write(struct ltc2947_data *st,
> const u8 reg,
> {
> int ret;
>
> - mutex_lock(&st->lock);
> /* set device on correct page */
> ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
> - if (ret) {
> - mutex_unlock(&st->lock);
> + if (ret)
> return ret;
> - }
>
> dev_dbg(st->dev, "Write val, r:%02X, p:%d, sz:%zu, val:%016llX\n",
> reg, page, size, val);
> @@ -265,8 +250,6 @@ static int ltc2947_val_write(struct ltc2947_data *st,
> const u8 reg,
> break;
> }
>
> - mutex_unlock(&st->lock);
> -
> return ret;
> }
>
> @@ -295,11 +278,9 @@ static int ltc2947_alarm_read(struct ltc2947_data *st,
> const u8 reg,
>
> memset(alarms, 0, sizeof(alarms));
>
> - mutex_lock(&st->lock);
> -
> ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, LTC2947_PAGE0);
> if (ret)
> - goto unlock;
> + return ret;
>
> dev_dbg(st->dev, "Read alarm, reg:%02X, mask:%02X\n", reg, mask);
> /*
> @@ -310,13 +291,11 @@ static int ltc2947_alarm_read(struct ltc2947_data *st,
> const u8 reg,
> ret = regmap_bulk_read(st->map, LTC2947_REG_STATUS, alarms,
> sizeof(alarms));
> if (ret)
> - goto unlock;
> + return ret;
>
> /* get the alarm */
> *val = !!(alarms[offset] & mask);
> -unlock:
> - mutex_unlock(&st->lock);
> - return ret;
> + return 0;
> }
>
> static int ltc2947_read_temp(struct device *dev, const u32 attr, long *val,
> @@ -1100,7 +1079,6 @@ int ltc2947_core_probe(struct regmap *map, const char
> *name)
> st->map = map;
> st->dev = dev;
> dev_set_drvdata(dev, st);
> - mutex_init(&st->lock);
>
> ret = ltc2947_setup(st);
> if (ret)
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH 18/29] hwmon: (peci) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (16 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 17/29] hwmon: (ltc2947-core) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 19/29] hwmon: (adt7x10) " Guenter Roeck
` (10 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/peci/common.h | 3 --
drivers/hwmon/peci/cputemp.c | 72 +++++++++--------------------------
drivers/hwmon/peci/dimmtemp.c | 17 ++-------
3 files changed, 23 insertions(+), 69 deletions(-)
diff --git a/drivers/hwmon/peci/common.h b/drivers/hwmon/peci/common.h
index 734506b0eca2..92a7ee1925bc 100644
--- a/drivers/hwmon/peci/common.h
+++ b/drivers/hwmon/peci/common.h
@@ -1,7 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (c) 2021 Intel Corporation */
-#include <linux/mutex.h>
#include <linux/types.h>
#ifndef __PECI_HWMON_COMMON_H
@@ -13,12 +12,10 @@
* struct peci_sensor_state - PECI state information
* @valid: flag to indicate the sensor value is valid
* @last_updated: time of the last update in jiffies
- * @lock: mutex to protect sensor access
*/
struct peci_sensor_state {
bool valid;
unsigned long last_updated;
- struct mutex lock; /* protect sensor access */
};
/**
diff --git a/drivers/hwmon/peci/cputemp.c b/drivers/hwmon/peci/cputemp.c
index b350c9a76894..b2fc936851e1 100644
--- a/drivers/hwmon/peci/cputemp.c
+++ b/drivers/hwmon/peci/cputemp.c
@@ -116,11 +116,9 @@ static int get_temp_target(struct peci_cputemp *priv, enum peci_temp_target_type
{
int ret;
- mutex_lock(&priv->temp.target.state.lock);
-
ret = update_temp_target(priv);
if (ret)
- goto unlock;
+ return ret;
switch (type) {
case tcontrol_type:
@@ -139,9 +137,6 @@ static int get_temp_target(struct peci_cputemp *priv, enum peci_temp_target_type
ret = -EOPNOTSUPP;
break;
}
-unlock:
- mutex_unlock(&priv->temp.target.state.lock);
-
return ret;
}
@@ -177,26 +172,23 @@ static s32 dts_eight_dot_eight_to_millidegree(u16 val)
static int get_die_temp(struct peci_cputemp *priv, long *val)
{
- int ret = 0;
long tjmax;
u16 temp;
+ int ret;
- mutex_lock(&priv->temp.die.state.lock);
if (!peci_sensor_need_update(&priv->temp.die.state))
goto skip_update;
ret = peci_temp_read(priv->peci_dev, &temp);
if (ret)
- goto err_unlock;
+ return ret;
- if (!dts_valid(temp)) {
- ret = -EIO;
- goto err_unlock;
- }
+ if (!dts_valid(temp))
+ return -EIO;
ret = get_temp_target(priv, tjmax_type, &tjmax);
if (ret)
- goto err_unlock;
+ return ret;
priv->temp.die.value = (s32)tjmax + dts_ten_dot_six_to_millidegree(temp);
@@ -204,35 +196,30 @@ static int get_die_temp(struct peci_cputemp *priv, long *val)
skip_update:
*val = priv->temp.die.value;
-err_unlock:
- mutex_unlock(&priv->temp.die.state.lock);
- return ret;
+ return 0;
}
static int get_dts(struct peci_cputemp *priv, long *val)
{
- int ret = 0;
u16 thermal_margin;
long tcontrol;
u32 pcs;
+ int ret;
- mutex_lock(&priv->temp.dts.state.lock);
if (!peci_sensor_need_update(&priv->temp.dts.state))
goto skip_update;
ret = peci_pcs_read(priv->peci_dev, PECI_PCS_THERMAL_MARGIN, 0, &pcs);
if (ret)
- goto err_unlock;
+ return ret;
thermal_margin = FIELD_GET(DTS_MARGIN_MASK, pcs);
- if (!dts_valid(thermal_margin)) {
- ret = -EIO;
- goto err_unlock;
- }
+ if (!dts_valid(thermal_margin))
+ return -EIO;
ret = get_temp_target(priv, tcontrol_type, &tcontrol);
if (ret)
- goto err_unlock;
+ return ret;
/* Note that the tcontrol should be available before calling it */
priv->temp.dts.value =
@@ -242,35 +229,30 @@ static int get_dts(struct peci_cputemp *priv, long *val)
skip_update:
*val = priv->temp.dts.value;
-err_unlock:
- mutex_unlock(&priv->temp.dts.state.lock);
- return ret;
+ return 0;
}
static int get_core_temp(struct peci_cputemp *priv, int core_index, long *val)
{
- int ret = 0;
u16 core_dts_margin;
long tjmax;
u32 pcs;
+ int ret;
- mutex_lock(&priv->temp.core[core_index].state.lock);
if (!peci_sensor_need_update(&priv->temp.core[core_index].state))
goto skip_update;
ret = peci_pcs_read(priv->peci_dev, PECI_PCS_MODULE_TEMP, core_index, &pcs);
if (ret)
- goto err_unlock;
+ return ret;
core_dts_margin = FIELD_GET(PCS_MODULE_TEMP_MASK, pcs);
- if (!dts_valid(core_dts_margin)) {
- ret = -EIO;
- goto err_unlock;
- }
+ if (!dts_valid(core_dts_margin))
+ return -EIO;
ret = get_temp_target(priv, tjmax_type, &tjmax);
if (ret)
- goto err_unlock;
+ return ret;
/* Note that the tjmax should be available before calling it */
priv->temp.core[core_index].value =
@@ -280,9 +262,7 @@ static int get_core_temp(struct peci_cputemp *priv, int core_index, long *val)
skip_update:
*val = priv->temp.core[core_index].value;
-err_unlock:
- mutex_unlock(&priv->temp.core[core_index].state.lock);
- return ret;
+ return 0;
}
static int cputemp_read_string(struct device *dev, enum hwmon_sensor_types type,
@@ -431,18 +411,6 @@ static void check_resolved_cores(struct peci_cputemp *priv)
bitmap_zero(priv->core_mask, CORE_NUMS_MAX);
}
-static void sensor_init(struct peci_cputemp *priv)
-{
- int i;
-
- mutex_init(&priv->temp.target.state.lock);
- mutex_init(&priv->temp.die.state.lock);
- mutex_init(&priv->temp.dts.state.lock);
-
- for_each_set_bit(i, priv->core_mask, CORE_NUMS_MAX)
- mutex_init(&priv->temp.core[i].state.lock);
-}
-
static const struct hwmon_ops peci_cputemp_ops = {
.is_visible = cputemp_is_visible,
.read_string = cputemp_read_string,
@@ -507,8 +475,6 @@ static int peci_cputemp_probe(struct auxiliary_device *adev,
check_resolved_cores(priv);
- sensor_init(priv);
-
hwmon_dev = devm_hwmon_device_register_with_info(priv->dev, priv->name,
priv, &peci_cputemp_chip_info, NULL);
diff --git a/drivers/hwmon/peci/dimmtemp.c b/drivers/hwmon/peci/dimmtemp.c
index a281476c7a31..bd3e8715dfec 100644
--- a/drivers/hwmon/peci/dimmtemp.c
+++ b/drivers/hwmon/peci/dimmtemp.c
@@ -96,16 +96,15 @@ static int get_dimm_temp(struct peci_dimmtemp *priv, int dimm_no, long *val)
{
int dimm_order = dimm_no % priv->gen_info->dimm_idx_max;
int chan_rank = dimm_no / priv->gen_info->dimm_idx_max;
- int ret = 0;
u32 data;
+ int ret;
- mutex_lock(&priv->dimm[dimm_no].temp.state.lock);
if (!peci_sensor_need_update(&priv->dimm[dimm_no].temp.state))
goto skip_update;
ret = peci_pcs_read(priv->peci_dev, PECI_PCS_DDR_DIMM_TEMP, chan_rank, &data);
if (ret)
- goto unlock;
+ return ret;
priv->dimm[dimm_no].temp.value = __dimm_temp(data, dimm_order) * MILLIDEGREE_PER_DEGREE;
@@ -113,9 +112,7 @@ static int get_dimm_temp(struct peci_dimmtemp *priv, int dimm_no, long *val)
skip_update:
*val = priv->dimm[dimm_no].temp.value;
-unlock:
- mutex_unlock(&priv->dimm[dimm_no].temp.state.lock);
- return ret;
+ return 0;
}
static int update_thresholds(struct peci_dimmtemp *priv, int dimm_no)
@@ -145,10 +142,9 @@ static int get_dimm_thresholds(struct peci_dimmtemp *priv, enum peci_dimm_thresh
{
int ret;
- mutex_lock(&priv->dimm[dimm_no].thresholds.state.lock);
ret = update_thresholds(priv, dimm_no);
if (ret)
- goto unlock;
+ return ret;
switch (type) {
case temp_max_type:
@@ -161,9 +157,6 @@ static int get_dimm_thresholds(struct peci_dimmtemp *priv, enum peci_dimm_thresh
ret = -EOPNOTSUPP;
break;
}
-unlock:
- mutex_unlock(&priv->dimm[dimm_no].thresholds.state.lock);
-
return ret;
}
@@ -349,8 +342,6 @@ static int create_dimm_temp_info(struct peci_dimmtemp *priv)
ret = create_dimm_temp_label(priv, i);
if (ret)
return ret;
- mutex_init(&priv->dimm[i].thresholds.state.lock);
- mutex_init(&priv->dimm[i].temp.state.lock);
}
dev = devm_hwmon_device_register_with_info(priv->dev, priv->name, priv,
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 19/29] hwmon: (adt7x10) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (17 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 18/29] hwmon: (peci) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 14:08 ` Nuno Sá
2025-10-17 13:02 ` [PATCH 20/29] hwmon: (sfctemp) " Guenter Roeck
` (9 subsequent siblings)
28 siblings, 1 reply; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/adt7x10.c | 27 +++++----------------------
1 file changed, 5 insertions(+), 22 deletions(-)
diff --git a/drivers/hwmon/adt7x10.c b/drivers/hwmon/adt7x10.c
index 2d329391ed3f..d003ee3ebf06 100644
--- a/drivers/hwmon/adt7x10.c
+++ b/drivers/hwmon/adt7x10.c
@@ -15,7 +15,6 @@
#include <linux/jiffies.h>
#include <linux/hwmon.h>
#include <linux/err.h>
-#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/regmap.h>
@@ -55,7 +54,6 @@
/* Each client has this additional data */
struct adt7x10_data {
struct regmap *regmap;
- struct mutex update_lock;
u8 config;
u8 oldconfig;
bool valid; /* true if temperature valid */
@@ -137,17 +135,13 @@ static int adt7x10_temp_read(struct adt7x10_data *data, int index, long *val)
unsigned int regval;
int ret;
- mutex_lock(&data->update_lock);
if (index == adt7x10_temperature && !data->valid) {
/* wait for valid temperature */
ret = adt7x10_temp_ready(data->regmap);
- if (ret) {
- mutex_unlock(&data->update_lock);
+ if (ret)
return ret;
- }
data->valid = true;
}
- mutex_unlock(&data->update_lock);
ret = regmap_read(data->regmap, ADT7X10_REG_TEMP[index], ®val);
if (ret)
@@ -159,13 +153,8 @@ static int adt7x10_temp_read(struct adt7x10_data *data, int index, long *val)
static int adt7x10_temp_write(struct adt7x10_data *data, int index, long temp)
{
- int ret;
-
- mutex_lock(&data->update_lock);
- ret = regmap_write(data->regmap, ADT7X10_REG_TEMP[index],
- ADT7X10_TEMP_TO_REG(temp));
- mutex_unlock(&data->update_lock);
- return ret;
+ return regmap_write(data->regmap, ADT7X10_REG_TEMP[index],
+ ADT7X10_TEMP_TO_REG(temp));
}
static int adt7x10_hyst_read(struct adt7x10_data *data, int index, long *val)
@@ -197,22 +186,17 @@ static int adt7x10_hyst_write(struct adt7x10_data *data, long hyst)
unsigned int regval;
int limit, ret;
- mutex_lock(&data->update_lock);
-
/* convert absolute hysteresis value to a 4 bit delta value */
ret = regmap_read(data->regmap, ADT7X10_T_ALARM_HIGH, ®val);
if (ret < 0)
- goto abort;
+ return ret;
limit = ADT7X10_REG_TO_TEMP(data, regval);
hyst = clamp_val(hyst, ADT7X10_TEMP_MIN, ADT7X10_TEMP_MAX);
regval = clamp_val(DIV_ROUND_CLOSEST(limit - hyst, 1000), 0,
ADT7X10_T_HYST_MASK);
- ret = regmap_write(data->regmap, ADT7X10_T_HYST, regval);
-abort:
- mutex_unlock(&data->update_lock);
- return ret;
+ return regmap_write(data->regmap, ADT7X10_T_HYST, regval);
}
static int adt7x10_alarm_read(struct adt7x10_data *data, int index, long *val)
@@ -344,7 +328,6 @@ int adt7x10_probe(struct device *dev, const char *name, int irq,
data->regmap = regmap;
dev_set_drvdata(dev, data);
- mutex_init(&data->update_lock);
/* configure as specified */
ret = regmap_read(regmap, ADT7X10_CONFIG, &config);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* Re: [PATCH 19/29] hwmon: (adt7x10) Rely on subsystem locking
2025-10-17 13:02 ` [PATCH 19/29] hwmon: (adt7x10) " Guenter Roeck
@ 2025-10-17 14:08 ` Nuno Sá
0 siblings, 0 replies; 34+ messages in thread
From: Nuno Sá @ 2025-10-17 14:08 UTC (permalink / raw)
To: Guenter Roeck, Hardware Monitoring
On Fri, 2025-10-17 at 06:02 -0700, Guenter Roeck wrote:
> Attribute access is now serialized in the hardware monitoring core,
> so locking in the driver code is no longer necessary. Drop it.
>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> drivers/hwmon/adt7x10.c | 27 +++++----------------------
> 1 file changed, 5 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/hwmon/adt7x10.c b/drivers/hwmon/adt7x10.c
> index 2d329391ed3f..d003ee3ebf06 100644
> --- a/drivers/hwmon/adt7x10.c
> +++ b/drivers/hwmon/adt7x10.c
> @@ -15,7 +15,6 @@
> #include <linux/jiffies.h>
> #include <linux/hwmon.h>
> #include <linux/err.h>
> -#include <linux/mutex.h>
> #include <linux/delay.h>
> #include <linux/interrupt.h>
> #include <linux/regmap.h>
> @@ -55,7 +54,6 @@
> /* Each client has this additional data */
> struct adt7x10_data {
> struct regmap *regmap;
> - struct mutex update_lock;
> u8 config;
> u8 oldconfig;
> bool valid; /* true if temperature valid
> */
> @@ -137,17 +135,13 @@ static int adt7x10_temp_read(struct adt7x10_data *data,
> int index, long *val)
> unsigned int regval;
> int ret;
>
> - mutex_lock(&data->update_lock);
> if (index == adt7x10_temperature && !data->valid) {
> /* wait for valid temperature */
> ret = adt7x10_temp_ready(data->regmap);
> - if (ret) {
> - mutex_unlock(&data->update_lock);
> + if (ret)
> return ret;
> - }
> data->valid = true;
> }
> - mutex_unlock(&data->update_lock);
>
> ret = regmap_read(data->regmap, ADT7X10_REG_TEMP[index], ®val);
> if (ret)
> @@ -159,13 +153,8 @@ static int adt7x10_temp_read(struct adt7x10_data *data,
> int index, long *val)
>
> static int adt7x10_temp_write(struct adt7x10_data *data, int index, long
> temp)
> {
> - int ret;
> -
> - mutex_lock(&data->update_lock);
> - ret = regmap_write(data->regmap, ADT7X10_REG_TEMP[index],
> - ADT7X10_TEMP_TO_REG(temp));
> - mutex_unlock(&data->update_lock);
> - return ret;
> + return regmap_write(data->regmap, ADT7X10_REG_TEMP[index],
> + ADT7X10_TEMP_TO_REG(temp));
> }
>
> static int adt7x10_hyst_read(struct adt7x10_data *data, int index, long *val)
> @@ -197,22 +186,17 @@ static int adt7x10_hyst_write(struct adt7x10_data *data,
> long hyst)
> unsigned int regval;
> int limit, ret;
>
> - mutex_lock(&data->update_lock);
> -
> /* convert absolute hysteresis value to a 4 bit delta value */
> ret = regmap_read(data->regmap, ADT7X10_T_ALARM_HIGH, ®val);
> if (ret < 0)
> - goto abort;
> + return ret;
>
> limit = ADT7X10_REG_TO_TEMP(data, regval);
>
> hyst = clamp_val(hyst, ADT7X10_TEMP_MIN, ADT7X10_TEMP_MAX);
> regval = clamp_val(DIV_ROUND_CLOSEST(limit - hyst, 1000), 0,
> ADT7X10_T_HYST_MASK);
> - ret = regmap_write(data->regmap, ADT7X10_T_HYST, regval);
> -abort:
> - mutex_unlock(&data->update_lock);
> - return ret;
> + return regmap_write(data->regmap, ADT7X10_T_HYST, regval);
> }
>
> static int adt7x10_alarm_read(struct adt7x10_data *data, int index, long
> *val)
> @@ -344,7 +328,6 @@ int adt7x10_probe(struct device *dev, const char *name,
> int irq,
> data->regmap = regmap;
>
> dev_set_drvdata(dev, data);
> - mutex_init(&data->update_lock);
>
> /* configure as specified */
> ret = regmap_read(regmap, ADT7X10_CONFIG, &config);
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH 20/29] hwmon: (sfctemp) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (18 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 19/29] hwmon: (adt7x10) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 21/29] hwmon: (lochnagar-hwmon) " Guenter Roeck
` (8 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/sfctemp.c | 36 ++++++++----------------------------
1 file changed, 8 insertions(+), 28 deletions(-)
diff --git a/drivers/hwmon/sfctemp.c b/drivers/hwmon/sfctemp.c
index fb1da93383d7..b78b2c099a12 100644
--- a/drivers/hwmon/sfctemp.c
+++ b/drivers/hwmon/sfctemp.c
@@ -10,7 +10,6 @@
#include <linux/hwmon.h>
#include <linux/io.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/reset.h>
@@ -49,8 +48,6 @@
#define SFCTEMP_K1000 81100L
struct sfctemp {
- /* serialize access to hardware register and enabled below */
- struct mutex lock;
void __iomem *regs;
struct clk *clk_sense;
struct clk *clk_bus;
@@ -92,15 +89,14 @@ static void sfctemp_stop(struct sfctemp *sfctemp)
static int sfctemp_enable(struct sfctemp *sfctemp)
{
- int ret = 0;
+ int ret;
- mutex_lock(&sfctemp->lock);
if (sfctemp->enabled)
- goto done;
+ return 0;
ret = clk_prepare_enable(sfctemp->clk_bus);
if (ret)
- goto err;
+ return ret;
ret = reset_control_deassert(sfctemp->rst_bus);
if (ret)
goto err_disable_bus;
@@ -115,9 +111,7 @@ static int sfctemp_enable(struct sfctemp *sfctemp)
sfctemp_power_up(sfctemp);
sfctemp_run(sfctemp);
sfctemp->enabled = true;
-done:
- mutex_unlock(&sfctemp->lock);
- return ret;
+ return 0;
err_disable_sense:
clk_disable_unprepare(sfctemp->clk_sense);
@@ -125,16 +119,13 @@ static int sfctemp_enable(struct sfctemp *sfctemp)
reset_control_assert(sfctemp->rst_bus);
err_disable_bus:
clk_disable_unprepare(sfctemp->clk_bus);
-err:
- mutex_unlock(&sfctemp->lock);
return ret;
}
static int sfctemp_disable(struct sfctemp *sfctemp)
{
- mutex_lock(&sfctemp->lock);
if (!sfctemp->enabled)
- goto done;
+ return 0;
sfctemp_stop(sfctemp);
sfctemp_power_down(sfctemp);
@@ -143,8 +134,6 @@ static int sfctemp_disable(struct sfctemp *sfctemp)
reset_control_assert(sfctemp->rst_bus);
clk_disable_unprepare(sfctemp->clk_bus);
sfctemp->enabled = false;
-done:
- mutex_unlock(&sfctemp->lock);
return 0;
}
@@ -155,22 +144,14 @@ static void sfctemp_disable_action(void *data)
static int sfctemp_convert(struct sfctemp *sfctemp, long *val)
{
- int ret;
-
- mutex_lock(&sfctemp->lock);
- if (!sfctemp->enabled) {
- ret = -ENODATA;
- goto out;
- }
+ if (!sfctemp->enabled)
+ return -ENODATA;
/* calculate temperature in milli Celcius */
*val = (long)((readl(sfctemp->regs) & SFCTEMP_DOUT_MSK) >> SFCTEMP_DOUT_POS)
* SFCTEMP_Y1000 / SFCTEMP_Z - SFCTEMP_K1000;
- ret = 0;
-out:
- mutex_unlock(&sfctemp->lock);
- return ret;
+ return 0;
}
static umode_t sfctemp_is_visible(const void *data, enum hwmon_sensor_types type,
@@ -263,7 +244,6 @@ static int sfctemp_probe(struct platform_device *pdev)
return -ENOMEM;
dev_set_drvdata(dev, sfctemp);
- mutex_init(&sfctemp->lock);
sfctemp->regs = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(sfctemp->regs))
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 21/29] hwmon: (lochnagar-hwmon) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (19 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 20/29] hwmon: (sfctemp) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 22/29] hwmon: (ltc4282) " Guenter Roeck
` (7 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/lochnagar-hwmon.c | 18 +++---------------
1 file changed, 3 insertions(+), 15 deletions(-)
diff --git a/drivers/hwmon/lochnagar-hwmon.c b/drivers/hwmon/lochnagar-hwmon.c
index 5202dddfd61e..c1ba72f6132e 100644
--- a/drivers/hwmon/lochnagar-hwmon.c
+++ b/drivers/hwmon/lochnagar-hwmon.c
@@ -10,7 +10,6 @@
#include <linux/delay.h>
#include <linux/hwmon.h>
-#include <linux/hwmon-sysfs.h>
#include <linux/math64.h>
#include <linux/mfd/lochnagar.h>
#include <linux/mfd/lochnagar2_regs.h>
@@ -42,9 +41,6 @@ struct lochnagar_hwmon {
struct regmap *regmap;
long power_nsamples[ARRAY_SIZE(lochnagar_chan_names)];
-
- /* Lock to ensure only a single sensor is read at a time */
- struct mutex sensor_lock;
};
enum lochnagar_measure_mode {
@@ -178,26 +174,20 @@ static int read_sensor(struct device *dev, int chan,
u32 data;
int ret;
- mutex_lock(&priv->sensor_lock);
-
ret = do_measurement(regmap, chan, mode, nsamples);
if (ret < 0) {
dev_err(dev, "Failed to perform measurement: %d\n", ret);
- goto error;
+ return ret;
}
ret = request_data(regmap, chan, &data);
if (ret < 0) {
dev_err(dev, "Failed to read measurement: %d\n", ret);
- goto error;
+ return ret;
}
*val = float_to_long(data, precision);
-
-error:
- mutex_unlock(&priv->sensor_lock);
-
- return ret;
+ return 0;
}
static int read_power(struct device *dev, int chan, long *val)
@@ -378,8 +368,6 @@ static int lochnagar_hwmon_probe(struct platform_device *pdev)
if (!priv)
return -ENOMEM;
- mutex_init(&priv->sensor_lock);
-
priv->regmap = dev_get_regmap(dev->parent, NULL);
if (!priv->regmap) {
dev_err(dev, "No register map found\n");
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 22/29] hwmon: (ltc4282) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (20 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 21/29] hwmon: (lochnagar-hwmon) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 14:07 ` Nuno Sá
2025-10-17 13:02 ` [PATCH 23/29] hwmon: (aquacomputer_d5next) " Guenter Roeck
` (6 subsequent siblings)
28 siblings, 1 reply; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/ltc4282.c | 32 ++++----------------------------
1 file changed, 4 insertions(+), 28 deletions(-)
diff --git a/drivers/hwmon/ltc4282.c b/drivers/hwmon/ltc4282.c
index 44102879694a..b9cad89f2cd9 100644
--- a/drivers/hwmon/ltc4282.c
+++ b/drivers/hwmon/ltc4282.c
@@ -17,7 +17,6 @@
#include <linux/minmax.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
-#include <linux/mutex.h>
#include <linux/regmap.h>
#include <linux/property.h>
#include <linux/string.h>
@@ -131,8 +130,6 @@ struct ltc4282_cache {
struct ltc4282_state {
struct regmap *map;
- /* Protect against multiple accesses to the device registers */
- struct mutex lock;
struct clk_hw clk_hw;
/*
* Used to cache values for VDD/VSOURCE depending which will be used
@@ -281,14 +278,12 @@ static int __ltc4282_read_alarm(struct ltc4282_state *st, u32 reg, u32 mask,
static int ltc4282_read_alarm(struct ltc4282_state *st, u32 reg, u32 mask,
long *val)
{
- guard(mutex)(&st->lock);
return __ltc4282_read_alarm(st, reg, mask, val);
}
static int ltc4282_vdd_source_read_in(struct ltc4282_state *st, u32 channel,
long *val)
{
- guard(mutex)(&st->lock);
if (!st->in0_1_cache[channel].en)
return -ENODATA;
@@ -300,7 +295,6 @@ static int ltc4282_vdd_source_read_hist(struct ltc4282_state *st, u32 reg,
{
int ret;
- guard(mutex)(&st->lock);
if (!st->in0_1_cache[channel].en) {
*val = *cached;
return 0;
@@ -317,7 +311,6 @@ static int ltc4282_vdd_source_read_hist(struct ltc4282_state *st, u32 reg,
static int ltc4282_vdd_source_read_lim(struct ltc4282_state *st, u32 reg,
u32 channel, u32 *cached, long *val)
{
- guard(mutex)(&st->lock);
if (!st->in0_1_cache[channel].en)
return ltc4282_read_voltage_byte_cached(st, reg, st->vfs_out,
val, cached);
@@ -328,7 +321,6 @@ static int ltc4282_vdd_source_read_lim(struct ltc4282_state *st, u32 reg,
static int ltc4282_vdd_source_read_alm(struct ltc4282_state *st, u32 mask,
u32 channel, long *val)
{
- guard(mutex)(&st->lock);
if (!st->in0_1_cache[channel].en) {
/*
* Do this otherwise alarms can get confused because we clear
@@ -412,9 +404,7 @@ static int ltc4282_read_in(struct ltc4282_state *st, u32 attr, long *val,
channel,
&st->in0_1_cache[channel].in_min_raw, val);
case hwmon_in_enable:
- scoped_guard(mutex, &st->lock) {
- *val = st->in0_1_cache[channel].en;
- }
+ *val = st->in0_1_cache[channel].en;
return 0;
case hwmon_in_fault:
/*
@@ -612,15 +602,11 @@ static int ltc4282_read(struct device *dev, enum hwmon_sensor_types type,
case hwmon_power:
return ltc4282_read_power(st, attr, val);
case hwmon_energy:
- scoped_guard(mutex, &st->lock) {
- *val = st->energy_en;
- }
+ *val = st->energy_en;
return 0;
case hwmon_energy64:
- scoped_guard(mutex, &st->lock) {
- if (st->energy_en)
- return ltc4282_read_energy(st, (s64 *)val);
- }
+ if (st->energy_en)
+ return ltc4282_read_energy(st, (s64 *)val);
return -ENODATA;
default:
return -EOPNOTSUPP;
@@ -688,7 +674,6 @@ static int __ltc4282_in_write_history(const struct ltc4282_state *st, u32 reg,
static int ltc4282_in_write_history(struct ltc4282_state *st, u32 reg,
long lowest, long highest, u32 fs)
{
- guard(mutex)(&st->lock);
return __ltc4282_in_write_history(st, reg, lowest, highest, fs);
}
@@ -696,8 +681,6 @@ static int ltc4282_power_reset_hist(struct ltc4282_state *st)
{
int ret;
- guard(mutex)(&st->lock);
-
ret = ltc4282_write_power_word(st, LTC4282_POWER_LOWEST,
st->power_max);
if (ret)
@@ -803,7 +786,6 @@ static int ltc4282_vdd_source_write_lim(struct ltc4282_state *st, u32 reg,
{
int ret;
- guard(mutex)(&st->lock);
if (st->in0_1_cache[channel].en)
ret = ltc4282_write_voltage_byte(st, reg, st->vfs_out, val);
else
@@ -821,7 +803,6 @@ static int ltc4282_vdd_source_reset_hist(struct ltc4282_state *st, int channel)
if (channel == LTC4282_CHAN_VDD)
lowest = st->vdd;
- guard(mutex)(&st->lock);
if (st->in0_1_cache[channel].en) {
ret = __ltc4282_in_write_history(st, LTC4282_VSOURCE_LOWEST,
lowest, 0, st->vfs_out);
@@ -861,7 +842,6 @@ static int ltc4282_vdd_source_enable(struct ltc4282_state *st, int channel,
int ret, other_chan = ~channel & 0x1;
u8 __val = val;
- guard(mutex)(&st->lock);
if (st->in0_1_cache[channel].en == !!val)
return 0;
@@ -938,8 +918,6 @@ static int ltc4282_curr_reset_hist(struct ltc4282_state *st)
{
int ret;
- guard(mutex)(&st->lock);
-
ret = __ltc4282_in_write_history(st, LTC4282_VSENSE_LOWEST,
st->vsense_max, 0, 40 * MILLI);
if (ret)
@@ -974,7 +952,6 @@ static int ltc4282_energy_enable_set(struct ltc4282_state *st, long val)
{
int ret;
- guard(mutex)(&st->lock);
/* setting the bit halts the meter */
ret = regmap_update_bits(st->map, LTC4282_ADC_CTRL,
LTC4282_METER_HALT_MASK,
@@ -1699,7 +1676,6 @@ static int ltc4282_probe(struct i2c_client *i2c)
if (ret)
return ret;
- mutex_init(&st->lock);
hwmon = devm_hwmon_device_register_with_info(dev, "ltc4282", st,
<c4282_chip_info, NULL);
if (IS_ERR(hwmon))
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* Re: [PATCH 22/29] hwmon: (ltc4282) Rely on subsystem locking
2025-10-17 13:02 ` [PATCH 22/29] hwmon: (ltc4282) " Guenter Roeck
@ 2025-10-17 14:07 ` Nuno Sá
0 siblings, 0 replies; 34+ messages in thread
From: Nuno Sá @ 2025-10-17 14:07 UTC (permalink / raw)
To: Guenter Roeck, Hardware Monitoring
On Fri, 2025-10-17 at 06:02 -0700, Guenter Roeck wrote:
> Attribute access is now serialized in the hardware monitoring core,
> so locking in the driver code is no longer necessary. Drop it.
>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
> drivers/hwmon/ltc4282.c | 32 ++++----------------------------
> 1 file changed, 4 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/hwmon/ltc4282.c b/drivers/hwmon/ltc4282.c
> index 44102879694a..b9cad89f2cd9 100644
> --- a/drivers/hwmon/ltc4282.c
> +++ b/drivers/hwmon/ltc4282.c
> @@ -17,7 +17,6 @@
> #include <linux/minmax.h>
> #include <linux/module.h>
> #include <linux/mod_devicetable.h>
> -#include <linux/mutex.h>
> #include <linux/regmap.h>
> #include <linux/property.h>
> #include <linux/string.h>
> @@ -131,8 +130,6 @@ struct ltc4282_cache {
>
> struct ltc4282_state {
> struct regmap *map;
> - /* Protect against multiple accesses to the device registers */
> - struct mutex lock;
> struct clk_hw clk_hw;
> /*
> * Used to cache values for VDD/VSOURCE depending which will be used
> @@ -281,14 +278,12 @@ static int __ltc4282_read_alarm(struct ltc4282_state
> *st, u32 reg, u32 mask,
> static int ltc4282_read_alarm(struct ltc4282_state *st, u32 reg, u32 mask,
> long *val)
> {
> - guard(mutex)(&st->lock);
> return __ltc4282_read_alarm(st, reg, mask, val);
> }
>
> static int ltc4282_vdd_source_read_in(struct ltc4282_state *st, u32 channel,
> long *val)
> {
> - guard(mutex)(&st->lock);
> if (!st->in0_1_cache[channel].en)
> return -ENODATA;
>
> @@ -300,7 +295,6 @@ static int ltc4282_vdd_source_read_hist(struct
> ltc4282_state *st, u32 reg,
> {
> int ret;
>
> - guard(mutex)(&st->lock);
> if (!st->in0_1_cache[channel].en) {
> *val = *cached;
> return 0;
> @@ -317,7 +311,6 @@ static int ltc4282_vdd_source_read_hist(struct
> ltc4282_state *st, u32 reg,
> static int ltc4282_vdd_source_read_lim(struct ltc4282_state *st, u32 reg,
> u32 channel, u32 *cached, long *val)
> {
> - guard(mutex)(&st->lock);
> if (!st->in0_1_cache[channel].en)
> return ltc4282_read_voltage_byte_cached(st, reg, st->vfs_out,
> val, cached);
> @@ -328,7 +321,6 @@ static int ltc4282_vdd_source_read_lim(struct
> ltc4282_state *st, u32 reg,
> static int ltc4282_vdd_source_read_alm(struct ltc4282_state *st, u32 mask,
> u32 channel, long *val)
> {
> - guard(mutex)(&st->lock);
> if (!st->in0_1_cache[channel].en) {
> /*
> * Do this otherwise alarms can get confused because we clear
> @@ -412,9 +404,7 @@ static int ltc4282_read_in(struct ltc4282_state *st, u32
> attr, long *val,
> channel,
> &st-
> >in0_1_cache[channel].in_min_raw, val);
> case hwmon_in_enable:
> - scoped_guard(mutex, &st->lock) {
> - *val = st->in0_1_cache[channel].en;
> - }
> + *val = st->in0_1_cache[channel].en;
> return 0;
> case hwmon_in_fault:
> /*
> @@ -612,15 +602,11 @@ static int ltc4282_read(struct device *dev, enum
> hwmon_sensor_types type,
> case hwmon_power:
> return ltc4282_read_power(st, attr, val);
> case hwmon_energy:
> - scoped_guard(mutex, &st->lock) {
> - *val = st->energy_en;
> - }
> + *val = st->energy_en;
> return 0;
> case hwmon_energy64:
> - scoped_guard(mutex, &st->lock) {
> - if (st->energy_en)
> - return ltc4282_read_energy(st, (s64 *)val);
> - }
> + if (st->energy_en)
> + return ltc4282_read_energy(st, (s64 *)val);
> return -ENODATA;
> default:
> return -EOPNOTSUPP;
> @@ -688,7 +674,6 @@ static int __ltc4282_in_write_history(const struct
> ltc4282_state *st, u32 reg,
> static int ltc4282_in_write_history(struct ltc4282_state *st, u32 reg,
> long lowest, long highest, u32 fs)
> {
> - guard(mutex)(&st->lock);
> return __ltc4282_in_write_history(st, reg, lowest, highest, fs);
> }
>
> @@ -696,8 +681,6 @@ static int ltc4282_power_reset_hist(struct ltc4282_state
> *st)
> {
> int ret;
>
> - guard(mutex)(&st->lock);
> -
> ret = ltc4282_write_power_word(st, LTC4282_POWER_LOWEST,
> st->power_max);
> if (ret)
> @@ -803,7 +786,6 @@ static int ltc4282_vdd_source_write_lim(struct
> ltc4282_state *st, u32 reg,
> {
> int ret;
>
> - guard(mutex)(&st->lock);
> if (st->in0_1_cache[channel].en)
> ret = ltc4282_write_voltage_byte(st, reg, st->vfs_out, val);
> else
> @@ -821,7 +803,6 @@ static int ltc4282_vdd_source_reset_hist(struct
> ltc4282_state *st, int channel)
> if (channel == LTC4282_CHAN_VDD)
> lowest = st->vdd;
>
> - guard(mutex)(&st->lock);
> if (st->in0_1_cache[channel].en) {
> ret = __ltc4282_in_write_history(st, LTC4282_VSOURCE_LOWEST,
> lowest, 0, st->vfs_out);
> @@ -861,7 +842,6 @@ static int ltc4282_vdd_source_enable(struct ltc4282_state
> *st, int channel,
> int ret, other_chan = ~channel & 0x1;
> u8 __val = val;
>
> - guard(mutex)(&st->lock);
> if (st->in0_1_cache[channel].en == !!val)
> return 0;
>
> @@ -938,8 +918,6 @@ static int ltc4282_curr_reset_hist(struct ltc4282_state
> *st)
> {
> int ret;
>
> - guard(mutex)(&st->lock);
> -
> ret = __ltc4282_in_write_history(st, LTC4282_VSENSE_LOWEST,
> st->vsense_max, 0, 40 * MILLI);
> if (ret)
> @@ -974,7 +952,6 @@ static int ltc4282_energy_enable_set(struct ltc4282_state
> *st, long val)
> {
> int ret;
>
> - guard(mutex)(&st->lock);
> /* setting the bit halts the meter */
> ret = regmap_update_bits(st->map, LTC4282_ADC_CTRL,
> LTC4282_METER_HALT_MASK,
> @@ -1699,7 +1676,6 @@ static int ltc4282_probe(struct i2c_client *i2c)
> if (ret)
> return ret;
>
> - mutex_init(&st->lock);
> hwmon = devm_hwmon_device_register_with_info(dev, "ltc4282", st,
> <c4282_chip_info,
> NULL);
> if (IS_ERR(hwmon))
^ permalink raw reply [flat|nested] 34+ messages in thread
* [PATCH 23/29] hwmon: (aquacomputer_d5next) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (21 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 22/29] hwmon: (ltc4282) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 24/29] hwmon: (gpd-fan) " Guenter Roeck
` (5 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/aquacomputer_d5next.c | 37 +++++------------------------
1 file changed, 6 insertions(+), 31 deletions(-)
diff --git a/drivers/hwmon/aquacomputer_d5next.c b/drivers/hwmon/aquacomputer_d5next.c
index 0dcb8a3a691d..1ca70e726298 100644
--- a/drivers/hwmon/aquacomputer_d5next.c
+++ b/drivers/hwmon/aquacomputer_d5next.c
@@ -20,7 +20,6 @@
#include <linux/jiffies.h>
#include <linux/ktime.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/seq_file.h>
#include <linux/unaligned.h>
@@ -551,7 +550,6 @@ struct aqc_data {
struct hid_device *hdev;
struct device *hwmon_dev;
struct dentry *debugfs;
- struct mutex mutex; /* Used for locking access when reading and writing PWM values */
enum kinds kind;
const char *name;
@@ -662,7 +660,6 @@ static void aqc_delay_ctrl_report(struct aqc_data *priv)
}
}
-/* Expects the mutex to be locked */
static int aqc_get_ctrl_data(struct aqc_data *priv)
{
int ret;
@@ -680,7 +677,6 @@ static int aqc_get_ctrl_data(struct aqc_data *priv)
return ret;
}
-/* Expects the mutex to be locked */
static int aqc_send_ctrl_data(struct aqc_data *priv)
{
int ret;
@@ -721,11 +717,9 @@ static int aqc_get_ctrl_val(struct aqc_data *priv, int offset, long *val, int ty
{
int ret;
- mutex_lock(&priv->mutex);
-
ret = aqc_get_ctrl_data(priv);
if (ret < 0)
- goto unlock_and_return;
+ return ret;
switch (type) {
case AQC_BE16:
@@ -737,9 +731,6 @@ static int aqc_get_ctrl_val(struct aqc_data *priv, int offset, long *val, int ty
default:
ret = -EINVAL;
}
-
-unlock_and_return:
- mutex_unlock(&priv->mutex);
return ret;
}
@@ -747,11 +738,9 @@ static int aqc_set_ctrl_vals(struct aqc_data *priv, int *offsets, long *vals, in
{
int ret, i;
- mutex_lock(&priv->mutex);
-
ret = aqc_get_ctrl_data(priv);
if (ret < 0)
- goto unlock_and_return;
+ return ret;
for (i = 0; i < len; i++) {
switch (types[i]) {
@@ -762,18 +751,11 @@ static int aqc_set_ctrl_vals(struct aqc_data *priv, int *offsets, long *vals, in
priv->buffer[offsets[i]] = (u8)vals[i];
break;
default:
- ret = -EINVAL;
+ return -EINVAL;
}
}
- if (ret < 0)
- goto unlock_and_return;
-
- ret = aqc_send_ctrl_data(priv);
-
-unlock_and_return:
- mutex_unlock(&priv->mutex);
- return ret;
+ return aqc_send_ctrl_data(priv);
}
static int aqc_set_ctrl_val(struct aqc_data *priv, int offset, long val, int type)
@@ -953,13 +935,11 @@ static int aqc_legacy_read(struct aqc_data *priv)
{
int ret, i, sensor_value;
- mutex_lock(&priv->mutex);
-
memset(priv->buffer, 0x00, priv->buffer_size);
ret = hid_hw_raw_request(priv->hdev, priv->status_report_id, priv->buffer,
priv->buffer_size, HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
if (ret < 0)
- goto unlock_and_return;
+ return ret;
/* Temperature sensor readings */
for (i = 0; i < priv->num_temp_sensors; i++) {
@@ -1020,10 +1000,7 @@ static int aqc_legacy_read(struct aqc_data *priv)
}
priv->updated = jiffies;
-
-unlock_and_return:
- mutex_unlock(&priv->mutex);
- return ret;
+ return 0;
}
static int aqc_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
@@ -1870,8 +1847,6 @@ static int aqc_probe(struct hid_device *hdev, const struct hid_device_id *id)
goto fail_and_close;
}
- mutex_init(&priv->mutex);
-
priv->hwmon_dev = hwmon_device_register_with_info(&hdev->dev, priv->name, priv,
&aqc_chip_info, NULL);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 24/29] hwmon: (gpd-fan) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (22 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 23/29] hwmon: (aquacomputer_d5next) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 25/29] hwmon: (i5500_temp) Drop unnecessary include files Guenter Roeck
` (4 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/gpd-fan.c | 56 ++++++++++-------------------------------
1 file changed, 13 insertions(+), 43 deletions(-)
diff --git a/drivers/hwmon/gpd-fan.c b/drivers/hwmon/gpd-fan.c
index 644dc3ca9df7..57caae9a23eb 100644
--- a/drivers/hwmon/gpd-fan.c
+++ b/drivers/hwmon/gpd-fan.c
@@ -26,9 +26,6 @@
static char *gpd_fan_board = "";
module_param(gpd_fan_board, charp, 0444);
-// EC read/write locker, protecting a sequence of EC operations
-static DEFINE_MUTEX(gpd_fan_sequence_lock);
-
enum gpd_board {
win_mini,
win4_6800u,
@@ -507,87 +504,60 @@ static int gpd_fan_hwmon_read(__always_unused struct device *dev,
{
int ret;
- ret = mutex_lock_interruptible(&gpd_fan_sequence_lock);
- if (ret)
- return ret;
-
if (type == hwmon_fan) {
if (attr == hwmon_fan_input) {
ret = gpd_read_rpm();
if (ret < 0)
- goto OUT;
+ return ret;
*val = ret;
- ret = 0;
- goto OUT;
+ return 0;
}
} else if (type == hwmon_pwm) {
switch (attr) {
case hwmon_pwm_enable:
*val = gpd_driver_priv.pwm_enable;
- ret = 0;
- goto OUT;
+ return 0;
case hwmon_pwm_input:
ret = gpd_read_pwm();
if (ret < 0)
- goto OUT;
+ return ret;
*val = ret;
- ret = 0;
- goto OUT;
+ return 0;
}
}
- ret = -EOPNOTSUPP;
-
-OUT:
- mutex_unlock(&gpd_fan_sequence_lock);
- return ret;
+ return -EOPNOTSUPP;
}
static int gpd_fan_hwmon_write(__always_unused struct device *dev,
enum hwmon_sensor_types type, u32 attr,
__always_unused int channel, long val)
{
- int ret;
-
- ret = mutex_lock_interruptible(&gpd_fan_sequence_lock);
- if (ret)
- return ret;
-
if (type == hwmon_pwm) {
switch (attr) {
case hwmon_pwm_enable:
- if (!in_range(val, 0, 3)) {
- ret = -EINVAL;
- goto OUT;
- }
+ if (!in_range(val, 0, 3))
+ return -EINVAL;
gpd_driver_priv.pwm_enable = val;
gpd_set_pwm_enable(gpd_driver_priv.pwm_enable);
- ret = 0;
- goto OUT;
+ return 0;
case hwmon_pwm_input:
- if (!in_range(val, 0, 256)) {
- ret = -ERANGE;
- goto OUT;
- }
+ if (!in_range(val, 0, 256))
+ return -EINVAL;
gpd_driver_priv.pwm_value = val;
- ret = gpd_write_pwm(val);
- goto OUT;
+ return gpd_write_pwm(val);
}
}
- ret = -EOPNOTSUPP;
-
-OUT:
- mutex_unlock(&gpd_fan_sequence_lock);
- return ret;
+ return -EOPNOTSUPP;
}
static const struct hwmon_ops gpd_fan_ops = {
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 25/29] hwmon: (i5500_temp) Drop unnecessary include files
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (23 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 24/29] hwmon: (gpd-fan) " Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 26/29] hwmon: (asus_rog_ryujin) Rely on subsystem locking Guenter Roeck
` (3 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
The driver does not perform any locking, does not execute or use any sleep
related functionality, and does not allocate memory. Drop the unnecessary
include files.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/i5500_temp.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/hwmon/i5500_temp.c b/drivers/hwmon/i5500_temp.c
index 2a530da21949..bf006cb272b1 100644
--- a/drivers/hwmon/i5500_temp.c
+++ b/drivers/hwmon/i5500_temp.c
@@ -8,13 +8,10 @@
#include <linux/bitops.h>
#include <linux/module.h>
#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/jiffies.h>
#include <linux/device.h>
#include <linux/pci.h>
#include <linux/hwmon.h>
#include <linux/err.h>
-#include <linux/mutex.h>
/* Register definitions from datasheet */
#define REG_TSTHRCATA 0xE2
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 26/29] hwmon: (asus_rog_ryujin) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (24 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 25/29] hwmon: (i5500_temp) Drop unnecessary include files Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 27/29] hwmon: (chipcap2) Drop unnecessary include files Guenter Roeck
` (2 subsequent siblings)
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/asus_rog_ryujin.c | 48 +++++++--------------------------
1 file changed, 9 insertions(+), 39 deletions(-)
diff --git a/drivers/hwmon/asus_rog_ryujin.c b/drivers/hwmon/asus_rog_ryujin.c
index e5e93a20723c..10a1f5aca988 100644
--- a/drivers/hwmon/asus_rog_ryujin.c
+++ b/drivers/hwmon/asus_rog_ryujin.c
@@ -81,10 +81,6 @@ static const char *const rog_ryujin_speed_label[] = {
struct rog_ryujin_data {
struct hid_device *hdev;
struct device *hwmon_dev;
- /* For locking access to buffer */
- struct mutex buffer_lock;
- /* For queueing multiple readers */
- struct mutex status_report_request_mutex;
/* For reinitializing the completions below */
spinlock_t status_report_request_lock;
struct completion cooler_status_received;
@@ -153,18 +149,10 @@ static umode_t rog_ryujin_is_visible(const void *data,
/* Writes the command to the device with the rest of the report filled with zeroes */
static int rog_ryujin_write_expanded(struct rog_ryujin_data *priv, const u8 *cmd, int cmd_length)
{
- int ret;
-
- mutex_lock(&priv->buffer_lock);
-
memcpy_and_pad(priv->buffer, MAX_REPORT_LENGTH, cmd, cmd_length, 0x00);
- ret = hid_hw_output_report(priv->hdev, priv->buffer, MAX_REPORT_LENGTH);
-
- mutex_unlock(&priv->buffer_lock);
- return ret;
+ return hid_hw_output_report(priv->hdev, priv->buffer, MAX_REPORT_LENGTH);
}
-/* Assumes priv->status_report_request_mutex is locked */
static int rog_ryujin_execute_cmd(struct rog_ryujin_data *priv, const u8 *cmd, int cmd_length,
struct completion *status_completion)
{
@@ -196,14 +184,11 @@ static int rog_ryujin_execute_cmd(struct rog_ryujin_data *priv, const u8 *cmd, i
static int rog_ryujin_get_status(struct rog_ryujin_data *priv)
{
- int ret = mutex_lock_interruptible(&priv->status_report_request_mutex);
-
- if (ret < 0)
- return ret;
+ int ret;
if (!time_after(jiffies, priv->updated + msecs_to_jiffies(STATUS_VALIDITY))) {
/* Data is up to date */
- goto unlock_and_return;
+ return 0;
}
/* Retrieve cooler status */
@@ -211,36 +196,30 @@ static int rog_ryujin_get_status(struct rog_ryujin_data *priv)
rog_ryujin_execute_cmd(priv, get_cooler_status_cmd, GET_CMD_LENGTH,
&priv->cooler_status_received);
if (ret < 0)
- goto unlock_and_return;
+ return ret;
/* Retrieve controller status (speeds) */
ret =
rog_ryujin_execute_cmd(priv, get_controller_speed_cmd, GET_CMD_LENGTH,
&priv->controller_status_received);
if (ret < 0)
- goto unlock_and_return;
+ return ret;
/* Retrieve cooler duty */
ret =
rog_ryujin_execute_cmd(priv, get_cooler_duty_cmd, GET_CMD_LENGTH,
&priv->cooler_duty_received);
if (ret < 0)
- goto unlock_and_return;
+ return ret;
/* Retrieve controller duty */
ret =
rog_ryujin_execute_cmd(priv, get_controller_duty_cmd, GET_CMD_LENGTH,
&priv->controller_duty_received);
- if (ret < 0)
- goto unlock_and_return;
-
- priv->updated = jiffies;
-
-unlock_and_return:
- mutex_unlock(&priv->status_report_request_mutex);
if (ret < 0)
return ret;
+ priv->updated = jiffies;
return 0;
}
@@ -303,14 +282,11 @@ static int rog_ryujin_write_fixed_duty(struct rog_ryujin_data *priv, int channel
* Retrieve cooler duty since both pump and internal fan are set
* together, then write back with one of them modified.
*/
- ret = mutex_lock_interruptible(&priv->status_report_request_mutex);
- if (ret < 0)
- return ret;
ret =
rog_ryujin_execute_cmd(priv, get_cooler_duty_cmd, GET_CMD_LENGTH,
&priv->cooler_duty_received);
if (ret < 0)
- goto unlock_and_return;
+ return ret;
memcpy(set_cmd, set_cooler_duty_cmd, SET_CMD_LENGTH);
@@ -329,11 +305,7 @@ static int rog_ryujin_write_fixed_duty(struct rog_ryujin_data *priv, int channel
set_cmd[RYUJIN_SET_COOLER_FAN_DUTY_OFFSET] = val;
}
- ret = rog_ryujin_execute_cmd(priv, set_cmd, SET_CMD_LENGTH, &priv->cooler_duty_set);
-unlock_and_return:
- mutex_unlock(&priv->status_report_request_mutex);
- if (ret < 0)
- return ret;
+ return rog_ryujin_execute_cmd(priv, set_cmd, SET_CMD_LENGTH, &priv->cooler_duty_set);
} else {
/*
* Controller fan duty (channel == 2). No need to retrieve current
@@ -538,8 +510,6 @@ static int rog_ryujin_probe(struct hid_device *hdev, const struct hid_device_id
goto fail_and_close;
}
- mutex_init(&priv->status_report_request_mutex);
- mutex_init(&priv->buffer_lock);
spin_lock_init(&priv->status_report_request_lock);
init_completion(&priv->cooler_status_received);
init_completion(&priv->controller_status_received);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 27/29] hwmon: (chipcap2) Drop unnecessary include files
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (25 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 26/29] hwmon: (asus_rog_ryujin) Rely on subsystem locking Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 28/29] hwmon: (corsair-psu) Rely on subsystem locking Guenter Roeck
2025-10-17 13:02 ` [PATCH 29/29] " Guenter Roeck
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
The driver does not perform any locking, does not execute or use any sleep
related functionality, and does not allocate memory. Drop the unnecessary
include files.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/chipcap2.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/hwmon/chipcap2.c b/drivers/hwmon/chipcap2.c
index 9d071f7ca9d2..645b8c2e704e 100644
--- a/drivers/hwmon/chipcap2.c
+++ b/drivers/hwmon/chipcap2.c
@@ -81,7 +81,6 @@ struct cc2_data {
struct completion complete;
struct device *hwmon;
struct i2c_client *client;
- struct mutex dev_access_lock; /* device access lock */
struct regulator *regulator;
const char *name;
int irq_ready;
@@ -558,8 +557,6 @@ static int cc2_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
{
struct cc2_data *data = dev_get_drvdata(dev);
- guard(mutex)(&data->dev_access_lock);
-
switch (type) {
case hwmon_temp:
return cc2_measurement(data, type, val);
@@ -600,8 +597,6 @@ static int cc2_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
if (val < 0 || val > CC2_RH_MAX)
return -EINVAL;
- guard(mutex)(&data->dev_access_lock);
-
switch (attr) {
case hwmon_humidity_min:
cmd = CC2_W_ALARM_L_ON;
@@ -708,8 +703,6 @@ static int cc2_probe(struct i2c_client *client)
i2c_set_clientdata(client, data);
- mutex_init(&data->dev_access_lock);
-
data->client = client;
data->regulator = devm_regulator_get_exclusive(dev, "vdd");
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 28/29] hwmon: (corsair-psu) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (26 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 27/29] hwmon: (chipcap2) Drop unnecessary include files Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
2025-10-17 13:02 ` [PATCH 29/29] " Guenter Roeck
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/corsair-psu.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/drivers/hwmon/corsair-psu.c b/drivers/hwmon/corsair-psu.c
index 6b5c8f200780..dddbd2463f8d 100644
--- a/drivers/hwmon/corsair-psu.c
+++ b/drivers/hwmon/corsair-psu.c
@@ -9,11 +9,9 @@
#include <linux/errno.h>
#include <linux/hid.h>
#include <linux/hwmon.h>
-#include <linux/hwmon-sysfs.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/types.h>
@@ -124,7 +122,6 @@ struct corsairpsu_data {
struct device *hwmon_dev;
struct dentry *debugfs;
struct completion wait_completion;
- struct mutex lock; /* for locking access to cmd_buffer */
u8 *cmd_buffer;
char vendor[REPLY_SIZE];
char product[REPLY_SIZE];
@@ -220,7 +217,6 @@ static int corsairpsu_request(struct corsairpsu_data *priv, u8 cmd, u8 rail, voi
{
int ret;
- mutex_lock(&priv->lock);
switch (cmd) {
case PSU_CMD_RAIL_VOLTS_HCRIT:
case PSU_CMD_RAIL_VOLTS_LCRIT:
@@ -230,17 +226,13 @@ static int corsairpsu_request(struct corsairpsu_data *priv, u8 cmd, u8 rail, voi
case PSU_CMD_RAIL_WATTS:
ret = corsairpsu_usb_cmd(priv, 2, PSU_CMD_SELECT_RAIL, rail, NULL);
if (ret < 0)
- goto cmd_fail;
+ return ret;
break;
default:
break;
}
- ret = corsairpsu_usb_cmd(priv, 3, cmd, 0, data);
-
-cmd_fail:
- mutex_unlock(&priv->lock);
- return ret;
+ return corsairpsu_usb_cmd(priv, 3, cmd, 0, data);
}
static int corsairpsu_get_value(struct corsairpsu_data *priv, u8 cmd, u8 rail, long *val)
@@ -797,7 +789,6 @@ static int corsairpsu_probe(struct hid_device *hdev, const struct hid_device_id
priv->hdev = hdev;
hid_set_drvdata(hdev, priv);
- mutex_init(&priv->lock);
init_completion(&priv->wait_completion);
hid_device_io_start(hdev);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread* [PATCH 29/29] hwmon: (corsair-psu) Rely on subsystem locking
2025-10-17 13:01 [PATCH 00/29] hwmon: Rely on subsystem locking [set 2] Guenter Roeck
` (27 preceding siblings ...)
2025-10-17 13:02 ` [PATCH 28/29] hwmon: (corsair-psu) Rely on subsystem locking Guenter Roeck
@ 2025-10-17 13:02 ` Guenter Roeck
28 siblings, 0 replies; 34+ messages in thread
From: Guenter Roeck @ 2025-10-17 13:02 UTC (permalink / raw)
To: Hardware Monitoring; +Cc: Guenter Roeck
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
drivers/hwmon/npcm750-pwm-fan.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/drivers/hwmon/npcm750-pwm-fan.c b/drivers/hwmon/npcm750-pwm-fan.c
index 802c73def428..c8f5e695fb6d 100644
--- a/drivers/hwmon/npcm750-pwm-fan.c
+++ b/drivers/hwmon/npcm750-pwm-fan.c
@@ -4,7 +4,6 @@
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/hwmon.h>
-#include <linux/hwmon-sysfs.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/module.h>
@@ -198,7 +197,6 @@ struct npcm7xx_pwm_fan_data {
int pwm_modules;
struct clk *pwm_clk;
struct clk *fan_clk;
- struct mutex pwm_lock[NPCM7XX_PWM_MAX_MODULES];
spinlock_t fan_lock[NPCM7XX_FAN_MAX_MODULE];
int fan_irq[NPCM7XX_FAN_MAX_MODULE];
bool pwm_present[NPCM7XX_PWM_MAX_CHN_NUM];
@@ -221,7 +219,6 @@ static int npcm7xx_pwm_config_set(struct npcm7xx_pwm_fan_data *data,
/*
* Config PWM Comparator register for setting duty cycle
*/
- mutex_lock(&data->pwm_lock[module]);
/* write new CMR value */
iowrite32(val, NPCM7XX_PWM_REG_CMRx(data->pwm_base, module, pwm_ch));
@@ -245,7 +242,6 @@ static int npcm7xx_pwm_config_set(struct npcm7xx_pwm_fan_data *data,
env_bit = NPCM7XX_PWM_CTRL_CH3_INV_BIT;
break;
default:
- mutex_unlock(&data->pwm_lock[module]);
return -ENODEV;
}
@@ -260,8 +256,6 @@ static int npcm7xx_pwm_config_set(struct npcm7xx_pwm_fan_data *data,
}
iowrite32(tmp_buf, NPCM7XX_PWM_REG_CR(data->pwm_base, module));
- mutex_unlock(&data->pwm_lock[module]);
-
return 0;
}
@@ -932,8 +926,8 @@ static int npcm7xx_pwm_fan_probe(struct platform_device *pdev)
struct resource *res;
struct device *hwmon;
char name[20];
- int ret, cnt;
u32 output_freq;
+ int ret;
u32 i;
np = dev->of_node;
@@ -985,9 +979,6 @@ static int npcm7xx_pwm_fan_probe(struct platform_device *pdev)
output_freq = npcm7xx_pwm_init(data);
npcm7xx_fan_init(data);
- for (cnt = 0; cnt < data->pwm_modules; cnt++)
- mutex_init(&data->pwm_lock[cnt]);
-
for (i = 0; i < NPCM7XX_FAN_MAX_MODULE; i++) {
spin_lock_init(&data->fan_lock[i]);
--
2.45.2
^ permalink raw reply related [flat|nested] 34+ messages in thread