Shilpasri G Bhat <shilpa.b...@linux.vnet.ibm.com> writes:
> diff --git a/drivers/hwmon/ibmpowernv.c b/drivers/hwmon/ibmpowernv.c
> index f829dad..99afbf7 100644
> --- a/drivers/hwmon/ibmpowernv.c
> +++ b/drivers/hwmon/ibmpowernv.c
> @@ -292,12 +344,126 @@ static u32 get_sensor_hwmon_index(struct sensor_data 
> *sdata,
>       return ++sensor_groups[sdata->type].hwmon_index;
>  }
>  
> +static int init_sensor_group_data(struct platform_device *pdev,
> +                               struct platform_data *pdata)
> +{
> +     struct sensor_group_data *sgrp_data;
> +     struct device_node *groups, *sgrp;
> +     enum sensors type;
> +     int count = 0, ret = 0;
> +
> +     groups = of_find_compatible_node(NULL, NULL, "ibm,opal-sensor-group");
> +     if (!groups)
> +             return ret;
> +
> +     for_each_child_of_node(groups, sgrp) {
> +             type = get_sensor_type(sgrp);
> +             if (type != MAX_SENSOR_TYPE)
> +                     pdata->nr_sensor_groups++;
> +     }
> +
> +     if (!pdata->nr_sensor_groups)
> +             goto out;
> +
> +     sgrp_data = devm_kcalloc(&pdev->dev, pdata->nr_sensor_groups,
> +                              sizeof(*sgrp_data), GFP_KERNEL);
> +     if (!sgrp_data) {
> +             ret = -ENOMEM;
> +             goto out;
> +     }
> +
> +     for_each_child_of_node(groups, sgrp) {
> +             const __be32 *phandles;
> +             int len, gid;
> +
> +             type = get_sensor_type(sgrp);
> +             if (type == MAX_SENSOR_TYPE)
> +                     continue;
> +
> +             if (of_property_read_u32(sgrp, "sensor-group-id", &gid))
> +                     continue;
> +
> +             phandles = of_get_property(sgrp, "sensors", &len);
> +             if (!phandles)
> +                     continue;

You should be able to use the more modern OF APIs, eg:

                rc = of_count_phandle_with_args(sgrp, "sensors", NULL);

> +             len /= sizeof(u32);
> +             if (!len)
> +                     continue;

Which would make that check unnecessary.

> +             sensor_groups[type].attr_count++;
> +             sgrp_data[count].gid = gid;
> +             mutex_init(&sgrp_data[count].mutex);
> +             sgrp_data[count++].enable = false;
> +     }
> +
> +     pdata->sgrp_data = sgrp_data;
> +out:
> +     of_node_put(groups);
> +     return ret;
> +}
> +
> +static struct sensor_group_data *get_sensor_group(struct platform_data 
> *pdata,
> +                                               struct device_node *node,
> +                                               enum sensors gtype)
> +{
> +     struct sensor_group_data *sgrp_data = pdata->sgrp_data;
> +     struct device_node *groups, *sgrp;
> +
> +     groups = of_find_compatible_node(NULL, NULL, "ibm,opal-sensor-group");
> +     if (!groups)
> +             return NULL;
> +
> +     for_each_child_of_node(groups, sgrp) {
> +             const __be32 *phandles;
> +             int len, gid, i;
> +             enum sensors type;
> +
> +             type = get_sensor_type(sgrp);
> +             if (type != gtype)
> +                     continue;
> +
> +             if (of_property_read_u32(sgrp, "sensor-group-id", &gid))
> +                     continue;
> +
> +             phandles = of_get_property(sgrp, "sensors", &len);
> +             if (!phandles)
> +                     continue;
> +
> +             len /= sizeof(u32);
> +             if (!len)
> +                     continue;
> +
> +             while (--len >= 0)
> +                     if (be32_to_cpu(phandles[len]) == node->phandle)
> +                             break;

Likewise, here you could use of_for_each_phandle().


cheers

Reply via email to