]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/hwmon/w83793.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / drivers / hwmon / w83793.c
index 8e540ada47d27aaf8f78c6ee5b0c513407d80d1a..e3bdedfb534708eabcc006c9933fd54b699af9d7 100644 (file)
@@ -51,7 +51,6 @@
 #define WATCHDOG_TIMEOUT 2     /* 2 minute default timeout */
 
 /* Addresses to scan */
-static DEFINE_MUTEX(watchdog_mutex);
 static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
                                                I2C_CLIENT_END };
 
@@ -421,14 +420,17 @@ store_beep_enable(struct device *dev, struct device_attribute *attr,
 
 /* Write any value to clear chassis alarm */
 static ssize_t
-store_chassis_clear(struct device *dev,
-                   struct device_attribute *attr, const char *buf,
-                   size_t count)
+store_chassis_clear_legacy(struct device *dev,
+                          struct device_attribute *attr, const char *buf,
+                          size_t count)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct w83793_data *data = i2c_get_clientdata(client);
        u8 val;
 
+       dev_warn(dev, "Attribute chassis is deprecated, "
+                "use intrusion0_alarm instead\n");
+
        mutex_lock(&data->update_lock);
        val = w83793_read_value(client, W83793_REG_CLR_CHASSIS);
        val |= 0x80;
@@ -437,6 +439,28 @@ store_chassis_clear(struct device *dev,
        return count;
 }
 
+/* Write 0 to clear chassis alarm */
+static ssize_t
+store_chassis_clear(struct device *dev,
+                   struct device_attribute *attr, const char *buf,
+                   size_t count)
+{
+       struct i2c_client *client = to_i2c_client(dev);
+       struct w83793_data *data = i2c_get_clientdata(client);
+       unsigned long val;
+       u8 reg;
+
+       if (strict_strtoul(buf, 10, &val) || val != 0)
+               return -EINVAL;
+
+       mutex_lock(&data->update_lock);
+       reg = w83793_read_value(client, W83793_REG_CLR_CHASSIS);
+       w83793_write_value(client, W83793_REG_CLR_CHASSIS, reg | 0x80);
+       data->valid = 0;                /* Force cache refresh */
+       mutex_unlock(&data->update_lock);
+       return count;
+}
+
 #define FAN_INPUT                      0
 #define FAN_MIN                                1
 static ssize_t
@@ -1102,6 +1126,8 @@ static DEVICE_ATTR(vrm, S_IWUSR | S_IRUGO, show_vrm, store_vrm);
 
 static struct sensor_device_attribute_2 sda_single_files[] = {
        SENSOR_ATTR_2(chassis, S_IWUSR | S_IRUGO, show_alarm_beep,
+                     store_chassis_clear_legacy, ALARM_STATUS, 30),
+       SENSOR_ATTR_2(intrusion0_alarm, S_IWUSR | S_IRUGO, show_alarm_beep,
                      store_chassis_clear, ALARM_STATUS, 30),
        SENSOR_ATTR_2(beep_enable, S_IWUSR | S_IRUGO, show_beep_enable,
                      store_beep_enable, NOT_USED, NOT_USED),
@@ -1323,7 +1349,7 @@ static ssize_t watchdog_write(struct file *filp, const char __user *buf,
 static long watchdog_ioctl(struct file *filp, unsigned int cmd,
                           unsigned long arg)
 {
-       static struct watchdog_info ident = {
+       struct watchdog_info ident = {
                .options = WDIOF_KEEPALIVEPING |
                           WDIOF_SETTIMEOUT |
                           WDIOF_CARDRESET,
@@ -1333,7 +1359,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd,
        int val, ret = 0;
        struct w83793_data *data = filp->private_data;
 
-       mutex_lock(&watchdog_mutex);
        switch (cmd) {
        case WDIOC_GETSUPPORT:
                if (!nowayout)
@@ -1387,7 +1412,6 @@ static long watchdog_ioctl(struct file *filp, unsigned int cmd,
        default:
                ret = -ENOTTY;
        }
-       mutex_unlock(&watchdog_mutex);
        return ret;
 }