0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0034
0035 #include <linux/module.h>
0036 #include <linux/init.h>
0037 #include <linux/slab.h>
0038 #include <linux/jiffies.h>
0039 #include <linux/platform_device.h>
0040 #include <linux/hwmon.h>
0041 #include <linux/hwmon-sysfs.h>
0042 #include <linux/hwmon-vid.h>
0043 #include <linux/err.h>
0044 #include <linux/mutex.h>
0045 #include <linux/acpi.h>
0046 #include <linux/io.h>
0047 #include "lm75.h"
0048
0049 enum kinds {
0050 w83627ehf, w83627dhg, w83627dhg_p, w83627uhg,
0051 w83667hg, w83667hg_b,
0052 };
0053
0054
0055 static const char * const w83627ehf_device_names[] = {
0056 "w83627ehf",
0057 "w83627dhg",
0058 "w83627dhg",
0059 "w83627uhg",
0060 "w83667hg",
0061 "w83667hg",
0062 };
0063
0064 static unsigned short force_id;
0065 module_param(force_id, ushort, 0);
0066 MODULE_PARM_DESC(force_id, "Override the detected device ID");
0067
0068 #define DRVNAME "w83627ehf"
0069
0070
0071
0072
0073
0074 #define W83627EHF_LD_HWM 0x0b
0075 #define W83667HG_LD_VID 0x0d
0076
0077 #define SIO_REG_LDSEL 0x07
0078 #define SIO_REG_DEVID 0x20
0079 #define SIO_REG_EN_VRM10 0x2C
0080 #define SIO_REG_ENABLE 0x30
0081 #define SIO_REG_ADDR 0x60
0082 #define SIO_REG_VID_CTRL 0xF0
0083 #define SIO_REG_VID_DATA 0xF1
0084
0085 #define SIO_W83627EHF_ID 0x8850
0086 #define SIO_W83627EHG_ID 0x8860
0087 #define SIO_W83627DHG_ID 0xa020
0088 #define SIO_W83627DHG_P_ID 0xb070
0089 #define SIO_W83627UHG_ID 0xa230
0090 #define SIO_W83667HG_ID 0xa510
0091 #define SIO_W83667HG_B_ID 0xb350
0092 #define SIO_ID_MASK 0xFFF0
0093
0094 static inline void
0095 superio_outb(int ioreg, int reg, int val)
0096 {
0097 outb(reg, ioreg);
0098 outb(val, ioreg + 1);
0099 }
0100
0101 static inline int
0102 superio_inb(int ioreg, int reg)
0103 {
0104 outb(reg, ioreg);
0105 return inb(ioreg + 1);
0106 }
0107
0108 static inline void
0109 superio_select(int ioreg, int ld)
0110 {
0111 outb(SIO_REG_LDSEL, ioreg);
0112 outb(ld, ioreg + 1);
0113 }
0114
0115 static inline int
0116 superio_enter(int ioreg)
0117 {
0118 if (!request_muxed_region(ioreg, 2, DRVNAME))
0119 return -EBUSY;
0120
0121 outb(0x87, ioreg);
0122 outb(0x87, ioreg);
0123
0124 return 0;
0125 }
0126
0127 static inline void
0128 superio_exit(int ioreg)
0129 {
0130 outb(0xaa, ioreg);
0131 outb(0x02, ioreg);
0132 outb(0x02, ioreg + 1);
0133 release_region(ioreg, 2);
0134 }
0135
0136
0137
0138
0139
0140 #define IOREGION_ALIGNMENT (~7)
0141 #define IOREGION_OFFSET 5
0142 #define IOREGION_LENGTH 2
0143 #define ADDR_REG_OFFSET 0
0144 #define DATA_REG_OFFSET 1
0145
0146 #define W83627EHF_REG_BANK 0x4E
0147 #define W83627EHF_REG_CONFIG 0x40
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 };
0158 static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
0159
0160
0161 #define W83627EHF_REG_IN_MAX(nr) ((nr < 7) ? (0x2b + (nr) * 2) : \
0162 (0x554 + (((nr) - 7) * 2)))
0163 #define W83627EHF_REG_IN_MIN(nr) ((nr < 7) ? (0x2c + (nr) * 2) : \
0164 (0x555 + (((nr) - 7) * 2)))
0165 #define W83627EHF_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \
0166 (0x550 + (nr) - 7))
0167
0168 static const u16 W83627EHF_REG_TEMP[] = { 0x27, 0x150, 0x250, 0x7e };
0169 static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x3a, 0x153, 0x253, 0 };
0170 static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x39, 0x155, 0x255, 0 };
0171 static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0, 0x152, 0x252, 0 };
0172
0173
0174 #define W83627EHF_REG_FANDIV1 0x47
0175 #define W83627EHF_REG_FANDIV2 0x4B
0176 #define W83627EHF_REG_VBAT 0x5D
0177 #define W83627EHF_REG_DIODE 0x59
0178 #define W83627EHF_REG_SMI_OVT 0x4C
0179
0180 #define W83627EHF_REG_ALARM1 0x459
0181 #define W83627EHF_REG_ALARM2 0x45A
0182 #define W83627EHF_REG_ALARM3 0x45B
0183
0184 #define W83627EHF_REG_CASEOPEN_DET 0x42
0185 #define W83627EHF_REG_CASEOPEN_CLR 0x46
0186
0187
0188 #define W83627EHF_REG_FAN_STEPUP_TIME 0x0f
0189 #define W83627EHF_REG_FAN_STEPDOWN_TIME 0x0e
0190
0191
0192 static const u8 W83627EHF_REG_PWM_ENABLE[] = {
0193 0x04,
0194 0x04,
0195 0x12,
0196 0x62,
0197 };
0198
0199 static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
0200 static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };
0201
0202
0203 static const u16 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
0204 static const u16 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 };
0205 static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 };
0206
0207
0208 static const u16 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 };
0209 static const u16 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 };
0210 static const u16 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 };
0211
0212 static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON[]
0213 = { 0xff, 0x67, 0xff, 0x69 };
0214 static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON[]
0215 = { 0xff, 0x68, 0xff, 0x6a };
0216
0217 static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B[] = { 0x67, 0x69, 0x6b };
0218 static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B[]
0219 = { 0x68, 0x6a, 0x6c };
0220
0221 static const u16 W83627EHF_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 };
0222
0223 static const char *const w83667hg_b_temp_label[] = {
0224 "SYSTIN",
0225 "CPUTIN",
0226 "AUXTIN",
0227 "AMDTSI",
0228 "PECI Agent 1",
0229 "PECI Agent 2",
0230 "PECI Agent 3",
0231 "PECI Agent 4"
0232 };
0233
0234 #define NUM_REG_TEMP ARRAY_SIZE(W83627EHF_REG_TEMP)
0235
0236 static int is_word_sized(u16 reg)
0237 {
0238 return ((((reg & 0xff00) == 0x100
0239 || (reg & 0xff00) == 0x200)
0240 && ((reg & 0x00ff) == 0x50
0241 || (reg & 0x00ff) == 0x53
0242 || (reg & 0x00ff) == 0x55))
0243 || (reg & 0xfff0) == 0x630
0244 || reg == 0x640 || reg == 0x642
0245 || ((reg & 0xfff0) == 0x650
0246 && (reg & 0x000f) >= 0x06)
0247 || reg == 0x73 || reg == 0x75 || reg == 0x77
0248 );
0249 }
0250
0251
0252
0253
0254
0255
0256 static inline unsigned int step_time_from_reg(u8 reg, u8 mode)
0257 {
0258 return mode ? 100 * reg : 400 * reg;
0259 }
0260
0261 static inline u8 step_time_to_reg(unsigned int msec, u8 mode)
0262 {
0263 return clamp_val((mode ? (msec + 50) / 100 : (msec + 200) / 400),
0264 1, 255);
0265 }
0266
0267 static unsigned int fan_from_reg8(u16 reg, unsigned int divreg)
0268 {
0269 if (reg == 0 || reg == 255)
0270 return 0;
0271 return 1350000U / (reg << divreg);
0272 }
0273
0274 static inline unsigned int
0275 div_from_reg(u8 reg)
0276 {
0277 return 1 << reg;
0278 }
0279
0280
0281
0282
0283
0284 static const u16 scale_in_common[10] = {
0285 800, 800, 1600, 1600, 800, 800, 800, 1600, 1600, 800
0286 };
0287 static const u16 scale_in_w83627uhg[9] = {
0288 800, 800, 3328, 3424, 800, 800, 0, 3328, 3400
0289 };
0290
0291 static inline long in_from_reg(u8 reg, u8 nr, const u16 *scale_in)
0292 {
0293 return DIV_ROUND_CLOSEST(reg * scale_in[nr], 100);
0294 }
0295
0296 static inline u8 in_to_reg(u32 val, u8 nr, const u16 *scale_in)
0297 {
0298 return clamp_val(DIV_ROUND_CLOSEST(val * 100, scale_in[nr]), 0, 255);
0299 }
0300
0301
0302
0303
0304
0305 struct w83627ehf_data {
0306 int addr;
0307 const char *name;
0308
0309 struct mutex lock;
0310
0311 u16 reg_temp[NUM_REG_TEMP];
0312 u16 reg_temp_over[NUM_REG_TEMP];
0313 u16 reg_temp_hyst[NUM_REG_TEMP];
0314 u16 reg_temp_config[NUM_REG_TEMP];
0315 u8 temp_src[NUM_REG_TEMP];
0316 const char * const *temp_label;
0317
0318 const u16 *REG_FAN_MAX_OUTPUT;
0319 const u16 *REG_FAN_STEP_OUTPUT;
0320 const u16 *scale_in;
0321
0322 struct mutex update_lock;
0323 bool valid;
0324 unsigned long last_updated;
0325
0326
0327 u8 bank;
0328 u8 in_num;
0329 u8 in[10];
0330 u8 in_max[10];
0331 u8 in_min[10];
0332 unsigned int rpm[5];
0333 u16 fan_min[5];
0334 u8 fan_div[5];
0335 u8 has_fan;
0336 u8 has_fan_min;
0337 u8 temp_type[3];
0338 s8 temp_offset[3];
0339 s16 temp[9];
0340 s16 temp_max[9];
0341 s16 temp_max_hyst[9];
0342 u32 alarms;
0343 u8 caseopen;
0344
0345 u8 pwm_mode[4];
0346 u8 pwm_enable[4];
0347
0348
0349
0350
0351
0352
0353
0354 u8 pwm_enable_orig[4];
0355 u8 pwm_num;
0356 u8 pwm[4];
0357 u8 target_temp[4];
0358 u8 tolerance[4];
0359
0360 u8 fan_start_output[4];
0361 u8 fan_stop_output[4];
0362 u8 fan_stop_time[4];
0363 u8 fan_max_output[4];
0364 u8 fan_step_output[4];
0365
0366 u8 vid;
0367 u8 vrm;
0368
0369 u16 have_temp;
0370 u16 have_temp_offset;
0371 u8 in6_skip:1;
0372 u8 temp3_val_only:1;
0373 u8 have_vid:1;
0374
0375
0376 u8 vbat;
0377 u8 fandiv1;
0378 u8 fandiv2;
0379 };
0380
0381 struct w83627ehf_sio_data {
0382 int sioreg;
0383 enum kinds kind;
0384 };
0385
0386
0387
0388
0389
0390
0391
0392 static inline void w83627ehf_set_bank(struct w83627ehf_data *data, u16 reg)
0393 {
0394 u8 bank = reg >> 8;
0395 if (data->bank != bank) {
0396 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
0397 outb_p(bank, data->addr + DATA_REG_OFFSET);
0398 data->bank = bank;
0399 }
0400 }
0401
0402 static u16 w83627ehf_read_value(struct w83627ehf_data *data, u16 reg)
0403 {
0404 int res, word_sized = is_word_sized(reg);
0405
0406 mutex_lock(&data->lock);
0407
0408 w83627ehf_set_bank(data, reg);
0409 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
0410 res = inb_p(data->addr + DATA_REG_OFFSET);
0411 if (word_sized) {
0412 outb_p((reg & 0xff) + 1,
0413 data->addr + ADDR_REG_OFFSET);
0414 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET);
0415 }
0416
0417 mutex_unlock(&data->lock);
0418 return res;
0419 }
0420
0421 static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg,
0422 u16 value)
0423 {
0424 int word_sized = is_word_sized(reg);
0425
0426 mutex_lock(&data->lock);
0427
0428 w83627ehf_set_bank(data, reg);
0429 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
0430 if (word_sized) {
0431 outb_p(value >> 8, data->addr + DATA_REG_OFFSET);
0432 outb_p((reg & 0xff) + 1,
0433 data->addr + ADDR_REG_OFFSET);
0434 }
0435 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET);
0436
0437 mutex_unlock(&data->lock);
0438 return 0;
0439 }
0440
0441
0442 static u16 w83627ehf_read_temp(struct w83627ehf_data *data, u16 reg)
0443 {
0444 u16 res;
0445
0446 res = w83627ehf_read_value(data, reg);
0447 if (!is_word_sized(reg))
0448 res <<= 8;
0449
0450 return res;
0451 }
0452
0453 static int w83627ehf_write_temp(struct w83627ehf_data *data, u16 reg,
0454 u16 value)
0455 {
0456 if (!is_word_sized(reg))
0457 value >>= 8;
0458 return w83627ehf_write_value(data, reg, value);
0459 }
0460
0461
0462 static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
0463 {
0464 u8 reg;
0465
0466 switch (nr) {
0467 case 0:
0468 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0xcf)
0469 | ((data->fan_div[0] & 0x03) << 4);
0470
0471 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
0472 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
0473 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xdf)
0474 | ((data->fan_div[0] & 0x04) << 3);
0475 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
0476 break;
0477 case 1:
0478 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0x3f)
0479 | ((data->fan_div[1] & 0x03) << 6);
0480
0481 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
0482 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
0483 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xbf)
0484 | ((data->fan_div[1] & 0x04) << 4);
0485 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
0486 break;
0487 case 2:
0488 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV2) & 0x3f)
0489 | ((data->fan_div[2] & 0x03) << 6);
0490 w83627ehf_write_value(data, W83627EHF_REG_FANDIV2, reg);
0491 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0x7f)
0492 | ((data->fan_div[2] & 0x04) << 5);
0493 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
0494 break;
0495 case 3:
0496 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0xfc)
0497 | (data->fan_div[3] & 0x03);
0498 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
0499 reg = (w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT) & 0x7f)
0500 | ((data->fan_div[3] & 0x04) << 5);
0501 w83627ehf_write_value(data, W83627EHF_REG_SMI_OVT, reg);
0502 break;
0503 case 4:
0504 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0x73)
0505 | ((data->fan_div[4] & 0x03) << 2)
0506 | ((data->fan_div[4] & 0x04) << 5);
0507 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
0508 break;
0509 }
0510 }
0511
0512 static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
0513 {
0514 int i;
0515
0516 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
0517 data->fan_div[0] = (i >> 4) & 0x03;
0518 data->fan_div[1] = (i >> 6) & 0x03;
0519 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV2);
0520 data->fan_div[2] = (i >> 6) & 0x03;
0521 i = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
0522 data->fan_div[0] |= (i >> 3) & 0x04;
0523 data->fan_div[1] |= (i >> 4) & 0x04;
0524 data->fan_div[2] |= (i >> 5) & 0x04;
0525 if (data->has_fan & ((1 << 3) | (1 << 4))) {
0526 i = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
0527 data->fan_div[3] = i & 0x03;
0528 data->fan_div[4] = ((i >> 2) & 0x03)
0529 | ((i >> 5) & 0x04);
0530 }
0531 if (data->has_fan & (1 << 3)) {
0532 i = w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT);
0533 data->fan_div[3] |= (i >> 5) & 0x04;
0534 }
0535 }
0536
0537 static void w83627ehf_update_pwm(struct w83627ehf_data *data)
0538 {
0539 int i;
0540 int pwmcfg = 0, tolerance = 0;
0541
0542 for (i = 0; i < data->pwm_num; i++) {
0543 if (!(data->has_fan & (1 << i)))
0544 continue;
0545
0546
0547 if (i != 1) {
0548 pwmcfg = w83627ehf_read_value(data,
0549 W83627EHF_REG_PWM_ENABLE[i]);
0550 tolerance = w83627ehf_read_value(data,
0551 W83627EHF_REG_TOLERANCE[i]);
0552 }
0553 data->pwm_mode[i] =
0554 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1) ? 0 : 1;
0555 data->pwm_enable[i] = ((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i])
0556 & 3) + 1;
0557 data->pwm[i] = w83627ehf_read_value(data, W83627EHF_REG_PWM[i]);
0558
0559 data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0)) & 0x0f;
0560 }
0561 }
0562
0563 static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
0564 {
0565 struct w83627ehf_data *data = dev_get_drvdata(dev);
0566 int i;
0567
0568 mutex_lock(&data->update_lock);
0569
0570 if (time_after(jiffies, data->last_updated + HZ + HZ/2)
0571 || !data->valid) {
0572
0573 w83627ehf_update_fan_div(data);
0574
0575
0576 for (i = 0; i < data->in_num; i++) {
0577 if ((i == 6) && data->in6_skip)
0578 continue;
0579
0580 data->in[i] = w83627ehf_read_value(data,
0581 W83627EHF_REG_IN(i));
0582 data->in_min[i] = w83627ehf_read_value(data,
0583 W83627EHF_REG_IN_MIN(i));
0584 data->in_max[i] = w83627ehf_read_value(data,
0585 W83627EHF_REG_IN_MAX(i));
0586 }
0587
0588
0589 for (i = 0; i < 5; i++) {
0590 u16 reg;
0591
0592 if (!(data->has_fan & (1 << i)))
0593 continue;
0594
0595 reg = w83627ehf_read_value(data, W83627EHF_REG_FAN[i]);
0596 data->rpm[i] = fan_from_reg8(reg, data->fan_div[i]);
0597
0598 if (data->has_fan_min & (1 << i))
0599 data->fan_min[i] = w83627ehf_read_value(data,
0600 W83627EHF_REG_FAN_MIN[i]);
0601
0602
0603
0604
0605
0606
0607 if (reg >= 0xff && data->fan_div[i] < 0x07) {
0608 dev_dbg(dev,
0609 "Increasing fan%d clock divider from %u to %u\n",
0610 i + 1, div_from_reg(data->fan_div[i]),
0611 div_from_reg(data->fan_div[i] + 1));
0612 data->fan_div[i]++;
0613 w83627ehf_write_fan_div(data, i);
0614
0615 if ((data->has_fan_min & (1 << i))
0616 && data->fan_min[i] >= 2
0617 && data->fan_min[i] != 255)
0618 w83627ehf_write_value(data,
0619 W83627EHF_REG_FAN_MIN[i],
0620 (data->fan_min[i] /= 2));
0621 }
0622 }
0623
0624 w83627ehf_update_pwm(data);
0625
0626 for (i = 0; i < data->pwm_num; i++) {
0627 if (!(data->has_fan & (1 << i)))
0628 continue;
0629
0630 data->fan_start_output[i] =
0631 w83627ehf_read_value(data,
0632 W83627EHF_REG_FAN_START_OUTPUT[i]);
0633 data->fan_stop_output[i] =
0634 w83627ehf_read_value(data,
0635 W83627EHF_REG_FAN_STOP_OUTPUT[i]);
0636 data->fan_stop_time[i] =
0637 w83627ehf_read_value(data,
0638 W83627EHF_REG_FAN_STOP_TIME[i]);
0639
0640 if (data->REG_FAN_MAX_OUTPUT &&
0641 data->REG_FAN_MAX_OUTPUT[i] != 0xff)
0642 data->fan_max_output[i] =
0643 w83627ehf_read_value(data,
0644 data->REG_FAN_MAX_OUTPUT[i]);
0645
0646 if (data->REG_FAN_STEP_OUTPUT &&
0647 data->REG_FAN_STEP_OUTPUT[i] != 0xff)
0648 data->fan_step_output[i] =
0649 w83627ehf_read_value(data,
0650 data->REG_FAN_STEP_OUTPUT[i]);
0651
0652 data->target_temp[i] =
0653 w83627ehf_read_value(data,
0654 W83627EHF_REG_TARGET[i]) &
0655 (data->pwm_mode[i] == 1 ? 0x7f : 0xff);
0656 }
0657
0658
0659 for (i = 0; i < NUM_REG_TEMP; i++) {
0660 if (!(data->have_temp & (1 << i)))
0661 continue;
0662 data->temp[i] = w83627ehf_read_temp(data,
0663 data->reg_temp[i]);
0664 if (data->reg_temp_over[i])
0665 data->temp_max[i]
0666 = w83627ehf_read_temp(data,
0667 data->reg_temp_over[i]);
0668 if (data->reg_temp_hyst[i])
0669 data->temp_max_hyst[i]
0670 = w83627ehf_read_temp(data,
0671 data->reg_temp_hyst[i]);
0672 if (i > 2)
0673 continue;
0674 if (data->have_temp_offset & (1 << i))
0675 data->temp_offset[i]
0676 = w83627ehf_read_value(data,
0677 W83627EHF_REG_TEMP_OFFSET[i]);
0678 }
0679
0680 data->alarms = w83627ehf_read_value(data,
0681 W83627EHF_REG_ALARM1) |
0682 (w83627ehf_read_value(data,
0683 W83627EHF_REG_ALARM2) << 8) |
0684 (w83627ehf_read_value(data,
0685 W83627EHF_REG_ALARM3) << 16);
0686
0687 data->caseopen = w83627ehf_read_value(data,
0688 W83627EHF_REG_CASEOPEN_DET);
0689
0690 data->last_updated = jiffies;
0691 data->valid = true;
0692 }
0693
0694 mutex_unlock(&data->update_lock);
0695 return data;
0696 }
0697
0698 #define store_in_reg(REG, reg) \
0699 static int \
0700 store_in_##reg(struct device *dev, struct w83627ehf_data *data, int channel, \
0701 long val) \
0702 { \
0703 if (val < 0) \
0704 return -EINVAL; \
0705 mutex_lock(&data->update_lock); \
0706 data->in_##reg[channel] = in_to_reg(val, channel, data->scale_in); \
0707 w83627ehf_write_value(data, W83627EHF_REG_IN_##REG(channel), \
0708 data->in_##reg[channel]); \
0709 mutex_unlock(&data->update_lock); \
0710 return 0; \
0711 }
0712
0713 store_in_reg(MIN, min)
0714 store_in_reg(MAX, max)
0715
0716 static int
0717 store_fan_min(struct device *dev, struct w83627ehf_data *data, int channel,
0718 long val)
0719 {
0720 unsigned int reg;
0721 u8 new_div;
0722
0723 if (val < 0)
0724 return -EINVAL;
0725
0726 mutex_lock(&data->update_lock);
0727 if (!val) {
0728
0729 data->fan_min[channel] = 255;
0730 new_div = data->fan_div[channel];
0731 dev_info(dev, "fan%u low limit and alarm disabled\n",
0732 channel + 1);
0733 } else if ((reg = 1350000U / val) >= 128 * 255) {
0734
0735
0736
0737
0738 data->fan_min[channel] = 254;
0739 new_div = 7;
0740 dev_warn(dev,
0741 "fan%u low limit %lu below minimum %u, set to minimum\n",
0742 channel + 1, val, fan_from_reg8(254, 7));
0743 } else if (!reg) {
0744
0745
0746
0747
0748 data->fan_min[channel] = 1;
0749 new_div = 0;
0750 dev_warn(dev,
0751 "fan%u low limit %lu above maximum %u, set to maximum\n",
0752 channel + 1, val, fan_from_reg8(1, 0));
0753 } else {
0754
0755
0756
0757
0758
0759 new_div = 0;
0760 while (reg > 192 && new_div < 7) {
0761 reg >>= 1;
0762 new_div++;
0763 }
0764 data->fan_min[channel] = reg;
0765 }
0766
0767
0768
0769
0770
0771 if (new_div != data->fan_div[channel]) {
0772 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
0773 channel + 1, div_from_reg(data->fan_div[channel]),
0774 div_from_reg(new_div));
0775 data->fan_div[channel] = new_div;
0776 w83627ehf_write_fan_div(data, channel);
0777
0778 data->last_updated = jiffies;
0779 }
0780
0781 w83627ehf_write_value(data, W83627EHF_REG_FAN_MIN[channel],
0782 data->fan_min[channel]);
0783 mutex_unlock(&data->update_lock);
0784
0785 return 0;
0786 }
0787
0788 #define store_temp_reg(addr, reg) \
0789 static int \
0790 store_##reg(struct device *dev, struct w83627ehf_data *data, int channel, \
0791 long val) \
0792 { \
0793 mutex_lock(&data->update_lock); \
0794 data->reg[channel] = LM75_TEMP_TO_REG(val); \
0795 w83627ehf_write_temp(data, data->addr[channel], data->reg[channel]); \
0796 mutex_unlock(&data->update_lock); \
0797 return 0; \
0798 }
0799 store_temp_reg(reg_temp_over, temp_max);
0800 store_temp_reg(reg_temp_hyst, temp_max_hyst);
0801
0802 static int
0803 store_temp_offset(struct device *dev, struct w83627ehf_data *data, int channel,
0804 long val)
0805 {
0806 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
0807
0808 mutex_lock(&data->update_lock);
0809 data->temp_offset[channel] = val;
0810 w83627ehf_write_value(data, W83627EHF_REG_TEMP_OFFSET[channel], val);
0811 mutex_unlock(&data->update_lock);
0812 return 0;
0813 }
0814
0815 static int
0816 store_pwm_mode(struct device *dev, struct w83627ehf_data *data, int channel,
0817 long val)
0818 {
0819 u16 reg;
0820
0821 if (val < 0 || val > 1)
0822 return -EINVAL;
0823
0824 mutex_lock(&data->update_lock);
0825 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[channel]);
0826 data->pwm_mode[channel] = val;
0827 reg &= ~(1 << W83627EHF_PWM_MODE_SHIFT[channel]);
0828 if (!val)
0829 reg |= 1 << W83627EHF_PWM_MODE_SHIFT[channel];
0830 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[channel], reg);
0831 mutex_unlock(&data->update_lock);
0832 return 0;
0833 }
0834
0835 static int
0836 store_pwm(struct device *dev, struct w83627ehf_data *data, int channel,
0837 long val)
0838 {
0839 val = clamp_val(val, 0, 255);
0840
0841 mutex_lock(&data->update_lock);
0842 data->pwm[channel] = val;
0843 w83627ehf_write_value(data, W83627EHF_REG_PWM[channel], val);
0844 mutex_unlock(&data->update_lock);
0845 return 0;
0846 }
0847
0848 static int
0849 store_pwm_enable(struct device *dev, struct w83627ehf_data *data, int channel,
0850 long val)
0851 {
0852 u16 reg;
0853
0854 if (!val || val < 0 ||
0855 (val > 4 && val != data->pwm_enable_orig[channel]))
0856 return -EINVAL;
0857
0858 mutex_lock(&data->update_lock);
0859 data->pwm_enable[channel] = val;
0860 reg = w83627ehf_read_value(data,
0861 W83627EHF_REG_PWM_ENABLE[channel]);
0862 reg &= ~(0x03 << W83627EHF_PWM_ENABLE_SHIFT[channel]);
0863 reg |= (val - 1) << W83627EHF_PWM_ENABLE_SHIFT[channel];
0864 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[channel],
0865 reg);
0866 mutex_unlock(&data->update_lock);
0867 return 0;
0868 }
0869
0870 #define show_tol_temp(reg) \
0871 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
0872 char *buf) \
0873 { \
0874 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent); \
0875 struct sensor_device_attribute *sensor_attr = \
0876 to_sensor_dev_attr(attr); \
0877 int nr = sensor_attr->index; \
0878 return sprintf(buf, "%d\n", data->reg[nr] * 1000); \
0879 }
0880
0881 show_tol_temp(tolerance)
0882 show_tol_temp(target_temp)
0883
0884 static ssize_t
0885 store_target_temp(struct device *dev, struct device_attribute *attr,
0886 const char *buf, size_t count)
0887 {
0888 struct w83627ehf_data *data = dev_get_drvdata(dev);
0889 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0890 int nr = sensor_attr->index;
0891 long val;
0892 int err;
0893
0894 err = kstrtol(buf, 10, &val);
0895 if (err < 0)
0896 return err;
0897
0898 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 127);
0899
0900 mutex_lock(&data->update_lock);
0901 data->target_temp[nr] = val;
0902 w83627ehf_write_value(data, W83627EHF_REG_TARGET[nr], val);
0903 mutex_unlock(&data->update_lock);
0904 return count;
0905 }
0906
0907 static ssize_t
0908 store_tolerance(struct device *dev, struct device_attribute *attr,
0909 const char *buf, size_t count)
0910 {
0911 struct w83627ehf_data *data = dev_get_drvdata(dev);
0912 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0913 int nr = sensor_attr->index;
0914 u16 reg;
0915 long val;
0916 int err;
0917
0918 err = kstrtol(buf, 10, &val);
0919 if (err < 0)
0920 return err;
0921
0922
0923 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 15);
0924
0925 mutex_lock(&data->update_lock);
0926 reg = w83627ehf_read_value(data, W83627EHF_REG_TOLERANCE[nr]);
0927 if (nr == 1)
0928 reg = (reg & 0x0f) | (val << 4);
0929 else
0930 reg = (reg & 0xf0) | val;
0931 w83627ehf_write_value(data, W83627EHF_REG_TOLERANCE[nr], reg);
0932 data->tolerance[nr] = val;
0933 mutex_unlock(&data->update_lock);
0934 return count;
0935 }
0936
0937 static SENSOR_DEVICE_ATTR(pwm1_target, 0644, show_target_temp,
0938 store_target_temp, 0);
0939 static SENSOR_DEVICE_ATTR(pwm2_target, 0644, show_target_temp,
0940 store_target_temp, 1);
0941 static SENSOR_DEVICE_ATTR(pwm3_target, 0644, show_target_temp,
0942 store_target_temp, 2);
0943 static SENSOR_DEVICE_ATTR(pwm4_target, 0644, show_target_temp,
0944 store_target_temp, 3);
0945
0946 static SENSOR_DEVICE_ATTR(pwm1_tolerance, 0644, show_tolerance,
0947 store_tolerance, 0);
0948 static SENSOR_DEVICE_ATTR(pwm2_tolerance, 0644, show_tolerance,
0949 store_tolerance, 1);
0950 static SENSOR_DEVICE_ATTR(pwm3_tolerance, 0644, show_tolerance,
0951 store_tolerance, 2);
0952 static SENSOR_DEVICE_ATTR(pwm4_tolerance, 0644, show_tolerance,
0953 store_tolerance, 3);
0954
0955
0956
0957 #define fan_functions(reg, REG) \
0958 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
0959 char *buf) \
0960 { \
0961 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent); \
0962 struct sensor_device_attribute *sensor_attr = \
0963 to_sensor_dev_attr(attr); \
0964 int nr = sensor_attr->index; \
0965 return sprintf(buf, "%d\n", data->reg[nr]); \
0966 } \
0967 static ssize_t \
0968 store_##reg(struct device *dev, struct device_attribute *attr, \
0969 const char *buf, size_t count) \
0970 { \
0971 struct w83627ehf_data *data = dev_get_drvdata(dev); \
0972 struct sensor_device_attribute *sensor_attr = \
0973 to_sensor_dev_attr(attr); \
0974 int nr = sensor_attr->index; \
0975 unsigned long val; \
0976 int err; \
0977 err = kstrtoul(buf, 10, &val); \
0978 if (err < 0) \
0979 return err; \
0980 val = clamp_val(val, 1, 255); \
0981 mutex_lock(&data->update_lock); \
0982 data->reg[nr] = val; \
0983 w83627ehf_write_value(data, REG[nr], val); \
0984 mutex_unlock(&data->update_lock); \
0985 return count; \
0986 }
0987
0988 fan_functions(fan_start_output, W83627EHF_REG_FAN_START_OUTPUT)
0989 fan_functions(fan_stop_output, W83627EHF_REG_FAN_STOP_OUTPUT)
0990 fan_functions(fan_max_output, data->REG_FAN_MAX_OUTPUT)
0991 fan_functions(fan_step_output, data->REG_FAN_STEP_OUTPUT)
0992
0993 #define fan_time_functions(reg, REG) \
0994 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
0995 char *buf) \
0996 { \
0997 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent); \
0998 struct sensor_device_attribute *sensor_attr = \
0999 to_sensor_dev_attr(attr); \
1000 int nr = sensor_attr->index; \
1001 return sprintf(buf, "%d\n", \
1002 step_time_from_reg(data->reg[nr], \
1003 data->pwm_mode[nr])); \
1004 } \
1005 \
1006 static ssize_t \
1007 store_##reg(struct device *dev, struct device_attribute *attr, \
1008 const char *buf, size_t count) \
1009 { \
1010 struct w83627ehf_data *data = dev_get_drvdata(dev); \
1011 struct sensor_device_attribute *sensor_attr = \
1012 to_sensor_dev_attr(attr); \
1013 int nr = sensor_attr->index; \
1014 unsigned long val; \
1015 int err; \
1016 err = kstrtoul(buf, 10, &val); \
1017 if (err < 0) \
1018 return err; \
1019 val = step_time_to_reg(val, data->pwm_mode[nr]); \
1020 mutex_lock(&data->update_lock); \
1021 data->reg[nr] = val; \
1022 w83627ehf_write_value(data, REG[nr], val); \
1023 mutex_unlock(&data->update_lock); \
1024 return count; \
1025 } \
1026
1027 fan_time_functions(fan_stop_time, W83627EHF_REG_FAN_STOP_TIME)
1028
1029 static SENSOR_DEVICE_ATTR(pwm4_stop_time, 0644, show_fan_stop_time,
1030 store_fan_stop_time, 3);
1031 static SENSOR_DEVICE_ATTR(pwm4_start_output, 0644, show_fan_start_output,
1032 store_fan_start_output, 3);
1033 static SENSOR_DEVICE_ATTR(pwm4_stop_output, 0644, show_fan_stop_output,
1034 store_fan_stop_output, 3);
1035 static SENSOR_DEVICE_ATTR(pwm4_max_output, 0644, show_fan_max_output,
1036 store_fan_max_output, 3);
1037 static SENSOR_DEVICE_ATTR(pwm4_step_output, 0644, show_fan_step_output,
1038 store_fan_step_output, 3);
1039
1040 static SENSOR_DEVICE_ATTR(pwm3_stop_time, 0644, show_fan_stop_time,
1041 store_fan_stop_time, 2);
1042 static SENSOR_DEVICE_ATTR(pwm3_start_output, 0644, show_fan_start_output,
1043 store_fan_start_output, 2);
1044 static SENSOR_DEVICE_ATTR(pwm3_stop_output, 0644, show_fan_stop_output,
1045 store_fan_stop_output, 2);
1046
1047 static SENSOR_DEVICE_ATTR(pwm1_stop_time, 0644, show_fan_stop_time,
1048 store_fan_stop_time, 0);
1049 static SENSOR_DEVICE_ATTR(pwm2_stop_time, 0644, show_fan_stop_time,
1050 store_fan_stop_time, 1);
1051 static SENSOR_DEVICE_ATTR(pwm1_start_output, 0644, show_fan_start_output,
1052 store_fan_start_output, 0);
1053 static SENSOR_DEVICE_ATTR(pwm2_start_output, 0644, show_fan_start_output,
1054 store_fan_start_output, 1);
1055 static SENSOR_DEVICE_ATTR(pwm1_stop_output, 0644, show_fan_stop_output,
1056 store_fan_stop_output, 0);
1057 static SENSOR_DEVICE_ATTR(pwm2_stop_output, 0644, show_fan_stop_output,
1058 store_fan_stop_output, 1);
1059
1060
1061
1062
1063
1064
1065 static SENSOR_DEVICE_ATTR(pwm1_max_output, 0644, show_fan_max_output,
1066 store_fan_max_output, 0);
1067 static SENSOR_DEVICE_ATTR(pwm1_step_output, 0644, show_fan_step_output,
1068 store_fan_step_output, 0);
1069 static SENSOR_DEVICE_ATTR(pwm2_max_output, 0644, show_fan_max_output,
1070 store_fan_max_output, 1);
1071 static SENSOR_DEVICE_ATTR(pwm2_step_output, 0644, show_fan_step_output,
1072 store_fan_step_output, 1);
1073 static SENSOR_DEVICE_ATTR(pwm3_max_output, 0644, show_fan_max_output,
1074 store_fan_max_output, 2);
1075 static SENSOR_DEVICE_ATTR(pwm3_step_output, 0644, show_fan_step_output,
1076 store_fan_step_output, 2);
1077
1078 static ssize_t
1079 cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
1080 {
1081 struct w83627ehf_data *data = dev_get_drvdata(dev);
1082 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
1083 }
1084 static DEVICE_ATTR_RO(cpu0_vid);
1085
1086
1087
1088 static int
1089 clear_caseopen(struct device *dev, struct w83627ehf_data *data, int channel,
1090 long val)
1091 {
1092 const u16 mask = 0x80;
1093 u16 reg;
1094
1095 if (val != 0 || channel != 0)
1096 return -EINVAL;
1097
1098 mutex_lock(&data->update_lock);
1099 reg = w83627ehf_read_value(data, W83627EHF_REG_CASEOPEN_CLR);
1100 w83627ehf_write_value(data, W83627EHF_REG_CASEOPEN_CLR, reg | mask);
1101 w83627ehf_write_value(data, W83627EHF_REG_CASEOPEN_CLR, reg & ~mask);
1102 data->valid = false;
1103 mutex_unlock(&data->update_lock);
1104
1105 return 0;
1106 }
1107
1108 static umode_t w83627ehf_attrs_visible(struct kobject *kobj,
1109 struct attribute *a, int n)
1110 {
1111 struct device *dev = kobj_to_dev(kobj);
1112 struct w83627ehf_data *data = dev_get_drvdata(dev);
1113 struct device_attribute *devattr;
1114 struct sensor_device_attribute *sda;
1115
1116 devattr = container_of(a, struct device_attribute, attr);
1117
1118
1119 if (devattr->show == cpu0_vid_show && data->have_vid)
1120 return a->mode;
1121
1122 sda = (struct sensor_device_attribute *)devattr;
1123
1124 if (sda->index < 2 &&
1125 (devattr->show == show_fan_stop_time ||
1126 devattr->show == show_fan_start_output ||
1127 devattr->show == show_fan_stop_output))
1128 return a->mode;
1129
1130 if (sda->index < 3 &&
1131 (devattr->show == show_fan_max_output ||
1132 devattr->show == show_fan_step_output) &&
1133 data->REG_FAN_STEP_OUTPUT &&
1134 data->REG_FAN_STEP_OUTPUT[sda->index] != 0xff)
1135 return a->mode;
1136
1137
1138 if (sda->index == 2 &&
1139 (data->has_fan & (1 << 2)) && data->pwm_num >= 3 &&
1140 (devattr->show == show_fan_stop_time ||
1141 devattr->show == show_fan_start_output ||
1142 devattr->show == show_fan_stop_output))
1143 return a->mode;
1144
1145 if (sda->index == 3 &&
1146 (data->has_fan & (1 << 3)) && data->pwm_num >= 4 &&
1147 (devattr->show == show_fan_stop_time ||
1148 devattr->show == show_fan_start_output ||
1149 devattr->show == show_fan_stop_output ||
1150 devattr->show == show_fan_max_output ||
1151 devattr->show == show_fan_step_output))
1152 return a->mode;
1153
1154 if ((devattr->show == show_target_temp ||
1155 devattr->show == show_tolerance) &&
1156 (data->has_fan & (1 << sda->index)) &&
1157 sda->index < data->pwm_num)
1158 return a->mode;
1159
1160 return 0;
1161 }
1162
1163
1164 static struct attribute *w83627ehf_attrs[] = {
1165
1166 &sensor_dev_attr_pwm1_stop_time.dev_attr.attr,
1167 &sensor_dev_attr_pwm1_start_output.dev_attr.attr,
1168 &sensor_dev_attr_pwm1_stop_output.dev_attr.attr,
1169 &sensor_dev_attr_pwm1_max_output.dev_attr.attr,
1170 &sensor_dev_attr_pwm1_step_output.dev_attr.attr,
1171 &sensor_dev_attr_pwm1_target.dev_attr.attr,
1172 &sensor_dev_attr_pwm1_tolerance.dev_attr.attr,
1173
1174 &sensor_dev_attr_pwm2_stop_time.dev_attr.attr,
1175 &sensor_dev_attr_pwm2_start_output.dev_attr.attr,
1176 &sensor_dev_attr_pwm2_stop_output.dev_attr.attr,
1177 &sensor_dev_attr_pwm2_max_output.dev_attr.attr,
1178 &sensor_dev_attr_pwm2_step_output.dev_attr.attr,
1179 &sensor_dev_attr_pwm2_target.dev_attr.attr,
1180 &sensor_dev_attr_pwm2_tolerance.dev_attr.attr,
1181
1182 &sensor_dev_attr_pwm3_stop_time.dev_attr.attr,
1183 &sensor_dev_attr_pwm3_start_output.dev_attr.attr,
1184 &sensor_dev_attr_pwm3_stop_output.dev_attr.attr,
1185 &sensor_dev_attr_pwm3_max_output.dev_attr.attr,
1186 &sensor_dev_attr_pwm3_step_output.dev_attr.attr,
1187 &sensor_dev_attr_pwm3_target.dev_attr.attr,
1188 &sensor_dev_attr_pwm3_tolerance.dev_attr.attr,
1189
1190 &sensor_dev_attr_pwm4_stop_time.dev_attr.attr,
1191 &sensor_dev_attr_pwm4_start_output.dev_attr.attr,
1192 &sensor_dev_attr_pwm4_stop_output.dev_attr.attr,
1193 &sensor_dev_attr_pwm4_max_output.dev_attr.attr,
1194 &sensor_dev_attr_pwm4_step_output.dev_attr.attr,
1195 &sensor_dev_attr_pwm4_target.dev_attr.attr,
1196 &sensor_dev_attr_pwm4_tolerance.dev_attr.attr,
1197
1198 &dev_attr_cpu0_vid.attr,
1199 NULL
1200 };
1201
1202 static const struct attribute_group w83627ehf_group = {
1203 .attrs = w83627ehf_attrs,
1204 .is_visible = w83627ehf_attrs_visible,
1205 };
1206
1207 static const struct attribute_group *w83627ehf_groups[] = {
1208 &w83627ehf_group,
1209 NULL
1210 };
1211
1212
1213
1214
1215
1216
1217 static inline void w83627ehf_init_device(struct w83627ehf_data *data,
1218 enum kinds kind)
1219 {
1220 int i;
1221 u8 tmp, diode;
1222
1223
1224 tmp = w83627ehf_read_value(data, W83627EHF_REG_CONFIG);
1225 if (!(tmp & 0x01))
1226 w83627ehf_write_value(data, W83627EHF_REG_CONFIG,
1227 tmp | 0x01);
1228
1229
1230 for (i = 0; i < NUM_REG_TEMP; i++) {
1231 if (!(data->have_temp & (1 << i)))
1232 continue;
1233 if (!data->reg_temp_config[i])
1234 continue;
1235 tmp = w83627ehf_read_value(data,
1236 data->reg_temp_config[i]);
1237 if (tmp & 0x01)
1238 w83627ehf_write_value(data,
1239 data->reg_temp_config[i],
1240 tmp & 0xfe);
1241 }
1242
1243
1244 tmp = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
1245 if (!(tmp & 0x01))
1246 w83627ehf_write_value(data, W83627EHF_REG_VBAT, tmp | 0x01);
1247
1248
1249 switch (kind) {
1250 case w83627ehf:
1251 diode = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
1252 break;
1253 case w83627uhg:
1254 diode = 0x00;
1255 break;
1256 default:
1257 diode = 0x70;
1258 }
1259 for (i = 0; i < 3; i++) {
1260 const char *label = NULL;
1261
1262 if (data->temp_label)
1263 label = data->temp_label[data->temp_src[i]];
1264
1265
1266 if (label && strncmp(label, "PECI", 4) == 0)
1267 data->temp_type[i] = 6;
1268 else if (label && strncmp(label, "AMD", 3) == 0)
1269 data->temp_type[i] = 5;
1270 else if ((tmp & (0x02 << i)))
1271 data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 3;
1272 else
1273 data->temp_type[i] = 4;
1274 }
1275 }
1276
1277 static void
1278 w83627ehf_set_temp_reg_ehf(struct w83627ehf_data *data, int n_temp)
1279 {
1280 int i;
1281
1282 for (i = 0; i < n_temp; i++) {
1283 data->reg_temp[i] = W83627EHF_REG_TEMP[i];
1284 data->reg_temp_over[i] = W83627EHF_REG_TEMP_OVER[i];
1285 data->reg_temp_hyst[i] = W83627EHF_REG_TEMP_HYST[i];
1286 data->reg_temp_config[i] = W83627EHF_REG_TEMP_CONFIG[i];
1287 }
1288 }
1289
1290 static void
1291 w83627ehf_check_fan_inputs(const struct w83627ehf_sio_data *sio_data,
1292 struct w83627ehf_data *data)
1293 {
1294 int fan3pin, fan4pin, fan5pin, regval;
1295
1296
1297 if (sio_data->kind == w83627uhg) {
1298 data->has_fan = 0x03;
1299 data->has_fan_min = 0x03;
1300 return;
1301 }
1302
1303
1304 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) {
1305 fan3pin = 1;
1306 fan4pin = superio_inb(sio_data->sioreg, 0x27) & 0x40;
1307 fan5pin = superio_inb(sio_data->sioreg, 0x27) & 0x20;
1308 } else {
1309 fan3pin = 1;
1310 fan4pin = !(superio_inb(sio_data->sioreg, 0x29) & 0x06);
1311 fan5pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x02);
1312 }
1313
1314 data->has_fan = data->has_fan_min = 0x03;
1315 data->has_fan |= (fan3pin << 2);
1316 data->has_fan_min |= (fan3pin << 2);
1317
1318
1319
1320
1321
1322
1323
1324
1325 regval = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
1326 if ((regval & (1 << 2)) && fan4pin) {
1327 data->has_fan |= (1 << 3);
1328 data->has_fan_min |= (1 << 3);
1329 }
1330 if (!(regval & (1 << 1)) && fan5pin) {
1331 data->has_fan |= (1 << 4);
1332 data->has_fan_min |= (1 << 4);
1333 }
1334 }
1335
1336 static umode_t
1337 w83627ehf_is_visible(const void *drvdata, enum hwmon_sensor_types type,
1338 u32 attr, int channel)
1339 {
1340 const struct w83627ehf_data *data = drvdata;
1341
1342 switch (type) {
1343 case hwmon_temp:
1344
1345 if (!(data->have_temp & (1 << channel)))
1346 return 0;
1347 if (attr == hwmon_temp_input)
1348 return 0444;
1349 if (attr == hwmon_temp_label) {
1350 if (data->temp_label)
1351 return 0444;
1352 return 0;
1353 }
1354 if (channel == 2 && data->temp3_val_only)
1355 return 0;
1356 if (attr == hwmon_temp_max) {
1357 if (data->reg_temp_over[channel])
1358 return 0644;
1359 else
1360 return 0;
1361 }
1362 if (attr == hwmon_temp_max_hyst) {
1363 if (data->reg_temp_hyst[channel])
1364 return 0644;
1365 else
1366 return 0;
1367 }
1368 if (channel > 2)
1369 return 0;
1370 if (attr == hwmon_temp_alarm || attr == hwmon_temp_type)
1371 return 0444;
1372 if (attr == hwmon_temp_offset) {
1373 if (data->have_temp_offset & (1 << channel))
1374 return 0644;
1375 else
1376 return 0;
1377 }
1378 break;
1379
1380 case hwmon_fan:
1381
1382 if (!(data->has_fan & (1 << channel)))
1383 return 0;
1384 if (attr == hwmon_fan_input || attr == hwmon_fan_alarm)
1385 return 0444;
1386 if (attr == hwmon_fan_div) {
1387 return 0444;
1388 }
1389 if (attr == hwmon_fan_min) {
1390 if (data->has_fan_min & (1 << channel))
1391 return 0644;
1392 else
1393 return 0;
1394 }
1395 break;
1396
1397 case hwmon_in:
1398
1399 if (channel >= data->in_num)
1400 return 0;
1401 if (channel == 6 && data->in6_skip)
1402 return 0;
1403 if (attr == hwmon_in_alarm || attr == hwmon_in_input)
1404 return 0444;
1405 if (attr == hwmon_in_min || attr == hwmon_in_max)
1406 return 0644;
1407 break;
1408
1409 case hwmon_pwm:
1410
1411 if (!(data->has_fan & (1 << channel)) ||
1412 channel >= data->pwm_num)
1413 return 0;
1414 if (attr == hwmon_pwm_mode || attr == hwmon_pwm_enable ||
1415 attr == hwmon_pwm_input)
1416 return 0644;
1417 break;
1418
1419 case hwmon_intrusion:
1420 return 0644;
1421
1422 default:
1423 return 0;
1424 }
1425
1426 return 0;
1427 }
1428
1429 static int
1430 w83627ehf_do_read_temp(struct w83627ehf_data *data, u32 attr,
1431 int channel, long *val)
1432 {
1433 switch (attr) {
1434 case hwmon_temp_input:
1435 *val = LM75_TEMP_FROM_REG(data->temp[channel]);
1436 return 0;
1437 case hwmon_temp_max:
1438 *val = LM75_TEMP_FROM_REG(data->temp_max[channel]);
1439 return 0;
1440 case hwmon_temp_max_hyst:
1441 *val = LM75_TEMP_FROM_REG(data->temp_max_hyst[channel]);
1442 return 0;
1443 case hwmon_temp_offset:
1444 *val = data->temp_offset[channel] * 1000;
1445 return 0;
1446 case hwmon_temp_type:
1447 *val = (int)data->temp_type[channel];
1448 return 0;
1449 case hwmon_temp_alarm:
1450 if (channel < 3) {
1451 int bit[] = { 4, 5, 13 };
1452 *val = (data->alarms >> bit[channel]) & 1;
1453 return 0;
1454 }
1455 break;
1456
1457 default:
1458 break;
1459 }
1460
1461 return -EOPNOTSUPP;
1462 }
1463
1464 static int
1465 w83627ehf_do_read_in(struct w83627ehf_data *data, u32 attr,
1466 int channel, long *val)
1467 {
1468 switch (attr) {
1469 case hwmon_in_input:
1470 *val = in_from_reg(data->in[channel], channel, data->scale_in);
1471 return 0;
1472 case hwmon_in_min:
1473 *val = in_from_reg(data->in_min[channel], channel,
1474 data->scale_in);
1475 return 0;
1476 case hwmon_in_max:
1477 *val = in_from_reg(data->in_max[channel], channel,
1478 data->scale_in);
1479 return 0;
1480 case hwmon_in_alarm:
1481 if (channel < 10) {
1482 int bit[] = { 0, 1, 2, 3, 8, 21, 20, 16, 17, 19 };
1483 *val = (data->alarms >> bit[channel]) & 1;
1484 return 0;
1485 }
1486 break;
1487 default:
1488 break;
1489 }
1490 return -EOPNOTSUPP;
1491 }
1492
1493 static int
1494 w83627ehf_do_read_fan(struct w83627ehf_data *data, u32 attr,
1495 int channel, long *val)
1496 {
1497 switch (attr) {
1498 case hwmon_fan_input:
1499 *val = data->rpm[channel];
1500 return 0;
1501 case hwmon_fan_min:
1502 *val = fan_from_reg8(data->fan_min[channel],
1503 data->fan_div[channel]);
1504 return 0;
1505 case hwmon_fan_div:
1506 *val = div_from_reg(data->fan_div[channel]);
1507 return 0;
1508 case hwmon_fan_alarm:
1509 if (channel < 5) {
1510 int bit[] = { 6, 7, 11, 10, 23 };
1511 *val = (data->alarms >> bit[channel]) & 1;
1512 return 0;
1513 }
1514 break;
1515 default:
1516 break;
1517 }
1518 return -EOPNOTSUPP;
1519 }
1520
1521 static int
1522 w83627ehf_do_read_pwm(struct w83627ehf_data *data, u32 attr,
1523 int channel, long *val)
1524 {
1525 switch (attr) {
1526 case hwmon_pwm_input:
1527 *val = data->pwm[channel];
1528 return 0;
1529 case hwmon_pwm_enable:
1530 *val = data->pwm_enable[channel];
1531 return 0;
1532 case hwmon_pwm_mode:
1533 *val = data->pwm_enable[channel];
1534 return 0;
1535 default:
1536 break;
1537 }
1538 return -EOPNOTSUPP;
1539 }
1540
1541 static int
1542 w83627ehf_do_read_intrusion(struct w83627ehf_data *data, u32 attr,
1543 int channel, long *val)
1544 {
1545 if (attr != hwmon_intrusion_alarm || channel != 0)
1546 return -EOPNOTSUPP;
1547
1548 *val = !!(data->caseopen & 0x10);
1549 return 0;
1550 }
1551
1552 static int
1553 w83627ehf_read(struct device *dev, enum hwmon_sensor_types type,
1554 u32 attr, int channel, long *val)
1555 {
1556 struct w83627ehf_data *data = w83627ehf_update_device(dev->parent);
1557
1558 switch (type) {
1559 case hwmon_fan:
1560 return w83627ehf_do_read_fan(data, attr, channel, val);
1561
1562 case hwmon_in:
1563 return w83627ehf_do_read_in(data, attr, channel, val);
1564
1565 case hwmon_pwm:
1566 return w83627ehf_do_read_pwm(data, attr, channel, val);
1567
1568 case hwmon_temp:
1569 return w83627ehf_do_read_temp(data, attr, channel, val);
1570
1571 case hwmon_intrusion:
1572 return w83627ehf_do_read_intrusion(data, attr, channel, val);
1573
1574 default:
1575 break;
1576 }
1577
1578 return -EOPNOTSUPP;
1579 }
1580
1581 static int
1582 w83627ehf_read_string(struct device *dev, enum hwmon_sensor_types type,
1583 u32 attr, int channel, const char **str)
1584 {
1585 struct w83627ehf_data *data = dev_get_drvdata(dev);
1586
1587 switch (type) {
1588 case hwmon_temp:
1589 if (attr == hwmon_temp_label) {
1590 *str = data->temp_label[data->temp_src[channel]];
1591 return 0;
1592 }
1593 break;
1594
1595 default:
1596 break;
1597 }
1598
1599 return -EOPNOTSUPP;
1600 }
1601
1602 static int
1603 w83627ehf_write(struct device *dev, enum hwmon_sensor_types type,
1604 u32 attr, int channel, long val)
1605 {
1606 struct w83627ehf_data *data = dev_get_drvdata(dev);
1607
1608 if (type == hwmon_in && attr == hwmon_in_min)
1609 return store_in_min(dev, data, channel, val);
1610 if (type == hwmon_in && attr == hwmon_in_max)
1611 return store_in_max(dev, data, channel, val);
1612
1613 if (type == hwmon_fan && attr == hwmon_fan_min)
1614 return store_fan_min(dev, data, channel, val);
1615
1616 if (type == hwmon_temp && attr == hwmon_temp_max)
1617 return store_temp_max(dev, data, channel, val);
1618 if (type == hwmon_temp && attr == hwmon_temp_max_hyst)
1619 return store_temp_max_hyst(dev, data, channel, val);
1620 if (type == hwmon_temp && attr == hwmon_temp_offset)
1621 return store_temp_offset(dev, data, channel, val);
1622
1623 if (type == hwmon_pwm && attr == hwmon_pwm_mode)
1624 return store_pwm_mode(dev, data, channel, val);
1625 if (type == hwmon_pwm && attr == hwmon_pwm_enable)
1626 return store_pwm_enable(dev, data, channel, val);
1627 if (type == hwmon_pwm && attr == hwmon_pwm_input)
1628 return store_pwm(dev, data, channel, val);
1629
1630 if (type == hwmon_intrusion && attr == hwmon_intrusion_alarm)
1631 return clear_caseopen(dev, data, channel, val);
1632
1633 return -EOPNOTSUPP;
1634 }
1635
1636 static const struct hwmon_ops w83627ehf_ops = {
1637 .is_visible = w83627ehf_is_visible,
1638 .read = w83627ehf_read,
1639 .read_string = w83627ehf_read_string,
1640 .write = w83627ehf_write,
1641 };
1642
1643 static const struct hwmon_channel_info *w83627ehf_info[] = {
1644 HWMON_CHANNEL_INFO(fan,
1645 HWMON_F_ALARM | HWMON_F_DIV | HWMON_F_INPUT | HWMON_F_MIN,
1646 HWMON_F_ALARM | HWMON_F_DIV | HWMON_F_INPUT | HWMON_F_MIN,
1647 HWMON_F_ALARM | HWMON_F_DIV | HWMON_F_INPUT | HWMON_F_MIN,
1648 HWMON_F_ALARM | HWMON_F_DIV | HWMON_F_INPUT | HWMON_F_MIN,
1649 HWMON_F_ALARM | HWMON_F_DIV | HWMON_F_INPUT | HWMON_F_MIN),
1650 HWMON_CHANNEL_INFO(in,
1651 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1652 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1653 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1654 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1655 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1656 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1657 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1658 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1659 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN,
1660 HWMON_I_ALARM | HWMON_I_INPUT | HWMON_I_MAX | HWMON_I_MIN),
1661 HWMON_CHANNEL_INFO(pwm,
1662 HWMON_PWM_ENABLE | HWMON_PWM_INPUT | HWMON_PWM_MODE,
1663 HWMON_PWM_ENABLE | HWMON_PWM_INPUT | HWMON_PWM_MODE,
1664 HWMON_PWM_ENABLE | HWMON_PWM_INPUT | HWMON_PWM_MODE,
1665 HWMON_PWM_ENABLE | HWMON_PWM_INPUT | HWMON_PWM_MODE),
1666 HWMON_CHANNEL_INFO(temp,
1667 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1668 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1669 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1670 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1671 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1672 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1673 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1674 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1675 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1676 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1677 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1678 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1679 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1680 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1681 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1682 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE,
1683 HWMON_T_ALARM | HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MAX |
1684 HWMON_T_MAX_HYST | HWMON_T_OFFSET | HWMON_T_TYPE),
1685 HWMON_CHANNEL_INFO(intrusion,
1686 HWMON_INTRUSION_ALARM),
1687 NULL
1688 };
1689
1690 static const struct hwmon_chip_info w83627ehf_chip_info = {
1691 .ops = &w83627ehf_ops,
1692 .info = w83627ehf_info,
1693 };
1694
1695 static int __init w83627ehf_probe(struct platform_device *pdev)
1696 {
1697 struct device *dev = &pdev->dev;
1698 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
1699 struct w83627ehf_data *data;
1700 struct resource *res;
1701 u8 en_vrm10;
1702 int i, err = 0;
1703 struct device *hwmon_dev;
1704
1705 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1706 if (!devm_request_region(dev, res->start, IOREGION_LENGTH, DRVNAME))
1707 return -EBUSY;
1708
1709 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
1710 if (!data)
1711 return -ENOMEM;
1712
1713 data->addr = res->start;
1714 mutex_init(&data->lock);
1715 mutex_init(&data->update_lock);
1716 data->name = w83627ehf_device_names[sio_data->kind];
1717 data->bank = 0xff;
1718 platform_set_drvdata(pdev, data);
1719
1720
1721 data->in_num = (sio_data->kind == w83627ehf) ? 10 : 9;
1722
1723 switch (sio_data->kind) {
1724 default:
1725 data->pwm_num = 4;
1726 break;
1727 case w83667hg:
1728 case w83667hg_b:
1729 data->pwm_num = 3;
1730 break;
1731 case w83627uhg:
1732 data->pwm_num = 2;
1733 break;
1734 }
1735
1736
1737 data->have_temp = 0x07;
1738
1739
1740 if (sio_data->kind == w83667hg_b) {
1741 u8 reg;
1742
1743 w83627ehf_set_temp_reg_ehf(data, 4);
1744
1745
1746
1747
1748
1749 reg = w83627ehf_read_value(data, 0x4a);
1750 data->temp_src[0] = reg >> 5;
1751 reg = w83627ehf_read_value(data, 0x49);
1752 data->temp_src[1] = reg & 0x07;
1753 data->temp_src[2] = (reg >> 4) & 0x07;
1754
1755
1756
1757
1758
1759
1760
1761 reg = w83627ehf_read_value(data, 0x7d);
1762 reg &= 0x07;
1763 if (reg != data->temp_src[0] && reg != data->temp_src[1]
1764 && reg != data->temp_src[2]) {
1765 data->temp_src[3] = reg;
1766 data->have_temp |= 1 << 3;
1767 }
1768
1769
1770
1771
1772
1773 reg = w83627ehf_read_value(data, W83627EHF_REG_TEMP_CONFIG[2]);
1774 if (data->temp_src[2] == 2 && (reg & 0x01))
1775 data->have_temp &= ~(1 << 2);
1776
1777 if ((data->temp_src[2] == 2 && (data->have_temp & (1 << 2)))
1778 || (data->temp_src[3] == 2 && (data->have_temp & (1 << 3))))
1779 data->in6_skip = 1;
1780
1781 data->temp_label = w83667hg_b_temp_label;
1782 data->have_temp_offset = data->have_temp & 0x07;
1783 for (i = 0; i < 3; i++) {
1784 if (data->temp_src[i] > 2)
1785 data->have_temp_offset &= ~(1 << i);
1786 }
1787 } else if (sio_data->kind == w83627uhg) {
1788 u8 reg;
1789
1790 w83627ehf_set_temp_reg_ehf(data, 3);
1791
1792
1793
1794
1795
1796 data->temp_src[0] = 0;
1797 reg = w83627ehf_read_value(data, 0x49) & 0x07;
1798
1799 if (reg == 0)
1800 data->temp_src[1] = 1;
1801 else if (reg >= 2 && reg <= 5)
1802 data->temp_src[1] = reg + 2;
1803 else
1804 data->have_temp &= ~(1 << 1);
1805 reg = w83627ehf_read_value(data, 0x4a);
1806 data->temp_src[2] = reg >> 5;
1807
1808
1809
1810
1811
1812 if (data->temp_src[2] == 2 || data->temp_src[2] == 3 ||
1813 data->temp_src[2] == data->temp_src[0] ||
1814 ((data->have_temp & (1 << 1)) &&
1815 data->temp_src[2] == data->temp_src[1]))
1816 data->have_temp &= ~(1 << 2);
1817 else
1818 data->temp3_val_only = 1;
1819
1820 data->in6_skip = 1;
1821
1822 data->temp_label = w83667hg_b_temp_label;
1823 data->have_temp_offset = data->have_temp & 0x03;
1824 for (i = 0; i < 3; i++) {
1825 if (data->temp_src[i] > 1)
1826 data->have_temp_offset &= ~(1 << i);
1827 }
1828 } else {
1829 w83627ehf_set_temp_reg_ehf(data, 3);
1830
1831
1832
1833 if (sio_data->kind == w83667hg) {
1834 u8 reg;
1835
1836
1837
1838
1839
1840 reg = w83627ehf_read_value(data,
1841 W83627EHF_REG_TEMP_CONFIG[2]);
1842 if (reg & 0x01)
1843 data->have_temp &= ~(1 << 2);
1844 else
1845 data->in6_skip = 1;
1846 }
1847 data->have_temp_offset = data->have_temp & 0x07;
1848 }
1849
1850 if (sio_data->kind == w83667hg_b) {
1851 data->REG_FAN_MAX_OUTPUT =
1852 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B;
1853 data->REG_FAN_STEP_OUTPUT =
1854 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B;
1855 } else {
1856 data->REG_FAN_MAX_OUTPUT =
1857 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON;
1858 data->REG_FAN_STEP_OUTPUT =
1859 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON;
1860 }
1861
1862
1863 if (sio_data->kind == w83627uhg)
1864 data->scale_in = scale_in_w83627uhg;
1865 else
1866 data->scale_in = scale_in_common;
1867
1868
1869 w83627ehf_init_device(data, sio_data->kind);
1870
1871 data->vrm = vid_which_vrm();
1872
1873 err = superio_enter(sio_data->sioreg);
1874 if (err)
1875 return err;
1876
1877
1878 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) {
1879
1880
1881
1882
1883
1884 superio_select(sio_data->sioreg, W83667HG_LD_VID);
1885 data->vid = superio_inb(sio_data->sioreg, 0xe3);
1886 data->have_vid = true;
1887 } else if (sio_data->kind != w83627uhg) {
1888 superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
1889 if (superio_inb(sio_data->sioreg, SIO_REG_VID_CTRL) & 0x80) {
1890
1891
1892
1893
1894
1895
1896
1897 if (sio_data->kind == w83627ehf) {
1898 en_vrm10 = superio_inb(sio_data->sioreg,
1899 SIO_REG_EN_VRM10);
1900 if ((en_vrm10 & 0x08) && data->vrm == 90) {
1901 dev_warn(dev,
1902 "Setting VID input voltage to TTL\n");
1903 superio_outb(sio_data->sioreg,
1904 SIO_REG_EN_VRM10,
1905 en_vrm10 & ~0x08);
1906 } else if (!(en_vrm10 & 0x08)
1907 && data->vrm == 100) {
1908 dev_warn(dev,
1909 "Setting VID input voltage to VRM10\n");
1910 superio_outb(sio_data->sioreg,
1911 SIO_REG_EN_VRM10,
1912 en_vrm10 | 0x08);
1913 }
1914 }
1915
1916 data->vid = superio_inb(sio_data->sioreg,
1917 SIO_REG_VID_DATA);
1918 if (sio_data->kind == w83627ehf)
1919 data->vid &= 0x3f;
1920 data->have_vid = true;
1921 } else {
1922 dev_info(dev,
1923 "VID pins in output mode, CPU VID not available\n");
1924 }
1925 }
1926
1927 w83627ehf_check_fan_inputs(sio_data, data);
1928
1929 superio_exit(sio_data->sioreg);
1930
1931
1932 w83627ehf_update_fan_div(data);
1933
1934
1935 w83627ehf_update_pwm(data);
1936 for (i = 0; i < data->pwm_num; i++)
1937 data->pwm_enable_orig[i] = data->pwm_enable[i];
1938
1939 hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev,
1940 data->name,
1941 data,
1942 &w83627ehf_chip_info,
1943 w83627ehf_groups);
1944 return PTR_ERR_OR_ZERO(hwmon_dev);
1945 }
1946
1947 static int __maybe_unused w83627ehf_suspend(struct device *dev)
1948 {
1949 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1950
1951 mutex_lock(&data->update_lock);
1952 data->vbat = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
1953 mutex_unlock(&data->update_lock);
1954
1955 return 0;
1956 }
1957
1958 static int __maybe_unused w83627ehf_resume(struct device *dev)
1959 {
1960 struct w83627ehf_data *data = dev_get_drvdata(dev);
1961 int i;
1962
1963 mutex_lock(&data->update_lock);
1964 data->bank = 0xff;
1965
1966
1967 for (i = 0; i < data->in_num; i++) {
1968 if ((i == 6) && data->in6_skip)
1969 continue;
1970
1971 w83627ehf_write_value(data, W83627EHF_REG_IN_MIN(i),
1972 data->in_min[i]);
1973 w83627ehf_write_value(data, W83627EHF_REG_IN_MAX(i),
1974 data->in_max[i]);
1975 }
1976
1977 for (i = 0; i < 5; i++) {
1978 if (!(data->has_fan_min & (1 << i)))
1979 continue;
1980
1981 w83627ehf_write_value(data, W83627EHF_REG_FAN_MIN[i],
1982 data->fan_min[i]);
1983 }
1984
1985 for (i = 0; i < NUM_REG_TEMP; i++) {
1986 if (!(data->have_temp & (1 << i)))
1987 continue;
1988
1989 if (data->reg_temp_over[i])
1990 w83627ehf_write_temp(data, data->reg_temp_over[i],
1991 data->temp_max[i]);
1992 if (data->reg_temp_hyst[i])
1993 w83627ehf_write_temp(data, data->reg_temp_hyst[i],
1994 data->temp_max_hyst[i]);
1995 if (i > 2)
1996 continue;
1997 if (data->have_temp_offset & (1 << i))
1998 w83627ehf_write_value(data,
1999 W83627EHF_REG_TEMP_OFFSET[i],
2000 data->temp_offset[i]);
2001 }
2002
2003
2004 w83627ehf_write_value(data, W83627EHF_REG_VBAT, data->vbat);
2005
2006
2007 data->valid = false;
2008 mutex_unlock(&data->update_lock);
2009
2010 return 0;
2011 }
2012
2013 static SIMPLE_DEV_PM_OPS(w83627ehf_dev_pm_ops, w83627ehf_suspend, w83627ehf_resume);
2014
2015 static struct platform_driver w83627ehf_driver = {
2016 .driver = {
2017 .name = DRVNAME,
2018 .pm = &w83627ehf_dev_pm_ops,
2019 },
2020 };
2021
2022
2023 static int __init w83627ehf_find(int sioaddr, unsigned short *addr,
2024 struct w83627ehf_sio_data *sio_data)
2025 {
2026 static const char sio_name_W83627EHF[] __initconst = "W83627EHF";
2027 static const char sio_name_W83627EHG[] __initconst = "W83627EHG";
2028 static const char sio_name_W83627DHG[] __initconst = "W83627DHG";
2029 static const char sio_name_W83627DHG_P[] __initconst = "W83627DHG-P";
2030 static const char sio_name_W83627UHG[] __initconst = "W83627UHG";
2031 static const char sio_name_W83667HG[] __initconst = "W83667HG";
2032 static const char sio_name_W83667HG_B[] __initconst = "W83667HG-B";
2033
2034 u16 val;
2035 const char *sio_name;
2036 int err;
2037
2038 err = superio_enter(sioaddr);
2039 if (err)
2040 return err;
2041
2042 if (force_id)
2043 val = force_id;
2044 else
2045 val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
2046 | superio_inb(sioaddr, SIO_REG_DEVID + 1);
2047 switch (val & SIO_ID_MASK) {
2048 case SIO_W83627EHF_ID:
2049 sio_data->kind = w83627ehf;
2050 sio_name = sio_name_W83627EHF;
2051 break;
2052 case SIO_W83627EHG_ID:
2053 sio_data->kind = w83627ehf;
2054 sio_name = sio_name_W83627EHG;
2055 break;
2056 case SIO_W83627DHG_ID:
2057 sio_data->kind = w83627dhg;
2058 sio_name = sio_name_W83627DHG;
2059 break;
2060 case SIO_W83627DHG_P_ID:
2061 sio_data->kind = w83627dhg_p;
2062 sio_name = sio_name_W83627DHG_P;
2063 break;
2064 case SIO_W83627UHG_ID:
2065 sio_data->kind = w83627uhg;
2066 sio_name = sio_name_W83627UHG;
2067 break;
2068 case SIO_W83667HG_ID:
2069 sio_data->kind = w83667hg;
2070 sio_name = sio_name_W83667HG;
2071 break;
2072 case SIO_W83667HG_B_ID:
2073 sio_data->kind = w83667hg_b;
2074 sio_name = sio_name_W83667HG_B;
2075 break;
2076 default:
2077 if (val != 0xffff)
2078 pr_debug("unsupported chip ID: 0x%04x\n", val);
2079 superio_exit(sioaddr);
2080 return -ENODEV;
2081 }
2082
2083
2084 superio_select(sioaddr, W83627EHF_LD_HWM);
2085 val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
2086 | superio_inb(sioaddr, SIO_REG_ADDR + 1);
2087 *addr = val & IOREGION_ALIGNMENT;
2088 if (*addr == 0) {
2089 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n");
2090 superio_exit(sioaddr);
2091 return -ENODEV;
2092 }
2093
2094
2095 val = superio_inb(sioaddr, SIO_REG_ENABLE);
2096 if (!(val & 0x01)) {
2097 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n");
2098 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
2099 }
2100
2101 superio_exit(sioaddr);
2102 pr_info("Found %s chip at %#x\n", sio_name, *addr);
2103 sio_data->sioreg = sioaddr;
2104
2105 return 0;
2106 }
2107
2108
2109
2110
2111
2112
2113 static struct platform_device *pdev;
2114
2115 static int __init sensors_w83627ehf_init(void)
2116 {
2117 int err;
2118 unsigned short address;
2119 struct resource res = {
2120 .name = DRVNAME,
2121 .flags = IORESOURCE_IO,
2122 };
2123 struct w83627ehf_sio_data sio_data;
2124
2125
2126
2127
2128
2129
2130
2131
2132 if (w83627ehf_find(0x2e, &address, &sio_data) &&
2133 w83627ehf_find(0x4e, &address, &sio_data))
2134 return -ENODEV;
2135
2136 res.start = address + IOREGION_OFFSET;
2137 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
2138
2139 err = acpi_check_resource_conflict(&res);
2140 if (err)
2141 return err;
2142
2143 pdev = platform_create_bundle(&w83627ehf_driver, w83627ehf_probe, &res, 1, &sio_data,
2144 sizeof(struct w83627ehf_sio_data));
2145
2146 return PTR_ERR_OR_ZERO(pdev);
2147 }
2148
2149 static void __exit sensors_w83627ehf_exit(void)
2150 {
2151 platform_device_unregister(pdev);
2152 platform_driver_unregister(&w83627ehf_driver);
2153 }
2154
2155 MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
2156 MODULE_DESCRIPTION("W83627EHF driver");
2157 MODULE_LICENSE("GPL");
2158
2159 module_init(sensors_w83627ehf_init);
2160 module_exit(sensors_w83627ehf_exit);