Merge branch 'release' of git://lm-sensors.org/kernel/mhoffman/hwmon-2.6

* 'release' of git://lm-sensors.org/kernel/mhoffman/hwmon-2.6:
  hwmon: (adt7473) minor cleanup / refactoring
  hwmon: (asb100) Remove some dead code
  hwmon: (lm75) Fix an incorrect comment
  hwmon: (w83793) VID and VRM handling cleanups
  hwmon: (w83l785ts) Don't ask the user to report failures
  hwmon: (smsc47b397) add a new chip id (0x8c)
This commit is contained in:
Linus Torvalds 2008-05-01 08:28:26 -07:00
commit c92758ceda
7 changed files with 56 additions and 48 deletions

View File

@ -33,7 +33,8 @@ Known Issues
------------ ------------
On some systems (Asus), the BIOS is known to interfere with the driver On some systems (Asus), the BIOS is known to interfere with the driver
and cause read errors. The driver will retry a given number of times and cause read errors. Or maybe the W83L785TS-S chip is simply unreliable,
we don't really know. The driver will retry a given number of times
(5 by default) and then give up, returning the old value (or 0 if (5 by default) and then give up, returning the old value (or 0 if
there is no old value). It seems to work well enough so that you should there is no old value). It seems to work well enough so that you should
not notice anything. Thanks to James Bolt for helping test this feature. not notice anything. Thanks to James Bolt for helping test this feature.

View File

