raid5: replace custom debug PRINTKs with standard pr_debug
[sfrench/cifs-2.6.git] / drivers / hwmon / abituguru.c
index 35ad1b0327268dac11cf8a3f465a884aef0f42a2..bede4d990ea67330546e7b897ae51bf434f55341 100644 (file)
@@ -21,6 +21,7 @@
     etc voltage & frequency control is not supported!
 */
 #include <linux/module.h>
+#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
@@ -1266,30 +1267,42 @@ static int __devinit abituguru_probe(struct platform_device *pdev)
        printk(KERN_INFO ABIT_UGURU_NAME ": found Abit uGuru\n");
 
        /* Register sysfs hooks */
-       data->class_dev = hwmon_device_register(&pdev->dev);
-       if (IS_ERR(data->class_dev)) {
-               res = PTR_ERR(data->class_dev);
-               goto abituguru_probe_error;
-       }
        for (i = 0; i < sysfs_attr_i; i++)
-               device_create_file(&pdev->dev, &data->sysfs_attr[i].dev_attr);
+               if (device_create_file(&pdev->dev,
+                               &data->sysfs_attr[i].dev_attr))
+                       goto abituguru_probe_error;
        for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++)
-               device_create_file(&pdev->dev,
-                       &abituguru_sysfs_attr[i].dev_attr);
+               if (device_create_file(&pdev->dev,
+                               &abituguru_sysfs_attr[i].dev_attr))
+                       goto abituguru_probe_error;
 
-       return 0;
+       data->class_dev = hwmon_device_register(&pdev->dev);
+       if (!IS_ERR(data->class_dev))
+               return 0; /* success */
 
+       res = PTR_ERR(data->class_dev);
 abituguru_probe_error:
+       for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++)
+               device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr);
+       for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++)
+               device_remove_file(&pdev->dev,
+                       &abituguru_sysfs_attr[i].dev_attr);
        kfree(data);
        return res;
 }
 
 static int __devexit abituguru_remove(struct platform_device *pdev)
 {
+       int i;
        struct abituguru_data *data = platform_get_drvdata(pdev);
 
        platform_set_drvdata(pdev, NULL);
        hwmon_device_unregister(data->class_dev);
+       for (i = 0; data->sysfs_attr[i].dev_attr.attr.name; i++)
+               device_remove_file(&pdev->dev, &data->sysfs_attr[i].dev_attr);
+       for (i = 0; i < ARRAY_SIZE(abituguru_sysfs_attr); i++)
+               device_remove_file(&pdev->dev,
+                       &abituguru_sysfs_attr[i].dev_attr);
        kfree(data);
 
        return 0;
@@ -1354,13 +1367,39 @@ LEAVE_UPDATE:
                return NULL;
 }
 
+#ifdef CONFIG_PM
+static int abituguru_suspend(struct platform_device *pdev, pm_message_t state)
+{
+       struct abituguru_data *data = platform_get_drvdata(pdev);
+       /* make sure all communications with the uguru are done and no new
+          ones are started */
+       mutex_lock(&data->update_lock);
+       return 0;
+}
+
+static int abituguru_resume(struct platform_device *pdev)
+{
+       struct abituguru_data *data = platform_get_drvdata(pdev);
+       /* See if the uGuru is still ready */
+       if (inb_p(data->addr + ABIT_UGURU_DATA) != ABIT_UGURU_STATUS_INPUT)
+               data->uguru_ready = 0;
+       mutex_unlock(&data->update_lock);
+       return 0;
+}
+#else
+#define abituguru_suspend      NULL
+#define abituguru_resume       NULL
+#endif /* CONFIG_PM */
+
 static struct platform_driver abituguru_driver = {
        .driver = {
                .owner  = THIS_MODULE,
                .name   = ABIT_UGURU_NAME,
        },
-       .probe  = abituguru_probe,
-       .remove = __devexit_p(abituguru_remove),
+       .probe          = abituguru_probe,
+       .remove         = __devexit_p(abituguru_remove),
+       .suspend        = abituguru_suspend,
+       .resume         = abituguru_resume,
 };
 
 static int __init abituguru_detect(void)