hwmon: (w83793) Implement the standard intrusion detection interface
Jean Delvare [Wed, 12 Jan 2011 20:55:10 +0000 (21:55 +0100)]
We have a standard intrusion detection interface now, drivers should
implement it. I've left the old interface in place for the time being,
with a deprecation warning, it will be removed later.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Guenter Roeck <guenter.roeck@ericsson.com>

Documentation/hwmon/w83793
drivers/hwmon/w83793.c

index 51171a8..6cc5f63 100644 (file)
@@ -92,7 +92,7 @@ This driver implements support for Winbond W83793G/W83793R chips.
 
 * Chassis
   If the case open alarm triggers, it will stay in this state unless cleared
-  by any write to the sysfs file "chassis".
+  by writing 0 to the sysfs file "intrusion0_alarm".
 
 * VID and VRM
   The VRM version is detected automatically, don't modify the it unless you
index 8e540ad..d0c3012 100644 (file)
@@ -421,14 +421,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 +440,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 +1127,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),