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 #include <linux/module.h>
0026 #include <linux/init.h>
0027 #include <linux/slab.h>
0028 #include <linux/i2c.h>
0029 #include <linux/hwmon.h>
0030 #include <linux/hwmon-sysfs.h>
0031 #include <linux/err.h>
0032 #include <linux/mutex.h>
0033 #include <linux/sysfs.h>
0034 #include <linux/jiffies.h>
0035
0036
0037 static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
0038 I2C_CLIENT_END };
0039
0040
0041
0042 static unsigned short force_subclients[4];
0043 module_param_array(force_subclients, short, NULL, 0);
0044 MODULE_PARM_DESC(force_subclients,
0045 "List of subclient addresses: {bus, clientaddr, subclientaddr1, subclientaddr2}");
0046
0047 static bool init;
0048 module_param(init, bool, 0);
0049 MODULE_PARM_DESC(init, "Set to one to force chip initialization");
0050
0051
0052 static const u8 W83792D_REG_IN[9] = {
0053 0x20,
0054 0x21,
0055 0x22,
0056 0x23,
0057 0x24,
0058 0x25,
0059 0x26,
0060 0xB0,
0061 0xB1
0062 };
0063 #define W83792D_REG_LOW_BITS1 0x3E
0064 #define W83792D_REG_LOW_BITS2 0x3F
0065 static const u8 W83792D_REG_IN_MAX[9] = {
0066 0x2B,
0067 0x2D,
0068 0x2F,
0069 0x31,
0070 0x33,
0071 0x35,
0072 0x37,
0073 0xB4,
0074 0xB6
0075 };
0076 static const u8 W83792D_REG_IN_MIN[9] = {
0077 0x2C,
0078 0x2E,
0079 0x30,
0080 0x32,
0081 0x34,
0082 0x36,
0083 0x38,
0084 0xB5,
0085 0xB7
0086 };
0087 static const u8 W83792D_REG_FAN[7] = {
0088 0x28,
0089 0x29,
0090 0x2A,
0091 0xB8,
0092 0xB9,
0093 0xBA,
0094 0xBE
0095 };
0096 static const u8 W83792D_REG_FAN_MIN[7] = {
0097 0x3B,
0098 0x3C,
0099 0x3D,
0100 0xBB,
0101 0xBC,
0102 0xBD,
0103 0xBF
0104 };
0105 #define W83792D_REG_FAN_CFG 0x84
0106 static const u8 W83792D_REG_FAN_DIV[4] = {
0107 0x47,
0108 0x5B,
0109 0x5C,
0110 0x9E
0111 };
0112 static const u8 W83792D_REG_PWM[7] = {
0113 0x81,
0114 0x83,
0115 0x94,
0116 0xA3,
0117 0xA4,
0118 0xA5,
0119 0xA6
0120 };
0121 #define W83792D_REG_BANK 0x4E
0122 #define W83792D_REG_TEMP2_CONFIG 0xC2
0123 #define W83792D_REG_TEMP3_CONFIG 0xCA
0124
0125 static const u8 W83792D_REG_TEMP1[3] = {
0126 0x27,
0127 0x39,
0128 0x3A,
0129 };
0130
0131 static const u8 W83792D_REG_TEMP_ADD[2][6] = {
0132 { 0xC0,
0133 0xC1,
0134 0xC5,
0135 0xC6,
0136 0xC3,
0137 0xC4 },
0138 { 0xC8,
0139 0xC9,
0140 0xCD,
0141 0xCE,
0142 0xCB,
0143 0xCC }
0144 };
0145
0146 static const u8 W83792D_REG_THERMAL[3] = {
0147 0x85,
0148 0x86,
0149 0x96
0150 };
0151
0152 static const u8 W83792D_REG_TOLERANCE[3] = {
0153 0x87,
0154 0x87,
0155 0x97
0156 };
0157
0158 static const u8 W83792D_REG_POINTS[3][4] = {
0159 { 0x85,
0160 0xE3,
0161 0xE4,
0162 0xE5 },
0163 { 0x86,
0164 0xE6,
0165 0xE7,
0166 0xE8 },
0167 { 0x96,
0168 0xE9,
0169 0xEA,
0170 0xEB }
0171 };
0172
0173 static const u8 W83792D_REG_LEVELS[3][4] = {
0174 { 0x88,
0175 0x88,
0176 0xE0,
0177 0xE0 },
0178 { 0x89,
0179 0x89,
0180 0xE1,
0181 0xE1 },
0182 { 0x98,
0183 0x98,
0184 0xE2,
0185 0xE2 }
0186 };
0187
0188 #define W83792D_REG_GPIO_EN 0x1A
0189 #define W83792D_REG_CONFIG 0x40
0190 #define W83792D_REG_VID_FANDIV 0x47
0191 #define W83792D_REG_CHIPID 0x49
0192 #define W83792D_REG_WCHIPID 0x58
0193 #define W83792D_REG_CHIPMAN 0x4F
0194 #define W83792D_REG_PIN 0x4B
0195 #define W83792D_REG_I2C_SUBADDR 0x4A
0196
0197 #define W83792D_REG_ALARM1 0xA9
0198 #define W83792D_REG_ALARM2 0xAA
0199 #define W83792D_REG_ALARM3 0xAB
0200 #define W83792D_REG_CHASSIS 0x42
0201 #define W83792D_REG_CHASSIS_CLR 0x44
0202
0203
0204 #define W83792D_REG_VID_IN_B 0x17
0205
0206 #define W83792D_REG_VBAT 0x5D
0207 #define W83792D_REG_I2C_ADDR 0x48
0208
0209
0210
0211
0212
0213
0214
0215 #define IN_FROM_REG(nr, val) (((nr) <= 1) ? ((val) * 2) : \
0216 ((((nr) == 6) || ((nr) == 7)) ? ((val) * 6) : ((val) * 4)))
0217 #define IN_TO_REG(nr, val) (((nr) <= 1) ? ((val) / 2) : \
0218 ((((nr) == 6) || ((nr) == 7)) ? ((val) / 6) : ((val) / 4)))
0219
0220 static inline u8
0221 FAN_TO_REG(long rpm, int div)
0222 {
0223 if (rpm == 0)
0224 return 255;
0225 rpm = clamp_val(rpm, 1, 1000000);
0226 return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
0227 }
0228
0229 #define FAN_FROM_REG(val, div) ((val) == 0 ? -1 : \
0230 ((val) == 255 ? 0 : \
0231 1350000 / ((val) * (div))))
0232
0233
0234 #define TEMP1_TO_REG(val) (clamp_val(((val) < 0 ? (val) + 0x100 * 1000 \
0235 : (val)) / 1000, 0, 0xff))
0236 #define TEMP1_FROM_REG(val) (((val) & 0x80 ? (val)-0x100 : (val)) * 1000)
0237
0238 #define TEMP_ADD_FROM_REG(val1, val2) \
0239 ((((val1) & 0x80 ? (val1)-0x100 \
0240 : (val1)) * 1000) + ((val2 & 0x80) ? 500 : 0))
0241 #define TEMP_ADD_TO_REG_HIGH(val) \
0242 (clamp_val(((val) < 0 ? (val) + 0x100 * 1000 : (val)) / 1000, 0, 0xff))
0243 #define TEMP_ADD_TO_REG_LOW(val) ((val%1000) ? 0x80 : 0x00)
0244
0245 #define DIV_FROM_REG(val) (1 << (val))
0246
0247 static inline u8
0248 DIV_TO_REG(long val)
0249 {
0250 int i;
0251 val = clamp_val(val, 1, 128) >> 1;
0252 for (i = 0; i < 7; i++) {
0253 if (val == 0)
0254 break;
0255 val >>= 1;
0256 }
0257 return (u8)i;
0258 }
0259
0260 struct w83792d_data {
0261 struct device *hwmon_dev;
0262
0263 struct mutex update_lock;
0264 bool valid;
0265 unsigned long last_updated;
0266
0267 u8 in[9];
0268 u8 in_max[9];
0269 u8 in_min[9];
0270 u16 low_bits;
0271 u8 fan[7];
0272 u8 fan_min[7];
0273 u8 temp1[3];
0274 u8 temp_add[2][6];
0275 u8 fan_div[7];
0276 u8 pwm[7];
0277 u8 pwmenable[3];
0278 u32 alarms;
0279 u8 chassis;
0280 u8 thermal_cruise[3];
0281 u8 tolerance[3];
0282 u8 sf2_points[3][4];
0283 u8 sf2_levels[3][4];
0284 };
0285
0286 static int w83792d_probe(struct i2c_client *client);
0287 static int w83792d_detect(struct i2c_client *client,
0288 struct i2c_board_info *info);
0289 static int w83792d_remove(struct i2c_client *client);
0290 static struct w83792d_data *w83792d_update_device(struct device *dev);
0291
0292 #ifdef DEBUG
0293 static void w83792d_print_debug(struct w83792d_data *data, struct device *dev);
0294 #endif
0295
0296 static void w83792d_init_client(struct i2c_client *client);
0297
0298 static const struct i2c_device_id w83792d_id[] = {
0299 { "w83792d", 0 },
0300 { }
0301 };
0302 MODULE_DEVICE_TABLE(i2c, w83792d_id);
0303
0304 static struct i2c_driver w83792d_driver = {
0305 .class = I2C_CLASS_HWMON,
0306 .driver = {
0307 .name = "w83792d",
0308 },
0309 .probe_new = w83792d_probe,
0310 .remove = w83792d_remove,
0311 .id_table = w83792d_id,
0312 .detect = w83792d_detect,
0313 .address_list = normal_i2c,
0314 };
0315
0316 static inline long in_count_from_reg(int nr, struct w83792d_data *data)
0317 {
0318
0319 return (data->in[nr] << 2) | ((data->low_bits >> (2 * nr)) & 0x03);
0320 }
0321
0322
0323
0324
0325
0326
0327 static inline int w83792d_read_value(struct i2c_client *client, u8 reg)
0328 {
0329 return i2c_smbus_read_byte_data(client, reg);
0330 }
0331
0332 static inline int
0333 w83792d_write_value(struct i2c_client *client, u8 reg, u8 value)
0334 {
0335 return i2c_smbus_write_byte_data(client, reg, value);
0336 }
0337
0338
0339 static ssize_t show_in(struct device *dev, struct device_attribute *attr,
0340 char *buf)
0341 {
0342 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0343 int nr = sensor_attr->index;
0344 struct w83792d_data *data = w83792d_update_device(dev);
0345 return sprintf(buf, "%ld\n",
0346 IN_FROM_REG(nr, in_count_from_reg(nr, data)));
0347 }
0348
0349 #define show_in_reg(reg) \
0350 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
0351 char *buf) \
0352 { \
0353 struct sensor_device_attribute *sensor_attr \
0354 = to_sensor_dev_attr(attr); \
0355 int nr = sensor_attr->index; \
0356 struct w83792d_data *data = w83792d_update_device(dev); \
0357 return sprintf(buf, "%ld\n", \
0358 (long)(IN_FROM_REG(nr, data->reg[nr]) * 4)); \
0359 }
0360
0361 show_in_reg(in_min);
0362 show_in_reg(in_max);
0363
0364 #define store_in_reg(REG, reg) \
0365 static ssize_t store_in_##reg(struct device *dev, \
0366 struct device_attribute *attr, \
0367 const char *buf, size_t count) \
0368 { \
0369 struct sensor_device_attribute *sensor_attr \
0370 = to_sensor_dev_attr(attr); \
0371 int nr = sensor_attr->index; \
0372 struct i2c_client *client = to_i2c_client(dev); \
0373 struct w83792d_data *data = i2c_get_clientdata(client); \
0374 unsigned long val; \
0375 int err = kstrtoul(buf, 10, &val); \
0376 if (err) \
0377 return err; \
0378 mutex_lock(&data->update_lock); \
0379 data->in_##reg[nr] = clamp_val(IN_TO_REG(nr, val) / 4, 0, 255); \
0380 w83792d_write_value(client, W83792D_REG_IN_##REG[nr], \
0381 data->in_##reg[nr]); \
0382 mutex_unlock(&data->update_lock); \
0383 \
0384 return count; \
0385 }
0386 store_in_reg(MIN, min);
0387 store_in_reg(MAX, max);
0388
0389 #define show_fan_reg(reg) \
0390 static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
0391 char *buf) \
0392 { \
0393 struct sensor_device_attribute *sensor_attr \
0394 = to_sensor_dev_attr(attr); \
0395 int nr = sensor_attr->index - 1; \
0396 struct w83792d_data *data = w83792d_update_device(dev); \
0397 return sprintf(buf, "%d\n", \
0398 FAN_FROM_REG(data->reg[nr], DIV_FROM_REG(data->fan_div[nr]))); \
0399 }
0400
0401 show_fan_reg(fan);
0402 show_fan_reg(fan_min);
0403
0404 static ssize_t
0405 store_fan_min(struct device *dev, struct device_attribute *attr,
0406 const char *buf, size_t count)
0407 {
0408 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0409 int nr = sensor_attr->index - 1;
0410 struct i2c_client *client = to_i2c_client(dev);
0411 struct w83792d_data *data = i2c_get_clientdata(client);
0412 unsigned long val;
0413 int err;
0414
0415 err = kstrtoul(buf, 10, &val);
0416 if (err)
0417 return err;
0418
0419 mutex_lock(&data->update_lock);
0420 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
0421 w83792d_write_value(client, W83792D_REG_FAN_MIN[nr],
0422 data->fan_min[nr]);
0423 mutex_unlock(&data->update_lock);
0424
0425 return count;
0426 }
0427
0428 static ssize_t
0429 show_fan_div(struct device *dev, struct device_attribute *attr,
0430 char *buf)
0431 {
0432 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0433 int nr = sensor_attr->index;
0434 struct w83792d_data *data = w83792d_update_device(dev);
0435 return sprintf(buf, "%u\n", DIV_FROM_REG(data->fan_div[nr - 1]));
0436 }
0437
0438
0439
0440
0441
0442
0443
0444 static ssize_t
0445 store_fan_div(struct device *dev, struct device_attribute *attr,
0446 const char *buf, size_t count)
0447 {
0448 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0449 int nr = sensor_attr->index - 1;
0450 struct i2c_client *client = to_i2c_client(dev);
0451 struct w83792d_data *data = i2c_get_clientdata(client);
0452 unsigned long min;
0453
0454 u8 fan_div_reg = 0;
0455 u8 tmp_fan_div;
0456 unsigned long val;
0457 int err;
0458
0459 err = kstrtoul(buf, 10, &val);
0460 if (err)
0461 return err;
0462
0463
0464 mutex_lock(&data->update_lock);
0465 min = FAN_FROM_REG(data->fan_min[nr],
0466 DIV_FROM_REG(data->fan_div[nr]));
0467
0468 data->fan_div[nr] = DIV_TO_REG(val);
0469
0470 fan_div_reg = w83792d_read_value(client, W83792D_REG_FAN_DIV[nr >> 1]);
0471 fan_div_reg &= (nr & 0x01) ? 0x8f : 0xf8;
0472 tmp_fan_div = (nr & 0x01) ? (((data->fan_div[nr]) << 4) & 0x70)
0473 : ((data->fan_div[nr]) & 0x07);
0474 w83792d_write_value(client, W83792D_REG_FAN_DIV[nr >> 1],
0475 fan_div_reg | tmp_fan_div);
0476
0477
0478 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
0479 w83792d_write_value(client, W83792D_REG_FAN_MIN[nr], data->fan_min[nr]);
0480 mutex_unlock(&data->update_lock);
0481
0482 return count;
0483 }
0484
0485
0486
0487 static ssize_t show_temp1(struct device *dev, struct device_attribute *attr,
0488 char *buf)
0489 {
0490 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0491 int nr = sensor_attr->index;
0492 struct w83792d_data *data = w83792d_update_device(dev);
0493 return sprintf(buf, "%d\n", TEMP1_FROM_REG(data->temp1[nr]));
0494 }
0495
0496 static ssize_t store_temp1(struct device *dev, struct device_attribute *attr,
0497 const char *buf, size_t count)
0498 {
0499 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0500 int nr = sensor_attr->index;
0501 struct i2c_client *client = to_i2c_client(dev);
0502 struct w83792d_data *data = i2c_get_clientdata(client);
0503 long val;
0504 int err;
0505
0506 err = kstrtol(buf, 10, &val);
0507 if (err)
0508 return err;
0509
0510 mutex_lock(&data->update_lock);
0511 data->temp1[nr] = TEMP1_TO_REG(val);
0512 w83792d_write_value(client, W83792D_REG_TEMP1[nr],
0513 data->temp1[nr]);
0514 mutex_unlock(&data->update_lock);
0515
0516 return count;
0517 }
0518
0519
0520
0521 static ssize_t show_temp23(struct device *dev, struct device_attribute *attr,
0522 char *buf)
0523 {
0524 struct sensor_device_attribute_2 *sensor_attr
0525 = to_sensor_dev_attr_2(attr);
0526 int nr = sensor_attr->nr;
0527 int index = sensor_attr->index;
0528 struct w83792d_data *data = w83792d_update_device(dev);
0529 return sprintf(buf, "%ld\n",
0530 (long)TEMP_ADD_FROM_REG(data->temp_add[nr][index],
0531 data->temp_add[nr][index+1]));
0532 }
0533
0534 static ssize_t store_temp23(struct device *dev, struct device_attribute *attr,
0535 const char *buf, size_t count)
0536 {
0537 struct sensor_device_attribute_2 *sensor_attr
0538 = to_sensor_dev_attr_2(attr);
0539 int nr = sensor_attr->nr;
0540 int index = sensor_attr->index;
0541 struct i2c_client *client = to_i2c_client(dev);
0542 struct w83792d_data *data = i2c_get_clientdata(client);
0543 long val;
0544 int err;
0545
0546 err = kstrtol(buf, 10, &val);
0547 if (err)
0548 return err;
0549
0550 mutex_lock(&data->update_lock);
0551 data->temp_add[nr][index] = TEMP_ADD_TO_REG_HIGH(val);
0552 data->temp_add[nr][index+1] = TEMP_ADD_TO_REG_LOW(val);
0553 w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index],
0554 data->temp_add[nr][index]);
0555 w83792d_write_value(client, W83792D_REG_TEMP_ADD[nr][index+1],
0556 data->temp_add[nr][index+1]);
0557 mutex_unlock(&data->update_lock);
0558
0559 return count;
0560 }
0561
0562
0563 static ssize_t
0564 alarms_show(struct device *dev, struct device_attribute *attr, char *buf)
0565 {
0566 struct w83792d_data *data = w83792d_update_device(dev);
0567 return sprintf(buf, "%d\n", data->alarms);
0568 }
0569
0570 static ssize_t show_alarm(struct device *dev,
0571 struct device_attribute *attr, char *buf)
0572 {
0573 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0574 int nr = sensor_attr->index;
0575 struct w83792d_data *data = w83792d_update_device(dev);
0576 return sprintf(buf, "%d\n", (data->alarms >> nr) & 1);
0577 }
0578
0579 static ssize_t
0580 show_pwm(struct device *dev, struct device_attribute *attr,
0581 char *buf)
0582 {
0583 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0584 int nr = sensor_attr->index;
0585 struct w83792d_data *data = w83792d_update_device(dev);
0586 return sprintf(buf, "%d\n", (data->pwm[nr] & 0x0f) << 4);
0587 }
0588
0589 static ssize_t
0590 show_pwmenable(struct device *dev, struct device_attribute *attr,
0591 char *buf)
0592 {
0593 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0594 int nr = sensor_attr->index - 1;
0595 struct w83792d_data *data = w83792d_update_device(dev);
0596 long pwm_enable_tmp = 1;
0597
0598 switch (data->pwmenable[nr]) {
0599 case 0:
0600 pwm_enable_tmp = 1;
0601 break;
0602 case 1:
0603 pwm_enable_tmp = 3;
0604 break;
0605 case 2:
0606 pwm_enable_tmp = 2;
0607 break;
0608 }
0609
0610 return sprintf(buf, "%ld\n", pwm_enable_tmp);
0611 }
0612
0613 static ssize_t
0614 store_pwm(struct device *dev, struct device_attribute *attr,
0615 const char *buf, size_t count)
0616 {
0617 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0618 int nr = sensor_attr->index;
0619 struct i2c_client *client = to_i2c_client(dev);
0620 struct w83792d_data *data = i2c_get_clientdata(client);
0621 unsigned long val;
0622 int err;
0623
0624 err = kstrtoul(buf, 10, &val);
0625 if (err)
0626 return err;
0627 val = clamp_val(val, 0, 255) >> 4;
0628
0629 mutex_lock(&data->update_lock);
0630 val |= w83792d_read_value(client, W83792D_REG_PWM[nr]) & 0xf0;
0631 data->pwm[nr] = val;
0632 w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
0633 mutex_unlock(&data->update_lock);
0634
0635 return count;
0636 }
0637
0638 static ssize_t
0639 store_pwmenable(struct device *dev, struct device_attribute *attr,
0640 const char *buf, size_t count)
0641 {
0642 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0643 int nr = sensor_attr->index - 1;
0644 struct i2c_client *client = to_i2c_client(dev);
0645 struct w83792d_data *data = i2c_get_clientdata(client);
0646 u8 fan_cfg_tmp, cfg1_tmp, cfg2_tmp, cfg3_tmp, cfg4_tmp;
0647 unsigned long val;
0648 int err;
0649
0650 err = kstrtoul(buf, 10, &val);
0651 if (err)
0652 return err;
0653
0654 if (val < 1 || val > 3)
0655 return -EINVAL;
0656
0657 mutex_lock(&data->update_lock);
0658 switch (val) {
0659 case 1:
0660 data->pwmenable[nr] = 0;
0661 break;
0662 case 2:
0663 data->pwmenable[nr] = 2;
0664 break;
0665 case 3:
0666 data->pwmenable[nr] = 1;
0667 break;
0668 }
0669 cfg1_tmp = data->pwmenable[0];
0670 cfg2_tmp = (data->pwmenable[1]) << 2;
0671 cfg3_tmp = (data->pwmenable[2]) << 4;
0672 cfg4_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG) & 0xc0;
0673 fan_cfg_tmp = ((cfg4_tmp | cfg3_tmp) | cfg2_tmp) | cfg1_tmp;
0674 w83792d_write_value(client, W83792D_REG_FAN_CFG, fan_cfg_tmp);
0675 mutex_unlock(&data->update_lock);
0676
0677 return count;
0678 }
0679
0680 static ssize_t
0681 show_pwm_mode(struct device *dev, struct device_attribute *attr,
0682 char *buf)
0683 {
0684 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0685 int nr = sensor_attr->index;
0686 struct w83792d_data *data = w83792d_update_device(dev);
0687 return sprintf(buf, "%d\n", data->pwm[nr] >> 7);
0688 }
0689
0690 static ssize_t
0691 store_pwm_mode(struct device *dev, struct device_attribute *attr,
0692 const char *buf, size_t count)
0693 {
0694 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0695 int nr = sensor_attr->index;
0696 struct i2c_client *client = to_i2c_client(dev);
0697 struct w83792d_data *data = i2c_get_clientdata(client);
0698 unsigned long val;
0699 int err;
0700
0701 err = kstrtoul(buf, 10, &val);
0702 if (err)
0703 return err;
0704 if (val > 1)
0705 return -EINVAL;
0706
0707 mutex_lock(&data->update_lock);
0708 data->pwm[nr] = w83792d_read_value(client, W83792D_REG_PWM[nr]);
0709 if (val) {
0710 data->pwm[nr] |= 0x80;
0711 } else {
0712 data->pwm[nr] &= 0x7f;
0713 }
0714 w83792d_write_value(client, W83792D_REG_PWM[nr], data->pwm[nr]);
0715 mutex_unlock(&data->update_lock);
0716
0717 return count;
0718 }
0719
0720 static ssize_t
0721 intrusion0_alarm_show(struct device *dev, struct device_attribute *attr,
0722 char *buf)
0723 {
0724 struct w83792d_data *data = w83792d_update_device(dev);
0725 return sprintf(buf, "%d\n", data->chassis);
0726 }
0727
0728 static ssize_t
0729 intrusion0_alarm_store(struct device *dev, struct device_attribute *attr,
0730 const char *buf, size_t count)
0731 {
0732 struct i2c_client *client = to_i2c_client(dev);
0733 struct w83792d_data *data = i2c_get_clientdata(client);
0734 unsigned long val;
0735 u8 reg;
0736
0737 if (kstrtoul(buf, 10, &val) || val != 0)
0738 return -EINVAL;
0739
0740 mutex_lock(&data->update_lock);
0741 reg = w83792d_read_value(client, W83792D_REG_CHASSIS_CLR);
0742 w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, reg | 0x80);
0743 data->valid = false;
0744 mutex_unlock(&data->update_lock);
0745
0746 return count;
0747 }
0748
0749
0750 static ssize_t
0751 show_thermal_cruise(struct device *dev, struct device_attribute *attr,
0752 char *buf)
0753 {
0754 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0755 int nr = sensor_attr->index;
0756 struct w83792d_data *data = w83792d_update_device(dev);
0757 return sprintf(buf, "%ld\n", (long)data->thermal_cruise[nr-1]);
0758 }
0759
0760 static ssize_t
0761 store_thermal_cruise(struct device *dev, struct device_attribute *attr,
0762 const char *buf, size_t count)
0763 {
0764 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0765 int nr = sensor_attr->index - 1;
0766 struct i2c_client *client = to_i2c_client(dev);
0767 struct w83792d_data *data = i2c_get_clientdata(client);
0768 u8 target_tmp = 0, target_mask = 0;
0769 unsigned long val;
0770 int err;
0771
0772 err = kstrtoul(buf, 10, &val);
0773 if (err)
0774 return err;
0775
0776 target_tmp = val;
0777 target_tmp = target_tmp & 0x7f;
0778 mutex_lock(&data->update_lock);
0779 target_mask = w83792d_read_value(client,
0780 W83792D_REG_THERMAL[nr]) & 0x80;
0781 data->thermal_cruise[nr] = clamp_val(target_tmp, 0, 255);
0782 w83792d_write_value(client, W83792D_REG_THERMAL[nr],
0783 (data->thermal_cruise[nr]) | target_mask);
0784 mutex_unlock(&data->update_lock);
0785
0786 return count;
0787 }
0788
0789
0790 static ssize_t
0791 show_tolerance(struct device *dev, struct device_attribute *attr,
0792 char *buf)
0793 {
0794 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0795 int nr = sensor_attr->index;
0796 struct w83792d_data *data = w83792d_update_device(dev);
0797 return sprintf(buf, "%ld\n", (long)data->tolerance[nr-1]);
0798 }
0799
0800 static ssize_t
0801 store_tolerance(struct device *dev, struct device_attribute *attr,
0802 const char *buf, size_t count)
0803 {
0804 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
0805 int nr = sensor_attr->index - 1;
0806 struct i2c_client *client = to_i2c_client(dev);
0807 struct w83792d_data *data = i2c_get_clientdata(client);
0808 u8 tol_tmp, tol_mask;
0809 unsigned long val;
0810 int err;
0811
0812 err = kstrtoul(buf, 10, &val);
0813 if (err)
0814 return err;
0815
0816 mutex_lock(&data->update_lock);
0817 tol_mask = w83792d_read_value(client,
0818 W83792D_REG_TOLERANCE[nr]) & ((nr == 1) ? 0x0f : 0xf0);
0819 tol_tmp = clamp_val(val, 0, 15);
0820 tol_tmp &= 0x0f;
0821 data->tolerance[nr] = tol_tmp;
0822 if (nr == 1)
0823 tol_tmp <<= 4;
0824 w83792d_write_value(client, W83792D_REG_TOLERANCE[nr],
0825 tol_mask | tol_tmp);
0826 mutex_unlock(&data->update_lock);
0827
0828 return count;
0829 }
0830
0831
0832 static ssize_t
0833 show_sf2_point(struct device *dev, struct device_attribute *attr,
0834 char *buf)
0835 {
0836 struct sensor_device_attribute_2 *sensor_attr
0837 = to_sensor_dev_attr_2(attr);
0838 int nr = sensor_attr->nr;
0839 int index = sensor_attr->index;
0840 struct w83792d_data *data = w83792d_update_device(dev);
0841 return sprintf(buf, "%ld\n", (long)data->sf2_points[index-1][nr-1]);
0842 }
0843
0844 static ssize_t
0845 store_sf2_point(struct device *dev, struct device_attribute *attr,
0846 const char *buf, size_t count)
0847 {
0848 struct sensor_device_attribute_2 *sensor_attr
0849 = to_sensor_dev_attr_2(attr);
0850 int nr = sensor_attr->nr - 1;
0851 int index = sensor_attr->index - 1;
0852 struct i2c_client *client = to_i2c_client(dev);
0853 struct w83792d_data *data = i2c_get_clientdata(client);
0854 u8 mask_tmp = 0;
0855 unsigned long val;
0856 int err;
0857
0858 err = kstrtoul(buf, 10, &val);
0859 if (err)
0860 return err;
0861
0862 mutex_lock(&data->update_lock);
0863 data->sf2_points[index][nr] = clamp_val(val, 0, 127);
0864 mask_tmp = w83792d_read_value(client,
0865 W83792D_REG_POINTS[index][nr]) & 0x80;
0866 w83792d_write_value(client, W83792D_REG_POINTS[index][nr],
0867 mask_tmp|data->sf2_points[index][nr]);
0868 mutex_unlock(&data->update_lock);
0869
0870 return count;
0871 }
0872
0873 static ssize_t
0874 show_sf2_level(struct device *dev, struct device_attribute *attr,
0875 char *buf)
0876 {
0877 struct sensor_device_attribute_2 *sensor_attr
0878 = to_sensor_dev_attr_2(attr);
0879 int nr = sensor_attr->nr;
0880 int index = sensor_attr->index;
0881 struct w83792d_data *data = w83792d_update_device(dev);
0882 return sprintf(buf, "%d\n",
0883 (((data->sf2_levels[index-1][nr]) * 100) / 15));
0884 }
0885
0886 static ssize_t
0887 store_sf2_level(struct device *dev, struct device_attribute *attr,
0888 const char *buf, size_t count)
0889 {
0890 struct sensor_device_attribute_2 *sensor_attr
0891 = to_sensor_dev_attr_2(attr);
0892 int nr = sensor_attr->nr;
0893 int index = sensor_attr->index - 1;
0894 struct i2c_client *client = to_i2c_client(dev);
0895 struct w83792d_data *data = i2c_get_clientdata(client);
0896 u8 mask_tmp = 0, level_tmp = 0;
0897 unsigned long val;
0898 int err;
0899
0900 err = kstrtoul(buf, 10, &val);
0901 if (err)
0902 return err;
0903
0904 mutex_lock(&data->update_lock);
0905 data->sf2_levels[index][nr] = clamp_val((val * 15) / 100, 0, 15);
0906 mask_tmp = w83792d_read_value(client, W83792D_REG_LEVELS[index][nr])
0907 & ((nr == 3) ? 0xf0 : 0x0f);
0908 if (nr == 3)
0909 level_tmp = data->sf2_levels[index][nr];
0910 else
0911 level_tmp = data->sf2_levels[index][nr] << 4;
0912 w83792d_write_value(client, W83792D_REG_LEVELS[index][nr],
0913 level_tmp | mask_tmp);
0914 mutex_unlock(&data->update_lock);
0915
0916 return count;
0917 }
0918
0919
0920 static int
0921 w83792d_detect_subclients(struct i2c_client *new_client)
0922 {
0923 int i, id;
0924 int address = new_client->addr;
0925 u8 val;
0926 struct i2c_adapter *adapter = new_client->adapter;
0927
0928 id = i2c_adapter_id(adapter);
0929 if (force_subclients[0] == id && force_subclients[1] == address) {
0930 for (i = 2; i <= 3; i++) {
0931 if (force_subclients[i] < 0x48 ||
0932 force_subclients[i] > 0x4f) {
0933 dev_err(&new_client->dev,
0934 "invalid subclient address %d; must be 0x48-0x4f\n",
0935 force_subclients[i]);
0936 return -ENODEV;
0937 }
0938 }
0939 w83792d_write_value(new_client, W83792D_REG_I2C_SUBADDR,
0940 (force_subclients[2] & 0x07) |
0941 ((force_subclients[3] & 0x07) << 4));
0942 }
0943
0944 val = w83792d_read_value(new_client, W83792D_REG_I2C_SUBADDR);
0945
0946 if (!(val & 0x88) && (val & 0x7) == ((val >> 4) & 0x7)) {
0947 dev_err(&new_client->dev,
0948 "duplicate addresses 0x%x, use force_subclient\n", 0x48 + (val & 0x7));
0949 return -ENODEV;
0950 }
0951
0952 if (!(val & 0x08))
0953 devm_i2c_new_dummy_device(&new_client->dev, adapter, 0x48 + (val & 0x7));
0954
0955 if (!(val & 0x80))
0956 devm_i2c_new_dummy_device(&new_client->dev, adapter, 0x48 + ((val >> 4) & 0x7));
0957
0958 return 0;
0959 }
0960
0961 static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_in, NULL, 0);
0962 static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_in, NULL, 1);
0963 static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_in, NULL, 2);
0964 static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, show_in, NULL, 3);
0965 static SENSOR_DEVICE_ATTR(in4_input, S_IRUGO, show_in, NULL, 4);
0966 static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_in, NULL, 5);
0967 static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_in, NULL, 6);
0968 static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_in, NULL, 7);
0969 static SENSOR_DEVICE_ATTR(in8_input, S_IRUGO, show_in, NULL, 8);
0970 static SENSOR_DEVICE_ATTR(in0_min, S_IWUSR | S_IRUGO,
0971 show_in_min, store_in_min, 0);
0972 static SENSOR_DEVICE_ATTR(in1_min, S_IWUSR | S_IRUGO,
0973 show_in_min, store_in_min, 1);
0974 static SENSOR_DEVICE_ATTR(in2_min, S_IWUSR | S_IRUGO,
0975 show_in_min, store_in_min, 2);
0976 static SENSOR_DEVICE_ATTR(in3_min, S_IWUSR | S_IRUGO,
0977 show_in_min, store_in_min, 3);
0978 static SENSOR_DEVICE_ATTR(in4_min, S_IWUSR | S_IRUGO,
0979 show_in_min, store_in_min, 4);
0980 static SENSOR_DEVICE_ATTR(in5_min, S_IWUSR | S_IRUGO,
0981 show_in_min, store_in_min, 5);
0982 static SENSOR_DEVICE_ATTR(in6_min, S_IWUSR | S_IRUGO,
0983 show_in_min, store_in_min, 6);
0984 static SENSOR_DEVICE_ATTR(in7_min, S_IWUSR | S_IRUGO,
0985 show_in_min, store_in_min, 7);
0986 static SENSOR_DEVICE_ATTR(in8_min, S_IWUSR | S_IRUGO,
0987 show_in_min, store_in_min, 8);
0988 static SENSOR_DEVICE_ATTR(in0_max, S_IWUSR | S_IRUGO,
0989 show_in_max, store_in_max, 0);
0990 static SENSOR_DEVICE_ATTR(in1_max, S_IWUSR | S_IRUGO,
0991 show_in_max, store_in_max, 1);
0992 static SENSOR_DEVICE_ATTR(in2_max, S_IWUSR | S_IRUGO,
0993 show_in_max, store_in_max, 2);
0994 static SENSOR_DEVICE_ATTR(in3_max, S_IWUSR | S_IRUGO,
0995 show_in_max, store_in_max, 3);
0996 static SENSOR_DEVICE_ATTR(in4_max, S_IWUSR | S_IRUGO,
0997 show_in_max, store_in_max, 4);
0998 static SENSOR_DEVICE_ATTR(in5_max, S_IWUSR | S_IRUGO,
0999 show_in_max, store_in_max, 5);
1000 static SENSOR_DEVICE_ATTR(in6_max, S_IWUSR | S_IRUGO,
1001 show_in_max, store_in_max, 6);
1002 static SENSOR_DEVICE_ATTR(in7_max, S_IWUSR | S_IRUGO,
1003 show_in_max, store_in_max, 7);
1004 static SENSOR_DEVICE_ATTR(in8_max, S_IWUSR | S_IRUGO,
1005 show_in_max, store_in_max, 8);
1006 static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp1, NULL, 0, 0);
1007 static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp23, NULL, 0, 0);
1008 static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp23, NULL, 1, 0);
1009 static SENSOR_DEVICE_ATTR_2(temp1_max, S_IRUGO | S_IWUSR,
1010 show_temp1, store_temp1, 0, 1);
1011 static SENSOR_DEVICE_ATTR_2(temp2_max, S_IRUGO | S_IWUSR, show_temp23,
1012 store_temp23, 0, 2);
1013 static SENSOR_DEVICE_ATTR_2(temp3_max, S_IRUGO | S_IWUSR, show_temp23,
1014 store_temp23, 1, 2);
1015 static SENSOR_DEVICE_ATTR_2(temp1_max_hyst, S_IRUGO | S_IWUSR,
1016 show_temp1, store_temp1, 0, 2);
1017 static SENSOR_DEVICE_ATTR_2(temp2_max_hyst, S_IRUGO | S_IWUSR,
1018 show_temp23, store_temp23, 0, 4);
1019 static SENSOR_DEVICE_ATTR_2(temp3_max_hyst, S_IRUGO | S_IWUSR,
1020 show_temp23, store_temp23, 1, 4);
1021 static DEVICE_ATTR_RO(alarms);
1022 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
1023 static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
1024 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 2);
1025 static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 3);
1026 static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 4);
1027 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 5);
1028 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 6);
1029 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 7);
1030 static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 8);
1031 static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 9);
1032 static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 10);
1033 static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 11);
1034 static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 12);
1035 static SENSOR_DEVICE_ATTR(fan7_alarm, S_IRUGO, show_alarm, NULL, 15);
1036 static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 19);
1037 static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 20);
1038 static SENSOR_DEVICE_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 21);
1039 static SENSOR_DEVICE_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 22);
1040 static SENSOR_DEVICE_ATTR(fan6_alarm, S_IRUGO, show_alarm, NULL, 23);
1041 static DEVICE_ATTR_RW(intrusion0_alarm);
1042 static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0);
1043 static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1);
1044 static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2);
1045 static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3);
1046 static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 4);
1047 static SENSOR_DEVICE_ATTR(pwm6, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 5);
1048 static SENSOR_DEVICE_ATTR(pwm7, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 6);
1049 static SENSOR_DEVICE_ATTR(pwm1_enable, S_IWUSR | S_IRUGO,
1050 show_pwmenable, store_pwmenable, 1);
1051 static SENSOR_DEVICE_ATTR(pwm2_enable, S_IWUSR | S_IRUGO,
1052 show_pwmenable, store_pwmenable, 2);
1053 static SENSOR_DEVICE_ATTR(pwm3_enable, S_IWUSR | S_IRUGO,
1054 show_pwmenable, store_pwmenable, 3);
1055 static SENSOR_DEVICE_ATTR(pwm1_mode, S_IWUSR | S_IRUGO,
1056 show_pwm_mode, store_pwm_mode, 0);
1057 static SENSOR_DEVICE_ATTR(pwm2_mode, S_IWUSR | S_IRUGO,
1058 show_pwm_mode, store_pwm_mode, 1);
1059 static SENSOR_DEVICE_ATTR(pwm3_mode, S_IWUSR | S_IRUGO,
1060 show_pwm_mode, store_pwm_mode, 2);
1061 static SENSOR_DEVICE_ATTR(pwm4_mode, S_IWUSR | S_IRUGO,
1062 show_pwm_mode, store_pwm_mode, 3);
1063 static SENSOR_DEVICE_ATTR(pwm5_mode, S_IWUSR | S_IRUGO,
1064 show_pwm_mode, store_pwm_mode, 4);
1065 static SENSOR_DEVICE_ATTR(pwm6_mode, S_IWUSR | S_IRUGO,
1066 show_pwm_mode, store_pwm_mode, 5);
1067 static SENSOR_DEVICE_ATTR(pwm7_mode, S_IWUSR | S_IRUGO,
1068 show_pwm_mode, store_pwm_mode, 6);
1069 static SENSOR_DEVICE_ATTR(tolerance1, S_IWUSR | S_IRUGO,
1070 show_tolerance, store_tolerance, 1);
1071 static SENSOR_DEVICE_ATTR(tolerance2, S_IWUSR | S_IRUGO,
1072 show_tolerance, store_tolerance, 2);
1073 static SENSOR_DEVICE_ATTR(tolerance3, S_IWUSR | S_IRUGO,
1074 show_tolerance, store_tolerance, 3);
1075 static SENSOR_DEVICE_ATTR(thermal_cruise1, S_IWUSR | S_IRUGO,
1076 show_thermal_cruise, store_thermal_cruise, 1);
1077 static SENSOR_DEVICE_ATTR(thermal_cruise2, S_IWUSR | S_IRUGO,
1078 show_thermal_cruise, store_thermal_cruise, 2);
1079 static SENSOR_DEVICE_ATTR(thermal_cruise3, S_IWUSR | S_IRUGO,
1080 show_thermal_cruise, store_thermal_cruise, 3);
1081 static SENSOR_DEVICE_ATTR_2(sf2_point1_fan1, S_IRUGO | S_IWUSR,
1082 show_sf2_point, store_sf2_point, 1, 1);
1083 static SENSOR_DEVICE_ATTR_2(sf2_point2_fan1, S_IRUGO | S_IWUSR,
1084 show_sf2_point, store_sf2_point, 2, 1);
1085 static SENSOR_DEVICE_ATTR_2(sf2_point3_fan1, S_IRUGO | S_IWUSR,
1086 show_sf2_point, store_sf2_point, 3, 1);
1087 static SENSOR_DEVICE_ATTR_2(sf2_point4_fan1, S_IRUGO | S_IWUSR,
1088 show_sf2_point, store_sf2_point, 4, 1);
1089 static SENSOR_DEVICE_ATTR_2(sf2_point1_fan2, S_IRUGO | S_IWUSR,
1090 show_sf2_point, store_sf2_point, 1, 2);
1091 static SENSOR_DEVICE_ATTR_2(sf2_point2_fan2, S_IRUGO | S_IWUSR,
1092 show_sf2_point, store_sf2_point, 2, 2);
1093 static SENSOR_DEVICE_ATTR_2(sf2_point3_fan2, S_IRUGO | S_IWUSR,
1094 show_sf2_point, store_sf2_point, 3, 2);
1095 static SENSOR_DEVICE_ATTR_2(sf2_point4_fan2, S_IRUGO | S_IWUSR,
1096 show_sf2_point, store_sf2_point, 4, 2);
1097 static SENSOR_DEVICE_ATTR_2(sf2_point1_fan3, S_IRUGO | S_IWUSR,
1098 show_sf2_point, store_sf2_point, 1, 3);
1099 static SENSOR_DEVICE_ATTR_2(sf2_point2_fan3, S_IRUGO | S_IWUSR,
1100 show_sf2_point, store_sf2_point, 2, 3);
1101 static SENSOR_DEVICE_ATTR_2(sf2_point3_fan3, S_IRUGO | S_IWUSR,
1102 show_sf2_point, store_sf2_point, 3, 3);
1103 static SENSOR_DEVICE_ATTR_2(sf2_point4_fan3, S_IRUGO | S_IWUSR,
1104 show_sf2_point, store_sf2_point, 4, 3);
1105 static SENSOR_DEVICE_ATTR_2(sf2_level1_fan1, S_IRUGO | S_IWUSR,
1106 show_sf2_level, store_sf2_level, 1, 1);
1107 static SENSOR_DEVICE_ATTR_2(sf2_level2_fan1, S_IRUGO | S_IWUSR,
1108 show_sf2_level, store_sf2_level, 2, 1);
1109 static SENSOR_DEVICE_ATTR_2(sf2_level3_fan1, S_IRUGO | S_IWUSR,
1110 show_sf2_level, store_sf2_level, 3, 1);
1111 static SENSOR_DEVICE_ATTR_2(sf2_level1_fan2, S_IRUGO | S_IWUSR,
1112 show_sf2_level, store_sf2_level, 1, 2);
1113 static SENSOR_DEVICE_ATTR_2(sf2_level2_fan2, S_IRUGO | S_IWUSR,
1114 show_sf2_level, store_sf2_level, 2, 2);
1115 static SENSOR_DEVICE_ATTR_2(sf2_level3_fan2, S_IRUGO | S_IWUSR,
1116 show_sf2_level, store_sf2_level, 3, 2);
1117 static SENSOR_DEVICE_ATTR_2(sf2_level1_fan3, S_IRUGO | S_IWUSR,
1118 show_sf2_level, store_sf2_level, 1, 3);
1119 static SENSOR_DEVICE_ATTR_2(sf2_level2_fan3, S_IRUGO | S_IWUSR,
1120 show_sf2_level, store_sf2_level, 2, 3);
1121 static SENSOR_DEVICE_ATTR_2(sf2_level3_fan3, S_IRUGO | S_IWUSR,
1122 show_sf2_level, store_sf2_level, 3, 3);
1123 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 1);
1124 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 2);
1125 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 3);
1126 static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 4);
1127 static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 5);
1128 static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_fan, NULL, 6);
1129 static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_fan, NULL, 7);
1130 static SENSOR_DEVICE_ATTR(fan1_min, S_IWUSR | S_IRUGO,
1131 show_fan_min, store_fan_min, 1);
1132 static SENSOR_DEVICE_ATTR(fan2_min, S_IWUSR | S_IRUGO,
1133 show_fan_min, store_fan_min, 2);
1134 static SENSOR_DEVICE_ATTR(fan3_min, S_IWUSR | S_IRUGO,
1135 show_fan_min, store_fan_min, 3);
1136 static SENSOR_DEVICE_ATTR(fan4_min, S_IWUSR | S_IRUGO,
1137 show_fan_min, store_fan_min, 4);
1138 static SENSOR_DEVICE_ATTR(fan5_min, S_IWUSR | S_IRUGO,
1139 show_fan_min, store_fan_min, 5);
1140 static SENSOR_DEVICE_ATTR(fan6_min, S_IWUSR | S_IRUGO,
1141 show_fan_min, store_fan_min, 6);
1142 static SENSOR_DEVICE_ATTR(fan7_min, S_IWUSR | S_IRUGO,
1143 show_fan_min, store_fan_min, 7);
1144 static SENSOR_DEVICE_ATTR(fan1_div, S_IWUSR | S_IRUGO,
1145 show_fan_div, store_fan_div, 1);
1146 static SENSOR_DEVICE_ATTR(fan2_div, S_IWUSR | S_IRUGO,
1147 show_fan_div, store_fan_div, 2);
1148 static SENSOR_DEVICE_ATTR(fan3_div, S_IWUSR | S_IRUGO,
1149 show_fan_div, store_fan_div, 3);
1150 static SENSOR_DEVICE_ATTR(fan4_div, S_IWUSR | S_IRUGO,
1151 show_fan_div, store_fan_div, 4);
1152 static SENSOR_DEVICE_ATTR(fan5_div, S_IWUSR | S_IRUGO,
1153 show_fan_div, store_fan_div, 5);
1154 static SENSOR_DEVICE_ATTR(fan6_div, S_IWUSR | S_IRUGO,
1155 show_fan_div, store_fan_div, 6);
1156 static SENSOR_DEVICE_ATTR(fan7_div, S_IWUSR | S_IRUGO,
1157 show_fan_div, store_fan_div, 7);
1158
1159 static struct attribute *w83792d_attributes_fan[4][7] = {
1160 {
1161 &sensor_dev_attr_fan4_input.dev_attr.attr,
1162 &sensor_dev_attr_fan4_min.dev_attr.attr,
1163 &sensor_dev_attr_fan4_div.dev_attr.attr,
1164 &sensor_dev_attr_fan4_alarm.dev_attr.attr,
1165 &sensor_dev_attr_pwm4.dev_attr.attr,
1166 &sensor_dev_attr_pwm4_mode.dev_attr.attr,
1167 NULL
1168 }, {
1169 &sensor_dev_attr_fan5_input.dev_attr.attr,
1170 &sensor_dev_attr_fan5_min.dev_attr.attr,
1171 &sensor_dev_attr_fan5_div.dev_attr.attr,
1172 &sensor_dev_attr_fan5_alarm.dev_attr.attr,
1173 &sensor_dev_attr_pwm5.dev_attr.attr,
1174 &sensor_dev_attr_pwm5_mode.dev_attr.attr,
1175 NULL
1176 }, {
1177 &sensor_dev_attr_fan6_input.dev_attr.attr,
1178 &sensor_dev_attr_fan6_min.dev_attr.attr,
1179 &sensor_dev_attr_fan6_div.dev_attr.attr,
1180 &sensor_dev_attr_fan6_alarm.dev_attr.attr,
1181 &sensor_dev_attr_pwm6.dev_attr.attr,
1182 &sensor_dev_attr_pwm6_mode.dev_attr.attr,
1183 NULL
1184 }, {
1185 &sensor_dev_attr_fan7_input.dev_attr.attr,
1186 &sensor_dev_attr_fan7_min.dev_attr.attr,
1187 &sensor_dev_attr_fan7_div.dev_attr.attr,
1188 &sensor_dev_attr_fan7_alarm.dev_attr.attr,
1189 &sensor_dev_attr_pwm7.dev_attr.attr,
1190 &sensor_dev_attr_pwm7_mode.dev_attr.attr,
1191 NULL
1192 }
1193 };
1194
1195 static const struct attribute_group w83792d_group_fan[4] = {
1196 { .attrs = w83792d_attributes_fan[0] },
1197 { .attrs = w83792d_attributes_fan[1] },
1198 { .attrs = w83792d_attributes_fan[2] },
1199 { .attrs = w83792d_attributes_fan[3] },
1200 };
1201
1202 static struct attribute *w83792d_attributes[] = {
1203 &sensor_dev_attr_in0_input.dev_attr.attr,
1204 &sensor_dev_attr_in0_max.dev_attr.attr,
1205 &sensor_dev_attr_in0_min.dev_attr.attr,
1206 &sensor_dev_attr_in1_input.dev_attr.attr,
1207 &sensor_dev_attr_in1_max.dev_attr.attr,
1208 &sensor_dev_attr_in1_min.dev_attr.attr,
1209 &sensor_dev_attr_in2_input.dev_attr.attr,
1210 &sensor_dev_attr_in2_max.dev_attr.attr,
1211 &sensor_dev_attr_in2_min.dev_attr.attr,
1212 &sensor_dev_attr_in3_input.dev_attr.attr,
1213 &sensor_dev_attr_in3_max.dev_attr.attr,
1214 &sensor_dev_attr_in3_min.dev_attr.attr,
1215 &sensor_dev_attr_in4_input.dev_attr.attr,
1216 &sensor_dev_attr_in4_max.dev_attr.attr,
1217 &sensor_dev_attr_in4_min.dev_attr.attr,
1218 &sensor_dev_attr_in5_input.dev_attr.attr,
1219 &sensor_dev_attr_in5_max.dev_attr.attr,
1220 &sensor_dev_attr_in5_min.dev_attr.attr,
1221 &sensor_dev_attr_in6_input.dev_attr.attr,
1222 &sensor_dev_attr_in6_max.dev_attr.attr,
1223 &sensor_dev_attr_in6_min.dev_attr.attr,
1224 &sensor_dev_attr_in7_input.dev_attr.attr,
1225 &sensor_dev_attr_in7_max.dev_attr.attr,
1226 &sensor_dev_attr_in7_min.dev_attr.attr,
1227 &sensor_dev_attr_in8_input.dev_attr.attr,
1228 &sensor_dev_attr_in8_max.dev_attr.attr,
1229 &sensor_dev_attr_in8_min.dev_attr.attr,
1230 &sensor_dev_attr_in0_alarm.dev_attr.attr,
1231 &sensor_dev_attr_in1_alarm.dev_attr.attr,
1232 &sensor_dev_attr_in2_alarm.dev_attr.attr,
1233 &sensor_dev_attr_in3_alarm.dev_attr.attr,
1234 &sensor_dev_attr_in4_alarm.dev_attr.attr,
1235 &sensor_dev_attr_in5_alarm.dev_attr.attr,
1236 &sensor_dev_attr_in6_alarm.dev_attr.attr,
1237 &sensor_dev_attr_in7_alarm.dev_attr.attr,
1238 &sensor_dev_attr_in8_alarm.dev_attr.attr,
1239 &sensor_dev_attr_temp1_input.dev_attr.attr,
1240 &sensor_dev_attr_temp1_max.dev_attr.attr,
1241 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
1242 &sensor_dev_attr_temp2_input.dev_attr.attr,
1243 &sensor_dev_attr_temp2_max.dev_attr.attr,
1244 &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
1245 &sensor_dev_attr_temp3_input.dev_attr.attr,
1246 &sensor_dev_attr_temp3_max.dev_attr.attr,
1247 &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
1248 &sensor_dev_attr_temp1_alarm.dev_attr.attr,
1249 &sensor_dev_attr_temp2_alarm.dev_attr.attr,
1250 &sensor_dev_attr_temp3_alarm.dev_attr.attr,
1251 &sensor_dev_attr_pwm1.dev_attr.attr,
1252 &sensor_dev_attr_pwm1_mode.dev_attr.attr,
1253 &sensor_dev_attr_pwm1_enable.dev_attr.attr,
1254 &sensor_dev_attr_pwm2.dev_attr.attr,
1255 &sensor_dev_attr_pwm2_mode.dev_attr.attr,
1256 &sensor_dev_attr_pwm2_enable.dev_attr.attr,
1257 &sensor_dev_attr_pwm3.dev_attr.attr,
1258 &sensor_dev_attr_pwm3_mode.dev_attr.attr,
1259 &sensor_dev_attr_pwm3_enable.dev_attr.attr,
1260 &dev_attr_alarms.attr,
1261 &dev_attr_intrusion0_alarm.attr,
1262 &sensor_dev_attr_tolerance1.dev_attr.attr,
1263 &sensor_dev_attr_thermal_cruise1.dev_attr.attr,
1264 &sensor_dev_attr_tolerance2.dev_attr.attr,
1265 &sensor_dev_attr_thermal_cruise2.dev_attr.attr,
1266 &sensor_dev_attr_tolerance3.dev_attr.attr,
1267 &sensor_dev_attr_thermal_cruise3.dev_attr.attr,
1268 &sensor_dev_attr_sf2_point1_fan1.dev_attr.attr,
1269 &sensor_dev_attr_sf2_point2_fan1.dev_attr.attr,
1270 &sensor_dev_attr_sf2_point3_fan1.dev_attr.attr,
1271 &sensor_dev_attr_sf2_point4_fan1.dev_attr.attr,
1272 &sensor_dev_attr_sf2_point1_fan2.dev_attr.attr,
1273 &sensor_dev_attr_sf2_point2_fan2.dev_attr.attr,
1274 &sensor_dev_attr_sf2_point3_fan2.dev_attr.attr,
1275 &sensor_dev_attr_sf2_point4_fan2.dev_attr.attr,
1276 &sensor_dev_attr_sf2_point1_fan3.dev_attr.attr,
1277 &sensor_dev_attr_sf2_point2_fan3.dev_attr.attr,
1278 &sensor_dev_attr_sf2_point3_fan3.dev_attr.attr,
1279 &sensor_dev_attr_sf2_point4_fan3.dev_attr.attr,
1280 &sensor_dev_attr_sf2_level1_fan1.dev_attr.attr,
1281 &sensor_dev_attr_sf2_level2_fan1.dev_attr.attr,
1282 &sensor_dev_attr_sf2_level3_fan1.dev_attr.attr,
1283 &sensor_dev_attr_sf2_level1_fan2.dev_attr.attr,
1284 &sensor_dev_attr_sf2_level2_fan2.dev_attr.attr,
1285 &sensor_dev_attr_sf2_level3_fan2.dev_attr.attr,
1286 &sensor_dev_attr_sf2_level1_fan3.dev_attr.attr,
1287 &sensor_dev_attr_sf2_level2_fan3.dev_attr.attr,
1288 &sensor_dev_attr_sf2_level3_fan3.dev_attr.attr,
1289 &sensor_dev_attr_fan1_input.dev_attr.attr,
1290 &sensor_dev_attr_fan1_min.dev_attr.attr,
1291 &sensor_dev_attr_fan1_div.dev_attr.attr,
1292 &sensor_dev_attr_fan1_alarm.dev_attr.attr,
1293 &sensor_dev_attr_fan2_input.dev_attr.attr,
1294 &sensor_dev_attr_fan2_min.dev_attr.attr,
1295 &sensor_dev_attr_fan2_div.dev_attr.attr,
1296 &sensor_dev_attr_fan2_alarm.dev_attr.attr,
1297 &sensor_dev_attr_fan3_input.dev_attr.attr,
1298 &sensor_dev_attr_fan3_min.dev_attr.attr,
1299 &sensor_dev_attr_fan3_div.dev_attr.attr,
1300 &sensor_dev_attr_fan3_alarm.dev_attr.attr,
1301 NULL
1302 };
1303
1304 static const struct attribute_group w83792d_group = {
1305 .attrs = w83792d_attributes,
1306 };
1307
1308
1309 static int
1310 w83792d_detect(struct i2c_client *client, struct i2c_board_info *info)
1311 {
1312 struct i2c_adapter *adapter = client->adapter;
1313 int val1, val2;
1314 unsigned short address = client->addr;
1315
1316 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1317 return -ENODEV;
1318
1319 if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80)
1320 return -ENODEV;
1321
1322 val1 = w83792d_read_value(client, W83792D_REG_BANK);
1323 val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1324
1325 if (!(val1 & 0x07)) {
1326 if ((!(val1 & 0x80) && val2 != 0xa3) ||
1327 ((val1 & 0x80) && val2 != 0x5c))
1328 return -ENODEV;
1329 }
1330
1331
1332
1333
1334 if (w83792d_read_value(client, W83792D_REG_I2C_ADDR) != address)
1335 return -ENODEV;
1336
1337
1338 w83792d_write_value(client,
1339 W83792D_REG_BANK,
1340 (w83792d_read_value(client,
1341 W83792D_REG_BANK) & 0x78) | 0x80);
1342
1343
1344 val1 = w83792d_read_value(client, W83792D_REG_WCHIPID);
1345 val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1346 if (val1 != 0x7a || val2 != 0x5c)
1347 return -ENODEV;
1348
1349 strlcpy(info->type, "w83792d", I2C_NAME_SIZE);
1350
1351 return 0;
1352 }
1353
1354 static int
1355 w83792d_probe(struct i2c_client *client)
1356 {
1357 struct w83792d_data *data;
1358 struct device *dev = &client->dev;
1359 int i, val1, err;
1360
1361 data = devm_kzalloc(dev, sizeof(struct w83792d_data), GFP_KERNEL);
1362 if (!data)
1363 return -ENOMEM;
1364
1365 i2c_set_clientdata(client, data);
1366 mutex_init(&data->update_lock);
1367
1368 err = w83792d_detect_subclients(client);
1369 if (err)
1370 return err;
1371
1372
1373 w83792d_init_client(client);
1374
1375
1376 for (i = 0; i < 7; i++) {
1377 data->fan_min[i] = w83792d_read_value(client,
1378 W83792D_REG_FAN_MIN[i]);
1379 }
1380
1381
1382 err = sysfs_create_group(&dev->kobj, &w83792d_group);
1383 if (err)
1384 return err;
1385
1386
1387
1388
1389
1390 val1 = w83792d_read_value(client, W83792D_REG_GPIO_EN);
1391
1392 if (!(val1 & 0x40)) {
1393 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[0]);
1394 if (err)
1395 goto exit_remove_files;
1396 }
1397
1398 if (!(val1 & 0x20)) {
1399 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[1]);
1400 if (err)
1401 goto exit_remove_files;
1402 }
1403
1404 val1 = w83792d_read_value(client, W83792D_REG_PIN);
1405 if (val1 & 0x40) {
1406 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[2]);
1407 if (err)
1408 goto exit_remove_files;
1409 }
1410
1411 if (val1 & 0x04) {
1412 err = sysfs_create_group(&dev->kobj, &w83792d_group_fan[3]);
1413 if (err)
1414 goto exit_remove_files;
1415 }
1416
1417 data->hwmon_dev = hwmon_device_register(dev);
1418 if (IS_ERR(data->hwmon_dev)) {
1419 err = PTR_ERR(data->hwmon_dev);
1420 goto exit_remove_files;
1421 }
1422
1423 return 0;
1424
1425 exit_remove_files:
1426 sysfs_remove_group(&dev->kobj, &w83792d_group);
1427 for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++)
1428 sysfs_remove_group(&dev->kobj, &w83792d_group_fan[i]);
1429 return err;
1430 }
1431
1432 static int
1433 w83792d_remove(struct i2c_client *client)
1434 {
1435 struct w83792d_data *data = i2c_get_clientdata(client);
1436 int i;
1437
1438 hwmon_device_unregister(data->hwmon_dev);
1439 sysfs_remove_group(&client->dev.kobj, &w83792d_group);
1440 for (i = 0; i < ARRAY_SIZE(w83792d_group_fan); i++)
1441 sysfs_remove_group(&client->dev.kobj,
1442 &w83792d_group_fan[i]);
1443
1444 return 0;
1445 }
1446
1447 static void
1448 w83792d_init_client(struct i2c_client *client)
1449 {
1450 u8 temp2_cfg, temp3_cfg, vid_in_b;
1451
1452 if (init)
1453 w83792d_write_value(client, W83792D_REG_CONFIG, 0x80);
1454
1455
1456
1457
1458
1459
1460
1461
1462 vid_in_b = w83792d_read_value(client, W83792D_REG_VID_IN_B);
1463 w83792d_write_value(client, W83792D_REG_VID_IN_B,
1464 vid_in_b & 0xbf);
1465
1466 temp2_cfg = w83792d_read_value(client, W83792D_REG_TEMP2_CONFIG);
1467 temp3_cfg = w83792d_read_value(client, W83792D_REG_TEMP3_CONFIG);
1468 w83792d_write_value(client, W83792D_REG_TEMP2_CONFIG,
1469 temp2_cfg & 0xe6);
1470 w83792d_write_value(client, W83792D_REG_TEMP3_CONFIG,
1471 temp3_cfg & 0xe6);
1472
1473
1474 w83792d_write_value(client, W83792D_REG_CONFIG,
1475 (w83792d_read_value(client,
1476 W83792D_REG_CONFIG) & 0xf7)
1477 | 0x01);
1478 }
1479
1480 static struct w83792d_data *w83792d_update_device(struct device *dev)
1481 {
1482 struct i2c_client *client = to_i2c_client(dev);
1483 struct w83792d_data *data = i2c_get_clientdata(client);
1484 int i, j;
1485 u8 reg_array_tmp[4], reg_tmp;
1486
1487 mutex_lock(&data->update_lock);
1488
1489 if (time_after
1490 (jiffies - data->last_updated, (unsigned long) (HZ * 3))
1491 || time_before(jiffies, data->last_updated) || !data->valid) {
1492 dev_dbg(dev, "Starting device update\n");
1493
1494
1495 for (i = 0; i < 9; i++) {
1496 data->in[i] = w83792d_read_value(client,
1497 W83792D_REG_IN[i]);
1498 data->in_max[i] = w83792d_read_value(client,
1499 W83792D_REG_IN_MAX[i]);
1500 data->in_min[i] = w83792d_read_value(client,
1501 W83792D_REG_IN_MIN[i]);
1502 }
1503 data->low_bits = w83792d_read_value(client,
1504 W83792D_REG_LOW_BITS1) +
1505 (w83792d_read_value(client,
1506 W83792D_REG_LOW_BITS2) << 8);
1507 for (i = 0; i < 7; i++) {
1508
1509 data->fan[i] = w83792d_read_value(client,
1510 W83792D_REG_FAN[i]);
1511 data->fan_min[i] = w83792d_read_value(client,
1512 W83792D_REG_FAN_MIN[i]);
1513
1514 data->pwm[i] = w83792d_read_value(client,
1515 W83792D_REG_PWM[i]);
1516 }
1517
1518 reg_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG);
1519 data->pwmenable[0] = reg_tmp & 0x03;
1520 data->pwmenable[1] = (reg_tmp>>2) & 0x03;
1521 data->pwmenable[2] = (reg_tmp>>4) & 0x03;
1522
1523 for (i = 0; i < 3; i++) {
1524 data->temp1[i] = w83792d_read_value(client,
1525 W83792D_REG_TEMP1[i]);
1526 }
1527 for (i = 0; i < 2; i++) {
1528 for (j = 0; j < 6; j++) {
1529 data->temp_add[i][j] = w83792d_read_value(
1530 client, W83792D_REG_TEMP_ADD[i][j]);
1531 }
1532 }
1533
1534
1535 for (i = 0; i < 4; i++) {
1536 reg_array_tmp[i] = w83792d_read_value(client,
1537 W83792D_REG_FAN_DIV[i]);
1538 }
1539 data->fan_div[0] = reg_array_tmp[0] & 0x07;
1540 data->fan_div[1] = (reg_array_tmp[0] >> 4) & 0x07;
1541 data->fan_div[2] = reg_array_tmp[1] & 0x07;
1542 data->fan_div[3] = (reg_array_tmp[1] >> 4) & 0x07;
1543 data->fan_div[4] = reg_array_tmp[2] & 0x07;
1544 data->fan_div[5] = (reg_array_tmp[2] >> 4) & 0x07;
1545 data->fan_div[6] = reg_array_tmp[3] & 0x07;
1546
1547
1548 data->alarms = w83792d_read_value(client, W83792D_REG_ALARM1) +
1549 (w83792d_read_value(client, W83792D_REG_ALARM2) << 8) +
1550 (w83792d_read_value(client, W83792D_REG_ALARM3) << 16);
1551
1552
1553 data->chassis = (w83792d_read_value(client,
1554 W83792D_REG_CHASSIS) >> 5) & 0x01;
1555
1556
1557 for (i = 0; i < 3; i++) {
1558 data->thermal_cruise[i] =
1559 w83792d_read_value(client,
1560 W83792D_REG_THERMAL[i]) & 0x7f;
1561 }
1562
1563
1564 reg_tmp = w83792d_read_value(client, W83792D_REG_TOLERANCE[0]);
1565 data->tolerance[0] = reg_tmp & 0x0f;
1566 data->tolerance[1] = (reg_tmp >> 4) & 0x0f;
1567 data->tolerance[2] = w83792d_read_value(client,
1568 W83792D_REG_TOLERANCE[2]) & 0x0f;
1569
1570
1571 for (i = 0; i < 3; i++) {
1572 for (j = 0; j < 4; j++) {
1573 data->sf2_points[i][j]
1574 = w83792d_read_value(client,
1575 W83792D_REG_POINTS[i][j]) & 0x7f;
1576 }
1577 }
1578
1579
1580 for (i = 0; i < 3; i++) {
1581 reg_tmp = w83792d_read_value(client,
1582 W83792D_REG_LEVELS[i][0]);
1583 data->sf2_levels[i][0] = reg_tmp & 0x0f;
1584 data->sf2_levels[i][1] = (reg_tmp >> 4) & 0x0f;
1585 reg_tmp = w83792d_read_value(client,
1586 W83792D_REG_LEVELS[i][2]);
1587 data->sf2_levels[i][2] = (reg_tmp >> 4) & 0x0f;
1588 data->sf2_levels[i][3] = reg_tmp & 0x0f;
1589 }
1590
1591 data->last_updated = jiffies;
1592 data->valid = true;
1593 }
1594
1595 mutex_unlock(&data->update_lock);
1596
1597 #ifdef DEBUG
1598 w83792d_print_debug(data, dev);
1599 #endif
1600
1601 return data;
1602 }
1603
1604 #ifdef DEBUG
1605 static void w83792d_print_debug(struct w83792d_data *data, struct device *dev)
1606 {
1607 int i = 0, j = 0;
1608 dev_dbg(dev, "==========The following is the debug message...========\n");
1609 dev_dbg(dev, "9 set of Voltages: =====>\n");
1610 for (i = 0; i < 9; i++) {
1611 dev_dbg(dev, "vin[%d] is: 0x%x\n", i, data->in[i]);
1612 dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]);
1613 dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]);
1614 }
1615 dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits & 0xff);
1616 dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits >> 8);
1617 dev_dbg(dev, "7 set of Fan Counts and Duty Cycles: =====>\n");
1618 for (i = 0; i < 7; i++) {
1619 dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]);
1620 dev_dbg(dev, "fan[%d] min is: 0x%x\n", i, data->fan_min[i]);
1621 dev_dbg(dev, "pwm[%d] is: 0x%x\n", i, data->pwm[i]);
1622 }
1623 dev_dbg(dev, "3 set of Temperatures: =====>\n");
1624 for (i = 0; i < 3; i++)
1625 dev_dbg(dev, "temp1[%d] is: 0x%x\n", i, data->temp1[i]);
1626
1627 for (i = 0; i < 2; i++) {
1628 for (j = 0; j < 6; j++) {
1629 dev_dbg(dev, "temp_add[%d][%d] is: 0x%x\n", i, j,
1630 data->temp_add[i][j]);
1631 }
1632 }
1633
1634 for (i = 0; i < 7; i++)
1635 dev_dbg(dev, "fan_div[%d] is: 0x%x\n", i, data->fan_div[i]);
1636
1637 dev_dbg(dev, "==========End of the debug message...================\n");
1638 dev_dbg(dev, "\n");
1639 }
1640 #endif
1641
1642 module_i2c_driver(w83792d_driver);
1643
1644 MODULE_AUTHOR("Shane Huang (Winbond)");
1645 MODULE_DESCRIPTION("W83792AD/D driver for linux-2.6");
1646 MODULE_LICENSE("GPL");