hwmon: (nct6775) Rearrange attr-group initialization
authorZev Weiss <zev@bewilderbeest.net>
Wed, 27 Apr 2022 01:01:50 +0000 (18:01 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Fri, 20 May 2022 17:57:06 +0000 (10:57 -0700)
We now track the number of attribute groups in nct6775_data, as a
measure to simplify handling differences in the set of enabled
attribute groups between nct6775 drivers (platform & i2c).  As a side
effect, we also reduce the amount of IS_ERR()/PTR_ERR() boilerplate a
bit.

Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Link: https://lore.kernel.org/r/20220427010154.29749-4-zev@bewilderbeest.net
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/nct6775.c

index be99a18..36bdbb1 100644 (file)
@@ -1199,6 +1199,7 @@ struct nct6775_data {
        const char *name;
 
        const struct attribute_group *groups[7];
+       u8 num_groups;
 
        u16 reg_temp[5][NUM_TEMP]; /* 0=temp, 1=temp_over, 2=temp_hyst,
                                    * 3=temp_crit, 4=temp_lcrit
@@ -1404,10 +1405,18 @@ struct sensor_template_group {
        int base;
 };
 
-static struct attribute_group *
-nct6775_create_attr_group(struct device *dev,
-                         const struct sensor_template_group *tg,
-                         int repeat)
+static int nct6775_add_attr_group(struct nct6775_data *data, const struct attribute_group *group)
+{
+       /* Need to leave a NULL terminator at the end of data->groups */
+       if (data->num_groups == ARRAY_SIZE(data->groups) - 1)
+               return -ENOBUFS;
+
+       data->groups[data->num_groups++] = group;
+       return 0;
+}
+
+static int nct6775_add_template_attr_group(struct device *dev, struct nct6775_data *data,
+                                          const struct sensor_template_group *tg, int repeat)
 {
        struct attribute_group *group;
        struct sensor_device_attr_u *su;
@@ -1418,28 +1427,28 @@ nct6775_create_attr_group(struct device *dev,
        int i, count;
 
        if (repeat <= 0)
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
 
        t = tg->templates;
        for (count = 0; *t; t++, count++)
                ;
 
        if (count == 0)
-               return ERR_PTR(-EINVAL);
+               return -EINVAL;
 
        group = devm_kzalloc(dev, sizeof(*group), GFP_KERNEL);
        if (group == NULL)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        attrs = devm_kcalloc(dev, repeat * count + 1, sizeof(*attrs),
                             GFP_KERNEL);
        if (attrs == NULL)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        su = devm_kzalloc(dev, array3_size(repeat, count, sizeof(*su)),
                               GFP_KERNEL);
        if (su == NULL)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        group->attrs = attrs;
        group->is_visible = tg->is_visible;
@@ -1477,7 +1486,7 @@ nct6775_create_attr_group(struct device *dev,
                }
        }
 
-       return group;
+       return nct6775_add_attr_group(data, group);
 }
 
 static bool is_word_sized(struct nct6775_data *data, u16 reg)
@@ -4316,11 +4325,9 @@ static int nct6775_probe(struct platform_device *pdev)
        const u16 *reg_temp_crit_l = NULL, *reg_temp_crit_h = NULL;
        int num_reg_temp, num_reg_temp_mon, num_reg_tsi_temp;
        u8 cr2a;
-       struct attribute_group *group;
        struct device *hwmon_dev;
        struct sensor_template_group tsi_temp_tg;
        const struct regmap_config *regmapcfg;
-       int num_attr_groups = 0;
 
        if (sio_data->access == access_direct) {
                res = platform_get_resource(pdev, IORESOURCE_IO, 0);
@@ -5165,46 +5172,39 @@ static int nct6775_probe(struct platform_device *pdev)
                return err;
 
        /* Register sysfs hooks */
-       group = nct6775_create_attr_group(dev, &nct6775_pwm_template_group,
-                                         data->pwm_num);
-       if (IS_ERR(group))
-               return PTR_ERR(group);
-
-       data->groups[num_attr_groups++] = group;
-
-       group = nct6775_create_attr_group(dev, &nct6775_in_template_group,
-                                         fls(data->have_in));
-       if (IS_ERR(group))
-               return PTR_ERR(group);
-
-       data->groups[num_attr_groups++] = group;
-
-       group = nct6775_create_attr_group(dev, &nct6775_fan_template_group,
-                                         fls(data->has_fan));
-       if (IS_ERR(group))
-               return PTR_ERR(group);
+       err = nct6775_add_template_attr_group(dev, data, &nct6775_pwm_template_group,
+                                             data->pwm_num);
+       if (err)
+               return err;
 
-       data->groups[num_attr_groups++] = group;
+       err = nct6775_add_template_attr_group(dev, data, &nct6775_in_template_group,
+                                             fls(data->have_in));
+       if (err)
+               return err;
 
-       group = nct6775_create_attr_group(dev, &nct6775_temp_template_group,
-                                         fls(data->have_temp));
-       if (IS_ERR(group))
-               return PTR_ERR(group);
+       err = nct6775_add_template_attr_group(dev, data, &nct6775_fan_template_group,
+                                             fls(data->has_fan));
+       if (err)
+               return err;
 
-       data->groups[num_attr_groups++] = group;
+       err = nct6775_add_template_attr_group(dev, data, &nct6775_temp_template_group,
+                                             fls(data->have_temp));
+       if (err)
+               return err;
 
        if (data->have_tsi_temp) {
                tsi_temp_tg.templates = nct6775_tsi_temp_template;
                tsi_temp_tg.is_visible = nct6775_tsi_temp_is_visible;
                tsi_temp_tg.base = fls(data->have_temp) + 1;
-               group = nct6775_create_attr_group(dev, &tsi_temp_tg, fls(data->have_tsi_temp));
-               if (IS_ERR(group))
-                       return PTR_ERR(group);
-
-               data->groups[num_attr_groups++] = group;
+               err = nct6775_add_template_attr_group(dev, data, &tsi_temp_tg,
+                                                     fls(data->have_tsi_temp));
+               if (err)
+                       return err;
        }
 
-       data->groups[num_attr_groups++] = &nct6775_group_other;
+       err = nct6775_add_attr_group(data, &nct6775_group_other);
+       if (err)
+               return err;
 
        hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name,
                                                           data, data->groups);