summaryrefslogtreecommitdiff
path: root/drivers/hwmon/nct7802.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/nct7802.c')
-rw-r--r--drivers/hwmon/nct7802.c71
1 files changed, 26 insertions, 45 deletions
diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c
index a0e664d5ebfe..8c9351da12c6 100644
--- a/drivers/hwmon/nct7802.c
+++ b/drivers/hwmon/nct7802.c
@@ -229,41 +229,34 @@ abort:
static int nct7802_read_fan(struct nct7802_data *data, u8 reg_fan)
{
- unsigned int f1, f2;
+ unsigned int regs[2] = {reg_fan, REG_FANCOUNT_LOW};
+ u8 f[2];
int ret;
- mutex_lock(&data->access_lock);
- ret = regmap_read(data->regmap, reg_fan, &f1);
- if (ret < 0)
- goto abort;
- ret = regmap_read(data->regmap, REG_FANCOUNT_LOW, &f2);
- if (ret < 0)
- goto abort;
- ret = (f1 << 5) | (f2 >> 3);
+ ret = regmap_multi_reg_read(data->regmap, regs, f, 2);
+ if (ret)
+ return ret;
+ ret = (f[0] << 5) | (f[1] >> 3);
/* convert fan count to rpm */
if (ret == 0x1fff) /* maximum value, assume fan is stopped */
ret = 0;
else if (ret)
ret = DIV_ROUND_CLOSEST(1350000U, ret);
-abort:
- mutex_unlock(&data->access_lock);
return ret;
}
static int nct7802_read_fan_min(struct nct7802_data *data, u8 reg_fan_low,
u8 reg_fan_high)
{
- unsigned int f1, f2;
+ unsigned int regs[2] = {reg_fan_low, reg_fan_high};
+ u8 f[2];
int ret;
- mutex_lock(&data->access_lock);
- ret = regmap_read(data->regmap, reg_fan_low, &f1);
- if (ret < 0)
- goto abort;
- ret = regmap_read(data->regmap, reg_fan_high, &f2);
+ ret = regmap_multi_reg_read(data->regmap, regs, f, 2);
if (ret < 0)
- goto abort;
- ret = f1 | ((f2 & 0xf8) << 5);
+ return ret;
+
+ ret = f[0] | ((f[1] & 0xf8) << 5);
/* convert fan count to rpm */
if (ret == 0x1fff) /* maximum value, assume no limit */
ret = 0;
@@ -271,8 +264,6 @@ static int nct7802_read_fan_min(struct nct7802_data *data, u8 reg_fan_low,
ret = DIV_ROUND_CLOSEST(1350000U, ret);
else
ret = 1350000U;
-abort:
- mutex_unlock(&data->access_lock);
return ret;
}
@@ -302,33 +293,26 @@ static u8 nct7802_vmul[] = { 4, 2, 2, 2, 2 };
static int nct7802_read_voltage(struct nct7802_data *data, int nr, int index)
{
- unsigned int v1, v2;
+ u8 v[2];
int ret;
- mutex_lock(&data->access_lock);
if (index == 0) { /* voltage */
- ret = regmap_read(data->regmap, REG_VOLTAGE[nr], &v1);
- if (ret < 0)
- goto abort;
- ret = regmap_read(data->regmap, REG_VOLTAGE_LOW, &v2);
+ unsigned int regs[2] = {REG_VOLTAGE[nr], REG_VOLTAGE_LOW};
+
+ ret = regmap_multi_reg_read(data->regmap, regs, v, 2);
if (ret < 0)
- goto abort;
- ret = ((v1 << 2) | (v2 >> 6)) * nct7802_vmul[nr];
+ return ret;
+ ret = ((v[0] << 2) | (v[1] >> 6)) * nct7802_vmul[nr];
} else { /* limit */
int shift = 8 - REG_VOLTAGE_LIMIT_MSB_SHIFT[index - 1][nr];
+ unsigned int regs[2] = {REG_VOLTAGE_LIMIT_LSB[index - 1][nr],
+ REG_VOLTAGE_LIMIT_MSB[nr]};
- ret = regmap_read(data->regmap,
- REG_VOLTAGE_LIMIT_LSB[index - 1][nr], &v1);
- if (ret < 0)
- goto abort;
- ret = regmap_read(data->regmap, REG_VOLTAGE_LIMIT_MSB[nr],
- &v2);
+ ret = regmap_multi_reg_read(data->regmap, regs, v, 2);
if (ret < 0)
- goto abort;
- ret = (v1 | ((v2 << shift) & 0x300)) * nct7802_vmul[nr];
+ return ret;
+ ret = (v[0] | ((v[1] << shift) & 0x300)) * nct7802_vmul[nr];
}
-abort:
- mutex_unlock(&data->access_lock);
return ret;
}
@@ -1145,17 +1129,14 @@ static int nct7802_configure_channels(struct device *dev,
{
/* Enable local temperature sensor by default */
u8 mode_mask = MODE_LTD_EN, mode_val = MODE_LTD_EN;
- struct device_node *node;
int err;
if (dev->of_node) {
- for_each_child_of_node(dev->of_node, node) {
+ for_each_child_of_node_scoped(dev->of_node, node) {
err = nct7802_get_channel_config(dev, node, &mode_mask,
&mode_val);
- if (err) {
- of_node_put(node);
+ if (err)
return err;
- }
}
}
@@ -1212,7 +1193,7 @@ static const unsigned short nct7802_address_list[] = {
};
static const struct i2c_device_id nct7802_idtable[] = {
- { "nct7802", 0 },
+ { "nct7802" },
{ }
};
MODULE_DEVICE_TABLE(i2c, nct7802_idtable);