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