]> git.karo-electronics.de Git - linux-beck.git/blobdiff - drivers/hwmon/coretemp.c
hwmon: (coretemp) Convert to use devm_hwmon_device_register_with_groups
[linux-beck.git] / drivers / hwmon / coretemp.c
index bbb0b0d463f7e0c7cf489a3b30ff2057563d1749..f31bc4c4864411ae8bd3267d27575c5444ac71e1 100644 (file)
@@ -94,6 +94,8 @@ struct temp_data {
        bool valid;
        struct sensor_device_attribute sd_attrs[TOTAL_ATTRS];
        char attr_name[TOTAL_ATTRS][CORETEMP_NAME_LENGTH];
+       struct attribute *attrs[TOTAL_ATTRS + 1];
+       struct attribute_group attr_group;
        struct mutex update_lock;
 };
 
@@ -114,12 +116,6 @@ struct pdev_entry {
 static LIST_HEAD(pdev_list);
 static DEFINE_MUTEX(pdev_list_mutex);
 
-static ssize_t show_name(struct device *dev,
-                       struct device_attribute *devattr, char *buf)
-{
-       return sprintf(buf, "%s\n", DRVNAME);
-}
-
 static ssize_t show_label(struct device *dev,
                                struct device_attribute *devattr, char *buf)
 {
@@ -393,20 +389,10 @@ static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
        return adjust_tjmax(c, id, dev);
 }
 
-static int create_name_attr(struct platform_data *pdata,
-                                     struct device *dev)
-{
-       sysfs_attr_init(&pdata->name_attr.attr);
-       pdata->name_attr.attr.name = "name";
-       pdata->name_attr.attr.mode = S_IRUGO;
-       pdata->name_attr.show = show_name;
-       return device_create_file(dev, &pdata->name_attr);
-}
-
 static int create_core_attrs(struct temp_data *tdata, struct device *dev,
                             int attr_no)
 {
-       int err, i;
+       int i;
        static ssize_t (*const rd_ptr[TOTAL_ATTRS]) (struct device *dev,
                        struct device_attribute *devattr, char *buf) = {
                        show_label, show_crit_alarm, show_temp, show_tjmax,
@@ -424,16 +410,10 @@ static int create_core_attrs(struct temp_data *tdata, struct device *dev,
                tdata->sd_attrs[i].dev_attr.attr.mode = S_IRUGO;
                tdata->sd_attrs[i].dev_attr.show = rd_ptr[i];
                tdata->sd_attrs[i].index = attr_no;
-               err = device_create_file(dev, &tdata->sd_attrs[i].dev_attr);
-               if (err)
-                       goto exit_free;
+               tdata->attrs[i] = &tdata->sd_attrs[i].dev_attr.attr;
        }
-       return 0;
-
-exit_free:
-       while (--i >= 0)
-               device_remove_file(dev, &tdata->sd_attrs[i].dev_attr);
-       return err;
+       tdata->attr_group.attrs = tdata->attrs;
+       return sysfs_create_group(&dev->kobj, &tdata->attr_group);
 }
 
 
@@ -548,7 +528,7 @@ static int create_core_data(struct platform_device *pdev, unsigned int cpu,
        pdata->core_data[attr_no] = tdata;
 
        /* Create sysfs interfaces */
-       err = create_core_attrs(tdata, &pdev->dev, attr_no);
+       err = create_core_attrs(tdata, pdata->hwmon_dev, attr_no);
        if (err)
                goto exit_free;
 
@@ -573,14 +553,12 @@ static void coretemp_add_core(unsigned int cpu, int pkg_flag)
 }
 
 static void coretemp_remove_core(struct platform_data *pdata,
-                               struct device *dev, int indx)
+                                int indx)
 {
-       int i;
        struct temp_data *tdata = pdata->core_data[indx];
 
        /* Remove the sysfs attributes */
-       for (i = 0; i < tdata->attr_size; i++)
-               device_remove_file(dev, &tdata->sd_attrs[i].dev_attr);
+       sysfs_remove_group(&pdata->hwmon_dev->kobj, &tdata->attr_group);
 
        kfree(pdata->core_data[indx]);
        pdata->core_data[indx] = NULL;
@@ -588,34 +566,20 @@ static void coretemp_remove_core(struct platform_data *pdata,
 
 static int coretemp_probe(struct platform_device *pdev)
 {
+       struct device *dev = &pdev->dev;
        struct platform_data *pdata;
-       int err;
 
        /* Initialize the per-package data structures */
-       pdata = kzalloc(sizeof(struct platform_data), GFP_KERNEL);
+       pdata = devm_kzalloc(dev, sizeof(struct platform_data), GFP_KERNEL);
        if (!pdata)
                return -ENOMEM;
 
-       err = create_name_attr(pdata, &pdev->dev);
-       if (err)
-               goto exit_free;
-
        pdata->phys_proc_id = pdev->id;
        platform_set_drvdata(pdev, pdata);
 
-       pdata->hwmon_dev = hwmon_device_register(&pdev->dev);
-       if (IS_ERR(pdata->hwmon_dev)) {
-               err = PTR_ERR(pdata->hwmon_dev);
-               dev_err(&pdev->dev, "Class registration failed (%d)\n", err);
-               goto exit_name;
-       }
-       return 0;
-
-exit_name:
-       device_remove_file(&pdev->dev, &pdata->name_attr);
-exit_free:
-       kfree(pdata);
-       return err;
+       pdata->hwmon_dev = devm_hwmon_device_register_with_groups(dev, DRVNAME,
+                                                                 pdata, NULL);
+       return PTR_ERR_OR_ZERO(pdata->hwmon_dev);
 }
 
 static int coretemp_remove(struct platform_device *pdev)
@@ -625,11 +589,8 @@ static int coretemp_remove(struct platform_device *pdev)
 
        for (i = MAX_CORE_DATA - 1; i >= 0; --i)
                if (pdata->core_data[i])
-                       coretemp_remove_core(pdata, &pdev->dev, i);
+                       coretemp_remove_core(pdata, i);
 
-       device_remove_file(&pdev->dev, &pdata->name_attr);
-       hwmon_device_unregister(pdata->hwmon_dev);
-       kfree(pdata);
        return 0;
 }
 
@@ -777,7 +738,7 @@ static void put_core_offline(unsigned int cpu)
                return;
 
        if (pdata->core_data[indx] && pdata->core_data[indx]->cpu == cpu)
-               coretemp_remove_core(pdata, &pdev->dev, indx);
+               coretemp_remove_core(pdata, indx);
 
        /*
         * If a HT sibling of a core is taken offline, but another HT sibling