patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / drivers / i2c / chips / w83781d.c
index b2274c5..ac378b5 100644 (file)
@@ -183,8 +183,10 @@ FAN_TO_REG(long rpm, int div)
 #define ALARMS_FROM_REG(val)           (val)
 #define PWM_FROM_REG(val)              (val)
 #define PWM_TO_REG(val)                        (SENSORS_LIMIT((val),0,255))
-#define BEEP_MASK_FROM_REG(val)                (val)
-#define BEEP_MASK_TO_REG(val)          ((val) & 0xffffff)
+#define BEEP_MASK_FROM_REG(val,type)   ((type) == as99127f ? \
+                                        (val) ^ 0x7fff : (val))
+#define BEEP_MASK_TO_REG(val,type)     ((type) == as99127f ? \
+                                        (~(val)) & 0x7fff : (val) & 0xffffff)
 
 #define BEEP_ENABLE_TO_REG(val)                ((val) ? 1 : 0)
 #define BEEP_ENABLE_FROM_REG(val)      ((val) ? 1 : 0)
@@ -539,14 +541,18 @@ static
 DEVICE_ATTR(alarms, S_IRUGO, show_alarms_reg, NULL)
 #define device_create_file_alarms(client) \
 device_create_file(&client->dev, &dev_attr_alarms);
-#define show_beep_reg(REG, reg) \
-static ssize_t show_beep_##reg (struct device *dev, char *buf) \
-{ \
-       struct w83781d_data *data = w83781d_update_device(dev); \
-       return sprintf(buf,"%ld\n", (long)BEEP_##REG##_FROM_REG(data->beep_##reg)); \
+static ssize_t show_beep_mask (struct device *dev, char *buf)
+{
+       struct w83781d_data *data = w83781d_update_device(dev);
+       return sprintf(buf, "%ld\n",
+                      (long)BEEP_MASK_FROM_REG(data->beep_mask, data->type));
+}
+static ssize_t show_beep_enable (struct device *dev, char *buf)
+{
+       struct w83781d_data *data = w83781d_update_device(dev);
+       return sprintf(buf, "%ld\n",
+                      (long)BEEP_ENABLE_FROM_REG(data->beep_enable));
 }
-show_beep_reg(ENABLE, enable);
-show_beep_reg(MASK, mask);
 
 #define BEEP_ENABLE                    0       /* Store beep_enable */
 #define BEEP_MASK                      1       /* Store beep_mask */
@@ -562,7 +568,7 @@ store_beep_reg(struct device *dev, const char *buf, size_t count,
        val = simple_strtoul(buf, NULL, 10);
 
        if (update_mask == BEEP_MASK) { /* We are storing beep_mask */
-               data->beep_mask = BEEP_MASK_TO_REG(val);
+               data->beep_mask = BEEP_MASK_TO_REG(val, data->type);
                w83781d_write_value(client, W83781D_REG_BEEP_INTS1,
                                    data->beep_mask & 0xff);
 
@@ -905,7 +911,7 @@ device_create_file(&client->dev, &dev_attr_rt##offset); \
 static int
 w83781d_attach_adapter(struct i2c_adapter *adapter)
 {
-       if (!(adapter->class & I2C_ADAP_CLASS_SMBUS))
+       if (!(adapter->class & I2C_CLASS_HWMON))
                return 0;
        return i2c_detect(adapter, &addr_data, w83781d_detect);
 }
@@ -1330,7 +1336,13 @@ w83781d_detach_client(struct i2c_client *client)
                return err;
        }
 
-       kfree(i2c_get_clientdata(client));
+       if (i2c_get_clientdata(client)==NULL) {
+               /* subclients */
+               kfree(client);
+       } else {
+               /* main client */
+               kfree(i2c_get_clientdata(client));
+       }
 
        return 0;
 }