Re: [PATCH v1] hwmon: (tmp103) Convert tmp103 to use new hwmon registration API

From: Guenter Roeck
Date: Fri Oct 08 2021 - 10:19:06 EST


On Thu, Oct 07, 2021 at 02:53:01PM +0200, Oleksij Rempel wrote:
> Use devm_hwmon_device_register_with_info() which will make thermal framework
> work.
>
> Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx>

Applied.

Thanks,
Guenter

> ---
> drivers/hwmon/tmp103.c | 105 +++++++++++++++++++++++++++++------------
> 1 file changed, 74 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/hwmon/tmp103.c b/drivers/hwmon/tmp103.c
> index a7e202cc8323..5cab4436aa77 100644
> --- a/drivers/hwmon/tmp103.c
> +++ b/drivers/hwmon/tmp103.c
> @@ -51,51 +51,92 @@ static inline u8 tmp103_mc_to_reg(int val)
> return DIV_ROUND_CLOSEST(val, 1000);
> }
>
> -static ssize_t tmp103_temp_show(struct device *dev,
> - struct device_attribute *attr, char *buf)
> +static int tmp103_read(struct device *dev, enum hwmon_sensor_types type,
> + u32 attr, int channel, long *temp)
> {
> - struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
> struct regmap *regmap = dev_get_drvdata(dev);
> unsigned int regval;
> - int ret;
> + int err, reg;
> +
> + switch (attr) {
> + case hwmon_temp_input:
> + reg = TMP103_TEMP_REG;
> + break;
> + case hwmon_temp_min:
> + reg = TMP103_TLOW_REG;
> + break;
> + case hwmon_temp_max:
> + reg = TMP103_THIGH_REG;
> + break;
> + default:
> + return -EOPNOTSUPP;
> + }
>
> - ret = regmap_read(regmap, sda->index, &regval);
> - if (ret < 0)
> - return ret;
> + err = regmap_read(regmap, reg, &regval);
> + if (err < 0)
> + return err;
> +
> + *temp = tmp103_reg_to_mc(regval);
>
> - return sprintf(buf, "%d\n", tmp103_reg_to_mc(regval));
> + return 0;
> }
>
> -static ssize_t tmp103_temp_store(struct device *dev,
> - struct device_attribute *attr,
> - const char *buf, size_t count)
> +static int tmp103_write(struct device *dev, enum hwmon_sensor_types type,
> + u32 attr, int channel, long temp)
> {
> - struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
> struct regmap *regmap = dev_get_drvdata(dev);
> - long val;
> - int ret;
> -
> - if (kstrtol(buf, 10, &val) < 0)
> - return -EINVAL;
> + int reg;
> +
> + switch (attr) {
> + case hwmon_temp_min:
> + reg = TMP103_TLOW_REG;
> + break;
> + case hwmon_temp_max:
> + reg = TMP103_THIGH_REG;
> + break;
> + default:
> + return -EOPNOTSUPP;
> + }
>
> - val = clamp_val(val, -55000, 127000);
> - ret = regmap_write(regmap, sda->index, tmp103_mc_to_reg(val));
> - return ret ? ret : count;
> + temp = clamp_val(temp, -55000, 127000);
> + return regmap_write(regmap, reg, tmp103_mc_to_reg(temp));
> }
>
> -static SENSOR_DEVICE_ATTR_RO(temp1_input, tmp103_temp, TMP103_TEMP_REG);
> +static umode_t tmp103_is_visible(const void *data, enum hwmon_sensor_types type,
> + u32 attr, int channel)
> +{
> + if (type != hwmon_temp)
> + return 0;
> +
> + switch (attr) {
> + case hwmon_temp_input:
> + return 0444;
> + case hwmon_temp_min:
> + case hwmon_temp_max:
> + return 0644;
> + default:
> + return 0;
> + }
> +}
>
> -static SENSOR_DEVICE_ATTR_RW(temp1_min, tmp103_temp, TMP103_TLOW_REG);
> +static const struct hwmon_channel_info *tmp103_info[] = {
> + HWMON_CHANNEL_INFO(chip,
> + HWMON_C_REGISTER_TZ),
> + HWMON_CHANNEL_INFO(temp,
> + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MIN),
> + NULL
> +};
>
> -static SENSOR_DEVICE_ATTR_RW(temp1_max, tmp103_temp, TMP103_THIGH_REG);
> +static const struct hwmon_ops tmp103_hwmon_ops = {
> + .is_visible = tmp103_is_visible,
> + .read = tmp103_read,
> + .write = tmp103_write,
> +};
>
> -static struct attribute *tmp103_attrs[] = {
> - &sensor_dev_attr_temp1_input.dev_attr.attr,
> - &sensor_dev_attr_temp1_min.dev_attr.attr,
> - &sensor_dev_attr_temp1_max.dev_attr.attr,
> - NULL
> +static const struct hwmon_chip_info tmp103_chip_info = {
> + .ops = &tmp103_hwmon_ops,
> + .info = tmp103_info,
> };
> -ATTRIBUTE_GROUPS(tmp103);
>
> static bool tmp103_regmap_is_volatile(struct device *dev, unsigned int reg)
> {
> @@ -130,8 +171,10 @@ static int tmp103_probe(struct i2c_client *client)
> }
>
> i2c_set_clientdata(client, regmap);
> - hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
> - regmap, tmp103_groups);
> + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
> + regmap,
> + &tmp103_chip_info,
> + NULL);
> return PTR_ERR_OR_ZERO(hwmon_dev);
> }
>