* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
@ 2022-01-05 22:27 ` kernel test robot
2022-01-10 1:29 ` Guenter Roeck
2022-01-10 6:44 ` Dan Carpenter
2 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2022-01-05 22:27 UTC (permalink / raw)
To: Paul Cercueil, Jean Delvare, Guenter Roeck, Jonathan Corbet
Cc: llvm, kbuild-all, linux-hwmon, linux-kernel, linux-doc, list,
Paul Cercueil, Cosmin Tanislav
Hi Paul,
I love your patch! Perhaps something to improve:
[auto build test WARNING on groeck-staging/hwmon-next]
[also build test WARNING on v5.16-rc8 next-20220105]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: arm64-randconfig-r026-20220105 (https://download.01.org/0day-ci/archive/20220106/202201060630.vsp02mfB-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project d5b6e30ed3acad794dd0aec400e617daffc6cc3d)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/0day-ci/linux/commit/57dab49995d01d638d9fa9aaddb5fa48e17b3c48
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
git checkout 57dab49995d01d638d9fa9aaddb5fa48e17b3c48
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/hwmon/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/hwmon/hwmon.c:777:7: warning: variable 'hdev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (hwdev->label == NULL) {
^~~~~~~~~~~~~~~~~~~~
drivers/hwmon/hwmon.c:851:20: note: uninitialized use occurs here
hwmon_dev_release(hdev);
^~~~
drivers/hwmon/hwmon.c:777:3: note: remove the 'if' if its condition is always false
if (hwdev->label == NULL) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/hwmon/hwmon.c:773:7: warning: variable 'hdev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (err < 0)
^~~~~~~
drivers/hwmon/hwmon.c:851:20: note: uninitialized use occurs here
hwmon_dev_release(hdev);
^~~~
drivers/hwmon/hwmon.c:773:3: note: remove the 'if' if its condition is always false
if (err < 0)
^~~~~~~~~~~~
drivers/hwmon/hwmon.c:752:21: note: initialize the variable 'hdev' to silence this warning
struct device *hdev;
^
= NULL
2 warnings generated.
vim +777 drivers/hwmon/hwmon.c
744
745 static struct device *
746 __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
747 const struct hwmon_chip_info *chip,
748 const struct attribute_group **groups)
749 {
750 struct hwmon_device *hwdev;
751 const char *label;
752 struct device *hdev;
753 int i, err, id;
754
755 /* Complain about invalid characters in hwmon name attribute */
756 if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
757 dev_warn(dev,
758 "hwmon: '%s' is not a valid name attribute, please fix\n",
759 name);
760
761 id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
762 if (id < 0)
763 return ERR_PTR(id);
764
765 hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL);
766 if (hwdev == NULL) {
767 err = -ENOMEM;
768 goto ida_remove;
769 }
770
771 if (device_property_present(dev, "label")) {
772 err = device_property_read_string(dev, "label", &label);
773 if (err < 0)
774 goto free_hwmon;
775
776 hwdev->label = kstrdup(label, GFP_KERNEL);
> 777 if (hwdev->label == NULL) {
778 err = -ENOMEM;
779 goto free_hwmon;
780 }
781 }
782
783 hdev = &hwdev->dev;
784
785 if (chip) {
786 struct attribute **attrs;
787 int ngroups = 2; /* terminating NULL plus &hwdev->groups */
788
789 if (groups)
790 for (i = 0; groups[i]; i++)
791 ngroups++;
792
793 hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL);
794 if (!hwdev->groups) {
795 err = -ENOMEM;
796 goto free_hwmon;
797 }
798
799 attrs = __hwmon_create_attrs(drvdata, chip);
800 if (IS_ERR(attrs)) {
801 err = PTR_ERR(attrs);
802 goto free_hwmon;
803 }
804
805 hwdev->group.attrs = attrs;
806 ngroups = 0;
807 hwdev->groups[ngroups++] = &hwdev->group;
808
809 if (groups) {
810 for (i = 0; groups[i]; i++)
811 hwdev->groups[ngroups++] = groups[i];
812 }
813
814 hdev->groups = hwdev->groups;
815 } else {
816 hdev->groups = groups;
817 }
818
819 hwdev->name = name;
820 hdev->class = &hwmon_class;
821 hdev->parent = dev;
822 hdev->of_node = dev ? dev->of_node : NULL;
823 hwdev->chip = chip;
824 dev_set_drvdata(hdev, drvdata);
825 dev_set_name(hdev, HWMON_ID_FORMAT, id);
826 err = device_register(hdev);
827 if (err) {
828 put_device(hdev);
829 goto ida_remove;
830 }
831
832 INIT_LIST_HEAD(&hwdev->tzdata);
833
834 if (dev && dev->of_node && chip && chip->ops->read &&
835 chip->info[0]->type == hwmon_chip &&
836 (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
837 err = hwmon_thermal_register_sensors(hdev);
838 if (err) {
839 device_unregister(hdev);
840 /*
841 * Don't worry about hwdev; hwmon_dev_release(), called
842 * from device_unregister(), will free it.
843 */
844 goto ida_remove;
845 }
846 }
847
848 return hdev;
849
850 free_hwmon:
851 hwmon_dev_release(hdev);
852 ida_remove:
853 ida_simple_remove(&hwmon_ida, id);
854 return ERR_PTR(err);
855 }
856
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
2022-01-05 22:27 ` kernel test robot
@ 2022-01-10 1:29 ` Guenter Roeck
2022-01-10 10:48 ` Paul Cercueil
2022-01-10 6:44 ` Dan Carpenter
2 siblings, 1 reply; 7+ messages in thread
From: Guenter Roeck @ 2022-01-10 1:29 UTC (permalink / raw)
To: Paul Cercueil
Cc: Jean Delvare, Jonathan Corbet, linux-hwmon, linux-kernel,
linux-doc, list, Cosmin Tanislav
On Wed, Jan 05, 2022 at 03:15:51PM +0000, Paul Cercueil wrote:
> If a label is defined in the device tree for this device add that
> to the device specific attributes. This is useful for userspace to
> be able to identify an individual device when multiple identical
> chips are present in the system.
>
> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> Tested-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
> Reported-by: kernel test robot <lkp@intel.com>
> ---
>
> Notes:
> v2: - Cache label into hwmon_device
> - Rename hwmon_dev_name_is_visible() to hwmon_dev_attr_is_visible()
> - Add missing <linux/property.h> include
>
> drivers/hwmon/hwmon.c | 34 +++++++++++++++++++++++++++++++---
> 1 file changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
> index 3501a3ead4ba..22e1b47c09fc 100644
> --- a/drivers/hwmon/hwmon.c
> +++ b/drivers/hwmon/hwmon.c
> @@ -18,6 +18,7 @@
> #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>
> @@ -30,6 +31,7 @@
>
> struct hwmon_device {
> const char *name;
> + const char *label;
> struct device dev;
> const struct hwmon_chip_info *chip;
> struct list_head tzdata;
> @@ -71,17 +73,29 @@ name_show(struct device *dev, struct device_attribute *attr, char *buf)
> }
> 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;
> @@ -89,7 +103,7 @@ static umode_t hwmon_dev_name_is_visible(struct kobject *kobj,
>
> 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[] = {
> @@ -117,6 +131,7 @@ static void hwmon_dev_release(struct device *dev)
> if (hwdev->group.attrs)
> hwmon_free_attrs(hwdev->group.attrs);
> kfree(hwdev->groups);
> + kfree(hwdev->label);
> kfree(hwdev);
> }
>
> @@ -733,6 +748,7 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
> const struct attribute_group **groups)
> {
> struct hwmon_device *hwdev;
> + const char *label;
> struct device *hdev;
> int i, err, id;
>
> @@ -752,6 +768,18 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
> goto ida_remove;
> }
>
> + 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;
The code after free_hwmon: uses hdev, so 0-day has a point. Please fix.
Guenter
> + }
> + }
> +
> hdev = &hwdev->dev;
>
> if (chip) {
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-10 1:29 ` Guenter Roeck
@ 2022-01-10 10:48 ` Paul Cercueil
0 siblings, 0 replies; 7+ messages in thread
From: Paul Cercueil @ 2022-01-10 10:48 UTC (permalink / raw)
To: Guenter Roeck
Cc: Jean Delvare, Jonathan Corbet, linux-hwmon, linux-kernel,
linux-doc, list, Cosmin Tanislav
Hi,
Le dim., janv. 9 2022 at 17:29:24 -0800, Guenter Roeck
<linux@roeck-us.net> a écrit :
> On Wed, Jan 05, 2022 at 03:15:51PM +0000, Paul Cercueil wrote:
>> If a label is defined in the device tree for this device add that
>> to the device specific attributes. This is useful for userspace to
>> be able to identify an individual device when multiple identical
>> chips are present in the system.
>>
>> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
>> Tested-by: Cosmin Tanislav <cosmin.tanislav@analog.com>
>> Reported-by: kernel test robot <lkp@intel.com>
>> ---
>>
>> Notes:
>> v2: - Cache label into hwmon_device
>> - Rename hwmon_dev_name_is_visible() to
>> hwmon_dev_attr_is_visible()
>> - Add missing <linux/property.h> include
>>
>> drivers/hwmon/hwmon.c | 34 +++++++++++++++++++++++++++++++---
>> 1 file changed, 31 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
>> index 3501a3ead4ba..22e1b47c09fc 100644
>> --- a/drivers/hwmon/hwmon.c
>> +++ b/drivers/hwmon/hwmon.c
>> @@ -18,6 +18,7 @@
>> #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>
>> @@ -30,6 +31,7 @@
>>
>> struct hwmon_device {
>> const char *name;
>> + const char *label;
>> struct device dev;
>> const struct hwmon_chip_info *chip;
>> struct list_head tzdata;
>> @@ -71,17 +73,29 @@ name_show(struct device *dev, struct
>> device_attribute *attr, char *buf)
>> }
>> 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;
>> @@ -89,7 +103,7 @@ static umode_t hwmon_dev_name_is_visible(struct
>> kobject *kobj,
>>
>> 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[] = {
>> @@ -117,6 +131,7 @@ static void hwmon_dev_release(struct device
>> *dev)
>> if (hwdev->group.attrs)
>> hwmon_free_attrs(hwdev->group.attrs);
>> kfree(hwdev->groups);
>> + kfree(hwdev->label);
>> kfree(hwdev);
>> }
>>
>> @@ -733,6 +748,7 @@ __hwmon_device_register(struct device *dev,
>> const char *name, void *drvdata,
>> const struct attribute_group **groups)
>> {
>> struct hwmon_device *hwdev;
>> + const char *label;
>> struct device *hdev;
>> int i, err, id;
>>
>> @@ -752,6 +768,18 @@ __hwmon_device_register(struct device *dev,
>> const char *name, void *drvdata,
>> goto ida_remove;
>> }
>>
>> + 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;
>
> The code after free_hwmon: uses hdev, so 0-day has a point. Please
> fix.
Yes indeed. I was going to send a v3.
-Paul
>
>> + }
>> + }
>> +
>> hdev = &hwdev->dev;
>>
>> if (chip) {
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Add "label" attribute
2022-01-05 15:15 ` [PATCH v2 2/2] hwmon: Add "label" attribute Paul Cercueil
2022-01-05 22:27 ` kernel test robot
2022-01-10 1:29 ` Guenter Roeck
@ 2022-01-10 6:44 ` Dan Carpenter
2 siblings, 0 replies; 7+ messages in thread
From: Dan Carpenter @ 2022-01-10 6:44 UTC (permalink / raw)
To: kbuild, Paul Cercueil, Jean Delvare, Guenter Roeck,
Jonathan Corbet
Cc: lkp, kbuild-all, linux-hwmon, linux-kernel, linux-doc, list,
Paul Cercueil, Cosmin Tanislav
Hi Paul,
url: https://github.com/0day-ci/linux/commits/Paul-Cercueil/hwmon-Add-label-attribute-v2/20220105-231930
base: https://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-next
config: i386-randconfig-m021-20220105 (https://download.01.org/0day-ci/archive/20220108/202201081730.TlHZabuC-lkp@intel.com/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
drivers/hwmon/hwmon.c:851 __hwmon_device_register() error: uninitialized symbol 'hdev'.
drivers/hwmon/hwmon.c:854 __hwmon_device_register() warn: possible memory leak of 'hwdev'
vim +/hdev +851 drivers/hwmon/hwmon.c
d560168b5d0fb4 Guenter Roeck 2015-08-26 745 static struct device *
d560168b5d0fb4 Guenter Roeck 2015-08-26 746 __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
d560168b5d0fb4 Guenter Roeck 2015-08-26 747 const struct hwmon_chip_info *chip,
bab2243ce18978 Guenter Roeck 2013-07-06 748 const struct attribute_group **groups)
1236441f38b6a9 Mark M. Hoffman 2005-07-15 749 {
bab2243ce18978 Guenter Roeck 2013-07-06 750 struct hwmon_device *hwdev;
57dab49995d01d Paul Cercueil 2022-01-05 751 const char *label;
d560168b5d0fb4 Guenter Roeck 2015-08-26 752 struct device *hdev;
44e3ad882bb268 Akinobu Mita 2020-05-04 753 int i, err, id;
ded2b666156130 Mark M. Hoffman 2006-03-05 754
74d3b6419772e4 Guenter Roeck 2017-01-27 755 /* Complain about invalid characters in hwmon name attribute */
648cd48c9e566f Guenter Roeck 2014-02-28 756 if (name && (!strlen(name) || strpbrk(name, "-* \t\n")))
74d3b6419772e4 Guenter Roeck 2017-01-27 757 dev_warn(dev,
74d3b6419772e4 Guenter Roeck 2017-01-27 758 "hwmon: '%s' is not a valid name attribute, please fix\n",
74d3b6419772e4 Guenter Roeck 2017-01-27 759 name);
648cd48c9e566f Guenter Roeck 2014-02-28 760
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 761 id = ida_simple_get(&hwmon_ida, 0, 0, GFP_KERNEL);
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 762 if (id < 0)
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 763 return ERR_PTR(id);
1236441f38b6a9 Mark M. Hoffman 2005-07-15 764
bab2243ce18978 Guenter Roeck 2013-07-06 765 hwdev = kzalloc(sizeof(*hwdev), GFP_KERNEL);
bab2243ce18978 Guenter Roeck 2013-07-06 766 if (hwdev == NULL) {
bab2243ce18978 Guenter Roeck 2013-07-06 767 err = -ENOMEM;
bab2243ce18978 Guenter Roeck 2013-07-06 768 goto ida_remove;
bab2243ce18978 Guenter Roeck 2013-07-06 769 }
1236441f38b6a9 Mark M. Hoffman 2005-07-15 770
57dab49995d01d Paul Cercueil 2022-01-05 771 if (device_property_present(dev, "label")) {
57dab49995d01d Paul Cercueil 2022-01-05 772 err = device_property_read_string(dev, "label", &label);
57dab49995d01d Paul Cercueil 2022-01-05 773 if (err < 0)
57dab49995d01d Paul Cercueil 2022-01-05 774 goto free_hwmon;
"hwdev" not freed on this goto path and "hdev" is uninitialized. Sort
of related bugs.
57dab49995d01d Paul Cercueil 2022-01-05 775
57dab49995d01d Paul Cercueil 2022-01-05 776 hwdev->label = kstrdup(label, GFP_KERNEL);
57dab49995d01d Paul Cercueil 2022-01-05 777 if (hwdev->label == NULL) {
57dab49995d01d Paul Cercueil 2022-01-05 778 err = -ENOMEM;
57dab49995d01d Paul Cercueil 2022-01-05 779 goto free_hwmon;
57dab49995d01d Paul Cercueil 2022-01-05 780 }
57dab49995d01d Paul Cercueil 2022-01-05 781 }
57dab49995d01d Paul Cercueil 2022-01-05 782
d560168b5d0fb4 Guenter Roeck 2015-08-26 783 hdev = &hwdev->dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 784
239552f495b91f Guenter Roeck 2016-10-16 785 if (chip) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 786 struct attribute **attrs;
b2a4cc3a060da0 Guenter Roeck 2016-10-16 787 int ngroups = 2; /* terminating NULL plus &hwdev->groups */
d560168b5d0fb4 Guenter Roeck 2015-08-26 788
d560168b5d0fb4 Guenter Roeck 2015-08-26 789 if (groups)
d560168b5d0fb4 Guenter Roeck 2015-08-26 790 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 791 ngroups++;
d560168b5d0fb4 Guenter Roeck 2015-08-26 792
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 793 hwdev->groups = kcalloc(ngroups, sizeof(*groups), GFP_KERNEL);
38d8ed65092ed2 Colin Ian King 2016-10-23 794 if (!hwdev->groups) {
38d8ed65092ed2 Colin Ian King 2016-10-23 795 err = -ENOMEM;
38d8ed65092ed2 Colin Ian King 2016-10-23 796 goto free_hwmon;
38d8ed65092ed2 Colin Ian King 2016-10-23 797 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 798
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 799 attrs = __hwmon_create_attrs(drvdata, chip);
d560168b5d0fb4 Guenter Roeck 2015-08-26 800 if (IS_ERR(attrs)) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 801 err = PTR_ERR(attrs);
d560168b5d0fb4 Guenter Roeck 2015-08-26 802 goto free_hwmon;
d560168b5d0fb4 Guenter Roeck 2015-08-26 803 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 804
d560168b5d0fb4 Guenter Roeck 2015-08-26 805 hwdev->group.attrs = attrs;
d560168b5d0fb4 Guenter Roeck 2015-08-26 806 ngroups = 0;
d560168b5d0fb4 Guenter Roeck 2015-08-26 807 hwdev->groups[ngroups++] = &hwdev->group;
d560168b5d0fb4 Guenter Roeck 2015-08-26 808
d560168b5d0fb4 Guenter Roeck 2015-08-26 809 if (groups) {
d560168b5d0fb4 Guenter Roeck 2015-08-26 810 for (i = 0; groups[i]; i++)
d560168b5d0fb4 Guenter Roeck 2015-08-26 811 hwdev->groups[ngroups++] = groups[i];
d560168b5d0fb4 Guenter Roeck 2015-08-26 812 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 813
d560168b5d0fb4 Guenter Roeck 2015-08-26 814 hdev->groups = hwdev->groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 815 } else {
d560168b5d0fb4 Guenter Roeck 2015-08-26 816 hdev->groups = groups;
d560168b5d0fb4 Guenter Roeck 2015-08-26 817 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 818
bab2243ce18978 Guenter Roeck 2013-07-06 819 hwdev->name = name;
d560168b5d0fb4 Guenter Roeck 2015-08-26 820 hdev->class = &hwmon_class;
d560168b5d0fb4 Guenter Roeck 2015-08-26 821 hdev->parent = dev;
d560168b5d0fb4 Guenter Roeck 2015-08-26 822 hdev->of_node = dev ? dev->of_node : NULL;
d560168b5d0fb4 Guenter Roeck 2015-08-26 823 hwdev->chip = chip;
d560168b5d0fb4 Guenter Roeck 2015-08-26 824 dev_set_drvdata(hdev, drvdata);
d560168b5d0fb4 Guenter Roeck 2015-08-26 825 dev_set_name(hdev, HWMON_ID_FORMAT, id);
d560168b5d0fb4 Guenter Roeck 2015-08-26 826 err = device_register(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 827 if (err) {
ada61aa0b1184a Yang Yingliang 2021-10-12 828 put_device(hdev);
ada61aa0b1184a Yang Yingliang 2021-10-12 829 goto ida_remove;
ada61aa0b1184a Yang Yingliang 2021-10-12 830 }
d560168b5d0fb4 Guenter Roeck 2015-08-26 831
1597b374af2226 Guenter Roeck 2020-05-28 832 INIT_LIST_HEAD(&hwdev->tzdata);
1597b374af2226 Guenter Roeck 2020-05-28 833
c41dd48e21fae3 Eduardo Valentin 2019-05-29 834 if (dev && dev->of_node && chip && chip->ops->read &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 835 chip->info[0]->type == hwmon_chip &&
d560168b5d0fb4 Guenter Roeck 2015-08-26 836 (chip->info[0]->config[0] & HWMON_C_REGISTER_TZ)) {
44e3ad882bb268 Akinobu Mita 2020-05-04 837 err = hwmon_thermal_register_sensors(hdev);
74e3512731bd5c Dmitry Osipenko 2018-10-24 838 if (err) {
74e3512731bd5c Dmitry Osipenko 2018-10-24 839 device_unregister(hdev);
792eac18431967 Guenter Roeck 2019-06-06 840 /*
44e3ad882bb268 Akinobu Mita 2020-05-04 841 * Don't worry about hwdev; hwmon_dev_release(), called
44e3ad882bb268 Akinobu Mita 2020-05-04 842 * from device_unregister(), will free it.
792eac18431967 Guenter Roeck 2019-06-06 843 */
74e3512731bd5c Dmitry Osipenko 2018-10-24 844 goto ida_remove;
74e3512731bd5c Dmitry Osipenko 2018-10-24 845 }
47c332deb8e89f Linus Walleij 2017-12-05 846 }
bab2243ce18978 Guenter Roeck 2013-07-06 847
d560168b5d0fb4 Guenter Roeck 2015-08-26 848 return hdev;
bab2243ce18978 Guenter Roeck 2013-07-06 849
d560168b5d0fb4 Guenter Roeck 2015-08-26 850 free_hwmon:
3bf8bdcf3bada7 Guenter Roeck 2020-01-16 @851 hwmon_dev_release(hdev);
bab2243ce18978 Guenter Roeck 2013-07-06 852 ida_remove:
4ca5f468cc2a0b Jonathan Cameron 2011-10-31 853 ida_simple_remove(&hwmon_ida, id);
bab2243ce18978 Guenter Roeck 2013-07-06 @854 return ERR_PTR(err);
bab2243ce18978 Guenter Roeck 2013-07-06 855 }
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 7+ messages in thread