Message ID | 20220111173239.21006-2-michaelsh@nvidia.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | hwmon: powr1220: add powr104 support | expand |
On Tue, Jan 11, 2022 at 07:32:38PM +0200, michaelsh@nvidia.com wrote: > From: Michael Shych <michaelsh@nvidia.com> > > Reduce code by using devm_hwmon_device_register_with_groups() API by > devm_hwmon_device_register_with_info() API. > The motivation is to reduce code and to allow easy support for similar > devices by the same driver. > > Signed-off-by: Michael Shych <michaelsh@nvidia.com> > Reviewed-by: Vadim Pasternak <vadimp@nvidia.com> There are vaious unrelated changes in this patch: Multi-line alignment changes, and udelay() -> usleep(). Especially tyhe latter may introduce a significant additional delay; it often results in long sleep times (the kernel may sleep as long as it wants). This can have significant performance impact. It would probably be much better to use usleep_range() since that provides an upper bound for the sleep time. Please split unrelated changes into separate patch(es). Thanks, Guenter > --- > drivers/hwmon/powr1220.c | 216 +++++++++++++++++++++-------------------------- > 1 file changed, 95 insertions(+), 121 deletions(-) > > diff --git a/drivers/hwmon/powr1220.c b/drivers/hwmon/powr1220.c > index 9e086338dcba..1b833781e89d 100644 > --- a/drivers/hwmon/powr1220.c > +++ b/drivers/hwmon/powr1220.c > @@ -111,7 +111,7 @@ static int powr1220_read_adc(struct device *dev, int ch_num) > mutex_lock(&data->update_lock); > > if (time_after(jiffies, data->adc_last_updated[ch_num] + HZ) || > - !data->adc_valid[ch_num]) { > + !data->adc_valid[ch_num]) { > /* > * figure out if we need to use the attenuator for > * high inputs or inputs that we don't yet have a measurement > @@ -119,12 +119,12 @@ static int powr1220_read_adc(struct device *dev, int ch_num) > * max reading. > */ > if (data->adc_maxes[ch_num] > ADC_MAX_LOW_MEASUREMENT_MV || > - data->adc_maxes[ch_num] == 0) > + data->adc_maxes[ch_num] == 0) > adc_range = 1 << 4; > > /* set the attenuator and mux */ > result = i2c_smbus_write_byte_data(data->client, ADC_MUX, > - adc_range | ch_num); > + adc_range | ch_num); > if (result) > goto exit; > > @@ -132,7 +132,7 @@ static int powr1220_read_adc(struct device *dev, int ch_num) > * wait at least Tconvert time (200 us) for the > * conversion to complete > */ > - udelay(200); > + usleep(200); > > /* get the ADC reading */ > result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_LOW); > @@ -163,139 +163,112 @@ static int powr1220_read_adc(struct device *dev, int ch_num) > > exit: > mutex_unlock(&data->update_lock); > - > return result; > } > > -/* Shows the voltage associated with the specified ADC channel */ > -static ssize_t powr1220_voltage_show(struct device *dev, > - struct device_attribute *dev_attr, > - char *buf) > +static umode_t > +powr1220_is_visible(const void *data, enum hwmon_sensor_types type, u32 > + attr, int channel) > { > - struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); > - int adc_val = powr1220_read_adc(dev, attr->index); > - > - if (adc_val < 0) > - return adc_val; > + switch (type) { > + case hwmon_in: > + switch (attr) { > + case hwmon_in_input: > + case hwmon_in_highest: > + case hwmon_in_label: > + return 0444; > + default: > + break; > + } > + > + default: > + break; > + } > > - return sprintf(buf, "%d\n", adc_val); > + return 0; > } > > -/* Shows the maximum setting associated with the specified ADC channel */ > -static ssize_t powr1220_max_show(struct device *dev, > - struct device_attribute *dev_attr, char *buf) > +static int > +powr1220_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr, > + int channel, const char **str) > { > - struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); > - struct powr1220_data *data = dev_get_drvdata(dev); > + switch (type) { > + case hwmon_in: > + switch (attr) { > + case hwmon_in_label: > + *str = input_names[channel]; > + return 0; > + default: > + return -EOPNOTSUPP; > + } > + break; > + default: > + return -EOPNOTSUPP; > + } > > - return sprintf(buf, "%d\n", data->adc_maxes[attr->index]); > + return -EOPNOTSUPP; > } > > -/* Shows the label associated with the specified ADC channel */ > -static ssize_t powr1220_label_show(struct device *dev, > - struct device_attribute *dev_attr, > - char *buf) > +static int > +powr1220_read(struct device *dev, enum hwmon_sensor_types type, u32 > + attr, int channel, long *val) > { > - struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); > + struct powr1220_data *data = dev_get_drvdata(dev); > + int ret; > + > + switch (type) { > + case hwmon_in: > + switch (attr) { > + case hwmon_in_input: > + ret = powr1220_read_adc(dev, channel); > + if (ret < 0) > + return ret; > + *val = ret; > + break; > + case hwmon_in_highest: > + *val = data->adc_maxes[channel]; > + break; > + default: > + return -EOPNOTSUPP; > + } > + break; > + default: > + return -EOPNOTSUPP; > + } > > - return sprintf(buf, "%s\n", input_names[attr->index]); > + return 0; > } > > -static SENSOR_DEVICE_ATTR_RO(in0_input, powr1220_voltage, VMON1); > -static SENSOR_DEVICE_ATTR_RO(in1_input, powr1220_voltage, VMON2); > -static SENSOR_DEVICE_ATTR_RO(in2_input, powr1220_voltage, VMON3); > -static SENSOR_DEVICE_ATTR_RO(in3_input, powr1220_voltage, VMON4); > -static SENSOR_DEVICE_ATTR_RO(in4_input, powr1220_voltage, VMON5); > -static SENSOR_DEVICE_ATTR_RO(in5_input, powr1220_voltage, VMON6); > -static SENSOR_DEVICE_ATTR_RO(in6_input, powr1220_voltage, VMON7); > -static SENSOR_DEVICE_ATTR_RO(in7_input, powr1220_voltage, VMON8); > -static SENSOR_DEVICE_ATTR_RO(in8_input, powr1220_voltage, VMON9); > -static SENSOR_DEVICE_ATTR_RO(in9_input, powr1220_voltage, VMON10); > -static SENSOR_DEVICE_ATTR_RO(in10_input, powr1220_voltage, VMON11); > -static SENSOR_DEVICE_ATTR_RO(in11_input, powr1220_voltage, VMON12); > -static SENSOR_DEVICE_ATTR_RO(in12_input, powr1220_voltage, VCCA); > -static SENSOR_DEVICE_ATTR_RO(in13_input, powr1220_voltage, VCCINP); > - > -static SENSOR_DEVICE_ATTR_RO(in0_highest, powr1220_max, VMON1); > -static SENSOR_DEVICE_ATTR_RO(in1_highest, powr1220_max, VMON2); > -static SENSOR_DEVICE_ATTR_RO(in2_highest, powr1220_max, VMON3); > -static SENSOR_DEVICE_ATTR_RO(in3_highest, powr1220_max, VMON4); > -static SENSOR_DEVICE_ATTR_RO(in4_highest, powr1220_max, VMON5); > -static SENSOR_DEVICE_ATTR_RO(in5_highest, powr1220_max, VMON6); > -static SENSOR_DEVICE_ATTR_RO(in6_highest, powr1220_max, VMON7); > -static SENSOR_DEVICE_ATTR_RO(in7_highest, powr1220_max, VMON8); > -static SENSOR_DEVICE_ATTR_RO(in8_highest, powr1220_max, VMON9); > -static SENSOR_DEVICE_ATTR_RO(in9_highest, powr1220_max, VMON10); > -static SENSOR_DEVICE_ATTR_RO(in10_highest, powr1220_max, VMON11); > -static SENSOR_DEVICE_ATTR_RO(in11_highest, powr1220_max, VMON12); > -static SENSOR_DEVICE_ATTR_RO(in12_highest, powr1220_max, VCCA); > -static SENSOR_DEVICE_ATTR_RO(in13_highest, powr1220_max, VCCINP); > - > -static SENSOR_DEVICE_ATTR_RO(in0_label, powr1220_label, VMON1); > -static SENSOR_DEVICE_ATTR_RO(in1_label, powr1220_label, VMON2); > -static SENSOR_DEVICE_ATTR_RO(in2_label, powr1220_label, VMON3); > -static SENSOR_DEVICE_ATTR_RO(in3_label, powr1220_label, VMON4); > -static SENSOR_DEVICE_ATTR_RO(in4_label, powr1220_label, VMON5); > -static SENSOR_DEVICE_ATTR_RO(in5_label, powr1220_label, VMON6); > -static SENSOR_DEVICE_ATTR_RO(in6_label, powr1220_label, VMON7); > -static SENSOR_DEVICE_ATTR_RO(in7_label, powr1220_label, VMON8); > -static SENSOR_DEVICE_ATTR_RO(in8_label, powr1220_label, VMON9); > -static SENSOR_DEVICE_ATTR_RO(in9_label, powr1220_label, VMON10); > -static SENSOR_DEVICE_ATTR_RO(in10_label, powr1220_label, VMON11); > -static SENSOR_DEVICE_ATTR_RO(in11_label, powr1220_label, VMON12); > -static SENSOR_DEVICE_ATTR_RO(in12_label, powr1220_label, VCCA); > -static SENSOR_DEVICE_ATTR_RO(in13_label, powr1220_label, VCCINP); > - > -static struct attribute *powr1220_attrs[] = { > - &sensor_dev_attr_in0_input.dev_attr.attr, > - &sensor_dev_attr_in1_input.dev_attr.attr, > - &sensor_dev_attr_in2_input.dev_attr.attr, > - &sensor_dev_attr_in3_input.dev_attr.attr, > - &sensor_dev_attr_in4_input.dev_attr.attr, > - &sensor_dev_attr_in5_input.dev_attr.attr, > - &sensor_dev_attr_in6_input.dev_attr.attr, > - &sensor_dev_attr_in7_input.dev_attr.attr, > - &sensor_dev_attr_in8_input.dev_attr.attr, > - &sensor_dev_attr_in9_input.dev_attr.attr, > - &sensor_dev_attr_in10_input.dev_attr.attr, > - &sensor_dev_attr_in11_input.dev_attr.attr, > - &sensor_dev_attr_in12_input.dev_attr.attr, > - &sensor_dev_attr_in13_input.dev_attr.attr, > - > - &sensor_dev_attr_in0_highest.dev_attr.attr, > - &sensor_dev_attr_in1_highest.dev_attr.attr, > - &sensor_dev_attr_in2_highest.dev_attr.attr, > - &sensor_dev_attr_in3_highest.dev_attr.attr, > - &sensor_dev_attr_in4_highest.dev_attr.attr, > - &sensor_dev_attr_in5_highest.dev_attr.attr, > - &sensor_dev_attr_in6_highest.dev_attr.attr, > - &sensor_dev_attr_in7_highest.dev_attr.attr, > - &sensor_dev_attr_in8_highest.dev_attr.attr, > - &sensor_dev_attr_in9_highest.dev_attr.attr, > - &sensor_dev_attr_in10_highest.dev_attr.attr, > - &sensor_dev_attr_in11_highest.dev_attr.attr, > - &sensor_dev_attr_in12_highest.dev_attr.attr, > - &sensor_dev_attr_in13_highest.dev_attr.attr, > - > - &sensor_dev_attr_in0_label.dev_attr.attr, > - &sensor_dev_attr_in1_label.dev_attr.attr, > - &sensor_dev_attr_in2_label.dev_attr.attr, > - &sensor_dev_attr_in3_label.dev_attr.attr, > - &sensor_dev_attr_in4_label.dev_attr.attr, > - &sensor_dev_attr_in5_label.dev_attr.attr, > - &sensor_dev_attr_in6_label.dev_attr.attr, > - &sensor_dev_attr_in7_label.dev_attr.attr, > - &sensor_dev_attr_in8_label.dev_attr.attr, > - &sensor_dev_attr_in9_label.dev_attr.attr, > - &sensor_dev_attr_in10_label.dev_attr.attr, > - &sensor_dev_attr_in11_label.dev_attr.attr, > - &sensor_dev_attr_in12_label.dev_attr.attr, > - &sensor_dev_attr_in13_label.dev_attr.attr, > +static const struct hwmon_channel_info *powr1220_info[] = { > + HWMON_CHANNEL_INFO(in, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, > + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL), > > NULL > }; > > -ATTRIBUTE_GROUPS(powr1220); > +static const struct hwmon_ops powr1220_hwmon_ops = { > + .read = powr1220_read, > + .read_string = powr1220_read_string, > + .is_visible = powr1220_is_visible, > +}; > + > +static const struct hwmon_chip_info powr1220_chip_info = { > + .ops = &powr1220_hwmon_ops, > + .info = powr1220_info, > +}; > > static int powr1220_probe(struct i2c_client *client) > { > @@ -312,9 +285,10 @@ static int powr1220_probe(struct i2c_client *client) > mutex_init(&data->update_lock); > data->client = client; > > - hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev, > - client->name, data, powr1220_groups); > - > + hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, > + client->name, data, > + &powr1220_chip_info, > + NULL); > return PTR_ERR_OR_ZERO(hwmon_dev); > } >
diff --git a/drivers/hwmon/powr1220.c b/drivers/hwmon/powr1220.c index 9e086338dcba..1b833781e89d 100644 --- a/drivers/hwmon/powr1220.c +++ b/drivers/hwmon/powr1220.c @@ -111,7 +111,7 @@ static int powr1220_read_adc(struct device *dev, int ch_num) mutex_lock(&data->update_lock); if (time_after(jiffies, data->adc_last_updated[ch_num] + HZ) || - !data->adc_valid[ch_num]) { + !data->adc_valid[ch_num]) { /* * figure out if we need to use the attenuator for * high inputs or inputs that we don't yet have a measurement @@ -119,12 +119,12 @@ static int powr1220_read_adc(struct device *dev, int ch_num) * max reading. */ if (data->adc_maxes[ch_num] > ADC_MAX_LOW_MEASUREMENT_MV || - data->adc_maxes[ch_num] == 0) + data->adc_maxes[ch_num] == 0) adc_range = 1 << 4; /* set the attenuator and mux */ result = i2c_smbus_write_byte_data(data->client, ADC_MUX, - adc_range | ch_num); + adc_range | ch_num); if (result) goto exit; @@ -132,7 +132,7 @@ static int powr1220_read_adc(struct device *dev, int ch_num) * wait at least Tconvert time (200 us) for the * conversion to complete */ - udelay(200); + usleep(200); /* get the ADC reading */ result = i2c_smbus_read_byte_data(data->client, ADC_VALUE_LOW); @@ -163,139 +163,112 @@ static int powr1220_read_adc(struct device *dev, int ch_num) exit: mutex_unlock(&data->update_lock); - return result; } -/* Shows the voltage associated with the specified ADC channel */ -static ssize_t powr1220_voltage_show(struct device *dev, - struct device_attribute *dev_attr, - char *buf) +static umode_t +powr1220_is_visible(const void *data, enum hwmon_sensor_types type, u32 + attr, int channel) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); - int adc_val = powr1220_read_adc(dev, attr->index); - - if (adc_val < 0) - return adc_val; + switch (type) { + case hwmon_in: + switch (attr) { + case hwmon_in_input: + case hwmon_in_highest: + case hwmon_in_label: + return 0444; + default: + break; + } + + default: + break; + } - return sprintf(buf, "%d\n", adc_val); + return 0; } -/* Shows the maximum setting associated with the specified ADC channel */ -static ssize_t powr1220_max_show(struct device *dev, - struct device_attribute *dev_attr, char *buf) +static int +powr1220_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr, + int channel, const char **str) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); - struct powr1220_data *data = dev_get_drvdata(dev); + switch (type) { + case hwmon_in: + switch (attr) { + case hwmon_in_label: + *str = input_names[channel]; + return 0; + default: + return -EOPNOTSUPP; + } + break; + default: + return -EOPNOTSUPP; + } - return sprintf(buf, "%d\n", data->adc_maxes[attr->index]); + return -EOPNOTSUPP; } -/* Shows the label associated with the specified ADC channel */ -static ssize_t powr1220_label_show(struct device *dev, - struct device_attribute *dev_attr, - char *buf) +static int +powr1220_read(struct device *dev, enum hwmon_sensor_types type, u32 + attr, int channel, long *val) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct powr1220_data *data = dev_get_drvdata(dev); + int ret; + + switch (type) { + case hwmon_in: + switch (attr) { + case hwmon_in_input: + ret = powr1220_read_adc(dev, channel); + if (ret < 0) + return ret; + *val = ret; + break; + case hwmon_in_highest: + *val = data->adc_maxes[channel]; + break; + default: + return -EOPNOTSUPP; + } + break; + default: + return -EOPNOTSUPP; + } - return sprintf(buf, "%s\n", input_names[attr->index]); + return 0; } -static SENSOR_DEVICE_ATTR_RO(in0_input, powr1220_voltage, VMON1); -static SENSOR_DEVICE_ATTR_RO(in1_input, powr1220_voltage, VMON2); -static SENSOR_DEVICE_ATTR_RO(in2_input, powr1220_voltage, VMON3); -static SENSOR_DEVICE_ATTR_RO(in3_input, powr1220_voltage, VMON4); -static SENSOR_DEVICE_ATTR_RO(in4_input, powr1220_voltage, VMON5); -static SENSOR_DEVICE_ATTR_RO(in5_input, powr1220_voltage, VMON6); -static SENSOR_DEVICE_ATTR_RO(in6_input, powr1220_voltage, VMON7); -static SENSOR_DEVICE_ATTR_RO(in7_input, powr1220_voltage, VMON8); -static SENSOR_DEVICE_ATTR_RO(in8_input, powr1220_voltage, VMON9); -static SENSOR_DEVICE_ATTR_RO(in9_input, powr1220_voltage, VMON10); -static SENSOR_DEVICE_ATTR_RO(in10_input, powr1220_voltage, VMON11); -static SENSOR_DEVICE_ATTR_RO(in11_input, powr1220_voltage, VMON12); -static SENSOR_DEVICE_ATTR_RO(in12_input, powr1220_voltage, VCCA); -static SENSOR_DEVICE_ATTR_RO(in13_input, powr1220_voltage, VCCINP); - -static SENSOR_DEVICE_ATTR_RO(in0_highest, powr1220_max, VMON1); -static SENSOR_DEVICE_ATTR_RO(in1_highest, powr1220_max, VMON2); -static SENSOR_DEVICE_ATTR_RO(in2_highest, powr1220_max, VMON3); -static SENSOR_DEVICE_ATTR_RO(in3_highest, powr1220_max, VMON4); -static SENSOR_DEVICE_ATTR_RO(in4_highest, powr1220_max, VMON5); -static SENSOR_DEVICE_ATTR_RO(in5_highest, powr1220_max, VMON6); -static SENSOR_DEVICE_ATTR_RO(in6_highest, powr1220_max, VMON7); -static SENSOR_DEVICE_ATTR_RO(in7_highest, powr1220_max, VMON8); -static SENSOR_DEVICE_ATTR_RO(in8_highest, powr1220_max, VMON9); -static SENSOR_DEVICE_ATTR_RO(in9_highest, powr1220_max, VMON10); -static SENSOR_DEVICE_ATTR_RO(in10_highest, powr1220_max, VMON11); -static SENSOR_DEVICE_ATTR_RO(in11_highest, powr1220_max, VMON12); -static SENSOR_DEVICE_ATTR_RO(in12_highest, powr1220_max, VCCA); -static SENSOR_DEVICE_ATTR_RO(in13_highest, powr1220_max, VCCINP); - -static SENSOR_DEVICE_ATTR_RO(in0_label, powr1220_label, VMON1); -static SENSOR_DEVICE_ATTR_RO(in1_label, powr1220_label, VMON2); -static SENSOR_DEVICE_ATTR_RO(in2_label, powr1220_label, VMON3); -static SENSOR_DEVICE_ATTR_RO(in3_label, powr1220_label, VMON4); -static SENSOR_DEVICE_ATTR_RO(in4_label, powr1220_label, VMON5); -static SENSOR_DEVICE_ATTR_RO(in5_label, powr1220_label, VMON6); -static SENSOR_DEVICE_ATTR_RO(in6_label, powr1220_label, VMON7); -static SENSOR_DEVICE_ATTR_RO(in7_label, powr1220_label, VMON8); -static SENSOR_DEVICE_ATTR_RO(in8_label, powr1220_label, VMON9); -static SENSOR_DEVICE_ATTR_RO(in9_label, powr1220_label, VMON10); -static SENSOR_DEVICE_ATTR_RO(in10_label, powr1220_label, VMON11); -static SENSOR_DEVICE_ATTR_RO(in11_label, powr1220_label, VMON12); -static SENSOR_DEVICE_ATTR_RO(in12_label, powr1220_label, VCCA); -static SENSOR_DEVICE_ATTR_RO(in13_label, powr1220_label, VCCINP); - -static struct attribute *powr1220_attrs[] = { - &sensor_dev_attr_in0_input.dev_attr.attr, - &sensor_dev_attr_in1_input.dev_attr.attr, - &sensor_dev_attr_in2_input.dev_attr.attr, - &sensor_dev_attr_in3_input.dev_attr.attr, - &sensor_dev_attr_in4_input.dev_attr.attr, - &sensor_dev_attr_in5_input.dev_attr.attr, - &sensor_dev_attr_in6_input.dev_attr.attr, - &sensor_dev_attr_in7_input.dev_attr.attr, - &sensor_dev_attr_in8_input.dev_attr.attr, - &sensor_dev_attr_in9_input.dev_attr.attr, - &sensor_dev_attr_in10_input.dev_attr.attr, - &sensor_dev_attr_in11_input.dev_attr.attr, - &sensor_dev_attr_in12_input.dev_attr.attr, - &sensor_dev_attr_in13_input.dev_attr.attr, - - &sensor_dev_attr_in0_highest.dev_attr.attr, - &sensor_dev_attr_in1_highest.dev_attr.attr, - &sensor_dev_attr_in2_highest.dev_attr.attr, - &sensor_dev_attr_in3_highest.dev_attr.attr, - &sensor_dev_attr_in4_highest.dev_attr.attr, - &sensor_dev_attr_in5_highest.dev_attr.attr, - &sensor_dev_attr_in6_highest.dev_attr.attr, - &sensor_dev_attr_in7_highest.dev_attr.attr, - &sensor_dev_attr_in8_highest.dev_attr.attr, - &sensor_dev_attr_in9_highest.dev_attr.attr, - &sensor_dev_attr_in10_highest.dev_attr.attr, - &sensor_dev_attr_in11_highest.dev_attr.attr, - &sensor_dev_attr_in12_highest.dev_attr.attr, - &sensor_dev_attr_in13_highest.dev_attr.attr, - - &sensor_dev_attr_in0_label.dev_attr.attr, - &sensor_dev_attr_in1_label.dev_attr.attr, - &sensor_dev_attr_in2_label.dev_attr.attr, - &sensor_dev_attr_in3_label.dev_attr.attr, - &sensor_dev_attr_in4_label.dev_attr.attr, - &sensor_dev_attr_in5_label.dev_attr.attr, - &sensor_dev_attr_in6_label.dev_attr.attr, - &sensor_dev_attr_in7_label.dev_attr.attr, - &sensor_dev_attr_in8_label.dev_attr.attr, - &sensor_dev_attr_in9_label.dev_attr.attr, - &sensor_dev_attr_in10_label.dev_attr.attr, - &sensor_dev_attr_in11_label.dev_attr.attr, - &sensor_dev_attr_in12_label.dev_attr.attr, - &sensor_dev_attr_in13_label.dev_attr.attr, +static const struct hwmon_channel_info *powr1220_info[] = { + HWMON_CHANNEL_INFO(in, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL, + HWMON_I_INPUT | HWMON_I_HIGHEST | HWMON_I_LABEL), NULL }; -ATTRIBUTE_GROUPS(powr1220); +static const struct hwmon_ops powr1220_hwmon_ops = { + .read = powr1220_read, + .read_string = powr1220_read_string, + .is_visible = powr1220_is_visible, +}; + +static const struct hwmon_chip_info powr1220_chip_info = { + .ops = &powr1220_hwmon_ops, + .info = powr1220_info, +}; static int powr1220_probe(struct i2c_client *client) { @@ -312,9 +285,10 @@ static int powr1220_probe(struct i2c_client *client) mutex_init(&data->update_lock); data->client = client; - hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev, - client->name, data, powr1220_groups); - + hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, + client->name, data, + &powr1220_chip_info, + NULL); return PTR_ERR_OR_ZERO(hwmon_dev); }