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