]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
hwmon: (max1619) Convert to with_info API
authorGuenter Roeck <linux@roeck-us.net>
Tue, 16 Jul 2024 15:24:28 +0000 (08:24 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 31 Jul 2024 17:43:53 +0000 (10:43 -0700)
Convert driver to with_info hwmon API to simplify the code and
with it its maintainability.

Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/max1619.c

index 76ccc3e94b4ca3cb09654d37805646598505b201..5159ff96ff37141de47bd826f123504af9469bb3 100644 (file)
 
 #include <linux/err.h>
 #include <linux/hwmon.h>
-#include <linux/hwmon-sysfs.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/regmap.h>
-#include <linux/sysfs.h>
 
 static const unsigned short normal_i2c[] = {
        0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x4c, 0x4d, 0x4e, I2C_CLIENT_END };
 
-/*
- * The MAX1619 registers
- */
-
 #define MAX1619_REG_LOCAL_TEMP         0x00
 #define MAX1619_REG_REMOTE_TEMP                0x01
 #define MAX1619_REG_STATUS             0x02
@@ -40,66 +34,6 @@ static const unsigned short normal_i2c[] = {
 #define MAX1619_REG_MAN_ID             0xFE
 #define MAX1619_REG_CHIP_ID            0xFF
 
-enum temp_index {
-       t_input1 = 0,
-       t_input2,
-       t_low2,
-       t_high2,
-       t_crit2,
-       t_hyst2,
-       t_num_regs
-};
-
-/*
- * Client data (each client gets its own)
- */
-
-static const u8 regs[t_num_regs] = {
-       [t_input1] = MAX1619_REG_LOCAL_TEMP,
-       [t_input2] = MAX1619_REG_REMOTE_TEMP,
-       [t_low2] = MAX1619_REG_REMOTE_LOW,
-       [t_high2] = MAX1619_REG_REMOTE_HIGH,
-       [t_crit2] = MAX1619_REG_REMOTE_CRIT,
-       [t_hyst2] = MAX1619_REG_REMOTE_CRIT_HYST,
-};
-
-/*
- * Sysfs stuff
- */
-
-static ssize_t temp_show(struct device *dev, struct device_attribute *devattr,
-                        char *buf)
-{
-       struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-       struct regmap *regmap = dev_get_drvdata(dev);
-       u32 temp;
-       int ret;
-
-       ret = regmap_read(regmap, regs[attr->index], &temp);
-       if (ret < 0)
-               return ret;
-
-       return sprintf(buf, "%d\n", sign_extend32(temp, 7) * 1000);
-}
-
-static ssize_t temp_store(struct device *dev,
-                         struct device_attribute *devattr, const char *buf,
-                         size_t count)
-{
-       struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-       struct regmap *regmap = dev_get_drvdata(dev);
-       long val;
-       int err = kstrtol(buf, 10, &val);
-       if (err)
-               return err;
-
-       val = DIV_ROUND_CLOSEST(clamp_val(val, -128000, 127000), 1000);
-       err = regmap_write(regmap, regs[attr->index], val);
-       if (err < 0)
-               return err;
-       return count;
-}
-
 static int get_alarms(struct regmap *regmap)
 {
        static u32 regs[2] = { MAX1619_REG_STATUS, MAX1619_REG_CONFIG };
@@ -117,62 +51,175 @@ static int get_alarms(struct regmap *regmap)
        return regdata[0] & 0x1e;
 }
 
-static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
-                          char *buf)
+static int max1619_temp_read(struct regmap *regmap, u32 attr, int channel, long *val)
 {
-       struct regmap *regmap = dev_get_drvdata(dev);
-       int alarms;
+       int reg = -1, alarm_bit = 0;
+       u32 temp;
+       int ret;
 
-       alarms = get_alarms(regmap);
-       if (alarms < 0)
-               return alarms;
+       switch (attr) {
+       case hwmon_temp_input:
+               reg = channel ? MAX1619_REG_REMOTE_TEMP : MAX1619_REG_LOCAL_TEMP;
+               break;
+       case hwmon_temp_min:
+               reg = MAX1619_REG_REMOTE_LOW;
+               break;
+       case hwmon_temp_max:
+               reg = MAX1619_REG_REMOTE_HIGH;
+               break;
+       case hwmon_temp_crit:
+               reg = MAX1619_REG_REMOTE_CRIT;
+               break;
+       case hwmon_temp_crit_hyst:
+               reg = MAX1619_REG_REMOTE_CRIT_HYST;
+               break;
+       case hwmon_temp_min_alarm:
+               alarm_bit = 3;
+               break;
+       case hwmon_temp_max_alarm:
+               alarm_bit = 4;
+               break;
+       case hwmon_temp_crit_alarm:
+               alarm_bit = 1;
+               break;
+       case hwmon_temp_fault:
+               alarm_bit = 2;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+       if (reg >= 0) {
+               ret = regmap_read(regmap, reg, &temp);
+               if (ret < 0)
+                       return ret;
+               *val = sign_extend32(temp, 7) * 1000;
+       } else {
+               ret = get_alarms(regmap);
+               if (ret < 0)
+                       return ret;
+               *val = !!(ret & BIT(alarm_bit));
+       }
+       return 0;
+}
 
-       return sprintf(buf, "%d\n", alarms);
+static int max1619_chip_read(struct regmap *regmap, u32 attr, long *val)
+{
+       int alarms;
+
+       switch (attr) {
+       case hwmon_chip_alarms:
+               alarms = get_alarms(regmap);
+               if (alarms < 0)
+                       return alarms;
+               *val = alarms;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+       return 0;
 }
 
-static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
-                         char *buf)
+static int max1619_read(struct device *dev, enum hwmon_sensor_types type,
+                       u32 attr, int channel, long *val)
 {
-       int bitnr = to_sensor_dev_attr(attr)->index;
        struct regmap *regmap = dev_get_drvdata(dev);
-       int alarms;
 
-       alarms = get_alarms(regmap);
-       if (alarms < 0)
-               return alarms;
+       switch (type) {
+       case hwmon_chip:
+               return max1619_chip_read(regmap, attr, val);
+       case hwmon_temp:
+               return max1619_temp_read(regmap, attr, channel, val);
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
+static int max1619_write(struct device *dev, enum hwmon_sensor_types type,
+                        u32 attr, int channel, long val)
+{
+       struct regmap *regmap = dev_get_drvdata(dev);
+       int reg;
+
+       if (type != hwmon_temp)
+               return -EOPNOTSUPP;
+
+       switch (attr) {
+       case hwmon_temp_min:
+               reg = MAX1619_REG_REMOTE_LOW;
+               break;
+       case hwmon_temp_max:
+               reg = MAX1619_REG_REMOTE_HIGH;
+               break;
+       case hwmon_temp_crit:
+               reg = MAX1619_REG_REMOTE_CRIT;
+               break;
+       case hwmon_temp_crit_hyst:
+               reg = MAX1619_REG_REMOTE_CRIT_HYST;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+       val = DIV_ROUND_CLOSEST(clamp_val(val, -128000, 127000), 1000);
+       return regmap_write(regmap, reg, val);
+}
 
-       return sprintf(buf, "%d\n", (alarms >> bitnr) & 1);
+static umode_t max1619_is_visible(const void *_data, enum hwmon_sensor_types type,
+                                 u32 attr, int channel)
+{
+       switch (type) {
+       case hwmon_chip:
+               switch (attr) {
+               case hwmon_chip_alarms:
+                       return 0444;
+               default:
+                       break;
+               }
+               break;
+       case hwmon_temp:
+               switch (attr) {
+               case hwmon_temp_input:
+                       return 0444;
+               case hwmon_temp_min:
+               case hwmon_temp_max:
+               case hwmon_temp_crit:
+               case hwmon_temp_crit_hyst:
+                       return 0644;
+               case hwmon_temp_min_alarm:
+               case hwmon_temp_max_alarm:
+               case hwmon_temp_crit_alarm:
+               case hwmon_temp_fault:
+                       return 0444;
+               default:
+                       break;
+               }
+               break;
+       default:
+               break;
+       }
+       return 0;
 }
 
-static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, t_input1);
-static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, t_input2);
-static SENSOR_DEVICE_ATTR_RW(temp2_min, temp, t_low2);
-static SENSOR_DEVICE_ATTR_RW(temp2_max, temp, t_high2);
-static SENSOR_DEVICE_ATTR_RW(temp2_crit, temp, t_crit2);
-static SENSOR_DEVICE_ATTR_RW(temp2_crit_hyst, temp, t_hyst2);
-
-static DEVICE_ATTR_RO(alarms);
-static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, alarm, 1);
-static SENSOR_DEVICE_ATTR_RO(temp2_fault, alarm, 2);
-static SENSOR_DEVICE_ATTR_RO(temp2_min_alarm, alarm, 3);
-static SENSOR_DEVICE_ATTR_RO(temp2_max_alarm, alarm, 4);
-
-static struct attribute *max1619_attrs[] = {
-       &sensor_dev_attr_temp1_input.dev_attr.attr,
-       &sensor_dev_attr_temp2_input.dev_attr.attr,
-       &sensor_dev_attr_temp2_min.dev_attr.attr,
-       &sensor_dev_attr_temp2_max.dev_attr.attr,
-       &sensor_dev_attr_temp2_crit.dev_attr.attr,
-       &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr,
-
-       &dev_attr_alarms.attr,
-       &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
-       &sensor_dev_attr_temp2_fault.dev_attr.attr,
-       &sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
-       &sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
+static const struct hwmon_channel_info * const max1619_info[] = {
+       HWMON_CHANNEL_INFO(chip, HWMON_C_ALARMS),
+       HWMON_CHANNEL_INFO(temp,
+                          HWMON_T_INPUT,
+                          HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |
+                          HWMON_T_CRIT | HWMON_T_CRIT_HYST |
+                          HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM |
+                          HWMON_T_CRIT_ALARM | HWMON_T_FAULT),
        NULL
 };
-ATTRIBUTE_GROUPS(max1619);
+
+static const struct hwmon_ops max1619_hwmon_ops = {
+       .is_visible = max1619_is_visible,
+       .read = max1619_read,
+       .write = max1619_write,
+};
+
+static const struct hwmon_chip_info max1619_chip_info = {
+       .ops = &max1619_hwmon_ops,
+       .info = max1619_info,
+};
 
 /* Return 0 if detection is successful, -ENODEV otherwise */
 static int max1619_detect(struct i2c_client *client,
@@ -283,10 +330,8 @@ static int max1619_probe(struct i2c_client *client)
        if (ret)
                return ret;
 
-       hwmon_dev = devm_hwmon_device_register_with_groups(dev,
-                                                          client->name,
-                                                          regmap,
-                                                          max1619_groups);
+       hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
+                                                        regmap, &max1619_chip_info, NULL);
        return PTR_ERR_OR_ZERO(hwmon_dev);
 }