|
@@ -1,12 +1,12 @@
|
|
|
/*
|
|
|
* adm9240.c Part of lm_sensors, Linux kernel modules for hardware
|
|
|
- * monitoring
|
|
|
+ * monitoring
|
|
|
*
|
|
|
* Copyright (C) 1999 Frodo Looijaard <frodol@dds.nl>
|
|
|
* Philip Edelbrock <phil@netroedge.com>
|
|
|
* Copyright (C) 2003 Michiel Rook <michiel@grendelproject.nl>
|
|
|
* Copyright (C) 2005 Grant Coady <gcoady.lk@gmail.com> with valuable
|
|
|
- * guidance from Jean Delvare
|
|
|
+ * guidance from Jean Delvare
|
|
|
*
|
|
|
* Driver supports Analog Devices ADM9240
|
|
|
* Dallas Semiconductor DS1780
|
|
@@ -204,7 +204,12 @@ static ssize_t set_max(struct device *dev, struct device_attribute *devattr,
|
|
|
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
struct adm9240_data *data = i2c_get_clientdata(client);
|
|
|
- long val = simple_strtol(buf, NULL, 10);
|
|
|
+ long val;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = kstrtol(buf, 10, &val);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
mutex_lock(&data->update_lock);
|
|
|
data->temp_max[attr->index] = TEMP_TO_REG(val);
|
|
@@ -255,7 +260,12 @@ static ssize_t set_in_min(struct device *dev,
|
|
|
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
struct adm9240_data *data = i2c_get_clientdata(client);
|
|
|
- unsigned long val = simple_strtoul(buf, NULL, 10);
|
|
|
+ unsigned long val;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = kstrtoul(buf, 10, &val);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
mutex_lock(&data->update_lock);
|
|
|
data->in_min[attr->index] = IN_TO_REG(val, attr->index);
|
|
@@ -272,7 +282,12 @@ static ssize_t set_in_max(struct device *dev,
|
|
|
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
struct adm9240_data *data = i2c_get_clientdata(client);
|
|
|
- unsigned long val = simple_strtoul(buf, NULL, 10);
|
|
|
+ unsigned long val;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = kstrtoul(buf, 10, &val);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
mutex_lock(&data->update_lock);
|
|
|
data->in_max[attr->index] = IN_TO_REG(val, attr->index);
|
|
@@ -283,7 +298,7 @@ static ssize_t set_in_max(struct device *dev,
|
|
|
}
|
|
|
|
|
|
#define vin(nr) \
|
|
|
-static SENSOR_DEVICE_ATTR(in##nr##_input, S_IRUGO, \
|
|
|
+static SENSOR_DEVICE_ATTR(in##nr##_input, S_IRUGO, \
|
|
|
show_in, NULL, nr); \
|
|
|
static SENSOR_DEVICE_ATTR(in##nr##_min, S_IRUGO | S_IWUSR, \
|
|
|
show_in_min, set_in_min, nr); \
|
|
@@ -357,9 +372,14 @@ static ssize_t set_fan_min(struct device *dev,
|
|
|
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
struct adm9240_data *data = i2c_get_clientdata(client);
|
|
|
- unsigned long val = simple_strtoul(buf, NULL, 10);
|
|
|
int nr = attr->index;
|
|
|
u8 new_div;
|
|
|
+ unsigned long val;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = kstrtoul(buf, 10, &val);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
mutex_lock(&data->update_lock);
|
|
|
|
|
@@ -465,7 +485,12 @@ static ssize_t set_aout(struct device *dev,
|
|
|
{
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
struct adm9240_data *data = i2c_get_clientdata(client);
|
|
|
- unsigned long val = simple_strtol(buf, NULL, 10);
|
|
|
+ long val;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = kstrtol(buf, 10, &val);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
mutex_lock(&data->update_lock);
|
|
|
data->aout = AOUT_TO_REG(val);
|
|
@@ -481,7 +506,12 @@ static ssize_t chassis_clear_legacy(struct device *dev,
|
|
|
const char *buf, size_t count)
|
|
|
{
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
- unsigned long val = simple_strtol(buf, NULL, 10);
|
|
|
+ long val;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = kstrtol(buf, 10, &val);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
dev_warn(dev, "Attribute chassis_clear is deprecated, "
|
|
|
"use intrusion0_alarm instead\n");
|
|
@@ -632,7 +662,8 @@ static int adm9240_probe(struct i2c_client *new_client,
|
|
|
adm9240_init_client(new_client);
|
|
|
|
|
|
/* populate sysfs filesystem */
|
|
|
- if ((err = sysfs_create_group(&new_client->dev.kobj, &adm9240_group)))
|
|
|
+ err = sysfs_create_group(&new_client->dev.kobj, &adm9240_group);
|
|
|
+ if (err)
|
|
|
goto exit_free;
|
|
|
|
|
|
data->hwmon_dev = hwmon_device_register(&new_client->dev);
|
|
@@ -681,8 +712,7 @@ static void adm9240_init_client(struct i2c_client *client)
|
|
|
} else { /* cold start: open limits before starting chip */
|
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < 6; i++)
|
|
|
- {
|
|
|
+ for (i = 0; i < 6; i++) {
|
|
|
i2c_smbus_write_byte_data(client,
|
|
|
ADM9240_REG_IN_MIN(i), 0);
|
|
|
i2c_smbus_write_byte_data(client,
|
|
@@ -717,8 +747,7 @@ static struct adm9240_data *adm9240_update_device(struct device *dev)
|
|
|
if (time_after(jiffies, data->last_updated_measure + (HZ * 7 / 4))
|
|
|
|| !data->valid) {
|
|
|
|
|
|
- for (i = 0; i < 6; i++) /* read voltages */
|
|
|
- {
|
|
|
+ for (i = 0; i < 6; i++) { /* read voltages */
|
|
|
data->in[i] = i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_IN(i));
|
|
|
}
|
|
@@ -727,16 +756,17 @@ static struct adm9240_data *adm9240_update_device(struct device *dev)
|
|
|
i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_INT(1)) << 8;
|
|
|
|
|
|
- /* read temperature: assume temperature changes less than
|
|
|
+ /*
|
|
|
+ * read temperature: assume temperature changes less than
|
|
|
* 0.5'C per two measurement cycles thus ignore possible
|
|
|
- * but unlikely aliasing error on lsb reading. --Grant */
|
|
|
+ * but unlikely aliasing error on lsb reading. --Grant
|
|
|
+ */
|
|
|
data->temp = ((i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_TEMP) << 8) |
|
|
|
i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_TEMP_CONF)) / 128;
|
|
|
|
|
|
- for (i = 0; i < 2; i++) /* read fans */
|
|
|
- {
|
|
|
+ for (i = 0; i < 2; i++) { /* read fans */
|
|
|
data->fan[i] = i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_FAN(i));
|
|
|
|
|
@@ -760,15 +790,13 @@ static struct adm9240_data *adm9240_update_device(struct device *dev)
|
|
|
if (time_after(jiffies, data->last_updated_config + (HZ * 300))
|
|
|
|| !data->valid) {
|
|
|
|
|
|
- for (i = 0; i < 6; i++)
|
|
|
- {
|
|
|
+ for (i = 0; i < 6; i++) {
|
|
|
data->in_min[i] = i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_IN_MIN(i));
|
|
|
data->in_max[i] = i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_IN_MAX(i));
|
|
|
}
|
|
|
- for (i = 0; i < 2; i++)
|
|
|
- {
|
|
|
+ for (i = 0; i < 2; i++) {
|
|
|
data->fan_min[i] = i2c_smbus_read_byte_data(client,
|
|
|
ADM9240_REG_FAN_MIN(i));
|
|
|
}
|