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

hwmon: (thmc50) add individual alarm & fault files

This patch adds individual alarm and fault files to
the thmc50 driver. These sysfs entries are required
for a new libsensors library.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Acked-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Mark M. Hoffman <mhoffman@lightlink.com>

authored by

Krzysztof Helt and committed by
Mark M. Hoffman
dcf3b5fb 6f9703d0

+28
+28
drivers/hwmon/thmc50.c
··· 46 46 #define THMC50_REG_COMPANY_ID 0x3E 47 47 #define THMC50_REG_DIE_CODE 0x3F 48 48 #define THMC50_REG_ANALOG_OUT 0x19 49 + /* 50 + * We use mirror status register for reading alarms 51 + * so ACPI can use the primary status register. 52 + */ 53 + #define THMC50_REG_INTR_MIRROR 0x4C 49 54 50 55 const static u8 THMC50_REG_TEMP[] = { 0x27, 0x26, 0x20 }; 51 56 const static u8 THMC50_REG_TEMP_MIN[] = { 0x3A, 0x38, 0x2C }; ··· 74 69 s8 temp_max[3]; 75 70 s8 temp_min[3]; 76 71 u8 analog_out; 72 + u8 alarms; 77 73 }; 78 74 79 75 static int thmc50_attach_adapter(struct i2c_adapter *adapter); ··· 186 180 return count; 187 181 } 188 182 183 + static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, 184 + char *buf) 185 + { 186 + int index = to_sensor_dev_attr(attr)->index; 187 + struct thmc50_data *data = thmc50_update_device(dev); 188 + 189 + return sprintf(buf, "%u\n", (data->alarms >> index) & 1); 190 + } 191 + 189 192 #define temp_reg(offset) \ 190 193 static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_temp, \ 191 194 NULL, offset - 1); \ ··· 207 192 temp_reg(2); 208 193 temp_reg(3); 209 194 195 + static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 0); 196 + static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5); 197 + static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 1); 198 + static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 7); 199 + static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 2); 200 + 210 201 static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_analog_out, 211 202 set_analog_out, 0); 212 203 static SENSOR_DEVICE_ATTR(pwm1_mode, S_IRUGO, show_pwm_mode, NULL, 0); ··· 221 200 &sensor_dev_attr_temp1_max.dev_attr.attr, 222 201 &sensor_dev_attr_temp1_min.dev_attr.attr, 223 202 &sensor_dev_attr_temp1_input.dev_attr.attr, 203 + &sensor_dev_attr_temp1_alarm.dev_attr.attr, 224 204 &sensor_dev_attr_temp2_max.dev_attr.attr, 225 205 &sensor_dev_attr_temp2_min.dev_attr.attr, 226 206 &sensor_dev_attr_temp2_input.dev_attr.attr, 207 + &sensor_dev_attr_temp2_alarm.dev_attr.attr, 208 + &sensor_dev_attr_temp2_fault.dev_attr.attr, 227 209 &sensor_dev_attr_pwm1.dev_attr.attr, 228 210 &sensor_dev_attr_pwm1_mode.dev_attr.attr, 229 211 NULL ··· 241 217 &sensor_dev_attr_temp3_max.dev_attr.attr, 242 218 &sensor_dev_attr_temp3_min.dev_attr.attr, 243 219 &sensor_dev_attr_temp3_input.dev_attr.attr, 220 + &sensor_dev_attr_temp3_alarm.dev_attr.attr, 221 + &sensor_dev_attr_temp3_fault.dev_attr.attr, 244 222 NULL 245 223 }; 246 224 ··· 440 414 } 441 415 data->analog_out = 442 416 i2c_smbus_read_byte_data(client, THMC50_REG_ANALOG_OUT); 417 + data->alarms = 418 + i2c_smbus_read_byte_data(client, THMC50_REG_INTR_MIRROR); 443 419 data->last_updated = jiffies; 444 420 data->valid = 1; 445 421 }