1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /*************************************************************************** 3 * Copyright (C) 2006 by Hans Edgington <hans@edgington.nl> * 4 * Copyright (C) 2007-2011 Hans de Goede <hdegoede@redhat.com> * 5 * * 6 ***************************************************************************/ 7 8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9 10 #include <linux/module.h> 11 #include <linux/init.h> 12 #include <linux/slab.h> 13 #include <linux/jiffies.h> 14 #include <linux/platform_device.h> 15 #include <linux/hwmon.h> 16 #include <linux/hwmon-sysfs.h> 17 #include <linux/err.h> 18 #include <linux/mutex.h> 19 #include <linux/io.h> 20 #include <linux/acpi.h> 21 22 #define DRVNAME "f71882fg" 23 24 #define SIO_F71858FG_LD_HWM 0x02 /* Hardware monitor logical device */ 25 #define SIO_F71882FG_LD_HWM 0x04 /* Hardware monitor logical device */ 26 #define SIO_UNLOCK_KEY 0x87 /* Key to enable Super-I/O */ 27 #define SIO_LOCK_KEY 0xAA /* Key to disable Super-I/O */ 28 29 #define SIO_REG_LDSEL 0x07 /* Logical device select */ 30 #define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */ 31 #define SIO_REG_DEVREV 0x22 /* Device revision */ 32 #define SIO_REG_MANID 0x23 /* Fintek ID (2 bytes) */ 33 #define SIO_REG_ENABLE 0x30 /* Logical device enable */ 34 #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */ 35 36 #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */ 37 #define SIO_F71808E_ID 0x0901 /* Chipset ID */ 38 #define SIO_F71808A_ID 0x1001 /* Chipset ID */ 39 #define SIO_F71858_ID 0x0507 /* Chipset ID */ 40 #define SIO_F71862_ID 0x0601 /* Chipset ID */ 41 #define SIO_F71868_ID 0x1106 /* Chipset ID */ 42 #define SIO_F71869_ID 0x0814 /* Chipset ID */ 43 #define SIO_F71869A_ID 0x1007 /* Chipset ID */ 44 #define SIO_F71882_ID 0x0541 /* Chipset ID */ 45 #define SIO_F71889_ID 0x0723 /* Chipset ID */ 46 #define SIO_F71889E_ID 0x0909 /* Chipset ID */ 47 #define SIO_F71889A_ID 0x1005 /* Chipset ID */ 48 #define SIO_F8000_ID 0x0581 /* Chipset ID */ 49 #define SIO_F81768D_ID 0x1210 /* Chipset ID */ 50 #define SIO_F81865_ID 0x0704 /* Chipset ID */ 51 #define SIO_F81866_ID 0x1010 /* Chipset ID */ 52 #define SIO_F71858AD_ID 0x0903 /* Chipset ID */ 53 #define SIO_F81966_ID 0x1502 /* Chipset ID */ 54 55 #define REGION_LENGTH 8 56 #define ADDR_REG_OFFSET 5 57 #define DATA_REG_OFFSET 6 58 59 #define F71882FG_REG_IN_STATUS 0x12 /* f7188x only */ 60 #define F71882FG_REG_IN_BEEP 0x13 /* f7188x only */ 61 #define F71882FG_REG_IN(nr) (0x20 + (nr)) 62 #define F71882FG_REG_IN1_HIGH 0x32 /* f7188x only */ 63 64 #define F81866_REG_IN_STATUS 0x16 /* F81866 only */ 65 #define F81866_REG_IN_BEEP 0x17 /* F81866 only */ 66 #define F81866_REG_IN1_HIGH 0x3a /* F81866 only */ 67 68 #define F71882FG_REG_FAN(nr) (0xA0 + (16 * (nr))) 69 #define F71882FG_REG_FAN_TARGET(nr) (0xA2 + (16 * (nr))) 70 #define F71882FG_REG_FAN_FULL_SPEED(nr) (0xA4 + (16 * (nr))) 71 #define F71882FG_REG_FAN_STATUS 0x92 72 #define F71882FG_REG_FAN_BEEP 0x93 73 74 #define F71882FG_REG_TEMP(nr) (0x70 + 2 * (nr)) 75 #define F71882FG_REG_TEMP_OVT(nr) (0x80 + 2 * (nr)) 76 #define F71882FG_REG_TEMP_HIGH(nr) (0x81 + 2 * (nr)) 77 #define F71882FG_REG_TEMP_STATUS 0x62 78 #define F71882FG_REG_TEMP_BEEP 0x63 79 #define F71882FG_REG_TEMP_CONFIG 0x69 80 #define F71882FG_REG_TEMP_HYST(nr) (0x6C + (nr)) 81 #define F71882FG_REG_TEMP_TYPE 0x6B 82 #define F71882FG_REG_TEMP_DIODE_OPEN 0x6F 83 84 #define F71882FG_REG_PWM(nr) (0xA3 + (16 * (nr))) 85 #define F71882FG_REG_PWM_TYPE 0x94 86 #define F71882FG_REG_PWM_ENABLE 0x96 87 88 #define F71882FG_REG_FAN_HYST(nr) (0x98 + (nr)) 89 90 #define F71882FG_REG_FAN_FAULT_T 0x9F 91 #define F71882FG_FAN_NEG_TEMP_EN 0x20 92 #define F71882FG_FAN_PROG_SEL 0x80 93 94 #define F71882FG_REG_POINT_PWM(pwm, point) (0xAA + (point) + (16 * (pwm))) 95 #define F71882FG_REG_POINT_TEMP(pwm, point) (0xA6 + (point) + (16 * (pwm))) 96 #define F71882FG_REG_POINT_MAPPING(nr) (0xAF + 16 * (nr)) 97 98 #define F71882FG_REG_START 0x01 99 100 #define F71882FG_MAX_INS 11 101 102 #define FAN_MIN_DETECT 366 /* Lowest detectable fanspeed */ 103 104 static unsigned short force_id; 105 module_param(force_id, ushort, 0); 106 MODULE_PARM_DESC(force_id, "Override the detected device ID"); 107 108 enum chips { f71808e, f71808a, f71858fg, f71862fg, f71868a, f71869, f71869a, 109 f71882fg, f71889fg, f71889ed, f71889a, f8000, f81768d, f81865f, 110 f81866a}; 111 112 static const char *const f71882fg_names[] = { 113 "f71808e", 114 "f71808a", 115 "f71858fg", 116 "f71862fg", 117 "f71868a", 118 "f71869", /* Both f71869f and f71869e, reg. compatible and same id */ 119 "f71869a", 120 "f71882fg", 121 "f71889fg", /* f81801u too, same id */ 122 "f71889ed", 123 "f71889a", 124 "f8000", 125 "f81768d", 126 "f81865f", 127 "f81866a", 128 }; 129 130 static const char f71882fg_has_in[][F71882FG_MAX_INS] = { 131 [f71808e] = { 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0 }, 132 [f71808a] = { 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0 }, 133 [f71858fg] = { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 134 [f71862fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, 135 [f71868a] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, 136 [f71869] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, 137 [f71869a] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, 138 [f71882fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, 139 [f71889fg] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, 140 [f71889ed] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, 141 [f71889a] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, 142 [f8000] = { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 143 [f81768d] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, 144 [f81865f] = { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, 145 [f81866a] = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, 146 }; 147 148 static const char f71882fg_has_in1_alarm[] = { 149 [f71808e] = 0, 150 [f71808a] = 0, 151 [f71858fg] = 0, 152 [f71862fg] = 0, 153 [f71868a] = 0, 154 [f71869] = 0, 155 [f71869a] = 0, 156 [f71882fg] = 1, 157 [f71889fg] = 1, 158 [f71889ed] = 1, 159 [f71889a] = 1, 160 [f8000] = 0, 161 [f81768d] = 1, 162 [f81865f] = 1, 163 [f81866a] = 1, 164 }; 165 166 static const char f71882fg_fan_has_beep[] = { 167 [f71808e] = 0, 168 [f71808a] = 0, 169 [f71858fg] = 0, 170 [f71862fg] = 1, 171 [f71868a] = 1, 172 [f71869] = 1, 173 [f71869a] = 1, 174 [f71882fg] = 1, 175 [f71889fg] = 1, 176 [f71889ed] = 1, 177 [f71889a] = 1, 178 [f8000] = 0, 179 [f81768d] = 1, 180 [f81865f] = 1, 181 [f81866a] = 1, 182 }; 183 184 static const char f71882fg_nr_fans[] = { 185 [f71808e] = 3, 186 [f71808a] = 2, /* +1 fan which is monitor + simple pwm only */ 187 [f71858fg] = 3, 188 [f71862fg] = 3, 189 [f71868a] = 3, 190 [f71869] = 3, 191 [f71869a] = 3, 192 [f71882fg] = 4, 193 [f71889fg] = 3, 194 [f71889ed] = 3, 195 [f71889a] = 3, 196 [f8000] = 3, /* +1 fan which is monitor only */ 197 [f81768d] = 3, 198 [f81865f] = 2, 199 [f81866a] = 3, 200 }; 201 202 static const char f71882fg_temp_has_beep[] = { 203 [f71808e] = 0, 204 [f71808a] = 1, 205 [f71858fg] = 0, 206 [f71862fg] = 1, 207 [f71868a] = 1, 208 [f71869] = 1, 209 [f71869a] = 1, 210 [f71882fg] = 1, 211 [f71889fg] = 1, 212 [f71889ed] = 1, 213 [f71889a] = 1, 214 [f8000] = 0, 215 [f81768d] = 1, 216 [f81865f] = 1, 217 [f81866a] = 1, 218 }; 219 220 static const char f71882fg_nr_temps[] = { 221 [f71808e] = 2, 222 [f71808a] = 2, 223 [f71858fg] = 3, 224 [f71862fg] = 3, 225 [f71868a] = 3, 226 [f71869] = 3, 227 [f71869a] = 3, 228 [f71882fg] = 3, 229 [f71889fg] = 3, 230 [f71889ed] = 3, 231 [f71889a] = 3, 232 [f8000] = 3, 233 [f81768d] = 3, 234 [f81865f] = 2, 235 [f81866a] = 3, 236 }; 237 238 static struct platform_device *f71882fg_pdev; 239 240 /* Super-I/O Function prototypes */ 241 static inline int superio_inb(int base, int reg); 242 static inline int superio_inw(int base, int reg); 243 static inline int superio_enter(int base); 244 static inline void superio_select(int base, int ld); 245 static inline void superio_exit(int base); 246 247 struct f71882fg_sio_data { 248 enum chips type; 249 }; 250 251 struct f71882fg_data { 252 unsigned short addr; 253 enum chips type; 254 struct device *hwmon_dev; 255 256 struct mutex update_lock; 257 int temp_start; /* temp numbering start (0 or 1) */ 258 bool valid; /* true if following fields are valid */ 259 char auto_point_temp_signed; 260 unsigned long last_updated; /* In jiffies */ 261 unsigned long last_limits; /* In jiffies */ 262 263 /* Register Values */ 264 u8 in[F71882FG_MAX_INS]; 265 u8 in1_max; 266 u8 in_status; 267 u8 in_beep; 268 u16 fan[4]; 269 u16 fan_target[4]; 270 u16 fan_full_speed[4]; 271 u8 fan_status; 272 u8 fan_beep; 273 /* 274 * Note: all models have max 3 temperature channels, but on some 275 * they are addressed as 0-2 and on others as 1-3, so for coding 276 * convenience we reserve space for 4 channels 277 */ 278 u16 temp[4]; 279 u8 temp_ovt[4]; 280 u8 temp_high[4]; 281 u8 temp_hyst[2]; /* 2 hysts stored per reg */ 282 u8 temp_type[4]; 283 u8 temp_status; 284 u8 temp_beep; 285 u8 temp_diode_open; 286 u8 temp_config; 287 u8 pwm[4]; 288 u8 pwm_enable; 289 u8 pwm_auto_point_hyst[2]; 290 u8 pwm_auto_point_mapping[4]; 291 u8 pwm_auto_point_pwm[4][5]; 292 s8 pwm_auto_point_temp[4][4]; 293 }; 294 295 /* Sysfs in */ 296 static ssize_t show_in(struct device *dev, struct device_attribute *devattr, 297 char *buf); 298 static ssize_t show_in_max(struct device *dev, struct device_attribute 299 *devattr, char *buf); 300 static ssize_t store_in_max(struct device *dev, struct device_attribute 301 *devattr, const char *buf, size_t count); 302 static ssize_t show_in_beep(struct device *dev, struct device_attribute 303 *devattr, char *buf); 304 static ssize_t store_in_beep(struct device *dev, struct device_attribute 305 *devattr, const char *buf, size_t count); 306 static ssize_t show_in_alarm(struct device *dev, struct device_attribute 307 *devattr, char *buf); 308 /* Sysfs Fan */ 309 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, 310 char *buf); 311 static ssize_t show_fan_full_speed(struct device *dev, 312 struct device_attribute *devattr, char *buf); 313 static ssize_t store_fan_full_speed(struct device *dev, 314 struct device_attribute *devattr, const char *buf, size_t count); 315 static ssize_t show_fan_beep(struct device *dev, struct device_attribute 316 *devattr, char *buf); 317 static ssize_t store_fan_beep(struct device *dev, struct device_attribute 318 *devattr, const char *buf, size_t count); 319 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute 320 *devattr, char *buf); 321 /* Sysfs Temp */ 322 static ssize_t show_temp(struct device *dev, struct device_attribute 323 *devattr, char *buf); 324 static ssize_t show_temp_max(struct device *dev, struct device_attribute 325 *devattr, char *buf); 326 static ssize_t store_temp_max(struct device *dev, struct device_attribute 327 *devattr, const char *buf, size_t count); 328 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute 329 *devattr, char *buf); 330 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute 331 *devattr, const char *buf, size_t count); 332 static ssize_t show_temp_crit(struct device *dev, struct device_attribute 333 *devattr, char *buf); 334 static ssize_t store_temp_crit(struct device *dev, struct device_attribute 335 *devattr, const char *buf, size_t count); 336 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute 337 *devattr, char *buf); 338 static ssize_t show_temp_type(struct device *dev, struct device_attribute 339 *devattr, char *buf); 340 static ssize_t show_temp_beep(struct device *dev, struct device_attribute 341 *devattr, char *buf); 342 static ssize_t store_temp_beep(struct device *dev, struct device_attribute 343 *devattr, const char *buf, size_t count); 344 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute 345 *devattr, char *buf); 346 static ssize_t show_temp_fault(struct device *dev, struct device_attribute 347 *devattr, char *buf); 348 /* PWM and Auto point control */ 349 static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, 350 char *buf); 351 static ssize_t store_pwm(struct device *dev, struct device_attribute *devattr, 352 const char *buf, size_t count); 353 static ssize_t show_simple_pwm(struct device *dev, 354 struct device_attribute *devattr, char *buf); 355 static ssize_t store_simple_pwm(struct device *dev, 356 struct device_attribute *devattr, const char *buf, size_t count); 357 static ssize_t show_pwm_enable(struct device *dev, 358 struct device_attribute *devattr, char *buf); 359 static ssize_t store_pwm_enable(struct device *dev, 360 struct device_attribute *devattr, const char *buf, size_t count); 361 static ssize_t show_pwm_interpolate(struct device *dev, 362 struct device_attribute *devattr, char *buf); 363 static ssize_t store_pwm_interpolate(struct device *dev, 364 struct device_attribute *devattr, const char *buf, size_t count); 365 static ssize_t show_pwm_auto_point_channel(struct device *dev, 366 struct device_attribute *devattr, char *buf); 367 static ssize_t store_pwm_auto_point_channel(struct device *dev, 368 struct device_attribute *devattr, const char *buf, size_t count); 369 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev, 370 struct device_attribute *devattr, char *buf); 371 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev, 372 struct device_attribute *devattr, const char *buf, size_t count); 373 static ssize_t show_pwm_auto_point_pwm(struct device *dev, 374 struct device_attribute *devattr, char *buf); 375 static ssize_t store_pwm_auto_point_pwm(struct device *dev, 376 struct device_attribute *devattr, const char *buf, size_t count); 377 static ssize_t show_pwm_auto_point_temp(struct device *dev, 378 struct device_attribute *devattr, char *buf); 379 static ssize_t store_pwm_auto_point_temp(struct device *dev, 380 struct device_attribute *devattr, const char *buf, size_t count); 381 /* Sysfs misc */ 382 static ssize_t name_show(struct device *dev, struct device_attribute *devattr, 383 char *buf); 384 385 static int f71882fg_probe(struct platform_device *pdev); 386 static int f71882fg_remove(struct platform_device *pdev); 387 388 static struct platform_driver f71882fg_driver = { 389 .driver = { 390 .name = DRVNAME, 391 }, 392 .probe = f71882fg_probe, 393 .remove = f71882fg_remove, 394 }; 395 396 static DEVICE_ATTR_RO(name); 397 398 /* 399 * Temp attr for the f71858fg, the f71858fg is special as it has its 400 * temperature indexes start at 0 (the others start at 1) 401 */ 402 static struct sensor_device_attribute_2 f71858fg_temp_attr[] = { 403 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0), 404 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max, 405 store_temp_max, 0, 0), 406 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 407 store_temp_max_hyst, 0, 0), 408 SENSOR_ATTR_2(temp1_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 0), 409 SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit, 410 store_temp_crit, 0, 0), 411 SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 412 0, 0), 413 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4), 414 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0), 415 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1), 416 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max, 417 store_temp_max, 0, 1), 418 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 419 store_temp_max_hyst, 0, 1), 420 SENSOR_ATTR_2(temp2_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1), 421 SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit, 422 store_temp_crit, 0, 1), 423 SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 424 0, 1), 425 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5), 426 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1), 427 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2), 428 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max, 429 store_temp_max, 0, 2), 430 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 431 store_temp_max_hyst, 0, 2), 432 SENSOR_ATTR_2(temp3_max_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2), 433 SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit, 434 store_temp_crit, 0, 2), 435 SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 436 0, 2), 437 SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6), 438 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2), 439 }; 440 441 /* Temp attr for the standard models */ 442 static struct sensor_device_attribute_2 fxxxx_temp_attr[3][9] = { { 443 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 1), 444 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_max, 445 store_temp_max, 0, 1), 446 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 447 store_temp_max_hyst, 0, 1), 448 /* 449 * Should really be temp1_max_alarm, but older versions did not handle 450 * the max and crit alarms separately and lm_sensors v2 depends on the 451 * presence of temp#_alarm files. The same goes for temp2/3 _alarm. 452 */ 453 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 1), 454 SENSOR_ATTR_2(temp1_crit, S_IRUGO|S_IWUSR, show_temp_crit, 455 store_temp_crit, 0, 1), 456 SENSOR_ATTR_2(temp1_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 457 0, 1), 458 SENSOR_ATTR_2(temp1_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5), 459 SENSOR_ATTR_2(temp1_type, S_IRUGO, show_temp_type, NULL, 0, 1), 460 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 1), 461 }, { 462 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 2), 463 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_max, 464 store_temp_max, 0, 2), 465 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 466 store_temp_max_hyst, 0, 2), 467 /* Should be temp2_max_alarm, see temp1_alarm note */ 468 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 2), 469 SENSOR_ATTR_2(temp2_crit, S_IRUGO|S_IWUSR, show_temp_crit, 470 store_temp_crit, 0, 2), 471 SENSOR_ATTR_2(temp2_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 472 0, 2), 473 SENSOR_ATTR_2(temp2_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6), 474 SENSOR_ATTR_2(temp2_type, S_IRUGO, show_temp_type, NULL, 0, 2), 475 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 2), 476 }, { 477 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 3), 478 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_max, 479 store_temp_max, 0, 3), 480 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max_hyst, 481 store_temp_max_hyst, 0, 3), 482 /* Should be temp3_max_alarm, see temp1_alarm note */ 483 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 3), 484 SENSOR_ATTR_2(temp3_crit, S_IRUGO|S_IWUSR, show_temp_crit, 485 store_temp_crit, 0, 3), 486 SENSOR_ATTR_2(temp3_crit_hyst, S_IRUGO, show_temp_crit_hyst, NULL, 487 0, 3), 488 SENSOR_ATTR_2(temp3_crit_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 7), 489 SENSOR_ATTR_2(temp3_type, S_IRUGO, show_temp_type, NULL, 0, 3), 490 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 3), 491 } }; 492 493 /* Temp attr for models which can beep on temp alarm */ 494 static struct sensor_device_attribute_2 fxxxx_temp_beep_attr[3][2] = { { 495 SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep, 496 store_temp_beep, 0, 1), 497 SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep, 498 store_temp_beep, 0, 5), 499 }, { 500 SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep, 501 store_temp_beep, 0, 2), 502 SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep, 503 store_temp_beep, 0, 6), 504 }, { 505 SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep, 506 store_temp_beep, 0, 3), 507 SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep, 508 store_temp_beep, 0, 7), 509 } }; 510 511 static struct sensor_device_attribute_2 f81866_temp_beep_attr[3][2] = { { 512 SENSOR_ATTR_2(temp1_max_beep, S_IRUGO|S_IWUSR, show_temp_beep, 513 store_temp_beep, 0, 0), 514 SENSOR_ATTR_2(temp1_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep, 515 store_temp_beep, 0, 4), 516 }, { 517 SENSOR_ATTR_2(temp2_max_beep, S_IRUGO|S_IWUSR, show_temp_beep, 518 store_temp_beep, 0, 1), 519 SENSOR_ATTR_2(temp2_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep, 520 store_temp_beep, 0, 5), 521 }, { 522 SENSOR_ATTR_2(temp3_max_beep, S_IRUGO|S_IWUSR, show_temp_beep, 523 store_temp_beep, 0, 2), 524 SENSOR_ATTR_2(temp3_crit_beep, S_IRUGO|S_IWUSR, show_temp_beep, 525 store_temp_beep, 0, 6), 526 } }; 527 528 /* 529 * Temp attr for the f8000 530 * Note on the f8000 temp_ovt (crit) is used as max, and temp_high (max) 531 * is used as hysteresis value to clear alarms 532 * Also like the f71858fg its temperature indexes start at 0 533 */ 534 static struct sensor_device_attribute_2 f8000_temp_attr[] = { 535 SENSOR_ATTR_2(temp1_input, S_IRUGO, show_temp, NULL, 0, 0), 536 SENSOR_ATTR_2(temp1_max, S_IRUGO|S_IWUSR, show_temp_crit, 537 store_temp_crit, 0, 0), 538 SENSOR_ATTR_2(temp1_max_hyst, S_IRUGO|S_IWUSR, show_temp_max, 539 store_temp_max, 0, 0), 540 SENSOR_ATTR_2(temp1_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 4), 541 SENSOR_ATTR_2(temp1_fault, S_IRUGO, show_temp_fault, NULL, 0, 0), 542 SENSOR_ATTR_2(temp2_input, S_IRUGO, show_temp, NULL, 0, 1), 543 SENSOR_ATTR_2(temp2_max, S_IRUGO|S_IWUSR, show_temp_crit, 544 store_temp_crit, 0, 1), 545 SENSOR_ATTR_2(temp2_max_hyst, S_IRUGO|S_IWUSR, show_temp_max, 546 store_temp_max, 0, 1), 547 SENSOR_ATTR_2(temp2_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 5), 548 SENSOR_ATTR_2(temp2_fault, S_IRUGO, show_temp_fault, NULL, 0, 1), 549 SENSOR_ATTR_2(temp3_input, S_IRUGO, show_temp, NULL, 0, 2), 550 SENSOR_ATTR_2(temp3_max, S_IRUGO|S_IWUSR, show_temp_crit, 551 store_temp_crit, 0, 2), 552 SENSOR_ATTR_2(temp3_max_hyst, S_IRUGO|S_IWUSR, show_temp_max, 553 store_temp_max, 0, 2), 554 SENSOR_ATTR_2(temp3_alarm, S_IRUGO, show_temp_alarm, NULL, 0, 6), 555 SENSOR_ATTR_2(temp3_fault, S_IRUGO, show_temp_fault, NULL, 0, 2), 556 }; 557 558 /* in attr for all models */ 559 static struct sensor_device_attribute_2 fxxxx_in_attr[] = { 560 SENSOR_ATTR_2(in0_input, S_IRUGO, show_in, NULL, 0, 0), 561 SENSOR_ATTR_2(in1_input, S_IRUGO, show_in, NULL, 0, 1), 562 SENSOR_ATTR_2(in2_input, S_IRUGO, show_in, NULL, 0, 2), 563 SENSOR_ATTR_2(in3_input, S_IRUGO, show_in, NULL, 0, 3), 564 SENSOR_ATTR_2(in4_input, S_IRUGO, show_in, NULL, 0, 4), 565 SENSOR_ATTR_2(in5_input, S_IRUGO, show_in, NULL, 0, 5), 566 SENSOR_ATTR_2(in6_input, S_IRUGO, show_in, NULL, 0, 6), 567 SENSOR_ATTR_2(in7_input, S_IRUGO, show_in, NULL, 0, 7), 568 SENSOR_ATTR_2(in8_input, S_IRUGO, show_in, NULL, 0, 8), 569 SENSOR_ATTR_2(in9_input, S_IRUGO, show_in, NULL, 0, 9), 570 SENSOR_ATTR_2(in10_input, S_IRUGO, show_in, NULL, 0, 10), 571 }; 572 573 /* For models with in1 alarm capability */ 574 static struct sensor_device_attribute_2 fxxxx_in1_alarm_attr[] = { 575 SENSOR_ATTR_2(in1_max, S_IRUGO|S_IWUSR, show_in_max, store_in_max, 576 0, 1), 577 SENSOR_ATTR_2(in1_beep, S_IRUGO|S_IWUSR, show_in_beep, store_in_beep, 578 0, 1), 579 SENSOR_ATTR_2(in1_alarm, S_IRUGO, show_in_alarm, NULL, 0, 1), 580 }; 581 582 /* Fan / PWM attr common to all models */ 583 static struct sensor_device_attribute_2 fxxxx_fan_attr[4][6] = { { 584 SENSOR_ATTR_2(fan1_input, S_IRUGO, show_fan, NULL, 0, 0), 585 SENSOR_ATTR_2(fan1_full_speed, S_IRUGO|S_IWUSR, 586 show_fan_full_speed, 587 store_fan_full_speed, 0, 0), 588 SENSOR_ATTR_2(fan1_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 0), 589 SENSOR_ATTR_2(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 0), 590 SENSOR_ATTR_2(pwm1_enable, S_IRUGO|S_IWUSR, show_pwm_enable, 591 store_pwm_enable, 0, 0), 592 SENSOR_ATTR_2(pwm1_interpolate, S_IRUGO|S_IWUSR, 593 show_pwm_interpolate, store_pwm_interpolate, 0, 0), 594 }, { 595 SENSOR_ATTR_2(fan2_input, S_IRUGO, show_fan, NULL, 0, 1), 596 SENSOR_ATTR_2(fan2_full_speed, S_IRUGO|S_IWUSR, 597 show_fan_full_speed, 598 store_fan_full_speed, 0, 1), 599 SENSOR_ATTR_2(fan2_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 1), 600 SENSOR_ATTR_2(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 1), 601 SENSOR_ATTR_2(pwm2_enable, S_IRUGO|S_IWUSR, show_pwm_enable, 602 store_pwm_enable, 0, 1), 603 SENSOR_ATTR_2(pwm2_interpolate, S_IRUGO|S_IWUSR, 604 show_pwm_interpolate, store_pwm_interpolate, 0, 1), 605 }, { 606 SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2), 607 SENSOR_ATTR_2(fan3_full_speed, S_IRUGO|S_IWUSR, 608 show_fan_full_speed, 609 store_fan_full_speed, 0, 2), 610 SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2), 611 SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 2), 612 SENSOR_ATTR_2(pwm3_enable, S_IRUGO|S_IWUSR, show_pwm_enable, 613 store_pwm_enable, 0, 2), 614 SENSOR_ATTR_2(pwm3_interpolate, S_IRUGO|S_IWUSR, 615 show_pwm_interpolate, store_pwm_interpolate, 0, 2), 616 }, { 617 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3), 618 SENSOR_ATTR_2(fan4_full_speed, S_IRUGO|S_IWUSR, 619 show_fan_full_speed, 620 store_fan_full_speed, 0, 3), 621 SENSOR_ATTR_2(fan4_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 3), 622 SENSOR_ATTR_2(pwm4, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0, 3), 623 SENSOR_ATTR_2(pwm4_enable, S_IRUGO|S_IWUSR, show_pwm_enable, 624 store_pwm_enable, 0, 3), 625 SENSOR_ATTR_2(pwm4_interpolate, S_IRUGO|S_IWUSR, 626 show_pwm_interpolate, store_pwm_interpolate, 0, 3), 627 } }; 628 629 /* Attr for the third fan of the f71808a, which only has manual pwm */ 630 static struct sensor_device_attribute_2 f71808a_fan3_attr[] = { 631 SENSOR_ATTR_2(fan3_input, S_IRUGO, show_fan, NULL, 0, 2), 632 SENSOR_ATTR_2(fan3_alarm, S_IRUGO, show_fan_alarm, NULL, 0, 2), 633 SENSOR_ATTR_2(pwm3, S_IRUGO|S_IWUSR, 634 show_simple_pwm, store_simple_pwm, 0, 2), 635 }; 636 637 /* Attr for models which can beep on Fan alarm */ 638 static struct sensor_device_attribute_2 fxxxx_fan_beep_attr[] = { 639 SENSOR_ATTR_2(fan1_beep, S_IRUGO|S_IWUSR, show_fan_beep, 640 store_fan_beep, 0, 0), 641 SENSOR_ATTR_2(fan2_beep, S_IRUGO|S_IWUSR, show_fan_beep, 642 store_fan_beep, 0, 1), 643 SENSOR_ATTR_2(fan3_beep, S_IRUGO|S_IWUSR, show_fan_beep, 644 store_fan_beep, 0, 2), 645 SENSOR_ATTR_2(fan4_beep, S_IRUGO|S_IWUSR, show_fan_beep, 646 store_fan_beep, 0, 3), 647 }; 648 649 /* 650 * PWM attr for the f71862fg, fewer pwms and fewer zones per pwm than the 651 * standard models 652 */ 653 static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[3][7] = { { 654 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, 655 show_pwm_auto_point_channel, 656 store_pwm_auto_point_channel, 0, 0), 657 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR, 658 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 659 1, 0), 660 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR, 661 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 662 4, 0), 663 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR, 664 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 665 0, 0), 666 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR, 667 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 668 3, 0), 669 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 670 show_pwm_auto_point_temp_hyst, 671 store_pwm_auto_point_temp_hyst, 672 0, 0), 673 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO, 674 show_pwm_auto_point_temp_hyst, NULL, 3, 0), 675 }, { 676 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR, 677 show_pwm_auto_point_channel, 678 store_pwm_auto_point_channel, 0, 1), 679 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR, 680 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 681 1, 1), 682 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR, 683 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 684 4, 1), 685 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR, 686 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 687 0, 1), 688 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR, 689 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 690 3, 1), 691 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 692 show_pwm_auto_point_temp_hyst, 693 store_pwm_auto_point_temp_hyst, 694 0, 1), 695 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO, 696 show_pwm_auto_point_temp_hyst, NULL, 3, 1), 697 }, { 698 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR, 699 show_pwm_auto_point_channel, 700 store_pwm_auto_point_channel, 0, 2), 701 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR, 702 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 703 1, 2), 704 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR, 705 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 706 4, 2), 707 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR, 708 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 709 0, 2), 710 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR, 711 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 712 3, 2), 713 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 714 show_pwm_auto_point_temp_hyst, 715 store_pwm_auto_point_temp_hyst, 716 0, 2), 717 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO, 718 show_pwm_auto_point_temp_hyst, NULL, 3, 2), 719 } }; 720 721 /* 722 * PWM attr for the f71808e/f71869, almost identical to the f71862fg, but the 723 * pwm setting when the temperature is above the pwmX_auto_point1_temp can be 724 * programmed instead of being hardcoded to 0xff 725 */ 726 static struct sensor_device_attribute_2 f71869_auto_pwm_attr[3][8] = { { 727 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, 728 show_pwm_auto_point_channel, 729 store_pwm_auto_point_channel, 0, 0), 730 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR, 731 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 732 0, 0), 733 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR, 734 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 735 1, 0), 736 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR, 737 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 738 4, 0), 739 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR, 740 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 741 0, 0), 742 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR, 743 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 744 3, 0), 745 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 746 show_pwm_auto_point_temp_hyst, 747 store_pwm_auto_point_temp_hyst, 748 0, 0), 749 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO, 750 show_pwm_auto_point_temp_hyst, NULL, 3, 0), 751 }, { 752 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR, 753 show_pwm_auto_point_channel, 754 store_pwm_auto_point_channel, 0, 1), 755 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR, 756 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 757 0, 1), 758 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR, 759 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 760 1, 1), 761 SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR, 762 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 763 4, 1), 764 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR, 765 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 766 0, 1), 767 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR, 768 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 769 3, 1), 770 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 771 show_pwm_auto_point_temp_hyst, 772 store_pwm_auto_point_temp_hyst, 773 0, 1), 774 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO, 775 show_pwm_auto_point_temp_hyst, NULL, 3, 1), 776 }, { 777 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR, 778 show_pwm_auto_point_channel, 779 store_pwm_auto_point_channel, 0, 2), 780 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR, 781 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 782 0, 2), 783 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR, 784 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 785 1, 2), 786 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR, 787 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 788 4, 2), 789 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR, 790 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 791 0, 2), 792 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR, 793 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 794 3, 2), 795 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 796 show_pwm_auto_point_temp_hyst, 797 store_pwm_auto_point_temp_hyst, 798 0, 2), 799 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO, 800 show_pwm_auto_point_temp_hyst, NULL, 3, 2), 801 } }; 802 803 /* PWM attr for the standard models */ 804 static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { { 805 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, 806 show_pwm_auto_point_channel, 807 store_pwm_auto_point_channel, 0, 0), 808 SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR, 809 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 810 0, 0), 811 SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR, 812 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 813 1, 0), 814 SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR, 815 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 816 2, 0), 817 SENSOR_ATTR_2(pwm1_auto_point4_pwm, S_IRUGO|S_IWUSR, 818 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 819 3, 0), 820 SENSOR_ATTR_2(pwm1_auto_point5_pwm, S_IRUGO|S_IWUSR, 821 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 822 4, 0), 823 SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR, 824 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 825 0, 0), 826 SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR, 827 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 828 1, 0), 829 SENSOR_ATTR_2(pwm1_auto_point3_temp, S_IRUGO|S_IWUSR, 830 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 831 2, 0), 832 SENSOR_ATTR_2(pwm1_auto_point4_temp, S_IRUGO|S_IWUSR, 833 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 834 3, 0), 835 SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 836 show_pwm_auto_point_temp_hyst, 837 store_pwm_auto_point_temp_hyst, 838 0, 0), 839 SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO, 840 show_pwm_auto_point_temp_hyst, NULL, 1, 0), 841 SENSOR_ATTR_2(pwm1_auto_point3_temp_hyst, S_IRUGO, 842 show_pwm_auto_point_temp_hyst, NULL, 2, 0), 843 SENSOR_ATTR_2(pwm1_auto_point4_temp_hyst, S_IRUGO, 844 show_pwm_auto_point_temp_hyst, NULL, 3, 0), 845 }, { 846 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR, 847 show_pwm_auto_point_channel, 848 store_pwm_auto_point_channel, 0, 1), 849 SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR, 850 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 851 0, 1), 852 SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR, 853 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 854 1, 1), 855 SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR, 856 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 857 2, 1), 858 SENSOR_ATTR_2(pwm2_auto_point4_pwm, S_IRUGO|S_IWUSR, 859 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 860 3, 1), 861 SENSOR_ATTR_2(pwm2_auto_point5_pwm, S_IRUGO|S_IWUSR, 862 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 863 4, 1), 864 SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR, 865 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 866 0, 1), 867 SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR, 868 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 869 1, 1), 870 SENSOR_ATTR_2(pwm2_auto_point3_temp, S_IRUGO|S_IWUSR, 871 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 872 2, 1), 873 SENSOR_ATTR_2(pwm2_auto_point4_temp, S_IRUGO|S_IWUSR, 874 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 875 3, 1), 876 SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 877 show_pwm_auto_point_temp_hyst, 878 store_pwm_auto_point_temp_hyst, 879 0, 1), 880 SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO, 881 show_pwm_auto_point_temp_hyst, NULL, 1, 1), 882 SENSOR_ATTR_2(pwm2_auto_point3_temp_hyst, S_IRUGO, 883 show_pwm_auto_point_temp_hyst, NULL, 2, 1), 884 SENSOR_ATTR_2(pwm2_auto_point4_temp_hyst, S_IRUGO, 885 show_pwm_auto_point_temp_hyst, NULL, 3, 1), 886 }, { 887 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR, 888 show_pwm_auto_point_channel, 889 store_pwm_auto_point_channel, 0, 2), 890 SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR, 891 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 892 0, 2), 893 SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR, 894 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 895 1, 2), 896 SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR, 897 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 898 2, 2), 899 SENSOR_ATTR_2(pwm3_auto_point4_pwm, S_IRUGO|S_IWUSR, 900 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 901 3, 2), 902 SENSOR_ATTR_2(pwm3_auto_point5_pwm, S_IRUGO|S_IWUSR, 903 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 904 4, 2), 905 SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR, 906 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 907 0, 2), 908 SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR, 909 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 910 1, 2), 911 SENSOR_ATTR_2(pwm3_auto_point3_temp, S_IRUGO|S_IWUSR, 912 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 913 2, 2), 914 SENSOR_ATTR_2(pwm3_auto_point4_temp, S_IRUGO|S_IWUSR, 915 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 916 3, 2), 917 SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 918 show_pwm_auto_point_temp_hyst, 919 store_pwm_auto_point_temp_hyst, 920 0, 2), 921 SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO, 922 show_pwm_auto_point_temp_hyst, NULL, 1, 2), 923 SENSOR_ATTR_2(pwm3_auto_point3_temp_hyst, S_IRUGO, 924 show_pwm_auto_point_temp_hyst, NULL, 2, 2), 925 SENSOR_ATTR_2(pwm3_auto_point4_temp_hyst, S_IRUGO, 926 show_pwm_auto_point_temp_hyst, NULL, 3, 2), 927 }, { 928 SENSOR_ATTR_2(pwm4_auto_channels_temp, S_IRUGO|S_IWUSR, 929 show_pwm_auto_point_channel, 930 store_pwm_auto_point_channel, 0, 3), 931 SENSOR_ATTR_2(pwm4_auto_point1_pwm, S_IRUGO|S_IWUSR, 932 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 933 0, 3), 934 SENSOR_ATTR_2(pwm4_auto_point2_pwm, S_IRUGO|S_IWUSR, 935 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 936 1, 3), 937 SENSOR_ATTR_2(pwm4_auto_point3_pwm, S_IRUGO|S_IWUSR, 938 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 939 2, 3), 940 SENSOR_ATTR_2(pwm4_auto_point4_pwm, S_IRUGO|S_IWUSR, 941 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 942 3, 3), 943 SENSOR_ATTR_2(pwm4_auto_point5_pwm, S_IRUGO|S_IWUSR, 944 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 945 4, 3), 946 SENSOR_ATTR_2(pwm4_auto_point1_temp, S_IRUGO|S_IWUSR, 947 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 948 0, 3), 949 SENSOR_ATTR_2(pwm4_auto_point2_temp, S_IRUGO|S_IWUSR, 950 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 951 1, 3), 952 SENSOR_ATTR_2(pwm4_auto_point3_temp, S_IRUGO|S_IWUSR, 953 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 954 2, 3), 955 SENSOR_ATTR_2(pwm4_auto_point4_temp, S_IRUGO|S_IWUSR, 956 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 957 3, 3), 958 SENSOR_ATTR_2(pwm4_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 959 show_pwm_auto_point_temp_hyst, 960 store_pwm_auto_point_temp_hyst, 961 0, 3), 962 SENSOR_ATTR_2(pwm4_auto_point2_temp_hyst, S_IRUGO, 963 show_pwm_auto_point_temp_hyst, NULL, 1, 3), 964 SENSOR_ATTR_2(pwm4_auto_point3_temp_hyst, S_IRUGO, 965 show_pwm_auto_point_temp_hyst, NULL, 2, 3), 966 SENSOR_ATTR_2(pwm4_auto_point4_temp_hyst, S_IRUGO, 967 show_pwm_auto_point_temp_hyst, NULL, 3, 3), 968 } }; 969 970 /* Fan attr specific to the f8000 (4th fan input can only measure speed) */ 971 static struct sensor_device_attribute_2 f8000_fan_attr[] = { 972 SENSOR_ATTR_2(fan4_input, S_IRUGO, show_fan, NULL, 0, 3), 973 }; 974 975 /* 976 * PWM attr for the f8000, zones mapped to temp instead of to pwm! 977 * Also the register block at offset A0 maps to TEMP1 (so our temp2, as the 978 * F8000 starts counting temps at 0), B0 maps the TEMP2 and C0 maps to TEMP0 979 */ 980 static struct sensor_device_attribute_2 f8000_auto_pwm_attr[3][14] = { { 981 SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, 982 show_pwm_auto_point_channel, 983 store_pwm_auto_point_channel, 0, 0), 984 SENSOR_ATTR_2(temp1_auto_point1_pwm, S_IRUGO|S_IWUSR, 985 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 986 0, 2), 987 SENSOR_ATTR_2(temp1_auto_point2_pwm, S_IRUGO|S_IWUSR, 988 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 989 1, 2), 990 SENSOR_ATTR_2(temp1_auto_point3_pwm, S_IRUGO|S_IWUSR, 991 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 992 2, 2), 993 SENSOR_ATTR_2(temp1_auto_point4_pwm, S_IRUGO|S_IWUSR, 994 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 995 3, 2), 996 SENSOR_ATTR_2(temp1_auto_point5_pwm, S_IRUGO|S_IWUSR, 997 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 998 4, 2), 999 SENSOR_ATTR_2(temp1_auto_point1_temp, S_IRUGO|S_IWUSR, 1000 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1001 0, 2), 1002 SENSOR_ATTR_2(temp1_auto_point2_temp, S_IRUGO|S_IWUSR, 1003 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1004 1, 2), 1005 SENSOR_ATTR_2(temp1_auto_point3_temp, S_IRUGO|S_IWUSR, 1006 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1007 2, 2), 1008 SENSOR_ATTR_2(temp1_auto_point4_temp, S_IRUGO|S_IWUSR, 1009 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1010 3, 2), 1011 SENSOR_ATTR_2(temp1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 1012 show_pwm_auto_point_temp_hyst, 1013 store_pwm_auto_point_temp_hyst, 1014 0, 2), 1015 SENSOR_ATTR_2(temp1_auto_point2_temp_hyst, S_IRUGO, 1016 show_pwm_auto_point_temp_hyst, NULL, 1, 2), 1017 SENSOR_ATTR_2(temp1_auto_point3_temp_hyst, S_IRUGO, 1018 show_pwm_auto_point_temp_hyst, NULL, 2, 2), 1019 SENSOR_ATTR_2(temp1_auto_point4_temp_hyst, S_IRUGO, 1020 show_pwm_auto_point_temp_hyst, NULL, 3, 2), 1021 }, { 1022 SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR, 1023 show_pwm_auto_point_channel, 1024 store_pwm_auto_point_channel, 0, 1), 1025 SENSOR_ATTR_2(temp2_auto_point1_pwm, S_IRUGO|S_IWUSR, 1026 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1027 0, 0), 1028 SENSOR_ATTR_2(temp2_auto_point2_pwm, S_IRUGO|S_IWUSR, 1029 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1030 1, 0), 1031 SENSOR_ATTR_2(temp2_auto_point3_pwm, S_IRUGO|S_IWUSR, 1032 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1033 2, 0), 1034 SENSOR_ATTR_2(temp2_auto_point4_pwm, S_IRUGO|S_IWUSR, 1035 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1036 3, 0), 1037 SENSOR_ATTR_2(temp2_auto_point5_pwm, S_IRUGO|S_IWUSR, 1038 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1039 4, 0), 1040 SENSOR_ATTR_2(temp2_auto_point1_temp, S_IRUGO|S_IWUSR, 1041 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1042 0, 0), 1043 SENSOR_ATTR_2(temp2_auto_point2_temp, S_IRUGO|S_IWUSR, 1044 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1045 1, 0), 1046 SENSOR_ATTR_2(temp2_auto_point3_temp, S_IRUGO|S_IWUSR, 1047 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1048 2, 0), 1049 SENSOR_ATTR_2(temp2_auto_point4_temp, S_IRUGO|S_IWUSR, 1050 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1051 3, 0), 1052 SENSOR_ATTR_2(temp2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 1053 show_pwm_auto_point_temp_hyst, 1054 store_pwm_auto_point_temp_hyst, 1055 0, 0), 1056 SENSOR_ATTR_2(temp2_auto_point2_temp_hyst, S_IRUGO, 1057 show_pwm_auto_point_temp_hyst, NULL, 1, 0), 1058 SENSOR_ATTR_2(temp2_auto_point3_temp_hyst, S_IRUGO, 1059 show_pwm_auto_point_temp_hyst, NULL, 2, 0), 1060 SENSOR_ATTR_2(temp2_auto_point4_temp_hyst, S_IRUGO, 1061 show_pwm_auto_point_temp_hyst, NULL, 3, 0), 1062 }, { 1063 SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR, 1064 show_pwm_auto_point_channel, 1065 store_pwm_auto_point_channel, 0, 2), 1066 SENSOR_ATTR_2(temp3_auto_point1_pwm, S_IRUGO|S_IWUSR, 1067 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1068 0, 1), 1069 SENSOR_ATTR_2(temp3_auto_point2_pwm, S_IRUGO|S_IWUSR, 1070 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1071 1, 1), 1072 SENSOR_ATTR_2(temp3_auto_point3_pwm, S_IRUGO|S_IWUSR, 1073 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1074 2, 1), 1075 SENSOR_ATTR_2(temp3_auto_point4_pwm, S_IRUGO|S_IWUSR, 1076 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1077 3, 1), 1078 SENSOR_ATTR_2(temp3_auto_point5_pwm, S_IRUGO|S_IWUSR, 1079 show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, 1080 4, 1), 1081 SENSOR_ATTR_2(temp3_auto_point1_temp, S_IRUGO|S_IWUSR, 1082 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1083 0, 1), 1084 SENSOR_ATTR_2(temp3_auto_point2_temp, S_IRUGO|S_IWUSR, 1085 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1086 1, 1), 1087 SENSOR_ATTR_2(temp3_auto_point3_temp, S_IRUGO|S_IWUSR, 1088 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1089 2, 1), 1090 SENSOR_ATTR_2(temp3_auto_point4_temp, S_IRUGO|S_IWUSR, 1091 show_pwm_auto_point_temp, store_pwm_auto_point_temp, 1092 3, 1), 1093 SENSOR_ATTR_2(temp3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, 1094 show_pwm_auto_point_temp_hyst, 1095 store_pwm_auto_point_temp_hyst, 1096 0, 1), 1097 SENSOR_ATTR_2(temp3_auto_point2_temp_hyst, S_IRUGO, 1098 show_pwm_auto_point_temp_hyst, NULL, 1, 1), 1099 SENSOR_ATTR_2(temp3_auto_point3_temp_hyst, S_IRUGO, 1100 show_pwm_auto_point_temp_hyst, NULL, 2, 1), 1101 SENSOR_ATTR_2(temp3_auto_point4_temp_hyst, S_IRUGO, 1102 show_pwm_auto_point_temp_hyst, NULL, 3, 1), 1103 } }; 1104 1105 /* Super I/O functions */ 1106 static inline int superio_inb(int base, int reg) 1107 { 1108 outb(reg, base); 1109 return inb(base + 1); 1110 } 1111 1112 static int superio_inw(int base, int reg) 1113 { 1114 int val; 1115 val = superio_inb(base, reg) << 8; 1116 val |= superio_inb(base, reg + 1); 1117 return val; 1118 } 1119 1120 static inline int superio_enter(int base) 1121 { 1122 /* Don't step on other drivers' I/O space by accident */ 1123 if (!request_muxed_region(base, 2, DRVNAME)) { 1124 pr_err("I/O address 0x%04x already in use\n", base); 1125 return -EBUSY; 1126 } 1127 1128 /* according to the datasheet the key must be send twice! */ 1129 outb(SIO_UNLOCK_KEY, base); 1130 outb(SIO_UNLOCK_KEY, base); 1131 1132 return 0; 1133 } 1134 1135 static inline void superio_select(int base, int ld) 1136 { 1137 outb(SIO_REG_LDSEL, base); 1138 outb(ld, base + 1); 1139 } 1140 1141 static inline void superio_exit(int base) 1142 { 1143 outb(SIO_LOCK_KEY, base); 1144 release_region(base, 2); 1145 } 1146 1147 static inline int fan_from_reg(u16 reg) 1148 { 1149 return reg ? (1500000 / reg) : 0; 1150 } 1151 1152 static inline u16 fan_to_reg(int fan) 1153 { 1154 return fan ? (1500000 / fan) : 0; 1155 } 1156 1157 static u8 f71882fg_read8(struct f71882fg_data *data, u8 reg) 1158 { 1159 u8 val; 1160 1161 outb(reg, data->addr + ADDR_REG_OFFSET); 1162 val = inb(data->addr + DATA_REG_OFFSET); 1163 1164 return val; 1165 } 1166 1167 static u16 f71882fg_read16(struct f71882fg_data *data, u8 reg) 1168 { 1169 u16 val; 1170 1171 val = f71882fg_read8(data, reg) << 8; 1172 val |= f71882fg_read8(data, reg + 1); 1173 1174 return val; 1175 } 1176 1177 static void f71882fg_write8(struct f71882fg_data *data, u8 reg, u8 val) 1178 { 1179 outb(reg, data->addr + ADDR_REG_OFFSET); 1180 outb(val, data->addr + DATA_REG_OFFSET); 1181 } 1182 1183 static void f71882fg_write16(struct f71882fg_data *data, u8 reg, u16 val) 1184 { 1185 f71882fg_write8(data, reg, val >> 8); 1186 f71882fg_write8(data, reg + 1, val & 0xff); 1187 } 1188 1189 static u16 f71882fg_read_temp(struct f71882fg_data *data, int nr) 1190 { 1191 if (data->type == f71858fg) 1192 return f71882fg_read16(data, F71882FG_REG_TEMP(nr)); 1193 else 1194 return f71882fg_read8(data, F71882FG_REG_TEMP(nr)); 1195 } 1196 1197 static struct f71882fg_data *f71882fg_update_device(struct device *dev) 1198 { 1199 struct f71882fg_data *data = dev_get_drvdata(dev); 1200 int nr_fans = f71882fg_nr_fans[data->type]; 1201 int nr_temps = f71882fg_nr_temps[data->type]; 1202 int nr, reg, point; 1203 1204 mutex_lock(&data->update_lock); 1205 1206 /* Update once every 60 seconds */ 1207 if (time_after(jiffies, data->last_limits + 60 * HZ) || 1208 !data->valid) { 1209 if (f71882fg_has_in1_alarm[data->type]) { 1210 if (data->type == f81866a) { 1211 data->in1_max = 1212 f71882fg_read8(data, 1213 F81866_REG_IN1_HIGH); 1214 data->in_beep = 1215 f71882fg_read8(data, 1216 F81866_REG_IN_BEEP); 1217 } else { 1218 data->in1_max = 1219 f71882fg_read8(data, 1220 F71882FG_REG_IN1_HIGH); 1221 data->in_beep = 1222 f71882fg_read8(data, 1223 F71882FG_REG_IN_BEEP); 1224 } 1225 } 1226 1227 /* Get High & boundary temps*/ 1228 for (nr = data->temp_start; nr < nr_temps + data->temp_start; 1229 nr++) { 1230 data->temp_ovt[nr] = f71882fg_read8(data, 1231 F71882FG_REG_TEMP_OVT(nr)); 1232 data->temp_high[nr] = f71882fg_read8(data, 1233 F71882FG_REG_TEMP_HIGH(nr)); 1234 } 1235 1236 if (data->type != f8000) { 1237 data->temp_hyst[0] = f71882fg_read8(data, 1238 F71882FG_REG_TEMP_HYST(0)); 1239 data->temp_hyst[1] = f71882fg_read8(data, 1240 F71882FG_REG_TEMP_HYST(1)); 1241 } 1242 /* All but the f71858fg / f8000 have this register */ 1243 if ((data->type != f71858fg) && (data->type != f8000)) { 1244 reg = f71882fg_read8(data, F71882FG_REG_TEMP_TYPE); 1245 data->temp_type[1] = (reg & 0x02) ? 2 : 4; 1246 data->temp_type[2] = (reg & 0x04) ? 2 : 4; 1247 data->temp_type[3] = (reg & 0x08) ? 2 : 4; 1248 } 1249 1250 if (f71882fg_fan_has_beep[data->type]) 1251 data->fan_beep = f71882fg_read8(data, 1252 F71882FG_REG_FAN_BEEP); 1253 1254 if (f71882fg_temp_has_beep[data->type]) 1255 data->temp_beep = f71882fg_read8(data, 1256 F71882FG_REG_TEMP_BEEP); 1257 1258 data->pwm_enable = f71882fg_read8(data, 1259 F71882FG_REG_PWM_ENABLE); 1260 data->pwm_auto_point_hyst[0] = 1261 f71882fg_read8(data, F71882FG_REG_FAN_HYST(0)); 1262 data->pwm_auto_point_hyst[1] = 1263 f71882fg_read8(data, F71882FG_REG_FAN_HYST(1)); 1264 1265 for (nr = 0; nr < nr_fans; nr++) { 1266 data->pwm_auto_point_mapping[nr] = 1267 f71882fg_read8(data, 1268 F71882FG_REG_POINT_MAPPING(nr)); 1269 1270 switch (data->type) { 1271 default: 1272 for (point = 0; point < 5; point++) { 1273 data->pwm_auto_point_pwm[nr][point] = 1274 f71882fg_read8(data, 1275 F71882FG_REG_POINT_PWM 1276 (nr, point)); 1277 } 1278 for (point = 0; point < 4; point++) { 1279 data->pwm_auto_point_temp[nr][point] = 1280 f71882fg_read8(data, 1281 F71882FG_REG_POINT_TEMP 1282 (nr, point)); 1283 } 1284 break; 1285 case f71808e: 1286 case f71869: 1287 data->pwm_auto_point_pwm[nr][0] = 1288 f71882fg_read8(data, 1289 F71882FG_REG_POINT_PWM(nr, 0)); 1290 fallthrough; 1291 case f71862fg: 1292 data->pwm_auto_point_pwm[nr][1] = 1293 f71882fg_read8(data, 1294 F71882FG_REG_POINT_PWM 1295 (nr, 1)); 1296 data->pwm_auto_point_pwm[nr][4] = 1297 f71882fg_read8(data, 1298 F71882FG_REG_POINT_PWM 1299 (nr, 4)); 1300 data->pwm_auto_point_temp[nr][0] = 1301 f71882fg_read8(data, 1302 F71882FG_REG_POINT_TEMP 1303 (nr, 0)); 1304 data->pwm_auto_point_temp[nr][3] = 1305 f71882fg_read8(data, 1306 F71882FG_REG_POINT_TEMP 1307 (nr, 3)); 1308 break; 1309 } 1310 } 1311 data->last_limits = jiffies; 1312 } 1313 1314 /* Update every second */ 1315 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { 1316 data->temp_status = f71882fg_read8(data, 1317 F71882FG_REG_TEMP_STATUS); 1318 data->temp_diode_open = f71882fg_read8(data, 1319 F71882FG_REG_TEMP_DIODE_OPEN); 1320 for (nr = data->temp_start; nr < nr_temps + data->temp_start; 1321 nr++) 1322 data->temp[nr] = f71882fg_read_temp(data, nr); 1323 1324 data->fan_status = f71882fg_read8(data, 1325 F71882FG_REG_FAN_STATUS); 1326 for (nr = 0; nr < nr_fans; nr++) { 1327 data->fan[nr] = f71882fg_read16(data, 1328 F71882FG_REG_FAN(nr)); 1329 data->fan_target[nr] = 1330 f71882fg_read16(data, F71882FG_REG_FAN_TARGET(nr)); 1331 data->fan_full_speed[nr] = 1332 f71882fg_read16(data, 1333 F71882FG_REG_FAN_FULL_SPEED(nr)); 1334 data->pwm[nr] = 1335 f71882fg_read8(data, F71882FG_REG_PWM(nr)); 1336 } 1337 /* Some models have 1 more fan with limited capabilities */ 1338 if (data->type == f71808a) { 1339 data->fan[2] = f71882fg_read16(data, 1340 F71882FG_REG_FAN(2)); 1341 data->pwm[2] = f71882fg_read8(data, 1342 F71882FG_REG_PWM(2)); 1343 } 1344 if (data->type == f8000) 1345 data->fan[3] = f71882fg_read16(data, 1346 F71882FG_REG_FAN(3)); 1347 1348 if (f71882fg_has_in1_alarm[data->type]) { 1349 if (data->type == f81866a) 1350 data->in_status = f71882fg_read8(data, 1351 F81866_REG_IN_STATUS); 1352 1353 else 1354 data->in_status = f71882fg_read8(data, 1355 F71882FG_REG_IN_STATUS); 1356 } 1357 1358 for (nr = 0; nr < F71882FG_MAX_INS; nr++) 1359 if (f71882fg_has_in[data->type][nr]) 1360 data->in[nr] = f71882fg_read8(data, 1361 F71882FG_REG_IN(nr)); 1362 1363 data->last_updated = jiffies; 1364 data->valid = true; 1365 } 1366 1367 mutex_unlock(&data->update_lock); 1368 1369 return data; 1370 } 1371 1372 /* Sysfs Interface */ 1373 static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, 1374 char *buf) 1375 { 1376 struct f71882fg_data *data = f71882fg_update_device(dev); 1377 int nr = to_sensor_dev_attr_2(devattr)->index; 1378 int speed = fan_from_reg(data->fan[nr]); 1379 1380 if (speed == FAN_MIN_DETECT) 1381 speed = 0; 1382 1383 return sprintf(buf, "%d\n", speed); 1384 } 1385 1386 static ssize_t show_fan_full_speed(struct device *dev, 1387 struct device_attribute *devattr, char *buf) 1388 { 1389 struct f71882fg_data *data = f71882fg_update_device(dev); 1390 int nr = to_sensor_dev_attr_2(devattr)->index; 1391 int speed = fan_from_reg(data->fan_full_speed[nr]); 1392 return sprintf(buf, "%d\n", speed); 1393 } 1394 1395 static ssize_t store_fan_full_speed(struct device *dev, 1396 struct device_attribute *devattr, 1397 const char *buf, size_t count) 1398 { 1399 struct f71882fg_data *data = dev_get_drvdata(dev); 1400 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1401 long val; 1402 1403 err = kstrtol(buf, 10, &val); 1404 if (err) 1405 return err; 1406 1407 val = clamp_val(val, 23, 1500000); 1408 val = fan_to_reg(val); 1409 1410 mutex_lock(&data->update_lock); 1411 f71882fg_write16(data, F71882FG_REG_FAN_FULL_SPEED(nr), val); 1412 data->fan_full_speed[nr] = val; 1413 mutex_unlock(&data->update_lock); 1414 1415 return count; 1416 } 1417 1418 static ssize_t show_fan_beep(struct device *dev, struct device_attribute 1419 *devattr, char *buf) 1420 { 1421 struct f71882fg_data *data = f71882fg_update_device(dev); 1422 int nr = to_sensor_dev_attr_2(devattr)->index; 1423 1424 if (data->fan_beep & (1 << nr)) 1425 return sprintf(buf, "1\n"); 1426 else 1427 return sprintf(buf, "0\n"); 1428 } 1429 1430 static ssize_t store_fan_beep(struct device *dev, struct device_attribute 1431 *devattr, const char *buf, size_t count) 1432 { 1433 struct f71882fg_data *data = dev_get_drvdata(dev); 1434 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1435 unsigned long val; 1436 1437 err = kstrtoul(buf, 10, &val); 1438 if (err) 1439 return err; 1440 1441 mutex_lock(&data->update_lock); 1442 data->fan_beep = f71882fg_read8(data, F71882FG_REG_FAN_BEEP); 1443 if (val) 1444 data->fan_beep |= 1 << nr; 1445 else 1446 data->fan_beep &= ~(1 << nr); 1447 1448 f71882fg_write8(data, F71882FG_REG_FAN_BEEP, data->fan_beep); 1449 mutex_unlock(&data->update_lock); 1450 1451 return count; 1452 } 1453 1454 static ssize_t show_fan_alarm(struct device *dev, struct device_attribute 1455 *devattr, char *buf) 1456 { 1457 struct f71882fg_data *data = f71882fg_update_device(dev); 1458 int nr = to_sensor_dev_attr_2(devattr)->index; 1459 1460 if (data->fan_status & (1 << nr)) 1461 return sprintf(buf, "1\n"); 1462 else 1463 return sprintf(buf, "0\n"); 1464 } 1465 1466 static ssize_t show_in(struct device *dev, struct device_attribute *devattr, 1467 char *buf) 1468 { 1469 struct f71882fg_data *data = f71882fg_update_device(dev); 1470 int nr = to_sensor_dev_attr_2(devattr)->index; 1471 1472 return sprintf(buf, "%d\n", data->in[nr] * 8); 1473 } 1474 1475 static ssize_t show_in_max(struct device *dev, struct device_attribute 1476 *devattr, char *buf) 1477 { 1478 struct f71882fg_data *data = f71882fg_update_device(dev); 1479 1480 return sprintf(buf, "%d\n", data->in1_max * 8); 1481 } 1482 1483 static ssize_t store_in_max(struct device *dev, struct device_attribute 1484 *devattr, const char *buf, size_t count) 1485 { 1486 struct f71882fg_data *data = dev_get_drvdata(dev); 1487 int err; 1488 long val; 1489 1490 err = kstrtol(buf, 10, &val); 1491 if (err) 1492 return err; 1493 1494 val /= 8; 1495 val = clamp_val(val, 0, 255); 1496 1497 mutex_lock(&data->update_lock); 1498 if (data->type == f81866a) 1499 f71882fg_write8(data, F81866_REG_IN1_HIGH, val); 1500 else 1501 f71882fg_write8(data, F71882FG_REG_IN1_HIGH, val); 1502 data->in1_max = val; 1503 mutex_unlock(&data->update_lock); 1504 1505 return count; 1506 } 1507 1508 static ssize_t show_in_beep(struct device *dev, struct device_attribute 1509 *devattr, char *buf) 1510 { 1511 struct f71882fg_data *data = f71882fg_update_device(dev); 1512 int nr = to_sensor_dev_attr_2(devattr)->index; 1513 1514 if (data->in_beep & (1 << nr)) 1515 return sprintf(buf, "1\n"); 1516 else 1517 return sprintf(buf, "0\n"); 1518 } 1519 1520 static ssize_t store_in_beep(struct device *dev, struct device_attribute 1521 *devattr, const char *buf, size_t count) 1522 { 1523 struct f71882fg_data *data = dev_get_drvdata(dev); 1524 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1525 unsigned long val; 1526 1527 err = kstrtoul(buf, 10, &val); 1528 if (err) 1529 return err; 1530 1531 mutex_lock(&data->update_lock); 1532 if (data->type == f81866a) 1533 data->in_beep = f71882fg_read8(data, F81866_REG_IN_BEEP); 1534 else 1535 data->in_beep = f71882fg_read8(data, F71882FG_REG_IN_BEEP); 1536 1537 if (val) 1538 data->in_beep |= 1 << nr; 1539 else 1540 data->in_beep &= ~(1 << nr); 1541 1542 if (data->type == f81866a) 1543 f71882fg_write8(data, F81866_REG_IN_BEEP, data->in_beep); 1544 else 1545 f71882fg_write8(data, F71882FG_REG_IN_BEEP, data->in_beep); 1546 mutex_unlock(&data->update_lock); 1547 1548 return count; 1549 } 1550 1551 static ssize_t show_in_alarm(struct device *dev, struct device_attribute 1552 *devattr, char *buf) 1553 { 1554 struct f71882fg_data *data = f71882fg_update_device(dev); 1555 int nr = to_sensor_dev_attr_2(devattr)->index; 1556 1557 if (data->in_status & (1 << nr)) 1558 return sprintf(buf, "1\n"); 1559 else 1560 return sprintf(buf, "0\n"); 1561 } 1562 1563 static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, 1564 char *buf) 1565 { 1566 struct f71882fg_data *data = f71882fg_update_device(dev); 1567 int nr = to_sensor_dev_attr_2(devattr)->index; 1568 int sign, temp; 1569 1570 if (data->type == f71858fg) { 1571 /* TEMP_TABLE_SEL 1 or 3 ? */ 1572 if (data->temp_config & 1) { 1573 sign = data->temp[nr] & 0x0001; 1574 temp = (data->temp[nr] >> 5) & 0x7ff; 1575 } else { 1576 sign = data->temp[nr] & 0x8000; 1577 temp = (data->temp[nr] >> 5) & 0x3ff; 1578 } 1579 temp *= 125; 1580 if (sign) 1581 temp -= 128000; 1582 } else { 1583 temp = ((s8)data->temp[nr]) * 1000; 1584 } 1585 1586 return sprintf(buf, "%d\n", temp); 1587 } 1588 1589 static ssize_t show_temp_max(struct device *dev, struct device_attribute 1590 *devattr, char *buf) 1591 { 1592 struct f71882fg_data *data = f71882fg_update_device(dev); 1593 int nr = to_sensor_dev_attr_2(devattr)->index; 1594 1595 return sprintf(buf, "%d\n", data->temp_high[nr] * 1000); 1596 } 1597 1598 static ssize_t store_temp_max(struct device *dev, struct device_attribute 1599 *devattr, const char *buf, size_t count) 1600 { 1601 struct f71882fg_data *data = dev_get_drvdata(dev); 1602 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1603 long val; 1604 1605 err = kstrtol(buf, 10, &val); 1606 if (err) 1607 return err; 1608 1609 val /= 1000; 1610 val = clamp_val(val, 0, 255); 1611 1612 mutex_lock(&data->update_lock); 1613 f71882fg_write8(data, F71882FG_REG_TEMP_HIGH(nr), val); 1614 data->temp_high[nr] = val; 1615 mutex_unlock(&data->update_lock); 1616 1617 return count; 1618 } 1619 1620 static ssize_t show_temp_max_hyst(struct device *dev, struct device_attribute 1621 *devattr, char *buf) 1622 { 1623 struct f71882fg_data *data = f71882fg_update_device(dev); 1624 int nr = to_sensor_dev_attr_2(devattr)->index; 1625 int temp_max_hyst; 1626 1627 mutex_lock(&data->update_lock); 1628 if (nr & 1) 1629 temp_max_hyst = data->temp_hyst[nr / 2] >> 4; 1630 else 1631 temp_max_hyst = data->temp_hyst[nr / 2] & 0x0f; 1632 temp_max_hyst = (data->temp_high[nr] - temp_max_hyst) * 1000; 1633 mutex_unlock(&data->update_lock); 1634 1635 return sprintf(buf, "%d\n", temp_max_hyst); 1636 } 1637 1638 static ssize_t store_temp_max_hyst(struct device *dev, struct device_attribute 1639 *devattr, const char *buf, size_t count) 1640 { 1641 struct f71882fg_data *data = dev_get_drvdata(dev); 1642 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1643 ssize_t ret = count; 1644 u8 reg; 1645 long val; 1646 1647 err = kstrtol(buf, 10, &val); 1648 if (err) 1649 return err; 1650 1651 val /= 1000; 1652 1653 mutex_lock(&data->update_lock); 1654 1655 /* convert abs to relative and check */ 1656 data->temp_high[nr] = f71882fg_read8(data, F71882FG_REG_TEMP_HIGH(nr)); 1657 val = clamp_val(val, data->temp_high[nr] - 15, data->temp_high[nr]); 1658 val = data->temp_high[nr] - val; 1659 1660 /* convert value to register contents */ 1661 reg = f71882fg_read8(data, F71882FG_REG_TEMP_HYST(nr / 2)); 1662 if (nr & 1) 1663 reg = (reg & 0x0f) | (val << 4); 1664 else 1665 reg = (reg & 0xf0) | val; 1666 f71882fg_write8(data, F71882FG_REG_TEMP_HYST(nr / 2), reg); 1667 data->temp_hyst[nr / 2] = reg; 1668 1669 mutex_unlock(&data->update_lock); 1670 return ret; 1671 } 1672 1673 static ssize_t show_temp_crit(struct device *dev, struct device_attribute 1674 *devattr, char *buf) 1675 { 1676 struct f71882fg_data *data = f71882fg_update_device(dev); 1677 int nr = to_sensor_dev_attr_2(devattr)->index; 1678 1679 return sprintf(buf, "%d\n", data->temp_ovt[nr] * 1000); 1680 } 1681 1682 static ssize_t store_temp_crit(struct device *dev, struct device_attribute 1683 *devattr, const char *buf, size_t count) 1684 { 1685 struct f71882fg_data *data = dev_get_drvdata(dev); 1686 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1687 long val; 1688 1689 err = kstrtol(buf, 10, &val); 1690 if (err) 1691 return err; 1692 1693 val /= 1000; 1694 val = clamp_val(val, 0, 255); 1695 1696 mutex_lock(&data->update_lock); 1697 f71882fg_write8(data, F71882FG_REG_TEMP_OVT(nr), val); 1698 data->temp_ovt[nr] = val; 1699 mutex_unlock(&data->update_lock); 1700 1701 return count; 1702 } 1703 1704 static ssize_t show_temp_crit_hyst(struct device *dev, struct device_attribute 1705 *devattr, char *buf) 1706 { 1707 struct f71882fg_data *data = f71882fg_update_device(dev); 1708 int nr = to_sensor_dev_attr_2(devattr)->index; 1709 int temp_crit_hyst; 1710 1711 mutex_lock(&data->update_lock); 1712 if (nr & 1) 1713 temp_crit_hyst = data->temp_hyst[nr / 2] >> 4; 1714 else 1715 temp_crit_hyst = data->temp_hyst[nr / 2] & 0x0f; 1716 temp_crit_hyst = (data->temp_ovt[nr] - temp_crit_hyst) * 1000; 1717 mutex_unlock(&data->update_lock); 1718 1719 return sprintf(buf, "%d\n", temp_crit_hyst); 1720 } 1721 1722 static ssize_t show_temp_type(struct device *dev, struct device_attribute 1723 *devattr, char *buf) 1724 { 1725 struct f71882fg_data *data = f71882fg_update_device(dev); 1726 int nr = to_sensor_dev_attr_2(devattr)->index; 1727 1728 return sprintf(buf, "%d\n", data->temp_type[nr]); 1729 } 1730 1731 static ssize_t show_temp_beep(struct device *dev, struct device_attribute 1732 *devattr, char *buf) 1733 { 1734 struct f71882fg_data *data = f71882fg_update_device(dev); 1735 int nr = to_sensor_dev_attr_2(devattr)->index; 1736 1737 if (data->temp_beep & (1 << nr)) 1738 return sprintf(buf, "1\n"); 1739 else 1740 return sprintf(buf, "0\n"); 1741 } 1742 1743 static ssize_t store_temp_beep(struct device *dev, struct device_attribute 1744 *devattr, const char *buf, size_t count) 1745 { 1746 struct f71882fg_data *data = dev_get_drvdata(dev); 1747 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1748 unsigned long val; 1749 1750 err = kstrtoul(buf, 10, &val); 1751 if (err) 1752 return err; 1753 1754 mutex_lock(&data->update_lock); 1755 data->temp_beep = f71882fg_read8(data, F71882FG_REG_TEMP_BEEP); 1756 if (val) 1757 data->temp_beep |= 1 << nr; 1758 else 1759 data->temp_beep &= ~(1 << nr); 1760 1761 f71882fg_write8(data, F71882FG_REG_TEMP_BEEP, data->temp_beep); 1762 mutex_unlock(&data->update_lock); 1763 1764 return count; 1765 } 1766 1767 static ssize_t show_temp_alarm(struct device *dev, struct device_attribute 1768 *devattr, char *buf) 1769 { 1770 struct f71882fg_data *data = f71882fg_update_device(dev); 1771 int nr = to_sensor_dev_attr_2(devattr)->index; 1772 1773 if (data->temp_status & (1 << nr)) 1774 return sprintf(buf, "1\n"); 1775 else 1776 return sprintf(buf, "0\n"); 1777 } 1778 1779 static ssize_t show_temp_fault(struct device *dev, struct device_attribute 1780 *devattr, char *buf) 1781 { 1782 struct f71882fg_data *data = f71882fg_update_device(dev); 1783 int nr = to_sensor_dev_attr_2(devattr)->index; 1784 1785 if (data->temp_diode_open & (1 << nr)) 1786 return sprintf(buf, "1\n"); 1787 else 1788 return sprintf(buf, "0\n"); 1789 } 1790 1791 static ssize_t show_pwm(struct device *dev, 1792 struct device_attribute *devattr, char *buf) 1793 { 1794 struct f71882fg_data *data = f71882fg_update_device(dev); 1795 int val, nr = to_sensor_dev_attr_2(devattr)->index; 1796 mutex_lock(&data->update_lock); 1797 if (data->pwm_enable & (1 << (2 * nr))) 1798 /* PWM mode */ 1799 val = data->pwm[nr]; 1800 else { 1801 /* RPM mode */ 1802 val = 255 * fan_from_reg(data->fan_target[nr]) 1803 / fan_from_reg(data->fan_full_speed[nr]); 1804 } 1805 mutex_unlock(&data->update_lock); 1806 return sprintf(buf, "%d\n", val); 1807 } 1808 1809 static ssize_t store_pwm(struct device *dev, 1810 struct device_attribute *devattr, const char *buf, 1811 size_t count) 1812 { 1813 struct f71882fg_data *data = dev_get_drvdata(dev); 1814 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1815 long val; 1816 1817 err = kstrtol(buf, 10, &val); 1818 if (err) 1819 return err; 1820 1821 val = clamp_val(val, 0, 255); 1822 1823 mutex_lock(&data->update_lock); 1824 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE); 1825 if ((data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 3) != 2) || 1826 (data->type != f8000 && !((data->pwm_enable >> 2 * nr) & 2))) { 1827 count = -EROFS; 1828 goto leave; 1829 } 1830 if (data->pwm_enable & (1 << (2 * nr))) { 1831 /* PWM mode */ 1832 f71882fg_write8(data, F71882FG_REG_PWM(nr), val); 1833 data->pwm[nr] = val; 1834 } else { 1835 /* RPM mode */ 1836 int target, full_speed; 1837 full_speed = f71882fg_read16(data, 1838 F71882FG_REG_FAN_FULL_SPEED(nr)); 1839 target = fan_to_reg(val * fan_from_reg(full_speed) / 255); 1840 f71882fg_write16(data, F71882FG_REG_FAN_TARGET(nr), target); 1841 data->fan_target[nr] = target; 1842 data->fan_full_speed[nr] = full_speed; 1843 } 1844 leave: 1845 mutex_unlock(&data->update_lock); 1846 1847 return count; 1848 } 1849 1850 static ssize_t show_simple_pwm(struct device *dev, 1851 struct device_attribute *devattr, char *buf) 1852 { 1853 struct f71882fg_data *data = f71882fg_update_device(dev); 1854 int val, nr = to_sensor_dev_attr_2(devattr)->index; 1855 1856 val = data->pwm[nr]; 1857 return sprintf(buf, "%d\n", val); 1858 } 1859 1860 static ssize_t store_simple_pwm(struct device *dev, 1861 struct device_attribute *devattr, 1862 const char *buf, size_t count) 1863 { 1864 struct f71882fg_data *data = dev_get_drvdata(dev); 1865 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1866 long val; 1867 1868 err = kstrtol(buf, 10, &val); 1869 if (err) 1870 return err; 1871 1872 val = clamp_val(val, 0, 255); 1873 1874 mutex_lock(&data->update_lock); 1875 f71882fg_write8(data, F71882FG_REG_PWM(nr), val); 1876 data->pwm[nr] = val; 1877 mutex_unlock(&data->update_lock); 1878 1879 return count; 1880 } 1881 1882 static ssize_t show_pwm_enable(struct device *dev, 1883 struct device_attribute *devattr, char *buf) 1884 { 1885 int result = 0; 1886 struct f71882fg_data *data = f71882fg_update_device(dev); 1887 int nr = to_sensor_dev_attr_2(devattr)->index; 1888 1889 switch ((data->pwm_enable >> 2 * nr) & 3) { 1890 case 0: 1891 case 1: 1892 result = 2; /* Normal auto mode */ 1893 break; 1894 case 2: 1895 result = 1; /* Manual mode */ 1896 break; 1897 case 3: 1898 if (data->type == f8000) 1899 result = 3; /* Thermostat mode */ 1900 else 1901 result = 1; /* Manual mode */ 1902 break; 1903 } 1904 1905 return sprintf(buf, "%d\n", result); 1906 } 1907 1908 static ssize_t store_pwm_enable(struct device *dev, struct device_attribute 1909 *devattr, const char *buf, size_t count) 1910 { 1911 struct f71882fg_data *data = dev_get_drvdata(dev); 1912 int err, nr = to_sensor_dev_attr_2(devattr)->index; 1913 long val; 1914 1915 err = kstrtol(buf, 10, &val); 1916 if (err) 1917 return err; 1918 1919 /* Special case for F8000 pwm channel 3 which only does auto mode */ 1920 if (data->type == f8000 && nr == 2 && val != 2) 1921 return -EINVAL; 1922 1923 mutex_lock(&data->update_lock); 1924 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE); 1925 /* Special case for F8000 auto PWM mode / Thermostat mode */ 1926 if (data->type == f8000 && ((data->pwm_enable >> 2 * nr) & 1)) { 1927 switch (val) { 1928 case 2: 1929 data->pwm_enable &= ~(2 << (2 * nr)); 1930 break; /* Normal auto mode */ 1931 case 3: 1932 data->pwm_enable |= 2 << (2 * nr); 1933 break; /* Thermostat mode */ 1934 default: 1935 count = -EINVAL; 1936 goto leave; 1937 } 1938 } else { 1939 switch (val) { 1940 case 1: 1941 /* The f71858fg does not support manual RPM mode */ 1942 if (data->type == f71858fg && 1943 ((data->pwm_enable >> (2 * nr)) & 1)) { 1944 count = -EINVAL; 1945 goto leave; 1946 } 1947 data->pwm_enable |= 2 << (2 * nr); 1948 break; /* Manual */ 1949 case 2: 1950 data->pwm_enable &= ~(2 << (2 * nr)); 1951 break; /* Normal auto mode */ 1952 default: 1953 count = -EINVAL; 1954 goto leave; 1955 } 1956 } 1957 f71882fg_write8(data, F71882FG_REG_PWM_ENABLE, data->pwm_enable); 1958 leave: 1959 mutex_unlock(&data->update_lock); 1960 1961 return count; 1962 } 1963 1964 static ssize_t show_pwm_auto_point_pwm(struct device *dev, 1965 struct device_attribute *devattr, 1966 char *buf) 1967 { 1968 int result; 1969 struct f71882fg_data *data = f71882fg_update_device(dev); 1970 int pwm = to_sensor_dev_attr_2(devattr)->index; 1971 int point = to_sensor_dev_attr_2(devattr)->nr; 1972 1973 mutex_lock(&data->update_lock); 1974 if (data->pwm_enable & (1 << (2 * pwm))) { 1975 /* PWM mode */ 1976 result = data->pwm_auto_point_pwm[pwm][point]; 1977 } else { 1978 /* RPM mode */ 1979 result = 32 * 255 / (32 + data->pwm_auto_point_pwm[pwm][point]); 1980 } 1981 mutex_unlock(&data->update_lock); 1982 1983 return sprintf(buf, "%d\n", result); 1984 } 1985 1986 static ssize_t store_pwm_auto_point_pwm(struct device *dev, 1987 struct device_attribute *devattr, 1988 const char *buf, size_t count) 1989 { 1990 struct f71882fg_data *data = dev_get_drvdata(dev); 1991 int err, pwm = to_sensor_dev_attr_2(devattr)->index; 1992 int point = to_sensor_dev_attr_2(devattr)->nr; 1993 long val; 1994 1995 err = kstrtol(buf, 10, &val); 1996 if (err) 1997 return err; 1998 1999 val = clamp_val(val, 0, 255); 2000 2001 mutex_lock(&data->update_lock); 2002 data->pwm_enable = f71882fg_read8(data, F71882FG_REG_PWM_ENABLE); 2003 if (data->pwm_enable & (1 << (2 * pwm))) { 2004 /* PWM mode */ 2005 } else { 2006 /* RPM mode */ 2007 if (val < 29) /* Prevent negative numbers */ 2008 val = 255; 2009 else 2010 val = (255 - val) * 32 / val; 2011 } 2012 f71882fg_write8(data, F71882FG_REG_POINT_PWM(pwm, point), val); 2013 data->pwm_auto_point_pwm[pwm][point] = val; 2014 mutex_unlock(&data->update_lock); 2015 2016 return count; 2017 } 2018 2019 static ssize_t show_pwm_auto_point_temp_hyst(struct device *dev, 2020 struct device_attribute *devattr, 2021 char *buf) 2022 { 2023 int result = 0; 2024 struct f71882fg_data *data = f71882fg_update_device(dev); 2025 int nr = to_sensor_dev_attr_2(devattr)->index; 2026 int point = to_sensor_dev_attr_2(devattr)->nr; 2027 2028 mutex_lock(&data->update_lock); 2029 if (nr & 1) 2030 result = data->pwm_auto_point_hyst[nr / 2] >> 4; 2031 else 2032 result = data->pwm_auto_point_hyst[nr / 2] & 0x0f; 2033 result = 1000 * (data->pwm_auto_point_temp[nr][point] - result); 2034 mutex_unlock(&data->update_lock); 2035 2036 return sprintf(buf, "%d\n", result); 2037 } 2038 2039 static ssize_t store_pwm_auto_point_temp_hyst(struct device *dev, 2040 struct device_attribute *devattr, 2041 const char *buf, size_t count) 2042 { 2043 struct f71882fg_data *data = dev_get_drvdata(dev); 2044 int err, nr = to_sensor_dev_attr_2(devattr)->index; 2045 int point = to_sensor_dev_attr_2(devattr)->nr; 2046 u8 reg; 2047 long val; 2048 2049 err = kstrtol(buf, 10, &val); 2050 if (err) 2051 return err; 2052 2053 val /= 1000; 2054 2055 mutex_lock(&data->update_lock); 2056 data->pwm_auto_point_temp[nr][point] = 2057 f71882fg_read8(data, F71882FG_REG_POINT_TEMP(nr, point)); 2058 val = clamp_val(val, data->pwm_auto_point_temp[nr][point] - 15, 2059 data->pwm_auto_point_temp[nr][point]); 2060 val = data->pwm_auto_point_temp[nr][point] - val; 2061 2062 reg = f71882fg_read8(data, F71882FG_REG_FAN_HYST(nr / 2)); 2063 if (nr & 1) 2064 reg = (reg & 0x0f) | (val << 4); 2065 else 2066 reg = (reg & 0xf0) | val; 2067 2068 f71882fg_write8(data, F71882FG_REG_FAN_HYST(nr / 2), reg); 2069 data->pwm_auto_point_hyst[nr / 2] = reg; 2070 mutex_unlock(&data->update_lock); 2071 2072 return count; 2073 } 2074 2075 static ssize_t show_pwm_interpolate(struct device *dev, 2076 struct device_attribute *devattr, char *buf) 2077 { 2078 int result; 2079 struct f71882fg_data *data = f71882fg_update_device(dev); 2080 int nr = to_sensor_dev_attr_2(devattr)->index; 2081 2082 result = (data->pwm_auto_point_mapping[nr] >> 4) & 1; 2083 2084 return sprintf(buf, "%d\n", result); 2085 } 2086 2087 static ssize_t store_pwm_interpolate(struct device *dev, 2088 struct device_attribute *devattr, 2089 const char *buf, size_t count) 2090 { 2091 struct f71882fg_data *data = dev_get_drvdata(dev); 2092 int err, nr = to_sensor_dev_attr_2(devattr)->index; 2093 unsigned long val; 2094 2095 err = kstrtoul(buf, 10, &val); 2096 if (err) 2097 return err; 2098 2099 mutex_lock(&data->update_lock); 2100 data->pwm_auto_point_mapping[nr] = 2101 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr)); 2102 if (val) 2103 val = data->pwm_auto_point_mapping[nr] | (1 << 4); 2104 else 2105 val = data->pwm_auto_point_mapping[nr] & (~(1 << 4)); 2106 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val); 2107 data->pwm_auto_point_mapping[nr] = val; 2108 mutex_unlock(&data->update_lock); 2109 2110 return count; 2111 } 2112 2113 static ssize_t show_pwm_auto_point_channel(struct device *dev, 2114 struct device_attribute *devattr, 2115 char *buf) 2116 { 2117 int result; 2118 struct f71882fg_data *data = f71882fg_update_device(dev); 2119 int nr = to_sensor_dev_attr_2(devattr)->index; 2120 2121 result = 1 << ((data->pwm_auto_point_mapping[nr] & 3) - 2122 data->temp_start); 2123 2124 return sprintf(buf, "%d\n", result); 2125 } 2126 2127 static ssize_t store_pwm_auto_point_channel(struct device *dev, 2128 struct device_attribute *devattr, 2129 const char *buf, size_t count) 2130 { 2131 struct f71882fg_data *data = dev_get_drvdata(dev); 2132 int err, nr = to_sensor_dev_attr_2(devattr)->index; 2133 long val; 2134 2135 err = kstrtol(buf, 10, &val); 2136 if (err) 2137 return err; 2138 2139 switch (val) { 2140 case 1: 2141 val = 0; 2142 break; 2143 case 2: 2144 val = 1; 2145 break; 2146 case 4: 2147 val = 2; 2148 break; 2149 default: 2150 return -EINVAL; 2151 } 2152 val += data->temp_start; 2153 mutex_lock(&data->update_lock); 2154 data->pwm_auto_point_mapping[nr] = 2155 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(nr)); 2156 val = (data->pwm_auto_point_mapping[nr] & 0xfc) | val; 2157 f71882fg_write8(data, F71882FG_REG_POINT_MAPPING(nr), val); 2158 data->pwm_auto_point_mapping[nr] = val; 2159 mutex_unlock(&data->update_lock); 2160 2161 return count; 2162 } 2163 2164 static ssize_t show_pwm_auto_point_temp(struct device *dev, 2165 struct device_attribute *devattr, 2166 char *buf) 2167 { 2168 int result; 2169 struct f71882fg_data *data = f71882fg_update_device(dev); 2170 int pwm = to_sensor_dev_attr_2(devattr)->index; 2171 int point = to_sensor_dev_attr_2(devattr)->nr; 2172 2173 result = data->pwm_auto_point_temp[pwm][point]; 2174 return sprintf(buf, "%d\n", 1000 * result); 2175 } 2176 2177 static ssize_t store_pwm_auto_point_temp(struct device *dev, 2178 struct device_attribute *devattr, 2179 const char *buf, size_t count) 2180 { 2181 struct f71882fg_data *data = dev_get_drvdata(dev); 2182 int err, pwm = to_sensor_dev_attr_2(devattr)->index; 2183 int point = to_sensor_dev_attr_2(devattr)->nr; 2184 long val; 2185 2186 err = kstrtol(buf, 10, &val); 2187 if (err) 2188 return err; 2189 2190 val /= 1000; 2191 2192 if (data->auto_point_temp_signed) 2193 val = clamp_val(val, -128, 127); 2194 else 2195 val = clamp_val(val, 0, 127); 2196 2197 mutex_lock(&data->update_lock); 2198 f71882fg_write8(data, F71882FG_REG_POINT_TEMP(pwm, point), val); 2199 data->pwm_auto_point_temp[pwm][point] = val; 2200 mutex_unlock(&data->update_lock); 2201 2202 return count; 2203 } 2204 2205 static ssize_t name_show(struct device *dev, struct device_attribute *devattr, 2206 char *buf) 2207 { 2208 struct f71882fg_data *data = dev_get_drvdata(dev); 2209 return sprintf(buf, "%s\n", f71882fg_names[data->type]); 2210 } 2211 2212 static int f71882fg_create_sysfs_files(struct platform_device *pdev, 2213 struct sensor_device_attribute_2 *attr, int count) 2214 { 2215 int err, i; 2216 2217 for (i = 0; i < count; i++) { 2218 err = device_create_file(&pdev->dev, &attr[i].dev_attr); 2219 if (err) 2220 return err; 2221 } 2222 return 0; 2223 } 2224 2225 static void f71882fg_remove_sysfs_files(struct platform_device *pdev, 2226 struct sensor_device_attribute_2 *attr, int count) 2227 { 2228 int i; 2229 2230 for (i = 0; i < count; i++) 2231 device_remove_file(&pdev->dev, &attr[i].dev_attr); 2232 } 2233 2234 static int f71882fg_create_fan_sysfs_files( 2235 struct platform_device *pdev, int idx) 2236 { 2237 struct f71882fg_data *data = platform_get_drvdata(pdev); 2238 int err; 2239 2240 /* Sanity check the pwm setting */ 2241 err = 0; 2242 switch (data->type) { 2243 case f71858fg: 2244 if (((data->pwm_enable >> (idx * 2)) & 3) == 3) 2245 err = 1; 2246 break; 2247 case f71862fg: 2248 if (((data->pwm_enable >> (idx * 2)) & 1) != 1) 2249 err = 1; 2250 break; 2251 case f8000: 2252 if (idx == 2) 2253 err = data->pwm_enable & 0x20; 2254 break; 2255 default: 2256 break; 2257 } 2258 if (err) { 2259 dev_err(&pdev->dev, 2260 "Invalid (reserved) pwm settings: 0x%02x, " 2261 "skipping fan %d\n", 2262 (data->pwm_enable >> (idx * 2)) & 3, idx + 1); 2263 return 0; /* This is a non fatal condition */ 2264 } 2265 2266 err = f71882fg_create_sysfs_files(pdev, &fxxxx_fan_attr[idx][0], 2267 ARRAY_SIZE(fxxxx_fan_attr[0])); 2268 if (err) 2269 return err; 2270 2271 if (f71882fg_fan_has_beep[data->type]) { 2272 err = f71882fg_create_sysfs_files(pdev, 2273 &fxxxx_fan_beep_attr[idx], 2274 1); 2275 if (err) 2276 return err; 2277 } 2278 2279 dev_info(&pdev->dev, "Fan: %d is in %s mode\n", idx + 1, 2280 (data->pwm_enable & (1 << (2 * idx))) ? "duty-cycle" : "RPM"); 2281 2282 /* Check for unsupported auto pwm settings */ 2283 switch (data->type) { 2284 case f71808e: 2285 case f71808a: 2286 case f71869: 2287 case f71869a: 2288 case f71889fg: 2289 case f71889ed: 2290 case f71889a: 2291 data->pwm_auto_point_mapping[idx] = 2292 f71882fg_read8(data, F71882FG_REG_POINT_MAPPING(idx)); 2293 if ((data->pwm_auto_point_mapping[idx] & 0x80) || 2294 (data->pwm_auto_point_mapping[idx] & 3) == 0) { 2295 dev_warn(&pdev->dev, 2296 "Auto pwm controlled by raw digital " 2297 "data, disabling pwm auto_point " 2298 "sysfs attributes for fan %d\n", idx + 1); 2299 return 0; /* This is a non fatal condition */ 2300 } 2301 break; 2302 default: 2303 break; 2304 } 2305 2306 switch (data->type) { 2307 case f71862fg: 2308 err = f71882fg_create_sysfs_files(pdev, 2309 &f71862fg_auto_pwm_attr[idx][0], 2310 ARRAY_SIZE(f71862fg_auto_pwm_attr[0])); 2311 break; 2312 case f71808e: 2313 case f71869: 2314 err = f71882fg_create_sysfs_files(pdev, 2315 &f71869_auto_pwm_attr[idx][0], 2316 ARRAY_SIZE(f71869_auto_pwm_attr[0])); 2317 break; 2318 case f8000: 2319 err = f71882fg_create_sysfs_files(pdev, 2320 &f8000_auto_pwm_attr[idx][0], 2321 ARRAY_SIZE(f8000_auto_pwm_attr[0])); 2322 break; 2323 default: 2324 err = f71882fg_create_sysfs_files(pdev, 2325 &fxxxx_auto_pwm_attr[idx][0], 2326 ARRAY_SIZE(fxxxx_auto_pwm_attr[0])); 2327 } 2328 2329 return err; 2330 } 2331 2332 static int f71882fg_probe(struct platform_device *pdev) 2333 { 2334 struct f71882fg_data *data; 2335 struct f71882fg_sio_data *sio_data = dev_get_platdata(&pdev->dev); 2336 int nr_fans = f71882fg_nr_fans[sio_data->type]; 2337 int nr_temps = f71882fg_nr_temps[sio_data->type]; 2338 int err, i; 2339 int size; 2340 u8 start_reg, reg; 2341 2342 data = devm_kzalloc(&pdev->dev, sizeof(struct f71882fg_data), 2343 GFP_KERNEL); 2344 if (!data) 2345 return -ENOMEM; 2346 2347 data->addr = platform_get_resource(pdev, IORESOURCE_IO, 0)->start; 2348 data->type = sio_data->type; 2349 data->temp_start = 2350 (data->type == f71858fg || data->type == f8000 || 2351 data->type == f81866a) ? 0 : 1; 2352 mutex_init(&data->update_lock); 2353 platform_set_drvdata(pdev, data); 2354 2355 start_reg = f71882fg_read8(data, F71882FG_REG_START); 2356 if (start_reg & 0x04) { 2357 dev_warn(&pdev->dev, "Hardware monitor is powered down\n"); 2358 return -ENODEV; 2359 } 2360 if (!(start_reg & 0x03)) { 2361 dev_warn(&pdev->dev, "Hardware monitoring not activated\n"); 2362 return -ENODEV; 2363 } 2364 2365 /* Register sysfs interface files */ 2366 err = device_create_file(&pdev->dev, &dev_attr_name); 2367 if (err) 2368 goto exit_unregister_sysfs; 2369 2370 if (start_reg & 0x01) { 2371 switch (data->type) { 2372 case f71858fg: 2373 data->temp_config = 2374 f71882fg_read8(data, F71882FG_REG_TEMP_CONFIG); 2375 if (data->temp_config & 0x10) 2376 /* 2377 * The f71858fg temperature alarms behave as 2378 * the f8000 alarms in this mode 2379 */ 2380 err = f71882fg_create_sysfs_files(pdev, 2381 f8000_temp_attr, 2382 ARRAY_SIZE(f8000_temp_attr)); 2383 else 2384 err = f71882fg_create_sysfs_files(pdev, 2385 f71858fg_temp_attr, 2386 ARRAY_SIZE(f71858fg_temp_attr)); 2387 break; 2388 case f8000: 2389 err = f71882fg_create_sysfs_files(pdev, 2390 f8000_temp_attr, 2391 ARRAY_SIZE(f8000_temp_attr)); 2392 break; 2393 case f81866a: 2394 err = f71882fg_create_sysfs_files(pdev, 2395 f71858fg_temp_attr, 2396 ARRAY_SIZE(f71858fg_temp_attr)); 2397 break; 2398 default: 2399 err = f71882fg_create_sysfs_files(pdev, 2400 &fxxxx_temp_attr[0][0], 2401 ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps); 2402 } 2403 if (err) 2404 goto exit_unregister_sysfs; 2405 2406 if (f71882fg_temp_has_beep[data->type]) { 2407 if (data->type == f81866a) { 2408 size = ARRAY_SIZE(f81866_temp_beep_attr[0]); 2409 err = f71882fg_create_sysfs_files(pdev, 2410 &f81866_temp_beep_attr[0][0], 2411 size * nr_temps); 2412 2413 } else { 2414 size = ARRAY_SIZE(fxxxx_temp_beep_attr[0]); 2415 err = f71882fg_create_sysfs_files(pdev, 2416 &fxxxx_temp_beep_attr[0][0], 2417 size * nr_temps); 2418 } 2419 if (err) 2420 goto exit_unregister_sysfs; 2421 } 2422 2423 for (i = 0; i < F71882FG_MAX_INS; i++) { 2424 if (f71882fg_has_in[data->type][i]) { 2425 err = device_create_file(&pdev->dev, 2426 &fxxxx_in_attr[i].dev_attr); 2427 if (err) 2428 goto exit_unregister_sysfs; 2429 } 2430 } 2431 if (f71882fg_has_in1_alarm[data->type]) { 2432 err = f71882fg_create_sysfs_files(pdev, 2433 fxxxx_in1_alarm_attr, 2434 ARRAY_SIZE(fxxxx_in1_alarm_attr)); 2435 if (err) 2436 goto exit_unregister_sysfs; 2437 } 2438 } 2439 2440 if (start_reg & 0x02) { 2441 switch (data->type) { 2442 case f71808e: 2443 case f71808a: 2444 case f71869: 2445 case f71869a: 2446 /* These always have signed auto point temps */ 2447 data->auto_point_temp_signed = 1; 2448 fallthrough; /* to select correct fan/pwm reg bank! */ 2449 case f71889fg: 2450 case f71889ed: 2451 case f71889a: 2452 reg = f71882fg_read8(data, F71882FG_REG_FAN_FAULT_T); 2453 if (reg & F71882FG_FAN_NEG_TEMP_EN) 2454 data->auto_point_temp_signed = 1; 2455 /* Ensure banked pwm registers point to right bank */ 2456 reg &= ~F71882FG_FAN_PROG_SEL; 2457 f71882fg_write8(data, F71882FG_REG_FAN_FAULT_T, reg); 2458 break; 2459 default: 2460 break; 2461 } 2462 2463 data->pwm_enable = 2464 f71882fg_read8(data, F71882FG_REG_PWM_ENABLE); 2465 2466 for (i = 0; i < nr_fans; i++) { 2467 err = f71882fg_create_fan_sysfs_files(pdev, i); 2468 if (err) 2469 goto exit_unregister_sysfs; 2470 } 2471 2472 /* Some types have 1 extra fan with limited functionality */ 2473 switch (data->type) { 2474 case f71808a: 2475 err = f71882fg_create_sysfs_files(pdev, 2476 f71808a_fan3_attr, 2477 ARRAY_SIZE(f71808a_fan3_attr)); 2478 break; 2479 case f8000: 2480 err = f71882fg_create_sysfs_files(pdev, 2481 f8000_fan_attr, 2482 ARRAY_SIZE(f8000_fan_attr)); 2483 break; 2484 default: 2485 break; 2486 } 2487 if (err) 2488 goto exit_unregister_sysfs; 2489 } 2490 2491 data->hwmon_dev = hwmon_device_register(&pdev->dev); 2492 if (IS_ERR(data->hwmon_dev)) { 2493 err = PTR_ERR(data->hwmon_dev); 2494 data->hwmon_dev = NULL; 2495 goto exit_unregister_sysfs; 2496 } 2497 2498 return 0; 2499 2500 exit_unregister_sysfs: 2501 f71882fg_remove(pdev); /* Will unregister the sysfs files for us */ 2502 return err; /* f71882fg_remove() also frees our data */ 2503 } 2504 2505 static int f71882fg_remove(struct platform_device *pdev) 2506 { 2507 struct f71882fg_data *data = platform_get_drvdata(pdev); 2508 int nr_fans = f71882fg_nr_fans[data->type]; 2509 int nr_temps = f71882fg_nr_temps[data->type]; 2510 int i; 2511 u8 start_reg = f71882fg_read8(data, F71882FG_REG_START); 2512 2513 if (data->hwmon_dev) 2514 hwmon_device_unregister(data->hwmon_dev); 2515 2516 device_remove_file(&pdev->dev, &dev_attr_name); 2517 2518 if (start_reg & 0x01) { 2519 switch (data->type) { 2520 case f71858fg: 2521 if (data->temp_config & 0x10) 2522 f71882fg_remove_sysfs_files(pdev, 2523 f8000_temp_attr, 2524 ARRAY_SIZE(f8000_temp_attr)); 2525 else 2526 f71882fg_remove_sysfs_files(pdev, 2527 f71858fg_temp_attr, 2528 ARRAY_SIZE(f71858fg_temp_attr)); 2529 break; 2530 case f8000: 2531 f71882fg_remove_sysfs_files(pdev, 2532 f8000_temp_attr, 2533 ARRAY_SIZE(f8000_temp_attr)); 2534 break; 2535 case f81866a: 2536 f71882fg_remove_sysfs_files(pdev, 2537 f71858fg_temp_attr, 2538 ARRAY_SIZE(f71858fg_temp_attr)); 2539 break; 2540 default: 2541 f71882fg_remove_sysfs_files(pdev, 2542 &fxxxx_temp_attr[0][0], 2543 ARRAY_SIZE(fxxxx_temp_attr[0]) * nr_temps); 2544 } 2545 if (f71882fg_temp_has_beep[data->type]) { 2546 if (data->type == f81866a) 2547 f71882fg_remove_sysfs_files(pdev, 2548 &f81866_temp_beep_attr[0][0], 2549 ARRAY_SIZE(f81866_temp_beep_attr[0]) 2550 * nr_temps); 2551 else 2552 f71882fg_remove_sysfs_files(pdev, 2553 &fxxxx_temp_beep_attr[0][0], 2554 ARRAY_SIZE(fxxxx_temp_beep_attr[0]) 2555 * nr_temps); 2556 } 2557 2558 for (i = 0; i < F71882FG_MAX_INS; i++) { 2559 if (f71882fg_has_in[data->type][i]) { 2560 device_remove_file(&pdev->dev, 2561 &fxxxx_in_attr[i].dev_attr); 2562 } 2563 } 2564 if (f71882fg_has_in1_alarm[data->type]) { 2565 f71882fg_remove_sysfs_files(pdev, 2566 fxxxx_in1_alarm_attr, 2567 ARRAY_SIZE(fxxxx_in1_alarm_attr)); 2568 } 2569 } 2570 2571 if (start_reg & 0x02) { 2572 f71882fg_remove_sysfs_files(pdev, &fxxxx_fan_attr[0][0], 2573 ARRAY_SIZE(fxxxx_fan_attr[0]) * nr_fans); 2574 2575 if (f71882fg_fan_has_beep[data->type]) { 2576 f71882fg_remove_sysfs_files(pdev, 2577 fxxxx_fan_beep_attr, nr_fans); 2578 } 2579 2580 switch (data->type) { 2581 case f71808a: 2582 f71882fg_remove_sysfs_files(pdev, 2583 &fxxxx_auto_pwm_attr[0][0], 2584 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans); 2585 f71882fg_remove_sysfs_files(pdev, 2586 f71808a_fan3_attr, 2587 ARRAY_SIZE(f71808a_fan3_attr)); 2588 break; 2589 case f71862fg: 2590 f71882fg_remove_sysfs_files(pdev, 2591 &f71862fg_auto_pwm_attr[0][0], 2592 ARRAY_SIZE(f71862fg_auto_pwm_attr[0]) * 2593 nr_fans); 2594 break; 2595 case f71808e: 2596 case f71869: 2597 f71882fg_remove_sysfs_files(pdev, 2598 &f71869_auto_pwm_attr[0][0], 2599 ARRAY_SIZE(f71869_auto_pwm_attr[0]) * nr_fans); 2600 break; 2601 case f8000: 2602 f71882fg_remove_sysfs_files(pdev, 2603 f8000_fan_attr, 2604 ARRAY_SIZE(f8000_fan_attr)); 2605 f71882fg_remove_sysfs_files(pdev, 2606 &f8000_auto_pwm_attr[0][0], 2607 ARRAY_SIZE(f8000_auto_pwm_attr[0]) * nr_fans); 2608 break; 2609 default: 2610 f71882fg_remove_sysfs_files(pdev, 2611 &fxxxx_auto_pwm_attr[0][0], 2612 ARRAY_SIZE(fxxxx_auto_pwm_attr[0]) * nr_fans); 2613 } 2614 } 2615 return 0; 2616 } 2617 2618 static int __init f71882fg_find(int sioaddr, struct f71882fg_sio_data *sio_data) 2619 { 2620 u16 devid; 2621 unsigned short address; 2622 int err = superio_enter(sioaddr); 2623 if (err) 2624 return err; 2625 2626 devid = superio_inw(sioaddr, SIO_REG_MANID); 2627 if (devid != SIO_FINTEK_ID) { 2628 pr_debug("Not a Fintek device\n"); 2629 err = -ENODEV; 2630 goto exit; 2631 } 2632 2633 devid = force_id ? force_id : superio_inw(sioaddr, SIO_REG_DEVID); 2634 switch (devid) { 2635 case SIO_F71808E_ID: 2636 sio_data->type = f71808e; 2637 break; 2638 case SIO_F71808A_ID: 2639 sio_data->type = f71808a; 2640 break; 2641 case SIO_F71858_ID: 2642 case SIO_F71858AD_ID: 2643 sio_data->type = f71858fg; 2644 break; 2645 case SIO_F71862_ID: 2646 sio_data->type = f71862fg; 2647 break; 2648 case SIO_F71868_ID: 2649 sio_data->type = f71868a; 2650 break; 2651 case SIO_F71869_ID: 2652 sio_data->type = f71869; 2653 break; 2654 case SIO_F71869A_ID: 2655 sio_data->type = f71869a; 2656 break; 2657 case SIO_F71882_ID: 2658 sio_data->type = f71882fg; 2659 break; 2660 case SIO_F71889_ID: 2661 sio_data->type = f71889fg; 2662 break; 2663 case SIO_F71889E_ID: 2664 sio_data->type = f71889ed; 2665 break; 2666 case SIO_F71889A_ID: 2667 sio_data->type = f71889a; 2668 break; 2669 case SIO_F8000_ID: 2670 sio_data->type = f8000; 2671 break; 2672 case SIO_F81768D_ID: 2673 sio_data->type = f81768d; 2674 break; 2675 case SIO_F81865_ID: 2676 sio_data->type = f81865f; 2677 break; 2678 case SIO_F81866_ID: 2679 case SIO_F81966_ID: 2680 sio_data->type = f81866a; 2681 break; 2682 default: 2683 pr_info("Unsupported Fintek device: %04x\n", 2684 (unsigned int)devid); 2685 err = -ENODEV; 2686 goto exit; 2687 } 2688 2689 if (sio_data->type == f71858fg) 2690 superio_select(sioaddr, SIO_F71858FG_LD_HWM); 2691 else 2692 superio_select(sioaddr, SIO_F71882FG_LD_HWM); 2693 2694 if (!(superio_inb(sioaddr, SIO_REG_ENABLE) & 0x01)) { 2695 pr_warn("Device not activated\n"); 2696 err = -ENODEV; 2697 goto exit; 2698 } 2699 2700 address = superio_inw(sioaddr, SIO_REG_ADDR); 2701 if (address == 0) { 2702 pr_warn("Base address not set\n"); 2703 err = -ENODEV; 2704 goto exit; 2705 } 2706 address &= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */ 2707 2708 err = address; 2709 pr_info("Found %s chip at %#x, revision %d\n", 2710 f71882fg_names[sio_data->type], (unsigned int)address, 2711 (int)superio_inb(sioaddr, SIO_REG_DEVREV)); 2712 exit: 2713 superio_exit(sioaddr); 2714 return err; 2715 } 2716 2717 static int __init f71882fg_device_add(int address, 2718 const struct f71882fg_sio_data *sio_data) 2719 { 2720 struct resource res = { 2721 .start = address, 2722 .end = address + REGION_LENGTH - 1, 2723 .flags = IORESOURCE_IO, 2724 }; 2725 int err; 2726 2727 f71882fg_pdev = platform_device_alloc(DRVNAME, address); 2728 if (!f71882fg_pdev) 2729 return -ENOMEM; 2730 2731 res.name = f71882fg_pdev->name; 2732 err = acpi_check_resource_conflict(&res); 2733 if (err) 2734 goto exit_device_put; 2735 2736 err = platform_device_add_resources(f71882fg_pdev, &res, 1); 2737 if (err) { 2738 pr_err("Device resource addition failed\n"); 2739 goto exit_device_put; 2740 } 2741 2742 err = platform_device_add_data(f71882fg_pdev, sio_data, 2743 sizeof(struct f71882fg_sio_data)); 2744 if (err) { 2745 pr_err("Platform data allocation failed\n"); 2746 goto exit_device_put; 2747 } 2748 2749 err = platform_device_add(f71882fg_pdev); 2750 if (err) { 2751 pr_err("Device addition failed\n"); 2752 goto exit_device_put; 2753 } 2754 2755 return 0; 2756 2757 exit_device_put: 2758 platform_device_put(f71882fg_pdev); 2759 2760 return err; 2761 } 2762 2763 static int __init f71882fg_init(void) 2764 { 2765 int err; 2766 int address; 2767 struct f71882fg_sio_data sio_data; 2768 2769 memset(&sio_data, 0, sizeof(sio_data)); 2770 2771 address = f71882fg_find(0x2e, &sio_data); 2772 if (address < 0) 2773 address = f71882fg_find(0x4e, &sio_data); 2774 if (address < 0) 2775 return address; 2776 2777 err = platform_driver_register(&f71882fg_driver); 2778 if (err) 2779 return err; 2780 2781 err = f71882fg_device_add(address, &sio_data); 2782 if (err) 2783 goto exit_driver; 2784 2785 return 0; 2786 2787 exit_driver: 2788 platform_driver_unregister(&f71882fg_driver); 2789 return err; 2790 } 2791 2792 static void __exit f71882fg_exit(void) 2793 { 2794 platform_device_unregister(f71882fg_pdev); 2795 platform_driver_unregister(&f71882fg_driver); 2796 } 2797 2798 MODULE_DESCRIPTION("F71882FG Hardware Monitoring Driver"); 2799 MODULE_AUTHOR("Hans Edgington, Hans de Goede <hdegoede@redhat.com>"); 2800 MODULE_LICENSE("GPL"); 2801 2802 module_init(f71882fg_init); 2803 module_exit(f71882fg_exit); 2804