Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon: (max1619) Add support for update_interval attribute

The chip supports reading and writing the conversion rate.
Add support for the update_interval sysfs attribute.

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

+42 -8
+42 -8
drivers/hwmon/max1619.c
··· 18 18 #include <linux/init.h> 19 19 #include <linux/module.h> 20 20 #include <linux/regmap.h> 21 + #include <linux/util_macros.h> 21 22 22 23 static const unsigned short normal_i2c[] = { 23 24 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x4c, 0x4d, 0x4e, I2C_CLIENT_END }; ··· 103 102 return 0; 104 103 } 105 104 105 + static u16 update_intervals[] = { 16000, 8000, 4000, 2000, 1000, 500, 250, 125 }; 106 + 106 107 static int max1619_chip_read(struct regmap *regmap, u32 attr, long *val) 107 108 { 108 - int alarms; 109 + int alarms, ret; 110 + u32 regval; 109 111 110 112 switch (attr) { 113 + case hwmon_chip_update_interval: 114 + ret = regmap_read(regmap, MAX1619_REG_CONVRATE, &regval); 115 + if (ret < 0) 116 + return ret; 117 + *val = update_intervals[regval & 7]; 118 + break; 111 119 case hwmon_chip_alarms: 112 120 alarms = get_alarms(regmap); 113 121 if (alarms < 0) ··· 144 134 } 145 135 } 146 136 147 - static int max1619_write(struct device *dev, enum hwmon_sensor_types type, 148 - u32 attr, int channel, long val) 137 + static int max1619_chip_write(struct regmap *regmap, u32 attr, long val) 149 138 { 150 - struct regmap *regmap = dev_get_drvdata(dev); 151 - int reg; 152 - 153 - if (type != hwmon_temp) 139 + switch (attr) { 140 + case hwmon_chip_update_interval: 141 + val = find_closest_descending(val, update_intervals, ARRAY_SIZE(update_intervals)); 142 + return regmap_write(regmap, MAX1619_REG_CONVRATE, val); 143 + default: 154 144 return -EOPNOTSUPP; 145 + } 146 + } 147 + 148 + static int max1619_temp_write(struct regmap *regmap, 149 + u32 attr, int channel, long val) 150 + { 151 + int reg; 155 152 156 153 switch (attr) { 157 154 case hwmon_temp_min: ··· 180 163 return regmap_write(regmap, reg, val); 181 164 } 182 165 166 + static int max1619_write(struct device *dev, enum hwmon_sensor_types type, 167 + u32 attr, int channel, long val) 168 + { 169 + struct regmap *regmap = dev_get_drvdata(dev); 170 + 171 + switch (type) { 172 + case hwmon_chip: 173 + return max1619_chip_write(regmap, attr, val); 174 + case hwmon_temp: 175 + return max1619_temp_write(regmap, attr, channel, val); 176 + default: 177 + return -EOPNOTSUPP; 178 + } 179 + } 180 + 183 181 static umode_t max1619_is_visible(const void *_data, enum hwmon_sensor_types type, 184 182 u32 attr, int channel) 185 183 { 186 184 switch (type) { 187 185 case hwmon_chip: 188 186 switch (attr) { 187 + case hwmon_chip_update_interval: 188 + return 0644; 189 189 case hwmon_chip_alarms: 190 190 return 0444; 191 191 default: ··· 234 200 } 235 201 236 202 static const struct hwmon_channel_info * const max1619_info[] = { 237 - HWMON_CHANNEL_INFO(chip, HWMON_C_ALARMS), 203 + HWMON_CHANNEL_INFO(chip, HWMON_C_ALARMS | HWMON_C_UPDATE_INTERVAL), 238 204 HWMON_CHANNEL_INFO(temp, 239 205 HWMON_T_INPUT, 240 206 HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX |