mirror of https://github.com/torvalds/linux.git
hwmon: (max31790) Rely on subsystem locking
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>
This commit is contained in:
parent
06c38a5878
commit
578652bef0
|
|
@ -57,7 +57,6 @@
|
||||||
*/
|
*/
|
||||||
struct max31790_data {
|
struct max31790_data {
|
||||||
struct i2c_client *client;
|
struct i2c_client *client;
|
||||||
struct mutex update_lock;
|
|
||||||
bool valid; /* zero until following fields are valid */
|
bool valid; /* zero until following fields are valid */
|
||||||
unsigned long last_updated; /* in jiffies */
|
unsigned long last_updated; /* in jiffies */
|
||||||
|
|
||||||
|
|
@ -74,30 +73,27 @@ static struct max31790_data *max31790_update_device(struct device *dev)
|
||||||
{
|
{
|
||||||
struct max31790_data *data = dev_get_drvdata(dev);
|
struct max31790_data *data = dev_get_drvdata(dev);
|
||||||
struct i2c_client *client = data->client;
|
struct i2c_client *client = data->client;
|
||||||
struct max31790_data *ret = data;
|
int i, rv;
|
||||||
int i;
|
|
||||||
int rv;
|
|
||||||
|
|
||||||
mutex_lock(&data->update_lock);
|
|
||||||
|
|
||||||
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
|
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
|
||||||
|
data->valid = false;
|
||||||
rv = i2c_smbus_read_byte_data(client,
|
rv = i2c_smbus_read_byte_data(client,
|
||||||
MAX31790_REG_FAN_FAULT_STATUS1);
|
MAX31790_REG_FAN_FAULT_STATUS1);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto abort;
|
return ERR_PTR(rv);
|
||||||
data->fault_status |= rv & 0x3F;
|
data->fault_status |= rv & 0x3F;
|
||||||
|
|
||||||
rv = i2c_smbus_read_byte_data(client,
|
rv = i2c_smbus_read_byte_data(client,
|
||||||
MAX31790_REG_FAN_FAULT_STATUS2);
|
MAX31790_REG_FAN_FAULT_STATUS2);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto abort;
|
return ERR_PTR(rv);
|
||||||
data->fault_status |= (rv & 0x3F) << 6;
|
data->fault_status |= (rv & 0x3F) << 6;
|
||||||
|
|
||||||
for (i = 0; i < NR_CHANNEL; i++) {
|
for (i = 0; i < NR_CHANNEL; i++) {
|
||||||
rv = i2c_smbus_read_word_swapped(client,
|
rv = i2c_smbus_read_word_swapped(client,
|
||||||
MAX31790_REG_TACH_COUNT(i));
|
MAX31790_REG_TACH_COUNT(i));
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto abort;
|
return ERR_PTR(rv);
|
||||||
data->tach[i] = rv;
|
data->tach[i] = rv;
|
||||||
|
|
||||||
if (data->fan_config[i]
|
if (data->fan_config[i]
|
||||||
|
|
@ -106,19 +102,19 @@ static struct max31790_data *max31790_update_device(struct device *dev)
|
||||||
MAX31790_REG_TACH_COUNT(NR_CHANNEL
|
MAX31790_REG_TACH_COUNT(NR_CHANNEL
|
||||||
+ i));
|
+ i));
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto abort;
|
return ERR_PTR(rv);
|
||||||
data->tach[NR_CHANNEL + i] = rv;
|
data->tach[NR_CHANNEL + i] = rv;
|
||||||
} else {
|
} else {
|
||||||
rv = i2c_smbus_read_word_swapped(client,
|
rv = i2c_smbus_read_word_swapped(client,
|
||||||
MAX31790_REG_PWM_DUTY_CYCLE(i));
|
MAX31790_REG_PWM_DUTY_CYCLE(i));
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto abort;
|
return ERR_PTR(rv);
|
||||||
data->pwm[i] = rv;
|
data->pwm[i] = rv;
|
||||||
|
|
||||||
rv = i2c_smbus_read_word_swapped(client,
|
rv = i2c_smbus_read_word_swapped(client,
|
||||||
MAX31790_REG_TARGET_COUNT(i));
|
MAX31790_REG_TARGET_COUNT(i));
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto abort;
|
return ERR_PTR(rv);
|
||||||
data->target_count[i] = rv;
|
data->target_count[i] = rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -126,16 +122,7 @@ static struct max31790_data *max31790_update_device(struct device *dev)
|
||||||
data->last_updated = jiffies;
|
data->last_updated = jiffies;
|
||||||
data->valid = true;
|
data->valid = true;
|
||||||
}
|
}
|
||||||
goto done;
|
return data;
|
||||||
|
|
||||||
abort:
|
|
||||||
data->valid = false;
|
|
||||||
ret = ERR_PTR(rv);
|
|
||||||
|
|
||||||
done:
|
|
||||||
mutex_unlock(&data->update_lock);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const u8 tach_period[8] = { 1, 2, 4, 8, 16, 32, 32, 32 };
|
static const u8 tach_period[8] = { 1, 2, 4, 8, 16, 32, 32, 32 };
|
||||||
|
|
@ -189,7 +176,6 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
|
||||||
*val = rpm;
|
*val = rpm;
|
||||||
return 0;
|
return 0;
|
||||||
case hwmon_fan_fault:
|
case hwmon_fan_fault:
|
||||||
mutex_lock(&data->update_lock);
|
|
||||||
*val = !!(data->fault_status & (1 << channel));
|
*val = !!(data->fault_status & (1 << channel));
|
||||||
data->fault_status &= ~(1 << channel);
|
data->fault_status &= ~(1 << channel);
|
||||||
/*
|
/*
|
||||||
|
|
@ -200,10 +186,9 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
|
||||||
if (*val) {
|
if (*val) {
|
||||||
int reg = MAX31790_REG_TARGET_COUNT(channel % NR_CHANNEL);
|
int reg = MAX31790_REG_TARGET_COUNT(channel % NR_CHANNEL);
|
||||||
|
|
||||||
i2c_smbus_write_byte_data(data->client, reg,
|
return i2c_smbus_write_byte_data(data->client, reg,
|
||||||
data->target_count[channel % NR_CHANNEL] >> 8);
|
data->target_count[channel % NR_CHANNEL] >> 8);
|
||||||
}
|
}
|
||||||
mutex_unlock(&data->update_lock);
|
|
||||||
return 0;
|
return 0;
|
||||||
case hwmon_fan_enable:
|
case hwmon_fan_enable:
|
||||||
*val = !!(data->fan_config[channel] & MAX31790_FAN_CFG_TACH_INPUT_EN);
|
*val = !!(data->fan_config[channel] & MAX31790_FAN_CFG_TACH_INPUT_EN);
|
||||||
|
|
@ -223,8 +208,6 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
|
||||||
u8 bits, fan_config;
|
u8 bits, fan_config;
|
||||||
int sr;
|
int sr;
|
||||||
|
|
||||||
mutex_lock(&data->update_lock);
|
|
||||||
|
|
||||||
switch (attr) {
|
switch (attr) {
|
||||||
case hwmon_fan_target:
|
case hwmon_fan_target:
|
||||||
val = clamp_val(val, FAN_RPM_MIN, FAN_RPM_MAX);
|
val = clamp_val(val, FAN_RPM_MIN, FAN_RPM_MAX);
|
||||||
|
|
@ -270,9 +253,6 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&data->update_lock);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -338,8 +318,6 @@ static int max31790_write_pwm(struct device *dev, u32 attr, int channel,
|
||||||
u8 fan_config;
|
u8 fan_config;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
mutex_lock(&data->update_lock);
|
|
||||||
|
|
||||||
switch (attr) {
|
switch (attr) {
|
||||||
case hwmon_pwm_input:
|
case hwmon_pwm_input:
|
||||||
if (val < 0 || val > 255) {
|
if (val < 0 || val > 255) {
|
||||||
|
|
@ -389,9 +367,6 @@ static int max31790_write_pwm(struct device *dev, u32 attr, int channel,
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&data->update_lock);
|
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -525,7 +500,6 @@ static int max31790_probe(struct i2c_client *client)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
data->client = client;
|
data->client = client;
|
||||||
mutex_init(&data->update_lock);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the max31790 chip
|
* Initialize the max31790 chip
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue