#include <linux/list.h>
 #include <linux/module.h>
 #include <linux/pci.h>
+#include <linux/property.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/thermal.h>
 
 struct hwmon_device {
        const char *name;
+       const char *label;
        struct device dev;
        const struct hwmon_chip_info *chip;
        struct list_head tzdata;
 }
 static DEVICE_ATTR_RO(name);
 
+static ssize_t
+label_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       return sysfs_emit(buf, "%s\n", to_hwmon_device(dev)->label);
+}
+static DEVICE_ATTR_RO(label);
+
 static struct attribute *hwmon_dev_attrs[] = {
        &dev_attr_name.attr,
+       &dev_attr_label.attr,
        NULL
 };
 
-static umode_t hwmon_dev_name_is_visible(struct kobject *kobj,
+static umode_t hwmon_dev_attr_is_visible(struct kobject *kobj,
                                         struct attribute *attr, int n)
 {
        struct device *dev = kobj_to_dev(kobj);
+       struct hwmon_device *hdev = to_hwmon_device(dev);
 
-       if (to_hwmon_device(dev)->name == NULL)
+       if (attr == &dev_attr_name.attr && hdev->name == NULL)
+               return 0;
+
+       if (attr == &dev_attr_label.attr && hdev->label == NULL)
                return 0;
 
        return attr->mode;
 
 static const struct attribute_group hwmon_dev_attr_group = {
        .attrs          = hwmon_dev_attrs,
-       .is_visible     = hwmon_dev_name_is_visible,
+       .is_visible     = hwmon_dev_attr_is_visible,
 };
 
 static const struct attribute_group *hwmon_dev_attr_groups[] = {
        if (hwdev->group.attrs)
                hwmon_free_attrs(hwdev->group.attrs);
        kfree(hwdev->groups);
+       kfree(hwdev->label);
        kfree(hwdev);
 }
 
                        const struct attribute_group **groups)
 {
        struct hwmon_device *hwdev;
+       const char *label;
        struct device *hdev;
        int i, err, id;
 
                hdev->groups = groups;
        }
 
+       if (device_property_present(dev, "label")) {
+               err = device_property_read_string(dev, "label", &label);
+               if (err < 0)
+                       goto free_hwmon;
+
+               hwdev->label = kstrdup(label, GFP_KERNEL);
+               if (hwdev->label == NULL) {
+                       err = -ENOMEM;
+                       goto free_hwmon;
+               }
+       }
+
        hwdev->name = name;
        hdev->class = &hwmon_class;
        hdev->parent = dev;