@ -422,18 +422,14 @@ static ssize_t show_volt(struct device *dev, struct device_attribute *devattr,
* number in the range -128 to 127, or as an unsigned number that must * number in the range -128 to 127, or as an unsigned number that must
* be offset by 64. * be offset by 64.
*/ */
static int decode_temp(struct adt7473_data *data, u8 raw) static int decode_temp(u8 twos_complement, u8 raw)
{ {
if (data->temp_twos_complement) return twos_complement ? (s8)raw : raw - 64;
return (s8)raw;
return raw - 64;
} }
static u8 encode_temp(struct adt7473_data *data, int cooked) static u8 encode_temp(u8 twos_complement, int cooked)
{ {
if (data->temp_twos_complement) return twos_complement ? cooked & 0xFF : cooked + 64;
return (cooked & 0xFF);
return cooked + 64;
} }
static ssize_t show_temp_min(struct device *dev, static ssize_t show_temp_min(struct device *dev,
@ -442,8 +438,9 @@ static ssize_t show_temp_min(struct device *dev,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct adt7473_data *data = adt7473_update_device(dev); struct adt7473_data *data = adt7473_update_device(dev);
return sprintf(buf, "%d\n", return sprintf(buf, "%d\n", 1000 * decode_temp(
1000 * decode_temp(data, data->temp_min[attr->index])); data->temp_twos_complement,
data->temp_min[attr->index]));
} }
static ssize_t set_temp_min(struct device *dev, static ssize_t set_temp_min(struct device *dev,
@ -455,7 +452,7 @@ static ssize_t set_temp_min(struct device *dev,
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct adt7473_data *data = i2c_get_clientdata(client); struct adt7473_data *data = i2c_get_clientdata(client);
int temp = simple_strtol(buf, NULL, 10) / 1000; int temp = simple_strtol(buf, NULL, 10) / 1000;
temp = encode_temp(data, temp); temp = encode_temp(data->temp_twos_complement, temp);
mutex_lock(&data->lock); mutex_lock(&data->lock);
data->temp_min[attr->index] = temp; data->temp_min[attr->index] = temp;
@ -472,8 +469,9 @@ static ssize_t show_temp_max(struct device *dev,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct adt7473_data *data = adt7473_update_device(dev); struct adt7473_data *data = adt7473_update_device(dev);
return sprintf(buf, "%d\n", return sprintf(buf, "%d\n", 1000 * decode_temp(
1000 * decode_temp(data, data->temp_max[attr->index])); data->temp_twos_complement,
data->temp_max[attr->index]));
} }
static ssize_t set_temp_max(struct device *dev, static ssize_t set_temp_max(struct device *dev,
@ -485,7 +483,7 @@ static ssize_t set_temp_max(struct device *dev,
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct adt7473_data *data = i2c_get_clientdata(client); struct adt7473_data *data = i2c_get_clientdata(client);
int temp = simple_strtol(buf, NULL, 10) / 1000; int temp = simple_strtol(buf, NULL, 10) / 1000;
temp = encode_temp(data, temp); temp = encode_temp(data->temp_twos_complement, temp);
mutex_lock(&data->lock); mutex_lock(&data->lock);
data->temp_max[attr->index] = temp; data->temp_max[attr->index] = temp;
@ -501,8 +499,9 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct adt7473_data *data = adt7473_update_device(dev); struct adt7473_data *data = adt7473_update_device(dev);
return sprintf(buf, "%d\n", return sprintf(buf, "%d\n", 1000 * decode_temp(
1000 * decode_temp(data, data->temp[attr->index])); data->temp_twos_complement,
data->temp[attr->index]));
} }
static ssize_t show_fan_min(struct device *dev, static ssize_t show_fan_min(struct device *dev,
@ -671,8 +670,9 @@ static ssize_t show_temp_tmax(struct device *dev,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct adt7473_data *data = adt7473_update_device(dev); struct adt7473_data *data = adt7473_update_device(dev);
return sprintf(buf, "%d\n", return sprintf(buf, "%d\n", 1000 * decode_temp(
1000 * decode_temp(data, data->temp_tmax[attr->index])); data->temp_twos_complement,
data->temp_tmax[attr->index]));
} }
static ssize_t set_temp_tmax(struct device *dev, static ssize_t set_temp_tmax(struct device *dev,
@ -684,7 +684,7 @@ static ssize_t set_temp_tmax(struct device *dev,
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct adt7473_data *data = i2c_get_clientdata(client); struct adt7473_data *data = i2c_get_clientdata(client);
int temp = simple_strtol(buf, NULL, 10) / 1000; int temp = simple_strtol(buf, NULL, 10) / 1000;
temp = encode_temp(data, temp); temp = encode_temp(data->temp_twos_complement, temp);
mutex_lock(&data->lock); mutex_lock(&data->lock);
data->temp_tmax[attr->index] = temp; data->temp_tmax[attr->index] = temp;
@ -701,8 +701,9 @@ static ssize_t show_temp_tmin(struct device *dev,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
struct adt7473_data *data = adt7473_update_device(dev); struct adt7473_data *data = adt7473_update_device(dev);
return sprintf(buf, "%d\n", return sprintf(buf, "%d\n", 1000 * decode_temp(
1000 * decode_temp(data, data->temp_tmin[attr->index])); data->temp_twos_complement,
data->temp_tmin[attr->index]));
} }
static ssize_t set_temp_tmin(struct device *dev, static ssize_t set_temp_tmin(struct device *dev,
@ -714,7 +715,7 @@ static ssize_t set_temp_tmin(struct device *dev,
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
struct adt7473_data *data = i2c_get_clientdata(client); struct adt7473_data *data = i2c_get_clientdata(client);
int temp = simple_strtol(buf, NULL, 10) / 1000; int temp = simple_strtol(buf, NULL, 10) / 1000;
temp = encode_temp(data, temp); temp = encode_temp(data->temp_twos_complement, temp);
mutex_lock(&data->lock); mutex_lock(&data->lock);
data->temp_tmin[attr->index] = temp; data->temp_tmin[attr->index] = temp;

View File

@ -953,12 +953,8 @@ static void asb100_write_value(struct i2c_client *client, u16 reg, u16 value)
static void asb100_init_client(struct i2c_client *client) static void asb100_init_client(struct i2c_client *client)
{ {
struct asb100_data *data = i2c_get_clientdata(client); struct asb100_data *data = i2c_get_clientdata(client);
int vid = 0;
vid = asb100_read_value(client, ASB100_REG_VID_FANDIV) & 0x0f;
vid |= (asb100_read_value(client, ASB100_REG_CHIPID) & 0x01) << 4;
data->vrm = vid_which_vrm(); data->vrm = vid_which_vrm();
vid = vid_from_reg(vid, data->vrm);
/* Start monitoring */ /* Start monitoring */
asb100_write_value(client, ASB100_REG_CONFIG, asb100_write_value(client, ASB100_REG_CONFIG,

View File

@ -248,7 +248,7 @@ static int lm75_detach_client(struct i2c_client *client)
/* All registers are word-sized, except for the configuration register. /* All registers are word-sized, except for the configuration register.
LM75 uses a high-byte first convention, which is exactly opposite to LM75 uses a high-byte first convention, which is exactly opposite to
the usual practice. */ the SMBus standard. */
static int lm75_read_value(struct i2c_client *client, u8 reg) static int lm75_read_value(struct i2c_client *client, u8 reg)
{ {
if (reg == LM75_REG_CONF) if (reg == LM75_REG_CONF)
@ -257,9 +257,6 @@ static int lm75_read_value(struct i2c_client *client, u8 reg)
return swab16(i2c_smbus_read_word_data(client, reg)); return swab16(i2c_smbus_read_word_data(client, reg));
} }
/* All registers are word-sized, except for the configuration register.
LM75 uses a high-byte first convention, which is exactly opposite to
the usual practice. */
static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value) static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value)
{ {
if (reg == LM75_REG_CONF) if (reg == LM75_REG_CONF)

View File

@ -335,11 +335,23 @@ static int __init smsc47b397_device_add(unsigned short address)
static int __init smsc47b397_find(unsigned short *addr) static int __init smsc47b397_find(unsigned short *addr)
{ {
u8 id, rev; u8 id, rev;
char *name;
superio_enter(); superio_enter();
id = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID); id = force_id ? force_id : superio_inb(SUPERIO_REG_DEVID);
if ((id != 0x6f) && (id != 0x81) && (id != 0x85)) { switch(id) {
case 0x81:
name = "SCH5307-NS";
break;
case 0x6f:
name = "LPC47B397-NC";
break;
case 0x85:
case 0x8c:
name = "SCH5317";
break;
default:
superio_exit(); superio_exit();
return -ENODEV; return -ENODEV;
} }
@ -352,8 +364,7 @@ static int __init smsc47b397_find(unsigned short *addr)
printk(KERN_INFO DRVNAME ": found SMSC %s " printk(KERN_INFO DRVNAME ": found SMSC %s "
"(base address 0x%04x, revision %u)\n", "(base address 0x%04x, revision %u)\n",
id == 0x81 ? "SCH5307-NS" : id == 0x85 ? "SCH5317" : name, *addr, rev);
"LPC47B397-NC", *addr, rev);
superio_exit(); superio_exit();
return 0; return 0;

View File

@ -1024,10 +1024,9 @@ static struct sensor_device_attribute_2 w83793_vid[] = {
SENSOR_ATTR_2(cpu0_vid, S_IRUGO, show_vid, NULL, NOT_USED, 0), SENSOR_ATTR_2(cpu0_vid, S_IRUGO, show_vid, NULL, NOT_USED, 0),
SENSOR_ATTR_2(cpu1_vid, S_IRUGO, show_vid, NULL, NOT_USED, 1), SENSOR_ATTR_2(cpu1_vid, S_IRUGO, show_vid, NULL, NOT_USED, 1),
}; };
static DEVICE_ATTR(vrm, S_IWUSR | S_IRUGO, show_vrm, store_vrm);
static struct sensor_device_attribute_2 sda_single_files[] = { static struct sensor_device_attribute_2 sda_single_files[] = {
SENSOR_ATTR_2(vrm, S_IWUSR | S_IRUGO, show_vrm, store_vrm,
NOT_USED, NOT_USED),
SENSOR_ATTR_2(chassis, S_IWUSR | S_IRUGO, show_alarm_beep, SENSOR_ATTR_2(chassis, S_IWUSR | S_IRUGO, show_alarm_beep,
store_chassis_clear, ALARM_STATUS, 30), store_chassis_clear, ALARM_STATUS, 30),
SENSOR_ATTR_2(beep_enable, S_IWUSR | S_IRUGO, show_beep_enable, SENSOR_ATTR_2(beep_enable, S_IWUSR | S_IRUGO, show_beep_enable,
@ -1080,6 +1079,7 @@ static int w83793_detach_client(struct i2c_client *client)
for (i = 0; i < ARRAY_SIZE(w83793_vid); i++) for (i = 0; i < ARRAY_SIZE(w83793_vid); i++)
device_remove_file(dev, &w83793_vid[i].dev_attr); device_remove_file(dev, &w83793_vid[i].dev_attr);
device_remove_file(dev, &dev_attr_vrm);
for (i = 0; i < ARRAY_SIZE(w83793_left_fan); i++) for (i = 0; i < ARRAY_SIZE(w83793_left_fan); i++)
device_remove_file(dev, &w83793_left_fan[i].dev_attr); device_remove_file(dev, &w83793_left_fan[i].dev_attr);
@ -1282,7 +1282,6 @@ static int w83793_detect(struct i2c_adapter *adapter, int address, int kind)
/* Initialize the chip */ /* Initialize the chip */
w83793_init_client(client); w83793_init_client(client);
data->vrm = vid_which_vrm();
/* /*
Only fan 1-5 has their own input pins, Only fan 1-5 has their own input pins,
Pwm 1-3 has their own pins Pwm 1-3 has their own pins
@ -1293,7 +1292,9 @@ static int w83793_detect(struct i2c_adapter *adapter, int address, int kind)
val = w83793_read_value(client, W83793_REG_FANIN_CTRL); val = w83793_read_value(client, W83793_REG_FANIN_CTRL);
/* check the function of pins 49-56 */ /* check the function of pins 49-56 */
if (!(tmp & 0x80)) { if (tmp & 0x80) {
data->has_vid |= 0x2; /* has VIDB */
} else {
data->has_pwm |= 0x18; /* pwm 4,5 */ data->has_pwm |= 0x18; /* pwm 4,5 */
if (val & 0x01) { /* fan 6 */ if (val & 0x01) { /* fan 6 */
data->has_fan |= 0x20; data->has_fan |= 0x20;
@ -1309,13 +1310,15 @@ static int w83793_detect(struct i2c_adapter *adapter, int address, int kind)
} }
} }
/* check the function of pins 37-40 */
if (!(tmp & 0x29))
data->has_vid |= 0x1; /* has VIDA */
if (0x08 == (tmp & 0x0c)) { if (0x08 == (tmp & 0x0c)) {
if (val & 0x08) /* fan 9 */ if (val & 0x08) /* fan 9 */
data->has_fan |= 0x100; data->has_fan |= 0x100;
if (val & 0x10) /* fan 10 */ if (val & 0x10) /* fan 10 */
data->has_fan |= 0x200; data->has_fan |= 0x200;
} }
if (0x20 == (tmp & 0x30)) { if (0x20 == (tmp & 0x30)) {
if (val & 0x20) /* fan 11 */ if (val & 0x20) /* fan 11 */
data->has_fan |= 0x400; data->has_fan |= 0x400;
@ -1359,13 +1362,6 @@ static int w83793_detect(struct i2c_adapter *adapter, int address, int kind)
if (tmp & 0x02) if (tmp & 0x02)
data->has_temp |= 0x20; data->has_temp |= 0x20;
/* Detect the VID usage and ignore unused input */
tmp = w83793_read_value(client, W83793_REG_MFC);
if (!(tmp & 0x29))
data->has_vid |= 0x1; /* has VIDA */
if (tmp & 0x80)
data->has_vid |= 0x2; /* has VIDB */
/* Register sysfs hooks */ /* Register sysfs hooks */
for (i = 0; i < ARRAY_SIZE(w83793_sensor_attr_2); i++) { for (i = 0; i < ARRAY_SIZE(w83793_sensor_attr_2); i++) {
err = device_create_file(dev, err = device_create_file(dev,
@ -1381,6 +1377,12 @@ static int w83793_detect(struct i2c_adapter *adapter, int address, int kind)
if (err) if (err)
goto exit_remove; goto exit_remove;
} }
if (data->has_vid) {
data->vrm = vid_which_vrm();
err = device_create_file(dev, &dev_attr_vrm);
if (err)
goto exit_remove;
}
for (i = 0; i < ARRAY_SIZE(sda_single_files); i++) { for (i = 0; i < ARRAY_SIZE(sda_single_files); i++) {
err = device_create_file(dev, &sda_single_files[i].dev_attr); err = device_create_file(dev, &sda_single_files[i].dev_attr);

View File

@ -301,8 +301,8 @@ static u8 w83l785ts_read_value(struct i2c_client *client, u8 reg, u8 defval)
msleep(i); msleep(i);
} }
dev_err(&client->dev, "Couldn't read value from register 0x%02x. " dev_err(&client->dev, "Couldn't read value from register 0x%02x.\n",
"Please report.\n", reg); reg);
return defval; return defval;
} }