]> err.no Git - linux-2.6/blobdiff - drivers/hwmon/f75375s.c
iwlwifi: drop skb silently for Tx request in monitor mode
[linux-2.6] / drivers / hwmon / f75375s.c
index 472b052770d3ae29329d9462983c11c3e7801c27..dc1f30e432eab96864d52af0706a2ac39f7338a7 100644 (file)
@@ -37,7 +37,7 @@
 #include <linux/f75375s.h>
 
 /* Addresses to scan */
-static unsigned short normal_i2c[] = { 0x2d, 0x2e, I2C_CLIENT_END };
+static const unsigned short normal_i2c[] = { 0x2d, 0x2e, I2C_CLIENT_END };
 
 /* Insmod parameters */
 I2C_CLIENT_INSMOD_2(f75373, f75375);
@@ -117,7 +117,8 @@ struct f75375_data {
 static int f75375_attach_adapter(struct i2c_adapter *adapter);
 static int f75375_detect(struct i2c_adapter *adapter, int address, int kind);
 static int f75375_detach_client(struct i2c_client *client);
-static int f75375_probe(struct i2c_client *client);
+static int f75375_probe(struct i2c_client *client,
+                       const struct i2c_device_id *id);
 static int f75375_remove(struct i2c_client *client);
 
 static struct i2c_driver f75375_legacy_driver = {
@@ -128,12 +129,20 @@ static struct i2c_driver f75375_legacy_driver = {
        .detach_client = f75375_detach_client,
 };
 
+static const struct i2c_device_id f75375_id[] = {
+       { "f75373", f75373 },
+       { "f75375", f75375 },
+       { }
+};
+MODULE_DEVICE_TABLE(i2c, f75375_id);
+
 static struct i2c_driver f75375_driver = {
        .driver = {
                .name = "f75375",
        },
        .probe = f75375_probe,
        .remove = f75375_remove,
+       .id_table = f75375_id,
 };
 
 static inline int f75375_read8(struct i2c_client *client, u8 reg)
@@ -343,7 +352,7 @@ static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *attr,
        int val = simple_strtoul(buf, NULL, 10);
        u8 conf = 0;
 
-       if (!(val == 0 || val == 1) || data->kind == f75373)
+       if (!(val == 0 || val == 1))
                return -EINVAL;
 
        mutex_lock(&data->update_lock);
@@ -549,13 +558,13 @@ static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO|S_IWUSR,
        show_pwm, set_pwm, 0);
 static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO|S_IWUSR,
        show_pwm_enable, set_pwm_enable, 0);
-static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO|S_IWUSR,
+static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO,
        show_pwm_mode, set_pwm_mode, 0);
 static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR,
        show_pwm, set_pwm, 1);
 static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO|S_IWUSR,
        show_pwm_enable, set_pwm_enable, 1);
-static SENSOR_DEVICE_ATTR(pwm2_mode, S_IRUGO|S_IWUSR,
+static SENSOR_DEVICE_ATTR(pwm2_mode, S_IRUGO,
        show_pwm_mode, set_pwm_mode, 1);
 
 static struct attribute *f75375_attributes[] = {
@@ -628,7 +637,8 @@ static void f75375_init(struct i2c_client *client, struct f75375_data *data,
 
 }
 
-static int f75375_probe(struct i2c_client *client)
+static int f75375_probe(struct i2c_client *client,
+               const struct i2c_device_id *id)
 {
        struct f75375_data *data = i2c_get_clientdata(client);
        struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data;
@@ -643,19 +653,24 @@ static int f75375_probe(struct i2c_client *client)
        i2c_set_clientdata(client, data);
        data->client = client;
        mutex_init(&data->update_lock);
-
-       if (strcmp(client->name, "f75375") == 0)
-               data->kind = f75375;
-       else if (strcmp(client->name, "f75373") == 0)
-               data->kind = f75373;
-       else {
-               dev_err(&client->dev, "Unsupported device: %s\n", client->name);
-               return -ENODEV;
-       }
+       data->kind = id->driver_data;
 
        if ((err = sysfs_create_group(&client->dev.kobj, &f75375_group)))
                goto exit_free;
 
+       if (data->kind == f75375) {
+               err = sysfs_chmod_file(&client->dev.kobj,
+                       &sensor_dev_attr_pwm1_mode.dev_attr.attr,
+                       S_IRUGO | S_IWUSR);
+               if (err)
+                       goto exit_remove;
+               err = sysfs_chmod_file(&client->dev.kobj,
+                       &sensor_dev_attr_pwm2_mode.dev_attr.attr,
+                       S_IRUGO | S_IWUSR);
+               if (err)
+                       goto exit_remove;
+       }
+
        data->hwmon_dev = hwmon_device_register(&client->dev);
        if (IS_ERR(data->hwmon_dev)) {
                err = PTR_ERR(data->hwmon_dev);
@@ -699,6 +714,7 @@ static int f75375_detect(struct i2c_adapter *adapter, int address, int kind)
        u8 version = 0;
        int err = 0;
        const char *name = "";
+       struct i2c_device_id id;
 
        if (!(client = kzalloc(sizeof(*client), GFP_KERNEL))) {
                err = -ENOMEM;
@@ -735,7 +751,9 @@ static int f75375_detect(struct i2c_adapter *adapter, int address, int kind)
        if ((err = i2c_attach_client(client)))
                goto exit_free;
 
-       if ((err = f75375_probe(client)) < 0)
+       strlcpy(id.name, name, I2C_NAME_SIZE);
+       id.driver_data = kind;
+       if ((err = f75375_probe(client, &id)) < 0)
                goto exit_detach;
 
        return 0;