0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0024
0025 #include <linux/module.h>
0026 #include <linux/init.h>
0027 #include <linux/slab.h>
0028 #include <linux/jiffies.h>
0029 #include <linux/i2c.h>
0030 #include <linux/hwmon.h>
0031 #include <linux/hwmon-vid.h>
0032 #include <linux/hwmon-sysfs.h>
0033 #include <linux/sysfs.h>
0034 #include <linux/err.h>
0035 #include <linux/mutex.h>
0036
0037 #ifdef CONFIG_ISA
0038 #include <linux/platform_device.h>
0039 #include <linux/ioport.h>
0040 #include <linux/io.h>
0041 #endif
0042
0043 #include "lm75.h"
0044
0045
0046 static const unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
0047 0x2e, 0x2f, I2C_CLIENT_END };
0048
0049 enum chips { w83781d, w83782d, w83783s, as99127f };
0050
0051
0052 static unsigned short force_subclients[4];
0053 module_param_array(force_subclients, short, NULL, 0);
0054 MODULE_PARM_DESC(force_subclients,
0055 "List of subclient addresses: {bus, clientaddr, subclientaddr1, subclientaddr2}");
0056
0057 static bool reset;
0058 module_param(reset, bool, 0);
0059 MODULE_PARM_DESC(reset, "Set to one to reset chip on load");
0060
0061 static bool init = 1;
0062 module_param(init, bool, 0);
0063 MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization");
0064
0065
0066
0067
0068 #define W83781D_EXTENT 8
0069
0070
0071 #define W83781D_ADDR_REG_OFFSET 5
0072 #define W83781D_DATA_REG_OFFSET 6
0073
0074
0075
0076 #define W83781D_REG_IN_MAX(nr) ((nr < 7) ? (0x2b + (nr) * 2) : \
0077 (0x554 + (((nr) - 7) * 2)))
0078 #define W83781D_REG_IN_MIN(nr) ((nr < 7) ? (0x2c + (nr) * 2) : \
0079 (0x555 + (((nr) - 7) * 2)))
0080 #define W83781D_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \
0081 (0x550 + (nr) - 7))
0082
0083
0084 #define W83781D_REG_FAN_MIN(nr) (0x3b + (nr))
0085 #define W83781D_REG_FAN(nr) (0x28 + (nr))
0086
0087 #define W83781D_REG_BANK 0x4E
0088 #define W83781D_REG_TEMP2_CONFIG 0x152
0089 #define W83781D_REG_TEMP3_CONFIG 0x252
0090
0091 #define W83781D_REG_TEMP(nr) ((nr == 3) ? (0x0250) : \
0092 ((nr == 2) ? (0x0150) : \
0093 (0x27)))
0094 #define W83781D_REG_TEMP_HYST(nr) ((nr == 3) ? (0x253) : \
0095 ((nr == 2) ? (0x153) : \
0096 (0x3A)))
0097 #define W83781D_REG_TEMP_OVER(nr) ((nr == 3) ? (0x255) : \
0098 ((nr == 2) ? (0x155) : \
0099 (0x39)))
0100
0101 #define W83781D_REG_CONFIG 0x40
0102
0103
0104 #define W83781D_REG_ALARM1 0x41
0105 #define W83781D_REG_ALARM2 0x42
0106
0107
0108 #define W83782D_REG_ALARM1 0x459
0109 #define W83782D_REG_ALARM2 0x45A
0110 #define W83782D_REG_ALARM3 0x45B
0111
0112 #define W83781D_REG_BEEP_CONFIG 0x4D
0113 #define W83781D_REG_BEEP_INTS1 0x56
0114 #define W83781D_REG_BEEP_INTS2 0x57
0115 #define W83781D_REG_BEEP_INTS3 0x453
0116
0117 #define W83781D_REG_VID_FANDIV 0x47
0118
0119 #define W83781D_REG_CHIPID 0x49
0120 #define W83781D_REG_WCHIPID 0x58
0121 #define W83781D_REG_CHIPMAN 0x4F
0122 #define W83781D_REG_PIN 0x4B
0123
0124
0125 #define W83781D_REG_VBAT 0x5D
0126
0127
0128 static const u8 W83781D_REG_PWM[] = { 0x5B, 0x5A, 0x5E, 0x5F };
0129 #define W83781D_REG_PWMCLK12 0x5C
0130 #define W83781D_REG_PWMCLK34 0x45C
0131
0132 #define W83781D_REG_I2C_ADDR 0x48
0133 #define W83781D_REG_I2C_SUBADDR 0x4A
0134
0135
0136
0137
0138
0139
0140 #define W83781D_REG_SCFG1 0x5D
0141 static const u8 BIT_SCFG1[] = { 0x02, 0x04, 0x08 };
0142
0143 #define W83781D_REG_SCFG2 0x59
0144 static const u8 BIT_SCFG2[] = { 0x10, 0x20, 0x40 };
0145
0146 #define W83781D_DEFAULT_BETA 3435
0147
0148
0149 #define IN_TO_REG(val) clamp_val(((val) + 8) / 16, 0, 255)
0150 #define IN_FROM_REG(val) ((val) * 16)
0151
0152 static inline u8
0153 FAN_TO_REG(long rpm, int div)
0154 {
0155 if (rpm == 0)
0156 return 255;
0157 rpm = clamp_val(rpm, 1, 1000000);
0158 return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254);
0159 }
0160
0161 static inline long
0162 FAN_FROM_REG(u8 val, int div)
0163 {
0164 if (val == 0)
0165 return -1;
0166 if (val == 255)
0167 return 0;
0168 return 1350000 / (val * div);
0169 }
0170
0171 #define TEMP_TO_REG(val) clamp_val((val) / 1000, -127, 128)
0172 #define TEMP_FROM_REG(val) ((val) * 1000)
0173
0174 #define BEEP_MASK_FROM_REG(val, type) ((type) == as99127f ? \
0175 (~(val)) & 0x7fff : (val) & 0xff7fff)
0176 #define BEEP_MASK_TO_REG(val, type) ((type) == as99127f ? \
0177 (~(val)) & 0x7fff : (val) & 0xff7fff)
0178
0179 #define DIV_FROM_REG(val) (1 << (val))
0180
0181 static inline u8
0182 DIV_TO_REG(long val, enum chips type)
0183 {
0184 int i;
0185 val = clamp_val(val, 1,
0186 ((type == w83781d || type == as99127f) ? 8 : 128)) >> 1;
0187 for (i = 0; i < 7; i++) {
0188 if (val == 0)
0189 break;
0190 val >>= 1;
0191 }
0192 return i;
0193 }
0194
0195 struct w83781d_data {
0196 struct i2c_client *client;
0197 struct device *hwmon_dev;
0198 struct mutex lock;
0199 enum chips type;
0200
0201
0202 const char *name;
0203 int isa_addr;
0204
0205 struct mutex update_lock;
0206 bool valid;
0207 unsigned long last_updated;
0208
0209 struct i2c_client *lm75[2];
0210
0211
0212 u8 in[9];
0213 u8 in_max[9];
0214 u8 in_min[9];
0215 u8 fan[3];
0216 u8 fan_min[3];
0217 s8 temp;
0218 s8 temp_max;
0219 s8 temp_max_hyst;
0220 u16 temp_add[2];
0221 u16 temp_max_add[2];
0222 u16 temp_max_hyst_add[2];
0223 u8 fan_div[3];
0224 u8 vid;
0225 u32 alarms;
0226 u32 beep_mask;
0227 u8 pwm[4];
0228 u8 pwm2_enable;
0229 u16 sens[3];
0230
0231
0232
0233
0234 u8 vrm;
0235 };
0236
0237 static struct w83781d_data *w83781d_data_if_isa(void);
0238 static int w83781d_alias_detect(struct i2c_client *client, u8 chipid);
0239
0240 static int w83781d_read_value(struct w83781d_data *data, u16 reg);
0241 static int w83781d_write_value(struct w83781d_data *data, u16 reg, u16 value);
0242 static struct w83781d_data *w83781d_update_device(struct device *dev);
0243 static void w83781d_init_device(struct device *dev);
0244
0245
0246 #define show_in_reg(reg) \
0247 static ssize_t show_##reg(struct device *dev, struct device_attribute *da, \
0248 char *buf) \
0249 { \
0250 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); \
0251 struct w83781d_data *data = w83781d_update_device(dev); \
0252 return sprintf(buf, "%ld\n", \
0253 (long)IN_FROM_REG(data->reg[attr->index])); \
0254 }
0255 show_in_reg(in);
0256 show_in_reg(in_min);
0257 show_in_reg(in_max);
0258
0259 #define store_in_reg(REG, reg) \
0260 static ssize_t store_in_##reg(struct device *dev, struct device_attribute \
0261 *da, const char *buf, size_t count) \
0262 { \
0263 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); \
0264 struct w83781d_data *data = dev_get_drvdata(dev); \
0265 int nr = attr->index; \
0266 unsigned long val; \
0267 int err = kstrtoul(buf, 10, &val); \
0268 if (err) \
0269 return err; \
0270 mutex_lock(&data->update_lock); \
0271 data->in_##reg[nr] = IN_TO_REG(val); \
0272 w83781d_write_value(data, W83781D_REG_IN_##REG(nr), \
0273 data->in_##reg[nr]); \
0274 \
0275 mutex_unlock(&data->update_lock); \
0276 return count; \
0277 }
0278 store_in_reg(MIN, min);
0279 store_in_reg(MAX, max);
0280
0281 #define sysfs_in_offsets(offset) \
0282 static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
0283 show_in, NULL, offset); \
0284 static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
0285 show_in_min, store_in_min, offset); \
0286 static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
0287 show_in_max, store_in_max, offset)
0288
0289 sysfs_in_offsets(0);
0290 sysfs_in_offsets(1);
0291 sysfs_in_offsets(2);
0292 sysfs_in_offsets(3);
0293 sysfs_in_offsets(4);
0294 sysfs_in_offsets(5);
0295 sysfs_in_offsets(6);
0296 sysfs_in_offsets(7);
0297 sysfs_in_offsets(8);
0298
0299 #define show_fan_reg(reg) \
0300 static ssize_t show_##reg(struct device *dev, struct device_attribute *da, \
0301 char *buf) \
0302 { \
0303 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); \
0304 struct w83781d_data *data = w83781d_update_device(dev); \
0305 return sprintf(buf, "%ld\n", \
0306 FAN_FROM_REG(data->reg[attr->index], \
0307 DIV_FROM_REG(data->fan_div[attr->index]))); \
0308 }
0309 show_fan_reg(fan);
0310 show_fan_reg(fan_min);
0311
0312 static ssize_t
0313 store_fan_min(struct device *dev, struct device_attribute *da,
0314 const char *buf, size_t count)
0315 {
0316 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0317 struct w83781d_data *data = dev_get_drvdata(dev);
0318 int nr = attr->index;
0319 unsigned long val;
0320 int err;
0321
0322 err = kstrtoul(buf, 10, &val);
0323 if (err)
0324 return err;
0325
0326 mutex_lock(&data->update_lock);
0327 data->fan_min[nr] =
0328 FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
0329 w83781d_write_value(data, W83781D_REG_FAN_MIN(nr),
0330 data->fan_min[nr]);
0331
0332 mutex_unlock(&data->update_lock);
0333 return count;
0334 }
0335
0336 static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0);
0337 static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO | S_IWUSR,
0338 show_fan_min, store_fan_min, 0);
0339 static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1);
0340 static SENSOR_DEVICE_ATTR(fan2_min, S_IRUGO | S_IWUSR,
0341 show_fan_min, store_fan_min, 1);
0342 static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2);
0343 static SENSOR_DEVICE_ATTR(fan3_min, S_IRUGO | S_IWUSR,
0344 show_fan_min, store_fan_min, 2);
0345
0346 #define show_temp_reg(reg) \
0347 static ssize_t show_##reg(struct device *dev, struct device_attribute *da, \
0348 char *buf) \
0349 { \
0350 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); \
0351 struct w83781d_data *data = w83781d_update_device(dev); \
0352 int nr = attr->index; \
0353 if (nr >= 2) { \
0354 return sprintf(buf, "%d\n", \
0355 LM75_TEMP_FROM_REG(data->reg##_add[nr-2])); \
0356 } else { \
0357 return sprintf(buf, "%ld\n", (long)TEMP_FROM_REG(data->reg)); \
0358 } \
0359 }
0360 show_temp_reg(temp);
0361 show_temp_reg(temp_max);
0362 show_temp_reg(temp_max_hyst);
0363
0364 #define store_temp_reg(REG, reg) \
0365 static ssize_t store_temp_##reg(struct device *dev, \
0366 struct device_attribute *da, const char *buf, size_t count) \
0367 { \
0368 struct sensor_device_attribute *attr = to_sensor_dev_attr(da); \
0369 struct w83781d_data *data = dev_get_drvdata(dev); \
0370 int nr = attr->index; \
0371 long val; \
0372 int err = kstrtol(buf, 10, &val); \
0373 if (err) \
0374 return err; \
0375 mutex_lock(&data->update_lock); \
0376 \
0377 if (nr >= 2) { \
0378 data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \
0379 w83781d_write_value(data, W83781D_REG_TEMP_##REG(nr), \
0380 data->temp_##reg##_add[nr-2]); \
0381 } else { \
0382 data->temp_##reg = TEMP_TO_REG(val); \
0383 w83781d_write_value(data, W83781D_REG_TEMP_##REG(nr), \
0384 data->temp_##reg); \
0385 } \
0386 \
0387 mutex_unlock(&data->update_lock); \
0388 return count; \
0389 }
0390 store_temp_reg(OVER, max);
0391 store_temp_reg(HYST, max_hyst);
0392
0393 #define sysfs_temp_offsets(offset) \
0394 static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
0395 show_temp, NULL, offset); \
0396 static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
0397 show_temp_max, store_temp_max, offset); \
0398 static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR, \
0399 show_temp_max_hyst, store_temp_max_hyst, offset);
0400
0401 sysfs_temp_offsets(1);
0402 sysfs_temp_offsets(2);
0403 sysfs_temp_offsets(3);
0404
0405 static ssize_t
0406 cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
0407 {
0408 struct w83781d_data *data = w83781d_update_device(dev);
0409 return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm));
0410 }
0411
0412 static DEVICE_ATTR_RO(cpu0_vid);
0413
0414 static ssize_t
0415 vrm_show(struct device *dev, struct device_attribute *attr, char *buf)
0416 {
0417 struct w83781d_data *data = dev_get_drvdata(dev);
0418 return sprintf(buf, "%ld\n", (long) data->vrm);
0419 }
0420
0421 static ssize_t
0422 vrm_store(struct device *dev, struct device_attribute *attr, const char *buf,
0423 size_t count)
0424 {
0425 struct w83781d_data *data = dev_get_drvdata(dev);
0426 unsigned long val;
0427 int err;
0428
0429 err = kstrtoul(buf, 10, &val);
0430 if (err)
0431 return err;
0432 data->vrm = clamp_val(val, 0, 255);
0433
0434 return count;
0435 }
0436
0437 static DEVICE_ATTR_RW(vrm);
0438
0439 static ssize_t
0440 alarms_show(struct device *dev, struct device_attribute *attr, char *buf)
0441 {
0442 struct w83781d_data *data = w83781d_update_device(dev);
0443 return sprintf(buf, "%u\n", data->alarms);
0444 }
0445
0446 static DEVICE_ATTR_RO(alarms);
0447
0448 static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
0449 char *buf)
0450 {
0451 struct w83781d_data *data = w83781d_update_device(dev);
0452 int bitnr = to_sensor_dev_attr(attr)->index;
0453 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
0454 }
0455
0456
0457 static ssize_t show_temp3_alarm(struct device *dev,
0458 struct device_attribute *attr, char *buf)
0459 {
0460 struct w83781d_data *data = w83781d_update_device(dev);
0461 int bitnr = (data->type == w83781d) ? 5 : 13;
0462 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1);
0463 }
0464
0465 static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0);
0466 static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1);
0467 static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2);
0468 static SENSOR_DEVICE_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3);
0469 static SENSOR_DEVICE_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8);
0470 static SENSOR_DEVICE_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 9);
0471 static SENSOR_DEVICE_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 10);
0472 static SENSOR_DEVICE_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 16);
0473 static SENSOR_DEVICE_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 17);
0474 static SENSOR_DEVICE_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6);
0475 static SENSOR_DEVICE_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7);
0476 static SENSOR_DEVICE_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11);
0477 static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4);
0478 static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5);
0479 static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_temp3_alarm, NULL, 0);
0480
0481 static ssize_t beep_mask_show(struct device *dev,
0482 struct device_attribute *attr, char *buf)
0483 {
0484 struct w83781d_data *data = w83781d_update_device(dev);
0485 return sprintf(buf, "%ld\n",
0486 (long)BEEP_MASK_FROM_REG(data->beep_mask, data->type));
0487 }
0488
0489 static ssize_t
0490 beep_mask_store(struct device *dev, struct device_attribute *attr,
0491 const char *buf, size_t count)
0492 {
0493 struct w83781d_data *data = dev_get_drvdata(dev);
0494 unsigned long val;
0495 int err;
0496
0497 err = kstrtoul(buf, 10, &val);
0498 if (err)
0499 return err;
0500
0501 mutex_lock(&data->update_lock);
0502 data->beep_mask &= 0x8000;
0503 data->beep_mask |= BEEP_MASK_TO_REG(val, data->type);
0504 w83781d_write_value(data, W83781D_REG_BEEP_INTS1,
0505 data->beep_mask & 0xff);
0506 w83781d_write_value(data, W83781D_REG_BEEP_INTS2,
0507 (data->beep_mask >> 8) & 0xff);
0508 if (data->type != w83781d && data->type != as99127f) {
0509 w83781d_write_value(data, W83781D_REG_BEEP_INTS3,
0510 ((data->beep_mask) >> 16) & 0xff);
0511 }
0512 mutex_unlock(&data->update_lock);
0513
0514 return count;
0515 }
0516
0517 static DEVICE_ATTR_RW(beep_mask);
0518
0519 static ssize_t show_beep(struct device *dev, struct device_attribute *attr,
0520 char *buf)
0521 {
0522 struct w83781d_data *data = w83781d_update_device(dev);
0523 int bitnr = to_sensor_dev_attr(attr)->index;
0524 return sprintf(buf, "%u\n", (data->beep_mask >> bitnr) & 1);
0525 }
0526
0527 static ssize_t
0528 store_beep(struct device *dev, struct device_attribute *attr,
0529 const char *buf, size_t count)
0530 {
0531 struct w83781d_data *data = dev_get_drvdata(dev);
0532 int bitnr = to_sensor_dev_attr(attr)->index;
0533 u8 reg;
0534 unsigned long bit;
0535 int err;
0536
0537 err = kstrtoul(buf, 10, &bit);
0538 if (err)
0539 return err;
0540
0541 if (bit & ~1)
0542 return -EINVAL;
0543
0544 mutex_lock(&data->update_lock);
0545 if (bit)
0546 data->beep_mask |= (1 << bitnr);
0547 else
0548 data->beep_mask &= ~(1 << bitnr);
0549
0550 if (bitnr < 8) {
0551 reg = w83781d_read_value(data, W83781D_REG_BEEP_INTS1);
0552 if (bit)
0553 reg |= (1 << bitnr);
0554 else
0555 reg &= ~(1 << bitnr);
0556 w83781d_write_value(data, W83781D_REG_BEEP_INTS1, reg);
0557 } else if (bitnr < 16) {
0558 reg = w83781d_read_value(data, W83781D_REG_BEEP_INTS2);
0559 if (bit)
0560 reg |= (1 << (bitnr - 8));
0561 else
0562 reg &= ~(1 << (bitnr - 8));
0563 w83781d_write_value(data, W83781D_REG_BEEP_INTS2, reg);
0564 } else {
0565 reg = w83781d_read_value(data, W83781D_REG_BEEP_INTS3);
0566 if (bit)
0567 reg |= (1 << (bitnr - 16));
0568 else
0569 reg &= ~(1 << (bitnr - 16));
0570 w83781d_write_value(data, W83781D_REG_BEEP_INTS3, reg);
0571 }
0572 mutex_unlock(&data->update_lock);
0573
0574 return count;
0575 }
0576
0577
0578 static ssize_t show_temp3_beep(struct device *dev,
0579 struct device_attribute *attr, char *buf)
0580 {
0581 struct w83781d_data *data = w83781d_update_device(dev);
0582 int bitnr = (data->type == w83781d) ? 5 : 13;
0583 return sprintf(buf, "%u\n", (data->beep_mask >> bitnr) & 1);
0584 }
0585
0586 static SENSOR_DEVICE_ATTR(in0_beep, S_IRUGO | S_IWUSR,
0587 show_beep, store_beep, 0);
0588 static SENSOR_DEVICE_ATTR(in1_beep, S_IRUGO | S_IWUSR,
0589 show_beep, store_beep, 1);
0590 static SENSOR_DEVICE_ATTR(in2_beep, S_IRUGO | S_IWUSR,
0591 show_beep, store_beep, 2);
0592 static SENSOR_DEVICE_ATTR(in3_beep, S_IRUGO | S_IWUSR,
0593 show_beep, store_beep, 3);
0594 static SENSOR_DEVICE_ATTR(in4_beep, S_IRUGO | S_IWUSR,
0595 show_beep, store_beep, 8);
0596 static SENSOR_DEVICE_ATTR(in5_beep, S_IRUGO | S_IWUSR,
0597 show_beep, store_beep, 9);
0598 static SENSOR_DEVICE_ATTR(in6_beep, S_IRUGO | S_IWUSR,
0599 show_beep, store_beep, 10);
0600 static SENSOR_DEVICE_ATTR(in7_beep, S_IRUGO | S_IWUSR,
0601 show_beep, store_beep, 16);
0602 static SENSOR_DEVICE_ATTR(in8_beep, S_IRUGO | S_IWUSR,
0603 show_beep, store_beep, 17);
0604 static SENSOR_DEVICE_ATTR(fan1_beep, S_IRUGO | S_IWUSR,
0605 show_beep, store_beep, 6);
0606 static SENSOR_DEVICE_ATTR(fan2_beep, S_IRUGO | S_IWUSR,
0607 show_beep, store_beep, 7);
0608 static SENSOR_DEVICE_ATTR(fan3_beep, S_IRUGO | S_IWUSR,
0609 show_beep, store_beep, 11);
0610 static SENSOR_DEVICE_ATTR(temp1_beep, S_IRUGO | S_IWUSR,
0611 show_beep, store_beep, 4);
0612 static SENSOR_DEVICE_ATTR(temp2_beep, S_IRUGO | S_IWUSR,
0613 show_beep, store_beep, 5);
0614 static SENSOR_DEVICE_ATTR(temp3_beep, S_IRUGO,
0615 show_temp3_beep, store_beep, 13);
0616 static SENSOR_DEVICE_ATTR(beep_enable, S_IRUGO | S_IWUSR,
0617 show_beep, store_beep, 15);
0618
0619 static ssize_t
0620 show_fan_div(struct device *dev, struct device_attribute *da, char *buf)
0621 {
0622 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0623 struct w83781d_data *data = w83781d_update_device(dev);
0624 return sprintf(buf, "%ld\n",
0625 (long) DIV_FROM_REG(data->fan_div[attr->index]));
0626 }
0627
0628
0629
0630
0631
0632
0633
0634 static ssize_t
0635 store_fan_div(struct device *dev, struct device_attribute *da,
0636 const char *buf, size_t count)
0637 {
0638 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0639 struct w83781d_data *data = dev_get_drvdata(dev);
0640 unsigned long min;
0641 int nr = attr->index;
0642 u8 reg;
0643 unsigned long val;
0644 int err;
0645
0646 err = kstrtoul(buf, 10, &val);
0647 if (err)
0648 return err;
0649
0650 mutex_lock(&data->update_lock);
0651
0652
0653 min = FAN_FROM_REG(data->fan_min[nr],
0654 DIV_FROM_REG(data->fan_div[nr]));
0655
0656 data->fan_div[nr] = DIV_TO_REG(val, data->type);
0657
0658 reg = (w83781d_read_value(data, nr == 2 ?
0659 W83781D_REG_PIN : W83781D_REG_VID_FANDIV)
0660 & (nr == 0 ? 0xcf : 0x3f))
0661 | ((data->fan_div[nr] & 0x03) << (nr == 0 ? 4 : 6));
0662 w83781d_write_value(data, nr == 2 ?
0663 W83781D_REG_PIN : W83781D_REG_VID_FANDIV, reg);
0664
0665
0666 if (data->type != w83781d && data->type != as99127f) {
0667 reg = (w83781d_read_value(data, W83781D_REG_VBAT)
0668 & ~(1 << (5 + nr)))
0669 | ((data->fan_div[nr] & 0x04) << (3 + nr));
0670 w83781d_write_value(data, W83781D_REG_VBAT, reg);
0671 }
0672
0673
0674 data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr]));
0675 w83781d_write_value(data, W83781D_REG_FAN_MIN(nr), data->fan_min[nr]);
0676
0677 mutex_unlock(&data->update_lock);
0678 return count;
0679 }
0680
0681 static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO | S_IWUSR,
0682 show_fan_div, store_fan_div, 0);
0683 static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO | S_IWUSR,
0684 show_fan_div, store_fan_div, 1);
0685 static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO | S_IWUSR,
0686 show_fan_div, store_fan_div, 2);
0687
0688 static ssize_t
0689 show_pwm(struct device *dev, struct device_attribute *da, char *buf)
0690 {
0691 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0692 struct w83781d_data *data = w83781d_update_device(dev);
0693 return sprintf(buf, "%d\n", (int)data->pwm[attr->index]);
0694 }
0695
0696 static ssize_t
0697 pwm2_enable_show(struct device *dev, struct device_attribute *da, char *buf)
0698 {
0699 struct w83781d_data *data = w83781d_update_device(dev);
0700 return sprintf(buf, "%d\n", (int)data->pwm2_enable);
0701 }
0702
0703 static ssize_t
0704 store_pwm(struct device *dev, struct device_attribute *da, const char *buf,
0705 size_t count)
0706 {
0707 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0708 struct w83781d_data *data = dev_get_drvdata(dev);
0709 int nr = attr->index;
0710 unsigned long val;
0711 int err;
0712
0713 err = kstrtoul(buf, 10, &val);
0714 if (err)
0715 return err;
0716
0717 mutex_lock(&data->update_lock);
0718 data->pwm[nr] = clamp_val(val, 0, 255);
0719 w83781d_write_value(data, W83781D_REG_PWM[nr], data->pwm[nr]);
0720 mutex_unlock(&data->update_lock);
0721 return count;
0722 }
0723
0724 static ssize_t
0725 pwm2_enable_store(struct device *dev, struct device_attribute *da,
0726 const char *buf, size_t count)
0727 {
0728 struct w83781d_data *data = dev_get_drvdata(dev);
0729 unsigned long val;
0730 u32 reg;
0731 int err;
0732
0733 err = kstrtoul(buf, 10, &val);
0734 if (err)
0735 return err;
0736
0737 mutex_lock(&data->update_lock);
0738
0739 switch (val) {
0740 case 0:
0741 case 1:
0742 reg = w83781d_read_value(data, W83781D_REG_PWMCLK12);
0743 w83781d_write_value(data, W83781D_REG_PWMCLK12,
0744 (reg & 0xf7) | (val << 3));
0745
0746 reg = w83781d_read_value(data, W83781D_REG_BEEP_CONFIG);
0747 w83781d_write_value(data, W83781D_REG_BEEP_CONFIG,
0748 (reg & 0xef) | (!val << 4));
0749
0750 data->pwm2_enable = val;
0751 break;
0752
0753 default:
0754 mutex_unlock(&data->update_lock);
0755 return -EINVAL;
0756 }
0757
0758 mutex_unlock(&data->update_lock);
0759 return count;
0760 }
0761
0762 static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, show_pwm, store_pwm, 0);
0763 static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, show_pwm, store_pwm, 1);
0764 static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR, show_pwm, store_pwm, 2);
0765 static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR, show_pwm, store_pwm, 3);
0766
0767 static DEVICE_ATTR_RW(pwm2_enable);
0768
0769 static ssize_t
0770 show_sensor(struct device *dev, struct device_attribute *da, char *buf)
0771 {
0772 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0773 struct w83781d_data *data = w83781d_update_device(dev);
0774 return sprintf(buf, "%d\n", (int)data->sens[attr->index]);
0775 }
0776
0777 static ssize_t
0778 store_sensor(struct device *dev, struct device_attribute *da,
0779 const char *buf, size_t count)
0780 {
0781 struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
0782 struct w83781d_data *data = dev_get_drvdata(dev);
0783 int nr = attr->index;
0784 unsigned long val;
0785 u32 tmp;
0786 int err;
0787
0788 err = kstrtoul(buf, 10, &val);
0789 if (err)
0790 return err;
0791
0792 mutex_lock(&data->update_lock);
0793
0794 switch (val) {
0795 case 1:
0796 tmp = w83781d_read_value(data, W83781D_REG_SCFG1);
0797 w83781d_write_value(data, W83781D_REG_SCFG1,
0798 tmp | BIT_SCFG1[nr]);
0799 tmp = w83781d_read_value(data, W83781D_REG_SCFG2);
0800 w83781d_write_value(data, W83781D_REG_SCFG2,
0801 tmp | BIT_SCFG2[nr]);
0802 data->sens[nr] = val;
0803 break;
0804 case 2:
0805 tmp = w83781d_read_value(data, W83781D_REG_SCFG1);
0806 w83781d_write_value(data, W83781D_REG_SCFG1,
0807 tmp | BIT_SCFG1[nr]);
0808 tmp = w83781d_read_value(data, W83781D_REG_SCFG2);
0809 w83781d_write_value(data, W83781D_REG_SCFG2,
0810 tmp & ~BIT_SCFG2[nr]);
0811 data->sens[nr] = val;
0812 break;
0813 case W83781D_DEFAULT_BETA:
0814 dev_warn(dev,
0815 "Sensor type %d is deprecated, please use 4 instead\n",
0816 W83781D_DEFAULT_BETA);
0817 fallthrough;
0818 case 4:
0819 tmp = w83781d_read_value(data, W83781D_REG_SCFG1);
0820 w83781d_write_value(data, W83781D_REG_SCFG1,
0821 tmp & ~BIT_SCFG1[nr]);
0822 data->sens[nr] = val;
0823 break;
0824 default:
0825 dev_err(dev, "Invalid sensor type %ld; must be 1, 2, or 4\n",
0826 (long) val);
0827 break;
0828 }
0829
0830 mutex_unlock(&data->update_lock);
0831 return count;
0832 }
0833
0834 static SENSOR_DEVICE_ATTR(temp1_type, S_IRUGO | S_IWUSR,
0835 show_sensor, store_sensor, 0);
0836 static SENSOR_DEVICE_ATTR(temp2_type, S_IRUGO | S_IWUSR,
0837 show_sensor, store_sensor, 1);
0838 static SENSOR_DEVICE_ATTR(temp3_type, S_IRUGO | S_IWUSR,
0839 show_sensor, store_sensor, 2);
0840
0841
0842
0843
0844
0845 static int
0846 w83781d_detect_subclients(struct i2c_client *new_client)
0847 {
0848 int i, val1 = 0, id;
0849 int err;
0850 int address = new_client->addr;
0851 unsigned short sc_addr[2];
0852 struct i2c_adapter *adapter = new_client->adapter;
0853 struct w83781d_data *data = i2c_get_clientdata(new_client);
0854 enum chips kind = data->type;
0855 int num_sc = 1;
0856
0857 id = i2c_adapter_id(adapter);
0858
0859 if (force_subclients[0] == id && force_subclients[1] == address) {
0860 for (i = 2; i <= 3; i++) {
0861 if (force_subclients[i] < 0x48 ||
0862 force_subclients[i] > 0x4f) {
0863 dev_err(&new_client->dev,
0864 "Invalid subclient address %d; must be 0x48-0x4f\n",
0865 force_subclients[i]);
0866 err = -EINVAL;
0867 goto ERROR_SC_1;
0868 }
0869 }
0870 w83781d_write_value(data, W83781D_REG_I2C_SUBADDR,
0871 (force_subclients[2] & 0x07) |
0872 ((force_subclients[3] & 0x07) << 4));
0873 sc_addr[0] = force_subclients[2];
0874 } else {
0875 val1 = w83781d_read_value(data, W83781D_REG_I2C_SUBADDR);
0876 sc_addr[0] = 0x48 + (val1 & 0x07);
0877 }
0878
0879 if (kind != w83783s) {
0880 num_sc = 2;
0881 if (force_subclients[0] == id &&
0882 force_subclients[1] == address) {
0883 sc_addr[1] = force_subclients[3];
0884 } else {
0885 sc_addr[1] = 0x48 + ((val1 >> 4) & 0x07);
0886 }
0887 if (sc_addr[0] == sc_addr[1]) {
0888 dev_err(&new_client->dev,
0889 "Duplicate addresses 0x%x for subclients.\n",
0890 sc_addr[0]);
0891 err = -EBUSY;
0892 goto ERROR_SC_2;
0893 }
0894 }
0895
0896 for (i = 0; i < num_sc; i++) {
0897 data->lm75[i] = i2c_new_dummy_device(adapter, sc_addr[i]);
0898 if (IS_ERR(data->lm75[i])) {
0899 dev_err(&new_client->dev,
0900 "Subclient %d registration at address 0x%x failed.\n",
0901 i, sc_addr[i]);
0902 err = PTR_ERR(data->lm75[i]);
0903 if (i == 1)
0904 goto ERROR_SC_3;
0905 goto ERROR_SC_2;
0906 }
0907 }
0908
0909 return 0;
0910
0911
0912 ERROR_SC_3:
0913 i2c_unregister_device(data->lm75[0]);
0914 ERROR_SC_2:
0915 ERROR_SC_1:
0916 return err;
0917 }
0918
0919 #define IN_UNIT_ATTRS(X) \
0920 &sensor_dev_attr_in##X##_input.dev_attr.attr, \
0921 &sensor_dev_attr_in##X##_min.dev_attr.attr, \
0922 &sensor_dev_attr_in##X##_max.dev_attr.attr, \
0923 &sensor_dev_attr_in##X##_alarm.dev_attr.attr, \
0924 &sensor_dev_attr_in##X##_beep.dev_attr.attr
0925
0926 #define FAN_UNIT_ATTRS(X) \
0927 &sensor_dev_attr_fan##X##_input.dev_attr.attr, \
0928 &sensor_dev_attr_fan##X##_min.dev_attr.attr, \
0929 &sensor_dev_attr_fan##X##_div.dev_attr.attr, \
0930 &sensor_dev_attr_fan##X##_alarm.dev_attr.attr, \
0931 &sensor_dev_attr_fan##X##_beep.dev_attr.attr
0932
0933 #define TEMP_UNIT_ATTRS(X) \
0934 &sensor_dev_attr_temp##X##_input.dev_attr.attr, \
0935 &sensor_dev_attr_temp##X##_max.dev_attr.attr, \
0936 &sensor_dev_attr_temp##X##_max_hyst.dev_attr.attr, \
0937 &sensor_dev_attr_temp##X##_alarm.dev_attr.attr, \
0938 &sensor_dev_attr_temp##X##_beep.dev_attr.attr
0939
0940 static struct attribute *w83781d_attributes[] = {
0941 IN_UNIT_ATTRS(0),
0942 IN_UNIT_ATTRS(2),
0943 IN_UNIT_ATTRS(3),
0944 IN_UNIT_ATTRS(4),
0945 IN_UNIT_ATTRS(5),
0946 IN_UNIT_ATTRS(6),
0947 FAN_UNIT_ATTRS(1),
0948 FAN_UNIT_ATTRS(2),
0949 FAN_UNIT_ATTRS(3),
0950 TEMP_UNIT_ATTRS(1),
0951 TEMP_UNIT_ATTRS(2),
0952 &dev_attr_cpu0_vid.attr,
0953 &dev_attr_vrm.attr,
0954 &dev_attr_alarms.attr,
0955 &dev_attr_beep_mask.attr,
0956 &sensor_dev_attr_beep_enable.dev_attr.attr,
0957 NULL
0958 };
0959 static const struct attribute_group w83781d_group = {
0960 .attrs = w83781d_attributes,
0961 };
0962
0963 static struct attribute *w83781d_attributes_in1[] = {
0964 IN_UNIT_ATTRS(1),
0965 NULL
0966 };
0967 static const struct attribute_group w83781d_group_in1 = {
0968 .attrs = w83781d_attributes_in1,
0969 };
0970
0971 static struct attribute *w83781d_attributes_in78[] = {
0972 IN_UNIT_ATTRS(7),
0973 IN_UNIT_ATTRS(8),
0974 NULL
0975 };
0976 static const struct attribute_group w83781d_group_in78 = {
0977 .attrs = w83781d_attributes_in78,
0978 };
0979
0980 static struct attribute *w83781d_attributes_temp3[] = {
0981 TEMP_UNIT_ATTRS(3),
0982 NULL
0983 };
0984 static const struct attribute_group w83781d_group_temp3 = {
0985 .attrs = w83781d_attributes_temp3,
0986 };
0987
0988 static struct attribute *w83781d_attributes_pwm12[] = {
0989 &sensor_dev_attr_pwm1.dev_attr.attr,
0990 &sensor_dev_attr_pwm2.dev_attr.attr,
0991 &dev_attr_pwm2_enable.attr,
0992 NULL
0993 };
0994 static const struct attribute_group w83781d_group_pwm12 = {
0995 .attrs = w83781d_attributes_pwm12,
0996 };
0997
0998 static struct attribute *w83781d_attributes_pwm34[] = {
0999 &sensor_dev_attr_pwm3.dev_attr.attr,
1000 &sensor_dev_attr_pwm4.dev_attr.attr,
1001 NULL
1002 };
1003 static const struct attribute_group w83781d_group_pwm34 = {
1004 .attrs = w83781d_attributes_pwm34,
1005 };
1006
1007 static struct attribute *w83781d_attributes_other[] = {
1008 &sensor_dev_attr_temp1_type.dev_attr.attr,
1009 &sensor_dev_attr_temp2_type.dev_attr.attr,
1010 &sensor_dev_attr_temp3_type.dev_attr.attr,
1011 NULL
1012 };
1013 static const struct attribute_group w83781d_group_other = {
1014 .attrs = w83781d_attributes_other,
1015 };
1016
1017
1018 static int
1019 w83781d_create_files(struct device *dev, int kind, int is_isa)
1020 {
1021 int err;
1022
1023 err = sysfs_create_group(&dev->kobj, &w83781d_group);
1024 if (err)
1025 return err;
1026
1027 if (kind != w83783s) {
1028 err = sysfs_create_group(&dev->kobj, &w83781d_group_in1);
1029 if (err)
1030 return err;
1031 }
1032 if (kind != as99127f && kind != w83781d && kind != w83783s) {
1033 err = sysfs_create_group(&dev->kobj, &w83781d_group_in78);
1034 if (err)
1035 return err;
1036 }
1037 if (kind != w83783s) {
1038 err = sysfs_create_group(&dev->kobj, &w83781d_group_temp3);
1039 if (err)
1040 return err;
1041
1042 if (kind != w83781d) {
1043 err = sysfs_chmod_file(&dev->kobj,
1044 &sensor_dev_attr_temp3_alarm.dev_attr.attr,
1045 S_IRUGO | S_IWUSR);
1046 if (err)
1047 return err;
1048 }
1049 }
1050
1051 if (kind != w83781d && kind != as99127f) {
1052 err = sysfs_create_group(&dev->kobj, &w83781d_group_pwm12);
1053 if (err)
1054 return err;
1055 }
1056 if (kind == w83782d && !is_isa) {
1057 err = sysfs_create_group(&dev->kobj, &w83781d_group_pwm34);
1058 if (err)
1059 return err;
1060 }
1061
1062 if (kind != as99127f && kind != w83781d) {
1063 err = device_create_file(dev,
1064 &sensor_dev_attr_temp1_type.dev_attr);
1065 if (err)
1066 return err;
1067 err = device_create_file(dev,
1068 &sensor_dev_attr_temp2_type.dev_attr);
1069 if (err)
1070 return err;
1071 if (kind != w83783s) {
1072 err = device_create_file(dev,
1073 &sensor_dev_attr_temp3_type.dev_attr);
1074 if (err)
1075 return err;
1076 }
1077 }
1078
1079 return 0;
1080 }
1081
1082
1083 static int
1084 w83781d_detect(struct i2c_client *client, struct i2c_board_info *info)
1085 {
1086 int val1, val2;
1087 struct w83781d_data *isa = w83781d_data_if_isa();
1088 struct i2c_adapter *adapter = client->adapter;
1089 int address = client->addr;
1090 const char *client_name;
1091 enum vendor { winbond, asus } vendid;
1092
1093 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
1094 return -ENODEV;
1095
1096
1097
1098
1099
1100
1101 if (isa)
1102 mutex_lock(&isa->update_lock);
1103
1104 if (i2c_smbus_read_byte_data(client, W83781D_REG_CONFIG) & 0x80) {
1105 dev_dbg(&adapter->dev,
1106 "Detection of w83781d chip failed at step 3\n");
1107 goto err_nodev;
1108 }
1109
1110 val1 = i2c_smbus_read_byte_data(client, W83781D_REG_BANK);
1111 val2 = i2c_smbus_read_byte_data(client, W83781D_REG_CHIPMAN);
1112
1113 if (!(val1 & 0x07) &&
1114 ((!(val1 & 0x80) && val2 != 0xa3 && val2 != 0xc3) ||
1115 ((val1 & 0x80) && val2 != 0x5c && val2 != 0x12))) {
1116 dev_dbg(&adapter->dev,
1117 "Detection of w83781d chip failed at step 4\n");
1118 goto err_nodev;
1119 }
1120
1121
1122
1123
1124 if ((!(val1 & 0x80) && val2 == 0xa3) ||
1125 ((val1 & 0x80) && val2 == 0x5c)) {
1126 if (i2c_smbus_read_byte_data(client, W83781D_REG_I2C_ADDR)
1127 != address) {
1128 dev_dbg(&adapter->dev,
1129 "Detection of w83781d chip failed at step 5\n");
1130 goto err_nodev;
1131 }
1132 }
1133
1134
1135 i2c_smbus_write_byte_data(client, W83781D_REG_BANK,
1136 (i2c_smbus_read_byte_data(client, W83781D_REG_BANK)
1137 & 0x78) | 0x80);
1138
1139
1140 val2 = i2c_smbus_read_byte_data(client, W83781D_REG_CHIPMAN);
1141 if (val2 == 0x5c)
1142 vendid = winbond;
1143 else if (val2 == 0x12)
1144 vendid = asus;
1145 else {
1146 dev_dbg(&adapter->dev,
1147 "w83781d chip vendor is neither Winbond nor Asus\n");
1148 goto err_nodev;
1149 }
1150
1151
1152 val1 = i2c_smbus_read_byte_data(client, W83781D_REG_WCHIPID);
1153 if ((val1 == 0x10 || val1 == 0x11) && vendid == winbond)
1154 client_name = "w83781d";
1155 else if (val1 == 0x30 && vendid == winbond)
1156 client_name = "w83782d";
1157 else if (val1 == 0x40 && vendid == winbond && address == 0x2d)
1158 client_name = "w83783s";
1159 else if (val1 == 0x31)
1160 client_name = "as99127f";
1161 else
1162 goto err_nodev;
1163
1164 if (val1 <= 0x30 && w83781d_alias_detect(client, val1)) {
1165 dev_dbg(&adapter->dev,
1166 "Device at 0x%02x appears to be the same as ISA device\n",
1167 address);
1168 goto err_nodev;
1169 }
1170
1171 if (isa)
1172 mutex_unlock(&isa->update_lock);
1173
1174 strlcpy(info->type, client_name, I2C_NAME_SIZE);
1175
1176 return 0;
1177
1178 err_nodev:
1179 if (isa)
1180 mutex_unlock(&isa->update_lock);
1181 return -ENODEV;
1182 }
1183
1184 static void w83781d_remove_files(struct device *dev)
1185 {
1186 sysfs_remove_group(&dev->kobj, &w83781d_group);
1187 sysfs_remove_group(&dev->kobj, &w83781d_group_in1);
1188 sysfs_remove_group(&dev->kobj, &w83781d_group_in78);
1189 sysfs_remove_group(&dev->kobj, &w83781d_group_temp3);
1190 sysfs_remove_group(&dev->kobj, &w83781d_group_pwm12);
1191 sysfs_remove_group(&dev->kobj, &w83781d_group_pwm34);
1192 sysfs_remove_group(&dev->kobj, &w83781d_group_other);
1193 }
1194
1195 static const struct i2c_device_id w83781d_ids[];
1196
1197 static int w83781d_probe(struct i2c_client *client)
1198 {
1199 struct device *dev = &client->dev;
1200 struct w83781d_data *data;
1201 int err;
1202
1203 data = devm_kzalloc(dev, sizeof(struct w83781d_data), GFP_KERNEL);
1204 if (!data)
1205 return -ENOMEM;
1206
1207 i2c_set_clientdata(client, data);
1208 mutex_init(&data->lock);
1209 mutex_init(&data->update_lock);
1210
1211 data->type = i2c_match_id(w83781d_ids, client)->driver_data;
1212 data->client = client;
1213
1214
1215 err = w83781d_detect_subclients(client);
1216 if (err)
1217 return err;
1218
1219
1220 w83781d_init_device(dev);
1221
1222
1223 err = w83781d_create_files(dev, data->type, 0);
1224 if (err)
1225 goto exit_remove_files;
1226
1227 data->hwmon_dev = hwmon_device_register(dev);
1228 if (IS_ERR(data->hwmon_dev)) {
1229 err = PTR_ERR(data->hwmon_dev);
1230 goto exit_remove_files;
1231 }
1232
1233 return 0;
1234
1235 exit_remove_files:
1236 w83781d_remove_files(dev);
1237 i2c_unregister_device(data->lm75[0]);
1238 i2c_unregister_device(data->lm75[1]);
1239 return err;
1240 }
1241
1242 static int
1243 w83781d_remove(struct i2c_client *client)
1244 {
1245 struct w83781d_data *data = i2c_get_clientdata(client);
1246 struct device *dev = &client->dev;
1247
1248 hwmon_device_unregister(data->hwmon_dev);
1249 w83781d_remove_files(dev);
1250
1251 i2c_unregister_device(data->lm75[0]);
1252 i2c_unregister_device(data->lm75[1]);
1253
1254 return 0;
1255 }
1256
1257 static int
1258 w83781d_read_value_i2c(struct w83781d_data *data, u16 reg)
1259 {
1260 struct i2c_client *client = data->client;
1261 int res, bank;
1262 struct i2c_client *cl;
1263
1264 bank = (reg >> 8) & 0x0f;
1265 if (bank > 2)
1266
1267 i2c_smbus_write_byte_data(client, W83781D_REG_BANK,
1268 bank);
1269 if (bank == 0 || bank > 2) {
1270 res = i2c_smbus_read_byte_data(client, reg & 0xff);
1271 } else {
1272
1273 cl = data->lm75[bank - 1];
1274
1275 switch (reg & 0xff) {
1276 case 0x50:
1277 res = i2c_smbus_read_word_swapped(cl, 0);
1278 break;
1279 case 0x52:
1280 res = i2c_smbus_read_byte_data(cl, 1);
1281 break;
1282 case 0x53:
1283 res = i2c_smbus_read_word_swapped(cl, 2);
1284 break;
1285 case 0x55:
1286 default:
1287 res = i2c_smbus_read_word_swapped(cl, 3);
1288 break;
1289 }
1290 }
1291 if (bank > 2)
1292 i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0);
1293
1294 return res;
1295 }
1296
1297 static int
1298 w83781d_write_value_i2c(struct w83781d_data *data, u16 reg, u16 value)
1299 {
1300 struct i2c_client *client = data->client;
1301 int bank;
1302 struct i2c_client *cl;
1303
1304 bank = (reg >> 8) & 0x0f;
1305 if (bank > 2)
1306
1307 i2c_smbus_write_byte_data(client, W83781D_REG_BANK,
1308 bank);
1309 if (bank == 0 || bank > 2) {
1310 i2c_smbus_write_byte_data(client, reg & 0xff,
1311 value & 0xff);
1312 } else {
1313
1314 cl = data->lm75[bank - 1];
1315
1316 switch (reg & 0xff) {
1317 case 0x52:
1318 i2c_smbus_write_byte_data(cl, 1, value & 0xff);
1319 break;
1320 case 0x53:
1321 i2c_smbus_write_word_swapped(cl, 2, value);
1322 break;
1323 case 0x55:
1324 i2c_smbus_write_word_swapped(cl, 3, value);
1325 break;
1326 }
1327 }
1328 if (bank > 2)
1329 i2c_smbus_write_byte_data(client, W83781D_REG_BANK, 0);
1330
1331 return 0;
1332 }
1333
1334 static void
1335 w83781d_init_device(struct device *dev)
1336 {
1337 struct w83781d_data *data = dev_get_drvdata(dev);
1338 int i, p;
1339 int type = data->type;
1340 u8 tmp;
1341
1342 if (reset && type != as99127f) {
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354 dev_info(dev,
1355 "If reset=1 solved a problem you were having, please report!\n");
1356
1357
1358 i = w83781d_read_value(data, W83781D_REG_BEEP_CONFIG);
1359 p = w83781d_read_value(data, W83781D_REG_PWMCLK12);
1360
1361
1362
1363
1364 w83781d_write_value(data, W83781D_REG_CONFIG, 0x80);
1365
1366
1367
1368
1369 w83781d_write_value(data, W83781D_REG_BEEP_CONFIG, i | 0x80);
1370 w83781d_write_value(data, W83781D_REG_PWMCLK12, p);
1371
1372
1373
1374
1375
1376 w83781d_write_value(data, W83781D_REG_BEEP_INTS2, 0);
1377 }
1378
1379
1380
1381
1382
1383 if (init && !reset && type != as99127f) {
1384 i = w83781d_read_value(data, W83781D_REG_BEEP_CONFIG);
1385 w83781d_write_value(data, W83781D_REG_BEEP_CONFIG, i | 0x80);
1386 }
1387
1388 data->vrm = vid_which_vrm();
1389
1390 if ((type != w83781d) && (type != as99127f)) {
1391 tmp = w83781d_read_value(data, W83781D_REG_SCFG1);
1392 for (i = 1; i <= 3; i++) {
1393 if (!(tmp & BIT_SCFG1[i - 1])) {
1394 data->sens[i - 1] = 4;
1395 } else {
1396 if (w83781d_read_value
1397 (data,
1398 W83781D_REG_SCFG2) & BIT_SCFG2[i - 1])
1399 data->sens[i - 1] = 1;
1400 else
1401 data->sens[i - 1] = 2;
1402 }
1403 if (type == w83783s && i == 2)
1404 break;
1405 }
1406 }
1407
1408 if (init && type != as99127f) {
1409
1410 tmp = w83781d_read_value(data, W83781D_REG_TEMP2_CONFIG);
1411 if (tmp & 0x01) {
1412 dev_warn(dev,
1413 "Enabling temp2, readings might not make sense\n");
1414 w83781d_write_value(data, W83781D_REG_TEMP2_CONFIG,
1415 tmp & 0xfe);
1416 }
1417
1418
1419 if (type != w83783s) {
1420 tmp = w83781d_read_value(data,
1421 W83781D_REG_TEMP3_CONFIG);
1422 if (tmp & 0x01) {
1423 dev_warn(dev,
1424 "Enabling temp3, readings might not make sense\n");
1425 w83781d_write_value(data,
1426 W83781D_REG_TEMP3_CONFIG, tmp & 0xfe);
1427 }
1428 }
1429 }
1430
1431
1432 w83781d_write_value(data, W83781D_REG_CONFIG,
1433 (w83781d_read_value(data,
1434 W83781D_REG_CONFIG) & 0xf7)
1435 | 0x01);
1436
1437
1438 for (i = 0; i < 3; i++) {
1439 data->fan_min[i] = w83781d_read_value(data,
1440 W83781D_REG_FAN_MIN(i));
1441 }
1442
1443 mutex_init(&data->update_lock);
1444 }
1445
1446 static struct w83781d_data *w83781d_update_device(struct device *dev)
1447 {
1448 struct w83781d_data *data = dev_get_drvdata(dev);
1449 struct i2c_client *client = data->client;
1450 int i;
1451
1452 mutex_lock(&data->update_lock);
1453
1454 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1455 || !data->valid) {
1456 dev_dbg(dev, "Starting device update\n");
1457
1458 for (i = 0; i <= 8; i++) {
1459 if (data->type == w83783s && i == 1)
1460 continue;
1461 data->in[i] =
1462 w83781d_read_value(data, W83781D_REG_IN(i));
1463 data->in_min[i] =
1464 w83781d_read_value(data, W83781D_REG_IN_MIN(i));
1465 data->in_max[i] =
1466 w83781d_read_value(data, W83781D_REG_IN_MAX(i));
1467 if ((data->type != w83782d) && (i == 6))
1468 break;
1469 }
1470 for (i = 0; i < 3; i++) {
1471 data->fan[i] =
1472 w83781d_read_value(data, W83781D_REG_FAN(i));
1473 data->fan_min[i] =
1474 w83781d_read_value(data, W83781D_REG_FAN_MIN(i));
1475 }
1476 if (data->type != w83781d && data->type != as99127f) {
1477 for (i = 0; i < 4; i++) {
1478 data->pwm[i] =
1479 w83781d_read_value(data,
1480 W83781D_REG_PWM[i]);
1481
1482 if ((data->type != w83782d || !client)
1483 && i == 1)
1484 break;
1485 }
1486
1487 data->pwm2_enable = (w83781d_read_value(data,
1488 W83781D_REG_PWMCLK12) & 0x08) >> 3;
1489 }
1490
1491 data->temp = w83781d_read_value(data, W83781D_REG_TEMP(1));
1492 data->temp_max =
1493 w83781d_read_value(data, W83781D_REG_TEMP_OVER(1));
1494 data->temp_max_hyst =
1495 w83781d_read_value(data, W83781D_REG_TEMP_HYST(1));
1496 data->temp_add[0] =
1497 w83781d_read_value(data, W83781D_REG_TEMP(2));
1498 data->temp_max_add[0] =
1499 w83781d_read_value(data, W83781D_REG_TEMP_OVER(2));
1500 data->temp_max_hyst_add[0] =
1501 w83781d_read_value(data, W83781D_REG_TEMP_HYST(2));
1502 if (data->type != w83783s) {
1503 data->temp_add[1] =
1504 w83781d_read_value(data, W83781D_REG_TEMP(3));
1505 data->temp_max_add[1] =
1506 w83781d_read_value(data,
1507 W83781D_REG_TEMP_OVER(3));
1508 data->temp_max_hyst_add[1] =
1509 w83781d_read_value(data,
1510 W83781D_REG_TEMP_HYST(3));
1511 }
1512 i = w83781d_read_value(data, W83781D_REG_VID_FANDIV);
1513 data->vid = i & 0x0f;
1514 data->vid |= (w83781d_read_value(data,
1515 W83781D_REG_CHIPID) & 0x01) << 4;
1516 data->fan_div[0] = (i >> 4) & 0x03;
1517 data->fan_div[1] = (i >> 6) & 0x03;
1518 data->fan_div[2] = (w83781d_read_value(data,
1519 W83781D_REG_PIN) >> 6) & 0x03;
1520 if ((data->type != w83781d) && (data->type != as99127f)) {
1521 i = w83781d_read_value(data, W83781D_REG_VBAT);
1522 data->fan_div[0] |= (i >> 3) & 0x04;
1523 data->fan_div[1] |= (i >> 4) & 0x04;
1524 data->fan_div[2] |= (i >> 5) & 0x04;
1525 }
1526 if (data->type == w83782d) {
1527 data->alarms = w83781d_read_value(data,
1528 W83782D_REG_ALARM1)
1529 | (w83781d_read_value(data,
1530 W83782D_REG_ALARM2) << 8)
1531 | (w83781d_read_value(data,
1532 W83782D_REG_ALARM3) << 16);
1533 } else if (data->type == w83783s) {
1534 data->alarms = w83781d_read_value(data,
1535 W83782D_REG_ALARM1)
1536 | (w83781d_read_value(data,
1537 W83782D_REG_ALARM2) << 8);
1538 } else {
1539
1540
1541
1542
1543 data->alarms = w83781d_read_value(data,
1544 W83781D_REG_ALARM1)
1545 | (w83781d_read_value(data,
1546 W83781D_REG_ALARM2) << 8);
1547 }
1548 i = w83781d_read_value(data, W83781D_REG_BEEP_INTS2);
1549 data->beep_mask = (i << 8) +
1550 w83781d_read_value(data, W83781D_REG_BEEP_INTS1);
1551 if ((data->type != w83781d) && (data->type != as99127f)) {
1552 data->beep_mask |=
1553 w83781d_read_value(data,
1554 W83781D_REG_BEEP_INTS3) << 16;
1555 }
1556 data->last_updated = jiffies;
1557 data->valid = true;
1558 }
1559
1560 mutex_unlock(&data->update_lock);
1561
1562 return data;
1563 }
1564
1565 static const struct i2c_device_id w83781d_ids[] = {
1566 { "w83781d", w83781d, },
1567 { "w83782d", w83782d, },
1568 { "w83783s", w83783s, },
1569 { "as99127f", as99127f },
1570 { }
1571 };
1572 MODULE_DEVICE_TABLE(i2c, w83781d_ids);
1573
1574 static const struct of_device_id w83781d_of_match[] = {
1575 { .compatible = "winbond,w83781d" },
1576 { .compatible = "winbond,w83781g" },
1577 { .compatible = "winbond,w83782d" },
1578 { .compatible = "winbond,w83783s" },
1579 { .compatible = "asus,as99127f" },
1580 { },
1581 };
1582 MODULE_DEVICE_TABLE(of, w83781d_of_match);
1583
1584 static struct i2c_driver w83781d_driver = {
1585 .class = I2C_CLASS_HWMON,
1586 .driver = {
1587 .name = "w83781d",
1588 .of_match_table = w83781d_of_match,
1589 },
1590 .probe_new = w83781d_probe,
1591 .remove = w83781d_remove,
1592 .id_table = w83781d_ids,
1593 .detect = w83781d_detect,
1594 .address_list = normal_i2c,
1595 };
1596
1597
1598
1599
1600 #ifdef CONFIG_ISA
1601
1602
1603 static struct platform_device *pdev;
1604
1605 static unsigned short isa_address = 0x290;
1606
1607
1608
1609
1610
1611 static ssize_t
1612 name_show(struct device *dev, struct device_attribute *devattr, char *buf)
1613 {
1614 struct w83781d_data *data = dev_get_drvdata(dev);
1615 return sprintf(buf, "%s\n", data->name);
1616 }
1617 static DEVICE_ATTR_RO(name);
1618
1619 static struct w83781d_data *w83781d_data_if_isa(void)
1620 {
1621 return pdev ? platform_get_drvdata(pdev) : NULL;
1622 }
1623
1624
1625 static int w83781d_alias_detect(struct i2c_client *client, u8 chipid)
1626 {
1627 struct w83781d_data *isa;
1628 int i;
1629
1630 if (!pdev)
1631 return 0;
1632
1633 isa = platform_get_drvdata(pdev);
1634
1635 if (w83781d_read_value(isa, W83781D_REG_I2C_ADDR) != client->addr)
1636 return 0;
1637 if (w83781d_read_value(isa, W83781D_REG_WCHIPID) != chipid)
1638 return 0;
1639
1640
1641
1642
1643
1644 for (i = 0x2b; i <= 0x3d; i++) {
1645 if (w83781d_read_value(isa, i) !=
1646 i2c_smbus_read_byte_data(client, i))
1647 return 0;
1648 }
1649 if (w83781d_read_value(isa, W83781D_REG_CONFIG) !=
1650 i2c_smbus_read_byte_data(client, W83781D_REG_CONFIG))
1651 return 0;
1652 for (i = 0x43; i <= 0x46; i++) {
1653 if (w83781d_read_value(isa, i) !=
1654 i2c_smbus_read_byte_data(client, i))
1655 return 0;
1656 }
1657
1658 return 1;
1659 }
1660
1661 static int
1662 w83781d_read_value_isa(struct w83781d_data *data, u16 reg)
1663 {
1664 int word_sized, res;
1665
1666 word_sized = (((reg & 0xff00) == 0x100)
1667 || ((reg & 0xff00) == 0x200))
1668 && (((reg & 0x00ff) == 0x50)
1669 || ((reg & 0x00ff) == 0x53)
1670 || ((reg & 0x00ff) == 0x55));
1671 if (reg & 0xff00) {
1672 outb_p(W83781D_REG_BANK,
1673 data->isa_addr + W83781D_ADDR_REG_OFFSET);
1674 outb_p(reg >> 8,
1675 data->isa_addr + W83781D_DATA_REG_OFFSET);
1676 }
1677 outb_p(reg & 0xff, data->isa_addr + W83781D_ADDR_REG_OFFSET);
1678 res = inb_p(data->isa_addr + W83781D_DATA_REG_OFFSET);
1679 if (word_sized) {
1680 outb_p((reg & 0xff) + 1,
1681 data->isa_addr + W83781D_ADDR_REG_OFFSET);
1682 res =
1683 (res << 8) + inb_p(data->isa_addr +
1684 W83781D_DATA_REG_OFFSET);
1685 }
1686 if (reg & 0xff00) {
1687 outb_p(W83781D_REG_BANK,
1688 data->isa_addr + W83781D_ADDR_REG_OFFSET);
1689 outb_p(0, data->isa_addr + W83781D_DATA_REG_OFFSET);
1690 }
1691 return res;
1692 }
1693
1694 static void
1695 w83781d_write_value_isa(struct w83781d_data *data, u16 reg, u16 value)
1696 {
1697 int word_sized;
1698
1699 word_sized = (((reg & 0xff00) == 0x100)
1700 || ((reg & 0xff00) == 0x200))
1701 && (((reg & 0x00ff) == 0x53)
1702 || ((reg & 0x00ff) == 0x55));
1703 if (reg & 0xff00) {
1704 outb_p(W83781D_REG_BANK,
1705 data->isa_addr + W83781D_ADDR_REG_OFFSET);
1706 outb_p(reg >> 8,
1707 data->isa_addr + W83781D_DATA_REG_OFFSET);
1708 }
1709 outb_p(reg & 0xff, data->isa_addr + W83781D_ADDR_REG_OFFSET);
1710 if (word_sized) {
1711 outb_p(value >> 8,
1712 data->isa_addr + W83781D_DATA_REG_OFFSET);
1713 outb_p((reg & 0xff) + 1,
1714 data->isa_addr + W83781D_ADDR_REG_OFFSET);
1715 }
1716 outb_p(value & 0xff, data->isa_addr + W83781D_DATA_REG_OFFSET);
1717 if (reg & 0xff00) {
1718 outb_p(W83781D_REG_BANK,
1719 data->isa_addr + W83781D_ADDR_REG_OFFSET);
1720 outb_p(0, data->isa_addr + W83781D_DATA_REG_OFFSET);
1721 }
1722 }
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732 static int
1733 w83781d_read_value(struct w83781d_data *data, u16 reg)
1734 {
1735 struct i2c_client *client = data->client;
1736 int res;
1737
1738 mutex_lock(&data->lock);
1739 if (client)
1740 res = w83781d_read_value_i2c(data, reg);
1741 else
1742 res = w83781d_read_value_isa(data, reg);
1743 mutex_unlock(&data->lock);
1744 return res;
1745 }
1746
1747 static int
1748 w83781d_write_value(struct w83781d_data *data, u16 reg, u16 value)
1749 {
1750 struct i2c_client *client = data->client;
1751
1752 mutex_lock(&data->lock);
1753 if (client)
1754 w83781d_write_value_i2c(data, reg, value);
1755 else
1756 w83781d_write_value_isa(data, reg, value);
1757 mutex_unlock(&data->lock);
1758 return 0;
1759 }
1760
1761 static int
1762 w83781d_isa_probe(struct platform_device *pdev)
1763 {
1764 int err, reg;
1765 struct w83781d_data *data;
1766 struct resource *res;
1767
1768
1769 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1770 if (!devm_request_region(&pdev->dev,
1771 res->start + W83781D_ADDR_REG_OFFSET, 2,
1772 "w83781d"))
1773 return -EBUSY;
1774
1775 data = devm_kzalloc(&pdev->dev, sizeof(struct w83781d_data),
1776 GFP_KERNEL);
1777 if (!data)
1778 return -ENOMEM;
1779
1780 mutex_init(&data->lock);
1781 data->isa_addr = res->start;
1782 platform_set_drvdata(pdev, data);
1783
1784 reg = w83781d_read_value(data, W83781D_REG_WCHIPID);
1785 switch (reg) {
1786 case 0x30:
1787 data->type = w83782d;
1788 data->name = "w83782d";
1789 break;
1790 default:
1791 data->type = w83781d;
1792 data->name = "w83781d";
1793 }
1794
1795
1796 w83781d_init_device(&pdev->dev);
1797
1798
1799 err = w83781d_create_files(&pdev->dev, data->type, 1);
1800 if (err)
1801 goto exit_remove_files;
1802
1803 err = device_create_file(&pdev->dev, &dev_attr_name);
1804 if (err)
1805 goto exit_remove_files;
1806
1807 data->hwmon_dev = hwmon_device_register(&pdev->dev);
1808 if (IS_ERR(data->hwmon_dev)) {
1809 err = PTR_ERR(data->hwmon_dev);
1810 goto exit_remove_files;
1811 }
1812
1813 return 0;
1814
1815 exit_remove_files:
1816 w83781d_remove_files(&pdev->dev);
1817 device_remove_file(&pdev->dev, &dev_attr_name);
1818 return err;
1819 }
1820
1821 static int
1822 w83781d_isa_remove(struct platform_device *pdev)
1823 {
1824 struct w83781d_data *data = platform_get_drvdata(pdev);
1825
1826 hwmon_device_unregister(data->hwmon_dev);
1827 w83781d_remove_files(&pdev->dev);
1828 device_remove_file(&pdev->dev, &dev_attr_name);
1829
1830 return 0;
1831 }
1832
1833 static struct platform_driver w83781d_isa_driver = {
1834 .driver = {
1835 .name = "w83781d",
1836 },
1837 .probe = w83781d_isa_probe,
1838 .remove = w83781d_isa_remove,
1839 };
1840
1841
1842 static int __init
1843 w83781d_isa_found(unsigned short address)
1844 {
1845 int val, save, found = 0;
1846 int port;
1847
1848
1849
1850
1851
1852
1853 for (port = address; port < address + W83781D_EXTENT; port++) {
1854 if (!request_region(port, 1, "w83781d")) {
1855 pr_debug("Failed to request port 0x%x\n", port);
1856 goto release;
1857 }
1858 }
1859
1860 #define REALLY_SLOW_IO
1861
1862
1863
1864
1865 val = inb_p(address + 1);
1866 if (inb_p(address + 2) != val
1867 || inb_p(address + 3) != val
1868 || inb_p(address + 7) != val) {
1869 pr_debug("Detection failed at step %d\n", 1);
1870 goto release;
1871 }
1872 #undef REALLY_SLOW_IO
1873
1874
1875
1876
1877
1878 save = inb_p(address + W83781D_ADDR_REG_OFFSET);
1879 if (save & 0x80) {
1880 pr_debug("Detection failed at step %d\n", 2);
1881 goto release;
1882 }
1883 val = ~save & 0x7f;
1884 outb_p(val, address + W83781D_ADDR_REG_OFFSET);
1885 if (inb_p(address + W83781D_ADDR_REG_OFFSET) != (val | 0x80)) {
1886 outb_p(save, address + W83781D_ADDR_REG_OFFSET);
1887 pr_debug("Detection failed at step %d\n", 3);
1888 goto release;
1889 }
1890
1891
1892 outb_p(W83781D_REG_CONFIG, address + W83781D_ADDR_REG_OFFSET);
1893 val = inb_p(address + W83781D_DATA_REG_OFFSET);
1894 if (val & 0x80) {
1895 pr_debug("Detection failed at step %d\n", 4);
1896 goto release;
1897 }
1898 outb_p(W83781D_REG_BANK, address + W83781D_ADDR_REG_OFFSET);
1899 save = inb_p(address + W83781D_DATA_REG_OFFSET);
1900 outb_p(W83781D_REG_CHIPMAN, address + W83781D_ADDR_REG_OFFSET);
1901 val = inb_p(address + W83781D_DATA_REG_OFFSET);
1902 if ((!(save & 0x80) && (val != 0xa3))
1903 || ((save & 0x80) && (val != 0x5c))) {
1904 pr_debug("Detection failed at step %d\n", 5);
1905 goto release;
1906 }
1907 outb_p(W83781D_REG_I2C_ADDR, address + W83781D_ADDR_REG_OFFSET);
1908 val = inb_p(address + W83781D_DATA_REG_OFFSET);
1909 if (val < 0x03 || val > 0x77) {
1910 pr_debug("Detection failed at step %d\n", 6);
1911 goto release;
1912 }
1913
1914
1915 if (inb_p(address + W83781D_ADDR_REG_OFFSET) & 0x80) {
1916 pr_debug("Detection failed at step %d\n", 7);
1917 goto release;
1918 }
1919
1920
1921 outb_p(W83781D_REG_BANK, address + W83781D_ADDR_REG_OFFSET);
1922 save = inb_p(address + W83781D_DATA_REG_OFFSET);
1923 outb_p(save & 0xf8, address + W83781D_DATA_REG_OFFSET);
1924 outb_p(W83781D_REG_WCHIPID, address + W83781D_ADDR_REG_OFFSET);
1925 val = inb_p(address + W83781D_DATA_REG_OFFSET);
1926 if ((val & 0xfe) == 0x10
1927 || val == 0x30)
1928 found = 1;
1929
1930 if (found)
1931 pr_info("Found a %s chip at %#x\n",
1932 val == 0x30 ? "W83782D" : "W83781D", (int)address);
1933
1934 release:
1935 for (port--; port >= address; port--)
1936 release_region(port, 1);
1937 return found;
1938 }
1939
1940 static int __init
1941 w83781d_isa_device_add(unsigned short address)
1942 {
1943 struct resource res = {
1944 .start = address,
1945 .end = address + W83781D_EXTENT - 1,
1946 .name = "w83781d",
1947 .flags = IORESOURCE_IO,
1948 };
1949 int err;
1950
1951 pdev = platform_device_alloc("w83781d", address);
1952 if (!pdev) {
1953 err = -ENOMEM;
1954 pr_err("Device allocation failed\n");
1955 goto exit;
1956 }
1957
1958 err = platform_device_add_resources(pdev, &res, 1);
1959 if (err) {
1960 pr_err("Device resource addition failed (%d)\n", err);
1961 goto exit_device_put;
1962 }
1963
1964 err = platform_device_add(pdev);
1965 if (err) {
1966 pr_err("Device addition failed (%d)\n", err);
1967 goto exit_device_put;
1968 }
1969
1970 return 0;
1971
1972 exit_device_put:
1973 platform_device_put(pdev);
1974 exit:
1975 pdev = NULL;
1976 return err;
1977 }
1978
1979 static int __init
1980 w83781d_isa_register(void)
1981 {
1982 int res;
1983
1984 if (w83781d_isa_found(isa_address)) {
1985 res = platform_driver_register(&w83781d_isa_driver);
1986 if (res)
1987 goto exit;
1988
1989
1990 res = w83781d_isa_device_add(isa_address);
1991 if (res)
1992 goto exit_unreg_isa_driver;
1993 }
1994
1995 return 0;
1996
1997 exit_unreg_isa_driver:
1998 platform_driver_unregister(&w83781d_isa_driver);
1999 exit:
2000 return res;
2001 }
2002
2003 static void
2004 w83781d_isa_unregister(void)
2005 {
2006 if (pdev) {
2007 platform_device_unregister(pdev);
2008 platform_driver_unregister(&w83781d_isa_driver);
2009 }
2010 }
2011 #else
2012
2013 static struct w83781d_data *w83781d_data_if_isa(void)
2014 {
2015 return NULL;
2016 }
2017
2018 static int
2019 w83781d_alias_detect(struct i2c_client *client, u8 chipid)
2020 {
2021 return 0;
2022 }
2023
2024 static int
2025 w83781d_read_value(struct w83781d_data *data, u16 reg)
2026 {
2027 int res;
2028
2029 mutex_lock(&data->lock);
2030 res = w83781d_read_value_i2c(data, reg);
2031 mutex_unlock(&data->lock);
2032
2033 return res;
2034 }
2035
2036 static int
2037 w83781d_write_value(struct w83781d_data *data, u16 reg, u16 value)
2038 {
2039 mutex_lock(&data->lock);
2040 w83781d_write_value_i2c(data, reg, value);
2041 mutex_unlock(&data->lock);
2042
2043 return 0;
2044 }
2045
2046 static int __init
2047 w83781d_isa_register(void)
2048 {
2049 return 0;
2050 }
2051
2052 static void
2053 w83781d_isa_unregister(void)
2054 {
2055 }
2056 #endif
2057
2058 static int __init
2059 sensors_w83781d_init(void)
2060 {
2061 int res;
2062
2063
2064
2065
2066
2067 res = w83781d_isa_register();
2068 if (res)
2069 goto exit;
2070
2071 res = i2c_add_driver(&w83781d_driver);
2072 if (res)
2073 goto exit_unreg_isa;
2074
2075 return 0;
2076
2077 exit_unreg_isa:
2078 w83781d_isa_unregister();
2079 exit:
2080 return res;
2081 }
2082
2083 static void __exit
2084 sensors_w83781d_exit(void)
2085 {
2086 w83781d_isa_unregister();
2087 i2c_del_driver(&w83781d_driver);
2088 }
2089
2090 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, "
2091 "Philip Edelbrock <phil@netroedge.com>, "
2092 "and Mark Studebaker <mdsxyz123@yahoo.com>");
2093 MODULE_DESCRIPTION("W83781D driver");
2094 MODULE_LICENSE("GPL");
2095
2096 module_init(sensors_w83781d_init);
2097 module_exit(sensors_w83781d_exit);