Commit e72a5d1c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging

Pull hwmon update from Jean Delvare:
 "Only lm75 driver updates this time"

* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
  hwmon: (lm75) Add support for the Dallas/Maxim DS7505
  hwmon: (lm75) Tune resolution and sample time per chip
  hwmon: (lm75) Prepare to support per-chip resolution and sample time
  hwmon: (lm75) Per-chip configuration register initialization
parents bd932ae1 3fbc81e3
...@@ -12,11 +12,11 @@ Supported chips: ...@@ -12,11 +12,11 @@ Supported chips:
Addresses scanned: I2C 0x48 - 0x4f Addresses scanned: I2C 0x48 - 0x4f
Datasheet: Publicly available at the National Semiconductor website Datasheet: Publicly available at the National Semiconductor website
http://www.national.com/ http://www.national.com/
* Dallas Semiconductor DS75, DS1775 * Dallas Semiconductor (now Maxim) DS75, DS1775, DS7505
Prefixes: 'ds75', 'ds1775' Prefixes: 'ds75', 'ds1775', 'ds7505'
Addresses scanned: none Addresses scanned: none
Datasheet: Publicly available at the Dallas Semiconductor website Datasheet: Publicly available at the Maxim website
http://www.maxim-ic.com/ http://www.maximintegrated.com/
* Maxim MAX6625, MAX6626 * Maxim MAX6625, MAX6626
Prefixes: 'max6625', 'max6626' Prefixes: 'max6625', 'max6626'
Addresses scanned: none Addresses scanned: none
...@@ -67,7 +67,8 @@ the temperature falls below the Hysteresis value. ...@@ -67,7 +67,8 @@ the temperature falls below the Hysteresis value.
All temperatures are in degrees Celsius, and are guaranteed within a All temperatures are in degrees Celsius, and are guaranteed within a
range of -55 to +125 degrees. range of -55 to +125 degrees.
The LM75 only updates its values each 1.5 seconds; reading it more often The driver caches the values for a period varying between 1 second for the
slowest chips and 125 ms for the fastest chips; reading it more often
will do no harm, but will return 'old' values. will do no harm, but will return 'old' values.
The original LM75 was typically used in combination with LM78-like chips The original LM75 was typically used in combination with LM78-like chips
...@@ -78,8 +79,8 @@ The LM75 is essentially an industry standard; there may be other ...@@ -78,8 +79,8 @@ The LM75 is essentially an industry standard; there may be other
LM75 clones not listed here, with or without various enhancements, LM75 clones not listed here, with or without various enhancements,
that are supported. The clones are not detected by the driver, unless that are supported. The clones are not detected by the driver, unless
they reproduce the exact register tricks of the original LM75, and must they reproduce the exact register tricks of the original LM75, and must
therefore be instantiated explicitly. The specific enhancements (such as therefore be instantiated explicitly. Higher resolution up to 12-bit
higher resolution) are not currently supported by the driver. is supported by this driver, other specific enhancements are not.
The LM77 is not supported, contrary to what we pretended for a long time. The LM77 is not supported, contrary to what we pretended for a long time.
Both chips are simply not compatible, value encoding differs. Both chips are simply not compatible, value encoding differs.
...@@ -630,7 +630,7 @@ config SENSORS_LM75 ...@@ -630,7 +630,7 @@ config SENSORS_LM75
temperature sensor chip, with models including: temperature sensor chip, with models including:
- Analog Devices ADT75 - Analog Devices ADT75
- Dallas Semiconductor DS75 and DS1775 - Dallas Semiconductor DS75, DS1775 and DS7505
- Maxim MAX6625 and MAX6626 - Maxim MAX6625 and MAX6626
- Microchip MCP980x - Microchip MCP980x
- National Semiconductor LM75, LM75A - National Semiconductor LM75, LM75A
......
...@@ -38,6 +38,7 @@ enum lm75_type { /* keep sorted in alphabetical order */ ...@@ -38,6 +38,7 @@ enum lm75_type { /* keep sorted in alphabetical order */
adt75, adt75,
ds1775, ds1775,
ds75, ds75,
ds7505,
lm75, lm75,
lm75a, lm75a,
max6625, max6625,
...@@ -71,9 +72,12 @@ struct lm75_data { ...@@ -71,9 +72,12 @@ struct lm75_data {
struct device *hwmon_dev; struct device *hwmon_dev;
struct mutex update_lock; struct mutex update_lock;
u8 orig_conf; u8 orig_conf;
u8 resolution; /* In bits, between 9 and 12 */
u8 resolution_limits;
char valid; /* !=0 if registers are valid */ char valid; /* !=0 if registers are valid */
unsigned long last_updated; /* In jiffies */ unsigned long last_updated; /* In jiffies */
u16 temp[3]; /* Register values, unsigned long sample_time; /* In jiffies */
s16 temp[3]; /* Register values,
0 = input 0 = input
1 = max 1 = max
2 = hyst */ 2 = hyst */
...@@ -93,12 +97,15 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da, ...@@ -93,12 +97,15 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct lm75_data *data = lm75_update_device(dev); struct lm75_data *data = lm75_update_device(dev);
long temp;
if (IS_ERR(data)) if (IS_ERR(data))
return PTR_ERR(data); return PTR_ERR(data);
return sprintf(buf, "%d\n", temp = ((data->temp[attr->index] >> (16 - data->resolution)) * 1000)
LM75_TEMP_FROM_REG(data->temp[attr->index])); >> (data->resolution - 8);
return sprintf(buf, "%ld\n", temp);
} }
static ssize_t set_temp(struct device *dev, struct device_attribute *da, static ssize_t set_temp(struct device *dev, struct device_attribute *da,
...@@ -110,13 +117,25 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, ...@@ -110,13 +117,25 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
int nr = attr->index; int nr = attr->index;
long temp; long temp;
int error; int error;
u8 resolution;
error = kstrtol(buf, 10, &temp); error = kstrtol(buf, 10, &temp);
if (error) if (error)
return error; return error;
/*
* Resolution of limit registers is assumed to be the same as the
* temperature input register resolution unless given explicitly.
*/
if (attr->index && data->resolution_limits)
resolution = data->resolution_limits;
else
resolution = data->resolution;
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
data->temp[nr] = LM75_TEMP_TO_REG(temp); temp = clamp_val(temp, LM75_TEMP_MIN, LM75_TEMP_MAX);
data->temp[nr] = DIV_ROUND_CLOSEST(temp << (resolution - 8),
1000) << (16 - resolution);
lm75_write_value(client, LM75_REG_TEMP[nr], data->temp[nr]); lm75_write_value(client, LM75_REG_TEMP[nr], data->temp[nr]);
mutex_unlock(&data->update_lock); mutex_unlock(&data->update_lock);
return count; return count;
...@@ -151,6 +170,7 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -151,6 +170,7 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
int status; int status;
u8 set_mask, clr_mask; u8 set_mask, clr_mask;
int new; int new;
enum lm75_type kind = id->driver_data;
if (!i2c_check_functionality(client->adapter, if (!i2c_check_functionality(client->adapter,
I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
...@@ -167,8 +187,65 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -167,8 +187,65 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
* Then tweak to be more precise when appropriate. * Then tweak to be more precise when appropriate.
*/ */
set_mask = 0; set_mask = 0;
clr_mask = (1 << 0) /* continuous conversions */ clr_mask = LM75_SHUTDOWN; /* continuous conversions */
| (1 << 6) | (1 << 5); /* 9-bit mode */
switch (kind) {
case adt75:
clr_mask |= 1 << 5; /* not one-shot mode */
data->resolution = 12;
data->sample_time = HZ / 8;
break;
case ds1775:
case ds75:
case stds75:
clr_mask |= 3 << 5;
set_mask |= 2 << 5; /* 11-bit mode */
data->resolution = 11;
data->sample_time = HZ;
break;
case ds7505:
set_mask |= 3 << 5; /* 12-bit mode */
data->resolution = 12;
data->sample_time = HZ / 4;
break;
case lm75:
case lm75a:
data->resolution = 9;
data->sample_time = HZ / 2;
break;
case max6625:
data->resolution = 9;
data->sample_time = HZ / 4;
break;
case max6626:
data->resolution = 12;
data->resolution_limits = 9;
data->sample_time = HZ / 4;
break;
case tcn75:
data->resolution = 9;
data->sample_time = HZ / 8;
break;
case mcp980x:
data->resolution_limits = 9;
/* fall through */
case tmp100:
case tmp101:
set_mask |= 3 << 5; /* 12-bit mode */
data->resolution = 12;
data->sample_time = HZ;
clr_mask |= 1 << 7; /* not one-shot mode */
break;
case tmp105:
case tmp175:
case tmp275:
case tmp75:
set_mask |= 3 << 5; /* 12-bit mode */
clr_mask |= 1 << 7; /* not one-shot mode */
data->resolution = 12;
data->sample_time = HZ / 2;
break;
}
/* configure as specified */ /* configure as specified */
status = lm75_read_value(client, LM75_REG_CONF); status = lm75_read_value(client, LM75_REG_CONF);
...@@ -218,6 +295,7 @@ static const struct i2c_device_id lm75_ids[] = { ...@@ -218,6 +295,7 @@ static const struct i2c_device_id lm75_ids[] = {
{ "adt75", adt75, }, { "adt75", adt75, },
{ "ds1775", ds1775, }, { "ds1775", ds1775, },
{ "ds75", ds75, }, { "ds75", ds75, },
{ "ds7505", ds7505, },
{ "lm75", lm75, }, { "lm75", lm75, },
{ "lm75a", lm75a, }, { "lm75a", lm75a, },
{ "max6625", max6625, }, { "max6625", max6625, },
...@@ -407,7 +485,7 @@ static struct lm75_data *lm75_update_device(struct device *dev) ...@@ -407,7 +485,7 @@ static struct lm75_data *lm75_update_device(struct device *dev)
mutex_lock(&data->update_lock); mutex_lock(&data->update_lock);
if (time_after(jiffies, data->last_updated + HZ + HZ / 2) if (time_after(jiffies, data->last_updated + data->sample_time)
|| !data->valid) { || !data->valid) {
int i; int i;
dev_dbg(&client->dev, "Starting lm75 update\n"); dev_dbg(&client->dev, "Starting lm75 update\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment