diff options
author | Rod Whitby <rod@whitby.id.au> | 2007-06-30 13:19:16 +0000 |
---|---|---|
committer | Rod Whitby <rod@whitby.id.au> | 2007-06-30 13:19:16 +0000 |
commit | 9dfa73e4fc85c0c33f921974d011ede59aba0276 (patch) | |
tree | c81ac5404ed31f408a9b9a84eea77c5c95fc8112 /packages/linux/ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch | |
parent | 331675b53d9fe807c30c9adb703f711b61d923b5 (diff) |
ixp4xx-kernel: Removed obsolete kernel versions
Diffstat (limited to 'packages/linux/ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch')
-rw-r--r-- | packages/linux/ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch | 13671 |
1 files changed, 0 insertions, 13671 deletions
diff --git a/packages/linux/ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch b/packages/linux/ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch deleted file mode 100644 index 86c88c3746..0000000000 --- a/packages/linux/ixp4xx-kernel/2.6.16/linux-2.6.16-i2c.patch +++ /dev/null @@ -1,13671 +0,0 @@ ---- linux-2.6.16.orig/include/linux/hwmon-sysfs.h 2006-03-22 17:06:11.000000000 +0100 -+++ linux-2.6.16/include/linux/hwmon-sysfs.h 2006-03-22 17:06:15.000000000 +0100 -@@ -27,11 +27,13 @@ - #define to_sensor_dev_attr(_dev_attr) \ - container_of(_dev_attr, struct sensor_device_attribute, dev_attr) - --#define SENSOR_DEVICE_ATTR(_name,_mode,_show,_store,_index) \ --struct sensor_device_attribute sensor_dev_attr_##_name = { \ -- .dev_attr = __ATTR(_name,_mode,_show,_store), \ -- .index = _index, \ --} -+#define SENSOR_ATTR(_name, _mode, _show, _store, _index) \ -+ { .dev_attr = __ATTR(_name, _mode, _show, _store), \ -+ .index = _index } -+ -+#define SENSOR_DEVICE_ATTR(_name, _mode, _show, _store, _index) \ -+struct sensor_device_attribute sensor_dev_attr_##_name \ -+ = SENSOR_ATTR(_name, _mode, _show, _store, _index) - - struct sensor_device_attribute_2 { - struct device_attribute dev_attr; -@@ -41,11 +43,13 @@ - #define to_sensor_dev_attr_2(_dev_attr) \ - container_of(_dev_attr, struct sensor_device_attribute_2, dev_attr) - -+#define SENSOR_ATTR_2(_name, _mode, _show, _store, _nr, _index) \ -+ { .dev_attr = __ATTR(_name, _mode, _show, _store), \ -+ .index = _index, \ -+ .nr = _nr } -+ - #define SENSOR_DEVICE_ATTR_2(_name,_mode,_show,_store,_nr,_index) \ --struct sensor_device_attribute_2 sensor_dev_attr_##_name = { \ -- .dev_attr = __ATTR(_name,_mode,_show,_store), \ -- .index = _index, \ -- .nr = _nr, \ --} -+struct sensor_device_attribute_2 sensor_dev_attr_##_name \ -+ = SENSOR_ATTR_2(_name, _mode, _show, _store, _nr, _index) - - #endif /* _LINUX_HWMON_SYSFS_H */ ---- linux-2.6.16.orig/drivers/hwmon/pc87360.c 2006-03-22 17:06:11.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/pc87360.c 2006-03-22 17:06:15.000000000 +0100 -@@ -43,6 +43,7 @@ - #include <linux/hwmon-sysfs.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - static u8 devid; -@@ -183,8 +184,8 @@ - struct pc87360_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -- struct semaphore update_lock; -+ struct mutex lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -283,7 +284,7 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long fan_min = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - fan_min = FAN_TO_REG(fan_min, FAN_DIV_FROM_REG(data->fan_status[attr->index])); - - /* If it wouldn't fit, change clock divisor */ -@@ -300,23 +301,31 @@ - /* Write new divider, preserve alarm bits */ - pc87360_write_value(data, LD_FAN, NO_BANK, PC87360_REG_FAN_STATUS(attr->index), - data->fan_status[attr->index] & 0xF9); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } - --#define show_and_set_fan(offset) \ --static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ -- show_fan_input, NULL, offset-1); \ --static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IWUSR | S_IRUGO, \ -- show_fan_min, set_fan_min, offset-1); \ --static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO, \ -- show_fan_div, NULL, offset-1); \ --static SENSOR_DEVICE_ATTR(fan##offset##_status, S_IRUGO, \ -- show_fan_status, NULL, offset-1); --show_and_set_fan(1) --show_and_set_fan(2) --show_and_set_fan(3) -+static struct sensor_device_attribute fan_input[] = { -+ SENSOR_ATTR(fan1_input, S_IRUGO, show_fan_input, NULL, 0), -+ SENSOR_ATTR(fan2_input, S_IRUGO, show_fan_input, NULL, 1), -+ SENSOR_ATTR(fan3_input, S_IRUGO, show_fan_input, NULL, 2), -+}; -+static struct sensor_device_attribute fan_status[] = { -+ SENSOR_ATTR(fan1_status, S_IRUGO, show_fan_status, NULL, 0), -+ SENSOR_ATTR(fan2_status, S_IRUGO, show_fan_status, NULL, 1), -+ SENSOR_ATTR(fan3_status, S_IRUGO, show_fan_status, NULL, 2), -+}; -+static struct sensor_device_attribute fan_div[] = { -+ SENSOR_ATTR(fan1_div, S_IRUGO, show_fan_div, NULL, 0), -+ SENSOR_ATTR(fan2_div, S_IRUGO, show_fan_div, NULL, 1), -+ SENSOR_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2), -+}; -+static struct sensor_device_attribute fan_min[] = { -+ SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min, set_fan_min, 0), -+ SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min, set_fan_min, 1), -+ SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min, set_fan_min, 2), -+}; - - static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, char *buf) - { -@@ -335,21 +344,20 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm[attr->index] = PWM_TO_REG(val, - FAN_CONFIG_INVERT(data->fan_conf, attr->index)); - pc87360_write_value(data, LD_FAN, NO_BANK, PC87360_REG_PWM(attr->index), - data->pwm[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - --#define show_and_set_pwm(offset) \ --static SENSOR_DEVICE_ATTR(pwm##offset, S_IWUSR | S_IRUGO, \ -- show_pwm, set_pwm, offset-1); --show_and_set_pwm(1) --show_and_set_pwm(2) --show_and_set_pwm(3) -+static struct sensor_device_attribute pwm[] = { -+ SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0), -+ SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1), -+ SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2), -+}; - - static ssize_t show_in_input(struct device *dev, struct device_attribute *devattr, char *buf) - { -@@ -386,11 +394,11 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[attr->index] = IN_TO_REG(val, data->in_vref); - pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_IN_MIN, - data->in_min[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_in_max(struct device *dev, struct device_attribute *devattr, const char *buf, -@@ -401,35 +409,67 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[attr->index] = IN_TO_REG(val, - data->in_vref); - pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_IN_MAX, - data->in_max[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - --#define show_and_set_in(offset) \ --static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ -- show_in_input, NULL, offset); \ --static SENSOR_DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ -- show_in_min, set_in_min, offset); \ --static SENSOR_DEVICE_ATTR(in##offset##_max, S_IWUSR | S_IRUGO, \ -- show_in_max, set_in_max, offset); \ --static SENSOR_DEVICE_ATTR(in##offset##_status, S_IRUGO, \ -- show_in_status, NULL, offset); --show_and_set_in(0) --show_and_set_in(1) --show_and_set_in(2) --show_and_set_in(3) --show_and_set_in(4) --show_and_set_in(5) --show_and_set_in(6) --show_and_set_in(7) --show_and_set_in(8) --show_and_set_in(9) --show_and_set_in(10) -+static struct sensor_device_attribute in_input[] = { -+ SENSOR_ATTR(in0_input, S_IRUGO, show_in_input, NULL, 0), -+ SENSOR_ATTR(in1_input, S_IRUGO, show_in_input, NULL, 1), -+ SENSOR_ATTR(in2_input, S_IRUGO, show_in_input, NULL, 2), -+ SENSOR_ATTR(in3_input, S_IRUGO, show_in_input, NULL, 3), -+ SENSOR_ATTR(in4_input, S_IRUGO, show_in_input, NULL, 4), -+ SENSOR_ATTR(in5_input, S_IRUGO, show_in_input, NULL, 5), -+ SENSOR_ATTR(in6_input, S_IRUGO, show_in_input, NULL, 6), -+ SENSOR_ATTR(in7_input, S_IRUGO, show_in_input, NULL, 7), -+ SENSOR_ATTR(in8_input, S_IRUGO, show_in_input, NULL, 8), -+ SENSOR_ATTR(in9_input, S_IRUGO, show_in_input, NULL, 9), -+ SENSOR_ATTR(in10_input, S_IRUGO, show_in_input, NULL, 10), -+}; -+static struct sensor_device_attribute in_status[] = { -+ SENSOR_ATTR(in0_status, S_IRUGO, show_in_status, NULL, 0), -+ SENSOR_ATTR(in1_status, S_IRUGO, show_in_status, NULL, 1), -+ SENSOR_ATTR(in2_status, S_IRUGO, show_in_status, NULL, 2), -+ SENSOR_ATTR(in3_status, S_IRUGO, show_in_status, NULL, 3), -+ SENSOR_ATTR(in4_status, S_IRUGO, show_in_status, NULL, 4), -+ SENSOR_ATTR(in5_status, S_IRUGO, show_in_status, NULL, 5), -+ SENSOR_ATTR(in6_status, S_IRUGO, show_in_status, NULL, 6), -+ SENSOR_ATTR(in7_status, S_IRUGO, show_in_status, NULL, 7), -+ SENSOR_ATTR(in8_status, S_IRUGO, show_in_status, NULL, 8), -+ SENSOR_ATTR(in9_status, S_IRUGO, show_in_status, NULL, 9), -+ SENSOR_ATTR(in10_status, S_IRUGO, show_in_status, NULL, 10), -+}; -+static struct sensor_device_attribute in_min[] = { -+ SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 0), -+ SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 1), -+ SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 2), -+ SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 3), -+ SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 4), -+ SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 5), -+ SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 6), -+ SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 7), -+ SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 8), -+ SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 9), -+ SENSOR_ATTR(in10_min, S_IWUSR | S_IRUGO, show_in_min, set_in_min, 10), -+}; -+static struct sensor_device_attribute in_max[] = { -+ SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 0), -+ SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 1), -+ SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 2), -+ SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 3), -+ SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 4), -+ SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 5), -+ SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 6), -+ SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 7), -+ SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 8), -+ SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 9), -+ SENSOR_ATTR(in10_max, S_IWUSR | S_IRUGO, show_in_max, set_in_max, 10), -+}; - - static ssize_t show_therm_input(struct device *dev, struct device_attribute *devattr, char *buf) - { -@@ -473,11 +513,11 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[attr->index] = IN_TO_REG(val, data->in_vref); - pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_TEMP_MIN, - data->in_min[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_therm_max(struct device *dev, struct device_attribute *devattr, const char *buf, -@@ -488,11 +528,11 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[attr->index] = IN_TO_REG(val, data->in_vref); - pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_TEMP_MAX, - data->in_max[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_therm_crit(struct device *dev, struct device_attribute *devattr, const char *buf, -@@ -503,28 +543,51 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_crit[attr->index-11] = IN_TO_REG(val, data->in_vref); - pc87360_write_value(data, LD_IN, attr->index, PC87365_REG_TEMP_CRIT, - data->in_crit[attr->index-11]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - --#define show_and_set_therm(offset) \ --static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ -- show_therm_input, NULL, 11+offset-4); \ --static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ -- show_therm_min, set_therm_min, 11+offset-4); \ --static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \ -- show_therm_max, set_therm_max, 11+offset-4); \ --static SENSOR_DEVICE_ATTR(temp##offset##_crit, S_IWUSR | S_IRUGO, \ -- show_therm_crit, set_therm_crit, 11+offset-4); \ --static SENSOR_DEVICE_ATTR(temp##offset##_status, S_IRUGO, \ -- show_therm_status, NULL, 11+offset-4); --show_and_set_therm(4) --show_and_set_therm(5) --show_and_set_therm(6) -+/* the +11 term below reflects the fact that VLM units 11,12,13 are -+ used in the chip to measure voltage across the thermistors -+*/ -+static struct sensor_device_attribute therm_input[] = { -+ SENSOR_ATTR(temp4_input, S_IRUGO, show_therm_input, NULL, 0+11), -+ SENSOR_ATTR(temp5_input, S_IRUGO, show_therm_input, NULL, 1+11), -+ SENSOR_ATTR(temp6_input, S_IRUGO, show_therm_input, NULL, 2+11), -+}; -+static struct sensor_device_attribute therm_status[] = { -+ SENSOR_ATTR(temp4_status, S_IRUGO, show_therm_status, NULL, 0+11), -+ SENSOR_ATTR(temp5_status, S_IRUGO, show_therm_status, NULL, 1+11), -+ SENSOR_ATTR(temp6_status, S_IRUGO, show_therm_status, NULL, 2+11), -+}; -+static struct sensor_device_attribute therm_min[] = { -+ SENSOR_ATTR(temp4_min, S_IRUGO | S_IWUSR, -+ show_therm_min, set_therm_min, 0+11), -+ SENSOR_ATTR(temp5_min, S_IRUGO | S_IWUSR, -+ show_therm_min, set_therm_min, 1+11), -+ SENSOR_ATTR(temp6_min, S_IRUGO | S_IWUSR, -+ show_therm_min, set_therm_min, 2+11), -+}; -+static struct sensor_device_attribute therm_max[] = { -+ SENSOR_ATTR(temp4_max, S_IRUGO | S_IWUSR, -+ show_therm_max, set_therm_max, 0+11), -+ SENSOR_ATTR(temp5_max, S_IRUGO | S_IWUSR, -+ show_therm_max, set_therm_max, 1+11), -+ SENSOR_ATTR(temp6_max, S_IRUGO | S_IWUSR, -+ show_therm_max, set_therm_max, 2+11), -+}; -+static struct sensor_device_attribute therm_crit[] = { -+ SENSOR_ATTR(temp4_crit, S_IRUGO | S_IWUSR, -+ show_therm_crit, set_therm_crit, 0+11), -+ SENSOR_ATTR(temp5_crit, S_IRUGO | S_IWUSR, -+ show_therm_crit, set_therm_crit, 1+11), -+ SENSOR_ATTR(temp6_crit, S_IRUGO | S_IWUSR, -+ show_therm_crit, set_therm_crit, 2+11), -+}; - - static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf) - { -@@ -592,11 +655,11 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_min[attr->index] = TEMP_TO_REG(val); - pc87360_write_value(data, LD_TEMP, attr->index, PC87365_REG_TEMP_MIN, - data->temp_min[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_temp_max(struct device *dev, struct device_attribute *devattr, const char *buf, -@@ -607,11 +670,11 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[attr->index] = TEMP_TO_REG(val); - pc87360_write_value(data, LD_TEMP, attr->index, PC87365_REG_TEMP_MAX, - data->temp_max[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_temp_crit(struct device *dev, struct device_attribute *devattr, const char *buf, -@@ -622,28 +685,48 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_crit[attr->index] = TEMP_TO_REG(val); - pc87360_write_value(data, LD_TEMP, attr->index, PC87365_REG_TEMP_CRIT, - data->temp_crit[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - --#define show_and_set_temp(offset) \ --static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ -- show_temp_input, NULL, offset-1); \ --static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ -- show_temp_min, set_temp_min, offset-1); \ --static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IWUSR | S_IRUGO, \ -- show_temp_max, set_temp_max, offset-1); \ --static SENSOR_DEVICE_ATTR(temp##offset##_crit, S_IWUSR | S_IRUGO, \ -- show_temp_crit, set_temp_crit, offset-1); \ --static SENSOR_DEVICE_ATTR(temp##offset##_status, S_IRUGO, \ -- show_temp_status, NULL, offset-1); --show_and_set_temp(1) --show_and_set_temp(2) --show_and_set_temp(3) -+static struct sensor_device_attribute temp_input[] = { -+ SENSOR_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL, 0), -+ SENSOR_ATTR(temp2_input, S_IRUGO, show_temp_input, NULL, 1), -+ SENSOR_ATTR(temp3_input, S_IRUGO, show_temp_input, NULL, 2), -+}; -+static struct sensor_device_attribute temp_status[] = { -+ SENSOR_ATTR(temp1_status, S_IRUGO, show_temp_status, NULL, 0), -+ SENSOR_ATTR(temp2_status, S_IRUGO, show_temp_status, NULL, 1), -+ SENSOR_ATTR(temp3_status, S_IRUGO, show_temp_status, NULL, 2), -+}; -+static struct sensor_device_attribute temp_min[] = { -+ SENSOR_ATTR(temp1_min, S_IRUGO | S_IWUSR, -+ show_temp_min, set_temp_min, 0), -+ SENSOR_ATTR(temp2_min, S_IRUGO | S_IWUSR, -+ show_temp_min, set_temp_min, 1), -+ SENSOR_ATTR(temp3_min, S_IRUGO | S_IWUSR, -+ show_temp_min, set_temp_min, 2), -+}; -+static struct sensor_device_attribute temp_max[] = { -+ SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, -+ show_temp_max, set_temp_max, 0), -+ SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, -+ show_temp_max, set_temp_max, 1), -+ SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, -+ show_temp_max, set_temp_max, 2), -+}; -+static struct sensor_device_attribute temp_crit[] = { -+ SENSOR_ATTR(temp1_crit, S_IRUGO | S_IWUSR, -+ show_temp_crit, set_temp_crit, 0), -+ SENSOR_ATTR(temp2_crit, S_IRUGO | S_IWUSR, -+ show_temp_crit, set_temp_crit, 1), -+ SENSOR_ATTR(temp3_crit, S_IRUGO | S_IWUSR, -+ show_temp_crit, set_temp_crit, 2), -+}; - - static ssize_t show_temp_alarms(struct device *dev, struct device_attribute *attr, char *buf) - { -@@ -749,22 +832,24 @@ - static int pc87360_detect(struct i2c_adapter *adapter) - { - int i; -- struct i2c_client *new_client; -+ struct i2c_client *client; - struct pc87360_data *data; - int err = 0; - const char *name = "pc87360"; - int use_thermistors = 0; -+ struct device *dev; - - if (!(data = kzalloc(sizeof(struct pc87360_data), GFP_KERNEL))) - return -ENOMEM; - -- new_client = &data->client; -- i2c_set_clientdata(new_client, data); -- new_client->addr = address; -- init_MUTEX(&data->lock); -- new_client->adapter = adapter; -- new_client->driver = &pc87360_driver; -- new_client->flags = 0; -+ client = &data->client; -+ dev = &client->dev; -+ i2c_set_clientdata(client, data); -+ client->addr = address; -+ mutex_init(&data->lock); -+ client->adapter = adapter; -+ client->driver = &pc87360_driver; -+ client->flags = 0; - - data->fannr = 2; - data->innr = 0; -@@ -792,15 +877,15 @@ - break; - } - -- strcpy(new_client->name, name); -+ strlcpy(client->name, name, sizeof(client->name)); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - for (i = 0; i < 3; i++) { - if (((data->address[i] = extra_isa[i])) - && !request_region(extra_isa[i], PC87360_EXTENT, - pc87360_driver.driver.name)) { -- dev_err(&new_client->dev, "Region 0x%x-0x%x already " -+ dev_err(&client->dev, "Region 0x%x-0x%x already " - "in use!\n", extra_isa[i], - extra_isa[i]+PC87360_EXTENT-1); - for (i--; i >= 0; i--) -@@ -814,7 +899,7 @@ - if (data->fannr) - data->fan_conf = confreg[0] | (confreg[1] << 8); - -- if ((err = i2c_attach_client(new_client))) -+ if ((err = i2c_attach_client(client))) - goto ERROR2; - - /* Use the correct reference voltage -@@ -828,7 +913,7 @@ - PC87365_REG_TEMP_CONFIG); - } - data->in_vref = (i&0x02) ? 3025 : 2966; -- dev_dbg(&new_client->dev, "Using %s reference voltage\n", -+ dev_dbg(&client->dev, "Using %s reference voltage\n", - (i&0x02) ? "external" : "internal"); - - data->vid_conf = confreg[3]; -@@ -847,154 +932,64 @@ - if (devid == 0xe9 && data->address[1]) /* PC87366 */ - use_thermistors = confreg[2] & 0x40; - -- pc87360_init_client(new_client, use_thermistors); -+ pc87360_init_client(client, use_thermistors); - } - - /* Register sysfs hooks */ -- data->class_dev = hwmon_device_register(&new_client->dev); -+ data->class_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->class_dev)) { - err = PTR_ERR(data->class_dev); - goto ERROR3; - } - - if (data->innr) { -- device_create_file(&new_client->dev, &sensor_dev_attr_in0_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in1_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in2_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in3_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in4_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in5_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in6_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in7_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in8_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in9_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in10_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in0_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in1_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in2_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in3_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in4_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in5_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in6_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in7_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in8_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in9_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in10_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in0_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in1_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in2_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in3_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in4_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in5_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in6_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in7_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in8_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in9_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in10_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in0_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in1_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in2_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in3_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in4_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in5_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in6_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in7_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in8_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in9_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_in10_status.dev_attr); -- -- device_create_file(&new_client->dev, &dev_attr_cpu0_vid); -- device_create_file(&new_client->dev, &dev_attr_vrm); -- device_create_file(&new_client->dev, &dev_attr_alarms_in); -+ for (i = 0; i < 11; i++) { -+ device_create_file(dev, &in_input[i].dev_attr); -+ device_create_file(dev, &in_min[i].dev_attr); -+ device_create_file(dev, &in_max[i].dev_attr); -+ device_create_file(dev, &in_status[i].dev_attr); -+ } -+ device_create_file(dev, &dev_attr_cpu0_vid); -+ device_create_file(dev, &dev_attr_vrm); -+ device_create_file(dev, &dev_attr_alarms_in); - } - - if (data->tempnr) { -- device_create_file(&new_client->dev, &sensor_dev_attr_temp1_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp2_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp1_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp2_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp1_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp2_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp1_crit.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp2_crit.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp1_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp2_status.dev_attr); -- -- device_create_file(&new_client->dev, &dev_attr_alarms_temp); -- } -- if (data->tempnr == 3) { -- device_create_file(&new_client->dev, &sensor_dev_attr_temp3_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp3_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp3_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp3_crit.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp3_status.dev_attr); -+ for (i = 0; i < data->tempnr; i++) { -+ device_create_file(dev, &temp_input[i].dev_attr); -+ device_create_file(dev, &temp_min[i].dev_attr); -+ device_create_file(dev, &temp_max[i].dev_attr); -+ device_create_file(dev, &temp_crit[i].dev_attr); -+ device_create_file(dev, &temp_status[i].dev_attr); -+ } -+ device_create_file(dev, &dev_attr_alarms_temp); - } -+ - if (data->innr == 14) { -- device_create_file(&new_client->dev, &sensor_dev_attr_temp4_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp5_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp6_input.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp4_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp5_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp6_min.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp4_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp5_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp6_max.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp4_crit.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp5_crit.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp6_crit.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp4_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp5_status.dev_attr); -- device_create_file(&new_client->dev, &sensor_dev_attr_temp6_status.dev_attr); -- } -- -- if (data->fannr) { -- if (FAN_CONFIG_MONITOR(data->fan_conf, 0)) { -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan1_input.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan1_min.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan1_div.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan1_status.dev_attr); -- } -- -- if (FAN_CONFIG_MONITOR(data->fan_conf, 1)) { -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan2_input.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan2_min.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan2_div.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan2_status.dev_attr); -- } -- -- if (FAN_CONFIG_CONTROL(data->fan_conf, 0)) -- device_create_file(&new_client->dev, &sensor_dev_attr_pwm1.dev_attr); -- if (FAN_CONFIG_CONTROL(data->fan_conf, 1)) -- device_create_file(&new_client->dev, &sensor_dev_attr_pwm2.dev_attr); -- } -- if (data->fannr == 3) { -- if (FAN_CONFIG_MONITOR(data->fan_conf, 2)) { -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan3_input.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan3_min.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan3_div.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_fan3_status.dev_attr); -+ for (i = 0; i < 3; i++) { -+ device_create_file(dev, &therm_input[i].dev_attr); -+ device_create_file(dev, &therm_min[i].dev_attr); -+ device_create_file(dev, &therm_max[i].dev_attr); -+ device_create_file(dev, &therm_crit[i].dev_attr); -+ device_create_file(dev, &therm_status[i].dev_attr); - } -+ } - -- if (FAN_CONFIG_CONTROL(data->fan_conf, 2)) -- device_create_file(&new_client->dev, &sensor_dev_attr_pwm3.dev_attr); -+ for (i = 0; i < data->fannr; i++) { -+ if (FAN_CONFIG_MONITOR(data->fan_conf, i)) { -+ device_create_file(dev, &fan_input[i].dev_attr); -+ device_create_file(dev, &fan_min[i].dev_attr); -+ device_create_file(dev, &fan_div[i].dev_attr); -+ device_create_file(dev, &fan_status[i].dev_attr); -+ } -+ if (FAN_CONFIG_CONTROL(data->fan_conf, i)) -+ device_create_file(dev, &pwm[i].dev_attr); - } - - return 0; - - ERROR3: -- i2c_detach_client(new_client); -+ i2c_detach_client(client); - ERROR2: - for (i = 0; i < 3; i++) { - if (data->address[i]) { -@@ -1033,11 +1028,11 @@ - { - int res; - -- down(&(data->lock)); -+ mutex_lock(&(data->lock)); - if (bank != NO_BANK) - outb_p(bank, data->address[ldi] + PC87365_REG_BANK); - res = inb_p(data->address[ldi] + reg); -- up(&(data->lock)); -+ mutex_unlock(&(data->lock)); - - return res; - } -@@ -1045,11 +1040,11 @@ - static void pc87360_write_value(struct pc87360_data *data, u8 ldi, u8 bank, - u8 reg, u8 value) - { -- down(&(data->lock)); -+ mutex_lock(&(data->lock)); - if (bank != NO_BANK) - outb_p(bank, data->address[ldi] + PC87365_REG_BANK); - outb_p(value, data->address[ldi] + reg); -- up(&(data->lock)); -+ mutex_unlock(&(data->lock)); - } - - static void pc87360_init_client(struct i2c_client *client, int use_thermistors) -@@ -1071,7 +1066,7 @@ - } - - nr = data->innr < 11 ? data->innr : 11; -- for (i=0; i<nr; i++) { -+ for (i = 0; i < nr; i++) { - if (init >= init_in[i]) { - /* Forcibly enable voltage channel */ - reg = pc87360_read_value(data, LD_IN, i, -@@ -1088,14 +1083,14 @@ - - /* We can't blindly trust the Super-I/O space configuration bit, - most BIOS won't set it properly */ -- for (i=11; i<data->innr; i++) { -+ for (i = 11; i < data->innr; i++) { - reg = pc87360_read_value(data, LD_IN, i, - PC87365_REG_TEMP_STATUS); - use_thermistors = use_thermistors || (reg & 0x01); - } - - i = use_thermistors ? 2 : 0; -- for (; i<data->tempnr; i++) { -+ for (; i < data->tempnr; i++) { - if (init >= init_temp[i]) { - /* Forcibly enable temperature channel */ - reg = pc87360_read_value(data, LD_TEMP, i, -@@ -1111,7 +1106,7 @@ - } - - if (use_thermistors) { -- for (i=11; i<data->innr; i++) { -+ for (i = 11; i < data->innr; i++) { - if (init >= init_in[i]) { - /* The pin may already be used by thermal - diodes */ -@@ -1221,7 +1216,7 @@ - struct pc87360_data *data = i2c_get_clientdata(client); - u8 i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { - dev_dbg(&client->dev, "Data update\n"); -@@ -1321,7 +1316,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/f71805f.c 2006-03-22 17:06:11.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/f71805f.c 2006-03-22 17:06:16.000000000 +0100 -@@ -30,6 +30,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-sysfs.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - static struct platform_device *pdev; -@@ -98,10 +99,6 @@ - #define ADDR_REG_OFFSET 0 - #define DATA_REG_OFFSET 1 - --static struct resource f71805f_resource __initdata = { -- .flags = IORESOURCE_IO, --}; -- - /* - * Registers - */ -@@ -131,10 +128,10 @@ - struct f71805f_data { - unsigned short addr; - const char *name; -- struct semaphore lock; -+ struct mutex lock; - struct class_device *class_dev; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - unsigned long last_limits; /* In jiffies */ -@@ -150,7 +147,7 @@ - u8 temp_high[3]; - u8 temp_hyst[3]; - u8 temp_mode; -- u8 alarms[3]; -+ unsigned long alarms; - }; - - static inline long in_from_reg(u8 reg) -@@ -224,20 +221,20 @@ - { - u8 val; - -- down(&data->lock); -+ mutex_lock(&data->lock); - outb(reg, data->addr + ADDR_REG_OFFSET); - val = inb(data->addr + DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - - return val; - } - - static void f71805f_write8(struct f71805f_data *data, u8 reg, u8 val) - { -- down(&data->lock); -+ mutex_lock(&data->lock); - outb(reg, data->addr + ADDR_REG_OFFSET); - outb(val, data->addr + DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - } - - /* It is important to read the MSB first, because doing so latches the -@@ -246,24 +243,24 @@ - { - u16 val; - -- down(&data->lock); -+ mutex_lock(&data->lock); - outb(reg, data->addr + ADDR_REG_OFFSET); - val = inb(data->addr + DATA_REG_OFFSET) << 8; - outb(++reg, data->addr + ADDR_REG_OFFSET); - val |= inb(data->addr + DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - - return val; - } - - static void f71805f_write16(struct f71805f_data *data, u8 reg, u16 val) - { -- down(&data->lock); -+ mutex_lock(&data->lock); - outb(reg, data->addr + ADDR_REG_OFFSET); - outb(val >> 8, data->addr + DATA_REG_OFFSET); - outb(++reg, data->addr + ADDR_REG_OFFSET); - outb(val & 0xff, data->addr + DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - } - - static struct f71805f_data *f71805f_update_device(struct device *dev) -@@ -271,7 +268,7 @@ - struct f71805f_data *data = dev_get_drvdata(dev); - int nr; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - /* Limit registers cache is refreshed after 60 seconds */ - if (time_after(jiffies, data->last_updated + 60 * HZ) -@@ -314,16 +311,15 @@ - data->temp[nr] = f71805f_read8(data, - F71805F_REG_TEMP(nr)); - } -- for (nr = 0; nr < 3; nr++) { -- data->alarms[nr] = f71805f_read8(data, -- F71805F_REG_STATUS(nr)); -- } -+ data->alarms = f71805f_read8(data, F71805F_REG_STATUS(0)) -+ + (f71805f_read8(data, F71805F_REG_STATUS(1)) << 8) -+ + (f71805f_read8(data, F71805F_REG_STATUS(2)) << 16); - - data->last_updated = jiffies; - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } -@@ -362,10 +358,10 @@ - struct f71805f_data *data = dev_get_drvdata(dev); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_high[0] = in0_to_reg(val); - f71805f_write8(data, F71805F_REG_IN_HIGH(0), data->in_high[0]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -376,18 +372,14 @@ - struct f71805f_data *data = dev_get_drvdata(dev); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_low[0] = in0_to_reg(val); - f71805f_write8(data, F71805F_REG_IN_LOW(0), data->in_low[0]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } - --static DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL); --static DEVICE_ATTR(in0_max, S_IRUGO| S_IWUSR, show_in0_max, set_in0_max); --static DEVICE_ATTR(in0_min, S_IRUGO| S_IWUSR, show_in0_min, set_in0_min); -- - static ssize_t show_in(struct device *dev, struct device_attribute *devattr, - char *buf) - { -@@ -426,10 +418,10 @@ - int nr = attr->index; - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_high[nr] = in_to_reg(val); - f71805f_write8(data, F71805F_REG_IN_HIGH(nr), data->in_high[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -442,31 +434,14 @@ - int nr = attr->index; - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_low[nr] = in_to_reg(val); - f71805f_write8(data, F71805F_REG_IN_LOW(nr), data->in_low[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } - --#define sysfs_in(offset) \ --static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ -- show_in, NULL, offset); \ --static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ -- show_in_max, set_in_max, offset); \ --static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ -- show_in_min, set_in_min, offset) -- --sysfs_in(1); --sysfs_in(2); --sysfs_in(3); --sysfs_in(4); --sysfs_in(5); --sysfs_in(6); --sysfs_in(7); --sysfs_in(8); -- - static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, - char *buf) - { -@@ -495,24 +470,14 @@ - int nr = attr->index; - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_low[nr] = fan_to_reg(val); - f71805f_write16(data, F71805F_REG_FAN_LOW(nr), data->fan_low[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } - --#define sysfs_fan(offset) \ --static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ -- show_fan, NULL, offset - 1); \ --static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ -- show_fan_min, set_fan_min, offset - 1) -- --sysfs_fan(1); --sysfs_fan(2); --sysfs_fan(3); -- - static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, - char *buf) - { -@@ -562,10 +527,10 @@ - int nr = attr->index; - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_high[nr] = temp_to_reg(val); - f71805f_write8(data, F71805F_REG_TEMP_HIGH(nr), data->temp_high[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -578,35 +543,20 @@ - int nr = attr->index; - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_hyst[nr] = temp_to_reg(val); - f71805f_write8(data, F71805F_REG_TEMP_HYST(nr), data->temp_hyst[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } - --#define sysfs_temp(offset) \ --static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ -- show_temp, NULL, offset - 1); \ --static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ -- show_temp_max, set_temp_max, offset - 1); \ --static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR, \ -- show_temp_hyst, set_temp_hyst, offset - 1); \ --static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO, \ -- show_temp_type, NULL, offset - 1) -- --sysfs_temp(1); --sysfs_temp(2); --sysfs_temp(3); -- - static ssize_t show_alarms_in(struct device *dev, struct device_attribute - *devattr, char *buf) - { - struct f71805f_data *data = f71805f_update_device(dev); - -- return sprintf(buf, "%d\n", data->alarms[0] | -- ((data->alarms[1] & 0x01) << 8)); -+ return sprintf(buf, "%lu\n", data->alarms & 0x1ff); - } - - static ssize_t show_alarms_fan(struct device *dev, struct device_attribute -@@ -614,7 +564,7 @@ - { - struct f71805f_data *data = f71805f_update_device(dev); - -- return sprintf(buf, "%d\n", data->alarms[2] & 0x07); -+ return sprintf(buf, "%lu\n", (data->alarms >> 16) & 0x07); - } - - static ssize_t show_alarms_temp(struct device *dev, struct device_attribute -@@ -622,12 +572,18 @@ - { - struct f71805f_data *data = f71805f_update_device(dev); - -- return sprintf(buf, "%d\n", (data->alarms[1] >> 3) & 0x07); -+ return sprintf(buf, "%lu\n", (data->alarms >> 11) & 0x07); - } - --static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL); --static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL); --static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL); -+static ssize_t show_alarm(struct device *dev, struct device_attribute -+ *devattr, char *buf) -+{ -+ struct f71805f_data *data = f71805f_update_device(dev); -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); -+ int nr = attr->index; -+ -+ return sprintf(buf, "%lu\n", (data->alarms >> nr) & 1); -+} - - static ssize_t show_name(struct device *dev, struct device_attribute - *devattr, char *buf) -@@ -637,7 +593,104 @@ - return sprintf(buf, "%s\n", data->name); - } - --static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); -+static struct device_attribute f71805f_dev_attr[] = { -+ __ATTR(in0_input, S_IRUGO, show_in0, NULL), -+ __ATTR(in0_max, S_IRUGO| S_IWUSR, show_in0_max, set_in0_max), -+ __ATTR(in0_min, S_IRUGO| S_IWUSR, show_in0_min, set_in0_min), -+ __ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL), -+ __ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL), -+ __ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL), -+ __ATTR(name, S_IRUGO, show_name, NULL), -+}; -+ -+static struct sensor_device_attribute f71805f_sensor_attr[] = { -+ SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0), -+ SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1), -+ SENSOR_ATTR(in1_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 1), -+ SENSOR_ATTR(in1_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 1), -+ SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1), -+ SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2), -+ SENSOR_ATTR(in2_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 2), -+ SENSOR_ATTR(in2_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 2), -+ SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2), -+ SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3), -+ SENSOR_ATTR(in3_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 3), -+ SENSOR_ATTR(in3_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 3), -+ SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3), -+ SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4), -+ SENSOR_ATTR(in4_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 4), -+ SENSOR_ATTR(in4_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 4), -+ SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 4), -+ SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5), -+ SENSOR_ATTR(in5_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 5), -+ SENSOR_ATTR(in5_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 5), -+ SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 5), -+ SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6), -+ SENSOR_ATTR(in6_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 6), -+ SENSOR_ATTR(in6_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 6), -+ SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 6), -+ SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7), -+ SENSOR_ATTR(in7_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 7), -+ SENSOR_ATTR(in7_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 7), -+ SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 7), -+ SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8), -+ SENSOR_ATTR(in8_max, S_IRUGO | S_IWUSR, -+ show_in_max, set_in_max, 8), -+ SENSOR_ATTR(in8_min, S_IRUGO | S_IWUSR, -+ show_in_min, set_in_min, 8), -+ SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 8), -+ -+ SENSOR_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0), -+ SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, -+ show_temp_max, set_temp_max, 0), -+ SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, -+ show_temp_hyst, set_temp_hyst, 0), -+ SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0), -+ SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 11), -+ SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1), -+ SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, -+ show_temp_max, set_temp_max, 1), -+ SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, -+ show_temp_hyst, set_temp_hyst, 1), -+ SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1), -+ SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 12), -+ SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2), -+ SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, -+ show_temp_max, set_temp_max, 2), -+ SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, -+ show_temp_hyst, set_temp_hyst, 2), -+ SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2), -+ SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13), -+}; -+ -+static struct sensor_device_attribute f71805f_fan_attr[] = { -+ SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0), -+ SENSOR_ATTR(fan1_min, S_IRUGO | S_IWUSR, -+ show_fan_min, set_fan_min, 0), -+ SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 16), -+ SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1), -+ SENSOR_ATTR(fan2_min, S_IRUGO | S_IWUSR, -+ show_fan_min, set_fan_min, 1), -+ SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 17), -+ SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2), -+ SENSOR_ATTR(fan3_min, S_IRUGO | S_IWUSR, -+ show_fan_min, set_fan_min, 2), -+ SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 18), -+}; - - /* - * Device registration and initialization -@@ -668,7 +721,7 @@ - { - struct f71805f_data *data; - struct resource *res; -- int err; -+ int i, err; - - if (!(data = kzalloc(sizeof(struct f71805f_data), GFP_KERNEL))) { - err = -ENOMEM; -@@ -678,9 +731,9 @@ - - res = platform_get_resource(pdev, IORESOURCE_IO, 0); - data->addr = res->start; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - data->name = "f71805f"; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - platform_set_drvdata(pdev, data); - -@@ -695,76 +748,31 @@ - f71805f_init_device(data); - - /* Register sysfs interface files */ -- device_create_file(&pdev->dev, &dev_attr_in0_input); -- device_create_file(&pdev->dev, &dev_attr_in0_max); -- device_create_file(&pdev->dev, &dev_attr_in0_min); -- device_create_file(&pdev->dev, &sensor_dev_attr_in1_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in2_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in3_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in4_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in5_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in6_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in7_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in8_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in1_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in2_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in3_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in4_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in5_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in6_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in7_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in8_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in1_min.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in2_min.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in3_min.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in4_min.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in5_min.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in6_min.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in7_min.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_in8_min.dev_attr); -- if (data->fan_enabled & (1 << 0)) { -- device_create_file(&pdev->dev, -- &sensor_dev_attr_fan1_input.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_fan1_min.dev_attr); -- } -- if (data->fan_enabled & (1 << 1)) { -- device_create_file(&pdev->dev, -- &sensor_dev_attr_fan2_input.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_fan2_min.dev_attr); -- } -- if (data->fan_enabled & (1 << 2)) { -- device_create_file(&pdev->dev, -- &sensor_dev_attr_fan3_input.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_fan3_min.dev_attr); -- } -- device_create_file(&pdev->dev, -- &sensor_dev_attr_temp1_input.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_temp2_input.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_temp3_input.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_temp1_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_temp2_max.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_temp3_max.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_temp1_max_hyst.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_temp2_max_hyst.dev_attr); -- device_create_file(&pdev->dev, -- &sensor_dev_attr_temp3_max_hyst.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_temp1_type.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_temp2_type.dev_attr); -- device_create_file(&pdev->dev, &sensor_dev_attr_temp3_type.dev_attr); -- device_create_file(&pdev->dev, &dev_attr_alarms_in); -- device_create_file(&pdev->dev, &dev_attr_alarms_fan); -- device_create_file(&pdev->dev, &dev_attr_alarms_temp); -- device_create_file(&pdev->dev, &dev_attr_name); -+ for (i = 0; i < ARRAY_SIZE(f71805f_dev_attr); i++) { -+ err = device_create_file(&pdev->dev, &f71805f_dev_attr[i]); -+ if (err) -+ goto exit_class; -+ } -+ for (i = 0; i < ARRAY_SIZE(f71805f_sensor_attr); i++) { -+ err = device_create_file(&pdev->dev, -+ &f71805f_sensor_attr[i].dev_attr); -+ if (err) -+ goto exit_class; -+ } -+ for (i = 0; i < ARRAY_SIZE(f71805f_fan_attr); i++) { -+ if (!(data->fan_enabled & (1 << (i / 3)))) -+ continue; -+ err = device_create_file(&pdev->dev, -+ &f71805f_fan_attr[i].dev_attr); -+ if (err) -+ goto exit_class; -+ } - - return 0; - -+exit_class: -+ dev_err(&pdev->dev, "Sysfs interface creation failed\n"); -+ hwmon_device_unregister(data->class_dev); - exit_free: - kfree(data); - exit: -@@ -793,6 +801,11 @@ - - static int __init f71805f_device_add(unsigned short address) - { -+ struct resource res = { -+ .start = address, -+ .end = address + REGION_LENGTH - 1, -+ .flags = IORESOURCE_IO, -+ }; - int err; - - pdev = platform_device_alloc(DRVNAME, address); -@@ -802,10 +815,8 @@ - goto exit; - } - -- f71805f_resource.start = address; -- f71805f_resource.end = address + REGION_LENGTH - 1; -- f71805f_resource.name = pdev->name; -- err = platform_device_add_resources(pdev, &f71805f_resource, 1); -+ res.name = pdev->name; -+ err = platform_device_add_resources(pdev, &res, 1); - if (err) { - printk(KERN_ERR DRVNAME ": Device resource addition failed " - "(%d)\n", err); ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-ali1535.c 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-ali1535.c 2006-03-22 17:06:16.000000000 +0100 -@@ -63,7 +63,6 @@ - #include <linux/i2c.h> - #include <linux/init.h> - #include <asm/io.h> --#include <asm/semaphore.h> - - - /* ALI1535 SMBus address offsets */ -@@ -136,7 +135,6 @@ - - static struct pci_driver ali1535_driver; - static unsigned short ali1535_smba; --static DECLARE_MUTEX(i2c_ali1535_sem); - - /* Detect whether a ALI1535 can be found, and initialize it, where necessary. - Note the differences between kernels with the old PCI BIOS interface and -@@ -345,7 +343,6 @@ - int timeout; - s32 result = 0; - -- down(&i2c_ali1535_sem); - /* make sure SMBus is idle */ - temp = inb_p(SMBHSTSTS); - for (timeout = 0; -@@ -460,7 +457,6 @@ - break; - } - EXIT: -- up(&i2c_ali1535_sem); - return result; - } - -@@ -479,7 +475,7 @@ - - static struct i2c_adapter ali1535_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/chips/ds1374.c 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/chips/ds1374.c 2006-03-22 17:06:14.000000000 +0100 -@@ -26,6 +26,7 @@ - #include <linux/i2c.h> - #include <linux/rtc.h> - #include <linux/bcd.h> -+#include <linux/mutex.h> - - #define DS1374_REG_TOD0 0x00 - #define DS1374_REG_TOD1 0x01 -@@ -41,7 +42,7 @@ - - #define DS1374_DRV_NAME "ds1374" - --static DECLARE_MUTEX(ds1374_mutex); -+static DEFINE_MUTEX(ds1374_mutex); - - static struct i2c_driver ds1374_driver; - static struct i2c_client *save_client; -@@ -114,7 +115,7 @@ - ulong t1, t2; - int limit = 10; /* arbitrary retry limit */ - -- down(&ds1374_mutex); -+ mutex_lock(&ds1374_mutex); - - /* - * Since the reads are being performed one byte at a time using -@@ -127,7 +128,7 @@ - t2 = ds1374_read_rtc(); - } while (t1 != t2 && limit--); - -- up(&ds1374_mutex); -+ mutex_unlock(&ds1374_mutex); - - if (t1 != t2) { - dev_warn(&save_client->dev, -@@ -145,7 +146,7 @@ - - t1 = *(ulong *) arg; - -- down(&ds1374_mutex); -+ mutex_lock(&ds1374_mutex); - - /* - * Since the writes are being performed one byte at a time using -@@ -158,7 +159,7 @@ - t2 = ds1374_read_rtc(); - } while (t1 != t2 && limit--); - -- up(&ds1374_mutex); -+ mutex_unlock(&ds1374_mutex); - - if (t1 != t2) - dev_warn(&save_client->dev, ---- linux-2.6.16.orig/drivers/i2c/chips/m41t00.c 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/chips/m41t00.c 2006-03-22 17:06:14.000000000 +0100 -@@ -24,13 +24,14 @@ - #include <linux/i2c.h> - #include <linux/rtc.h> - #include <linux/bcd.h> -+#include <linux/mutex.h> - - #include <asm/time.h> - #include <asm/rtc.h> - - #define M41T00_DRV_NAME "m41t00" - --static DECLARE_MUTEX(m41t00_mutex); -+static DEFINE_MUTEX(m41t00_mutex); - - static struct i2c_driver m41t00_driver; - static struct i2c_client *save_client; -@@ -54,7 +55,7 @@ - sec = min = hour = day = mon = year = 0; - sec1 = min1 = hour1 = day1 = mon1 = year1 = 0; - -- down(&m41t00_mutex); -+ mutex_lock(&m41t00_mutex); - do { - if (((sec = i2c_smbus_read_byte_data(save_client, 0)) >= 0) - && ((min = i2c_smbus_read_byte_data(save_client, 1)) -@@ -80,7 +81,7 @@ - mon1 = mon; - year1 = year; - } while (--limit > 0); -- up(&m41t00_mutex); -+ mutex_unlock(&m41t00_mutex); - - if (limit == 0) { - dev_warn(&save_client->dev, -@@ -125,7 +126,7 @@ - BIN_TO_BCD(tm.tm_mday); - BIN_TO_BCD(tm.tm_year); - -- down(&m41t00_mutex); -+ mutex_lock(&m41t00_mutex); - if ((i2c_smbus_write_byte_data(save_client, 0, tm.tm_sec & 0x7f) < 0) - || (i2c_smbus_write_byte_data(save_client, 1, tm.tm_min & 0x7f) - < 0) -@@ -140,7 +141,7 @@ - - dev_warn(&save_client->dev,"m41t00: can't write to rtc chip\n"); - -- up(&m41t00_mutex); -+ mutex_unlock(&m41t00_mutex); - return; - } - ---- linux-2.6.16.orig/drivers/i2c/i2c-core.c 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/i2c-core.c 2006-03-22 17:06:21.000000000 +0100 -@@ -31,14 +31,17 @@ - #include <linux/idr.h> - #include <linux/seq_file.h> - #include <linux/platform_device.h> -+#include <linux/mutex.h> - #include <asm/uaccess.h> - - - static LIST_HEAD(adapters); - static LIST_HEAD(drivers); --static DECLARE_MUTEX(core_lists); -+static DEFINE_MUTEX(core_lists); - static DEFINE_IDR(i2c_adapter_idr); - -+static void i2c_notify(struct i2c_adapter *adap, struct i2c_driver *driver); -+ - /* match always succeeds, as we want the probe() to tell if we really accept this match */ - static int i2c_device_match(struct device *dev, struct device_driver *drv) - { -@@ -153,7 +156,7 @@ - struct list_head *item; - struct i2c_driver *driver; - -- down(&core_lists); -+ mutex_lock(&core_lists); - - if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) { - res = -ENOMEM; -@@ -168,8 +171,8 @@ - } - - adap->nr = id & MAX_ID_MASK; -- init_MUTEX(&adap->bus_lock); -- init_MUTEX(&adap->clist_lock); -+ mutex_init(&adap->bus_lock); -+ mutex_init(&adap->clist_lock); - list_add_tail(&adap->list,&adapters); - INIT_LIST_HEAD(&adap->clients); - -@@ -197,13 +200,11 @@ - /* inform drivers of new adapters */ - list_for_each(item,&drivers) { - driver = list_entry(item, struct i2c_driver, list); -- if (driver->attach_adapter) -- /* We ignore the return code; if it fails, too bad */ -- driver->attach_adapter(adap); -+ i2c_notify(adap, driver); - } - - out_unlock: -- up(&core_lists); -+ mutex_unlock(&core_lists); - return res; - } - -@@ -216,7 +217,7 @@ - struct i2c_client *client; - int res = 0; - -- down(&core_lists); -+ mutex_lock(&core_lists); - - /* First make sure that this adapter was ever added */ - list_for_each_entry(adap_from_list, &adapters, list) { -@@ -272,7 +273,7 @@ - dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); - - out_unlock: -- up(&core_lists); -+ mutex_unlock(&core_lists); - return res; - } - -@@ -287,9 +288,7 @@ - { - struct list_head *item; - struct i2c_adapter *adapter; -- int res = 0; -- -- down(&core_lists); -+ int res; - - /* add the driver to the list of i2c drivers in the driver core */ - driver->driver.owner = owner; -@@ -297,22 +296,21 @@ - - res = driver_register(&driver->driver); - if (res) -- goto out_unlock; -+ return res; - -+ mutex_lock(&core_lists); -+ - list_add_tail(&driver->list,&drivers); - pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name); - - /* now look for instances of driver on our adapters */ -- if (driver->attach_adapter) { -- list_for_each(item,&adapters) { -- adapter = list_entry(item, struct i2c_adapter, list); -- driver->attach_adapter(adapter); -- } -+ list_for_each(item, &adapters) { -+ adapter = list_entry(item, struct i2c_adapter, list); -+ i2c_notify(adapter, driver); - } - -- out_unlock: -- up(&core_lists); -- return res; -+ mutex_unlock(&core_lists); -+ return 0; - } - EXPORT_SYMBOL(i2c_register_driver); - -@@ -324,7 +322,7 @@ - - int res = 0; - -- down(&core_lists); -+ mutex_lock(&core_lists); - - /* Have a look at each adapter, if clients of this driver are still - * attached. If so, detach them to be able to kill the driver -@@ -363,7 +361,7 @@ - pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name); - - out_unlock: -- up(&core_lists); -+ mutex_unlock(&core_lists); - return 0; - } - -@@ -384,9 +382,9 @@ - { - int rval; - -- down(&adapter->clist_lock); -+ mutex_lock(&adapter->clist_lock); - rval = __i2c_check_addr(adapter, addr); -- up(&adapter->clist_lock); -+ mutex_unlock(&adapter->clist_lock); - - return rval; - } -@@ -395,13 +393,13 @@ - { - struct i2c_adapter *adapter = client->adapter; - -- down(&adapter->clist_lock); -+ mutex_lock(&adapter->clist_lock); - if (__i2c_check_addr(client->adapter, client->addr)) { -- up(&adapter->clist_lock); -+ mutex_unlock(&adapter->clist_lock); - return -EBUSY; - } - list_add_tail(&client->list,&adapter->clients); -- up(&adapter->clist_lock); -+ mutex_unlock(&adapter->clist_lock); - - if (adapter->client_register) { - if (adapter->client_register(client)) { -@@ -450,12 +448,12 @@ - } - } - -- down(&adapter->clist_lock); -+ mutex_lock(&adapter->clist_lock); - list_del(&client->list); - init_completion(&client->released); - device_remove_file(&client->dev, &dev_attr_client_name); - device_unregister(&client->dev); -- up(&adapter->clist_lock); -+ mutex_unlock(&adapter->clist_lock); - wait_for_completion(&client->released); - - out: -@@ -513,19 +511,19 @@ - struct list_head *item; - struct i2c_client *client; - -- down(&adap->clist_lock); -+ mutex_lock(&adap->clist_lock); - list_for_each(item,&adap->clients) { - client = list_entry(item, struct i2c_client, list); - if (!try_module_get(client->driver->driver.owner)) - continue; - if (NULL != client->driver->command) { -- up(&adap->clist_lock); -+ mutex_unlock(&adap->clist_lock); - client->driver->command(client,cmd,arg); -- down(&adap->clist_lock); -+ mutex_lock(&adap->clist_lock); - } - module_put(client->driver->driver.owner); - } -- up(&adap->clist_lock); -+ mutex_unlock(&adap->clist_lock); - } - - static int __init i2c_init(void) -@@ -569,9 +567,9 @@ - } - #endif - -- down(&adap->bus_lock); -+ mutex_lock(&adap->bus_lock); - ret = adap->algo->master_xfer(adap,msgs,num); -- up(&adap->bus_lock); -+ mutex_unlock(&adap->bus_lock); - - return ret; - } else { -@@ -775,16 +773,53 @@ - return 0; - } - -+/* For explicitely attaching a driver to a given device */ -+int i2c_probe_device(struct i2c_adapter *adapter, int driver_id, -+ int addr, int kind) -+{ -+ struct list_head *item; -+ struct i2c_driver *driver = NULL; -+ -+ /* There's no way to probe addresses on this adapter... */ -+ if (kind < 0 && !i2c_check_functionality(adapter, -+ I2C_FUNC_SMBUS_QUICK)) -+ return -EINVAL; -+ -+ mutex_lock(&core_lists); -+ list_for_each(item, &drivers) { -+ driver = list_entry(item, struct i2c_driver, list); -+ if (driver->id == driver_id) -+ break; -+ } -+ mutex_unlock(&core_lists); -+ if (!item) -+ return -ENOENT; -+ -+ return i2c_probe_address(adapter, addr, kind, driver->detect_client); -+} -+ -+static void i2c_notify(struct i2c_adapter *adap, struct i2c_driver *driver) -+{ -+ if (driver->attach_adapter) -+ driver->attach_adapter(adap); -+ -+ /* Probe devices if the driver provided the necessary information -+ (detect_client and address_data) */ -+ if (driver->detect_client && driver->address_data && -+ (driver->class & adap->class)) -+ i2c_probe(adap, driver->address_data, driver->detect_client); -+} -+ - struct i2c_adapter* i2c_get_adapter(int id) - { - struct i2c_adapter *adapter; - -- down(&core_lists); -+ mutex_lock(&core_lists); - adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id); - if (adapter && !try_module_get(adapter->owner)) - adapter = NULL; - -- up(&core_lists); -+ mutex_unlock(&core_lists); - return adapter; - } - -@@ -919,12 +954,11 @@ - u8 length, u8 *values) - { - union i2c_smbus_data data; -- int i; -+ - if (length > I2C_SMBUS_BLOCK_MAX) - length = I2C_SMBUS_BLOCK_MAX; -- for (i = 1; i <= length; i++) -- data.block[i] = values[i-1]; - data.block[0] = length; -+ memcpy(&data.block[1], values, length); - return i2c_smbus_xfer(client->adapter,client->addr,client->flags, - I2C_SMBUS_WRITE,command, - I2C_SMBUS_BLOCK_DATA,&data); -@@ -934,16 +968,14 @@ - s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values) - { - union i2c_smbus_data data; -- int i; -+ - if (i2c_smbus_xfer(client->adapter,client->addr,client->flags, - I2C_SMBUS_READ,command, - I2C_SMBUS_I2C_BLOCK_DATA,&data)) - return -1; -- else { -- for (i = 1; i <= data.block[0]; i++) -- values[i-1] = data.block[i]; -- return data.block[0]; -- } -+ -+ memcpy(values, &data.block[1], data.block[0]); -+ return data.block[0]; - } - - s32 i2c_smbus_write_i2c_block_data(struct i2c_client *client, u8 command, -@@ -1118,10 +1150,10 @@ - flags &= I2C_M_TEN | I2C_CLIENT_PEC; - - if (adapter->algo->smbus_xfer) { -- down(&adapter->bus_lock); -+ mutex_lock(&adapter->bus_lock); - res = adapter->algo->smbus_xfer(adapter,addr,flags,read_write, - command,size,data); -- up(&adapter->bus_lock); -+ mutex_unlock(&adapter->bus_lock); - } else - res = i2c_smbus_xfer_emulated(adapter,addr,flags,read_write, - command,size,data); -@@ -1153,6 +1185,7 @@ - EXPORT_SYMBOL(i2c_get_adapter); - EXPORT_SYMBOL(i2c_put_adapter); - EXPORT_SYMBOL(i2c_probe); -+EXPORT_SYMBOL(i2c_probe_device); - - EXPORT_SYMBOL(i2c_smbus_xfer); - EXPORT_SYMBOL(i2c_smbus_write_quick); ---- linux-2.6.16.orig/drivers/i2c/busses/scx200_acb.c 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/scx200_acb.c 2006-03-22 17:06:16.000000000 +0100 -@@ -1,27 +1,26 @@ --/* linux/drivers/i2c/scx200_acb.c -- -+/* - Copyright (c) 2001,2002 Christer Weinigel <wingel@nano-system.com> - - National Semiconductor SCx200 ACCESS.bus support -- -+ Also supports the AMD CS5535 and AMD CS5536 -+ - Based on i2c-keywest.c which is: - Copyright (c) 2001 Benjamin Herrenschmidt <benh@kernel.crashing.org> - Copyright (c) 2000 Philip Edelbrock <phil@stimpy.netroedge.com> -- -+ - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. -- -+ - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. -- -+ - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -- - */ - - #include <linux/module.h> -@@ -32,7 +31,9 @@ - #include <linux/smp_lock.h> - #include <linux/pci.h> - #include <linux/delay.h> -+#include <linux/mutex.h> - #include <asm/io.h> -+#include <asm/msr.h> - - #include <linux/scx200.h> - -@@ -47,16 +48,7 @@ - module_param_array(base, int, NULL, 0); - MODULE_PARM_DESC(base, "Base addresses for the ACCESS.bus controllers"); - --#ifdef DEBUG --#define DBG(x...) printk(KERN_DEBUG NAME ": " x) --#else --#define DBG(x...) --#endif -- --/* The hardware supports interrupt driven mode too, but I haven't -- implemented that. */ --#define POLLED_MODE 1 --#define POLL_TIMEOUT (HZ) -+#define POLL_TIMEOUT (HZ/5) - - enum scx200_acb_state { - state_idle, -@@ -79,12 +71,11 @@ - }; - - /* Physical interface */ --struct scx200_acb_iface --{ -+struct scx200_acb_iface { - struct scx200_acb_iface *next; - struct i2c_adapter adapter; - unsigned base; -- struct semaphore sem; -+ struct mutex mutex; - - /* State machine data */ - enum scx200_acb_state state; -@@ -100,7 +91,7 @@ - #define ACBSDA (iface->base + 0) - #define ACBST (iface->base + 1) - #define ACBST_SDAST 0x40 /* SDA Status */ --#define ACBST_BER 0x20 -+#define ACBST_BER 0x20 - #define ACBST_NEGACK 0x10 /* Negative Acknowledge */ - #define ACBST_STASTR 0x08 /* Stall After Start */ - #define ACBST_MASTER 0x02 -@@ -109,9 +100,9 @@ - #define ACBCTL1 (iface->base + 3) - #define ACBCTL1_STASTRE 0x80 - #define ACBCTL1_NMINTE 0x40 --#define ACBCTL1_ACK 0x10 --#define ACBCTL1_STOP 0x02 --#define ACBCTL1_START 0x01 -+#define ACBCTL1_ACK 0x10 -+#define ACBCTL1_STOP 0x02 -+#define ACBCTL1_START 0x01 - #define ACBADDR (iface->base + 4) - #define ACBCTL2 (iface->base + 5) - #define ACBCTL2_ENABLE 0x01 -@@ -122,8 +113,8 @@ - { - const char *errmsg; - -- DBG("state %s, status = 0x%02x\n", -- scx200_acb_state_name[iface->state], status); -+ dev_dbg(&iface->adapter.dev, "state %s, status = 0x%02x\n", -+ scx200_acb_state_name[iface->state], status); - - if (status & ACBST_BER) { - errmsg = "bus error"; -@@ -133,8 +124,17 @@ - errmsg = "not master"; - goto error; - } -- if (status & ACBST_NEGACK) -- goto negack; -+ if (status & ACBST_NEGACK) { -+ dev_dbg(&iface->adapter.dev, "negative ack in state %s\n", -+ scx200_acb_state_name[iface->state]); -+ -+ iface->state = state_idle; -+ iface->result = -ENXIO; -+ -+ outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); -+ outb(ACBST_STASTR | ACBST_NEGACK, ACBST); -+ return; -+ } - - switch (iface->state) { - case state_idle: -@@ -160,10 +160,10 @@ - case state_repeat_start: - outb(inb(ACBCTL1) | ACBCTL1_START, ACBCTL1); - /* fallthrough */ -- -+ - case state_quick: - if (iface->address_byte & 1) { -- if (iface->len == 1) -+ if (iface->len == 1) - outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1); - else - outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1); -@@ -202,26 +202,15 @@ - outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); - break; - } -- -+ - outb(*iface->ptr++, ACBSDA); - --iface->len; -- -+ - break; - } - - return; - -- negack: -- DBG("negative acknowledge in state %s\n", -- scx200_acb_state_name[iface->state]); -- -- iface->state = state_idle; -- iface->result = -ENXIO; -- -- outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); -- outb(ACBST_STASTR | ACBST_NEGACK, ACBST); -- return; -- - error: - dev_err(&iface->adapter.dev, "%s in state %s\n", errmsg, - scx200_acb_state_name[iface->state]); -@@ -231,20 +220,9 @@ - iface->needs_reset = 1; - } - --static void scx200_acb_timeout(struct scx200_acb_iface *iface) --{ -- dev_err(&iface->adapter.dev, "timeout in state %s\n", -- scx200_acb_state_name[iface->state]); -- -- iface->state = state_idle; -- iface->result = -EIO; -- iface->needs_reset = 1; --} -- --#ifdef POLLED_MODE - static void scx200_acb_poll(struct scx200_acb_iface *iface) - { -- u8 status = 0; -+ u8 status; - unsigned long timeout; - - timeout = jiffies + POLL_TIMEOUT; -@@ -254,17 +232,21 @@ - scx200_acb_machine(iface, status); - return; - } -- msleep(10); -+ yield(); - } - -- scx200_acb_timeout(iface); -+ dev_err(&iface->adapter.dev, "timeout in state %s\n", -+ scx200_acb_state_name[iface->state]); -+ -+ iface->state = state_idle; -+ iface->result = -EIO; -+ iface->needs_reset = 1; - } --#endif /* POLLED_MODE */ - - static void scx200_acb_reset(struct scx200_acb_iface *iface) - { - /* Disable the ACCESS.bus device and Configure the SCL -- frequency: 16 clock cycles */ -+ frequency: 16 clock cycles */ - outb(0x70, ACBCTL2); - /* Polling mode */ - outb(0, ACBCTL1); -@@ -283,9 +265,9 @@ - } - - static s32 scx200_acb_smbus_xfer(struct i2c_adapter *adapter, -- u16 address, unsigned short flags, -- char rw, u8 command, int size, -- union i2c_smbus_data *data) -+ u16 address, unsigned short flags, -+ char rw, u8 command, int size, -+ union i2c_smbus_data *data) - { - struct scx200_acb_iface *iface = i2c_get_adapdata(adapter); - int len; -@@ -295,53 +277,47 @@ - - switch (size) { - case I2C_SMBUS_QUICK: -- len = 0; -- buffer = NULL; -- break; -+ len = 0; -+ buffer = NULL; -+ break; -+ - case I2C_SMBUS_BYTE: -- if (rw == I2C_SMBUS_READ) { -- len = 1; -- buffer = &data->byte; -- } else { -- len = 1; -- buffer = &command; -- } -- break; -+ len = 1; -+ buffer = rw ? &data->byte : &command; -+ break; -+ - case I2C_SMBUS_BYTE_DATA: -- len = 1; -- buffer = &data->byte; -- break; -+ len = 1; -+ buffer = &data->byte; -+ break; -+ - case I2C_SMBUS_WORD_DATA: - len = 2; -- cur_word = cpu_to_le16(data->word); -- buffer = (u8 *)&cur_word; -+ cur_word = cpu_to_le16(data->word); -+ buffer = (u8 *)&cur_word; - break; -+ - case I2C_SMBUS_BLOCK_DATA: -- len = data->block[0]; -- buffer = &data->block[1]; -+ len = data->block[0]; -+ buffer = &data->block[1]; - break; -+ - default: -- return -EINVAL; -+ return -EINVAL; - } - -- DBG("size=%d, address=0x%x, command=0x%x, len=%d, read=%d\n", -- size, address, command, len, rw == I2C_SMBUS_READ); -+ dev_dbg(&adapter->dev, -+ "size=%d, address=0x%x, command=0x%x, len=%d, read=%d\n", -+ size, address, command, len, rw); - - if (!len && rw == I2C_SMBUS_READ) { -- dev_warn(&adapter->dev, "zero length read\n"); -+ dev_dbg(&adapter->dev, "zero length read\n"); - return -EINVAL; - } - -- if (len && !buffer) { -- dev_warn(&adapter->dev, "nonzero length but no buffer\n"); -- return -EFAULT; -- } -- -- down(&iface->sem); -+ mutex_lock(&iface->mutex); - -- iface->address_byte = address<<1; -- if (rw == I2C_SMBUS_READ) -- iface->address_byte |= 1; -+ iface->address_byte = (address << 1) | rw; - iface->command = command; - iface->ptr = buffer; - iface->len = len; -@@ -355,25 +331,21 @@ - else - iface->state = state_address; - --#ifdef POLLED_MODE - while (iface->state != state_idle) - scx200_acb_poll(iface); --#else /* POLLED_MODE */ --#error Interrupt driven mode not implemented --#endif /* POLLED_MODE */ - - if (iface->needs_reset) - scx200_acb_reset(iface); - - rc = iface->result; - -- up(&iface->sem); -+ mutex_unlock(&iface->mutex); - - if (rc == 0 && size == I2C_SMBUS_WORD_DATA && rw == I2C_SMBUS_READ) -- data->word = le16_to_cpu(cur_word); -+ data->word = le16_to_cpu(cur_word); - - #ifdef DEBUG -- DBG(": transfer done, result: %d", rc); -+ dev_dbg(&adapter->dev, "transfer done, result: %d", rc); - if (buffer) { - int i; - printk(" data:"); -@@ -400,17 +372,18 @@ - }; - - static struct scx200_acb_iface *scx200_acb_list; -+static DECLARE_MUTEX(scx200_acb_list_mutex); - - static int scx200_acb_probe(struct scx200_acb_iface *iface) - { - u8 val; - - /* Disable the ACCESS.bus device and Configure the SCL -- frequency: 16 clock cycles */ -+ frequency: 16 clock cycles */ - outb(0x70, ACBCTL2); - - if (inb(ACBCTL2) != 0x70) { -- DBG("ACBCTL2 readback failed\n"); -+ pr_debug(NAME ": ACBCTL2 readback failed\n"); - return -ENXIO; - } - -@@ -418,7 +391,8 @@ - - val = inb(ACBCTL1); - if (val) { -- DBG("disabled, but ACBCTL1=0x%02x\n", val); -+ pr_debug(NAME ": disabled, but ACBCTL1=0x%02x\n", -+ val); - return -ENXIO; - } - -@@ -428,18 +402,19 @@ - - val = inb(ACBCTL1); - if ((val & ACBCTL1_NMINTE) != ACBCTL1_NMINTE) { -- DBG("enabled, but NMINTE won't be set, ACBCTL1=0x%02x\n", val); -+ pr_debug(NAME ": enabled, but NMINTE won't be set, " -+ "ACBCTL1=0x%02x\n", val); - return -ENXIO; - } - - return 0; - } - --static int __init scx200_acb_create(int base, int index) -+static int __init scx200_acb_create(const char *text, int base, int index) - { - struct scx200_acb_iface *iface; - struct i2c_adapter *adapter; -- int rc = 0; -+ int rc; - char description[64]; - - iface = kzalloc(sizeof(*iface), GFP_KERNEL); -@@ -451,50 +426,51 @@ - - adapter = &iface->adapter; - i2c_set_adapdata(adapter, iface); -- snprintf(adapter->name, I2C_NAME_SIZE, "SCx200 ACB%d", index); -+ snprintf(adapter->name, I2C_NAME_SIZE, "%s ACB%d", text, index); - adapter->owner = THIS_MODULE; - adapter->id = I2C_HW_SMBUS_SCX200; - adapter->algo = &scx200_acb_algorithm; -- adapter->class = I2C_CLASS_HWMON; -+ adapter->class = I2C_CLASS_HWMON | I2C_CLASS_DATA; -+ -+ mutex_init(&iface->mutex); - -- init_MUTEX(&iface->sem); -+ snprintf(description, sizeof(description), "%s ACCESS.bus [%s]", -+ text, adapter->name); - -- snprintf(description, sizeof(description), "NatSemi SCx200 ACCESS.bus [%s]", adapter->name); - if (request_region(base, 8, description) == 0) { -- dev_err(&adapter->dev, "can't allocate io 0x%x-0x%x\n", -+ printk(KERN_ERR NAME ": can't allocate io 0x%x-0x%x\n", - base, base + 8-1); - rc = -EBUSY; -- goto errout; -+ goto errout_free; - } - iface->base = base; - - rc = scx200_acb_probe(iface); - if (rc) { -- dev_warn(&adapter->dev, "probe failed\n"); -- goto errout; -+ printk(KERN_WARNING NAME ": probe failed\n"); -+ goto errout_release; - } - - scx200_acb_reset(iface); - - if (i2c_add_adapter(adapter) < 0) { -- dev_err(&adapter->dev, "failed to register\n"); -+ printk(KERN_ERR NAME ": failed to register\n"); - rc = -ENODEV; -- goto errout; -+ goto errout_release; - } - -- lock_kernel(); -+ down(&scx200_acb_list_mutex); - iface->next = scx200_acb_list; - scx200_acb_list = iface; -- unlock_kernel(); -+ up(&scx200_acb_list_mutex); - - return 0; - -+ errout_release: -+ release_region(iface->base, 8); -+ errout_free: -+ kfree(iface); - errout: -- if (iface) { -- if (iface->base) -- release_region(iface->base, 8); -- kfree(iface); -- } - return rc; - } - -@@ -504,50 +480,69 @@ - { }, - }; - -+static struct pci_device_id divil_pci[] = { -+ { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_ISA) }, -+ { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA) }, -+ { } /* NULL entry */ -+}; -+ -+#define MSR_LBAR_SMB 0x5140000B -+ -+static int scx200_add_cs553x(void) -+{ -+ u32 low, hi; -+ u32 smb_base; -+ -+ /* Grab & reserve the SMB I/O range */ -+ rdmsr(MSR_LBAR_SMB, low, hi); -+ -+ /* Check the IO mask and whether SMB is enabled */ -+ if (hi != 0x0000F001) { -+ printk(KERN_WARNING NAME ": SMBus not enabled\n"); -+ return -ENODEV; -+ } -+ -+ /* SMBus IO size is 8 bytes */ -+ smb_base = low & 0x0000FFF8; -+ -+ return scx200_acb_create("CS5535", smb_base, 0); -+} -+ - static int __init scx200_acb_init(void) - { - int i; -- int rc; -+ int rc = -ENODEV; - - pr_debug(NAME ": NatSemi SCx200 ACCESS.bus Driver\n"); - - /* Verify that this really is a SCx200 processor */ -- if (pci_dev_present(scx200) == 0) -- return -ENODEV; -+ if (pci_dev_present(scx200)) { -+ for (i = 0; i < MAX_DEVICES; ++i) { -+ if (base[i] > 0) -+ rc = scx200_acb_create("SCx200", base[i], i); -+ } -+ } else if (pci_dev_present(divil_pci)) -+ rc = scx200_add_cs553x(); - -- rc = -ENXIO; -- for (i = 0; i < MAX_DEVICES; ++i) { -- if (base[i] > 0) -- rc = scx200_acb_create(base[i], i); -- } -- if (scx200_acb_list) -- return 0; - return rc; - } - - static void __exit scx200_acb_cleanup(void) - { - struct scx200_acb_iface *iface; -- lock_kernel(); -+ -+ down(&scx200_acb_list_mutex); - while ((iface = scx200_acb_list) != NULL) { - scx200_acb_list = iface->next; -- unlock_kernel(); -+ up(&scx200_acb_list_mutex); - - i2c_del_adapter(&iface->adapter); - release_region(iface->base, 8); - kfree(iface); -- lock_kernel(); -+ down(&scx200_acb_list_mutex); - } -- unlock_kernel(); -+ up(&scx200_acb_list_mutex); - } - - module_init(scx200_acb_init); - module_exit(scx200_acb_cleanup); -- --/* -- Local variables: -- compile-command: "make -k -C ../.. SUBDIRS=drivers/i2c modules" -- c-basic-offset: 8 -- End: --*/ -- ---- linux-2.6.16.orig/Documentation/i2c/busses/scx200_acb 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/Documentation/i2c/busses/scx200_acb 2006-03-22 17:06:15.000000000 +0100 -@@ -6,9 +6,10 @@ - ----------------- - - * base: int -- Base addresses for the ACCESS.bus controllers -+ Base addresses for the ACCESS.bus controllers on SCx200 and SC1100 devices - - Description - ----------- - --Enable the use of the ACCESS.bus controllers of a SCx200 processor. -+Enable the use of the ACCESS.bus controller on the Geode SCx200 and -+SC1100 processors and the CS5535 and CS5536 Geode companion devices. ---- linux-2.6.16.orig/drivers/i2c/busses/Kconfig 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/Kconfig 2006-03-22 17:06:16.000000000 +0100 -@@ -163,17 +163,22 @@ - I2C bus. - - config I2C_PIIX4 -- tristate "Intel PIIX4" -+ tristate "Intel PIIX4 and compatible (ATI/Serverworks/Broadcom/SMSC)" - depends on I2C && PCI - help - If you say yes to this option, support will be included for the Intel - PIIX4 family of mainboard I2C interfaces. Specifically, the following -- versions of the chipset are supported: -+ versions of the chipset are supported (note that Serverworks is part -+ of Broadcom): - Intel PIIX4 - Intel 440MX -+ ATI IXP200 -+ ATI IXP300 -+ ATI IXP400 - Serverworks OSB4 - Serverworks CSB5 - Serverworks CSB6 -+ Serverworks HT-1000 - SMSC Victory66 - - This driver can also be built as a module. If so, the module -@@ -284,7 +289,10 @@ - This driver is a replacement for (and was inspired by) an older - driver named i2c-philips-par. The new driver supports more devices, - and makes it easier to add support for new devices. -- -+ -+ An adapter type parameter is now mandatory. Please read the file -+ Documentation/i2c/busses/i2c-parport for details. -+ - Another driver exists, named i2c-parport-light, which doesn't depend - on the parport driver. This is meant for embedded systems. Don't say - Y here if you intend to say Y or M there. -@@ -389,10 +397,11 @@ - also be specified with a module parameter. - - config SCx200_ACB -- tristate "NatSemi SCx200 ACCESS.bus" -- depends on I2C && PCI -+ tristate "Geode ACCESS.bus support" -+ depends on X86_32 && I2C && PCI - help -- Enable the use of the ACCESS.bus controllers of a SCx200 processor. -+ Enable the use of the ACCESS.bus controllers on the Geode SCx200 and -+ SC1100 processors and the CS5535 and CS5536 Geode companion devices. - - If you don't know what to do here, say N. - ---- linux-2.6.16.orig/drivers/hwmon/w83792d.c 2006-03-22 17:06:10.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/w83792d.c 2006-03-22 17:06:16.000000000 +0100 -@@ -43,6 +43,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-sysfs.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END }; -@@ -271,7 +272,7 @@ - struct class_device *class_dev; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -300,7 +301,6 @@ - u8 sf2_levels[3][4]; /* Smart FanII: Fan1,2,3 duty cycle levels */ - }; - --static int w83792d_attach_adapter(struct i2c_adapter *adapter); - static int w83792d_detect(struct i2c_adapter *adapter, int address, int kind); - static int w83792d_detach_client(struct i2c_client *client); - static struct w83792d_data *w83792d_update_device(struct device *dev); -@@ -315,7 +315,9 @@ - .driver = { - .name = "w83792d", - }, -- .attach_adapter = w83792d_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = w83792d_detect, - .detach_client = w83792d_detach_client, - }; - -@@ -382,30 +384,40 @@ - store_in_reg(MIN, min); - store_in_reg(MAX, max); - --#define sysfs_in_reg(offset) \ --static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, show_in, \ -- NULL, offset); \ --static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ -- show_in_min, store_in_min, offset); \ --static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ -- show_in_max, store_in_max, offset); -- --sysfs_in_reg(0); --sysfs_in_reg(1); --sysfs_in_reg(2); --sysfs_in_reg(3); --sysfs_in_reg(4); --sysfs_in_reg(5); --sysfs_in_reg(6); --sysfs_in_reg(7); --sysfs_in_reg(8); -- --#define device_create_file_in(client, offset) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_in##offset##_input.dev_attr); \ --device_create_file(&client->dev, &sensor_dev_attr_in##offset##_max.dev_attr); \ --device_create_file(&client->dev, &sensor_dev_attr_in##offset##_min.dev_attr); \ --} while (0) -+static struct sensor_device_attribute sda_in_input[] = { -+ SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0), -+ SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1), -+ SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2), -+ SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3), -+ SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4), -+ SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5), -+ SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6), -+ SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7), -+ SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8), -+}; -+static struct sensor_device_attribute sda_in_min[] = { -+ SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0), -+ SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1), -+ SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2), -+ SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3), -+ SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4), -+ SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5), -+ SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6), -+ SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7), -+ SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8), -+}; -+static struct sensor_device_attribute sda_in_max[] = { -+ SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0), -+ SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1), -+ SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2), -+ SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3), -+ SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4), -+ SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5), -+ SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6), -+ SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7), -+ SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8), -+}; -+ - - #define show_fan_reg(reg) \ - static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \ -@@ -486,28 +498,33 @@ - return count; - } - --#define sysfs_fan(offset) \ --static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_fan, NULL, \ -- offset); \ --static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ -- show_fan_div, store_fan_div, offset); \ --static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ -- show_fan_min, store_fan_min, offset); -- --sysfs_fan(1); --sysfs_fan(2); --sysfs_fan(3); --sysfs_fan(4); --sysfs_fan(5); --sysfs_fan(6); --sysfs_fan(7); -- --#define device_create_file_fan(client, offset) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_input.dev_attr); \ --device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_div.dev_attr); \ --device_create_file(&client->dev, &sensor_dev_attr_fan##offset##_min.dev_attr); \ --} while (0) -+static struct sensor_device_attribute sda_fan_input[] = { -+ SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 1), -+ SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 2), -+ SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 3), -+ SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 4), -+ SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 5), -+ SENSOR_ATTR(fan6_input, S_IRUGO, show_fan, NULL, 6), -+ SENSOR_ATTR(fan7_input, S_IRUGO, show_fan, NULL, 7), -+}; -+static struct sensor_device_attribute sda_fan_min[] = { -+ SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min, store_fan_min, 1), -+ SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min, store_fan_min, 2), -+ SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min, store_fan_min, 3), -+ SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min, store_fan_min, 4), -+ SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min, store_fan_min, 5), -+ SENSOR_ATTR(fan6_min, S_IWUSR | S_IRUGO, show_fan_min, store_fan_min, 6), -+ SENSOR_ATTR(fan7_min, S_IWUSR | S_IRUGO, show_fan_min, store_fan_min, 7), -+}; -+static struct sensor_device_attribute sda_fan_div[] = { -+ SENSOR_ATTR(fan1_div, S_IWUSR | S_IRUGO, show_fan_div, store_fan_div, 1), -+ SENSOR_ATTR(fan2_div, S_IWUSR | S_IRUGO, show_fan_div, store_fan_div, 2), -+ SENSOR_ATTR(fan3_div, S_IWUSR | S_IRUGO, show_fan_div, store_fan_div, 3), -+ SENSOR_ATTR(fan4_div, S_IWUSR | S_IRUGO, show_fan_div, store_fan_div, 4), -+ SENSOR_ATTR(fan5_div, S_IWUSR | S_IRUGO, show_fan_div, store_fan_div, 5), -+ SENSOR_ATTR(fan6_div, S_IWUSR | S_IRUGO, show_fan_div, store_fan_div, 6), -+ SENSOR_ATTR(fan7_div, S_IWUSR | S_IRUGO, show_fan_div, store_fan_div, 7), -+}; - - - /* read/write the temperature1, includes measured value and limits */ -@@ -539,21 +556,6 @@ - return count; - } - -- --static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0); --static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1, -- store_temp1, 1); --static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1, -- store_temp1, 2); -- --#define device_create_file_temp1(client) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_temp1_input.dev_attr); \ --device_create_file(&client->dev, &sensor_dev_attr_temp1_max.dev_attr); \ --device_create_file(&client->dev, &sensor_dev_attr_temp1_max_hyst.dev_attr); \ --} while (0) -- -- - /* read/write the temperature2-3, includes measured value and limits */ - - static ssize_t show_temp23(struct device *dev, struct device_attribute *attr, -@@ -590,25 +592,23 @@ - return count; - } - --#define sysfs_temp23(name,idx) \ --static SENSOR_DEVICE_ATTR_2(name##_input, S_IRUGO, show_temp23, NULL, \ -- idx, 0); \ --static SENSOR_DEVICE_ATTR_2(name##_max, S_IRUGO | S_IWUSR, \ -- show_temp23, store_temp23, idx, 2); \ --static SENSOR_DEVICE_ATTR_2(name##_max_hyst, S_IRUGO | S_IWUSR, \ -- show_temp23, store_temp23, idx, 4); -- --sysfs_temp23(temp2,0) --sysfs_temp23(temp3,1) -- --#define device_create_file_temp_add(client, offset) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_temp##offset##_input.dev_attr); \ --device_create_file(&client->dev, &sensor_dev_attr_temp##offset##_max.dev_attr); \ --device_create_file(&client->dev, \ --&sensor_dev_attr_temp##offset##_max_hyst.dev_attr); \ --} while (0) -+static struct sensor_device_attribute_2 sda_temp_input[] = { -+ SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0), -+ SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0), -+ SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0), -+}; -+ -+static struct sensor_device_attribute_2 sda_temp_max[] = { -+ SENSOR_ATTR_2(temp1_max, S_IRUGO | S_IWUSR, show_temp1, store_temp1, 0, 1), -+ SENSOR_ATTR_2(temp2_max, S_IRUGO | S_IWUSR, show_temp23, store_temp23, 0, 2), -+ SENSOR_ATTR_2(temp3_max, S_IRUGO | S_IWUSR, show_temp23, store_temp23, 1, 2), -+}; - -+static struct sensor_device_attribute_2 sda_temp_max_hyst[] = { -+ SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1, store_temp1, 0, 2), -+ SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp23, store_temp23, 0, 4), -+ SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp23, store_temp23, 1, 4), -+}; - - /* get reatime status of all sensors items: voltage, temp, fan */ - static ssize_t -@@ -620,10 +620,6 @@ - - static - DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL); --#define device_create_file_alarms(client) \ --device_create_file(&client->dev, &dev_attr_alarms); -- -- - - static ssize_t - show_pwm(struct device *dev, struct device_attribute *attr, -@@ -711,26 +707,19 @@ - return count; - } - --#define sysfs_pwm(offset) \ --static SENSOR_DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \ -- show_pwm, store_pwm, offset); \ --static SENSOR_DEVICE_ATTR(pwm##offset##_enable, S_IRUGO | S_IWUSR, \ -- show_pwmenable, store_pwmenable, offset); \ -- --sysfs_pwm(1); --sysfs_pwm(2); --sysfs_pwm(3); -- -- --#define device_create_file_pwm(client, offset) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_pwm##offset.dev_attr); \ --} while (0) -- --#define device_create_file_pwmenable(client, offset) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_pwm##offset##_enable.dev_attr); \ --} while (0) -+static struct sensor_device_attribute sda_pwm[] = { -+ SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1), -+ SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2), -+ SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3), -+}; -+static struct sensor_device_attribute sda_pwm_enable[] = { -+ SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, -+ show_pwmenable, store_pwmenable, 1), -+ SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, -+ show_pwmenable, store_pwmenable, 2), -+ SENSOR_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, -+ show_pwmenable, store_pwmenable, 3), -+}; - - - static ssize_t -@@ -764,18 +753,14 @@ - return count; - } - --#define sysfs_pwm_mode(offset) \ --static SENSOR_DEVICE_ATTR(pwm##offset##_mode, S_IRUGO | S_IWUSR, \ -- show_pwm_mode, store_pwm_mode, offset); -- --sysfs_pwm_mode(1); --sysfs_pwm_mode(2); --sysfs_pwm_mode(3); -- --#define device_create_file_pwm_mode(client, offset) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_pwm##offset##_mode.dev_attr); \ --} while (0) -+static struct sensor_device_attribute sda_pwm_mode[] = { -+ SENSOR_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, -+ show_pwm_mode, store_pwm_mode, 1), -+ SENSOR_ATTR(pwm2_mode, S_IWUSR | S_IRUGO, -+ show_pwm_mode, store_pwm_mode, 2), -+ SENSOR_ATTR(pwm3_mode, S_IWUSR | S_IRUGO, -+ show_pwm_mode, store_pwm_mode, 3), -+}; - - - static ssize_t -@@ -788,12 +773,6 @@ - - static DEVICE_ATTR(chassis, S_IRUGO, show_regs_chassis, NULL); - --#define device_create_file_chassis(client) \ --do { \ --device_create_file(&client->dev, &dev_attr_chassis); \ --} while (0) -- -- - static ssize_t - show_chassis_clear(struct device *dev, struct device_attribute *attr, char *buf) - { -@@ -824,13 +803,6 @@ - static DEVICE_ATTR(chassis_clear, S_IRUGO | S_IWUSR, - show_chassis_clear, store_chassis_clear); - --#define device_create_file_chassis_clear(client) \ --do { \ --device_create_file(&client->dev, &dev_attr_chassis_clear); \ --} while (0) -- -- -- - /* For Smart Fan I / Thermal Cruise */ - static ssize_t - show_thermal_cruise(struct device *dev, struct device_attribute *attr, -@@ -864,20 +836,14 @@ - return count; - } - --#define sysfs_thermal_cruise(offset) \ --static SENSOR_DEVICE_ATTR(thermal_cruise##offset, S_IRUGO | S_IWUSR, \ -- show_thermal_cruise, store_thermal_cruise, offset); -- --sysfs_thermal_cruise(1); --sysfs_thermal_cruise(2); --sysfs_thermal_cruise(3); -- --#define device_create_file_thermal_cruise(client, offset) \ --do { \ --device_create_file(&client->dev, \ --&sensor_dev_attr_thermal_cruise##offset.dev_attr); \ --} while (0) -- -+static struct sensor_device_attribute sda_thermal_cruise[] = { -+ SENSOR_ATTR(thermal_cruise1, S_IWUSR | S_IRUGO, -+ show_thermal_cruise, store_thermal_cruise, 1), -+ SENSOR_ATTR(thermal_cruise2, S_IWUSR | S_IRUGO, -+ show_thermal_cruise, store_thermal_cruise, 2), -+ SENSOR_ATTR(thermal_cruise3, S_IWUSR | S_IRUGO, -+ show_thermal_cruise, store_thermal_cruise, 3), -+}; - - /* For Smart Fan I/Thermal Cruise and Smart Fan II */ - static ssize_t -@@ -916,19 +882,14 @@ - return count; - } - --#define sysfs_tolerance(offset) \ --static SENSOR_DEVICE_ATTR(tolerance##offset, S_IRUGO | S_IWUSR, \ -- show_tolerance, store_tolerance, offset); -- --sysfs_tolerance(1); --sysfs_tolerance(2); --sysfs_tolerance(3); -- --#define device_create_file_tolerance(client, offset) \ --do { \ --device_create_file(&client->dev, &sensor_dev_attr_tolerance##offset.dev_attr); \ --} while (0) -- -+static struct sensor_device_attribute sda_tolerance[] = { -+ SENSOR_ATTR(tolerance1, S_IWUSR | S_IRUGO, -+ show_tolerance, store_tolerance, 1), -+ SENSOR_ATTR(tolerance2, S_IWUSR | S_IRUGO, -+ show_tolerance, store_tolerance, 2), -+ SENSOR_ATTR(tolerance3, S_IWUSR | S_IRUGO, -+ show_tolerance, store_tolerance, 3), -+}; - - /* For Smart Fan II */ - static ssize_t -@@ -964,28 +925,34 @@ - return count; - } - --#define sysfs_sf2_point(offset, index) \ --static SENSOR_DEVICE_ATTR_2(sf2_point##offset##_fan##index, S_IRUGO | S_IWUSR, \ -- show_sf2_point, store_sf2_point, offset, index); -- --sysfs_sf2_point(1, 1); /* Fan1 */ --sysfs_sf2_point(2, 1); /* Fan1 */ --sysfs_sf2_point(3, 1); /* Fan1 */ --sysfs_sf2_point(4, 1); /* Fan1 */ --sysfs_sf2_point(1, 2); /* Fan2 */ --sysfs_sf2_point(2, 2); /* Fan2 */ --sysfs_sf2_point(3, 2); /* Fan2 */ --sysfs_sf2_point(4, 2); /* Fan2 */ --sysfs_sf2_point(1, 3); /* Fan3 */ --sysfs_sf2_point(2, 3); /* Fan3 */ --sysfs_sf2_point(3, 3); /* Fan3 */ --sysfs_sf2_point(4, 3); /* Fan3 */ -- --#define device_create_file_sf2_point(client, offset, index) \ --do { \ --device_create_file(&client->dev, \ --&sensor_dev_attr_sf2_point##offset##_fan##index.dev_attr); \ --} while (0) -+static struct sensor_device_attribute_2 sda_sf2_point[] = { -+ SENSOR_ATTR_2(sf2_point1_fan1, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 1, 1), -+ SENSOR_ATTR_2(sf2_point2_fan1, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 2, 1), -+ SENSOR_ATTR_2(sf2_point3_fan1, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 3, 1), -+ SENSOR_ATTR_2(sf2_point4_fan1, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 4, 1), -+ -+ SENSOR_ATTR_2(sf2_point1_fan2, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 1, 2), -+ SENSOR_ATTR_2(sf2_point2_fan2, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 2, 2), -+ SENSOR_ATTR_2(sf2_point3_fan2, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 3, 2), -+ SENSOR_ATTR_2(sf2_point4_fan2, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 4, 2), -+ -+ SENSOR_ATTR_2(sf2_point1_fan3, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 1, 3), -+ SENSOR_ATTR_2(sf2_point2_fan3, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 2, 3), -+ SENSOR_ATTR_2(sf2_point3_fan3, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 3, 3), -+ SENSOR_ATTR_2(sf2_point4_fan3, S_IRUGO | S_IWUSR, -+ show_sf2_point, store_sf2_point, 4, 3), -+}; - - - static ssize_t -@@ -1026,39 +993,28 @@ - return count; - } - --#define sysfs_sf2_level(offset, index) \ --static SENSOR_DEVICE_ATTR_2(sf2_level##offset##_fan##index, S_IRUGO | S_IWUSR, \ -- show_sf2_level, store_sf2_level, offset, index); -- --sysfs_sf2_level(1, 1); /* Fan1 */ --sysfs_sf2_level(2, 1); /* Fan1 */ --sysfs_sf2_level(3, 1); /* Fan1 */ --sysfs_sf2_level(1, 2); /* Fan2 */ --sysfs_sf2_level(2, 2); /* Fan2 */ --sysfs_sf2_level(3, 2); /* Fan2 */ --sysfs_sf2_level(1, 3); /* Fan3 */ --sysfs_sf2_level(2, 3); /* Fan3 */ --sysfs_sf2_level(3, 3); /* Fan3 */ -- --#define device_create_file_sf2_level(client, offset, index) \ --do { \ --device_create_file(&client->dev, \ --&sensor_dev_attr_sf2_level##offset##_fan##index.dev_attr); \ --} while (0) -- -- --/* This function is called when: -- * w83792d_driver is inserted (when this module is loaded), for each -- available adapter -- * when a new adapter is inserted (and w83792d_driver is still present) */ --static int --w83792d_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, w83792d_detect); --} -- -+static struct sensor_device_attribute_2 sda_sf2_level[] = { -+ SENSOR_ATTR_2(sf2_level1_fan1, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 1, 1), -+ SENSOR_ATTR_2(sf2_level2_fan1, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 2, 1), -+ SENSOR_ATTR_2(sf2_level3_fan1, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 3, 1), -+ -+ SENSOR_ATTR_2(sf2_level1_fan2, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 1, 2), -+ SENSOR_ATTR_2(sf2_level2_fan2, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 2, 2), -+ SENSOR_ATTR_2(sf2_level3_fan2, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 3, 2), -+ -+ SENSOR_ATTR_2(sf2_level1_fan3, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 1, 3), -+ SENSOR_ATTR_2(sf2_level2_fan3, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 2, 3), -+ SENSOR_ATTR_2(sf2_level3_fan3, S_IRUGO | S_IWUSR, -+ show_sf2_level, store_sf2_level, 3, 3), -+}; - - static int - w83792d_create_subclient(struct i2c_adapter *adapter, -@@ -1147,12 +1103,19 @@ - return err; - } - -+static void device_create_file_fan(struct device *dev, int i) -+{ -+ device_create_file(dev, &sda_fan_input[i].dev_attr); -+ device_create_file(dev, &sda_fan_div[i].dev_attr); -+ device_create_file(dev, &sda_fan_min[i].dev_attr); -+} - - static int - w83792d_detect(struct i2c_adapter *adapter, int address, int kind) - { - int i = 0, val1 = 0, val2; -- struct i2c_client *new_client; -+ struct i2c_client *client; -+ struct device *dev; - struct w83792d_data *data; - int err = 0; - const char *client_name = ""; -@@ -1170,12 +1133,13 @@ - goto ERROR0; - } - -- new_client = &data->client; -- i2c_set_clientdata(new_client, data); -- new_client->addr = address; -- new_client->adapter = adapter; -- new_client->driver = &w83792d_driver; -- new_client->flags = 0; -+ client = &data->client; -+ dev = &client->dev; -+ i2c_set_clientdata(client, data); -+ client->addr = address; -+ client->adapter = adapter; -+ client->driver = &w83792d_driver; -+ client->flags = 0; - - /* Now, we do the remaining detection. */ - -@@ -1184,50 +1148,49 @@ - force_*=... parameter, and the Winbond will be reset to the right - bank. */ - if (kind < 0) { -- if (w83792d_read_value(new_client, W83792D_REG_CONFIG) & 0x80) { -- dev_warn(&new_client->dev, "Detection failed at step " -- "3\n"); -+ if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80) { -+ dev_dbg(dev, "Detection failed at step 1\n"); - goto ERROR1; - } -- val1 = w83792d_read_value(new_client, W83792D_REG_BANK); -- val2 = w83792d_read_value(new_client, W83792D_REG_CHIPMAN); -+ val1 = w83792d_read_value(client, W83792D_REG_BANK); -+ val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN); - /* Check for Winbond ID if in bank 0 */ - if (!(val1 & 0x07)) { /* is Bank0 */ - if (((!(val1 & 0x80)) && (val2 != 0xa3)) || - ((val1 & 0x80) && (val2 != 0x5c))) { -+ dev_dbg(dev, "Detection failed at step 2\n"); - goto ERROR1; - } - } - /* If Winbond chip, address of chip and W83792D_REG_I2C_ADDR - should match */ -- if (w83792d_read_value(new_client, -+ if (w83792d_read_value(client, - W83792D_REG_I2C_ADDR) != address) { -- dev_warn(&new_client->dev, "Detection failed " -- "at step 5\n"); -+ dev_dbg(dev, "Detection failed at step 3\n"); - goto ERROR1; - } - } - - /* We have either had a force parameter, or we have already detected the - Winbond. Put it now into bank 0 and Vendor ID High Byte */ -- w83792d_write_value(new_client, -+ w83792d_write_value(client, - W83792D_REG_BANK, -- (w83792d_read_value(new_client, -+ (w83792d_read_value(client, - W83792D_REG_BANK) & 0x78) | 0x80); - - /* Determine the chip type. */ - if (kind <= 0) { - /* get vendor ID */ -- val2 = w83792d_read_value(new_client, W83792D_REG_CHIPMAN); -+ val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN); - if (val2 != 0x5c) { /* the vendor is NOT Winbond */ - goto ERROR1; - } -- val1 = w83792d_read_value(new_client, W83792D_REG_WCHIPID); -+ val1 = w83792d_read_value(client, W83792D_REG_WCHIPID); - if (val1 == 0x7a) { - kind = w83792d; - } else { - if (kind == 0) -- dev_warn(&new_client->dev, -+ dev_warn(dev, - "w83792d: Ignoring 'force' parameter for" - " unknown chip at adapter %d, address" - " 0x%02x\n", i2c_adapter_id(adapter), -@@ -1239,120 +1202,86 @@ - if (kind == w83792d) { - client_name = "w83792d"; - } else { -- dev_err(&new_client->dev, "w83792d: Internal error: unknown" -+ dev_err(dev, "w83792d: Internal error: unknown" - " kind (%d)?!?", kind); - goto ERROR1; - } - - /* Fill in the remaining client fields and put into the global list */ -- strlcpy(new_client->name, client_name, I2C_NAME_SIZE); -+ strlcpy(client->name, client_name, I2C_NAME_SIZE); - data->type = kind; - - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ -- if ((err = i2c_attach_client(new_client))) -+ if ((err = i2c_attach_client(client))) - goto ERROR1; - - if ((err = w83792d_detect_subclients(adapter, address, -- kind, new_client))) -+ kind, client))) - goto ERROR2; - - /* Initialize the chip */ -- w83792d_init_client(new_client); -+ w83792d_init_client(client); - - /* A few vars need to be filled upon startup */ - for (i = 0; i < 7; i++) { -- data->fan_min[i] = w83792d_read_value(new_client, -+ data->fan_min[i] = w83792d_read_value(client, - W83792D_REG_FAN_MIN[i]); - } - - /* Register sysfs hooks */ -- data->class_dev = hwmon_device_register(&new_client->dev); -+ data->class_dev = hwmon_device_register(dev); - if (IS_ERR(data->class_dev)) { - err = PTR_ERR(data->class_dev); - goto ERROR3; - } -- device_create_file_in(new_client, 0); -- device_create_file_in(new_client, 1); -- device_create_file_in(new_client, 2); -- device_create_file_in(new_client, 3); -- device_create_file_in(new_client, 4); -- device_create_file_in(new_client, 5); -- device_create_file_in(new_client, 6); -- device_create_file_in(new_client, 7); -- device_create_file_in(new_client, 8); -- -- device_create_file_fan(new_client, 1); -- device_create_file_fan(new_client, 2); -- device_create_file_fan(new_client, 3); -+ for (i = 0; i < 9; i++) { -+ device_create_file(dev, &sda_in_input[i].dev_attr); -+ device_create_file(dev, &sda_in_max[i].dev_attr); -+ device_create_file(dev, &sda_in_min[i].dev_attr); -+ } -+ for (i = 0; i < 3; i++) -+ device_create_file_fan(dev, i); - - /* Read GPIO enable register to check if pins for fan 4,5 are used as - GPIO */ -- val1 = w83792d_read_value(new_client, W83792D_REG_GPIO_EN); -+ val1 = w83792d_read_value(client, W83792D_REG_GPIO_EN); - if (!(val1 & 0x40)) -- device_create_file_fan(new_client, 4); -+ device_create_file_fan(dev, 3); - if (!(val1 & 0x20)) -- device_create_file_fan(new_client, 5); -+ device_create_file_fan(dev, 4); - -- val1 = w83792d_read_value(new_client, W83792D_REG_PIN); -+ val1 = w83792d_read_value(client, W83792D_REG_PIN); - if (val1 & 0x40) -- device_create_file_fan(new_client, 6); -+ device_create_file_fan(dev, 5); - if (val1 & 0x04) -- device_create_file_fan(new_client, 7); -+ device_create_file_fan(dev, 6); -+ -+ for (i = 0; i < 3; i++) { -+ device_create_file(dev, &sda_temp_input[i].dev_attr); -+ device_create_file(dev, &sda_temp_max[i].dev_attr); -+ device_create_file(dev, &sda_temp_max_hyst[i].dev_attr); -+ device_create_file(dev, &sda_thermal_cruise[i].dev_attr); -+ device_create_file(dev, &sda_tolerance[i].dev_attr); -+ } -+ -+ for (i = 0; i < ARRAY_SIZE(sda_pwm); i++) { -+ device_create_file(dev, &sda_pwm[i].dev_attr); -+ device_create_file(dev, &sda_pwm_enable[i].dev_attr); -+ device_create_file(dev, &sda_pwm_mode[i].dev_attr); -+ } -+ -+ device_create_file(dev, &dev_attr_alarms); -+ device_create_file(dev, &dev_attr_chassis); -+ device_create_file(dev, &dev_attr_chassis_clear); -+ -+ for (i = 0; i < ARRAY_SIZE(sda_sf2_point); i++) -+ device_create_file(dev, &sda_sf2_point[i].dev_attr); - -- device_create_file_temp1(new_client); /* Temp1 */ -- device_create_file_temp_add(new_client, 2); /* Temp2 */ -- device_create_file_temp_add(new_client, 3); /* Temp3 */ -- -- device_create_file_alarms(new_client); -- -- device_create_file_pwm(new_client, 1); -- device_create_file_pwm(new_client, 2); -- device_create_file_pwm(new_client, 3); -- -- device_create_file_pwmenable(new_client, 1); -- device_create_file_pwmenable(new_client, 2); -- device_create_file_pwmenable(new_client, 3); -- -- device_create_file_pwm_mode(new_client, 1); -- device_create_file_pwm_mode(new_client, 2); -- device_create_file_pwm_mode(new_client, 3); -- -- device_create_file_chassis(new_client); -- device_create_file_chassis_clear(new_client); -- -- device_create_file_thermal_cruise(new_client, 1); -- device_create_file_thermal_cruise(new_client, 2); -- device_create_file_thermal_cruise(new_client, 3); -- -- device_create_file_tolerance(new_client, 1); -- device_create_file_tolerance(new_client, 2); -- device_create_file_tolerance(new_client, 3); -- -- device_create_file_sf2_point(new_client, 1, 1); /* Fan1 */ -- device_create_file_sf2_point(new_client, 2, 1); /* Fan1 */ -- device_create_file_sf2_point(new_client, 3, 1); /* Fan1 */ -- device_create_file_sf2_point(new_client, 4, 1); /* Fan1 */ -- device_create_file_sf2_point(new_client, 1, 2); /* Fan2 */ -- device_create_file_sf2_point(new_client, 2, 2); /* Fan2 */ -- device_create_file_sf2_point(new_client, 3, 2); /* Fan2 */ -- device_create_file_sf2_point(new_client, 4, 2); /* Fan2 */ -- device_create_file_sf2_point(new_client, 1, 3); /* Fan3 */ -- device_create_file_sf2_point(new_client, 2, 3); /* Fan3 */ -- device_create_file_sf2_point(new_client, 3, 3); /* Fan3 */ -- device_create_file_sf2_point(new_client, 4, 3); /* Fan3 */ -- -- device_create_file_sf2_level(new_client, 1, 1); /* Fan1 */ -- device_create_file_sf2_level(new_client, 2, 1); /* Fan1 */ -- device_create_file_sf2_level(new_client, 3, 1); /* Fan1 */ -- device_create_file_sf2_level(new_client, 1, 2); /* Fan2 */ -- device_create_file_sf2_level(new_client, 2, 2); /* Fan2 */ -- device_create_file_sf2_level(new_client, 3, 2); /* Fan2 */ -- device_create_file_sf2_level(new_client, 1, 3); /* Fan3 */ -- device_create_file_sf2_level(new_client, 2, 3); /* Fan3 */ -- device_create_file_sf2_level(new_client, 3, 3); /* Fan3 */ -+ for (i = 0; i < ARRAY_SIZE(sda_sf2_level); i++) -+ device_create_file(dev, &sda_sf2_level[i].dev_attr); - - return 0; - -@@ -1366,7 +1295,7 @@ - kfree(data->lm75[1]); - } - ERROR2: -- i2c_detach_client(new_client); -+ i2c_detach_client(client); - ERROR1: - kfree(data); - ERROR0: -@@ -1434,7 +1363,7 @@ - int i, j; - u8 reg_array_tmp[4], pwm_array_tmp[7], reg_tmp; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after - (jiffies - data->last_updated, (unsigned long) (HZ * 3)) -@@ -1545,7 +1474,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - #ifdef DEBUG - w83792d_print_debug(data, dev); ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-amd756-s4882.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-amd756-s4882.c 2006-03-22 17:06:15.000000000 +0100 -@@ -38,6 +38,7 @@ - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/i2c.h> -+#include <linux/mutex.h> - - extern struct i2c_adapter amd756_smbus; - -@@ -45,7 +46,7 @@ - static struct i2c_algorithm *s4882_algo; - - /* Wrapper access functions for multiplexed SMBus */ --static struct semaphore amd756_lock; -+static DEFINE_MUTEX(amd756_lock); - - static s32 amd756_access_virt0(struct i2c_adapter * adap, u16 addr, - unsigned short flags, char read_write, -@@ -59,12 +60,12 @@ - || addr == 0x18) - return -1; - -- down(&amd756_lock); -+ mutex_lock(&amd756_lock); - - error = amd756_smbus.algo->smbus_xfer(adap, addr, flags, read_write, - command, size, data); - -- up(&amd756_lock); -+ mutex_unlock(&amd756_lock); - - return error; - } -@@ -87,7 +88,7 @@ - if (addr != 0x4c && (addr & 0xfc) != 0x50 && (addr & 0xfc) != 0x30) - return -1; - -- down(&amd756_lock); -+ mutex_lock(&amd756_lock); - - if (last_channels != channels) { - union i2c_smbus_data mplxdata; -@@ -105,7 +106,7 @@ - command, size, data); - - UNLOCK: -- up(&amd756_lock); -+ mutex_unlock(&amd756_lock); - return error; - } - -@@ -166,8 +167,6 @@ - } - - printk(KERN_INFO "Enabling SMBus multiplexing for Tyan S4882\n"); -- init_MUTEX(&amd756_lock); -- - /* Define the 5 virtual adapters and algorithms structures */ - if (!(s4882_adapter = kzalloc(5 * sizeof(struct i2c_adapter), - GFP_KERNEL))) { ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-isa.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-isa.c 2006-03-22 17:06:15.000000000 +0100 -@@ -125,7 +125,7 @@ - - static int __init i2c_isa_init(void) - { -- init_MUTEX(&isa_adapter.clist_lock); -+ mutex_init(&isa_adapter.clist_lock); - INIT_LIST_HEAD(&isa_adapter.clients); - - isa_adapter.nr = ANY_I2C_ISA_BUS; ---- linux-2.6.16.orig/drivers/i2c/chips/eeprom.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/chips/eeprom.c 2006-03-22 17:06:16.000000000 +0100 -@@ -33,6 +33,7 @@ - #include <linux/sched.h> - #include <linux/jiffies.h> - #include <linux/i2c.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x50, 0x51, 0x52, 0x53, 0x54, -@@ -54,7 +55,7 @@ - /* Each client has this additional data */ - struct eeprom_data { - struct i2c_client client; -- struct semaphore update_lock; -+ struct mutex update_lock; - u8 valid; /* bitfield, bit!=0 if slice is valid */ - unsigned long last_updated[8]; /* In jiffies, 8 slices */ - u8 data[EEPROM_SIZE]; /* Register values */ -@@ -62,7 +63,6 @@ - }; - - --static int eeprom_attach_adapter(struct i2c_adapter *adapter); - static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind); - static int eeprom_detach_client(struct i2c_client *client); - -@@ -72,7 +72,9 @@ - .name = "eeprom", - }, - .id = I2C_DRIVERID_EEPROM, -- .attach_adapter = eeprom_attach_adapter, -+ .class = I2C_CLASS_DATA, -+ .address_data = &addr_data, -+ .detect_client = eeprom_detect, - .detach_client = eeprom_detach_client, - }; - -@@ -81,7 +83,7 @@ - struct eeprom_data *data = i2c_get_clientdata(client); - int i, j; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (!(data->valid & (1 << slice)) || - time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { -@@ -107,7 +109,7 @@ - data->valid |= (1 << slice); - } - exit: -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - - static ssize_t eeprom_read(struct kobject *kobj, char *buf, loff_t off, size_t count) -@@ -149,11 +151,6 @@ - .read = eeprom_read, - }; - --static int eeprom_attach_adapter(struct i2c_adapter *adapter) --{ -- return i2c_probe(adapter, &addr_data, eeprom_detect); --} -- - /* This function is called by i2c_probe */ - static int eeprom_detect(struct i2c_adapter *adapter, int address, int kind) - { -@@ -187,7 +184,7 @@ - /* Fill in the remaining client fields */ - strlcpy(new_client->name, "eeprom", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - data->nature = UNKNOWN; - - /* Tell the I2C layer a new client has arrived */ ---- linux-2.6.16.orig/drivers/i2c/chips/max6875.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/chips/max6875.c 2006-03-22 17:06:15.000000000 +0100 -@@ -31,7 +31,7 @@ - #include <linux/module.h> - #include <linux/slab.h> - #include <linux/i2c.h> --#include <asm/semaphore.h> -+#include <linux/mutex.h> - - /* Do not scan - the MAX6875 access method will write to some EEPROM chips */ - static unsigned short normal_i2c[] = {I2C_CLIENT_END}; -@@ -54,7 +54,7 @@ - /* Each client has this additional data */ - struct max6875_data { - struct i2c_client client; -- struct semaphore update_lock; -+ struct mutex update_lock; - - u32 valid; - u8 data[USER_EEPROM_SIZE]; -@@ -83,7 +83,7 @@ - if (slice >= USER_EEPROM_SLICES) - return; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - buf = &data->data[slice << SLICE_BITS]; - -@@ -122,7 +122,7 @@ - data->valid |= (1 << slice); - } - exit_up: -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - - static ssize_t max6875_read(struct kobject *kobj, char *buf, loff_t off, -@@ -196,7 +196,7 @@ - real_client->driver = &max6875_driver; - real_client->flags = 0; - strlcpy(real_client->name, "max6875", I2C_NAME_SIZE); -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Init fake client data */ - /* set the client data to the i2c_client so that it will get freed */ ---- linux-2.6.16.orig/drivers/i2c/chips/pcf8591.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/chips/pcf8591.c 2006-03-22 17:06:15.000000000 +0100 -@@ -24,6 +24,7 @@ - #include <linux/init.h> - #include <linux/slab.h> - #include <linux/i2c.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, 0x4c, -@@ -74,7 +75,7 @@ - - struct pcf8591_data { - struct i2c_client client; -- struct semaphore update_lock; -+ struct mutex update_lock; - - u8 control; - u8 aout; -@@ -144,13 +145,13 @@ - struct pcf8591_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - if (val) - data->control |= PCF8591_CONTROL_AOEF; - else - data->control &= ~PCF8591_CONTROL_AOEF; - i2c_smbus_write_byte(client, data->control); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -200,7 +201,7 @@ - /* Fill in the remaining client fields and put it into the global - list */ - strlcpy(new_client->name, "pcf8591", I2C_NAME_SIZE); -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -265,7 +266,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct pcf8591_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if ((data->control & PCF8591_CONTROL_AICH_MASK) != channel) { - data->control = (data->control & ~PCF8591_CONTROL_AICH_MASK) -@@ -278,7 +279,7 @@ - } - value = i2c_smbus_read_byte(client); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - if ((channel == 2 && input_mode == 2) || - (channel != 3 && (input_mode == 1 || input_mode == 3))) ---- linux-2.6.16.orig/drivers/i2c/chips/tps65010.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/chips/tps65010.c 2006-03-22 17:06:15.000000000 +0100 -@@ -32,6 +32,7 @@ - #include <linux/suspend.h> - #include <linux/debugfs.h> - #include <linux/seq_file.h> -+#include <linux/mutex.h> - - #include <asm/irq.h> - #include <asm/mach-types.h> -@@ -81,7 +82,7 @@ - - struct tps65010 { - struct i2c_client client; -- struct semaphore lock; -+ struct mutex lock; - int irq; - struct work_struct work; - struct dentry *file; -@@ -218,7 +219,7 @@ - seq_printf(s, "driver %s\nversion %s\nchip %s\n\n", - DRIVER_NAME, DRIVER_VERSION, chip); - -- down(&tps->lock); -+ mutex_lock(&tps->lock); - - /* FIXME how can we tell whether a battery is present? - * likely involves a charge gauging chip (like BQ26501). -@@ -300,7 +301,7 @@ - (v2 & (1 << (4 + i))) ? "rising" : "falling"); - } - -- up(&tps->lock); -+ mutex_unlock(&tps->lock); - return 0; - } - -@@ -416,7 +417,7 @@ - { - struct tps65010 *tps = _tps; - -- down(&tps->lock); -+ mutex_lock(&tps->lock); - - tps65010_interrupt(tps); - -@@ -444,7 +445,7 @@ - if (test_and_clear_bit(FLAG_IRQ_ENABLE, &tps->flags)) - enable_irq(tps->irq); - -- up(&tps->lock); -+ mutex_unlock(&tps->lock); - } - - static irqreturn_t tps65010_irq(int irq, void *_tps, struct pt_regs *regs) -@@ -505,7 +506,7 @@ - if (!tps) - return 0; - -- init_MUTEX(&tps->lock); -+ mutex_init(&tps->lock); - INIT_WORK(&tps->work, tps65010_work, tps); - tps->irq = -1; - tps->client.addr = address; -@@ -695,7 +696,7 @@ - if ((gpio < GPIO1) || (gpio > GPIO4)) - return -EINVAL; - -- down(&the_tps->lock); -+ mutex_lock(&the_tps->lock); - - defgpio = i2c_smbus_read_byte_data(&the_tps->client, TPS_DEFGPIO); - -@@ -720,7 +721,7 @@ - gpio, value ? "high" : "low", - i2c_smbus_read_byte_data(&the_tps->client, TPS_DEFGPIO)); - -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - return status; - } - EXPORT_SYMBOL(tps65010_set_gpio_out_value); -@@ -745,7 +746,7 @@ - led = LED2; - } - -- down(&the_tps->lock); -+ mutex_lock(&the_tps->lock); - - pr_debug("%s: led%i_on 0x%02x\n", DRIVER_NAME, led, - i2c_smbus_read_byte_data(&the_tps->client, -@@ -771,7 +772,7 @@ - default: - printk(KERN_ERR "%s: Wrong mode parameter for set_led()\n", - DRIVER_NAME); -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - return -EINVAL; - } - -@@ -781,7 +782,7 @@ - if (status != 0) { - printk(KERN_ERR "%s: Failed to write led%i_on register\n", - DRIVER_NAME, led); -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - return status; - } - -@@ -794,7 +795,7 @@ - if (status != 0) { - printk(KERN_ERR "%s: Failed to write led%i_per register\n", - DRIVER_NAME, led); -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - return status; - } - -@@ -802,7 +803,7 @@ - i2c_smbus_read_byte_data(&the_tps->client, - TPS_LED1_PER + offs)); - -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - - return status; - } -@@ -820,7 +821,7 @@ - if (!the_tps) - return -ENODEV; - -- down(&the_tps->lock); -+ mutex_lock(&the_tps->lock); - - vdcdc2 = i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC2); - vdcdc2 &= ~(1 << 1); -@@ -831,7 +832,7 @@ - - pr_debug("%s: vibrator %s\n", DRIVER_NAME, value ? "on" : "off"); - -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - return status; - } - EXPORT_SYMBOL(tps65010_set_vib); -@@ -848,7 +849,7 @@ - if (!the_tps) - return -ENODEV; - -- down(&the_tps->lock); -+ mutex_lock(&the_tps->lock); - - pr_debug("%s: %s low_pwr, vdcdc1 0x%02x\n", DRIVER_NAME, - mode ? "enable" : "disable", -@@ -876,7 +877,7 @@ - pr_debug("%s: vdcdc1 0x%02x\n", DRIVER_NAME, - i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); - -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - - return status; - } -@@ -894,7 +895,7 @@ - if (!the_tps) - return -ENODEV; - -- down(&the_tps->lock); -+ mutex_lock(&the_tps->lock); - - pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, - i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); -@@ -909,7 +910,7 @@ - pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, - i2c_smbus_read_byte_data(&the_tps->client, TPS_VREGS1)); - -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - - return status; - } -@@ -931,7 +932,7 @@ - if (!the_tps || the_tps->por) - return -ENODEV; - -- down(&the_tps->lock); -+ mutex_lock(&the_tps->lock); - - pr_debug("%s: %s low_pwr, chgconfig 0x%02x vdcdc1 0x%02x\n", - DRIVER_NAME, -@@ -959,7 +960,7 @@ - if (status != 0) { - printk(KERN_ERR "%s: Failed to write chconfig register\n", - DRIVER_NAME); -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - return status; - } - -@@ -977,7 +978,7 @@ - pr_debug("%s: vdcdc1 0x%02x\n", DRIVER_NAME, - i2c_smbus_read_byte_data(&the_tps->client, TPS_VDCDC1)); - -- up(&the_tps->lock); -+ mutex_unlock(&the_tps->lock); - - return status; - } ---- linux-2.6.16.orig/include/linux/i2c.h 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/include/linux/i2c.h 2006-03-22 17:06:21.000000000 +0100 -@@ -32,7 +32,7 @@ - #include <linux/mod_devicetable.h> - #include <linux/device.h> /* for struct device */ - #include <linux/sched.h> /* for completion */ --#include <asm/semaphore.h> -+#include <linux/mutex.h> - - /* --- For i2c-isa ---------------------------------------------------- */ - -@@ -48,6 +48,7 @@ - struct i2c_adapter; - struct i2c_client; - struct i2c_driver; -+struct i2c_client_address_data; - union i2c_smbus_data; - - /* -@@ -116,6 +117,7 @@ - struct i2c_driver { - int id; - unsigned int class; -+ struct i2c_client_address_data *address_data; - - /* Notifies the driver that a new bus has appeared. This routine - * can be used by the driver to test if the bus meets its conditions -@@ -133,6 +135,15 @@ - */ - int (*detach_client)(struct i2c_client *); - -+ /* Requests that the driver validate an address on a bus and attach a -+ * new client. If this routine is supplied, it will be called for -+ * each device on new buses that appear, provided the bus class -+ * matches the class field and devices exist at the addresses listed -+ * in the address_data field. For most drivers, this mechanism can -+ * be used instead of an attach_adapter routine. -+ */ -+ int (*detect_client)(struct i2c_adapter *, int addr, int kind); -+ - /* a ioctl like command that can be used to perform specific functions - * with the device. - */ -@@ -225,8 +236,8 @@ - int (*client_unregister)(struct i2c_client *); - - /* data fields that are valid for all devices */ -- struct semaphore bus_lock; -- struct semaphore clist_lock; -+ struct mutex bus_lock; -+ struct mutex clist_lock; - - int timeout; - int retries; -@@ -262,7 +273,7 @@ - #define I2C_CLASS_HWMON (1<<0) /* lm_sensors, ... */ - #define I2C_CLASS_TV_ANALOG (1<<1) /* bttv + friends */ - #define I2C_CLASS_TV_DIGITAL (1<<2) /* dvb cards */ --#define I2C_CLASS_DDC (1<<3) /* i2c-matroxfb ? */ -+#define I2C_CLASS_DATA (1<<3) /* data storage */ - #define I2C_CLASS_CAM_ANALOG (1<<4) /* camera with analog CCD */ - #define I2C_CLASS_CAM_DIGITAL (1<<5) /* most webcams */ - #define I2C_CLASS_SOUND (1<<6) /* sound devices */ -@@ -329,6 +340,10 @@ - struct i2c_client_address_data *address_data, - int (*found_proc) (struct i2c_adapter *, int, int)); - -+/* Direct chip probing function to create clients by address */ -+extern int i2c_probe_device(struct i2c_adapter *adapter, int driver_id, -+ int addr, int kind); -+ - /* An ioctl like call to set div. parameters of the adapter. - */ - extern int i2c_control(struct i2c_client *,unsigned int, unsigned long); ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-pxa.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-pxa.c 2006-03-22 17:06:15.000000000 +0100 -@@ -647,7 +647,7 @@ - } - - /* -- * We are protected by the adapter bus semaphore. -+ * We are protected by the adapter bus mutex. - */ - static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num) - { ---- linux-2.6.16.orig/drivers/hwmon/adm1021.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/adm1021.c 2006-03-22 17:06:16.000000000 +0100 -@@ -26,6 +26,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - - /* Addresses to scan */ -@@ -92,7 +93,7 @@ - struct class_device *class_dev; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -111,7 +112,6 @@ - u8 remote_temp_offset_prec; - }; - --static int adm1021_attach_adapter(struct i2c_adapter *adapter); - static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind); - static void adm1021_init_client(struct i2c_client *client); - static int adm1021_detach_client(struct i2c_client *client); -@@ -130,7 +130,9 @@ - .name = "adm1021", - }, - .id = I2C_DRIVERID_ADM1021, -- .attach_adapter = adm1021_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = adm1021_detect, - .detach_client = adm1021_detach_client, - }; - -@@ -162,10 +164,10 @@ - struct adm1021_data *data = i2c_get_clientdata(client); \ - int temp = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = TEMP_TO_REG(temp); \ - adm1021_write_value(client, reg, data->value); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - set(temp_max, ADM1021_REG_TOS_W); -@@ -182,13 +184,6 @@ - static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); - - --static int adm1021_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, adm1021_detect); --} -- - static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) - { - int i; -@@ -275,7 +270,7 @@ - strlcpy(new_client->name, type_name, I2C_NAME_SIZE); - data->type = kind; - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -351,7 +346,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct adm1021_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -375,7 +370,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/adm1025.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/adm1025.c 2006-03-22 17:06:16.000000000 +0100 -@@ -53,6 +53,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* - * Addresses to scan -@@ -107,7 +108,6 @@ - * Functions declaration - */ - --static int adm1025_attach_adapter(struct i2c_adapter *adapter); - static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind); - static void adm1025_init_client(struct i2c_client *client); - static int adm1025_detach_client(struct i2c_client *client); -@@ -122,7 +122,9 @@ - .name = "adm1025", - }, - .id = I2C_DRIVERID_ADM1025, -- .attach_adapter = adm1025_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = adm1025_detect, - .detach_client = adm1025_detach_client, - }; - -@@ -133,7 +135,7 @@ - struct adm1025_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -207,11 +209,11 @@ - struct adm1025_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->in_min[offset] = IN_TO_REG(val, in_scale[offset]); \ - i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(offset), \ - data->in_min[offset]); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } \ - static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ -@@ -221,11 +223,11 @@ - struct adm1025_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->in_max[offset] = IN_TO_REG(val, in_scale[offset]); \ - i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(offset), \ - data->in_max[offset]); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } \ - static DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ -@@ -247,11 +249,11 @@ - struct adm1025_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->temp_min[offset-1] = TEMP_TO_REG(val); \ - i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(offset-1), \ - data->temp_min[offset-1]); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } \ - static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ -@@ -261,11 +263,11 @@ - struct adm1025_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->temp_max[offset-1] = TEMP_TO_REG(val); \ - i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(offset-1), \ - data->temp_max[offset-1]); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } \ - static DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ -@@ -307,13 +309,6 @@ - * Real code - */ - --static int adm1025_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, adm1025_detect); --} -- - /* - * The following function does more than just detection. If detection - * succeeds, it also registers the new chip. -@@ -404,7 +399,7 @@ - /* We can fill in the remaining client fields */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -523,7 +518,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct adm1025_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { - int i; -@@ -558,7 +553,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/adm1026.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/adm1026.c 2006-03-22 17:06:21.000000000 +0100 -@@ -32,6 +32,7 @@ - #include <linux/hwmon-sysfs.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; -@@ -260,10 +261,10 @@ - struct adm1026_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - int valid; /* !=0 if following fields are valid */ - unsigned long last_reading; /* In jiffies */ - unsigned long last_config; /* In jiffies */ -@@ -294,13 +295,11 @@ - u8 config3; /* Register value */ - }; - --static int adm1026_attach_adapter(struct i2c_adapter *adapter); - static int adm1026_detect(struct i2c_adapter *adapter, int address, - int kind); - static int adm1026_detach_client(struct i2c_client *client); --static int adm1026_read_value(struct i2c_client *client, u8 register); --static int adm1026_write_value(struct i2c_client *client, u8 register, -- int value); -+static int adm1026_read_value(struct i2c_client *client, u8 reg); -+static int adm1026_write_value(struct i2c_client *client, u8 reg, int value); - static void adm1026_print_gpio(struct i2c_client *client); - static void adm1026_fixup_gpio(struct i2c_client *client); - static struct adm1026_data *adm1026_update_device(struct device *dev); -@@ -311,18 +310,12 @@ - .driver = { - .name = "adm1026", - }, -- .attach_adapter = adm1026_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = adm1026_detect, - .detach_client = adm1026_detach_client, - }; - --static int adm1026_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) { -- return 0; -- } -- return i2c_probe(adapter, &addr_data, adm1026_detect); --} -- - static int adm1026_detach_client(struct i2c_client *client) - { - struct adm1026_data *data = i2c_get_clientdata(client); -@@ -575,7 +568,7 @@ - int i; - long value, alarms, gpio; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - if (!data->valid - || time_after(jiffies, data->last_reading + ADM1026_DATA_INTERVAL)) { - /* Things that change quickly */ -@@ -710,7 +703,7 @@ - dev_dbg(&client->dev, "Setting VID from GPIO11-15.\n"); - data->vid = (data->gpio >> 11) & 0x1f; - data->valid = 1; -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return data; - } - -@@ -739,10 +732,10 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = INS_TO_REG(nr, val); - adm1026_write_value(client, ADM1026_REG_IN_MIN[nr], data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_in_max(struct device *dev, struct device_attribute *attr, -@@ -762,10 +755,10 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = INS_TO_REG(nr, val); - adm1026_write_value(client, ADM1026_REG_IN_MAX[nr], data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -813,10 +806,10 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[16] = INS_TO_REG(16, val + NEG12_OFFSET); - adm1026_write_value(client, ADM1026_REG_IN_MIN[16], data->in_min[16]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_in16_max(struct device *dev, struct device_attribute *attr, char *buf) -@@ -831,10 +824,10 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[16] = INS_TO_REG(16, val+NEG12_OFFSET); - adm1026_write_value(client, ADM1026_REG_IN_MAX[16], data->in_max[16]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -874,11 +867,11 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val, data->fan_div[nr]); - adm1026_write_value(client, ADM1026_REG_FAN_MIN(nr), - data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -939,7 +932,7 @@ - if (new_div == 0) { - return -EINVAL; - } -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - orig_div = data->fan_div[nr]; - data->fan_div[nr] = DIV_FROM_REG(new_div); - -@@ -958,7 +951,7 @@ - if (data->fan_div[nr] != orig_div) { - fixup_fan_min(dev,nr,orig_div); - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1001,11 +994,11 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_min[nr] = TEMP_TO_REG(val); - adm1026_write_value(client, ADM1026_REG_TEMP_MIN[nr], - data->temp_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr, -@@ -1025,11 +1018,11 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[nr] = TEMP_TO_REG(val); - adm1026_write_value(client, ADM1026_REG_TEMP_MAX[nr], - data->temp_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1064,11 +1057,11 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_offset[nr] = TEMP_TO_REG(val); - adm1026_write_value(client, ADM1026_REG_TEMP_OFFSET[nr], - data->temp_offset[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1115,11 +1108,11 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_tmin[nr] = TEMP_TO_REG(val); - adm1026_write_value(client, ADM1026_REG_TEMP_TMIN[nr], - data->temp_tmin[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1150,11 +1143,11 @@ - int val = simple_strtol(buf, NULL, 10); - - if ((val == 1) || (val==0)) { -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->config1 = (data->config1 & ~CFG1_THERM_HOT) | (val << 4); - adm1026_write_value(client, ADM1026_REG_CONFIG1, - data->config1); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - return count; - } -@@ -1184,11 +1177,11 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_crit[nr] = TEMP_TO_REG(val); - adm1026_write_value(client, ADM1026_REG_TEMP_THERM[nr], - data->temp_crit[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1212,10 +1205,10 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->analog_out = DAC_TO_REG(val); - adm1026_write_value(client, ADM1026_REG_DAC, data->analog_out); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1267,7 +1260,7 @@ - int val = simple_strtol(buf, NULL, 10); - unsigned long mask; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->alarm_mask = val & 0x7fffffff; - mask = data->alarm_mask - | (data->gpio_mask & 0x10000 ? 0x80000000 : 0); -@@ -1282,7 +1275,7 @@ - mask >>= 8; - adm1026_write_value(client, ADM1026_REG_MASK4, - mask & 0xff); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1303,7 +1296,7 @@ - int val = simple_strtol(buf, NULL, 10); - long gpio; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->gpio = val & 0x1ffff; - gpio = data->gpio; - adm1026_write_value(client, ADM1026_REG_GPIO_STATUS_0_7,gpio & 0xff); -@@ -1311,7 +1304,7 @@ - adm1026_write_value(client, ADM1026_REG_GPIO_STATUS_8_15,gpio & 0xff); - gpio = ((gpio >> 1) & 0x80) | (data->alarms >> 24 & 0x7f); - adm1026_write_value(client, ADM1026_REG_STATUS4,gpio & 0xff); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1331,7 +1324,7 @@ - int val = simple_strtol(buf, NULL, 10); - long mask; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->gpio_mask = val & 0x1ffff; - mask = data->gpio_mask; - adm1026_write_value(client, ADM1026_REG_GPIO_MASK_0_7,mask & 0xff); -@@ -1339,7 +1332,7 @@ - adm1026_write_value(client, ADM1026_REG_GPIO_MASK_8_15,mask & 0xff); - mask = ((mask >> 1) & 0x80) | (data->alarm_mask >> 24 & 0x7f); - adm1026_write_value(client, ADM1026_REG_MASK1,mask & 0xff); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -1359,10 +1352,10 @@ - if (data->pwm1.enable == 1) { - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm1.pwm = PWM_TO_REG(val); - adm1026_write_value(client, ADM1026_REG_PWM, data->pwm1.pwm); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - return count; - } -@@ -1378,14 +1371,14 @@ - struct adm1026_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm1.auto_pwm_min = SENSORS_LIMIT(val,0,255); - if (data->pwm1.enable == 2) { /* apply immediately */ - data->pwm1.pwm = PWM_TO_REG((data->pwm1.pwm & 0x0f) | - PWM_MIN_TO_REG(data->pwm1.auto_pwm_min)); - adm1026_write_value(client, ADM1026_REG_PWM, data->pwm1.pwm); - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_auto_pwm_max(struct device *dev, struct device_attribute *attr, char *buf) -@@ -1406,7 +1399,7 @@ - int old_enable; - - if ((val >= 0) && (val < 3)) { -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - old_enable = data->pwm1.enable; - data->pwm1.enable = val; - data->config1 = (data->config1 & ~CFG1_PWM_AFC) -@@ -1424,7 +1417,7 @@ - adm1026_write_value(client, ADM1026_REG_PWM, - data->pwm1.pwm); - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - return count; - } -@@ -1541,7 +1534,7 @@ - /* Fill in the remaining client fields */ - data->type = kind; - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) ---- linux-2.6.16.orig/drivers/hwmon/adm1031.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/adm1031.c 2006-03-22 17:06:16.000000000 +0100 -@@ -28,6 +28,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Following macros takes channel parameter starting from 0 to 2 */ - #define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr)) -@@ -70,7 +71,7 @@ - struct adm1031_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - int chip_type; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ -@@ -97,7 +98,6 @@ - s8 temp_crit[3]; - }; - --static int adm1031_attach_adapter(struct i2c_adapter *adapter); - static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind); - static void adm1031_init_client(struct i2c_client *client); - static int adm1031_detach_client(struct i2c_client *client); -@@ -108,7 +108,9 @@ - .driver = { - .name = "adm1031", - }, -- .attach_adapter = adm1031_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = adm1031_detect, - .detach_client = adm1031_detach_client, - }; - -@@ -262,10 +264,10 @@ - - old_fan_mode = data->conf1; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if ((ret = get_fan_auto_nearest(data, nr, val, data->conf1, ®))) { -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return ret; - } - if (((data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1)) & ADM1031_CONF1_AUTO_MODE) ^ -@@ -288,7 +290,7 @@ - } - data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1); - adm1031_write_value(client, ADM1031_REG_CONF1, data->conf1); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -329,11 +331,11 @@ - struct adm1031_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->auto_temp[nr] = AUTO_TEMP_MIN_TO_REG(val, data->auto_temp[nr]); - adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr), - data->auto_temp[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_auto_temp_max(struct device *dev, char *buf, int nr) -@@ -349,11 +351,11 @@ - struct adm1031_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[nr] = AUTO_TEMP_MAX_TO_REG(val, data->auto_temp[nr], data->pwm[nr]); - adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr), - data->temp_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -405,11 +407,11 @@ - int val = simple_strtol(buf, NULL, 10); - int reg; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) && - (((val>>4) & 0xf) != 5)) { - /* In automatic mode, the only PWM accepted is 33% */ -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - data->pwm[nr] = PWM_TO_REG(val); -@@ -417,7 +419,7 @@ - adm1031_write_value(client, ADM1031_REG_PWM, - nr ? ((data->pwm[nr] << 4) & 0xf0) | (reg & 0xf) - : (data->pwm[nr] & 0xf) | (reg & 0xf0)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -511,7 +513,7 @@ - struct adm1031_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - if (val) { - data->fan_min[nr] = - FAN_TO_REG(val, FAN_DIV_FROM_REG(data->fan_div[nr])); -@@ -519,7 +521,7 @@ - data->fan_min[nr] = 0xff; - } - adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t -@@ -540,7 +542,7 @@ - if (tmp == 0xff) - return -EINVAL; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - old_div = FAN_DIV_FROM_REG(data->fan_div[nr]); - data->fan_div[nr] = (tmp & 0xC0) | (0x3f & data->fan_div[nr]); - new_min = data->fan_min[nr] * old_div / -@@ -553,7 +555,7 @@ - data->fan_div[nr]); - adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), - data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -627,11 +629,11 @@ - - val = simple_strtol(buf, NULL, 10); - val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_min[nr] = TEMP_TO_REG(val); - adm1031_write_value(client, ADM1031_REG_TEMP_MIN(nr), - data->temp_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t -@@ -643,11 +645,11 @@ - - val = simple_strtol(buf, NULL, 10); - val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[nr] = TEMP_TO_REG(val); - adm1031_write_value(client, ADM1031_REG_TEMP_MAX(nr), - data->temp_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t -@@ -659,11 +661,11 @@ - - val = simple_strtol(buf, NULL, 10); - val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_crit[nr] = TEMP_TO_REG(val); - adm1031_write_value(client, ADM1031_REG_TEMP_CRIT(nr), - data->temp_crit[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -722,13 +724,6 @@ - static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); - - --static int adm1031_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, adm1031_detect); --} -- - /* This function is called by i2c_probe */ - static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) - { -@@ -778,7 +773,7 @@ - - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -891,7 +886,7 @@ - struct adm1031_data *data = i2c_get_clientdata(client); - int chan; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -965,7 +960,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/adm9240.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/adm9240.c 2006-03-22 17:06:16.000000000 +0100 -@@ -49,6 +49,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, -@@ -129,7 +130,6 @@ - return SCALE(reg, 1250, 255); - } - --static int adm9240_attach_adapter(struct i2c_adapter *adapter); - static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind); - static void adm9240_init_client(struct i2c_client *client); - static int adm9240_detach_client(struct i2c_client *client); -@@ -141,7 +141,9 @@ - .name = "adm9240", - }, - .id = I2C_DRIVERID_ADM9240, -- .attach_adapter = adm9240_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = adm9240_detect, - .detach_client = adm9240_detach_client, - }; - -@@ -150,7 +152,7 @@ - enum chips type; - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; - unsigned long last_updated_measure; - unsigned long last_updated_config; -@@ -195,11 +197,11 @@ - struct adm9240_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[attr->index] = TEMP_TO_REG(val); - i2c_smbus_write_byte_data(client, ADM9240_REG_TEMP_MAX(attr->index), - data->temp_max[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -246,11 +248,11 @@ - struct adm9240_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[attr->index] = IN_TO_REG(val, attr->index); - i2c_smbus_write_byte_data(client, ADM9240_REG_IN_MIN(attr->index), - data->in_min[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -263,11 +265,11 @@ - struct adm9240_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[attr->index] = IN_TO_REG(val, attr->index); - i2c_smbus_write_byte_data(client, ADM9240_REG_IN_MAX(attr->index), - data->in_max[attr->index]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -350,7 +352,7 @@ - int nr = attr->index; - u8 new_div; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (!val) { - data->fan_min[nr] = 255; -@@ -390,7 +392,7 @@ - i2c_smbus_write_byte_data(client, ADM9240_REG_FAN_MIN(nr), - data->fan_min[nr]); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -439,10 +441,10 @@ - struct adm9240_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->aout = AOUT_TO_REG(val); - i2c_smbus_write_byte_data(client, ADM9240_REG_ANALOG_OUT, data->aout); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout); -@@ -539,7 +541,7 @@ - /* fill in the remaining client fields and attach */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->type = kind; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - if ((err = i2c_attach_client(new_client))) - goto exit_free; -@@ -621,13 +623,6 @@ - return err; - } - --static int adm9240_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, adm9240_detect); --} -- - static int adm9240_detach_client(struct i2c_client *client) - { - struct adm9240_data *data = i2c_get_clientdata(client); -@@ -691,7 +686,7 @@ - struct adm9240_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - /* minimum measurement cycle: 1.75 seconds */ - if (time_after(jiffies, data->last_updated_measure + (HZ * 7 / 4)) -@@ -771,7 +766,7 @@ - data->last_updated_config = jiffies; - data->valid = 1; - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return data; - } - ---- linux-2.6.16.orig/drivers/hwmon/asb100.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/asb100.c 2006-03-22 17:06:16.000000000 +0100 -@@ -44,6 +44,7 @@ - #include <linux/err.h> - #include <linux/init.h> - #include <linux/jiffies.h> -+#include <linux/mutex.h> - #include "lm75.h" - - /* -@@ -182,10 +183,10 @@ - struct asb100_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - unsigned long last_updated; /* In jiffies */ - - /* array of 2 pointers to subclients */ -@@ -210,7 +211,6 @@ - static int asb100_read_value(struct i2c_client *client, u16 reg); - static void asb100_write_value(struct i2c_client *client, u16 reg, u16 val); - --static int asb100_attach_adapter(struct i2c_adapter *adapter); - static int asb100_detect(struct i2c_adapter *adapter, int address, int kind); - static int asb100_detach_client(struct i2c_client *client); - static struct asb100_data *asb100_update_device(struct device *dev); -@@ -221,7 +221,9 @@ - .name = "asb100", - }, - .id = I2C_DRIVERID_ASB100, -- .attach_adapter = asb100_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = asb100_detect, - .detach_client = asb100_detach_client, - }; - -@@ -245,11 +247,11 @@ - struct asb100_data *data = i2c_get_clientdata(client); \ - unsigned long val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->in_##reg[nr] = IN_TO_REG(val); \ - asb100_write_value(client, ASB100_REG_IN_##REG(nr), \ - data->in_##reg[nr]); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - -@@ -331,10 +333,10 @@ - struct asb100_data *data = i2c_get_clientdata(client); - u32 val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); - asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -351,7 +353,7 @@ - unsigned long val = simple_strtoul(buf, NULL, 10); - int reg; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - min = FAN_FROM_REG(data->fan_min[nr], - DIV_FROM_REG(data->fan_div[nr])); -@@ -381,7 +383,7 @@ - FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); - asb100_write_value(client, ASB100_REG_FAN_MIN(nr), data->fan_min[nr]); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -461,7 +463,7 @@ - struct asb100_data *data = i2c_get_clientdata(client); \ - unsigned long val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - switch (nr) { \ - case 1: case 2: \ - data->reg[nr] = LM75_TEMP_TO_REG(val); \ -@@ -472,7 +474,7 @@ - } \ - asb100_write_value(client, ASB100_REG_TEMP_##REG(nr+1), \ - data->reg[nr]); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - -@@ -574,11 +576,11 @@ - struct asb100_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm &= 0x80; /* keep the enable bit */ - data->pwm |= (0x0f & ASB100_PWM_TO_REG(val)); - asb100_write_value(client, ASB100_REG_PWM1, data->pwm); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -595,11 +597,11 @@ - struct asb100_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm &= 0x0f; /* keep the duty cycle bits */ - data->pwm |= (val ? 0x80 : 0x00); - asb100_write_value(client, ASB100_REG_PWM1, data->pwm); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -611,18 +613,6 @@ - device_create_file(&new_client->dev, &dev_attr_pwm1_enable); \ - } while (0) - --/* This function is called when: -- asb100_driver is inserted (when this module is loaded), for each -- available adapter -- when a new adapter is inserted (and asb100_driver is still present) -- */ --static int asb100_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, asb100_detect); --} -- - static int asb100_detect_subclients(struct i2c_adapter *adapter, int address, - int kind, struct i2c_client *new_client) - { -@@ -729,7 +719,7 @@ - } - - new_client = &data->client; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - i2c_set_clientdata(new_client, data); - new_client->addr = address; - new_client->adapter = adapter; -@@ -789,7 +779,7 @@ - data->type = kind; - - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -885,7 +875,7 @@ - struct i2c_client *cl; - int res, bank; - -- down(&data->lock); -+ mutex_lock(&data->lock); - - bank = (reg >> 8) & 0x0f; - if (bank > 2) -@@ -919,7 +909,7 @@ - if (bank > 2) - i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0); - -- up(&data->lock); -+ mutex_unlock(&data->lock); - - return res; - } -@@ -930,7 +920,7 @@ - struct i2c_client *cl; - int bank; - -- down(&data->lock); -+ mutex_lock(&data->lock); - - bank = (reg >> 8) & 0x0f; - if (bank > 2) -@@ -960,7 +950,7 @@ - if (bank > 2) - i2c_smbus_write_byte_data(client, ASB100_REG_BANK, 0); - -- up(&data->lock); -+ mutex_unlock(&data->lock); - } - - static void asb100_init_client(struct i2c_client *client) -@@ -984,7 +974,7 @@ - struct asb100_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -1042,7 +1032,7 @@ - dev_dbg(&client->dev, "... device update complete\n"); - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/atxp1.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/atxp1.c 2006-03-22 17:06:16.000000000 +0100 -@@ -26,6 +26,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - MODULE_LICENSE("GPL"); - MODULE_DESCRIPTION("System voltages control via Attansic ATXP1"); -@@ -44,7 +45,6 @@ - - I2C_CLIENT_INSMOD_1(atxp1); - --static int atxp1_attach_adapter(struct i2c_adapter * adapter); - static int atxp1_detach_client(struct i2c_client * client); - static struct atxp1_data * atxp1_update_device(struct device *dev); - static int atxp1_detect(struct i2c_adapter *adapter, int address, int kind); -@@ -53,14 +53,16 @@ - .driver = { - .name = "atxp1", - }, -- .attach_adapter = atxp1_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = atxp1_detect, - .detach_client = atxp1_detach_client, - }; - - struct atxp1_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - unsigned long last_updated; - u8 valid; - struct { -@@ -80,7 +82,7 @@ - client = to_i2c_client(dev); - data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { - -@@ -93,7 +95,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return(data); - } -@@ -251,13 +253,6 @@ - static DEVICE_ATTR(gpio2, S_IRUGO | S_IWUSR, atxp1_showgpio2, atxp1_storegpio2); - - --static int atxp1_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, &atxp1_detect); --}; -- - static int atxp1_detect(struct i2c_adapter *adapter, int address, int kind) - { - struct i2c_client * new_client; -@@ -309,7 +304,7 @@ - - data->valid = 0; - -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - err = i2c_attach_client(new_client); - ---- linux-2.6.16.orig/drivers/hwmon/ds1621.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/ds1621.c 2006-03-22 17:06:16.000000000 +0100 -@@ -28,6 +28,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include "lm75.h" - - /* Addresses to scan */ -@@ -72,7 +73,7 @@ - struct ds1621_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -80,7 +81,6 @@ - u8 conf; /* Register encoding, combined */ - }; - --static int ds1621_attach_adapter(struct i2c_adapter *adapter); - static int ds1621_detect(struct i2c_adapter *adapter, int address, - int kind); - static void ds1621_init_client(struct i2c_client *client); -@@ -93,7 +93,9 @@ - .name = "ds1621", - }, - .id = I2C_DRIVERID_DS1621, -- .attach_adapter = ds1621_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = ds1621_detect, - .detach_client = ds1621_detach_client, - }; - -@@ -156,10 +158,10 @@ - struct ds1621_data *data = ds1621_update_client(dev); \ - u16 val = LM75_TEMP_TO_REG(simple_strtoul(buf, NULL, 10)); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = val; \ - ds1621_write_value(client, reg, data->value); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - -@@ -178,13 +180,6 @@ - static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, set_temp_max); - - --static int ds1621_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, ds1621_detect); --} -- - /* This function is called by i2c_probe */ - static int ds1621_detect(struct i2c_adapter *adapter, int address, - int kind) -@@ -242,7 +237,7 @@ - /* Fill in remaining client fields and put it into the global list */ - strlcpy(new_client->name, "ds1621", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -297,7 +292,7 @@ - struct ds1621_data *data = i2c_get_clientdata(client); - u8 new_conf; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -327,7 +322,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/fscher.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/fscher.c 2006-03-22 17:06:16.000000000 +0100 -@@ -33,6 +33,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* - * Addresses to scan -@@ -104,7 +105,6 @@ - * Functions declaration - */ - --static int fscher_attach_adapter(struct i2c_adapter *adapter); - static int fscher_detect(struct i2c_adapter *adapter, int address, int kind); - static int fscher_detach_client(struct i2c_client *client); - static struct fscher_data *fscher_update_device(struct device *dev); -@@ -122,7 +122,9 @@ - .name = "fscher", - }, - .id = I2C_DRIVERID_FSCHER, -- .attach_adapter = fscher_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = fscher_detect, - .detach_client = fscher_detach_client, - }; - -@@ -133,7 +135,7 @@ - struct fscher_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -284,13 +286,6 @@ - * Real code - */ - --static int fscher_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, fscher_detect); --} -- - static int fscher_detect(struct i2c_adapter *adapter, int address, int kind) - { - struct i2c_client *new_client; -@@ -332,7 +327,7 @@ - * global list */ - strlcpy(new_client->name, "fscher", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -417,7 +412,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct fscher_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { - -@@ -457,7 +452,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } -@@ -472,10 +467,10 @@ - /* bits 0..1, 3..7 reserved => mask with 0x04 */ - unsigned long v = simple_strtoul(buf, NULL, 10) & 0x04; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_status[FAN_INDEX_FROM_NUM(nr)] &= ~v; - fscher_write_value(client, reg, v); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -490,10 +485,10 @@ - { - unsigned long v = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[FAN_INDEX_FROM_NUM(nr)] = v > 0xff ? 0xff : v; - fscher_write_value(client, reg, data->fan_min[FAN_INDEX_FROM_NUM(nr)]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -518,14 +513,14 @@ - return -EINVAL; - } - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - /* bits 2..7 reserved => mask with 0x03 */ - data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] &= ~0x03; - data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] |= v; - - fscher_write_value(client, reg, data->fan_ripple[FAN_INDEX_FROM_NUM(nr)]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -552,10 +547,10 @@ - /* bits 2..7 reserved, 0 read only => mask with 0x02 */ - unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_status[TEMP_INDEX_FROM_NUM(nr)] &= ~v; - fscher_write_value(client, reg, v); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -609,10 +604,10 @@ - /* bits 1..7 reserved => mask with 0x01 */ - unsigned long v = simple_strtoul(buf, NULL, 10) & 0x01; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->global_control &= ~v; - fscher_write_value(client, reg, v); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -631,11 +626,11 @@ - /* bits 0..3 reserved => mask with 0xf0 */ - unsigned long v = simple_strtoul(buf, NULL, 10) & 0xf0; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->watchdog[2] &= ~0xf0; - data->watchdog[2] |= v; - fscher_write_value(client, reg, data->watchdog[2]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -651,10 +646,10 @@ - /* bits 0, 2..7 reserved => mask with 0x02 */ - unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->watchdog[1] &= ~v; - fscher_write_value(client, reg, v); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -669,10 +664,10 @@ - { - unsigned long v = simple_strtoul(buf, NULL, 10) & 0xff; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->watchdog[0] = v; - fscher_write_value(client, reg, data->watchdog[0]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - ---- linux-2.6.16.orig/drivers/hwmon/fscpos.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/fscpos.c 2006-03-22 17:06:16.000000000 +0100 -@@ -37,6 +37,7 @@ - #include <linux/init.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* - * Addresses to scan -@@ -85,12 +86,11 @@ - /* - * Functions declaration - */ --static int fscpos_attach_adapter(struct i2c_adapter *adapter); - static int fscpos_detect(struct i2c_adapter *adapter, int address, int kind); - static int fscpos_detach_client(struct i2c_client *client); - --static int fscpos_read_value(struct i2c_client *client, u8 register); --static int fscpos_write_value(struct i2c_client *client, u8 register, u8 value); -+static int fscpos_read_value(struct i2c_client *client, u8 reg); -+static int fscpos_write_value(struct i2c_client *client, u8 reg, u8 value); - static struct fscpos_data *fscpos_update_device(struct device *dev); - static void fscpos_init_client(struct i2c_client *client); - -@@ -104,7 +104,9 @@ - .name = "fscpos", - }, - .id = I2C_DRIVERID_FSCPOS, -- .attach_adapter = fscpos_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = fscpos_detect, - .detach_client = fscpos_detach_client, - }; - -@@ -114,7 +116,7 @@ - struct fscpos_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* 0 until following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -208,13 +210,13 @@ - return -EINVAL; - } - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - /* bits 2..7 reserved => mask with 0x03 */ - data->fan_ripple[nr - 1] &= ~0x03; - data->fan_ripple[nr - 1] |= v; - - fscpos_write_value(client, reg, data->fan_ripple[nr - 1]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -232,10 +234,10 @@ - if (v < 0) v = 0; - if (v > 255) v = 255; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm[nr - 1] = v; - fscpos_write_value(client, reg, data->pwm[nr - 1]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -278,11 +280,11 @@ - /* bits 0..3 reserved => mask with 0xf0 */ - unsigned long v = simple_strtoul(buf, NULL, 10) & 0xf0; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->wdog_control &= ~0xf0; - data->wdog_control |= v; - fscpos_write_value(client, reg, data->wdog_control); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -304,10 +306,10 @@ - return -EINVAL; - } - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->wdog_state &= ~v; - fscpos_write_value(client, reg, v); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -321,10 +323,10 @@ - { - unsigned long v = simple_strtoul(buf, NULL, 10) & 0xff; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->wdog_preset = v; - fscpos_write_value(client, reg, data->wdog_preset); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -431,13 +433,6 @@ - static DEVICE_ATTR(in1_input, S_IRUGO, show_volt_5, NULL); - static DEVICE_ATTR(in2_input, S_IRUGO, show_volt_batt, NULL); - --static int fscpos_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, fscpos_detect); --} -- - static int fscpos_detect(struct i2c_adapter *adapter, int address, int kind) - { - struct i2c_client *new_client; -@@ -483,7 +478,7 @@ - strlcpy(new_client->name, "fscpos", I2C_NAME_SIZE); - - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -579,7 +574,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct fscpos_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { - int i; -@@ -625,7 +620,7 @@ - data->last_updated = jiffies; - data->valid = 1; - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return data; - } - ---- linux-2.6.16.orig/drivers/hwmon/gl518sm.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/gl518sm.c 2006-03-22 17:06:16.000000000 +0100 -@@ -43,6 +43,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; -@@ -120,7 +121,7 @@ - struct class_device *class_dev; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -141,7 +142,6 @@ - u8 beep_enable; /* Boolean */ - }; - --static int gl518_attach_adapter(struct i2c_adapter *adapter); - static int gl518_detect(struct i2c_adapter *adapter, int address, int kind); - static void gl518_init_client(struct i2c_client *client); - static int gl518_detach_client(struct i2c_client *client); -@@ -155,7 +155,9 @@ - .name = "gl518sm", - }, - .id = I2C_DRIVERID_GL518, -- .attach_adapter = gl518_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = gl518_detect, - .detach_client = gl518_detach_client, - }; - -@@ -212,10 +214,10 @@ - struct gl518_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = type##_TO_REG(val); \ - gl518_write_value(client, reg, data->value); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - -@@ -228,12 +230,12 @@ - int regvalue; \ - unsigned long val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - regvalue = gl518_read_value(client, reg); \ - data->value = type##_TO_REG(val); \ - regvalue = (regvalue & ~mask) | (data->value << shift); \ - gl518_write_value(client, reg, regvalue); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - -@@ -265,7 +267,7 @@ - int regvalue; - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); - data->fan_min[0] = FAN_TO_REG(val, - DIV_FROM_REG(data->fan_div[0])); -@@ -280,7 +282,7 @@ - data->beep_mask &= data->alarm_mask; - gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -291,7 +293,7 @@ - int regvalue; - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - regvalue = gl518_read_value(client, GL518_REG_FAN_LIMIT); - data->fan_min[1] = FAN_TO_REG(val, - DIV_FROM_REG(data->fan_div[1])); -@@ -306,7 +308,7 @@ - data->beep_mask &= data->alarm_mask; - gl518_write_value(client, GL518_REG_ALARM, data->beep_mask); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -343,13 +345,6 @@ - * Real code - */ - --static int gl518_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, gl518_detect); --} -- - static int gl518_detect(struct i2c_adapter *adapter, int address, int kind) - { - int i; -@@ -407,7 +402,7 @@ - strlcpy(new_client->name, "gl518sm", I2C_NAME_SIZE); - data->type = kind; - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -525,7 +520,7 @@ - struct gl518_data *data = i2c_get_clientdata(client); - int val; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -586,7 +581,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/gl520sm.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/gl520sm.c 2006-03-22 17:06:16.000000000 +0100 -@@ -29,6 +29,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Type of the extra sensor */ - static unsigned short extra_sensor_type; -@@ -99,7 +100,6 @@ - * Function declarations - */ - --static int gl520_attach_adapter(struct i2c_adapter *adapter); - static int gl520_detect(struct i2c_adapter *adapter, int address, int kind); - static void gl520_init_client(struct i2c_client *client); - static int gl520_detach_client(struct i2c_client *client); -@@ -113,7 +113,9 @@ - .name = "gl520sm", - }, - .id = I2C_DRIVERID_GL520, -- .attach_adapter = gl520_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = gl520_detect, - .detach_client = gl520_detach_client, - }; - -@@ -121,7 +123,7 @@ - struct gl520_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until the following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -303,7 +305,7 @@ - long v = simple_strtol(buf, NULL, 10); - u8 r; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (n == 0) - r = VDD_TO_REG(v); -@@ -317,7 +319,7 @@ - else - gl520_write_value(client, reg, r); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -331,7 +333,7 @@ - else - r = IN_TO_REG(v); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - data->in_max[n] = r; - -@@ -340,7 +342,7 @@ - else - gl520_write_value(client, reg, r); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -373,7 +375,7 @@ - unsigned long v = simple_strtoul(buf, NULL, 10); - u8 r; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - r = FAN_TO_REG(v, data->fan_div[n - 1]); - data->fan_min[n - 1] = r; - -@@ -390,7 +392,7 @@ - data->beep_mask &= data->alarm_mask; - gl520_write_value(client, GL520_REG_BEEP_MASK, data->beep_mask); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -409,7 +411,7 @@ - return -EINVAL; - } - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_div[n - 1] = r; - - if (n == 1) -@@ -417,7 +419,7 @@ - else - gl520_write_value(client, reg, (gl520_read_value(client, reg) & ~0x30) | (r << 4)); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -425,10 +427,10 @@ - { - u8 r = simple_strtoul(buf, NULL, 10)?1:0; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_off = r; - gl520_write_value(client, reg, (gl520_read_value(client, reg) & ~0x0c) | (r << 2)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -454,10 +456,10 @@ - { - long v = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[n - 1] = TEMP_TO_REG(v);; - gl520_write_value(client, reg, data->temp_max[n - 1]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -465,10 +467,10 @@ - { - long v = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max_hyst[n - 1] = TEMP_TO_REG(v); - gl520_write_value(client, reg, data->temp_max_hyst[n - 1]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -491,10 +493,10 @@ - { - u8 r = simple_strtoul(buf, NULL, 10)?0:1; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->beep_enable = !r; - gl520_write_value(client, reg, (gl520_read_value(client, reg) & ~0x04) | (r << 2)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -502,11 +504,11 @@ - { - u8 r = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - r &= data->alarm_mask; - data->beep_mask = r; - gl520_write_value(client, reg, r); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -515,13 +517,6 @@ - * Real code - */ - --static int gl520_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, gl520_detect); --} -- - static int gl520_detect(struct i2c_adapter *adapter, int address, int kind) - { - struct i2c_client *new_client; -@@ -561,7 +556,7 @@ - /* Fill in the remaining client fields */ - strlcpy(new_client->name, "gl520sm", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -685,7 +680,7 @@ - struct gl520_data *data = i2c_get_clientdata(client); - int val; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { - -@@ -750,7 +745,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/hdaps.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/hdaps.c 2006-03-22 17:06:15.000000000 +0100 -@@ -33,6 +33,7 @@ - #include <linux/module.h> - #include <linux/timer.h> - #include <linux/dmi.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - #define HDAPS_LOW_PORT 0x1600 /* first port used by hdaps */ -@@ -70,10 +71,10 @@ - static int rest_x; - static int rest_y; - --static DECLARE_MUTEX(hdaps_sem); -+static DEFINE_MUTEX(hdaps_mutex); - - /* -- * __get_latch - Get the value from a given port. Callers must hold hdaps_sem. -+ * __get_latch - Get the value from a given port. Callers must hold hdaps_mutex. - */ - static inline u8 __get_latch(u16 port) - { -@@ -82,7 +83,7 @@ - - /* - * __check_latch - Check a port latch for a given value. Returns zero if the -- * port contains the given value. Callers must hold hdaps_sem. -+ * port contains the given value. Callers must hold hdaps_mutex. - */ - static inline int __check_latch(u16 port, u8 val) - { -@@ -93,7 +94,7 @@ - - /* - * __wait_latch - Wait up to 100us for a port latch to get a certain value, -- * returning zero if the value is obtained. Callers must hold hdaps_sem. -+ * returning zero if the value is obtained. Callers must hold hdaps_mutex. - */ - static int __wait_latch(u16 port, u8 val) - { -@@ -110,7 +111,7 @@ - - /* - * __device_refresh - request a refresh from the accelerometer. Does not wait -- * for refresh to complete. Callers must hold hdaps_sem. -+ * for refresh to complete. Callers must hold hdaps_mutex. - */ - static void __device_refresh(void) - { -@@ -124,7 +125,7 @@ - /* - * __device_refresh_sync - request a synchronous refresh from the - * accelerometer. We wait for the refresh to complete. Returns zero if -- * successful and nonzero on error. Callers must hold hdaps_sem. -+ * successful and nonzero on error. Callers must hold hdaps_mutex. - */ - static int __device_refresh_sync(void) - { -@@ -134,7 +135,7 @@ - - /* - * __device_complete - indicate to the accelerometer that we are done reading -- * data, and then initiate an async refresh. Callers must hold hdaps_sem. -+ * data, and then initiate an async refresh. Callers must hold hdaps_mutex. - */ - static inline void __device_complete(void) - { -@@ -152,7 +153,7 @@ - { - int ret; - -- down(&hdaps_sem); -+ mutex_lock(&hdaps_mutex); - - /* do a sync refresh -- we need to be sure that we read fresh data */ - ret = __device_refresh_sync(); -@@ -163,7 +164,7 @@ - __device_complete(); - - out: -- up(&hdaps_sem); -+ mutex_unlock(&hdaps_mutex); - return ret; - } - -@@ -198,9 +199,9 @@ - { - int ret; - -- down(&hdaps_sem); -+ mutex_lock(&hdaps_mutex); - ret = __hdaps_read_pair(port1, port2, val1, val2); -- up(&hdaps_sem); -+ mutex_unlock(&hdaps_mutex); - - return ret; - } -@@ -213,7 +214,7 @@ - { - int total, ret = -ENXIO; - -- down(&hdaps_sem); -+ mutex_lock(&hdaps_mutex); - - outb(0x13, 0x1610); - outb(0x01, 0x161f); -@@ -279,7 +280,7 @@ - } - - out: -- up(&hdaps_sem); -+ mutex_unlock(&hdaps_mutex); - return ret; - } - -@@ -313,7 +314,7 @@ - }; - - /* -- * hdaps_calibrate - Set our "resting" values. Callers must hold hdaps_sem. -+ * hdaps_calibrate - Set our "resting" values. Callers must hold hdaps_mutex. - */ - static void hdaps_calibrate(void) - { -@@ -325,7 +326,7 @@ - int x, y; - - /* Cannot sleep. Try nonblockingly. If we fail, try again later. */ -- if (down_trylock(&hdaps_sem)) { -+ if (!mutex_trylock(&hdaps_mutex)) { - mod_timer(&hdaps_timer,jiffies + HDAPS_POLL_PERIOD); - return; - } -@@ -340,7 +341,7 @@ - mod_timer(&hdaps_timer, jiffies + HDAPS_POLL_PERIOD); - - out: -- up(&hdaps_sem); -+ mutex_unlock(&hdaps_mutex); - } - - -@@ -420,9 +421,9 @@ - struct device_attribute *attr, - const char *buf, size_t count) - { -- down(&hdaps_sem); -+ mutex_lock(&hdaps_mutex); - hdaps_calibrate(); -- up(&hdaps_sem); -+ mutex_unlock(&hdaps_mutex); - - return count; - } ---- linux-2.6.16.orig/drivers/hwmon/it87.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/it87.c 2006-03-22 17:06:16.000000000 +0100 -@@ -41,6 +41,7 @@ - #include <linux/hwmon-sysfs.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - -@@ -194,10 +195,10 @@ - struct it87_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -219,14 +220,12 @@ - }; - - --static int it87_attach_adapter(struct i2c_adapter *adapter); - static int it87_isa_attach_adapter(struct i2c_adapter *adapter); - static int it87_detect(struct i2c_adapter *adapter, int address, int kind); - static int it87_detach_client(struct i2c_client *client); - --static int it87_read_value(struct i2c_client *client, u8 register); --static int it87_write_value(struct i2c_client *client, u8 register, -- u8 value); -+static int it87_read_value(struct i2c_client *client, u8 reg); -+static int it87_write_value(struct i2c_client *client, u8 reg, u8 value); - static struct it87_data *it87_update_device(struct device *dev); - static int it87_check_pwm(struct i2c_client *client); - static void it87_init_client(struct i2c_client *client, struct it87_data *data); -@@ -237,7 +236,9 @@ - .name = "it87", - }, - .id = I2C_DRIVERID_IT87, -- .attach_adapter = it87_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = it87_detect, - .detach_client = it87_detach_client, - }; - -@@ -290,11 +291,11 @@ - struct it87_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = IN_TO_REG(val); - it87_write_value(client, IT87_REG_VIN_MIN(nr), - data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, -@@ -307,11 +308,11 @@ - struct it87_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = IN_TO_REG(val); - it87_write_value(client, IT87_REG_VIN_MAX(nr), - data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -381,10 +382,10 @@ - struct it87_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_high[nr] = TEMP_TO_REG(val); - it87_write_value(client, IT87_REG_TEMP_HIGH(nr), data->temp_high[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, -@@ -397,10 +398,10 @@ - struct it87_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_low[nr] = TEMP_TO_REG(val); - it87_write_value(client, IT87_REG_TEMP_LOW(nr), data->temp_low[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define show_temp_offset(offset) \ -@@ -440,7 +441,7 @@ - struct it87_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - data->sensor &= ~(1 << nr); - data->sensor &= ~(8 << nr); -@@ -450,11 +451,11 @@ - else if (val == 2) - data->sensor |= 8 << nr; - else if (val != 0) { -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - it87_write_value(client, IT87_REG_TEMP_ENABLE, data->sensor); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define show_sensor_offset(offset) \ -@@ -524,7 +525,7 @@ - int val = simple_strtol(buf, NULL, 10); - u8 reg = it87_read_value(client, IT87_REG_FAN_DIV); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - switch (nr) { - case 0: data->fan_div[nr] = reg & 0x07; break; - case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break; -@@ -533,7 +534,7 @@ - - data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); - it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, -@@ -548,7 +549,7 @@ - int i, min[3]; - u8 old; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - old = it87_read_value(client, IT87_REG_FAN_DIV); - - for (i = 0; i < 3; i++) -@@ -576,7 +577,7 @@ - data->fan_min[i]=FAN_TO_REG(min[i], DIV_FROM_REG(data->fan_div[i])); - it87_write_value(client, IT87_REG_FAN_MIN(i), data->fan_min[i]); - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_pwm_enable(struct device *dev, -@@ -589,7 +590,7 @@ - struct it87_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (val == 0) { - int tmp; -@@ -606,11 +607,11 @@ - /* set saved pwm value, clear FAN_CTLX PWM mode bit */ - it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr])); - } else { -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, -@@ -626,11 +627,11 @@ - if (val < 0 || val > 255) - return -EINVAL; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->manual_pwm_ctl[nr] = val; - if (data->fan_main_ctrl & (1 << nr)) - it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr])); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -696,17 +697,6 @@ - #define device_create_file_vid(client) \ - device_create_file(&client->dev, &dev_attr_cpu0_vid) - --/* This function is called when: -- * it87_driver is inserted (when this module is loaded), for each -- available adapter -- * when a new adapter is inserted (and it87_driver is still present) */ --static int it87_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, it87_detect); --} -- - static int it87_isa_attach_adapter(struct i2c_adapter *adapter) - { - return it87_detect(adapter, isa_address, -1); -@@ -776,7 +766,7 @@ - - new_client = &data->client; - if (is_isa) -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - i2c_set_clientdata(new_client, data); - new_client->addr = address; - new_client->adapter = adapter; -@@ -823,7 +813,7 @@ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->type = kind; - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -950,10 +940,10 @@ - - int res; - if (i2c_is_isa_client(client)) { -- down(&data->lock); -+ mutex_lock(&data->lock); - outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET); - res = inb_p(client->addr + IT87_DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - return res; - } else - return i2c_smbus_read_byte_data(client, reg); -@@ -969,10 +959,10 @@ - struct it87_data *data = i2c_get_clientdata(client); - - if (i2c_is_isa_client(client)) { -- down(&data->lock); -+ mutex_lock(&data->lock); - outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET); - outb_p(value, client->addr + IT87_DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - return 0; - } else - return i2c_smbus_write_byte_data(client, reg, value); -@@ -1098,7 +1088,7 @@ - struct it87_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -1160,7 +1150,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm63.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm63.c 2006-03-22 17:06:16.000000000 +0100 -@@ -45,6 +45,7 @@ - #include <linux/hwmon-sysfs.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* - * Addresses to scan -@@ -126,7 +127,6 @@ - * Functions declaration - */ - --static int lm63_attach_adapter(struct i2c_adapter *adapter); - static int lm63_detach_client(struct i2c_client *client); - - static struct lm63_data *lm63_update_device(struct device *dev); -@@ -142,7 +142,9 @@ - .driver = { - .name = "lm63", - }, -- .attach_adapter = lm63_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm63_detect, - .detach_client = lm63_detach_client, - }; - -@@ -153,7 +155,7 @@ - struct lm63_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -192,13 +194,13 @@ - struct lm63_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan[1] = FAN_TO_REG(val); - i2c_smbus_write_byte_data(client, LM63_REG_TACH_LIMIT_LSB, - data->fan[1] & 0xFF); - i2c_smbus_write_byte_data(client, LM63_REG_TACH_LIMIT_MSB, - data->fan[1] >> 8); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -222,12 +224,12 @@ - return -EPERM; - - val = simple_strtoul(buf, NULL, 10); -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm1_value = val <= 0 ? 0 : - val >= 255 ? 2 * data->pwm1_freq : - (val * data->pwm1_freq * 2 + 127) / 255; - i2c_smbus_write_byte_data(client, LM63_REG_PWM_VALUE, data->pwm1_value); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -253,10 +255,10 @@ - struct lm63_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp8[1] = TEMP8_TO_REG(val); - i2c_smbus_write_byte_data(client, LM63_REG_LOCAL_HIGH, data->temp8[1]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -284,13 +286,13 @@ - long val = simple_strtol(buf, NULL, 10); - int nr = attr->index; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp11[nr] = TEMP11_TO_REG(val); - i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2], - data->temp11[nr] >> 8); - i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2 + 1], - data->temp11[nr] & 0xff); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -314,11 +316,11 @@ - long val = simple_strtol(buf, NULL, 10); - long hyst; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - hyst = TEMP8_FROM_REG(data->temp8[2]) - val; - i2c_smbus_write_byte_data(client, LM63_REG_REMOTE_TCRIT_HYST, - HYST_TO_REG(hyst)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -329,9 +331,19 @@ - return sprintf(buf, "%u\n", data->alarms); - } - -+static ssize_t show_alarm(struct device *dev, struct device_attribute *devattr, -+ char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); -+ struct lm63_data *data = lm63_update_device(dev); -+ -+ return sprintf(buf, "%u\n", (data->alarms >> attr->index) & 1); -+} -+ - static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0); - static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan, - set_fan, 1); -+static SENSOR_DEVICE_ATTR(fan1_min_alarm, S_IRUGO, show_alarm, NULL, 0); - - static DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm1, set_pwm1); - static DEVICE_ATTR(pwm1_enable, S_IRUGO, show_pwm1_enable, NULL); -@@ -339,13 +351,18 @@ - static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp8, NULL, 0); - static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp8, - set_temp8, 1); -+static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6); - - static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp11, NULL, 0); -+static SENSOR_DEVICE_ATTR(temp2_input_fault, S_IRUGO, show_alarm, NULL, 2); - static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp11, - set_temp11, 1); -+static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3); - static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp11, - set_temp11, 2); -+static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4); - static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO, show_temp8, NULL, 2); -+static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO, show_alarm, NULL, 1); - static DEVICE_ATTR(temp2_crit_hyst, S_IWUSR | S_IRUGO, show_temp2_crit_hyst, - set_temp2_crit_hyst); - -@@ -355,13 +372,6 @@ - * Real code - */ - --static int lm63_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm63_detect); --} -- - /* - * The following function does more than just detection. If detection - * succeeds, it also registers the new chip. -@@ -427,7 +437,7 @@ - - strlcpy(new_client->name, "lm63", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -448,6 +458,8 @@ - &sensor_dev_attr_fan1_input.dev_attr); - device_create_file(&new_client->dev, - &sensor_dev_attr_fan1_min.dev_attr); -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_fan1_min_alarm.dev_attr); - } - device_create_file(&new_client->dev, &dev_attr_pwm1); - device_create_file(&new_client->dev, &dev_attr_pwm1_enable); -@@ -456,13 +468,23 @@ - device_create_file(&new_client->dev, - &sensor_dev_attr_temp2_input.dev_attr); - device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp2_input_fault.dev_attr); -+ device_create_file(&new_client->dev, - &sensor_dev_attr_temp2_min.dev_attr); - device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp2_min_alarm.dev_attr); -+ device_create_file(&new_client->dev, - &sensor_dev_attr_temp1_max.dev_attr); - device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp1_max_alarm.dev_attr); -+ device_create_file(&new_client->dev, - &sensor_dev_attr_temp2_max.dev_attr); - device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp2_max_alarm.dev_attr); -+ device_create_file(&new_client->dev, - &sensor_dev_attr_temp2_crit.dev_attr); -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp2_crit_alarm.dev_attr); - device_create_file(&new_client->dev, &dev_attr_temp2_crit_hyst); - device_create_file(&new_client->dev, &dev_attr_alarms); - -@@ -530,7 +552,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct lm63_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { - if (data->config & 0x04) { /* tachometer enabled */ -@@ -582,7 +604,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm75.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm75.c 2006-03-22 17:06:16.000000000 +0100 -@@ -25,6 +25,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include "lm75.h" - - -@@ -47,7 +48,7 @@ - struct lm75_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - u16 temp_input; /* Register values */ -@@ -55,7 +56,6 @@ - u16 temp_hyst; - }; - --static int lm75_attach_adapter(struct i2c_adapter *adapter); - static int lm75_detect(struct i2c_adapter *adapter, int address, int kind); - static void lm75_init_client(struct i2c_client *client); - static int lm75_detach_client(struct i2c_client *client); -@@ -70,7 +70,9 @@ - .name = "lm75", - }, - .id = I2C_DRIVERID_LM75, -- .attach_adapter = lm75_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm75_detect, - .detach_client = lm75_detach_client, - }; - -@@ -91,10 +93,10 @@ - struct lm75_data *data = i2c_get_clientdata(client); \ - int temp = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = LM75_TEMP_TO_REG(temp); \ - lm75_write_value(client, reg, data->value); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - set(temp_max, LM75_REG_TEMP_OS); -@@ -104,13 +106,6 @@ - static DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, show_temp_hyst, set_temp_hyst); - static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp_input, NULL); - --static int lm75_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm75_detect); --} -- - /* This function is called by i2c_probe */ - static int lm75_detect(struct i2c_adapter *adapter, int address, int kind) - { -@@ -188,7 +183,7 @@ - /* Fill in the remaining client fields and put it into the global list */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -264,7 +259,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct lm75_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -277,7 +272,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm77.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm77.c 2006-03-22 17:06:16.000000000 +0100 -@@ -32,6 +32,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4b, I2C_CLIENT_END }; -@@ -51,7 +52,7 @@ - struct lm77_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; - unsigned long last_updated; /* In jiffies */ - int temp_input; /* Temperatures */ -@@ -62,7 +63,6 @@ - u8 alarms; - }; - --static int lm77_attach_adapter(struct i2c_adapter *adapter); - static int lm77_detect(struct i2c_adapter *adapter, int address, int kind); - static void lm77_init_client(struct i2c_client *client); - static int lm77_detach_client(struct i2c_client *client); -@@ -77,7 +77,9 @@ - .driver = { - .name = "lm77", - }, -- .attach_adapter = lm77_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm77_detect, - .detach_client = lm77_detach_client, - }; - -@@ -139,10 +141,10 @@ - struct lm77_data *data = i2c_get_clientdata(client); \ - long val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = val; \ - lm77_write_value(client, reg, LM77_TEMP_TO_REG(data->value)); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - -@@ -157,11 +159,11 @@ - struct lm77_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_hyst = data->temp_crit - val; - lm77_write_value(client, LM77_REG_TEMP_HYST, - LM77_TEMP_TO_REG(data->temp_hyst)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -173,7 +175,7 @@ - long val = simple_strtoul(buf, NULL, 10); - int oldcrithyst; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - oldcrithyst = data->temp_crit - data->temp_hyst; - data->temp_crit = val; - data->temp_hyst = data->temp_crit - oldcrithyst; -@@ -181,7 +183,7 @@ - LM77_TEMP_TO_REG(data->temp_crit)); - lm77_write_value(client, LM77_REG_TEMP_HYST, - LM77_TEMP_TO_REG(data->temp_hyst)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -204,13 +206,6 @@ - static DEVICE_ATTR(alarms, S_IRUGO, - show_alarms, NULL); - --static int lm77_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm77_detect); --} -- - /* This function is called by i2c_probe */ - static int lm77_detect(struct i2c_adapter *adapter, int address, int kind) - { -@@ -306,7 +301,7 @@ - /* Fill in the remaining client fields and put it into the global list */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -380,7 +375,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct lm77_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -406,7 +401,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm78.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm78.c 2006-03-22 17:06:16.000000000 +0100 -@@ -27,6 +27,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - /* Addresses to scan */ -@@ -131,10 +132,10 @@ - struct lm78_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -152,13 +153,12 @@ - }; - - --static int lm78_attach_adapter(struct i2c_adapter *adapter); - static int lm78_isa_attach_adapter(struct i2c_adapter *adapter); - static int lm78_detect(struct i2c_adapter *adapter, int address, int kind); - static int lm78_detach_client(struct i2c_client *client); - --static int lm78_read_value(struct i2c_client *client, u8 register); --static int lm78_write_value(struct i2c_client *client, u8 register, u8 value); -+static int lm78_read_value(struct i2c_client *client, u8 reg); -+static int lm78_write_value(struct i2c_client *client, u8 reg, u8 value); - static struct lm78_data *lm78_update_device(struct device *dev); - static void lm78_init_client(struct i2c_client *client); - -@@ -168,7 +168,9 @@ - .name = "lm78", - }, - .id = I2C_DRIVERID_LM78, -- .attach_adapter = lm78_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm78_detect, - .detach_client = lm78_detach_client, - }; - -@@ -207,10 +209,10 @@ - struct lm78_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = IN_TO_REG(val); - lm78_write_value(client, LM78_REG_IN_MIN(nr), data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -221,10 +223,10 @@ - struct lm78_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = IN_TO_REG(val); - lm78_write_value(client, LM78_REG_IN_MAX(nr), data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -288,10 +290,10 @@ - struct lm78_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_over = TEMP_TO_REG(val); - lm78_write_value(client, LM78_REG_TEMP_OVER, data->temp_over); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -307,10 +309,10 @@ - struct lm78_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_hyst = TEMP_TO_REG(val); - lm78_write_value(client, LM78_REG_TEMP_HYST, data->temp_hyst); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -342,10 +344,10 @@ - struct lm78_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); - lm78_write_value(client, LM78_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -368,7 +370,7 @@ - unsigned long min; - u8 reg; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - min = FAN_FROM_REG(data->fan_min[nr], - DIV_FROM_REG(data->fan_div[nr])); - -@@ -380,7 +382,7 @@ - default: - dev_err(&client->dev, "fan_div value %ld not " - "supported. Choose one of 1, 2, 4 or 8!\n", val); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -@@ -398,7 +400,7 @@ - data->fan_min[nr] = - FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); - lm78_write_value(client, LM78_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -464,17 +466,6 @@ - } - static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); - --/* This function is called when: -- * lm78_driver is inserted (when this module is loaded), for each -- available adapter -- * when a new adapter is inserted (and lm78_driver is still present) */ --static int lm78_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm78_detect); --} -- - static int lm78_isa_attach_adapter(struct i2c_adapter *adapter) - { - return lm78_detect(adapter, isa_address, -1); -@@ -548,7 +539,7 @@ - - new_client = &data->client; - if (is_isa) -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - i2c_set_clientdata(new_client, data); - new_client->addr = address; - new_client->adapter = adapter; -@@ -598,7 +589,7 @@ - data->type = kind; - - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -697,10 +688,10 @@ - int res; - if (i2c_is_isa_client(client)) { - struct lm78_data *data = i2c_get_clientdata(client); -- down(&data->lock); -+ mutex_lock(&data->lock); - outb_p(reg, client->addr + LM78_ADDR_REG_OFFSET); - res = inb_p(client->addr + LM78_DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - return res; - } else - return i2c_smbus_read_byte_data(client, reg); -@@ -717,10 +708,10 @@ - { - if (i2c_is_isa_client(client)) { - struct lm78_data *data = i2c_get_clientdata(client); -- down(&data->lock); -+ mutex_lock(&data->lock); - outb_p(reg, client->addr + LM78_ADDR_REG_OFFSET); - outb_p(value, client->addr + LM78_DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - return 0; - } else - return i2c_smbus_write_byte_data(client, reg, value); -@@ -742,7 +733,7 @@ - struct lm78_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -786,7 +777,7 @@ - data->fan_div[2] = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm80.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm80.c 2006-03-22 17:06:16.000000000 +0100 -@@ -28,6 +28,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, -@@ -108,7 +109,7 @@ - struct lm80_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -130,7 +131,6 @@ - * Functions declaration - */ - --static int lm80_attach_adapter(struct i2c_adapter *adapter); - static int lm80_detect(struct i2c_adapter *adapter, int address, int kind); - static void lm80_init_client(struct i2c_client *client); - static int lm80_detach_client(struct i2c_client *client); -@@ -147,7 +147,9 @@ - .name = "lm80", - }, - .id = I2C_DRIVERID_LM80, -- .attach_adapter = lm80_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm80_detect, - .detach_client = lm80_detach_client, - }; - -@@ -191,10 +193,10 @@ - struct lm80_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock);\ -+ mutex_lock(&data->update_lock);\ - data->value = IN_TO_REG(val); \ - lm80_write_value(client, reg, data->value); \ -- up(&data->update_lock);\ -+ mutex_unlock(&data->update_lock);\ - return count; \ - } - set_in(min0, in_min[0], LM80_REG_IN_MIN(0)); -@@ -241,10 +243,10 @@ - struct lm80_data *data = i2c_get_clientdata(client); \ - long val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock);\ -+ mutex_lock(&data->update_lock);\ - data->value = FAN_TO_REG(val, DIV_FROM_REG(data->div)); \ - lm80_write_value(client, reg, data->value); \ -- up(&data->update_lock);\ -+ mutex_unlock(&data->update_lock);\ - return count; \ - } - set_fan(min1, fan_min[0], LM80_REG_FAN_MIN(1), fan_div[0]); -@@ -263,7 +265,7 @@ - u8 reg; - - /* Save fan_min */ -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - min = FAN_FROM_REG(data->fan_min[nr], - DIV_FROM_REG(data->fan_div[nr])); - -@@ -275,7 +277,7 @@ - default: - dev_err(&client->dev, "fan_div value %ld not " - "supported. Choose one of 1, 2, 4 or 8!\n", val); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -@@ -286,7 +288,7 @@ - /* Restore fan_min */ - data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); - lm80_write_value(client, LM80_REG_FAN_MIN(nr + 1), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -325,10 +327,10 @@ - struct lm80_data *data = i2c_get_clientdata(client); \ - long val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = TEMP_LIMIT_TO_REG(val); \ - lm80_write_value(client, reg, data->value); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - set_temp(hot_max, temp_hot_max, LM80_REG_TEMP_HOT_MAX); -@@ -386,13 +388,6 @@ - * Real code - */ - --static int lm80_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm80_detect); --} -- - static int lm80_detect(struct i2c_adapter *adapter, int address, int kind) - { - int i, cur; -@@ -437,7 +432,7 @@ - /* Fill in the remaining client fields and put it into the global list */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -545,7 +540,7 @@ - struct lm80_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { - dev_dbg(&client->dev, "Starting lm80 update\n"); -@@ -585,7 +580,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm83.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm83.c 2006-03-22 17:06:16.000000000 +0100 -@@ -12,6 +12,10 @@ - * Since the datasheet omits to give the chip stepping code, I give it - * here: 0x03 (at register 0xff). - * -+ * Also supports the LM82 temp sensor, which is basically a stripped down -+ * model of the LM83. Datasheet is here: -+ * http://www.national.com/pf/LM/LM82.html -+ * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or -@@ -35,6 +39,7 @@ - #include <linux/hwmon-sysfs.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* - * Addresses to scan -@@ -51,7 +56,7 @@ - * Insmod parameters - */ - --I2C_CLIENT_INSMOD_1(lm83); -+I2C_CLIENT_INSMOD_2(lm83, lm82); - - /* - * The LM83 registers -@@ -114,7 +119,6 @@ - * Functions declaration - */ - --static int lm83_attach_adapter(struct i2c_adapter *adapter); - static int lm83_detect(struct i2c_adapter *adapter, int address, int kind); - static int lm83_detach_client(struct i2c_client *client); - static struct lm83_data *lm83_update_device(struct device *dev); -@@ -128,7 +132,9 @@ - .name = "lm83", - }, - .id = I2C_DRIVERID_LM83, -- .attach_adapter = lm83_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm83_detect, - .detach_client = lm83_detach_client, - }; - -@@ -139,7 +145,7 @@ - struct lm83_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -171,11 +177,11 @@ - long val = simple_strtol(buf, NULL, 10); - int nr = attr->index; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp[nr] = TEMP_TO_REG(val); - i2c_smbus_write_byte_data(client, LM83_REG_W_HIGH[nr - 4], - data->temp[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -209,13 +215,6 @@ - * Real code - */ - --static int lm83_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm83_detect); --} -- - /* - * The following function does more than just detection. If detection - * succeeds, it also registers the new chip. -@@ -282,6 +281,9 @@ - if (man_id == 0x01) { /* National Semiconductor */ - if (chip_id == 0x03) { - kind = lm83; -+ } else -+ if (chip_id == 0x01) { -+ kind = lm82; - } - } - -@@ -295,12 +297,15 @@ - - if (kind == lm83) { - name = "lm83"; -+ } else -+ if (kind == lm82) { -+ name = "lm82"; - } - - /* We can fill in the remaining client fields */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -318,32 +323,46 @@ - goto exit_detach; - } - -+ /* -+ * The LM82 can only monitor one external diode which is -+ * at the same register as the LM83 temp3 entry - so we -+ * declare 1 and 3 common, and then 2 and 4 only for the LM83. -+ */ -+ - device_create_file(&new_client->dev, - &sensor_dev_attr_temp1_input.dev_attr); - device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_input.dev_attr); -- device_create_file(&new_client->dev, - &sensor_dev_attr_temp3_input.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp4_input.dev_attr); -+ - device_create_file(&new_client->dev, - &sensor_dev_attr_temp1_max.dev_attr); - device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_max.dev_attr); -- device_create_file(&new_client->dev, - &sensor_dev_attr_temp3_max.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp4_max.dev_attr); -+ - device_create_file(&new_client->dev, - &sensor_dev_attr_temp1_crit.dev_attr); - device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_crit.dev_attr); -- device_create_file(&new_client->dev, - &sensor_dev_attr_temp3_crit.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp4_crit.dev_attr); -+ - device_create_file(&new_client->dev, &dev_attr_alarms); - -+ if (kind == lm83) { -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp2_input.dev_attr); -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp4_input.dev_attr); -+ -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp2_max.dev_attr); -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp4_max.dev_attr); -+ -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp2_crit.dev_attr); -+ device_create_file(&new_client->dev, -+ &sensor_dev_attr_temp4_crit.dev_attr); -+ } -+ - return 0; - - exit_detach: -@@ -373,7 +392,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct lm83_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { - int nr; -@@ -393,7 +412,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm85.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm85.c 2006-03-22 17:06:16.000000000 +0100 -@@ -31,6 +31,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* Addresses to scan */ - static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; -@@ -331,10 +332,10 @@ - struct lm85_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - int valid; /* !=0 if following fields are valid */ - unsigned long last_reading; /* In jiffies */ - unsigned long last_config; /* In jiffies */ -@@ -368,13 +369,12 @@ - struct lm85_zone zone[3]; - }; - --static int lm85_attach_adapter(struct i2c_adapter *adapter); - static int lm85_detect(struct i2c_adapter *adapter, int address, - int kind); - static int lm85_detach_client(struct i2c_client *client); - --static int lm85_read_value(struct i2c_client *client, u8 register); --static int lm85_write_value(struct i2c_client *client, u8 register, int value); -+static int lm85_read_value(struct i2c_client *client, u8 reg); -+static int lm85_write_value(struct i2c_client *client, u8 reg, int value); - static struct lm85_data *lm85_update_device(struct device *dev); - static void lm85_init_client(struct i2c_client *client); - -@@ -384,7 +384,9 @@ - .name = "lm85", - }, - .id = I2C_DRIVERID_LM85, -- .attach_adapter = lm85_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm85_detect, - .detach_client = lm85_detach_client, - }; - -@@ -407,10 +409,10 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val); - lm85_write_value(client, LM85_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -499,10 +501,10 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm[nr] = PWM_TO_REG(val); - lm85_write_value(client, LM85_REG_PWM(nr), data->pwm[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_pwm_enable(struct device *dev, char *buf, int nr) -@@ -559,10 +561,10 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = INS_TO_REG(nr, val); - lm85_write_value(client, LM85_REG_IN_MIN(nr), data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_in_max(struct device *dev, char *buf, int nr) -@@ -577,10 +579,10 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = INS_TO_REG(nr, val); - lm85_write_value(client, LM85_REG_IN_MAX(nr), data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define show_in_reg(offset) \ -@@ -640,10 +642,10 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_min[nr] = TEMP_TO_REG(val); - lm85_write_value(client, LM85_REG_TEMP_MIN(nr), data->temp_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_temp_max(struct device *dev, char *buf, int nr) -@@ -658,10 +660,10 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[nr] = TEMP_TO_REG(val); - lm85_write_value(client, LM85_REG_TEMP_MAX(nr), data->temp_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define show_temp_reg(offset) \ -@@ -713,12 +715,12 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->autofan[nr].config = (data->autofan[nr].config & (~0xe0)) - | ZONE_TO_REG(val) ; - lm85_write_value(client, LM85_REG_AFAN_CONFIG(nr), - data->autofan[nr].config); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_pwm_auto_pwm_min(struct device *dev, char *buf, int nr) -@@ -733,11 +735,11 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->autofan[nr].min_pwm = PWM_TO_REG(val); - lm85_write_value(client, LM85_REG_AFAN_MINPWM(nr), - data->autofan[nr].min_pwm); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_pwm_auto_pwm_minctl(struct device *dev, char *buf, int nr) -@@ -752,7 +754,7 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->autofan[nr].min_off = val; - lm85_write_value(client, LM85_REG_AFAN_SPIKE1, data->smooth[0] - | data->syncpwm3 -@@ -760,7 +762,7 @@ - | (data->autofan[1].min_off ? 0x40 : 0) - | (data->autofan[2].min_off ? 0x80 : 0) - ); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_pwm_auto_pwm_freq(struct device *dev, char *buf, int nr) -@@ -775,13 +777,13 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->autofan[nr].freq = FREQ_TO_REG(val); - lm85_write_value(client, LM85_REG_AFAN_RANGE(nr), - (data->zone[nr].range << 4) - | data->autofan[nr].freq - ); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define pwm_auto(offset) \ -@@ -857,7 +859,7 @@ - int min; - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - min = TEMP_FROM_REG(data->zone[nr].limit); - data->zone[nr].off_desired = TEMP_TO_REG(val); - data->zone[nr].hyst = HYST_TO_REG(min - val); -@@ -871,7 +873,7 @@ - (data->zone[2].hyst << 4) - ); - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_temp_auto_temp_min(struct device *dev, char *buf, int nr) -@@ -886,7 +888,7 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->zone[nr].limit = TEMP_TO_REG(val); - lm85_write_value(client, LM85_REG_AFAN_LIMIT(nr), - data->zone[nr].limit); -@@ -913,7 +915,7 @@ - (data->zone[2].hyst << 4) - ); - } -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_temp_auto_temp_max(struct device *dev, char *buf, int nr) -@@ -930,7 +932,7 @@ - int min; - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - min = TEMP_FROM_REG(data->zone[nr].limit); - data->zone[nr].max_desired = TEMP_TO_REG(val); - data->zone[nr].range = RANGE_TO_REG( -@@ -938,7 +940,7 @@ - lm85_write_value(client, LM85_REG_AFAN_RANGE(nr), - ((data->zone[nr].range & 0x0f) << 4) - | (data->autofan[nr].freq & 0x07)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t show_temp_auto_temp_crit(struct device *dev, char *buf, int nr) -@@ -953,11 +955,11 @@ - struct lm85_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->zone[nr].critical = TEMP_TO_REG(val); - lm85_write_value(client, LM85_REG_AFAN_CRITICAL(nr), - data->zone[nr].critical); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define temp_auto(offset) \ -@@ -1017,13 +1019,6 @@ - temp_auto(2); - temp_auto(3); - --static int lm85_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm85_detect); --} -- - static int lm85_detect(struct i2c_adapter *adapter, int address, - int kind) - { -@@ -1149,7 +1144,7 @@ - /* Fill in the remaining client fields */ - data->type = kind; - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -1368,7 +1363,7 @@ - struct lm85_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if ( !data->valid || - time_after(jiffies, data->last_reading + LM85_DATA_INTERVAL) ) { -@@ -1571,7 +1566,7 @@ - - data->valid = 1; - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm87.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm87.c 2006-03-22 17:06:16.000000000 +0100 -@@ -60,6 +60,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* - * Addresses to scan -@@ -150,7 +151,6 @@ - * Functions declaration - */ - --static int lm87_attach_adapter(struct i2c_adapter *adapter); - static int lm87_detect(struct i2c_adapter *adapter, int address, int kind); - static void lm87_init_client(struct i2c_client *client); - static int lm87_detach_client(struct i2c_client *client); -@@ -165,7 +165,9 @@ - .name = "lm87", - }, - .id = I2C_DRIVERID_LM87, -- .attach_adapter = lm87_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm87_detect, - .detach_client = lm87_detach_client, - }; - -@@ -176,7 +178,7 @@ - struct lm87_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -253,11 +255,11 @@ - struct lm87_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = IN_TO_REG(val, data->in_scale[nr]); - lm87_write_value(client, nr<6 ? LM87_REG_IN_MIN(nr) : - LM87_REG_AIN_MIN(nr-6), data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - - static void set_in_max(struct device *dev, const char *buf, int nr) -@@ -266,11 +268,11 @@ - struct lm87_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = IN_TO_REG(val, data->in_scale[nr]); - lm87_write_value(client, nr<6 ? LM87_REG_IN_MAX(nr) : - LM87_REG_AIN_MAX(nr-6), data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - - #define set_in(offset) \ -@@ -327,10 +329,10 @@ - struct lm87_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_low[nr] = TEMP_TO_REG(val); - lm87_write_value(client, LM87_REG_TEMP_LOW[nr], data->temp_low[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - - static void set_temp_high(struct device *dev, const char *buf, int nr) -@@ -339,10 +341,10 @@ - struct lm87_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_high[nr] = TEMP_TO_REG(val); - lm87_write_value(client, LM87_REG_TEMP_HIGH[nr], data->temp_high[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - - #define set_temp(offset) \ -@@ -411,11 +413,11 @@ - struct lm87_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val, - FAN_DIV_FROM_REG(data->fan_div[nr])); - lm87_write_value(client, LM87_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - } - - /* Note: we save and restore the fan minimum here, because its value is -@@ -431,7 +433,7 @@ - unsigned long min; - u8 reg; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - min = FAN_FROM_REG(data->fan_min[nr], - FAN_DIV_FROM_REG(data->fan_div[nr])); - -@@ -441,7 +443,7 @@ - case 4: data->fan_div[nr] = 2; break; - case 8: data->fan_div[nr] = 3; break; - default: -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -@@ -459,7 +461,7 @@ - data->fan_min[nr] = FAN_TO_REG(min, val); - lm87_write_value(client, LM87_REG_FAN_MIN(nr), - data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -522,10 +524,10 @@ - struct lm87_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->aout = AOUT_TO_REG(val); - lm87_write_value(client, LM87_REG_AOUT, data->aout); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static DEVICE_ATTR(aout_output, S_IRUGO | S_IWUSR, show_aout, set_aout); -@@ -534,13 +536,6 @@ - * Real code - */ - --static int lm87_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm87_detect); --} -- - /* - * The following function does more than just detection. If detection - * succeeds, it also registers the new chip. -@@ -589,7 +584,7 @@ - /* We can fill in the remaining client fields */ - strlcpy(new_client->name, "lm87", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -744,7 +739,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct lm87_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { - int i, j; -@@ -813,7 +808,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm90.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm90.c 2006-03-22 17:06:16.000000000 +0100 -@@ -78,6 +78,7 @@ - #include <linux/hwmon-sysfs.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* - * Addresses to scan -@@ -174,7 +175,6 @@ - * Functions declaration - */ - --static int lm90_attach_adapter(struct i2c_adapter *adapter); - static int lm90_detect(struct i2c_adapter *adapter, int address, - int kind); - static void lm90_init_client(struct i2c_client *client); -@@ -190,7 +190,9 @@ - .name = "lm90", - }, - .id = I2C_DRIVERID_LM90, -- .attach_adapter = lm90_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm90_detect, - .detach_client = lm90_detach_client, - }; - -@@ -201,7 +203,7 @@ - struct lm90_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - int kind; -@@ -247,13 +249,13 @@ - long val = simple_strtol(buf, NULL, 10); - int nr = attr->index; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - if (data->kind == adt7461) - data->temp8[nr] = TEMP1_TO_REG_ADT7461(val); - else - data->temp8[nr] = TEMP1_TO_REG(val); - i2c_smbus_write_byte_data(client, reg[nr - 1], data->temp8[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -281,7 +283,7 @@ - long val = simple_strtol(buf, NULL, 10); - int nr = attr->index; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - if (data->kind == adt7461) - data->temp11[nr] = TEMP2_TO_REG_ADT7461(val); - else -@@ -290,7 +292,7 @@ - data->temp11[nr] >> 8); - i2c_smbus_write_byte_data(client, reg[(nr - 1) * 2 + 1], - data->temp11[nr] & 0xff); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -311,11 +313,11 @@ - long val = simple_strtol(buf, NULL, 10); - long hyst; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - hyst = TEMP1_FROM_REG(data->temp8[3]) - val; - i2c_smbus_write_byte_data(client, LM90_REG_W_TCRIT_HYST, - HYST_TO_REG(hyst)); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -326,23 +328,42 @@ - return sprintf(buf, "%d\n", data->alarms); - } - --static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp8, NULL, 0); --static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, show_temp11, NULL, 0); --static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp8, -- set_temp8, 1); --static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp11, -- set_temp11, 1); --static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp8, -- set_temp8, 2); --static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp11, -- set_temp11, 2); --static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp8, -- set_temp8, 3); --static SENSOR_DEVICE_ATTR(temp2_crit, S_IWUSR | S_IRUGO, show_temp8, -- set_temp8, 4); --static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temphyst, -- set_temphyst, 3); --static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_temphyst, NULL, 4); -+static ssize_t show_alarm(struct device *dev, struct device_attribute -+ *devattr, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); -+ struct lm90_data *data = lm90_update_device(dev); -+ -+ return sprintf(buf, "%d\n", (data->alarms >> attr->index) & 1); -+} -+ -+static struct sensor_device_attribute lm90_sensor_attr[] = { -+ SENSOR_ATTR(temp1_input, S_IRUGO, show_temp8, NULL, 0), -+ SENSOR_ATTR(temp2_input, S_IRUGO, show_temp11, NULL, 0), -+ SENSOR_ATTR(temp2_input_fault, S_IRUGO, show_alarm, NULL, 2), -+ SENSOR_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp8, -+ set_temp8, 1), -+ SENSOR_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 5), -+ SENSOR_ATTR(temp2_min, S_IWUSR | S_IRUGO, show_temp11, -+ set_temp11, 1), -+ SENSOR_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3), -+ SENSOR_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp8, -+ set_temp8, 2), -+ SENSOR_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6), -+ SENSOR_ATTR(temp2_max, S_IWUSR | S_IRUGO, show_temp11, -+ set_temp11, 2), -+ SENSOR_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4), -+ SENSOR_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp8, -+ set_temp8, 3), -+ SENSOR_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 0), -+ SENSOR_ATTR(temp2_crit, S_IWUSR | S_IRUGO, show_temp8, -+ set_temp8, 4), -+ SENSOR_ATTR(temp2_crit_alarm, S_IRUGO, show_alarm, NULL, 1), -+ SENSOR_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temphyst, -+ set_temphyst, 3), -+ SENSOR_ATTR(temp2_crit_hyst, S_IRUGO, show_temphyst, NULL, 4), -+}; -+ - static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); - - /* pec used for ADM1032 only */ -@@ -413,13 +434,6 @@ - return 0; - } - --static int lm90_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm90_detect); --} -- - /* - * The following function does more than just detection. If detection - * succeeds, it also registers the new chip. -@@ -428,7 +442,7 @@ - { - struct i2c_client *new_client; - struct lm90_data *data; -- int err = 0; -+ int i, err = 0; - const char *name = ""; - - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) -@@ -558,7 +572,7 @@ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; - data->kind = kind; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -574,26 +588,13 @@ - goto exit_detach; - } - -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp1_input.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_input.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp1_min.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_min.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp1_max.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_max.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp1_crit.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_crit.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp1_crit_hyst.dev_attr); -- device_create_file(&new_client->dev, -- &sensor_dev_attr_temp2_crit_hyst.dev_attr); -+ for (i = 0; i < ARRAY_SIZE(lm90_sensor_attr); i++) { -+ err = device_create_file(&new_client->dev, -+ &lm90_sensor_attr[i].dev_attr); -+ if (err) -+ goto exit_class; -+ } -+ - device_create_file(&new_client->dev, &dev_attr_alarms); - - if (new_client->flags & I2C_CLIENT_PEC) -@@ -601,6 +602,9 @@ - - return 0; - -+exit_class: -+ dev_err(&new_client->dev, "Sysfs interface creation failed\n"); -+ hwmon_device_unregister(data->class_dev); - exit_detach: - i2c_detach_client(new_client); - exit_free: -@@ -646,7 +650,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct lm90_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { - u8 oldh, newh, l; -@@ -692,7 +696,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/lm92.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/lm92.c 2006-03-22 17:06:16.000000000 +0100 -@@ -46,6 +46,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* The LM92 and MAX6635 have 2 two-state pins for address selection, - resulting in 4 possible addresses. */ -@@ -96,7 +97,7 @@ - struct lm92_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -114,7 +115,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct lm92_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ) - || !data->valid) { -@@ -134,7 +135,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } -@@ -158,10 +159,10 @@ - struct lm92_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = TEMP_TO_REG(val); \ - i2c_smbus_write_word_data(client, reg, swab16(data->value)); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - set_temp(temp1_crit, LM92_REG_TEMP_CRIT); -@@ -194,11 +195,11 @@ - struct lm92_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp1_hyst = TEMP_FROM_REG(data->temp1_crit) - val; - i2c_smbus_write_word_data(client, LM92_REG_TEMP_HYST, - swab16(TEMP_TO_REG(data->temp1_hyst))); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -348,7 +349,7 @@ - /* Fill in the remaining client fields */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the i2c subsystem a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -383,13 +384,6 @@ - return err; - } - --static int lm92_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, lm92_detect); --} -- - static int lm92_detach_client(struct i2c_client *client) - { - struct lm92_data *data = i2c_get_clientdata(client); -@@ -414,7 +408,9 @@ - .name = "lm92", - }, - .id = I2C_DRIVERID_LM92, -- .attach_adapter = lm92_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = lm92_detect, - .detach_client = lm92_detach_client, - }; - ---- linux-2.6.16.orig/drivers/hwmon/max1619.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/max1619.c 2006-03-22 17:06:16.000000000 +0100 -@@ -33,6 +33,7 @@ - #include <linux/i2c.h> - #include <linux/hwmon.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - static unsigned short normal_i2c[] = { 0x18, 0x19, 0x1a, - 0x29, 0x2a, 0x2b, -@@ -78,7 +79,6 @@ - * Functions declaration - */ - --static int max1619_attach_adapter(struct i2c_adapter *adapter); - static int max1619_detect(struct i2c_adapter *adapter, int address, - int kind); - static void max1619_init_client(struct i2c_client *client); -@@ -93,7 +93,9 @@ - .driver = { - .name = "max1619", - }, -- .attach_adapter = max1619_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = max1619_detect, - .detach_client = max1619_detach_client, - }; - -@@ -104,7 +106,7 @@ - struct max1619_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -141,10 +143,10 @@ - struct max1619_data *data = i2c_get_clientdata(client); \ - long val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->value = TEMP_TO_REG(val); \ - i2c_smbus_write_byte_data(client, reg, data->value); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - -@@ -175,13 +177,6 @@ - * Real code - */ - --static int max1619_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, max1619_detect); --} -- - /* - * The following function does more than just detection. If detection - * succeeds, it also registers the new chip. -@@ -262,7 +257,7 @@ - /* We can fill in the remaining client fields */ - strlcpy(new_client->name, name, I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -330,7 +325,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct max1619_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { - dev_dbg(&client->dev, "Updating max1619 data.\n"); -@@ -353,7 +348,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/sis5595.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/sis5595.c 2006-03-22 17:06:15.000000000 +0100 -@@ -60,6 +60,7 @@ - #include <linux/err.h> - #include <linux/init.h> - #include <linux/jiffies.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - -@@ -167,9 +168,9 @@ - struct sis5595_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - char maxins; /* == 3 if temp enabled, otherwise == 4 */ -@@ -192,8 +193,8 @@ - static int sis5595_detect(struct i2c_adapter *adapter); - static int sis5595_detach_client(struct i2c_client *client); - --static int sis5595_read_value(struct i2c_client *client, u8 register); --static int sis5595_write_value(struct i2c_client *client, u8 register, u8 value); -+static int sis5595_read_value(struct i2c_client *client, u8 reg); -+static int sis5595_write_value(struct i2c_client *client, u8 reg, u8 value); - static struct sis5595_data *sis5595_update_device(struct device *dev); - static void sis5595_init_client(struct i2c_client *client); - -@@ -231,10 +232,10 @@ - struct sis5595_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = IN_TO_REG(val); - sis5595_write_value(client, SIS5595_REG_IN_MIN(nr), data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -245,10 +246,10 @@ - struct sis5595_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = IN_TO_REG(val); - sis5595_write_value(client, SIS5595_REG_IN_MAX(nr), data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -310,10 +311,10 @@ - struct sis5595_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_over = TEMP_TO_REG(val); - sis5595_write_value(client, SIS5595_REG_TEMP_OVER, data->temp_over); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -329,10 +330,10 @@ - struct sis5595_data *data = i2c_get_clientdata(client); - long val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_hyst = TEMP_TO_REG(val); - sis5595_write_value(client, SIS5595_REG_TEMP_HYST, data->temp_hyst); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -364,10 +365,10 @@ - struct sis5595_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); - sis5595_write_value(client, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -390,7 +391,7 @@ - unsigned long val = simple_strtoul(buf, NULL, 10); - int reg; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - min = FAN_FROM_REG(data->fan_min[nr], - DIV_FROM_REG(data->fan_div[nr])); - reg = sis5595_read_value(client, SIS5595_REG_FANDIV); -@@ -403,7 +404,7 @@ - default: - dev_err(&client->dev, "fan_div value %ld not " - "supported. Choose one of 1, 2, 4 or 8!\n", val); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -@@ -419,7 +420,7 @@ - data->fan_min[nr] = - FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); - sis5595_write_value(client, SIS5595_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -527,7 +528,7 @@ - - new_client = &data->client; - new_client->addr = address; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - i2c_set_clientdata(new_client, data); - new_client->adapter = adapter; - new_client->driver = &sis5595_driver; -@@ -548,7 +549,7 @@ - strlcpy(new_client->name, "sis5595", I2C_NAME_SIZE); - - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -635,20 +636,20 @@ - int res; - - struct sis5595_data *data = i2c_get_clientdata(client); -- down(&data->lock); -+ mutex_lock(&data->lock); - outb_p(reg, client->addr + SIS5595_ADDR_REG_OFFSET); - res = inb_p(client->addr + SIS5595_DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - return res; - } - - static int sis5595_write_value(struct i2c_client *client, u8 reg, u8 value) - { - struct sis5595_data *data = i2c_get_clientdata(client); -- down(&data->lock); -+ mutex_lock(&data->lock); - outb_p(reg, client->addr + SIS5595_ADDR_REG_OFFSET); - outb_p(value, client->addr + SIS5595_DATA_REG_OFFSET); -- up(&data->lock); -+ mutex_unlock(&data->lock); - return 0; - } - -@@ -667,7 +668,7 @@ - struct sis5595_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -707,7 +708,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/smsc47b397.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/smsc47b397.c 2006-03-22 17:06:15.000000000 +0100 -@@ -35,6 +35,7 @@ - #include <linux/hwmon.h> - #include <linux/err.h> - #include <linux/init.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - /* Address is autodetected, there is no default value */ -@@ -92,9 +93,9 @@ - struct smsc47b397_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - -- struct semaphore update_lock; -+ struct mutex update_lock; - unsigned long last_updated; /* in jiffies */ - int valid; - -@@ -108,10 +109,10 @@ - struct smsc47b397_data *data = i2c_get_clientdata(client); - int res; - -- down(&data->lock); -+ mutex_lock(&data->lock); - outb(reg, client->addr); - res = inb_p(client->addr + 1); -- up(&data->lock); -+ mutex_unlock(&data->lock); - return res; - } - -@@ -121,7 +122,7 @@ - struct smsc47b397_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { - dev_dbg(&client->dev, "starting device update...\n"); -@@ -144,7 +145,7 @@ - dev_dbg(&client->dev, "... device update complete\n"); - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } -@@ -254,14 +255,14 @@ - new_client = &data->client; - i2c_set_clientdata(new_client, data); - new_client->addr = address; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - new_client->adapter = adapter; - new_client->driver = &smsc47b397_driver; - new_client->flags = 0; - - strlcpy(new_client->name, "smsc47b397", I2C_NAME_SIZE); - -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - if ((err = i2c_attach_client(new_client))) - goto error_free; ---- linux-2.6.16.orig/drivers/hwmon/smsc47m1.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/smsc47m1.c 2006-03-22 17:06:15.000000000 +0100 -@@ -34,6 +34,7 @@ - #include <linux/hwmon.h> - #include <linux/err.h> - #include <linux/init.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - /* Address is autodetected, there is no default value */ -@@ -102,9 +103,9 @@ - struct smsc47m1_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - -- struct semaphore update_lock; -+ struct mutex update_lock; - unsigned long last_updated; /* In jiffies */ - - u8 fan[2]; /* Register value */ -@@ -188,18 +189,18 @@ - struct smsc47m1_data *data = i2c_get_clientdata(client); - long rpmdiv, val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]); - - if (983040 > 192 * rpmdiv || 2 * rpmdiv > 983040) { -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - - data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv); - smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD(nr), - data->fan_preload[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -220,14 +221,14 @@ - if (new_div == old_div) /* No change */ - return count; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - switch (new_div) { - case 1: data->fan_div[nr] = 0; break; - case 2: data->fan_div[nr] = 1; break; - case 4: data->fan_div[nr] = 2; break; - case 8: data->fan_div[nr] = 3; break; - default: -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -@@ -241,7 +242,7 @@ - data->fan_preload[nr] = SENSORS_LIMIT(tmp, 0, 191); - smsc47m1_write_value(client, SMSC47M1_REG_FAN_PRELOAD(nr), - data->fan_preload[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -257,12 +258,12 @@ - if (val < 0 || val > 255) - return -EINVAL; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm[nr] &= 0x81; /* Preserve additional bits */ - data->pwm[nr] |= PWM_TO_REG(val); - smsc47m1_write_value(client, SMSC47M1_REG_PWM(nr), - data->pwm[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -278,12 +279,12 @@ - if (val != 0 && val != 1) - return -EINVAL; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm[nr] &= 0xFE; /* preserve the other bits */ - data->pwm[nr] |= !val; - smsc47m1_write_value(client, SMSC47M1_REG_PWM(nr), - data->pwm[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } -@@ -408,13 +409,13 @@ - new_client = &data->client; - i2c_set_clientdata(new_client, data); - new_client->addr = address; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - new_client->adapter = adapter; - new_client->driver = &smsc47m1_driver; - new_client->flags = 0; - - strlcpy(new_client->name, "smsc47m1", I2C_NAME_SIZE); -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* If no function is properly configured, there's no point in - actually registering the chip. */ -@@ -512,17 +513,17 @@ - { - int res; - -- down(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); -+ mutex_lock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); - res = inb_p(client->addr + reg); -- up(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); -+ mutex_unlock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); - return res; - } - - static void smsc47m1_write_value(struct i2c_client *client, u8 reg, u8 value) - { -- down(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); -+ mutex_lock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); - outb_p(value, client->addr + reg); -- up(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); -+ mutex_unlock(&((struct smsc47m1_data *) i2c_get_clientdata(client))->lock); - } - - static struct smsc47m1_data *smsc47m1_update_device(struct device *dev, -@@ -531,7 +532,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct smsc47m1_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) { - int i; -@@ -558,7 +559,7 @@ - data->last_updated = jiffies; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return data; - } - ---- linux-2.6.16.orig/drivers/hwmon/via686a.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/via686a.c 2006-03-22 17:06:15.000000000 +0100 -@@ -39,6 +39,7 @@ - #include <linux/hwmon.h> - #include <linux/err.h> - #include <linux/init.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - -@@ -296,7 +297,7 @@ - struct via686a_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -355,11 +356,11 @@ - struct via686a_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = IN_TO_REG(val, nr); - via686a_write_value(client, VIA686A_REG_IN_MIN(nr), - data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_in_max(struct device *dev, const char *buf, -@@ -368,11 +369,11 @@ - struct via686a_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = IN_TO_REG(val, nr); - via686a_write_value(client, VIA686A_REG_IN_MAX(nr), - data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define show_in_offset(offset) \ -@@ -432,11 +433,11 @@ - struct via686a_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_over[nr] = TEMP_TO_REG(val); - via686a_write_value(client, VIA686A_REG_TEMP_OVER[nr], - data->temp_over[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_temp_hyst(struct device *dev, const char *buf, -@@ -445,11 +446,11 @@ - struct via686a_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_hyst[nr] = TEMP_TO_REG(val); - via686a_write_value(client, VIA686A_REG_TEMP_HYST[nr], - data->temp_hyst[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - #define show_temp_offset(offset) \ -@@ -508,10 +509,10 @@ - struct via686a_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); - via686a_write_value(client, VIA686A_REG_FAN_MIN(nr+1), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_fan_div(struct device *dev, const char *buf, -@@ -521,12 +522,12 @@ - int val = simple_strtol(buf, NULL, 10); - int old; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - old = via686a_read_value(client, VIA686A_REG_FANDIV); - data->fan_div[nr] = DIV_TO_REG(val); - old = (old & 0x0f) | (data->fan_div[1] << 6) | (data->fan_div[0] << 4); - via686a_write_value(client, VIA686A_REG_FANDIV, old); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -639,7 +640,7 @@ - strlcpy(new_client->name, client_name, I2C_NAME_SIZE); - - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) - goto exit_free; -@@ -733,7 +734,7 @@ - struct via686a_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -788,7 +789,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/vt8231.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/vt8231.c 2006-03-22 17:06:15.000000000 +0100 -@@ -35,6 +35,7 @@ - #include <linux/hwmon-sysfs.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - - static int force_addr; -@@ -148,7 +149,7 @@ - - struct vt8231_data { - struct i2c_client client; -- struct semaphore update_lock; -+ struct mutex update_lock; - struct class_device *class_dev; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ -@@ -223,10 +224,10 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[nr] = SENSORS_LIMIT(((val * 958) / 10000) + 3, 0, 255); - vt8231_write_value(client, regvoltmin[nr], data->in_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -239,10 +240,10 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[nr] = SENSORS_LIMIT(((val * 958) / 10000) + 3, 0, 255); - vt8231_write_value(client, regvoltmax[nr], data->in_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -281,11 +282,11 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_min[5] = SENSORS_LIMIT(((val * 958 * 34) / (10000 * 54)) + 3, - 0, 255); - vt8231_write_value(client, regvoltmin[5], data->in_min[5]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -296,11 +297,11 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->in_max[5] = SENSORS_LIMIT(((val * 958 * 34) / (10000 * 54)) + 3, - 0, 255); - vt8231_write_value(client, regvoltmax[5], data->in_max[5]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -351,10 +352,10 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[0] = SENSORS_LIMIT((val + 500) / 1000, 0, 255); - vt8231_write_value(client, regtempmax[0], data->temp_max[0]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_temp0_min(struct device *dev, struct device_attribute *attr, -@@ -364,10 +365,10 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_min[0] = SENSORS_LIMIT((val + 500) / 1000, 0, 255); - vt8231_write_value(client, regtempmin[0], data->temp_min[0]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -407,10 +408,10 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_max[nr] = SENSORS_LIMIT(TEMP_MAXMIN_TO_REG(val), 0, 255); - vt8231_write_value(client, regtempmax[nr], data->temp_max[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, -@@ -422,10 +423,10 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - int val = simple_strtol(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->temp_min[nr] = SENSORS_LIMIT(TEMP_MAXMIN_TO_REG(val), 0, 255); - vt8231_write_value(client, regtempmin[nr], data->temp_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -520,10 +521,10 @@ - struct vt8231_data *data = i2c_get_clientdata(client); - int val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); - vt8231_write_value(client, VT8231_REG_FAN_MIN(nr), data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -539,7 +540,7 @@ - long min = FAN_FROM_REG(data->fan_min[nr], - DIV_FROM_REG(data->fan_div[nr])); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - switch (val) { - case 1: data->fan_div[nr] = 0; break; - case 2: data->fan_div[nr] = 1; break; -@@ -548,7 +549,7 @@ - default: - dev_err(&client->dev, "fan_div value %ld not supported." - "Choose one of 1, 2, 4 or 8!\n", val); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -@@ -558,7 +559,7 @@ - - old = (old & 0x0f) | (data->fan_div[1] << 6) | (data->fan_div[0] << 4); - vt8231_write_value(client, VT8231_REG_FANDIV, old); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -660,7 +661,7 @@ - /* Fill in the remaining client fields and put into the global list */ - strlcpy(client->name, "vt8231", I2C_NAME_SIZE); - -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(client))) -@@ -745,7 +746,7 @@ - int i; - u16 low; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -804,7 +805,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/w83627ehf.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/w83627ehf.c 2006-03-22 17:06:16.000000000 +0100 -@@ -30,10 +30,7 @@ - Supports the following chips: - - Chip #vin #fan #pwm #temp chip_id man_id -- w83627ehf - 5 - 3 0x88 0x5ca3 -- -- This is a preliminary version of the driver, only supporting the -- fan and temperature inputs. The chip does much more than that. -+ w83627ehf 10 5 - 3 0x88 0x5ca3 - */ - - #include <linux/module.h> -@@ -42,7 +39,9 @@ - #include <linux/i2c.h> - #include <linux/i2c-isa.h> - #include <linux/hwmon.h> -+#include <linux/hwmon-sysfs.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - #include "lm75.h" - -@@ -119,6 +118,14 @@ - static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 }; - static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c }; - -+/* The W83627EHF registers for nr=7,8,9 are in bank 5 */ -+#define W83627EHF_REG_IN_MAX(nr) ((nr < 7) ? (0x2b + (nr) * 2) : \ -+ (0x554 + (((nr) - 7) * 2))) -+#define W83627EHF_REG_IN_MIN(nr) ((nr < 7) ? (0x2c + (nr) * 2) : \ -+ (0x555 + (((nr) - 7) * 2))) -+#define W83627EHF_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \ -+ (0x550 + (nr) - 7)) -+ - #define W83627EHF_REG_TEMP1 0x27 - #define W83627EHF_REG_TEMP1_HYST 0x3a - #define W83627EHF_REG_TEMP1_OVER 0x39 -@@ -134,6 +141,10 @@ - #define W83627EHF_REG_DIODE 0x59 - #define W83627EHF_REG_SMI_OVT 0x4C - -+#define W83627EHF_REG_ALARM1 0x459 -+#define W83627EHF_REG_ALARM2 0x45A -+#define W83627EHF_REG_ALARM3 0x45B -+ - /* - * Conversions - */ -@@ -170,6 +181,20 @@ - return (temp + 500) / 1000; - } - -+/* Some of analog inputs have internal scaling (2x), 8mV is ADC LSB */ -+ -+static u8 scale_in[10] = { 8, 8, 16, 16, 8, 8, 8, 16, 16, 8 }; -+ -+static inline long in_from_reg(u8 reg, u8 nr) -+{ -+ return reg * scale_in[nr]; -+} -+ -+static inline u8 in_to_reg(u32 val, u8 nr) -+{ -+ return SENSORS_LIMIT(((val + (scale_in[nr] / 2)) / scale_in[nr]), 0, 255); -+} -+ - /* - * Data structures and manipulation thereof - */ -@@ -177,13 +202,16 @@ - struct w83627ehf_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - - /* Register values */ -+ u8 in[10]; /* Register value */ -+ u8 in_max[10]; /* Register value */ -+ u8 in_min[10]; /* Register value */ - u8 fan[5]; - u8 fan_min[5]; - u8 fan_div[5]; -@@ -194,6 +222,7 @@ - s16 temp[2]; - s16 temp_max[2]; - s16 temp_max_hyst[2]; -+ u32 alarms; - }; - - static inline int is_word_sized(u16 reg) -@@ -230,7 +259,7 @@ - struct w83627ehf_data *data = i2c_get_clientdata(client); - int res, word_sized = is_word_sized(reg); - -- down(&data->lock); -+ mutex_lock(&data->lock); - - w83627ehf_set_bank(client, reg); - outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET); -@@ -242,7 +271,7 @@ - } - w83627ehf_reset_bank(client, reg); - -- up(&data->lock); -+ mutex_unlock(&data->lock); - - return res; - } -@@ -252,7 +281,7 @@ - struct w83627ehf_data *data = i2c_get_clientdata(client); - int word_sized = is_word_sized(reg); - -- down(&data->lock); -+ mutex_lock(&data->lock); - - w83627ehf_set_bank(client, reg); - outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET); -@@ -264,7 +293,7 @@ - outb_p(value & 0xff, client->addr + DATA_REG_OFFSET); - w83627ehf_reset_bank(client, reg); - -- up(&data->lock); -+ mutex_unlock(&data->lock); - return 0; - } - -@@ -322,7 +351,7 @@ - struct w83627ehf_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ) - || !data->valid) { -@@ -347,6 +376,16 @@ - data->fan_div[3] |= (i >> 5) & 0x04; - } - -+ /* Measured voltages and limits */ -+ for (i = 0; i < 10; i++) { -+ data->in[i] = w83627ehf_read_value(client, -+ W83627EHF_REG_IN(i)); -+ data->in_min[i] = w83627ehf_read_value(client, -+ W83627EHF_REG_IN_MIN(i)); -+ data->in_max[i] = w83627ehf_read_value(client, -+ W83627EHF_REG_IN_MAX(i)); -+ } -+ - /* Measured fan speeds and limits */ - for (i = 0; i < 5; i++) { - if (!(data->has_fan & (1 << i))) -@@ -393,23 +432,136 @@ - W83627EHF_REG_TEMP_HYST[i]); - } - -+ data->alarms = w83627ehf_read_value(client, -+ W83627EHF_REG_ALARM1) | -+ (w83627ehf_read_value(client, -+ W83627EHF_REG_ALARM2) << 8) | -+ (w83627ehf_read_value(client, -+ W83627EHF_REG_ALARM3) << 16); -+ - data->last_updated = jiffies; - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return data; - } - - /* - * Sysfs callback functions - */ -+#define show_in_reg(reg) \ -+static ssize_t \ -+show_##reg(struct device *dev, struct device_attribute *attr, \ -+ char *buf) \ -+{ \ -+ struct w83627ehf_data *data = w83627ehf_update_device(dev); \ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ -+ int nr = sensor_attr->index; \ -+ return sprintf(buf, "%ld\n", in_from_reg(data->reg[nr], nr)); \ -+} -+show_in_reg(in) -+show_in_reg(in_min) -+show_in_reg(in_max) -+ -+#define store_in_reg(REG, reg) \ -+static ssize_t \ -+store_in_##reg (struct device *dev, struct device_attribute *attr, \ -+ const char *buf, size_t count) \ -+{ \ -+ struct i2c_client *client = to_i2c_client(dev); \ -+ struct w83627ehf_data *data = i2c_get_clientdata(client); \ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ -+ int nr = sensor_attr->index; \ -+ u32 val = simple_strtoul(buf, NULL, 10); \ -+ \ -+ mutex_lock(&data->update_lock); \ -+ data->in_##reg[nr] = in_to_reg(val, nr); \ -+ w83627ehf_write_value(client, W83627EHF_REG_IN_##REG(nr), \ -+ data->in_##reg[nr]); \ -+ mutex_unlock(&data->update_lock); \ -+ return count; \ -+} -+ -+store_in_reg(MIN, min) -+store_in_reg(MAX, max) -+ -+static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ struct w83627ehf_data *data = w83627ehf_update_device(dev); -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ return sprintf(buf, "%u\n", (data->alarms >> nr) & 0x01); -+} -+ -+static struct sensor_device_attribute sda_in_input[] = { -+ SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0), -+ SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1), -+ SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2), -+ SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3), -+ SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4), -+ SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5), -+ SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6), -+ SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7), -+ SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8), -+ SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9), -+}; -+ -+static struct sensor_device_attribute sda_in_alarm[] = { -+ SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0), -+ SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1), -+ SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2), -+ SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3), -+ SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8), -+ SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 21), -+ SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 20), -+ SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 16), -+ SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 17), -+ SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 19), -+}; -+ -+static struct sensor_device_attribute sda_in_min[] = { -+ SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0), -+ SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1), -+ SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2), -+ SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3), -+ SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4), -+ SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5), -+ SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6), -+ SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7), -+ SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8), -+ SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9), -+}; -+ -+static struct sensor_device_attribute sda_in_max[] = { -+ SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0), -+ SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1), -+ SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2), -+ SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3), -+ SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4), -+ SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5), -+ SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6), -+ SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7), -+ SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8), -+ SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9), -+}; -+ -+static void device_create_file_in(struct device *dev, int i) -+{ -+ device_create_file(dev, &sda_in_input[i].dev_attr); -+ device_create_file(dev, &sda_in_alarm[i].dev_attr); -+ device_create_file(dev, &sda_in_min[i].dev_attr); -+ device_create_file(dev, &sda_in_max[i].dev_attr); -+} - - #define show_fan_reg(reg) \ - static ssize_t \ --show_##reg(struct device *dev, char *buf, int nr) \ -+show_##reg(struct device *dev, struct device_attribute *attr, \ -+ char *buf) \ - { \ - struct w83627ehf_data *data = w83627ehf_update_device(dev); \ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ -+ int nr = sensor_attr->index; \ - return sprintf(buf, "%d\n", \ - fan_from_reg(data->reg[nr], \ - div_from_reg(data->fan_div[nr]))); \ -@@ -418,23 +570,28 @@ - show_fan_reg(fan_min); - - static ssize_t --show_fan_div(struct device *dev, char *buf, int nr) -+show_fan_div(struct device *dev, struct device_attribute *attr, -+ char *buf) - { - struct w83627ehf_data *data = w83627ehf_update_device(dev); -- return sprintf(buf, "%u\n", -- div_from_reg(data->fan_div[nr])); -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr])); - } - - static ssize_t --store_fan_min(struct device *dev, const char *buf, size_t count, int nr) -+store_fan_min(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct i2c_client *client = to_i2c_client(dev); - struct w83627ehf_data *data = i2c_get_clientdata(client); -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; - unsigned int val = simple_strtoul(buf, NULL, 10); - unsigned int reg; - u8 new_div; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - if (!val) { - /* No min limit, alarm disabled */ - data->fan_min[nr] = 255; -@@ -482,63 +639,55 @@ - } - w83627ehf_write_value(client, W83627EHF_REG_FAN_MIN[nr], - data->fan_min[nr]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return count; - } - --#define sysfs_fan_offset(offset) \ --static ssize_t \ --show_reg_fan_##offset(struct device *dev, struct device_attribute *attr, \ -- char *buf) \ --{ \ -- return show_fan(dev, buf, offset-1); \ --} \ --static DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ -- show_reg_fan_##offset, NULL); -+static struct sensor_device_attribute sda_fan_input[] = { -+ SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0), -+ SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1), -+ SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2), -+ SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3), -+ SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4), -+}; - --#define sysfs_fan_min_offset(offset) \ --static ssize_t \ --show_reg_fan##offset##_min(struct device *dev, struct device_attribute *attr, \ -- char *buf) \ --{ \ -- return show_fan_min(dev, buf, offset-1); \ --} \ --static ssize_t \ --store_reg_fan##offset##_min(struct device *dev, struct device_attribute *attr, \ -- const char *buf, size_t count) \ --{ \ -- return store_fan_min(dev, buf, count, offset-1); \ --} \ --static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ -- show_reg_fan##offset##_min, \ -- store_reg_fan##offset##_min); -+static struct sensor_device_attribute sda_fan_alarm[] = { -+ SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6), -+ SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7), -+ SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 10), -+ SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 11), -+ SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 23), -+}; - --#define sysfs_fan_div_offset(offset) \ --static ssize_t \ --show_reg_fan##offset##_div(struct device *dev, struct device_attribute *attr, \ -- char *buf) \ --{ \ -- return show_fan_div(dev, buf, offset - 1); \ --} \ --static DEVICE_ATTR(fan##offset##_div, S_IRUGO, \ -- show_reg_fan##offset##_div, NULL); -- --sysfs_fan_offset(1); --sysfs_fan_min_offset(1); --sysfs_fan_div_offset(1); --sysfs_fan_offset(2); --sysfs_fan_min_offset(2); --sysfs_fan_div_offset(2); --sysfs_fan_offset(3); --sysfs_fan_min_offset(3); --sysfs_fan_div_offset(3); --sysfs_fan_offset(4); --sysfs_fan_min_offset(4); --sysfs_fan_div_offset(4); --sysfs_fan_offset(5); --sysfs_fan_min_offset(5); --sysfs_fan_div_offset(5); -+static struct sensor_device_attribute sda_fan_min[] = { -+ SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min, -+ store_fan_min, 0), -+ SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min, -+ store_fan_min, 1), -+ SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min, -+ store_fan_min, 2), -+ SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min, -+ store_fan_min, 3), -+ SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min, -+ store_fan_min, 4), -+}; -+ -+static struct sensor_device_attribute sda_fan_div[] = { -+ SENSOR_ATTR(fan1_div, S_IRUGO, show_fan_div, NULL, 0), -+ SENSOR_ATTR(fan2_div, S_IRUGO, show_fan_div, NULL, 1), -+ SENSOR_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2), -+ SENSOR_ATTR(fan4_div, S_IRUGO, show_fan_div, NULL, 3), -+ SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4), -+}; -+ -+static void device_create_file_fan(struct device *dev, int i) -+{ -+ device_create_file(dev, &sda_fan_input[i].dev_attr); -+ device_create_file(dev, &sda_fan_alarm[i].dev_attr); -+ device_create_file(dev, &sda_fan_div[i].dev_attr); -+ device_create_file(dev, &sda_fan_min[i].dev_attr); -+} - - #define show_temp1_reg(reg) \ - static ssize_t \ -@@ -561,27 +710,24 @@ - struct w83627ehf_data *data = i2c_get_clientdata(client); \ - u32 val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->temp1_##reg = temp1_to_reg(val); \ - w83627ehf_write_value(client, W83627EHF_REG_TEMP1_##REG, \ - data->temp1_##reg); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - store_temp1_reg(OVER, max); - store_temp1_reg(HYST, max_hyst); - --static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp1, NULL); --static DEVICE_ATTR(temp1_max, S_IRUGO| S_IWUSR, -- show_temp1_max, store_temp1_max); --static DEVICE_ATTR(temp1_max_hyst, S_IRUGO| S_IWUSR, -- show_temp1_max_hyst, store_temp1_max_hyst); -- - #define show_temp_reg(reg) \ - static ssize_t \ --show_##reg (struct device *dev, char *buf, int nr) \ -+show_##reg(struct device *dev, struct device_attribute *attr, \ -+ char *buf) \ - { \ - struct w83627ehf_data *data = w83627ehf_update_device(dev); \ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ -+ int nr = sensor_attr->index; \ - return sprintf(buf, "%d\n", \ - LM75_TEMP_FROM_REG(data->reg[nr])); \ - } -@@ -591,55 +737,45 @@ - - #define store_temp_reg(REG, reg) \ - static ssize_t \ --store_##reg (struct device *dev, const char *buf, size_t count, int nr) \ -+store_##reg(struct device *dev, struct device_attribute *attr, \ -+ const char *buf, size_t count) \ - { \ - struct i2c_client *client = to_i2c_client(dev); \ - struct w83627ehf_data *data = i2c_get_clientdata(client); \ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ -+ int nr = sensor_attr->index; \ - u32 val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->reg[nr] = LM75_TEMP_TO_REG(val); \ - w83627ehf_write_value(client, W83627EHF_REG_TEMP_##REG[nr], \ - data->reg[nr]); \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - store_temp_reg(OVER, temp_max); - store_temp_reg(HYST, temp_max_hyst); - --#define sysfs_temp_offset(offset) \ --static ssize_t \ --show_reg_temp##offset (struct device *dev, struct device_attribute *attr, \ -- char *buf) \ --{ \ -- return show_temp(dev, buf, offset - 2); \ --} \ --static DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ -- show_reg_temp##offset, NULL); -- --#define sysfs_temp_reg_offset(reg, offset) \ --static ssize_t \ --show_reg_temp##offset##_##reg(struct device *dev, struct device_attribute *attr, \ -- char *buf) \ --{ \ -- return show_temp_##reg(dev, buf, offset - 2); \ --} \ --static ssize_t \ --store_reg_temp##offset##_##reg(struct device *dev, struct device_attribute *attr, \ -- const char *buf, size_t count) \ --{ \ -- return store_temp_##reg(dev, buf, count, offset - 2); \ --} \ --static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, \ -- show_reg_temp##offset##_##reg, \ -- store_reg_temp##offset##_##reg); -- --sysfs_temp_offset(2); --sysfs_temp_reg_offset(max, 2); --sysfs_temp_reg_offset(max_hyst, 2); --sysfs_temp_offset(3); --sysfs_temp_reg_offset(max, 3); --sysfs_temp_reg_offset(max_hyst, 3); -+static struct sensor_device_attribute sda_temp[] = { -+ SENSOR_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0), -+ SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0), -+ SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 1), -+ SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1_max, -+ store_temp1_max, 0), -+ SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max, -+ store_temp_max, 0), -+ SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max, -+ store_temp_max, 1), -+ SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1_max_hyst, -+ store_temp1_max_hyst, 0), -+ SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst, -+ store_temp_max_hyst, 0), -+ SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst, -+ store_temp_max_hyst, 1), -+ SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4), -+ SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5), -+ SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13), -+}; - - /* - * Driver and client management -@@ -673,6 +809,7 @@ - { - struct i2c_client *client; - struct w83627ehf_data *data; -+ struct device *dev; - int i, err = 0; - - if (!request_region(address + REGION_OFFSET, REGION_LENGTH, -@@ -689,14 +826,15 @@ - client = &data->client; - i2c_set_clientdata(client, data); - client->addr = address; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - client->adapter = adapter; - client->driver = &w83627ehf_driver; - client->flags = 0; -+ dev = &client->dev; - - strlcpy(client->name, "w83627ehf", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the i2c layer a new client has arrived */ - if ((err = i2c_attach_client(client))) -@@ -720,42 +858,21 @@ - data->has_fan |= (1 << 4); - - /* Register sysfs hooks */ -- data->class_dev = hwmon_device_register(&client->dev); -+ data->class_dev = hwmon_device_register(dev); - if (IS_ERR(data->class_dev)) { - err = PTR_ERR(data->class_dev); - goto exit_detach; - } - -- device_create_file(&client->dev, &dev_attr_fan1_input); -- device_create_file(&client->dev, &dev_attr_fan1_min); -- device_create_file(&client->dev, &dev_attr_fan1_div); -- device_create_file(&client->dev, &dev_attr_fan2_input); -- device_create_file(&client->dev, &dev_attr_fan2_min); -- device_create_file(&client->dev, &dev_attr_fan2_div); -- device_create_file(&client->dev, &dev_attr_fan3_input); -- device_create_file(&client->dev, &dev_attr_fan3_min); -- device_create_file(&client->dev, &dev_attr_fan3_div); -- -- if (data->has_fan & (1 << 3)) { -- device_create_file(&client->dev, &dev_attr_fan4_input); -- device_create_file(&client->dev, &dev_attr_fan4_min); -- device_create_file(&client->dev, &dev_attr_fan4_div); -- } -- if (data->has_fan & (1 << 4)) { -- device_create_file(&client->dev, &dev_attr_fan5_input); -- device_create_file(&client->dev, &dev_attr_fan5_min); -- device_create_file(&client->dev, &dev_attr_fan5_div); -- } -- -- device_create_file(&client->dev, &dev_attr_temp1_input); -- device_create_file(&client->dev, &dev_attr_temp1_max); -- device_create_file(&client->dev, &dev_attr_temp1_max_hyst); -- device_create_file(&client->dev, &dev_attr_temp2_input); -- device_create_file(&client->dev, &dev_attr_temp2_max); -- device_create_file(&client->dev, &dev_attr_temp2_max_hyst); -- device_create_file(&client->dev, &dev_attr_temp3_input); -- device_create_file(&client->dev, &dev_attr_temp3_max); -- device_create_file(&client->dev, &dev_attr_temp3_max_hyst); -+ for (i = 0; i < 10; i++) -+ device_create_file_in(dev, i); -+ -+ for (i = 0; i < 5; i++) { -+ if (data->has_fan & (1 << i)) -+ device_create_file_fan(dev, i); -+ } -+ for (i = 0; i < ARRAY_SIZE(sda_temp); i++) -+ device_create_file(dev, &sda_temp[i].dev_attr); - - return 0; - ---- linux-2.6.16.orig/drivers/hwmon/w83627hf.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/w83627hf.c 2006-03-22 17:06:21.000000000 +0100 -@@ -28,6 +28,7 @@ - w83627hf 9 3 2 3 0x20 0x5ca3 no yes(LPC) - w83627thf 7 3 3 3 0x90 0x5ca3 no yes(LPC) - w83637hf 7 3 3 3 0x80 0x5ca3 no yes(LPC) -+ w83687thf 7 3 3 3 0x90 0x5ca3 no yes(LPC) - w83697hf 8 2 2 2 0x60 0x5ca3 no yes(LPC) - - For other winbond chips, and for i2c support in the above chips, -@@ -45,7 +46,9 @@ - #include <linux/i2c-isa.h> - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> -+#include <linux/hwmon-sysfs.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - #include "lm75.h" - -@@ -62,7 +65,7 @@ - static unsigned short address; - - /* Insmod parameters */ --enum chips { any_chip, w83627hf, w83627thf, w83697hf, w83637hf }; -+enum chips { any_chip, w83627hf, w83627thf, w83697hf, w83637hf, w83687thf }; - - static int reset; - module_param(reset, bool, 0); -@@ -100,6 +103,10 @@ - #define W83627THF_GPIO5_IOSR 0xf3 /* w83627thf only */ - #define W83627THF_GPIO5_DR 0xf4 /* w83627thf only */ - -+#define W83687THF_VID_EN 0x29 /* w83687thf only */ -+#define W83687THF_VID_CFG 0xF0 /* w83687thf only */ -+#define W83687THF_VID_DATA 0xF1 /* w83687thf only */ -+ - static inline void - superio_outb(int reg, int val) - { -@@ -138,6 +145,7 @@ - #define W627THF_DEVID 0x82 - #define W697_DEVID 0x60 - #define W637_DEVID 0x70 -+#define W687THF_DEVID 0x85 - #define WINB_ACT_REG 0x30 - #define WINB_BASE_REG 0x60 - /* Constants specified below */ -@@ -201,11 +209,11 @@ - #define W83627HF_REG_PWM1 0x5A - #define W83627HF_REG_PWM2 0x5B - --#define W83627THF_REG_PWM1 0x01 /* 697HF and 637HF too */ --#define W83627THF_REG_PWM2 0x03 /* 697HF and 637HF too */ --#define W83627THF_REG_PWM3 0x11 /* 637HF too */ -+#define W83627THF_REG_PWM1 0x01 /* 697HF/637HF/687THF too */ -+#define W83627THF_REG_PWM2 0x03 /* 697HF/637HF/687THF too */ -+#define W83627THF_REG_PWM3 0x11 /* 637HF/687THF too */ - --#define W83627THF_REG_VRM_OVT_CFG 0x18 /* 637HF too */ -+#define W83627THF_REG_VRM_OVT_CFG 0x18 /* 637HF/687THF too */ - - static const u8 regpwm_627hf[] = { W83627HF_REG_PWM1, W83627HF_REG_PWM2 }; - static const u8 regpwm[] = { W83627THF_REG_PWM1, W83627THF_REG_PWM2, -@@ -285,10 +293,10 @@ - struct w83627hf_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -318,16 +326,15 @@ - Default = 3435. - Other Betas unimplemented */ - u8 vrm; -- u8 vrm_ovt; /* Register value, 627thf & 637hf only */ -+ u8 vrm_ovt; /* Register value, 627THF/637HF/687THF only */ - }; - - - static int w83627hf_detect(struct i2c_adapter *adapter); - static int w83627hf_detach_client(struct i2c_client *client); - --static int w83627hf_read_value(struct i2c_client *client, u16 register); --static int w83627hf_write_value(struct i2c_client *client, u16 register, -- u16 value); -+static int w83627hf_read_value(struct i2c_client *client, u16 reg); -+static int w83627hf_write_value(struct i2c_client *client, u16 reg, u16 value); - static struct w83627hf_data *w83627hf_update_device(struct device *dev); - static void w83627hf_init_client(struct i2c_client *client); - -@@ -360,12 +367,12 @@ - \ - val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->in_##reg[nr] = IN_TO_REG(val); \ - w83627hf_write_value(client, W83781D_REG_IN_##REG(nr), \ - data->in_##reg[nr]); \ - \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - store_in_reg(MIN, min) -@@ -413,7 +420,8 @@ - long in0; - - if ((data->vrm_ovt & 0x01) && -- (w83627thf == data->type || w83637hf == data->type)) -+ (w83627thf == data->type || w83637hf == data->type -+ || w83687thf == data->type)) - - /* use VRM9 calculation */ - in0 = (long)((reg * 488 + 70000 + 50) / 100); -@@ -451,10 +459,11 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if ((data->vrm_ovt & 0x01) && -- (w83627thf == data->type || w83637hf == data->type)) -+ (w83627thf == data->type || w83637hf == data->type -+ || w83687thf == data->type)) - - /* use VRM9 calculation */ - data->in_min[0] = -@@ -465,7 +474,7 @@ - data->in_min[0] = IN_TO_REG(val); - - w83627hf_write_value(client, W83781D_REG_IN_MIN(0), data->in_min[0]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -478,10 +487,11 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if ((data->vrm_ovt & 0x01) && -- (w83627thf == data->type || w83637hf == data->type)) -+ (w83627thf == data->type || w83637hf == data->type -+ || w83687thf == data->type)) - - /* use VRM9 calculation */ - data->in_max[0] = -@@ -492,7 +502,7 @@ - data->in_max[0] = IN_TO_REG(val); - - w83627hf_write_value(client, W83781D_REG_IN_MAX(0), data->in_max[0]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -507,6 +517,10 @@ - device_create_file(&client->dev, &dev_attr_in##offset##_input); \ - device_create_file(&client->dev, &dev_attr_in##offset##_min); \ - device_create_file(&client->dev, &dev_attr_in##offset##_max); \ -+device_create_file(&client->dev, \ -+ &sensor_dev_attr_in##offset##_alarm.dev_attr); \ -+device_create_file(&client->dev, \ -+ &sensor_dev_attr_in##offset##_beep.dev_attr); \ - } while (0) - - #define show_fan_reg(reg) \ -@@ -529,13 +543,13 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr - 1] = - FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1])); - w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr), - data->fan_min[nr - 1]); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -570,6 +584,10 @@ - do { \ - device_create_file(&client->dev, &dev_attr_fan##offset##_input); \ - device_create_file(&client->dev, &dev_attr_fan##offset##_min); \ -+device_create_file(&client->dev, \ -+ &sensor_dev_attr_fan##offset##_alarm.dev_attr); \ -+device_create_file(&client->dev, \ -+ &sensor_dev_attr_fan##offset##_beep.dev_attr); \ - } while (0) - - #define show_temp_reg(reg) \ -@@ -597,7 +615,7 @@ - \ - val = simple_strtoul(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - \ - if (nr >= 2) { /* TEMP2 and TEMP3 */ \ - data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \ -@@ -609,7 +627,7 @@ - data->temp_##reg); \ - } \ - \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - store_temp_reg(OVER, max); -@@ -651,6 +669,10 @@ - device_create_file(&client->dev, &dev_attr_temp##offset##_input); \ - device_create_file(&client->dev, &dev_attr_temp##offset##_max); \ - device_create_file(&client->dev, &dev_attr_temp##offset##_max_hyst); \ -+device_create_file(&client->dev, \ -+ &sensor_dev_attr_temp##offset##_alarm.dev_attr); \ -+device_create_file(&client->dev, \ -+ &sensor_dev_attr_temp##offset##_beep.dev_attr); \ - } while (0) - - static ssize_t -@@ -693,76 +715,152 @@ - } - static DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL); - #define device_create_file_alarms(client) \ --device_create_file(&client->dev, &dev_attr_alarms) -+do { \ -+device_create_file(&client->dev, &dev_attr_alarms); \ -+device_create_file(&client->dev, &sensor_dev_attr_chassis_alarm.dev_attr); \ -+} while (0) - --#define show_beep_reg(REG, reg) \ --static ssize_t show_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \ --{ \ -- struct w83627hf_data *data = w83627hf_update_device(dev); \ -- return sprintf(buf,"%ld\n", \ -- (long)BEEP_##REG##_FROM_REG(data->beep_##reg)); \ -+static ssize_t -+show_alarm_bit(struct device *dev, struct device_attribute *devattr, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); -+ struct w83627hf_data *data = w83627hf_update_device(dev); -+ -+ return sprintf(buf, "%u\n", (data->alarms >> attr->index) & 1); - } --show_beep_reg(ENABLE, enable) --show_beep_reg(MASK, mask) -+static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm_bit, NULL, 0); -+static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm_bit, NULL, 1); -+static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm_bit, NULL, 2); -+static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm_bit, NULL, 3); -+static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm_bit, NULL, 8); -+static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm_bit, NULL, 9); -+static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm_bit, NULL, 10); -+static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm_bit, NULL, 16); -+static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm_bit, NULL, 17); -+static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm_bit, NULL, 6); -+static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm_bit, NULL, 7); -+static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm_bit, NULL, 11); -+static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm_bit, NULL, 4); -+static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm_bit, NULL, 5); -+static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm_bit, NULL, 13); -+static SENSOR_DEVICE_ATTR(chassis_alarm, S_IRUGO, show_alarm_bit, NULL, 12); - --#define BEEP_ENABLE 0 /* Store beep_enable */ --#define BEEP_MASK 1 /* Store beep_mask */ -+static ssize_t show_beep_mask(struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ struct w83627hf_data *data = w83627hf_update_device(dev); -+ return sprintf(buf, "%ld\n", -+ (long)BEEP_MASK_FROM_REG(data->beep_mask)); -+} - - static ssize_t --store_beep_reg(struct device *dev, const char *buf, size_t count, -- int update_mask) -+store_beep_mask(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) - { - struct i2c_client *client = to_i2c_client(dev); - struct w83627hf_data *data = i2c_get_clientdata(client); -- u32 val, val2; -- -- val = simple_strtoul(buf, NULL, 10); -+ u32 val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -- -- if (update_mask == BEEP_MASK) { /* We are storing beep_mask */ -- data->beep_mask = BEEP_MASK_TO_REG(val); -- w83627hf_write_value(client, W83781D_REG_BEEP_INTS1, -- data->beep_mask & 0xff); -- w83627hf_write_value(client, W83781D_REG_BEEP_INTS3, -- ((data->beep_mask) >> 16) & 0xff); -- val2 = (data->beep_mask >> 8) & 0x7f; -- } else { /* We are storing beep_enable */ -- val2 = -- w83627hf_read_value(client, W83781D_REG_BEEP_INTS2) & 0x7f; -- data->beep_enable = BEEP_ENABLE_TO_REG(val); -- } -+ mutex_lock(&data->update_lock); - -+ data->beep_mask = BEEP_MASK_TO_REG(val); -+ w83627hf_write_value(client, W83781D_REG_BEEP_INTS1, -+ data->beep_mask & 0xff); -+ w83627hf_write_value(client, W83781D_REG_BEEP_INTS3, -+ ((data->beep_mask) >> 16) & 0xff); - w83627hf_write_value(client, W83781D_REG_BEEP_INTS2, -- val2 | data->beep_enable << 7); -+ ((data->beep_mask >> 8) & 0x7f) -+ | data->beep_enable << 7); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } -- --#define sysfs_beep(REG, reg) \ --static ssize_t show_regs_beep_##reg (struct device *dev, struct device_attribute *attr, char *buf) \ --{ \ -- return show_beep_##reg(dev, attr, buf); \ --} \ --static ssize_t \ --store_regs_beep_##reg (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ --{ \ -- return store_beep_reg(dev, buf, count, BEEP_##REG); \ --} \ --static DEVICE_ATTR(beep_##reg, S_IRUGO | S_IWUSR, \ -- show_regs_beep_##reg, store_regs_beep_##reg); -- --sysfs_beep(ENABLE, enable); --sysfs_beep(MASK, mask); -+static DEVICE_ATTR(beep_mask, S_IRUGO | S_IWUSR, \ -+ show_beep_mask, store_beep_mask); - - #define device_create_file_beep(client) \ - do { \ --device_create_file(&client->dev, &dev_attr_beep_enable); \ -+device_create_file(&client->dev, &sensor_dev_attr_beep_enable.dev_attr); \ - device_create_file(&client->dev, &dev_attr_beep_mask); \ -+device_create_file(&client->dev, &sensor_dev_attr_chassis_beep.dev_attr); \ - } while (0) - - static ssize_t -+show_beep_bit(struct device *dev, struct device_attribute *devattr, char *buf) -+{ -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); -+ struct w83627hf_data *data = w83627hf_update_device(dev); -+ -+ return sprintf(buf, "%u\n", (data->beep_mask >> attr->index) & 1); -+} -+ -+static ssize_t -+store_beep_bit(struct device *dev, struct device_attribute *devattr, -+ const char *buf, size_t count) -+{ -+ struct i2c_client *client = to_i2c_client(dev); -+ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); -+ struct w83627hf_data *data = i2c_get_clientdata(client); -+ u16 beepreg[3] = { W83781D_REG_BEEP_INTS1, W83781D_REG_BEEP_INTS2, -+ W83781D_REG_BEEP_INTS3 }; -+ u32 val; -+ u8 reg; -+ -+ val = simple_strtoul(buf, NULL, 10); -+ if (val != 0 && val != 1) -+ return -EINVAL; -+ -+ mutex_lock(&data->update_lock); -+ -+ reg = w83627hf_read_value(client, beepreg[attr->index >> 3]); -+ if (val) { -+ reg |= 1 << (attr->index & 0x07); -+ data->beep_mask |= 1 << attr->index; -+ } else { -+ reg &= ~(1 << (attr->index & 0x07)); -+ data->beep_mask &= ~(1 << attr->index); -+ } -+ w83627hf_write_value(client, beepreg[attr->index >> 3], reg); -+ -+ mutex_unlock(&data->update_lock); -+ return count; -+} -+ -+static SENSOR_DEVICE_ATTR(in0_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 0); -+static SENSOR_DEVICE_ATTR(in1_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 1); -+static SENSOR_DEVICE_ATTR(in2_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 2); -+static SENSOR_DEVICE_ATTR(in3_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 3); -+static SENSOR_DEVICE_ATTR(in4_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 8); -+static SENSOR_DEVICE_ATTR(in5_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 9); -+static SENSOR_DEVICE_ATTR(in6_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 10); -+static SENSOR_DEVICE_ATTR(in7_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 16); -+static SENSOR_DEVICE_ATTR(in8_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 17); -+static SENSOR_DEVICE_ATTR(fan1_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 6); -+static SENSOR_DEVICE_ATTR(fan2_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 7); -+static SENSOR_DEVICE_ATTR(fan3_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 11); -+static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 4); -+static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 5); -+static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 13); -+static SENSOR_DEVICE_ATTR(chassis_beep, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 12); -+static SENSOR_DEVICE_ATTR(beep_enable, S_IRUGO | S_IWUSR, show_beep_bit, -+ store_beep_bit, 15); -+ -+static ssize_t - show_fan_div_reg(struct device *dev, char *buf, int nr) - { - struct w83627hf_data *data = w83627hf_update_device(dev); -@@ -783,7 +881,7 @@ - u8 reg; - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - /* Save fan_min */ - min = FAN_FROM_REG(data->fan_min[nr], -@@ -805,7 +903,7 @@ - data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); - w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -848,7 +946,7 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (data->type == w83627thf) { - /* bits 0-3 are reserved in 627THF */ -@@ -865,7 +963,7 @@ - data->pwm[nr - 1]); - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -907,7 +1005,7 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - switch (val) { - case 1: /* PII/Celeron diode */ -@@ -941,7 +1039,7 @@ - break; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -980,7 +1078,8 @@ - if(val != W627_DEVID && - val != W627THF_DEVID && - val != W697_DEVID && -- val != W637_DEVID) { -+ val != W637_DEVID && -+ val != W687THF_DEVID) { - superio_exit(); - return -ENODEV; - } -@@ -1034,6 +1133,8 @@ - kind = w83627thf; - else if(val == W637_DEVID) - kind = w83637hf; -+ else if (val == W687THF_DEVID) -+ kind = w83687thf; - else { - dev_info(&adapter->dev, - "Unsupported chip (dev_id=0x%02X).\n", val); -@@ -1057,7 +1158,7 @@ - new_client = &data->client; - i2c_set_clientdata(new_client, data); - new_client->addr = address; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - new_client->adapter = adapter; - new_client->driver = &w83627hf_driver; - new_client->flags = 0; -@@ -1071,13 +1172,15 @@ - client_name = "w83697hf"; - } else if (kind == w83637hf) { - client_name = "w83637hf"; -+ } else if (kind == w83687thf) { -+ client_name = "w83687thf"; - } - - /* Fill in the remaining client fields and put into the global list */ - strlcpy(new_client->name, client_name, I2C_NAME_SIZE); - data->type = kind; - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -1106,7 +1209,7 @@ - device_create_file_in(new_client, 2); - device_create_file_in(new_client, 3); - device_create_file_in(new_client, 4); -- if (kind != w83627thf && kind != w83637hf) { -+ if (kind == w83627hf || kind == w83697hf) { - device_create_file_in(new_client, 5); - device_create_file_in(new_client, 6); - } -@@ -1139,7 +1242,7 @@ - - device_create_file_pwm(new_client, 1); - device_create_file_pwm(new_client, 2); -- if (kind == w83627thf || kind == w83637hf) -+ if (kind == w83627thf || kind == w83637hf || kind == w83687thf) - device_create_file_pwm(new_client, 3); - - device_create_file_sensor(new_client, 1); -@@ -1187,7 +1290,7 @@ - struct w83627hf_data *data = i2c_get_clientdata(client); - int res, word_sized; - -- down(&data->lock); -+ mutex_lock(&data->lock); - word_sized = (((reg & 0xff00) == 0x100) - || ((reg & 0xff00) == 0x200)) - && (((reg & 0x00ff) == 0x50) -@@ -1213,7 +1316,7 @@ - client->addr + W83781D_ADDR_REG_OFFSET); - outb_p(0, client->addr + W83781D_DATA_REG_OFFSET); - } -- up(&data->lock); -+ mutex_unlock(&data->lock); - return res; - } - -@@ -1247,12 +1350,39 @@ - return res; - } - -+static int w83687thf_read_vid(struct i2c_client *client) -+{ -+ int res = 0xff; -+ -+ superio_enter(); -+ superio_select(W83627HF_LD_HWM); -+ -+ /* Make sure these GPIO pins are enabled */ -+ if (!(superio_inb(W83687THF_VID_EN) & (1 << 2))) { -+ dev_dbg(&client->dev, "VID disabled, no VID function\n"); -+ goto exit; -+ } -+ -+ /* Make sure the pins are configured for input */ -+ if (!(superio_inb(W83687THF_VID_CFG) & (1 << 4))) { -+ dev_dbg(&client->dev, "VID configured as output, " -+ "no VID function\n"); -+ goto exit; -+ } -+ -+ res = superio_inb(W83687THF_VID_DATA) & 0x3f; -+ -+exit: -+ superio_exit(); -+ return res; -+} -+ - static int w83627hf_write_value(struct i2c_client *client, u16 reg, u16 value) - { - struct w83627hf_data *data = i2c_get_clientdata(client); - int word_sized; - -- down(&data->lock); -+ mutex_lock(&data->lock); - word_sized = (((reg & 0xff00) == 0x100) - || ((reg & 0xff00) == 0x200)) - && (((reg & 0x00ff) == 0x53) -@@ -1277,7 +1407,7 @@ - client->addr + W83781D_ADDR_REG_OFFSET); - outb_p(0, client->addr + W83781D_DATA_REG_OFFSET); - } -- up(&data->lock); -+ mutex_unlock(&data->lock); - return 0; - } - -@@ -1324,10 +1454,13 @@ - data->vid = (lo & 0x0f) | ((hi & 0x01) << 4); - } else if (w83627thf == data->type) { - data->vid = w83627thf_read_gpio5(client); -+ } else if (w83687thf == data->type) { -+ data->vid = w83687thf_read_vid(client); - } - - /* Read VRM & OVT Config only once */ -- if (w83627thf == data->type || w83637hf == data->type) { -+ if (w83627thf == data->type || w83637hf == data->type -+ || w83687thf == data->type) { - data->vrm_ovt = - w83627hf_read_value(client, W83627THF_REG_VRM_OVT_CFG); - } -@@ -1387,14 +1520,14 @@ - struct w83627hf_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { - for (i = 0; i <= 8; i++) { - /* skip missing sensors */ - if (((data->type == w83697hf) && (i == 1)) || -- ((data->type == w83627thf || data->type == w83637hf) -+ ((data->type != w83627hf && data->type != w83697hf) - && (i == 5 || i == 6))) - continue; - data->in[i] = -@@ -1470,7 +1603,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/w83781d.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/w83781d.c 2006-03-22 17:06:16.000000000 +0100 -@@ -42,6 +42,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-vid.h> - #include <linux/err.h> -+#include <linux/mutex.h> - #include <asm/io.h> - #include "lm75.h" - -@@ -56,6 +57,10 @@ - I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: " - "{bus, clientaddr, subclientaddr1, subclientaddr2}"); - -+static int reset; -+module_param(reset, bool, 0); -+MODULE_PARM_DESC(reset, "Set to one to reset chip on load"); -+ - static int init = 1; - module_param(init, bool, 0); - MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization"); -@@ -226,10 +231,10 @@ - struct w83781d_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore lock; -+ struct mutex lock; - enum chips type; - -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* !=0 if following fields are valid */ - unsigned long last_updated; /* In jiffies */ - -@@ -262,14 +267,12 @@ - u8 vrm; - }; - --static int w83781d_attach_adapter(struct i2c_adapter *adapter); - static int w83781d_isa_attach_adapter(struct i2c_adapter *adapter); - static int w83781d_detect(struct i2c_adapter *adapter, int address, int kind); - static int w83781d_detach_client(struct i2c_client *client); - --static int w83781d_read_value(struct i2c_client *client, u16 register); --static int w83781d_write_value(struct i2c_client *client, u16 register, -- u16 value); -+static int w83781d_read_value(struct i2c_client *client, u16 reg); -+static int w83781d_write_value(struct i2c_client *client, u16 reg, u16 value); - static struct w83781d_data *w83781d_update_device(struct device *dev); - static void w83781d_init_client(struct i2c_client *client); - -@@ -278,7 +281,9 @@ - .name = "w83781d", - }, - .id = I2C_DRIVERID_W83781D, -- .attach_adapter = w83781d_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = w83781d_detect, - .detach_client = w83781d_detach_client, - }; - -@@ -311,11 +316,11 @@ - \ - val = simple_strtoul(buf, NULL, 10) / 10; \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - data->in_##reg[nr] = IN_TO_REG(val); \ - w83781d_write_value(client, W83781D_REG_IN_##REG(nr), data->in_##reg[nr]); \ - \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - store_in_reg(MIN, min); -@@ -381,13 +386,13 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->fan_min[nr - 1] = - FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1])); - w83781d_write_value(client, W83781D_REG_FAN_MIN(nr), - data->fan_min[nr - 1]); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -446,7 +451,7 @@ - \ - val = simple_strtol(buf, NULL, 10); \ - \ -- down(&data->update_lock); \ -+ mutex_lock(&data->update_lock); \ - \ - if (nr >= 2) { /* TEMP2 and TEMP3 */ \ - data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \ -@@ -458,7 +463,7 @@ - data->temp_##reg); \ - } \ - \ -- up(&data->update_lock); \ -+ mutex_unlock(&data->update_lock); \ - return count; \ - } - store_temp_reg(OVER, max); -@@ -571,7 +576,7 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (update_mask == BEEP_MASK) { /* We are storing beep_mask */ - data->beep_mask = BEEP_MASK_TO_REG(val, data->type); -@@ -592,7 +597,7 @@ - w83781d_write_value(client, W83781D_REG_BEEP_INTS2, - val2 | data->beep_enable << 7); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -637,7 +642,7 @@ - u8 reg; - unsigned long val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - /* Save fan_min */ - min = FAN_FROM_REG(data->fan_min[nr], -@@ -662,7 +667,7 @@ - data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); - w83781d_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]); - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -709,10 +714,10 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - data->pwm[nr - 1] = PWM_TO_REG(val); - w83781d_write_value(client, W83781D_REG_PWM(nr), data->pwm[nr - 1]); -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -725,7 +730,7 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - switch (val) { - case 0: -@@ -742,11 +747,11 @@ - break; - - default: -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return -EINVAL; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -808,7 +813,7 @@ - - val = simple_strtoul(buf, NULL, 10); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - switch (val) { - case 1: /* PII/Celeron diode */ -@@ -841,7 +846,7 @@ - break; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - return count; - } - -@@ -865,18 +870,6 @@ - device_create_file(&client->dev, &dev_attr_temp##offset##_type); \ - } while (0) - --/* This function is called when: -- * w83781d_driver is inserted (when this module is loaded), for each -- available adapter -- * when a new adapter is inserted (and w83781d_driver is still present) */ --static int --w83781d_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, w83781d_detect); --} -- - static int - w83781d_isa_attach_adapter(struct i2c_adapter *adapter) - { -@@ -1073,7 +1066,7 @@ - new_client = &data->client; - i2c_set_clientdata(new_client, data); - new_client->addr = address; -- init_MUTEX(&data->lock); -+ mutex_init(&data->lock); - new_client->adapter = adapter; - new_client->driver = is_isa ? &w83781d_isa_driver : &w83781d_driver; - new_client->flags = 0; -@@ -1178,7 +1171,7 @@ - data->type = kind; - - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Tell the I2C layer a new client has arrived */ - if ((err = i2c_attach_client(new_client))) -@@ -1325,7 +1318,7 @@ - int res, word_sized, bank; - struct i2c_client *cl; - -- down(&data->lock); -+ mutex_lock(&data->lock); - if (i2c_is_isa_client(client)) { - word_sized = (((reg & 0xff00) == 0x100) - || ((reg & 0xff00) == 0x200)) -@@ -1383,7 +1376,7 @@ - if (bank > 2) - i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0); - } -- up(&data->lock); -+ mutex_unlock(&data->lock); - return res; - } - -@@ -1394,7 +1387,7 @@ - int word_sized, bank; - struct i2c_client *cl; - -- down(&data->lock); -+ mutex_lock(&data->lock); - if (i2c_is_isa_client(client)) { - word_sized = (((reg & 0xff00) == 0x100) - || ((reg & 0xff00) == 0x200)) -@@ -1447,7 +1440,7 @@ - if (bank > 2) - i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0); - } -- up(&data->lock); -+ mutex_unlock(&data->lock); - return 0; - } - -@@ -1459,8 +1452,17 @@ - int type = data->type; - u8 tmp; - -- if (init && type != as99127f) { /* this resets registers we don't have -+ if (reset && type != as99127f) { /* this resets registers we don't have - documentation for on the as99127f */ -+ /* Resetting the chip has been the default for a long time, -+ but it causes the BIOS initializations (fan clock dividers, -+ thermal sensor types...) to be lost, so it is now optional. -+ It might even go away if nobody reports it as being useful, -+ as I see very little reason why this would be needed at -+ all. */ -+ dev_info(&client->dev, "If reset=1 solved a problem you were " -+ "having, please report!\n"); -+ - /* save these registers */ - i = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG); - p = w83781d_read_value(client, W83781D_REG_PWMCLK12); -@@ -1477,6 +1479,13 @@ - w83781d_write_value(client, W83781D_REG_BEEP_INTS2, 0); - } - -+ /* Disable power-on abnormal beep, as advised by the datasheet. -+ Already done if reset=1. */ -+ if (init && !reset && type != as99127f) { -+ i = w83781d_read_value(client, W83781D_REG_BEEP_CONFIG); -+ w83781d_write_value(client, W83781D_REG_BEEP_CONFIG, i | 0x80); -+ } -+ - data->vrm = vid_which_vrm(); - - if ((type != w83781d) && (type != as99127f)) { -@@ -1533,7 +1542,7 @@ - struct w83781d_data *data = i2c_get_clientdata(client); - int i; - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { -@@ -1641,7 +1650,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/drivers/hwmon/w83l785ts.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/w83l785ts.c 2006-03-22 17:06:16.000000000 +0100 -@@ -39,6 +39,7 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-sysfs.h> - #include <linux/err.h> -+#include <linux/mutex.h> - - /* How many retries on register read error */ - #define MAX_RETRIES 5 -@@ -80,7 +81,6 @@ - * Functions declaration - */ - --static int w83l785ts_attach_adapter(struct i2c_adapter *adapter); - static int w83l785ts_detect(struct i2c_adapter *adapter, int address, - int kind); - static int w83l785ts_detach_client(struct i2c_client *client); -@@ -96,7 +96,9 @@ - .name = "w83l785ts", - }, - .id = I2C_DRIVERID_W83L785TS, -- .attach_adapter = w83l785ts_attach_adapter, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = w83l785ts_detect, - .detach_client = w83l785ts_detach_client, - }; - -@@ -107,7 +109,7 @@ - struct w83l785ts_data { - struct i2c_client client; - struct class_device *class_dev; -- struct semaphore update_lock; -+ struct mutex update_lock; - char valid; /* zero until following fields are valid */ - unsigned long last_updated; /* in jiffies */ - -@@ -135,13 +137,6 @@ - * Real code - */ - --static int w83l785ts_attach_adapter(struct i2c_adapter *adapter) --{ -- if (!(adapter->class & I2C_CLASS_HWMON)) -- return 0; -- return i2c_probe(adapter, &addr_data, w83l785ts_detect); --} -- - /* - * The following function does more than just detection. If detection - * succeeds, it also registers the new chip. -@@ -221,7 +216,7 @@ - /* We can fill in the remaining client fields. */ - strlcpy(new_client->name, "w83l785ts", I2C_NAME_SIZE); - data->valid = 0; -- init_MUTEX(&data->update_lock); -+ mutex_init(&data->update_lock); - - /* Default values in case the first read fails (unlikely). */ - data->temp[1] = data->temp[0] = 0; -@@ -299,7 +294,7 @@ - struct i2c_client *client = to_i2c_client(dev); - struct w83l785ts_data *data = i2c_get_clientdata(client); - -- down(&data->update_lock); -+ mutex_lock(&data->update_lock); - - if (!data->valid || time_after(jiffies, data->last_updated + HZ * 2)) { - dev_dbg(&client->dev, "Updating w83l785ts data.\n"); -@@ -312,7 +307,7 @@ - data->valid = 1; - } - -- up(&data->update_lock); -+ mutex_unlock(&data->update_lock); - - return data; - } ---- linux-2.6.16.orig/Documentation/hwmon/w83627hf 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/Documentation/hwmon/w83627hf 2006-03-22 17:06:15.000000000 +0100 -@@ -18,6 +18,10 @@ - Prefix: 'w83637hf' - Addresses scanned: ISA address retrieved from Super I/O registers - Datasheet: http://www.winbond.com/PDF/sheet/w83637hf.pdf -+ * Winbond W83687THF -+ Prefix: 'w83687thf' -+ Addresses scanned: ISA address retrieved from Super I/O registers -+ Datasheet: Provided by Winbond on request - - Authors: - Frodo Looijaard <frodol@dds.nl>, ---- linux-2.6.16.orig/drivers/hwmon/Kconfig 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/Kconfig 2006-03-22 17:06:16.000000000 +0100 -@@ -236,11 +236,11 @@ - will be called lm80. - - config SENSORS_LM83 -- tristate "National Semiconductor LM83" -+ tristate "National Semiconductor LM83 and compatibles" - depends on HWMON && I2C - help - If you say yes here you get support for National Semiconductor -- LM83 sensor chips. -+ LM82 and LM83 sensor chips. - - This driver can also be built as a module. If so, the module - will be called lm83. -@@ -333,11 +333,32 @@ - help - If you say yes here you get support for the integrated fan - monitoring and control capabilities of the SMSC LPC47B27x, -- LPC47M10x, LPC47M13x, LPC47M14x, LPC47M15x and LPC47M192 chips. -+ LPC47M10x, LPC47M13x, LPC47M14x, LPC47M15x, LPC47M192 and -+ LPC47M997 chips. -+ -+ The temperature and voltage sensor features of the LPC47M192 -+ and LPC47M997 are supported by another driver, select also -+ "SMSC LPC47M192 and compatibles" below for those. - - This driver can also be built as a module. If so, the module - will be called smsc47m1. - -+config SENSORS_SMSC47M192 -+ tristate "SMSC LPC47M192 and compatibles" -+ depends on HWMON && I2C && EXPERIMENTAL -+ select HWMON_VID -+ help -+ If you say yes here you get support for the temperature and -+ voltage sensors of the SMSC LPC47M192 and LPC47M997 chips. -+ -+ The fan monitoring and control capabilities of these chips -+ are supported by another driver, select -+ "SMSC LPC47M10x and compatibles" above. You need both drivers -+ if you want fan control and voltage/temperature sensor support. -+ -+ This driver can also be built as a module. If so, the module -+ will be called smsc47m192. -+ - config SENSORS_SMSC47B397 - tristate "SMSC LPC47B397-NC" - depends on HWMON && I2C && EXPERIMENTAL -@@ -406,13 +427,14 @@ - will be called w83l785ts. - - config SENSORS_W83627HF -- tristate "Winbond W83627HF, W83627THF, W83637HF, W83697HF" -- depends on HWMON && I2C && EXPERIMENTAL -+ tristate "Winbond W83627HF, W83627THF, W83637HF, W83687THF, W83697HF" -+ depends on HWMON && I2C - select I2C_ISA - select HWMON_VID - help - If you say yes here you get support for the Winbond W836X7 series -- of sensor chips: the W83627HF, W83627THF, W83637HF, and the W83697HF -+ of sensor chips: the W83627HF, W83627THF, W83637HF, W83687THF and -+ W83697HF. - - This driver can also be built as a module. If so, the module - will be called w83627hf. ---- linux-2.6.16.orig/drivers/hwmon/hwmon-vid.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/hwmon-vid.c 2006-03-22 17:06:15.000000000 +0100 -@@ -54,6 +54,10 @@ - (IMVP-II). You can find more information in the datasheet of Max1718 - http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2452 - -+ The 13 specification corresponds to the Intel Pentium M series. There -+ doesn't seem to be any named specification for these. The conversion -+ tables are detailed directly in the various Pentium M datasheets: -+ http://www.intel.com/design/intarch/pentiumm/docs_pentiumm.htm - */ - - /* vrm is the VRM/VRD document version multiplied by 10. -@@ -100,6 +104,8 @@ - case 17: /* Intel IMVP-II */ - return(val & 0x10 ? 975 - (val & 0xF) * 25 : - 1750 - val * 50); -+ case 13: -+ return(1708 - (val & 0x3f) * 16); - default: /* report 0 for unknown */ - printk(KERN_INFO "hwmon-vid: requested unknown VRM version\n"); - return 0; -@@ -129,8 +135,9 @@ - static struct vrm_model vrm_models[] = { - {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */ - {X86_VENDOR_AMD, 0xF, ANY, ANY, 24}, /* Athlon 64, Opteron and above VRM 24 */ -- {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 85}, /* 0.13um too */ -+ {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13}, /* Pentium M (130 nm) */ - {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */ -+ {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13}, /* Pentium M (90 nm) */ - {X86_VENDOR_INTEL, 0x6, ANY, ANY, 82}, /* any P6 */ - {X86_VENDOR_INTEL, 0x7, ANY, ANY, 0}, /* Itanium */ - {X86_VENDOR_INTEL, 0xF, 0x0, ANY, 90}, /* P4 */ ---- linux-2.6.16.orig/Documentation/hwmon/w83781d 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/Documentation/hwmon/w83781d 2006-03-22 17:06:15.000000000 +0100 -@@ -36,6 +36,11 @@ - Use 'init=0' to bypass initializing the chip. - Try this if your computer crashes when you load the module. - -+* reset int -+ (default 0) -+ The driver used to reset the chip on load, but does no more. Use -+ 'reset=1' to restore the old behavior. Report if you need to do this. -+ - force_subclients=bus,caddr,saddr,saddr - This is used to force the i2c addresses for subclients of - a certain chip. Typical usage is `force_subclients=0,0x2d,0x4a,0x4b' -@@ -123,6 +128,25 @@ - your computer speaker. It is possible to enable all beeping globally, - or only the beeping for some alarms. - -+Individual alarm and beep bits: -+ -+0x000001: in0 -+0x000002: in1 -+0x000004: in2 -+0x000008: in3 -+0x000010: temp1 -+0x000020: temp2 (+temp3 on W83781D) -+0x000040: fan1 -+0x000080: fan2 -+0x000100: in4 -+0x000200: in5 -+0x000400: in6 -+0x000800: fan3 -+0x001000: chassis -+0x002000: temp3 (W83782D and W83627HF only) -+0x010000: in7 (W83782D and W83627HF only) -+0x020000: in8 (W83782D and W83627HF only) -+ - If an alarm triggers, it will remain triggered until the hardware register - is read at least once. This means that the cause for the alarm may - already have disappeared! Note that in the current implementation, all ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-frodo.c 2006-03-22 17:06:09.000000000 +0100 -+++ /dev/null 1970-01-01 00:00:00.000000000 +0000 -@@ -1,85 +0,0 @@ -- --/* -- * linux/drivers/i2c/i2c-frodo.c -- * -- * Author: Abraham van der Merwe <abraham@2d3d.co.za> -- * -- * An I2C adapter driver for the 2d3D, Inc. StrongARM SA-1110 -- * Development board (Frodo). -- * -- * This source code is free software; you can redistribute it and/or -- * modify it under the terms of the GNU General Public License -- * version 2 as published by the Free Software Foundation. -- */ -- --#include <linux/module.h> --#include <linux/kernel.h> --#include <linux/init.h> --#include <linux/delay.h> --#include <linux/i2c.h> --#include <linux/i2c-algo-bit.h> --#include <asm/hardware.h> -- -- --static void frodo_setsda (void *data,int state) --{ -- if (state) -- FRODO_CPLD_I2C |= FRODO_I2C_SDA_OUT; -- else -- FRODO_CPLD_I2C &= ~FRODO_I2C_SDA_OUT; --} -- --static void frodo_setscl (void *data,int state) --{ -- if (state) -- FRODO_CPLD_I2C |= FRODO_I2C_SCL_OUT; -- else -- FRODO_CPLD_I2C &= ~FRODO_I2C_SCL_OUT; --} -- --static int frodo_getsda (void *data) --{ -- return ((FRODO_CPLD_I2C & FRODO_I2C_SDA_IN) != 0); --} -- --static int frodo_getscl (void *data) --{ -- return ((FRODO_CPLD_I2C & FRODO_I2C_SCL_IN) != 0); --} -- --static struct i2c_algo_bit_data bit_frodo_data = { -- .setsda = frodo_setsda, -- .setscl = frodo_setscl, -- .getsda = frodo_getsda, -- .getscl = frodo_getscl, -- .udelay = 80, -- .mdelay = 80, -- .timeout = HZ --}; -- --static struct i2c_adapter frodo_ops = { -- .owner = THIS_MODULE, -- .id = I2C_HW_B_FRODO, -- .algo_data = &bit_frodo_data, -- .dev = { -- .name = "Frodo adapter driver", -- }, --}; -- --static int __init i2c_frodo_init (void) --{ -- return i2c_bit_add_bus(&frodo_ops); --} -- --static void __exit i2c_frodo_exit (void) --{ -- i2c_bit_del_bus(&frodo_ops); --} -- --MODULE_AUTHOR ("Abraham van der Merwe <abraham@2d3d.co.za>"); --MODULE_DESCRIPTION ("I2C-Bus adapter routines for Frodo"); --MODULE_LICENSE ("GPL"); -- --module_init (i2c_frodo_init); --module_exit (i2c_frodo_exit); -- ---- linux-2.6.16.orig/include/linux/i2c-id.h 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/include/linux/i2c-id.h 2006-03-22 17:06:15.000000000 +0100 -@@ -172,7 +172,6 @@ - #define I2C_HW_B_RIVA 0x010010 /* Riva based graphics cards */ - #define I2C_HW_B_IOC 0x010011 /* IOC bit-wiggling */ - #define I2C_HW_B_TSUNA 0x010012 /* DEC Tsunami chipset */ --#define I2C_HW_B_FRODO 0x010013 /* 2d3D SA-1110 Development Board */ - #define I2C_HW_B_OMAHA 0x010014 /* Omaha I2C interface (ARM) */ - #define I2C_HW_B_GUIDE 0x010015 /* Guide bit-basher */ - #define I2C_HW_B_IXP2000 0x010016 /* GPIO on IXP2000 systems */ ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-ite.c 2006-03-22 17:06:09.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-ite.c 2006-03-22 17:06:15.000000000 +0100 -@@ -200,9 +200,7 @@ - .owner = THIS_MODULE, - .id = I2C_HW_I_IIC, - .algo_data = &iic_ite_data, -- .dev = { -- .name = "ITE IIC adapter", -- }, -+ .name = "ITE IIC adapter", - }; - - /* Called when the module is loaded. This function starts the ---- linux-2.6.16.orig/drivers/i2c/chips/isp1301_omap.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/chips/isp1301_omap.c 2006-03-22 17:06:15.000000000 +0100 -@@ -1635,8 +1635,6 @@ - .driver = { - .name = "isp1301_omap", - }, -- .id = 1301, /* FIXME "official", i2c-ids.h */ -- .class = I2C_CLASS_HWMON, - .attach_adapter = isp1301_scan_bus, - .detach_client = isp1301_detach_client, - }; ---- linux-2.6.16.orig/Documentation/i2c/busses/i2c-piix4 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/Documentation/i2c/busses/i2c-piix4 2006-03-22 17:06:16.000000000 +0100 -@@ -4,8 +4,10 @@ - * Intel 82371AB PIIX4 and PIIX4E - * Intel 82443MX (440MX) - Datasheet: Publicly available at the Intel website -- * ServerWorks OSB4, CSB5 and CSB6 southbridges -+ * ServerWorks OSB4, CSB5, CSB6 and HT-1000 southbridges - Datasheet: Only available via NDA from ServerWorks -+ * ATI IXP southbridges IXP200, IXP300, IXP400 -+ Datasheet: Not publicly available - * Standard Microsystems (SMSC) SLC90E66 (Victory66) southbridge - Datasheet: Publicly available at the SMSC website http://www.smsc.com - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-piix4.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-piix4.c 2006-03-22 17:06:16.000000000 +0100 -@@ -22,7 +22,7 @@ - /* - Supports: - Intel PIIX4, 440MX -- Serverworks OSB4, CSB5, CSB6 -+ Serverworks OSB4, CSB5, CSB6, HT-1000 - SMSC Victory66 - - Note: we assume there can only be one device, with one SMBus interface. -@@ -406,19 +406,27 @@ - - static struct i2c_adapter piix4_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - - static struct pci_device_id piix4_ids[] = { - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3), - .driver_data = 3 }, -+ { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP200_SMBUS), -+ .driver_data = 0 }, -+ { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP300_SMBUS), -+ .driver_data = 0 }, -+ { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS), -+ .driver_data = 0 }, - { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4), - .driver_data = 0 }, - { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5), - .driver_data = 0 }, - { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB6), - .driver_data = 0 }, -+ { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000SB), -+ .driver_data = 0 }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3), - .driver_data = 3 }, - { PCI_DEVICE(PCI_VENDOR_ID_EFAR, PCI_DEVICE_ID_EFAR_SLC90E66_3), ---- linux-2.6.16.orig/include/linux/pci_ids.h 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/include/linux/pci_ids.h 2006-03-22 17:06:16.000000000 +0100 -@@ -351,8 +351,11 @@ - #define PCI_DEVICE_ID_ATI_RS480 0x5950 - /* ATI IXP Chipset */ - #define PCI_DEVICE_ID_ATI_IXP200_IDE 0x4349 -+#define PCI_DEVICE_ID_ATI_IXP200_SMBUS 0x4353 -+#define PCI_DEVICE_ID_ATI_IXP300_SMBUS 0x4363 - #define PCI_DEVICE_ID_ATI_IXP300_IDE 0x4369 - #define PCI_DEVICE_ID_ATI_IXP300_SATA 0x436e -+#define PCI_DEVICE_ID_ATI_IXP400_SMBUS 0x4372 - #define PCI_DEVICE_ID_ATI_IXP400_IDE 0x4376 - #define PCI_DEVICE_ID_ATI_IXP400_SATA 0x4379 - -@@ -1369,6 +1372,7 @@ - #define PCI_DEVICE_ID_SERVERWORKS_OSB4 0x0200 - #define PCI_DEVICE_ID_SERVERWORKS_CSB5 0x0201 - #define PCI_DEVICE_ID_SERVERWORKS_CSB6 0x0203 -+#define PCI_DEVICE_ID_SERVERWORKS_HT1000SB 0x0205 - #define PCI_DEVICE_ID_SERVERWORKS_OSB4IDE 0x0211 - #define PCI_DEVICE_ID_SERVERWORKS_CSB5IDE 0x0212 - #define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE 0x0213 ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-ixp4xx.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-ixp4xx.c 2006-03-22 17:06:16.000000000 +0100 -@@ -125,7 +125,9 @@ - drv_data->algo_data.mdelay = 10; - drv_data->algo_data.timeout = 100; - -+ drv_data->adapter.owner = THIS_MODULE; - drv_data->adapter.id = I2C_HW_B_IXP4XX; -+ drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_DATA; - strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name, - I2C_NAME_SIZE); - drv_data->adapter.algo_data = &drv_data->algo_data; ---- linux-2.6.16.orig/drivers/media/video/adv7170.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/adv7170.c 2006-03-22 17:06:15.000000000 +0100 -@@ -53,7 +53,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(x) (x)->name - -@@ -125,24 +124,21 @@ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - /* do raw I2C, not smbus compatible */ - struct adv7170 *encoder = i2c_get_clientdata(client); -- struct i2c_msg msg; - u8 block_data[32]; -+ int block_len; - -- msg.addr = client->addr; -- msg.flags = 0; - while (len >= 2) { -- msg.buf = (char *) block_data; -- msg.len = 0; -- block_data[msg.len++] = reg = data[0]; -+ block_len = 0; -+ block_data[block_len++] = reg = data[0]; - do { -- block_data[msg.len++] = -+ block_data[block_len++] = - encoder->reg[reg++] = data[1]; - len -= 2; - data += 2; - } while (len >= 2 && data[0] == reg && -- msg.len < 32); -- if ((ret = i2c_transfer(client->adapter, -- &msg, 1)) < 0) -+ block_len < 32); -+ if ((ret = i2c_master_send(client, block_data, -+ block_len)) < 0) - break; - } - } else { ---- linux-2.6.16.orig/drivers/media/video/adv7175.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/adv7175.c 2006-03-22 17:06:16.000000000 +0100 -@@ -49,7 +49,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(s) (s)->name - -@@ -68,8 +67,6 @@ - /* ----------------------------------------------------------------------- */ - - struct adv7175 { -- unsigned char reg[128]; -- - int norm; - int input; - int enable; -@@ -95,9 +92,6 @@ - u8 reg, - u8 value) - { -- struct adv7175 *encoder = i2c_get_clientdata(client); -- -- encoder->reg[reg] = value; - return i2c_smbus_write_byte_data(client, reg, value); - } - -@@ -120,25 +114,21 @@ - * the adapter understands raw I2C */ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - /* do raw I2C, not smbus compatible */ -- struct adv7175 *encoder = i2c_get_clientdata(client); -- struct i2c_msg msg; - u8 block_data[32]; -+ int block_len; - -- msg.addr = client->addr; -- msg.flags = 0; - while (len >= 2) { -- msg.buf = (char *) block_data; -- msg.len = 0; -- block_data[msg.len++] = reg = data[0]; -+ block_len = 0; -+ block_data[block_len++] = reg = data[0]; - do { -- block_data[msg.len++] = -- encoder->reg[reg++] = data[1]; -+ block_data[block_len++] = data[1]; -+ reg++; - len -= 2; - data += 2; - } while (len >= 2 && data[0] == reg && -- msg.len < 32); -- if ((ret = i2c_transfer(client->adapter, -- &msg, 1)) < 0) -+ block_len < 32); -+ if ((ret = i2c_master_send(client, block_data, -+ block_len)) < 0) - break; - } - } else { -@@ -171,24 +161,6 @@ - adv7175_write(client, 0x05, 0x25); - } - --#ifdef ENCODER_DUMP --static void --dump (struct i2c_client *client) --{ -- struct adv7175 *encoder = i2c_get_clientdata(client); -- int i, j; -- -- printk(KERN_INFO "%s: registry dump\n", I2C_NAME(client)); -- for (i = 0; i < 182 / 8; i++) { -- printk("%s: 0x%02x -", I2C_NAME(client), i * 8); -- for (j = 0; j < 8; j++) { -- printk(" 0x%02x", encoder->reg[i * 8 + j]); -- } -- printk("\n"); -- } --} --#endif -- - /* ----------------------------------------------------------------------- */ - // Output filter: S-Video Composite - -@@ -407,14 +379,6 @@ - } - break; - --#ifdef ENCODER_DUMP -- case ENCODER_DUMP: -- { -- dump(client); -- } -- break; --#endif -- - default: - return -EINVAL; - } -@@ -424,24 +388,6 @@ - - /* ----------------------------------------------------------------------- */ - --/* -- * Generic i2c probe -- * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1' -- */ --static unsigned short normal_i2c[] = -- { I2C_ADV7175 >> 1, (I2C_ADV7175 >> 1) + 1, -- I2C_ADV7176 >> 1, (I2C_ADV7176 >> 1) + 1, -- I2C_CLIENT_END --}; -- --static unsigned short ignore = I2C_CLIENT_END; -- --static struct i2c_client_address_data addr_data = { -- .normal_i2c = normal_i2c, -- .probe = &ignore, -- .ignore = &ignore, --}; -- - static struct i2c_driver i2c_driver_adv7175; - - static int -@@ -516,16 +462,6 @@ - } - - static int --adv7175_attach_adapter (struct i2c_adapter *adapter) --{ -- dprintk(1, -- KERN_INFO -- "adv7175.c: starting probe for adapter %s (0x%x)\n", -- I2C_NAME(adapter), adapter->id); -- return i2c_probe(adapter, &addr_data, &adv7175_detect_client); --} -- --static int - adv7175_detach_client (struct i2c_client *client) - { - struct adv7175 *encoder = i2c_get_clientdata(client); -@@ -551,7 +487,7 @@ - - .id = I2C_DRIVERID_ADV7175, - -- .attach_adapter = adv7175_attach_adapter, -+ .detect_client = adv7175_detect_client, - .detach_client = adv7175_detach_client, - .command = adv7175_command, - }; ---- linux-2.6.16.orig/drivers/media/video/bt819.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/bt819.c 2006-03-22 17:06:15.000000000 +0100 -@@ -53,7 +53,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(s) (s)->name - -@@ -141,24 +140,21 @@ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - /* do raw I2C, not smbus compatible */ - struct bt819 *decoder = i2c_get_clientdata(client); -- struct i2c_msg msg; - u8 block_data[32]; -+ int block_len; - -- msg.addr = client->addr; -- msg.flags = 0; - while (len >= 2) { -- msg.buf = (char *) block_data; -- msg.len = 0; -- block_data[msg.len++] = reg = data[0]; -+ block_len = 0; -+ block_data[block_len++] = reg = data[0]; - do { -- block_data[msg.len++] = -+ block_data[block_len++] = - decoder->reg[reg++] = data[1]; - len -= 2; - data += 2; - } while (len >= 2 && data[0] == reg && -- msg.len < 32); -- if ((ret = i2c_transfer(client->adapter, -- &msg, 1)) < 0) -+ block_len < 32); -+ if ((ret = i2c_master_send(client, block_data, -+ block_len)) < 0) - break; - } - } else { ---- linux-2.6.16.orig/drivers/media/video/bt856.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/bt856.c 2006-03-22 17:06:15.000000000 +0100 -@@ -53,7 +53,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(s) (s)->name - -@@ -71,17 +70,14 @@ - - /* ----------------------------------------------------------------------- */ - --#define REG_OFFSET 0xCE -+#define REG_OFFSET 0xDA -+#define BT856_NR_REG 6 - - struct bt856 { -- unsigned char reg[32]; -+ unsigned char reg[BT856_NR_REG]; - - int norm; - int enable; -- int bright; -- int contrast; -- int hue; -- int sat; - }; - - #define I2C_BT856 0x88 -@@ -120,8 +116,8 @@ - struct bt856 *encoder = i2c_get_clientdata(client); - - printk(KERN_INFO "%s: register dump:", I2C_NAME(client)); -- for (i = 0xd6; i <= 0xde; i += 2) -- printk(" %02x", encoder->reg[i - REG_OFFSET]); -+ for (i = 0; i < BT856_NR_REG; i += 2) -+ printk(" %02x", encoder->reg[i]); - printk("\n"); - } - ---- linux-2.6.16.orig/drivers/media/video/saa7110.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/saa7110.c 2006-03-22 17:06:16.000000000 +0100 -@@ -39,7 +39,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(s) (s)->name - -@@ -59,8 +58,6 @@ - #define SAA7110_MAX_INPUT 9 /* 6 CVBS, 3 SVHS */ - #define SAA7110_MAX_OUTPUT 0 /* its a decoder only */ - --#define I2C_SAA7110 0x9C /* or 0x9E */ -- - #define SAA7110_NR_REG 0x35 - - struct saa7110 { -@@ -108,13 +105,8 @@ - * the adapter understands raw I2C */ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - struct saa7110 *decoder = i2c_get_clientdata(client); -- struct i2c_msg msg; - -- msg.len = len; -- msg.buf = (char *) data; -- msg.addr = client->addr; -- msg.flags = 0; -- ret = i2c_transfer(client->adapter, &msg, 1); -+ ret = i2c_master_send(client, data, len); - - /* Cache the written data */ - memcpy(decoder->reg + reg, data + 1, len - 1); -@@ -432,15 +424,13 @@ - break; - - case DECODER_DUMP: -- for (v = 0; v < 0x34; v += 16) { -+ for (v = 0; v < SAA7110_NR_REG; v += 16) { - int j; -- dprintk(1, KERN_INFO "%s: %03x\n", I2C_NAME(client), -+ dprintk(1, KERN_DEBUG "%s: %02x:", I2C_NAME(client), - v); -- for (j = 0; j < 16; j++) { -- dprintk(1, KERN_INFO " %02x", -- decoder->reg[v + j]); -- } -- dprintk(1, KERN_INFO "\n"); -+ for (j = 0; j < 16 && v + j < SAA7110_NR_REG; j++) -+ dprintk(1, " %02x", decoder->reg[v + j]); -+ dprintk(1, "\n"); - } - break; - -@@ -454,24 +444,6 @@ - - /* ----------------------------------------------------------------------- */ - --/* -- * Generic i2c probe -- * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1' -- */ --static unsigned short normal_i2c[] = { -- I2C_SAA7110 >> 1, -- (I2C_SAA7110 >> 1) + 1, -- I2C_CLIENT_END --}; -- --static unsigned short ignore = I2C_CLIENT_END; -- --static struct i2c_client_address_data addr_data = { -- .normal_i2c = normal_i2c, -- .probe = &ignore, -- .ignore = &ignore, --}; -- - static struct i2c_driver i2c_driver_saa7110; - - static int -@@ -555,16 +527,6 @@ - } - - static int --saa7110_attach_adapter (struct i2c_adapter *adapter) --{ -- dprintk(1, -- KERN_INFO -- "saa7110.c: starting probe for adapter %s (0x%x)\n", -- I2C_NAME(adapter), adapter->id); -- return i2c_probe(adapter, &addr_data, &saa7110_detect_client); --} -- --static int - saa7110_detach_client (struct i2c_client *client) - { - struct saa7110 *decoder = i2c_get_clientdata(client); -@@ -590,7 +552,7 @@ - - .id = I2C_DRIVERID_SAA7110, - -- .attach_adapter = saa7110_attach_adapter, -+ .detect_client = saa7110_detect_client, - .detach_client = saa7110_detach_client, - .command = saa7110_command, - }; ---- linux-2.6.16.orig/drivers/media/video/saa7111.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/saa7111.c 2006-03-22 17:06:15.000000000 +0100 -@@ -52,7 +52,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(s) (s)->name - -@@ -70,8 +69,10 @@ - - /* ----------------------------------------------------------------------- */ - -+#define SAA7111_NR_REG 0x18 -+ - struct saa7111 { -- unsigned char reg[32]; -+ unsigned char reg[SAA7111_NR_REG]; - - int norm; - int input; -@@ -110,24 +111,21 @@ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - /* do raw I2C, not smbus compatible */ - struct saa7111 *decoder = i2c_get_clientdata(client); -- struct i2c_msg msg; - u8 block_data[32]; -+ int block_len; - -- msg.addr = client->addr; -- msg.flags = 0; - while (len >= 2) { -- msg.buf = (char *) block_data; -- msg.len = 0; -- block_data[msg.len++] = reg = data[0]; -+ block_len = 0; -+ block_data[block_len++] = reg = data[0]; - do { -- block_data[msg.len++] = -+ block_data[block_len++] = - decoder->reg[reg++] = data[1]; - len -= 2; - data += 2; - } while (len >= 2 && data[0] == reg && -- msg.len < 32); -- if ((ret = i2c_transfer(client->adapter, -- &msg, 1)) < 0) -+ block_len < 32); -+ if ((ret = i2c_master_send(client, block_data, -+ block_len)) < 0) - break; - } - } else { -@@ -227,11 +225,11 @@ - { - int i; - -- for (i = 0; i < 32; i += 16) { -+ for (i = 0; i < SAA7111_NR_REG; i += 16) { - int j; - - printk(KERN_DEBUG "%s: %03x", I2C_NAME(client), i); -- for (j = 0; j < 16; ++j) { -+ for (j = 0; j < 16 && i + j < SAA7111_NR_REG; ++j) { - printk(" %02x", - saa7111_read(client, i + j)); - } ---- linux-2.6.16.orig/drivers/media/video/saa7114.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/saa7114.c 2006-03-22 17:06:15.000000000 +0100 -@@ -55,7 +55,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(x) (x)->name - -@@ -139,9 +138,6 @@ - u8 reg, - u8 value) - { -- /*struct saa7114 *decoder = i2c_get_clientdata(client);*/ -- -- /*decoder->reg[reg] = value;*/ - return i2c_smbus_write_byte_data(client, reg, value); - } - -@@ -157,25 +153,21 @@ - * the adapter understands raw I2C */ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - /* do raw I2C, not smbus compatible */ -- /*struct saa7114 *decoder = i2c_get_clientdata(client);*/ -- struct i2c_msg msg; - u8 block_data[32]; -+ int block_len; - -- msg.addr = client->addr; -- msg.flags = 0; - while (len >= 2) { -- msg.buf = (char *) block_data; -- msg.len = 0; -- block_data[msg.len++] = reg = data[0]; -+ block_len = 0; -+ block_data[block_len++] = reg = data[0]; - do { -- block_data[msg.len++] = -- /*decoder->reg[reg++] =*/ data[1]; -+ block_data[block_len++] = data[1]; -+ reg++; - len -= 2; - data += 2; - } while (len >= 2 && data[0] == reg && -- msg.len < 32); -- if ((ret = i2c_transfer(client->adapter, -- &msg, 1)) < 0) -+ block_len < 32); -+ if ((ret = i2c_master_send(client, block_data, -+ block_len)) < 0) - break; - } - } else { ---- linux-2.6.16.orig/drivers/media/video/saa711x.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/saa711x.c 2006-03-22 17:06:15.000000000 +0100 -@@ -45,7 +45,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(s) (s)->name - ---- linux-2.6.16.orig/drivers/media/video/saa7185.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/saa7185.c 2006-03-22 17:06:15.000000000 +0100 -@@ -49,7 +49,6 @@ - MODULE_LICENSE("GPL"); - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(s) (s)->name - -@@ -113,24 +112,21 @@ - if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - /* do raw I2C, not smbus compatible */ - struct saa7185 *encoder = i2c_get_clientdata(client); -- struct i2c_msg msg; - u8 block_data[32]; -+ int block_len; - -- msg.addr = client->addr; -- msg.flags = 0; - while (len >= 2) { -- msg.buf = (char *) block_data; -- msg.len = 0; -- block_data[msg.len++] = reg = data[0]; -+ block_len = 0; -+ block_data[block_len++] = reg = data[0]; - do { -- block_data[msg.len++] = -+ block_data[block_len++] = - encoder->reg[reg++] = data[1]; - len -= 2; - data += 2; - } while (len >= 2 && data[0] == reg && -- msg.len < 32); -- if ((ret = i2c_transfer(client->adapter, -- &msg, 1)) < 0) -+ block_len < 32); -+ if ((ret = i2c_master_send(client, block_data, -+ block_len)) < 0) - break; - } - } else { ---- linux-2.6.16.orig/drivers/media/video/vpx3220.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/vpx3220.c 2006-03-22 17:06:15.000000000 +0100 -@@ -30,7 +30,6 @@ - #include <asm/uaccess.h> - - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - - #define I2C_NAME(x) (x)->name - ---- linux-2.6.16.orig/sound/oss/dmasound/dmasound_awacs.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/sound/oss/dmasound/dmasound_awacs.c 2006-03-22 17:06:15.000000000 +0100 -@@ -88,8 +88,6 @@ - #include <linux/pmu.h> - #endif - --#include <linux/i2c-dev.h> -- - #include <asm/uaccess.h> - #include <asm/prom.h> - #include <asm/machdep.h> ---- linux-2.6.16.orig/sound/ppc/daca.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/sound/ppc/daca.c 2006-03-22 17:06:15.000000000 +0100 -@@ -22,7 +22,6 @@ - #include <sound/driver.h> - #include <linux/init.h> - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - #include <linux/kmod.h> - #include <linux/slab.h> - #include <sound/core.h> ---- linux-2.6.16.orig/sound/ppc/keywest.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/sound/ppc/keywest.c 2006-03-22 17:06:15.000000000 +0100 -@@ -23,7 +23,6 @@ - #include <linux/init.h> - #include <linux/i2c.h> - #include <linux/delay.h> --#include <linux/i2c-dev.h> - #include <linux/slab.h> - #include <sound/core.h> - #include "pmac.h" ---- linux-2.6.16.orig/sound/ppc/toonie.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/sound/ppc/toonie.c 2006-03-22 17:06:15.000000000 +0100 -@@ -22,7 +22,6 @@ - #include <linux/init.h> - #include <linux/delay.h> - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - #include <linux/kmod.h> - #include <linux/slab.h> - #include <linux/interrupt.h> ---- linux-2.6.16.orig/sound/ppc/tumbler.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/sound/ppc/tumbler.c 2006-03-22 17:06:15.000000000 +0100 -@@ -28,7 +28,6 @@ - #include <linux/init.h> - #include <linux/delay.h> - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - #include <linux/kmod.h> - #include <linux/slab.h> - #include <linux/interrupt.h> ---- linux-2.6.16.orig/drivers/hwmon/hwmon.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/hwmon.c 2006-03-22 17:06:15.000000000 +0100 -@@ -17,6 +17,7 @@ - #include <linux/idr.h> - #include <linux/hwmon.h> - #include <linux/gfp.h> -+#include <linux/spinlock.h> - - #define HWMON_ID_PREFIX "hwmon" - #define HWMON_ID_FORMAT HWMON_ID_PREFIX "%d" -@@ -24,6 +25,7 @@ - static struct class *hwmon_class; - - static DEFINE_IDR(hwmon_idr); -+static DEFINE_SPINLOCK(idr_lock); - - /** - * hwmon_device_register - register w/ hwmon sysfs class -@@ -37,20 +39,30 @@ - struct class_device *hwmon_device_register(struct device *dev) - { - struct class_device *cdev; -- int id; -+ int id, err; - -- if (idr_pre_get(&hwmon_idr, GFP_KERNEL) == 0) -+again: -+ if (unlikely(idr_pre_get(&hwmon_idr, GFP_KERNEL) == 0)) - return ERR_PTR(-ENOMEM); - -- if (idr_get_new(&hwmon_idr, NULL, &id) < 0) -- return ERR_PTR(-ENOMEM); -+ spin_lock(&idr_lock); -+ err = idr_get_new(&hwmon_idr, NULL, &id); -+ spin_unlock(&idr_lock); -+ -+ if (unlikely(err == -EAGAIN)) -+ goto again; -+ else if (unlikely(err)) -+ return ERR_PTR(err); - - id = id & MAX_ID_MASK; - cdev = class_device_create(hwmon_class, NULL, MKDEV(0,0), dev, - HWMON_ID_FORMAT, id); - -- if (IS_ERR(cdev)) -+ if (IS_ERR(cdev)) { -+ spin_lock(&idr_lock); - idr_remove(&hwmon_idr, id); -+ spin_unlock(&idr_lock); -+ } - - return cdev; - } -@@ -64,9 +76,11 @@ - { - int id; - -- if (sscanf(cdev->class_id, HWMON_ID_FORMAT, &id) == 1) { -+ if (likely(sscanf(cdev->class_id, HWMON_ID_FORMAT, &id) == 1)) { - class_device_unregister(cdev); -+ spin_lock(&idr_lock); - idr_remove(&hwmon_idr, id); -+ spin_unlock(&idr_lock); - } else - dev_dbg(cdev->dev, - "hwmon_device_unregister() failed: bad class ID!\n"); ---- linux-2.6.16.orig/arch/m68k/bvme6000/rtc.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/arch/m68k/bvme6000/rtc.c 2006-03-22 17:06:15.000000000 +0100 -@@ -18,6 +18,7 @@ - #include <linux/module.h> - #include <linux/mc146818rtc.h> /* For struct rtc_time and ioctls, etc */ - #include <linux/smp_lock.h> -+#include <linux/bcd.h> - #include <asm/bvme6000hw.h> - - #include <asm/io.h> -@@ -32,9 +33,6 @@ - * ioctls. - */ - --#define BCD2BIN(val) (((val)&15) + ((val)>>4)*10) --#define BIN2BCD(val) ((((val)/10)<<4) + (val)%10) -- - static unsigned char days_in_mo[] = - {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - ---- linux-2.6.16.orig/drivers/video/matrox/matroxfb_maven.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/video/matrox/matroxfb_maven.c 2006-03-22 17:06:15.000000000 +0100 -@@ -129,7 +129,7 @@ - - struct maven_data { - struct matrox_fb_info* primary_head; -- struct i2c_client* client; -+ struct i2c_client client; - int version; - }; - -@@ -970,7 +970,7 @@ - - static int maven_program_timming(struct maven_data* md, - const struct mavenregs* m) { -- struct i2c_client* c = md->client; -+ struct i2c_client* c = &md->client; - - if (m->mode == MATROXFB_OUTPUT_MODE_MONITOR) { - LR(0x80); -@@ -1007,7 +1007,7 @@ - } - - static inline int maven_resync(struct maven_data* md) { -- struct i2c_client* c = md->client; -+ struct i2c_client* c = &md->client; - maven_set_reg(c, 0x95, 0x20); /* start whole thing */ - return 0; - } -@@ -1065,48 +1065,48 @@ - maven_compute_bwlevel(md, &blacklevel, &whitelevel); - blacklevel = (blacklevel >> 2) | ((blacklevel & 3) << 8); - whitelevel = (whitelevel >> 2) | ((whitelevel & 3) << 8); -- maven_set_reg_pair(md->client, 0x0e, blacklevel); -- maven_set_reg_pair(md->client, 0x1e, whitelevel); -+ maven_set_reg_pair(&md->client, 0x0e, blacklevel); -+ maven_set_reg_pair(&md->client, 0x1e, whitelevel); - } - break; - case V4L2_CID_SATURATION: - { -- maven_set_reg(md->client, 0x20, p->value); -- maven_set_reg(md->client, 0x22, p->value); -+ maven_set_reg(&md->client, 0x20, p->value); -+ maven_set_reg(&md->client, 0x22, p->value); - } - break; - case V4L2_CID_HUE: - { -- maven_set_reg(md->client, 0x25, p->value); -+ maven_set_reg(&md->client, 0x25, p->value); - } - break; - case V4L2_CID_GAMMA: - { - const struct maven_gamma* g; - g = maven_compute_gamma(md); -- maven_set_reg(md->client, 0x83, g->reg83); -- maven_set_reg(md->client, 0x84, g->reg84); -- maven_set_reg(md->client, 0x85, g->reg85); -- maven_set_reg(md->client, 0x86, g->reg86); -- maven_set_reg(md->client, 0x87, g->reg87); -- maven_set_reg(md->client, 0x88, g->reg88); -- maven_set_reg(md->client, 0x89, g->reg89); -- maven_set_reg(md->client, 0x8a, g->reg8a); -- maven_set_reg(md->client, 0x8b, g->reg8b); -+ maven_set_reg(&md->client, 0x83, g->reg83); -+ maven_set_reg(&md->client, 0x84, g->reg84); -+ maven_set_reg(&md->client, 0x85, g->reg85); -+ maven_set_reg(&md->client, 0x86, g->reg86); -+ maven_set_reg(&md->client, 0x87, g->reg87); -+ maven_set_reg(&md->client, 0x88, g->reg88); -+ maven_set_reg(&md->client, 0x89, g->reg89); -+ maven_set_reg(&md->client, 0x8a, g->reg8a); -+ maven_set_reg(&md->client, 0x8b, g->reg8b); - } - break; - case MATROXFB_CID_TESTOUT: - { - unsigned char val -- = maven_get_reg (md->client,0x8d); -+ = maven_get_reg(&md->client,0x8d); - if (p->value) val |= 0x10; - else val &= ~0x10; -- maven_set_reg (md->client, 0x8d, val); -+ maven_set_reg(&md->client, 0x8d, val); - } - break; - case MATROXFB_CID_DEFLICKER: - { -- maven_set_reg(md->client, 0x93, maven_compute_deflicker(md)); -+ maven_set_reg(&md->client, 0x93, maven_compute_deflicker(md)); - } - break; - } -@@ -1185,7 +1185,6 @@ - MINFO_FROM(container_of(clnt->adapter, struct i2c_bit_adapter, adapter)->minfo); - - md->primary_head = MINFO; -- md->client = clnt; - down_write(&ACCESS_FBINFO(altout.lock)); - ACCESS_FBINFO(outputs[1]).output = &maven_altout; - ACCESS_FBINFO(outputs[1]).src = ACCESS_FBINFO(outputs[1]).default_src; -@@ -1243,19 +1242,17 @@ - I2C_FUNC_SMBUS_BYTE_DATA | - I2C_FUNC_PROTOCOL_MANGLING)) - goto ERROR0; -- if (!(new_client = (struct i2c_client*)kmalloc(sizeof(*new_client) + sizeof(*data), -- GFP_KERNEL))) { -+ if (!(data = kzalloc(sizeof(*data), GFP_KERNEL))) { - err = -ENOMEM; - goto ERROR0; - } -- memset(new_client, 0, sizeof(*new_client) + sizeof(*data)); -- data = (struct maven_data*)(new_client + 1); -+ new_client = &data->client; - i2c_set_clientdata(new_client, data); - new_client->addr = address; - new_client->adapter = adapter; - new_client->driver = &maven_driver; - new_client->flags = 0; -- strcpy(new_client->name, "maven client"); -+ strlcpy(new_client->name, "maven", I2C_NAME_SIZE); - if ((err = i2c_attach_client(new_client))) - goto ERROR3; - err = maven_init_client(new_client); -@@ -1279,12 +1276,10 @@ - static int maven_detach_client(struct i2c_client* client) { - int err; - -- if ((err = i2c_detach_client(client))) { -- printk(KERN_ERR "maven: Cannot deregister client\n"); -+ if ((err = i2c_detach_client(client))) - return err; -- } - maven_shutdown_client(client); -- kfree(client); -+ kfree(i2c_get_clientdata(client)); - return 0; - } - -@@ -1297,20 +1292,13 @@ - .detach_client = maven_detach_client, - }; - --/* ************************** */ -- --static int matroxfb_maven_init(void) { -- int err; -- -- err = i2c_add_driver(&maven_driver); -- if (err) { -- printk(KERN_ERR "maven: Maven driver failed to register (%d).\n", err); -- return err; -- } -- return 0; -+static int __init matroxfb_maven_init(void) -+{ -+ return i2c_add_driver(&maven_driver); - } - --static void matroxfb_maven_exit(void) { -+static void __exit matroxfb_maven_exit(void) -+{ - i2c_del_driver(&maven_driver); - } - ---- linux-2.6.16.orig/drivers/macintosh/therm_pm72.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/macintosh/therm_pm72.c 2006-03-22 17:06:15.000000000 +0100 -@@ -104,7 +104,6 @@ - #include <linux/kernel.h> - #include <linux/delay.h> - #include <linux/sched.h> --#include <linux/i2c.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/spinlock.h> -@@ -113,7 +112,6 @@ - #include <linux/reboot.h> - #include <linux/kmod.h> - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - #include <asm/prom.h> - #include <asm/machdep.h> - #include <asm/io.h> ---- linux-2.6.16.orig/drivers/macintosh/windfarm_lm75_sensor.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/macintosh/windfarm_lm75_sensor.c 2006-03-22 17:06:15.000000000 +0100 -@@ -15,7 +15,6 @@ - #include <linux/init.h> - #include <linux/wait.h> - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - #include <asm/prom.h> - #include <asm/machdep.h> - #include <asm/io.h> ---- linux-2.6.16.orig/drivers/macintosh/windfarm_max6690_sensor.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/macintosh/windfarm_max6690_sensor.c 2006-03-22 17:06:15.000000000 +0100 -@@ -11,7 +11,6 @@ - #include <linux/init.h> - #include <linux/slab.h> - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - #include <asm/prom.h> - #include <asm/pmac_low_i2c.h> - ---- linux-2.6.16.orig/drivers/macintosh/windfarm_smu_sat.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/drivers/macintosh/windfarm_smu_sat.c 2006-03-22 17:06:15.000000000 +0100 -@@ -13,7 +13,6 @@ - #include <linux/init.h> - #include <linux/wait.h> - #include <linux/i2c.h> --#include <linux/i2c-dev.h> - #include <asm/semaphore.h> - #include <asm/prom.h> - #include <asm/smu.h> ---- linux-2.6.16.orig/arch/i386/kernel/traps.c 2006-03-22 17:06:08.000000000 +0100 -+++ linux-2.6.16/arch/i386/kernel/traps.c 2006-03-22 17:06:15.000000000 +0100 -@@ -166,8 +166,7 @@ - stack = (unsigned long*)context->previous_esp; - if (!stack) - break; -- printk(log_lvl); -- printk(" =======================\n"); -+ printk("%s =======================\n", log_lvl); - } - } - -@@ -196,14 +195,12 @@ - break; - if (i && ((i % 8) == 0)) { - printk("\n"); -- printk(log_lvl); -- printk(" "); -+ printk("%s ", log_lvl); - } - printk("%08lx ", *stack++); - } - printk("\n"); -- printk(log_lvl); -- printk("Call Trace:\n"); -+ printk("%sCall Trace:\n", log_lvl); - show_trace_log_lvl(task, esp, log_lvl); - } - ---- linux-2.6.16.orig/drivers/media/video/zoran_card.c 2006-03-22 17:06:07.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/zoran_card.c 2006-03-22 17:06:16.000000000 +0100 -@@ -452,6 +452,8 @@ - .device_id = PCI_DEVICE_ID_MIRO_DC10PLUS, - .i2c_decoder = I2C_DRIVERID_SAA7110, - .i2c_encoder = I2C_DRIVERID_ADV7175, -+ .decoder_addr = 0x4e, -+ .encoder_addr = 0x2b, - .video_codec = CODEC_TYPE_ZR36060, - - .inputs = 3, -@@ -995,10 +997,7 @@ - static int __devinit - zr36057_init (struct zoran *zr) - { -- u32 *mem; -- void *vdev; -- unsigned mem_needed; -- int j; -+ int j, err; - int two = 2; - int zero = 0; - -@@ -1049,19 +1048,16 @@ - - /* allocate memory *before* doing anything to the hardware - * in case allocation fails */ -- mem_needed = BUZ_NUM_STAT_COM * 4; -- mem = kzalloc(mem_needed, GFP_KERNEL); -- vdev = (void *) kmalloc(sizeof(struct video_device), GFP_KERNEL); -- if (!mem || !vdev) { -+ zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL); -+ zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL); -+ if (!zr->stat_com || !zr->video_dev) { - dprintk(1, - KERN_ERR - "%s: zr36057_init() - kmalloc (STAT_COM) failed\n", - ZR_DEVNAME(zr)); -- kfree(vdev); -- kfree(mem); -- return -ENOMEM; -+ err = -ENOMEM; -+ goto exit_free; - } -- zr->stat_com = mem; - for (j = 0; j < BUZ_NUM_STAT_COM; j++) { - zr->stat_com[j] = 1; /* mark as unavailable to zr36057 */ - } -@@ -1069,16 +1065,11 @@ - /* - * Now add the template and register the device unit. - */ -- zr->video_dev = vdev; - memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template)); - strcpy(zr->video_dev->name, ZR_DEVNAME(zr)); -- if (video_register_device(zr->video_dev, VFL_TYPE_GRABBER, -- video_nr) < 0) { -- zoran_unregister_i2c(zr); -- kfree((void *) zr->stat_com); -- kfree(vdev); -- return -1; -- } -+ err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr); -+ if (err < 0) -+ goto exit_unregister; - - zoran_init_hardware(zr); - if (*zr_debug > 2) -@@ -1092,6 +1083,13 @@ - zr->zoran_proc = NULL; - zr->initialized = 1; - return 0; -+ -+exit_unregister: -+ zoran_unregister_i2c(zr); -+exit_free: -+ kfree(zr->stat_com); -+ kfree(zr->video_dev); -+ return err; - } - - static void -@@ -1121,7 +1119,7 @@ - btwrite(0, ZR36057_SPGPPCR); - free_irq(zr->pci_dev->irq, zr); - /* unmap and free memory */ -- kfree((void *) zr->stat_com); -+ kfree(zr->stat_com); - zoran_proc_cleanup(zr); - iounmap(zr->zr36057_mem); - pci_disable_device(zr->pci_dev); -@@ -1349,6 +1347,14 @@ - i2c_dec_name = NULL; - } - -+ if (zoran_register_i2c(zr) < 0) { -+ dprintk(1, -+ KERN_ERR -+ "%s: find_zr36057() - can't initialize i2c bus\n", -+ ZR_DEVNAME(zr)); -+ goto zr_free_irq; -+ } -+ - if (i2c_dec_name) { - if ((result = request_module(i2c_dec_name)) < 0) { - dprintk(1, -@@ -1356,6 +1362,10 @@ - "%s: failed to load module %s: %d\n", - ZR_DEVNAME(zr), i2c_dec_name, result); - } -+ -+ i2c_probe_device(&zr->i2c_adapter, -+ zr->card.i2c_decoder, -+ zr->card.decoder_addr, 0); - } - - /* i2c encoder */ -@@ -1376,14 +1386,10 @@ - "%s: failed to load module %s: %d\n", - ZR_DEVNAME(zr), i2c_enc_name, result); - } -- } - -- if (zoran_register_i2c(zr) < 0) { -- dprintk(1, -- KERN_ERR -- "%s: find_zr36057() - can't initialize i2c bus\n", -- ZR_DEVNAME(zr)); -- goto zr_free_irq; -+ i2c_probe_device(&zr->i2c_adapter, -+ zr->card.i2c_encoder, -+ zr->card.encoder_addr, 0); - } - - dprintk(2, ---- linux-2.6.16.orig/Documentation/hwmon/lm83 2006-03-22 17:06:07.000000000 +0100 -+++ linux-2.6.16/Documentation/hwmon/lm83 2006-03-22 17:06:16.000000000 +0100 -@@ -7,6 +7,10 @@ - Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e - Datasheet: Publicly available at the National Semiconductor website - http://www.national.com/pf/LM/LM83.html -+ * National Semiconductor LM82 -+ Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e -+ Datasheet: Publicly available at the National Semiconductor website -+ http://www.national.com/pf/LM/LM82.html - - - Author: Jean Delvare <khali@linux-fr.org> -@@ -15,10 +19,11 @@ - ----------- - - The LM83 is a digital temperature sensor. It senses its own temperature as --well as the temperature of up to three external diodes. It is compatible --with many other devices such as the LM84 and all other ADM1021 clones. --The main difference between the LM83 and the LM84 in that the later can --only sense the temperature of one external diode. -+well as the temperature of up to three external diodes. The LM82 is -+a stripped down version of the LM83 that only supports one external diode. -+Both are compatible with many other devices such as the LM84 and all -+other ADM1021 clones. The main difference between the LM83 and the LM84 -+in that the later can only sense the temperature of one external diode. - - Using the adm1021 driver for a LM83 should work, but only two temperatures - will be reported instead of four. -@@ -36,6 +41,9 @@ - Iwill MPX2 - Soltek SL-75DRV5 - -+The LM82 is confirmed to have been found on most AMD Geode reference -+designs and test platforms. -+ - The driver has been successfully tested by Magnus Forsström, who I'd - like to thank here. More testers will be of course welcome. - ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.16/Documentation/hwmon/smsc47m192 2006-03-22 17:06:16.000000000 +0100 -@@ -0,0 +1,102 @@ -+Kernel driver smsc47m192 -+======================== -+ -+Supported chips: -+ * SMSC LPC47M192 and LPC47M997 -+ Prefix: 'smsc47m192' -+ Addresses scanned: I2C 0x2c - 0x2d -+ Datasheet: The datasheet for LPC47M192 is publicly available from -+ http://www.smsc.com/ -+ The LPC47M997 is compatible for hardware monitoring. -+ -+Author: Hartmut Rick <linux@rick.claranet.de> -+ Special thanks to Jean Delvare for careful checking -+ of the code and many helpful comments and suggestions. -+ -+ -+Description -+----------- -+ -+This driver implements support for the hardware sensor capabilities -+of the SMSC LPC47M192 and LPC47M997 Super-I/O chips. -+ -+These chips support 3 temperature channels and 8 voltage inputs -+as well as CPU voltage VID input. -+ -+They do also have fan monitoring and control capabilities, but the -+these features are accessed via ISA bus and are not supported by this -+driver. Use the 'smsc47m1' driver for fan monitoring and control. -+ -+Voltages and temperatures are measured by an 8-bit ADC, the resolution -+of the temperatures is 1 bit per degree C. -+Voltages are scaled such that the nominal voltage corresponds to -+192 counts, i.e. 3/4 of the full range. Thus the available range for -+each voltage channel is 0V ... 255/192*(nominal voltage), the resolution -+is 1 bit per (nominal voltage)/192. -+Both voltage and temperature values are scaled by 1000, the sys files -+show voltages in mV and temperatures in units of 0.001 degC. -+ -+The +12V analog voltage input channel (in4_input) is multiplexed with -+bit 4 of the encoded CPU voltage. This means that you either get -+a +12V voltage measurement or a 5 bit CPU VID, but not both. -+The default setting is to use the pin as 12V input, and use only 4 bit VID. -+This driver assumes that the information in the configuration register -+is correct, i.e. that the BIOS has updated the configuration if -+the motherboard has this input wired to VID4. -+ -+The temperature and voltage readings are updated once every 1.5 seconds. -+Reading them more often repeats the same values. -+ -+ -+sysfs interface -+--------------- -+ -+in0_input - +2.5V voltage input -+in1_input - CPU voltage input (nominal 2.25V) -+in2_input - +3.3V voltage input -+in3_input - +5V voltage input -+in4_input - +12V voltage input (may be missing if used as VID4) -+in5_input - Vcc voltage input (nominal 3.3V) -+ This is the supply voltage of the sensor chip itself. -+in6_input - +1.5V voltage input -+in7_input - +1.8V voltage input -+ -+in[0-7]_min, -+in[0-7]_max - lower and upper alarm thresholds for in[0-7]_input reading -+ -+ All voltages are read and written in mV. -+ -+in[0-7]_alarm - alarm flags for voltage inputs -+ These files read '1' in case of alarm, '0' otherwise. -+ -+temp1_input - chip temperature measured by on-chip diode -+temp[2-3]_input - temperature measured by external diodes (one of these would -+ typically be wired to the diode inside the CPU) -+ -+temp[1-3]_min, -+temp[1-3]_max - lower and upper alarm thresholds for temperatures -+ -+temp[1-3]_offset - temperature offset registers -+ The chip adds the offsets stored in these registers to -+ the corresponding temperature readings. -+ Note that temp1 and temp2 offsets share the same register, -+ they cannot both be different from zero at the same time. -+ Writing a non-zero number to one of them will reset the other -+ offset to zero. -+ -+ All temperatures and offsets are read and written in -+ units of 0.001 degC. -+ -+temp[1-3]_alarm - alarm flags for temperature inputs, '1' in case of alarm, -+ '0' otherwise. -+temp[2-3]_input_fault - diode fault flags for temperature inputs 2 and 3. -+ A fault is detected if the two pins for the corresponding -+ sensor are open or shorted, or any of the two is shorted -+ to ground or Vcc. '1' indicates a diode fault. -+ -+cpu0_vid - CPU voltage as received from the CPU -+ -+vrm - CPU VID standard used for decoding CPU voltage -+ -+ The *_min, *_max, *_offset and vrm files can be read and -+ written, all others are read-only. ---- linux-2.6.16.orig/Documentation/hwmon/sysfs-interface 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/Documentation/hwmon/sysfs-interface 2006-03-22 17:06:16.000000000 +0100 -@@ -218,6 +218,12 @@ - from the critical value. - Read/Write value. - -+temp[1-4]_offset -+ Temperature offset which is added to the temperature reading -+ by the chip. -+ Unit: millidegree Celsius -+ Read/Write value. -+ - If there are multiple temperature sensors, temp1_* is - generally the sensor inside the chip itself, - reported as "motherboard temperature". temp2_* to -@@ -246,9 +252,68 @@ - Read only. - - --********* --* Other * --********* -+********** -+* Alarms * -+********** -+ -+Each channel or limit may have an associated alarm file, containing a -+boolean value. 1 means than an alarm condition exists, 0 means no alarm. -+ -+Usually a given chip will either use channel-related alarms, or -+limit-related alarms, not both. The driver should just reflect the hardware -+implementation. -+ -+in[0-n]_alarm -+fan[1-n]_alarm -+temp[1-n]_alarm -+ Channel alarm -+ Boolean -+ Read-only -+ -+OR -+ -+in[0-n]_min_alarm -+in[0-n]_max_alarm -+fan[1-n]_min_alarm -+temp[1-n]_min_alarm -+temp[1-n]_max_alarm -+temp[1-n]_crit_alarm -+ Limit alarm -+ Boolean -+ Read-only -+ -+In theory, a chip could provide per-limit beep masking, but no such chip -+was seen so far. -+ -+Each input channel may have an associated fault file. This can be used -+to notify open diodes, unconnected fans etc. where the hardware -+supports it. When this boolean has value 1, the measurement for that -+channel should not be trusted. -+ -+fan[1-n]_input_fault -+temp[1-n]_input_fault -+ Input fault condition -+ Boolean -+ Read-only -+ -+Some chips also offer the possibility to get beeped when an alarm occurs: -+ -+beep_enable Master beep enable -+ 0 to disable. -+ 1 to enable. -+ Read/Write -+ -+in[0-n]_beep -+fan[1-n]_beep -+temp[1-n]_beep -+ Channel beep -+ 0 to disable. -+ 1 to enable. -+ Read/write -+ -+Old drivers provided a different, non-standard interface to alarms and -+beeps. These interface files are deprecated, but will be kept around -+for compatibility reasons: - - alarms Alarm bitmask. - Read only. -@@ -259,33 +324,22 @@ - if it is still valid. - Generally a direct representation of a chip's internal - alarm registers; there is no standard for the position -- of individual bits. -+ of individual bits. For this reason, the use of this -+ interface file for new drivers is discouraged. Use -+ individual *_alarm and *_fault files instead. - Bits are defined in kernel/include/sensors.h. - --alarms_in Alarm bitmask relative to in (voltage) channels -- Read only -- A '1' bit means an alarm, LSB corresponds to in0 and so on -- Prefered to 'alarms' for newer chips -- --alarms_fan Alarm bitmask relative to fan channels -- Read only -- A '1' bit means an alarm, LSB corresponds to fan1 and so on -- Prefered to 'alarms' for newer chips -- --alarms_temp Alarm bitmask relative to temp (temperature) channels -- Read only -- A '1' bit means an alarm, LSB corresponds to temp1 and so on -- Prefered to 'alarms' for newer chips -- --beep_enable Beep/interrupt enable -- 0 to disable. -- 1 to enable. -- Read/Write -- - beep_mask Bitmask for beep. -- Same format as 'alarms' with the same bit locations. -+ Same format as 'alarms' with the same bit locations, -+ use discouraged for the same reason. Use individual -+ *_beep files instead. - Read/Write - -+ -+********* -+* Other * -+********* -+ - eeprom Raw EEPROM data in binary form. - Read only. - ---- linux-2.6.16.orig/drivers/hwmon/Makefile 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/drivers/hwmon/Makefile 2006-03-22 17:06:16.000000000 +0100 -@@ -40,6 +40,7 @@ - obj-$(CONFIG_SENSORS_SIS5595) += sis5595.o - obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o - obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o -+obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o - obj-$(CONFIG_SENSORS_VIA686A) += via686a.o - obj-$(CONFIG_SENSORS_VT8231) += vt8231.o - obj-$(CONFIG_SENSORS_W83627EHF) += w83627ehf.o ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.16/drivers/hwmon/smsc47m192.c 2006-03-22 17:06:16.000000000 +0100 -@@ -0,0 +1,638 @@ -+/* -+ smsc47m192.c - Support for hardware monitoring block of -+ SMSC LPC47M192 and LPC47M997 Super I/O chips -+ -+ Copyright (C) 2006 Hartmut Rick <linux@rick.claranet.de> -+ -+ Derived from lm78.c and other chip drivers. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+*/ -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/slab.h> -+#include <linux/jiffies.h> -+#include <linux/i2c.h> -+#include <linux/hwmon.h> -+#include <linux/hwmon-sysfs.h> -+#include <linux/hwmon-vid.h> -+#include <linux/err.h> -+ -+/* Addresses to scan */ -+static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; -+ -+/* Insmod parameters */ -+I2C_CLIENT_INSMOD_1(smsc47m192); -+ -+/* SMSC47M192 registers */ -+#define SMSC47M192_REG_IN(nr) ((nr)<6 ? (0x20 + (nr)) : \ -+ (0x50 + (nr) - 6)) -+#define SMSC47M192_REG_IN_MAX(nr) ((nr)<6 ? (0x2b + (nr) * 2) : \ -+ (0x54 + (((nr) - 6) * 2))) -+#define SMSC47M192_REG_IN_MIN(nr) ((nr)<6 ? (0x2c + (nr) * 2) : \ -+ (0x55 + (((nr) - 6) * 2))) -+static u8 SMSC47M192_REG_TEMP[3] = { 0x27, 0x26, 0x52 }; -+static u8 SMSC47M192_REG_TEMP_MAX[3] = { 0x39, 0x37, 0x58 }; -+static u8 SMSC47M192_REG_TEMP_MIN[3] = { 0x3A, 0x38, 0x59 }; -+#define SMSC47M192_REG_TEMP_OFFSET(nr) ((nr)==2 ? 0x1e : 0x1f) -+#define SMSC47M192_REG_ALARM1 0x41 -+#define SMSC47M192_REG_ALARM2 0x42 -+#define SMSC47M192_REG_VID 0x47 -+#define SMSC47M192_REG_VID4 0x49 -+#define SMSC47M192_REG_CONFIG 0x40 -+#define SMSC47M192_REG_SFR 0x4f -+#define SMSC47M192_REG_COMPANY_ID 0x3e -+#define SMSC47M192_REG_VERSION 0x3f -+ -+/* generalised scaling with integer rounding */ -+static inline int SCALE(long val, int mul, int div) -+{ -+ if (val < 0) -+ return (val * mul - div / 2) / div; -+ else -+ return (val * mul + div / 2) / div; -+} -+ -+/* Conversions */ -+ -+/* smsc47m192 internally scales voltage measurements */ -+static const u16 nom_mv[] = { 2500, 2250, 3300, 5000, 12000, 3300, 1500, 1800 }; -+ -+static inline unsigned int IN_FROM_REG(u8 reg, int n) -+{ -+ return SCALE(reg, nom_mv[n], 192); -+} -+ -+static inline u8 IN_TO_REG(unsigned long val, int n) -+{ -+ return SENSORS_LIMIT(SCALE(val, 192, nom_mv[n]), 0, 255); -+} -+ -+/* TEMP: 0.001 degC units (-128C to +127C) -+ REG: 1C/bit, two's complement */ -+static inline s8 TEMP_TO_REG(int val) -+{ -+ return SENSORS_LIMIT(SCALE(val, 1, 1000), -128000, 127000); -+} -+ -+static inline int TEMP_FROM_REG(s8 val) -+{ -+ return val * 1000; -+} -+ -+struct smsc47m192_data { -+ struct i2c_client client; -+ struct class_device *class_dev; -+ struct semaphore update_lock; -+ char valid; /* !=0 if following fields are valid */ -+ unsigned long last_updated; /* In jiffies */ -+ -+ u8 in[8]; /* Register value */ -+ u8 in_max[8]; /* Register value */ -+ u8 in_min[8]; /* Register value */ -+ s8 temp[3]; /* Register value */ -+ s8 temp_max[3]; /* Register value */ -+ s8 temp_min[3]; /* Register value */ -+ s8 temp_offset[3]; /* Register value */ -+ u16 alarms; /* Register encoding, combined */ -+ u8 vid; /* Register encoding, combined */ -+ u8 vrm; -+}; -+ -+static int smsc47m192_detect(struct i2c_adapter *adapter, int address, -+ int kind); -+static int smsc47m192_detach_client(struct i2c_client *client); -+static struct smsc47m192_data *smsc47m192_update_device(struct device *dev); -+ -+static struct i2c_driver smsc47m192_driver = { -+ .driver = { -+ .name = "smsc47m192", -+ }, -+ .class = I2C_CLASS_HWMON, -+ .address_data = &addr_data, -+ .detect_client = smsc47m192_detect, -+ .detach_client = smsc47m192_detach_client, -+}; -+ -+/* Voltages */ -+static ssize_t show_in(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", IN_FROM_REG(data->in[nr], nr)); -+} -+ -+static ssize_t show_in_min(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", IN_FROM_REG(data->in_min[nr], nr)); -+} -+ -+static ssize_t show_in_max(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", IN_FROM_REG(data->in_max[nr], nr)); -+} -+ -+static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct i2c_client *client = to_i2c_client(dev); -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ unsigned long val = simple_strtoul(buf, NULL, 10); -+ -+ down(&data->update_lock); -+ data->in_min[nr] = IN_TO_REG(val, nr); -+ i2c_smbus_write_byte_data(client, SMSC47M192_REG_IN_MIN(nr), -+ data->in_min[nr]); -+ up(&data->update_lock); -+ return count; -+} -+ -+static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct i2c_client *client = to_i2c_client(dev); -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ unsigned long val = simple_strtoul(buf, NULL, 10); -+ -+ down(&data->update_lock); -+ data->in_max[nr] = IN_TO_REG(val, nr); -+ i2c_smbus_write_byte_data(client, SMSC47M192_REG_IN_MAX(nr), -+ data->in_max[nr]); -+ up(&data->update_lock); -+ return count; -+} -+ -+#define show_in_offset(offset) \ -+static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ -+ show_in, NULL, offset); \ -+static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ -+ show_in_min, set_in_min, offset); \ -+static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ -+ show_in_max, set_in_max, offset); -+ -+show_in_offset(0) -+show_in_offset(1) -+show_in_offset(2) -+show_in_offset(3) -+show_in_offset(4) -+show_in_offset(5) -+show_in_offset(6) -+show_in_offset(7) -+ -+/* Temperatures */ -+static ssize_t show_temp(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr])); -+} -+ -+static ssize_t show_temp_min(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[nr])); -+} -+ -+static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[nr])); -+} -+ -+static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct i2c_client *client = to_i2c_client(dev); -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ long val = simple_strtol(buf, NULL, 10); -+ -+ down(&data->update_lock); -+ data->temp_min[nr] = TEMP_TO_REG(val); -+ i2c_smbus_write_byte_data(client, SMSC47M192_REG_TEMP_MIN[nr], -+ data->temp_min[nr]); -+ up(&data->update_lock); -+ return count; -+} -+ -+static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct i2c_client *client = to_i2c_client(dev); -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ long val = simple_strtol(buf, NULL, 10); -+ -+ down(&data->update_lock); -+ data->temp_max[nr] = TEMP_TO_REG(val); -+ i2c_smbus_write_byte_data(client, SMSC47M192_REG_TEMP_MAX[nr], -+ data->temp_max[nr]); -+ up(&data->update_lock); -+ return count; -+} -+ -+static ssize_t show_temp_offset(struct device *dev, struct device_attribute -+ *attr, char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_offset[nr])); -+} -+ -+static ssize_t set_temp_offset(struct device *dev, struct device_attribute -+ *attr, const char *buf, size_t count) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct i2c_client *client = to_i2c_client(dev); -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ u8 sfr = i2c_smbus_read_byte_data(client, SMSC47M192_REG_SFR); -+ long val = simple_strtol(buf, NULL, 10); -+ -+ down(&data->update_lock); -+ data->temp_offset[nr] = TEMP_TO_REG(val); -+ if (nr>1) -+ i2c_smbus_write_byte_data(client, -+ SMSC47M192_REG_TEMP_OFFSET(nr), data->temp_offset[nr]); -+ else if (data->temp_offset[nr] != 0) { -+ /* offset[0] and offset[1] share the same register, -+ SFR bit 4 activates offset[0] */ -+ i2c_smbus_write_byte_data(client, SMSC47M192_REG_SFR, -+ (sfr & 0xef) | (nr==0 ? 0x10 : 0)); -+ data->temp_offset[1-nr] = 0; -+ i2c_smbus_write_byte_data(client, -+ SMSC47M192_REG_TEMP_OFFSET(nr), data->temp_offset[nr]); -+ } else if ((sfr & 0x10) == (nr==0 ? 0x10 : 0)) -+ i2c_smbus_write_byte_data(client, -+ SMSC47M192_REG_TEMP_OFFSET(nr), 0); -+ up(&data->update_lock); -+ return count; -+} -+ -+#define show_temp_index(index) \ -+static SENSOR_DEVICE_ATTR(temp##index##_input, S_IRUGO, \ -+ show_temp, NULL, index-1); \ -+static SENSOR_DEVICE_ATTR(temp##index##_min, S_IRUGO | S_IWUSR, \ -+ show_temp_min, set_temp_min, index-1); \ -+static SENSOR_DEVICE_ATTR(temp##index##_max, S_IRUGO | S_IWUSR, \ -+ show_temp_max, set_temp_max, index-1); \ -+static SENSOR_DEVICE_ATTR(temp##index##_offset, S_IRUGO | S_IWUSR, \ -+ show_temp_offset, set_temp_offset, index-1); -+ -+show_temp_index(1) -+show_temp_index(2) -+show_temp_index(3) -+ -+/* VID */ -+static ssize_t show_vid(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); -+} -+static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); -+ -+static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%d\n", data->vrm); -+} -+ -+static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ struct i2c_client *client = to_i2c_client(dev); -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ data->vrm = simple_strtoul(buf, NULL, 10); -+ return count; -+} -+static DEVICE_ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm); -+ -+/* Alarms */ -+static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, -+ char *buf) -+{ -+ struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); -+ int nr = sensor_attr->index; -+ struct smsc47m192_data *data = smsc47m192_update_device(dev); -+ return sprintf(buf, "%u\n", (data->alarms & nr) ? 1 : 0); -+} -+ -+static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 0x0010); -+static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 0x0020); -+static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 0x0040); -+static SENSOR_DEVICE_ATTR(temp2_input_fault, S_IRUGO, show_alarm, NULL, 0x4000); -+static SENSOR_DEVICE_ATTR(temp3_input_fault, S_IRUGO, show_alarm, NULL, 0x8000); -+static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0x0001); -+static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 0x0002); -+static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 0x0004); -+static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 0x0008); -+static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 0x0100); -+static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 0x0200); -+static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 0x0400); -+static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 0x0800); -+ -+static void smsc47m192_init_client(struct i2c_client *client) -+{ -+ int i; -+ u8 config = i2c_smbus_read_byte_data(client, SMSC47M192_REG_CONFIG); -+ u8 sfr = i2c_smbus_read_byte_data(client, SMSC47M192_REG_SFR); -+ -+ /* select cycle mode (pause 1 sec between updates) */ -+ i2c_smbus_write_byte_data(client, SMSC47M192_REG_SFR, -+ (sfr & 0xfd) | 0x02); -+ if (!(config & 0x01)) { -+ /* initialize alarm limits */ -+ for (i=0; i<8; i++) { -+ i2c_smbus_write_byte_data(client, -+ SMSC47M192_REG_IN_MIN(i), 0); -+ i2c_smbus_write_byte_data(client, -+ SMSC47M192_REG_IN_MAX(i), 0xff); -+ } -+ for (i=0; i<3; i++) { -+ i2c_smbus_write_byte_data(client, -+ SMSC47M192_REG_TEMP_MIN[i], 0x80); -+ i2c_smbus_write_byte_data(client, -+ SMSC47M192_REG_TEMP_MAX[i], 0x7f); -+ } -+ -+ /* start monitoring */ -+ i2c_smbus_write_byte_data(client, SMSC47M192_REG_CONFIG, -+ (config & 0xf7) | 0x01); -+ } -+} -+ -+/* This function is called by i2c_probe */ -+static int smsc47m192_detect(struct i2c_adapter *adapter, int address, -+ int kind) -+{ -+ struct i2c_client *client; -+ struct smsc47m192_data *data; -+ int err = 0; -+ int version, config; -+ -+ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) -+ goto exit; -+ -+ if (!(data = kzalloc(sizeof(struct smsc47m192_data), GFP_KERNEL))) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ -+ client = &data->client; -+ i2c_set_clientdata(client, data); -+ client->addr = address; -+ client->adapter = adapter; -+ client->driver = &smsc47m192_driver; -+ -+ if (kind == 0) -+ kind = smsc47m192; -+ -+ /* Detection criteria from sensors_detect script */ -+ if (kind < 0) { -+ if (i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_COMPANY_ID) == 0x55 -+ && ((version = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_VERSION)) & 0xf0) == 0x20 -+ && (i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_VID) & 0x70) == 0x00 -+ && (i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_VID4) & 0xfe) == 0x80) { -+ dev_info(&adapter->dev, -+ "found SMSC47M192 or SMSC47M997, " -+ "version 2, stepping A%d\n", version & 0x0f); -+ } else { -+ dev_dbg(&adapter->dev, -+ "SMSC47M192 detection failed at 0x%02x\n", -+ address); -+ goto exit_free; -+ } -+ } -+ -+ /* Fill in the remaining client fields and put into the global list */ -+ strlcpy(client->name, "smsc47m192", I2C_NAME_SIZE); -+ data->vrm = vid_which_vrm(); -+ init_MUTEX(&data->update_lock); -+ -+ /* Tell the I2C layer a new client has arrived */ -+ if ((err = i2c_attach_client(client))) -+ goto exit_free; -+ -+ /* Initialize the SMSC47M192 chip */ -+ smsc47m192_init_client(client); -+ -+ /* Register sysfs hooks */ -+ data->class_dev = hwmon_device_register(&client->dev); -+ if (IS_ERR(data->class_dev)) { -+ err = PTR_ERR(data->class_dev); -+ goto exit_detach; -+ } -+ -+ device_create_file(&client->dev, &sensor_dev_attr_in0_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in0_min.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in0_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in0_alarm.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in1_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in1_min.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in1_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in1_alarm.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in2_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in2_min.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in2_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in2_alarm.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in3_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in3_min.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in3_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in3_alarm.dev_attr); -+ -+ /* Pin 110 is either in4 (+12V) or VID4 */ -+ config = i2c_smbus_read_byte_data(client, SMSC47M192_REG_CONFIG); -+ if (!(config & 0x20)) { -+ device_create_file(&client->dev, -+ &sensor_dev_attr_in4_input.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_in4_min.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_in4_max.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_in4_alarm.dev_attr); -+ } -+ device_create_file(&client->dev, &sensor_dev_attr_in5_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in5_min.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in5_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in5_alarm.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in6_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in6_min.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in6_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in6_alarm.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in7_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in7_min.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in7_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_in7_alarm.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp1_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp1_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp1_min.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_temp1_offset.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp1_alarm.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp2_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp2_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp2_min.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_temp2_offset.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp2_alarm.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_temp2_input_fault.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp3_input.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp3_max.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp3_min.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_temp3_offset.dev_attr); -+ device_create_file(&client->dev, &sensor_dev_attr_temp3_alarm.dev_attr); -+ device_create_file(&client->dev, -+ &sensor_dev_attr_temp3_input_fault.dev_attr); -+ device_create_file(&client->dev, &dev_attr_cpu0_vid); -+ device_create_file(&client->dev, &dev_attr_vrm); -+ -+ return 0; -+ -+exit_detach: -+ i2c_detach_client(client); -+exit_free: -+ kfree(data); -+exit: -+ return err; -+} -+ -+static int smsc47m192_detach_client(struct i2c_client *client) -+{ -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ int err; -+ -+ hwmon_device_unregister(data->class_dev); -+ -+ if ((err = i2c_detach_client(client))) -+ return err; -+ -+ kfree(data); -+ -+ return 0; -+} -+ -+static struct smsc47m192_data *smsc47m192_update_device(struct device *dev) -+{ -+ struct i2c_client *client = to_i2c_client(dev); -+ struct smsc47m192_data *data = i2c_get_clientdata(client); -+ int i, config; -+ -+ down(&data->update_lock); -+ -+ if (time_after(jiffies, data->last_updated + HZ + HZ / 2) -+ || !data->valid) { -+ u8 sfr = i2c_smbus_read_byte_data(client, SMSC47M192_REG_SFR); -+ -+ dev_dbg(&client->dev, "Starting smsc47m192 update\n"); -+ -+ for (i = 0; i <= 7; i++) { -+ data->in[i] = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_IN(i)); -+ data->in_min[i] = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_IN_MIN(i)); -+ data->in_max[i] = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_IN_MAX(i)); -+ } -+ for (i = 0; i < 3; i++) { -+ data->temp[i] = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_TEMP[i]); -+ data->temp_max[i] = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_TEMP_MAX[i]); -+ data->temp_min[i] = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_TEMP_MIN[i]); -+ } -+ for (i = 1; i < 3; i++) -+ data->temp_offset[i] = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_TEMP_OFFSET(i)); -+ /* first offset is temp_offset[0] if SFR bit 4 is set, -+ temp_offset[1] otherwise */ -+ if (sfr & 0x10) { -+ data->temp_offset[0] = data->temp_offset[1]; -+ data->temp_offset[1] = 0; -+ } else -+ data->temp_offset[0] = 0; -+ -+ data->vid = i2c_smbus_read_byte_data(client, SMSC47M192_REG_VID) -+ & 0x0f; -+ config = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_CONFIG); -+ if (config & 0x20) -+ data->vid |= (i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_VID4) & 0x01) << 4; -+ data->alarms = i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_ALARM1) | -+ (i2c_smbus_read_byte_data(client, -+ SMSC47M192_REG_ALARM2) << 8); -+ -+ data->last_updated = jiffies; -+ data->valid = 1; -+ } -+ -+ up(&data->update_lock); -+ -+ return data; -+} -+ -+static int __init smsc47m192_init(void) -+{ -+ return i2c_add_driver(&smsc47m192_driver); -+} -+ -+static void __exit smsc47m192_exit(void) -+{ -+ i2c_del_driver(&smsc47m192_driver); -+} -+ -+MODULE_AUTHOR("Hartmut Rick <linux@rick.claranet.de>"); -+MODULE_DESCRIPTION("SMSC47M192 driver"); -+MODULE_LICENSE("GPL"); -+ -+module_init(smsc47m192_init); -+module_exit(smsc47m192_exit); ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-sis96x.c 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-sis96x.c 2006-03-22 17:06:16.000000000 +0100 -@@ -43,13 +43,6 @@ - #include <linux/init.h> - #include <asm/io.h> - --/* -- HISTORY: -- 2003-05-11 1.0.0 Updated from lm_sensors project for kernel 2.5 -- (was i2c-sis645.c from lm_sensors 2.7.0) --*/ --#define SIS96x_VERSION "1.0.0" -- - /* base address register in PCI config space */ - #define SIS96x_BAR 0x04 - -@@ -256,7 +249,7 @@ - - static struct i2c_adapter sis96x_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - -@@ -337,7 +330,6 @@ - - static int __init i2c_sis96x_init(void) - { -- printk(KERN_INFO "i2c-sis96x version %s\n", SIS96x_VERSION); - return pci_register_driver(&sis96x_driver); - } - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-parport-light.c 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-parport-light.c 2006-03-22 17:06:16.000000000 +0100 -@@ -111,7 +111,7 @@ - - static struct i2c_adapter parport_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .id = I2C_HW_B_LP, - .algo_data = &parport_algo_data, - .name = "Parallel port adapter (light)", -@@ -121,9 +121,14 @@ - - static int __init i2c_parport_init(void) - { -- if (type < 0 || type >= ARRAY_SIZE(adapter_parm)) { -+ if (type < 0) { -+ printk(KERN_WARNING "i2c-parport: adapter type unspecified\n"); -+ return -ENODEV; -+ } -+ -+ if (type >= ARRAY_SIZE(adapter_parm)) { - printk(KERN_WARNING "i2c-parport: invalid type (%d)\n", type); -- type = 0; -+ return -ENODEV; - } - - if (base == 0) { ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-parport.h 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-parport.h 2006-03-22 17:06:16.000000000 +0100 -@@ -90,7 +90,7 @@ - }, - }; - --static int type; -+static int type = -1; - module_param(type, int, 0); - MODULE_PARM_DESC(type, - "Type of adapter:\n" ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-parport.c 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-parport.c 2006-03-22 17:06:16.000000000 +0100 -@@ -146,7 +146,7 @@ - - static struct i2c_adapter parport_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .id = I2C_HW_B_LP, - .name = "Parallel port adapter", - }; -@@ -241,9 +241,14 @@ - - static int __init i2c_parport_init(void) - { -- if (type < 0 || type >= ARRAY_SIZE(adapter_parm)) { -+ if (type < 0) { -+ printk(KERN_WARNING "i2c-parport: adapter type unspecified\n"); -+ return -ENODEV; -+ } -+ -+ if (type >= ARRAY_SIZE(adapter_parm)) { - printk(KERN_WARNING "i2c-parport: invalid type (%d)\n", type); -- type = 0; -+ return -ENODEV; - } - - return parport_register_driver(&i2c_parport_driver); ---- linux-2.6.16.orig/Documentation/i2c/busses/i2c-parport 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/Documentation/i2c/busses/i2c-parport 2006-03-22 17:06:16.000000000 +0100 -@@ -12,18 +12,22 @@ - teletext adapters) - - It currently supports the following devices: -- * Philips adapter -- * home brew teletext adapter -- * Velleman K8000 adapter -- * ELV adapter -- * Analog Devices evaluation boards (ADM1025, ADM1030, ADM1031, ADM1032) -- * Barco LPT->DVI (K5800236) adapter -+ * (type=0) Philips adapter -+ * (type=1) home brew teletext adapter -+ * (type=2) Velleman K8000 adapter -+ * (type=3) ELV adapter -+ * (type=4) Analog Devices ADM1032 evaluation board -+ * (type=5) Analog Devices evaluation boards: ADM1025, ADM1030, ADM1031 -+ * (type=6) Barco LPT->DVI (K5800236) adapter - - These devices use different pinout configurations, so you have to tell - the driver what you have, using the type module parameter. There is no - way to autodetect the devices. Support for different pinout configurations - can be easily added when needed. - -+Earlier kernels defaulted to type=0 (Philips). But now, if the type -+parameter is missing, the driver will simply fail to initialize. -+ - - Building your own adapter - ------------------------- ---- linux-2.6.16.orig/Documentation/i2c/writing-clients 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/Documentation/i2c/writing-clients 2006-03-22 17:06:16.000000000 +0100 -@@ -28,7 +28,9 @@ - .driver = { - .name = "foo", - }, -- .attach_adapter = &foo_attach_adapter, -+ .class = I2C_CLASS_SOMETHING, -+ .address_data = &addr_data, -+ .detect_client = &foo_detect_client, - .detach_client = &foo_detach_client, - .command = &foo_command /* may be NULL */ - } -@@ -141,8 +143,8 @@ - are defined in i2c.h to help you support them, as well as a generic - detection algorithm. - --You do not have to use this parameter interface; but don't try to use --function i2c_probe() if you don't. -+You do not have to use this parameter interface; but then the i2c core won't -+be able to probe for devices for you. - - NOTE: If you want to write a `sensors' driver, the interface is slightly - different! See below. -@@ -201,35 +203,49 @@ - ----------------------- - - Whenever a new adapter is inserted, or for all adapters if the driver is --being registered, the callback attach_adapter() is called. Now is the --time to determine what devices are present on the adapter, and to register --a client for each of them. -- --The attach_adapter callback is really easy: we just call the generic --detection function. This function will scan the bus for us, using the --information as defined in the lists explained above. If a device is --detected at a specific address, another callback is called. -+being registered, your driver may be notified through one of two -+callbacks, depending on the degree of control you need to exercise over -+the probing process. This is the time to determine what devices are -+present on the adapter and to register a client for each device your -+driver supports. -+ -+The easiest way to handle the probing process is to simply set the `class', -+`address_data', and `detect_client' fields in the i2c_driver structure. -+The `class' field is a bitmask of all the adapter classes which should be -+probed for devices supported by this driver. You should set it to one of -+the I2C_CLASS_* constants defined in i2c.h. The `address_data' field -+should be set to `&addr_data', which is defined by the macros explained -+above, so you do not have to define it yourself. When a new adapter is -+attached, the bus is scanned for the addresses defined in the lists above, -+and the detect_client callback gets called when a device is detected at a -+specific address. -+ -+If you prefer, you can omit the `class', `address_data', and -+`detect_client' fields from your i2c_driver structure, and instead set -+`attach_adapter'. The `attach_adapter' callback gets called every time a -+new adapter is attached and the bus needs to be scanned, so if you need to -+perform any special checks or configuration before you scan a bus for -+devices, you should use attach_adapter. If the bus is suitable, you can -+then call the generic i2c_probe function to scan for the addresses in the -+lists explained above, and the callback passed in the third parameter will -+get called for each device detected. - - int foo_attach_adapter(struct i2c_adapter *adapter) - { - return i2c_probe(adapter,&addr_data,&foo_detect_client); - } - --Remember, structure `addr_data' is defined by the macros explained above, --so you do not have to define it yourself. -- --The i2c_probe function will call the foo_detect_client --function only for those i2c addresses that actually have a device on --them (unless a `force' parameter was used). In addition, addresses that --are already in use (by some other registered client) are skipped. -+With either mechanism, addresses that are already in use (by some other -+registered client) are skipped. - - - The detect client function - -------------------------- - --The detect client function is called by i2c_probe. The `kind' parameter --contains -1 for a probed detection, 0 for a forced detection, or a positive --number for a forced detection with a chip type forced. -+The detect client function is called by the address probing mechanism. -+The `kind' parameter contains -1 for a probed detection, 0 for a forced -+detection, or a positive number for a forced detection with a chip type -+forced. - - Below, some things are only needed if this is a `sensors' driver. Those - parts are between /* SENSORS ONLY START */ and /* SENSORS ONLY END */ ---- linux-2.6.16.orig/Documentation/i2c/porting-clients 2006-03-22 17:06:00.000000000 +0100 -+++ linux-2.6.16/Documentation/i2c/porting-clients 2006-03-22 17:06:16.000000000 +0100 -@@ -100,6 +100,9 @@ - Drop any 24RF08 corruption prevention you find, as this is now done - at the i2c-core level, and doing it twice voids it. - Don't add I2C_CLIENT_ALLOW_USE to client->flags, it's the default now. -+ If you want auto probing of your driver, use driver->addr_data -+ (this is strongly encouraged if your attach_adapter is a one-liner -+ which calls i2c_probe). - - * [Init] Limits must not be set by the driver (can be done later in - user-space). Chip should not be reset default (although a module ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-ali1563.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-ali1563.c 2006-03-22 17:06:16.000000000 +0100 -@@ -374,7 +374,7 @@ - - static struct i2c_adapter ali1563_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &ali1563_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-ali15x3.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-ali15x3.c 2006-03-22 17:06:16.000000000 +0100 -@@ -470,7 +470,7 @@ - - static struct i2c_adapter ali15x3_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-amd756.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-amd756.c 2006-03-22 17:06:16.000000000 +0100 -@@ -301,7 +301,7 @@ - - struct i2c_adapter amd756_smbus = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-amd8111.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-amd8111.c 2006-03-22 17:06:16.000000000 +0100 -@@ -351,7 +351,7 @@ - smbus->adapter.owner = THIS_MODULE; - snprintf(smbus->adapter.name, I2C_NAME_SIZE, - "SMBus2 AMD8111 adapter at %04x", smbus->base); -- smbus->adapter.class = I2C_CLASS_HWMON; -+ smbus->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_DATA; - smbus->adapter.algo = &smbus_algorithm; - smbus->adapter.algo_data = smbus; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-elektor.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-elektor.c 2006-03-22 17:06:16.000000000 +0100 -@@ -202,7 +202,7 @@ - - static struct i2c_adapter pcf_isa_ops = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .id = I2C_HW_P_ELEK, - .algo_data = &pcf_isa_data, - .name = "i2c-elektor", ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-i801.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-i801.c 2006-03-22 17:06:16.000000000 +0100 -@@ -513,7 +513,7 @@ - - static struct i2c_adapter i801_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-i810.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-i810.c 2006-03-22 17:06:16.000000000 +0100 -@@ -188,6 +188,7 @@ - - static struct i2c_adapter i810_ddc_adapter = { - .owner = THIS_MODULE, -+ .class = I2C_CLASS_DATA, - .name = "I810/I815 DDC Adapter", - .algo_data = &i810_ddc_bit_data, - }; ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-ibm_iic.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-ibm_iic.c 2006-03-22 17:06:16.000000000 +0100 -@@ -724,8 +724,9 @@ - adap = &dev->adap; - strcpy(adap->name, "IBM IIC"); - i2c_set_adapdata(adap, dev); -+ adap->owner = THIS_MODULE; - adap->id = I2C_HW_OCP; -- adap->class = I2C_CLASS_HWMON; -+ adap->class = I2C_CLASS_HWMON | I2C_CLASS_DATA; - adap->algo = &iic_algo; - adap->client_register = NULL; - adap->client_unregister = NULL; ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-ixp2000.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-ixp2000.c 2006-03-22 17:06:16.000000000 +0100 -@@ -117,7 +117,9 @@ - drv_data->algo_data.mdelay = 6; - drv_data->algo_data.timeout = 100; - -- drv_data->adapter.id = I2C_HW_B_IXP2000, -+ drv_data->adapter.owner = THIS_MODULE; -+ drv_data->adapter.class = I2C_CLASS_DATA; -+ drv_data->adapter.id = I2C_HW_B_IXP2000; - strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name, - I2C_NAME_SIZE); - drv_data->adapter.algo_data = &drv_data->algo_data, ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-mpc.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-mpc.c 2006-03-22 17:06:16.000000000 +0100 -@@ -283,7 +283,7 @@ - .name = "MPC adapter", - .id = I2C_HW_MPC107, - .algo = &mpc_algo, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .timeout = 1, - .retries = 1 - }; ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-mv64xxx.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-mv64xxx.c 2006-03-22 17:06:16.000000000 +0100 -@@ -519,7 +519,7 @@ - drv_data->adapter.id = I2C_HW_MV64XXX; - drv_data->adapter.algo = &mv64xxx_i2c_algo; - drv_data->adapter.owner = THIS_MODULE; -- drv_data->adapter.class = I2C_CLASS_HWMON; -+ drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_DATA; - drv_data->adapter.timeout = pdata->timeout; - drv_data->adapter.retries = pdata->retries; - platform_set_drvdata(pd, drv_data); ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-nforce2.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-nforce2.c 2006-03-22 17:06:16.000000000 +0100 -@@ -113,7 +113,7 @@ - - static struct i2c_adapter nforce2_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-prosavage.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-prosavage.c 2006-03-22 17:06:16.000000000 +0100 -@@ -172,6 +172,7 @@ - { - int ret; - p->adap.owner = THIS_MODULE; -+ p->adap.class = I2C_CLASS_DATA; - p->adap.id = I2C_HW_B_S3VIA; - p->adap.algo_data = &p->algo; - p->adap.dev.parent = &dev->dev; ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-s3c2410.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-s3c2410.c 2006-03-22 17:06:16.000000000 +0100 -@@ -580,7 +580,7 @@ - .owner = THIS_MODULE, - .algo = &s3c24xx_i2c_algorithm, - .retries = 2, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - }, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-savage4.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-savage4.c 2006-03-22 17:06:16.000000000 +0100 -@@ -146,6 +146,7 @@ - - static struct i2c_adapter savage4_i2c_adapter = { - .owner = THIS_MODULE, -+ .class = I2C_CLASS_DATA, - .name = "I2C Savage4 adapter", - .algo_data = &sav_i2c_bit_data, - }; ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-sibyte.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-sibyte.c 2006-03-22 17:06:16.000000000 +0100 -@@ -31,7 +31,7 @@ - { - .owner = THIS_MODULE, - .id = I2C_HW_SIBYTE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = NULL, - .algo_data = &sibyte_board_data[0], - .name = "SiByte SMBus 0", -@@ -39,7 +39,7 @@ - { - .owner = THIS_MODULE, - .id = I2C_HW_SIBYTE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = NULL, - .algo_data = &sibyte_board_data[1], - .name = "SiByte SMBus 1", ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-sis5595.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-sis5595.c 2006-03-22 17:06:16.000000000 +0100 -@@ -365,7 +365,7 @@ - - static struct i2c_adapter sis5595_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-sis630.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-sis630.c 2006-03-22 17:06:16.000000000 +0100 -@@ -457,7 +457,7 @@ - - static struct i2c_adapter sis630_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-stub.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-stub.c 2006-03-22 17:06:16.000000000 +0100 -@@ -115,7 +115,7 @@ - - static struct i2c_adapter stub_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_ALL, - .algo = &smbus_algorithm, - .name = "SMBus stub driver", - }; ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-via.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-via.c 2006-03-22 17:06:16.000000000 +0100 -@@ -87,7 +87,7 @@ - - static struct i2c_adapter vt586b_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .name = "VIA i2c", - .algo_data = &bit_data, - }; ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-viapro.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-viapro.c 2006-03-22 17:06:16.000000000 +0100 -@@ -304,7 +304,7 @@ - - static struct i2c_adapter vt596_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_HWMON, -+ .class = I2C_CLASS_HWMON | I2C_CLASS_DATA, - .algo = &smbus_algorithm, - }; - ---- linux-2.6.16.orig/drivers/i2c/busses/i2c-voodoo3.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/i2c/busses/i2c-voodoo3.c 2006-03-22 17:06:16.000000000 +0100 -@@ -183,7 +183,7 @@ - - static struct i2c_adapter voodoo3_ddc_adapter = { - .owner = THIS_MODULE, -- .class = I2C_CLASS_DDC, -+ .class = I2C_CLASS_DATA, - .name = "DDC Voodoo3/Banshee adapter", - .algo_data = &voo_ddc_bit_data, - }; ---- linux-2.6.16.orig/drivers/video/aty/radeon_i2c.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/video/aty/radeon_i2c.c 2006-03-22 17:06:16.000000000 +0100 -@@ -75,6 +75,7 @@ - - strcpy(chan->adapter.name, name); - chan->adapter.owner = THIS_MODULE; -+ chan->adapter.class = I2C_CLASS_DATA; - chan->adapter.id = I2C_HW_B_RADEON; - chan->adapter.algo_data = &chan->algo; - chan->adapter.dev.parent = &chan->rinfo->pdev->dev; ---- linux-2.6.16.orig/drivers/video/i810/i810-i2c.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/video/i810/i810-i2c.c 2006-03-22 17:06:16.000000000 +0100 -@@ -85,12 +85,14 @@ - return ((i810_readl(mmio, chan->ddc_base) & SDA_VAL_IN) != 0); - } - --static int i810_setup_i2c_bus(struct i810fb_i2c_chan *chan, const char *name) -+static int i810_setup_i2c_bus(struct i810fb_i2c_chan *chan, const char *name, -+ unsigned long i2c_class) - { - int rc; - - strcpy(chan->adapter.name, name); - chan->adapter.owner = THIS_MODULE; -+ chan->adapter.class = i2c_class; - chan->adapter.algo_data = &chan->algo; - chan->adapter.dev.parent = &chan->par->dev->dev; - chan->adapter.id = I2C_HW_B_I810; -@@ -130,11 +132,11 @@ - par->chan[2].par = par; - - par->chan[0].ddc_base = GPIOA; -- i810_setup_i2c_bus(&par->chan[0], "I810-DDC"); -+ i810_setup_i2c_bus(&par->chan[0], "I810-DDC", I2C_CLASS_DATA); - par->chan[1].ddc_base = GPIOB; -- i810_setup_i2c_bus(&par->chan[1], "I810-I2C"); -+ i810_setup_i2c_bus(&par->chan[1], "I810-I2C", 0); - par->chan[2].ddc_base = GPIOC; -- i810_setup_i2c_bus(&par->chan[2], "I810-GPIOC"); -+ i810_setup_i2c_bus(&par->chan[2], "I810-GPIOC", 0); - } - - void i810_delete_i2c_busses(struct i810fb_par *par) ---- linux-2.6.16.orig/drivers/video/matrox/i2c-matroxfb.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/video/matrox/i2c-matroxfb.c 2006-03-22 17:06:16.000000000 +0100 -@@ -104,13 +104,15 @@ - }; - - static int i2c_bus_reg(struct i2c_bit_adapter* b, struct matrox_fb_info* minfo, -- unsigned int data, unsigned int clock, const char* name) { -+ unsigned int data, unsigned int clock, const char* name, -+ unsigned int i2c_class) { - int err; - - b->minfo = minfo; - b->mask.data = data; - b->mask.clock = clock; - b->adapter = matrox_i2c_adapter_template; -+ b->adapter.class = i2c_class; - snprintf(b->adapter.name, I2C_NAME_SIZE, name, - minfo->fbcon.node); - i2c_set_adapdata(&b->adapter, b); -@@ -160,22 +162,28 @@ - switch (ACCESS_FBINFO(chip)) { - case MGA_2064: - case MGA_2164: -- err = i2c_bus_reg(&m2info->ddc1, minfo, DDC1B_DATA, DDC1B_CLK, "DDC:fb%u #0"); -+ err = i2c_bus_reg(&m2info->ddc1, minfo, DDC1B_DATA, -+ DDC1B_CLK, "DDC:fb%u #0", -+ I2C_CLASS_DATA); - break; - default: -- err = i2c_bus_reg(&m2info->ddc1, minfo, DDC1_DATA, DDC1_CLK, "DDC:fb%u #0"); -+ err = i2c_bus_reg(&m2info->ddc1, minfo, DDC1_DATA, -+ DDC1_CLK, "DDC:fb%u #0", -+ I2C_CLASS_DATA); - break; - } - if (err) - goto fail_ddc1; - if (ACCESS_FBINFO(devflags.dualhead)) { -- err = i2c_bus_reg(&m2info->ddc2, minfo, DDC2_DATA, DDC2_CLK, "DDC:fb%u #1"); -+ err = i2c_bus_reg(&m2info->ddc2, minfo, DDC2_DATA, DDC2_CLK, -+ "DDC:fb%u #1", I2C_CLASS_DATA); - if (err == -ENODEV) { - printk(KERN_INFO "i2c-matroxfb: VGA->TV plug detected, DDC unavailable.\n"); - } else if (err) - printk(KERN_INFO "i2c-matroxfb: Could not register secondary output i2c bus. Continuing anyway.\n"); - /* Register maven bus even on G450/G550 */ -- err = i2c_bus_reg(&m2info->maven, minfo, MAT_DATA, MAT_CLK, "MAVEN:fb%u"); -+ err = i2c_bus_reg(&m2info->maven, minfo, MAT_DATA, MAT_CLK, -+ "MAVEN:fb%u", 0); - if (err) - printk(KERN_INFO "i2c-matroxfb: Could not register Maven i2c bus. Continuing anyway.\n"); - } ---- linux-2.6.16.orig/drivers/video/nvidia/nv_i2c.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/video/nvidia/nv_i2c.c 2006-03-22 17:06:16.000000000 +0100 -@@ -96,6 +96,7 @@ - - strcpy(chan->adapter.name, name); - chan->adapter.owner = THIS_MODULE; -+ chan->adapter.class = I2C_CLASS_DATA; - chan->adapter.id = I2C_HW_B_NVIDIA; - chan->adapter.algo_data = &chan->algo; - chan->adapter.dev.parent = &chan->par->pci_dev->dev; ---- linux-2.6.16.orig/drivers/video/riva/rivafb-i2c.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/video/riva/rivafb-i2c.c 2006-03-22 17:06:16.000000000 +0100 -@@ -98,6 +98,7 @@ - - strcpy(chan->adapter.name, name); - chan->adapter.owner = THIS_MODULE; -+ chan->adapter.class = I2C_CLASS_DATA; - chan->adapter.id = I2C_HW_B_RIVA; - chan->adapter.algo_data = &chan->algo; - chan->adapter.dev.parent = &chan->par->pdev->dev; ---- linux-2.6.16.orig/drivers/video/savage/savagefb-i2c.c 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/video/savage/savagefb-i2c.c 2006-03-22 17:06:16.000000000 +0100 -@@ -145,6 +145,7 @@ - if (chan->par) { - strcpy(chan->adapter.name, name); - chan->adapter.owner = THIS_MODULE; -+ chan->adapter.class = I2C_CLASS_DATA; - chan->adapter.id = I2C_HW_B_SAVAGE; - chan->adapter.algo_data = &chan->algo; - chan->adapter.dev.parent = &chan->par->pcidev->dev; ---- linux-2.6.16.orig/drivers/media/video/zoran.h 2006-03-22 17:05:59.000000000 +0100 -+++ linux-2.6.16/drivers/media/video/zoran.h 2006-03-22 17:06:16.000000000 +0100 -@@ -355,6 +355,7 @@ - enum card_type type; - char name[32]; - u16 i2c_decoder, i2c_encoder; /* I2C types */ -+ u16 decoder_addr, encoder_addr; /* I2C chips address */ - u16 video_vfe, video_codec; /* videocodec types */ - u16 audio_chip; /* audio type */ - u16 vendor_id, device_id; /* subsystem vendor/device ID */ |