]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/hwmon/smsc47m1.c
b43legacy: fix use-after-free rfkill bug
[linux-2.6-omap-h63xx.git] / drivers / hwmon / smsc47m1.c
index 1e21c8cc948f5902571ead518aeb36d9b59a2ffa..a10a380868e2640b6d424e682e7400988a3e8ede 100644 (file)
@@ -116,7 +116,7 @@ struct smsc47m1_data {
        unsigned short addr;
        const char *name;
        enum chips type;
-       struct class_device *class_dev;
+       struct device *hwmon_dev;
 
        struct mutex update_lock;
        unsigned long last_updated;     /* In jiffies */
@@ -134,7 +134,7 @@ struct smsc47m1_sio_data {
 
 
 static int smsc47m1_probe(struct platform_device *pdev);
-static int smsc47m1_remove(struct platform_device *pdev);
+static int __devexit smsc47m1_remove(struct platform_device *pdev);
 static struct smsc47m1_data *smsc47m1_update_device(struct device *dev,
                int init);
 
@@ -553,7 +553,7 @@ static int __devinit smsc47m1_probe(struct platform_device *pdev)
                 || (err = device_create_file(dev,
                                &sensor_dev_attr_fan3_div.dev_attr)))
                        goto error_remove_files;
-       } else
+       } else if (data->type == smsc47m2)
                dev_dbg(dev, "Fan 3 not enabled by hardware, skipping\n");
 
        if (pwm1) {
@@ -580,15 +580,17 @@ static int __devinit smsc47m1_probe(struct platform_device *pdev)
                 || (err = device_create_file(dev,
                                &sensor_dev_attr_pwm3_enable.dev_attr)))
                        goto error_remove_files;
-       } else
+       } else if (data->type == smsc47m2)
                dev_dbg(dev, "PWM 3 not enabled by hardware, skipping\n");
 
        if ((err = device_create_file(dev, &dev_attr_alarms)))
                goto error_remove_files;
+       if ((err = device_create_file(dev, &dev_attr_name)))
+               goto error_remove_files;
 
-       data->class_dev = hwmon_device_register(dev);
-       if (IS_ERR(data->class_dev)) {
-               err = PTR_ERR(data->class_dev);
+       data->hwmon_dev = hwmon_device_register(dev);
+       if (IS_ERR(data->hwmon_dev)) {
+               err = PTR_ERR(data->hwmon_dev);
                goto error_remove_files;
        }
 
@@ -597,6 +599,7 @@ static int __devinit smsc47m1_probe(struct platform_device *pdev)
 error_remove_files:
        sysfs_remove_group(&dev->kobj, &smsc47m1_group);
 error_free:
+       platform_set_drvdata(pdev, NULL);
        kfree(data);
 error_release:
        release_region(res->start, SMSC_EXTENT);
@@ -608,12 +611,12 @@ static int __devexit smsc47m1_remove(struct platform_device *pdev)
        struct smsc47m1_data *data = platform_get_drvdata(pdev);
        struct resource *res;
 
-       platform_set_drvdata(pdev, NULL);
-       hwmon_device_unregister(data->class_dev);
+       hwmon_device_unregister(data->hwmon_dev);
        sysfs_remove_group(&pdev->dev.kobj, &smsc47m1_group);
 
        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
        release_region(res->start, SMSC_EXTENT);
+       platform_set_drvdata(pdev, NULL);
        kfree(data);
 
        return 0;
@@ -693,15 +696,12 @@ static int __init smsc47m1_device_add(unsigned short address,
                goto exit_device_put;
        }
 
-       pdev->dev.platform_data = kmalloc(sizeof(struct smsc47m1_sio_data),
-                                         GFP_KERNEL);
-       if (!pdev->dev.platform_data) {
-               err = -ENOMEM;
+       err = platform_device_add_data(pdev, sio_data,
+                                      sizeof(struct smsc47m1_sio_data));
+       if (err) {
                printk(KERN_ERR DRVNAME ": Platform data allocation failed\n");
                goto exit_device_put;
        }
-       memcpy(pdev->dev.platform_data, sio_data,
-              sizeof(struct smsc47m1_sio_data));
 
        err = platform_device_add(pdev);
        if (err) {