0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #include <linux/bits.h>
0032 #include <linux/init.h>
0033 #include <linux/module.h>
0034 #include <linux/slab.h>
0035 #include <linux/i2c.h>
0036 #include <linux/hwmon-sysfs.h>
0037 #include <linux/hwmon.h>
0038 #include <linux/hwmon-vid.h>
0039 #include <linux/err.h>
0040 #include <linux/mutex.h>
0041 #include <linux/regmap.h>
0042
0043
0044 static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f,
0045 I2C_CLIENT_END };
0046
0047 enum chips { adm9240, ds1780, lm81 };
0048
0049
0050 #define ADM9240_REG_MAN_ID 0x3e
0051 #define ADM9240_REG_DIE_REV 0x3f
0052 #define ADM9240_REG_CONFIG 0x40
0053
0054 #define ADM9240_REG_IN(nr) (0x20 + (nr))
0055 #define ADM9240_REG_IN_MAX(nr) (0x2b + (nr) * 2)
0056 #define ADM9240_REG_IN_MIN(nr) (0x2c + (nr) * 2)
0057 #define ADM9240_REG_FAN(nr) (0x28 + (nr))
0058 #define ADM9240_REG_FAN_MIN(nr) (0x3b + (nr))
0059 #define ADM9240_REG_INT(nr) (0x41 + (nr))
0060 #define ADM9240_REG_INT_MASK(nr) (0x43 + (nr))
0061 #define ADM9240_REG_TEMP 0x27
0062 #define ADM9240_REG_TEMP_MAX(nr) (0x39 + (nr))
0063 #define ADM9240_REG_ANALOG_OUT 0x19
0064 #define ADM9240_REG_CHASSIS_CLEAR 0x46
0065 #define ADM9240_REG_VID_FAN_DIV 0x47
0066 #define ADM9240_REG_I2C_ADDR 0x48
0067 #define ADM9240_REG_VID4 0x49
0068 #define ADM9240_REG_TEMP_CONF 0x4b
0069
0070
0071 static inline int SCALE(long val, int mul, int div)
0072 {
0073 if (val < 0)
0074 return (val * mul - div / 2) / div;
0075 else
0076 return (val * mul + div / 2) / div;
0077 }
0078
0079
0080 static const u16 nom_mv[] = { 2500, 2700, 3300, 5000, 12000, 2700 };
0081
0082 static inline unsigned int IN_FROM_REG(u8 reg, int n)
0083 {
0084 return SCALE(reg, nom_mv[n], 192);
0085 }
0086
0087 static inline u8 IN_TO_REG(unsigned long val, int n)
0088 {
0089 val = clamp_val(val, 0, nom_mv[n] * 255 / 192);
0090 return SCALE(val, 192, nom_mv[n]);
0091 }
0092
0093
0094 static inline s8 TEMP_TO_REG(long val)
0095 {
0096 val = clamp_val(val, -40000, 127000);
0097 return SCALE(val, 1, 1000);
0098 }
0099
0100
0101 static inline unsigned int FAN_FROM_REG(u8 reg, u8 div)
0102 {
0103 if (!reg)
0104 return -1;
0105
0106 if (reg == 255)
0107 return 0;
0108
0109 return SCALE(1350000, 1, reg * div);
0110 }
0111
0112
0113 static inline u8 AOUT_TO_REG(unsigned long val)
0114 {
0115 val = clamp_val(val, 0, 1250);
0116 return SCALE(val, 255, 1250);
0117 }
0118
0119 static inline unsigned int AOUT_FROM_REG(u8 reg)
0120 {
0121 return SCALE(reg, 1250, 255);
0122 }
0123
0124
0125 struct adm9240_data {
0126 struct device *dev;
0127 struct regmap *regmap;
0128 struct mutex update_lock;
0129
0130 u8 fan_div[2];
0131 u8 vrm;
0132 };
0133
0134
0135 static int adm9240_write_fan_div(struct adm9240_data *data, int channel, u8 fan_div)
0136 {
0137 unsigned int reg, old, shift = (channel + 2) * 2;
0138 int err;
0139
0140 err = regmap_read(data->regmap, ADM9240_REG_VID_FAN_DIV, ®);
0141 if (err < 0)
0142 return err;
0143 old = (reg >> shift) & 3;
0144 reg &= ~(3 << shift);
0145 reg |= (fan_div << shift);
0146 err = regmap_write(data->regmap, ADM9240_REG_VID_FAN_DIV, reg);
0147 if (err < 0)
0148 return err;
0149 dev_dbg(data->dev,
0150 "fan%d clock divider changed from %lu to %lu\n",
0151 channel + 1, BIT(old), BIT(fan_div));
0152
0153 return 0;
0154 }
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167 static int adm9240_fan_min_write(struct adm9240_data *data, int channel, long val)
0168 {
0169 u8 new_div;
0170 u8 fan_min;
0171 int err;
0172
0173 mutex_lock(&data->update_lock);
0174
0175 if (!val) {
0176 fan_min = 255;
0177 new_div = data->fan_div[channel];
0178
0179 dev_dbg(data->dev, "fan%u low limit set disabled\n", channel + 1);
0180 } else if (val < 1350000 / (8 * 254)) {
0181 new_div = 3;
0182 fan_min = 254;
0183
0184 dev_dbg(data->dev, "fan%u low limit set minimum %u\n",
0185 channel + 1, FAN_FROM_REG(254, BIT(new_div)));
0186 } else {
0187 unsigned int new_min = 1350000 / val;
0188
0189 new_div = 0;
0190 while (new_min > 192 && new_div < 3) {
0191 new_div++;
0192 new_min /= 2;
0193 }
0194 if (!new_min)
0195 new_min++;
0196
0197 fan_min = new_min;
0198
0199 dev_dbg(data->dev, "fan%u low limit set fan speed %u\n",
0200 channel + 1, FAN_FROM_REG(new_min, BIT(new_div)));
0201 }
0202
0203 if (new_div != data->fan_div[channel]) {
0204 data->fan_div[channel] = new_div;
0205 adm9240_write_fan_div(data, channel, new_div);
0206 }
0207 err = regmap_write(data->regmap, ADM9240_REG_FAN_MIN(channel), fan_min);
0208
0209 mutex_unlock(&data->update_lock);
0210
0211 return err;
0212 }
0213
0214 static ssize_t cpu0_vid_show(struct device *dev,
0215 struct device_attribute *attr, char *buf)
0216 {
0217 struct adm9240_data *data = dev_get_drvdata(dev);
0218 unsigned int regval;
0219 int err;
0220 u8 vid;
0221
0222 err = regmap_read(data->regmap, ADM9240_REG_VID_FAN_DIV, ®val);
0223 if (err < 0)
0224 return err;
0225 vid = regval & 0x0f;
0226 err = regmap_read(data->regmap, ADM9240_REG_VID4, ®val);
0227 if (err < 0)
0228 return err;
0229 vid |= (regval & 1) << 4;
0230 return sprintf(buf, "%d\n", vid_from_reg(vid, data->vrm));
0231 }
0232 static DEVICE_ATTR_RO(cpu0_vid);
0233
0234 static ssize_t aout_output_show(struct device *dev,
0235 struct device_attribute *attr, char *buf)
0236 {
0237 struct adm9240_data *data = dev_get_drvdata(dev);
0238 unsigned int regval;
0239 int err;
0240
0241 err = regmap_read(data->regmap, ADM9240_REG_ANALOG_OUT, ®val);
0242 if (err)
0243 return err;
0244
0245 return sprintf(buf, "%d\n", AOUT_FROM_REG(regval));
0246 }
0247
0248 static ssize_t aout_output_store(struct device *dev,
0249 struct device_attribute *attr,
0250 const char *buf, size_t count)
0251 {
0252 struct adm9240_data *data = dev_get_drvdata(dev);
0253 long val;
0254 int err;
0255
0256 err = kstrtol(buf, 10, &val);
0257 if (err)
0258 return err;
0259
0260 err = regmap_write(data->regmap, ADM9240_REG_ANALOG_OUT, AOUT_TO_REG(val));
0261 return err < 0 ? err : count;
0262 }
0263 static DEVICE_ATTR_RW(aout_output);
0264
0265 static struct attribute *adm9240_attrs[] = {
0266 &dev_attr_aout_output.attr,
0267 &dev_attr_cpu0_vid.attr,
0268 NULL
0269 };
0270
0271 ATTRIBUTE_GROUPS(adm9240);
0272
0273
0274
0275
0276 static int adm9240_detect(struct i2c_client *new_client,
0277 struct i2c_board_info *info)
0278 {
0279 struct i2c_adapter *adapter = new_client->adapter;
0280 const char *name = "";
0281 int address = new_client->addr;
0282 u8 man_id, die_rev;
0283
0284 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
0285 return -ENODEV;
0286
0287
0288 if (i2c_smbus_read_byte_data(new_client, ADM9240_REG_I2C_ADDR) != address)
0289 return -ENODEV;
0290
0291
0292 man_id = i2c_smbus_read_byte_data(new_client, ADM9240_REG_MAN_ID);
0293 if (man_id == 0x23)
0294 name = "adm9240";
0295 else if (man_id == 0xda)
0296 name = "ds1780";
0297 else if (man_id == 0x01)
0298 name = "lm81";
0299 else
0300 return -ENODEV;
0301
0302
0303 die_rev = i2c_smbus_read_byte_data(new_client, ADM9240_REG_DIE_REV);
0304 dev_info(&adapter->dev, "found %s revision %u\n",
0305 man_id == 0x23 ? "ADM9240" :
0306 man_id == 0xda ? "DS1780" : "LM81", die_rev);
0307
0308 strscpy(info->type, name, I2C_NAME_SIZE);
0309
0310 return 0;
0311 }
0312
0313 static int adm9240_init_client(struct adm9240_data *data)
0314 {
0315 unsigned int regval;
0316 u8 conf, mode;
0317 int err;
0318
0319 err = regmap_raw_read(data->regmap, ADM9240_REG_CONFIG, &conf, 1);
0320 if (err < 0)
0321 return err;
0322 err = regmap_raw_read(data->regmap, ADM9240_REG_TEMP_CONF, &mode, 1);
0323 if (err < 0)
0324 return err;
0325 mode &= 3;
0326
0327 data->vrm = vid_which_vrm();
0328
0329 dev_info(data->dev, "Using VRM: %d.%d\n", data->vrm / 10,
0330 data->vrm % 10);
0331
0332 if (conf & 1) {
0333
0334 dev_info(data->dev, "status: config 0x%02x mode %u\n",
0335 conf, mode);
0336
0337 } else {
0338 int i;
0339
0340 for (i = 0; i < 6; i++) {
0341 err = regmap_write(data->regmap,
0342 ADM9240_REG_IN_MIN(i), 0);
0343 if (err < 0)
0344 return err;
0345 err = regmap_write(data->regmap,
0346 ADM9240_REG_IN_MAX(i), 255);
0347 if (err < 0)
0348 return err;
0349 }
0350 for (i = 0; i < 2; i++) {
0351 err = regmap_write(data->regmap,
0352 ADM9240_REG_FAN_MIN(i), 255);
0353 if (err < 0)
0354 return err;
0355 }
0356 for (i = 0; i < 2; i++) {
0357 err = regmap_write(data->regmap,
0358 ADM9240_REG_TEMP_MAX(i), 127);
0359 if (err < 0)
0360 return err;
0361 }
0362
0363
0364 err = regmap_write(data->regmap, ADM9240_REG_CONFIG, 1);
0365 if (err < 0)
0366 return err;
0367
0368 dev_info(data->dev,
0369 "cold start: config was 0x%02x mode %u\n", conf, mode);
0370 }
0371
0372
0373 err = regmap_read(data->regmap, ADM9240_REG_VID_FAN_DIV, ®val);
0374 if (err < 0)
0375 return err;
0376 data->fan_div[0] = (regval >> 4) & 3;
0377 data->fan_div[1] = (regval >> 6) & 3;
0378 return 0;
0379 }
0380
0381 static int adm9240_chip_read(struct device *dev, u32 attr, long *val)
0382 {
0383 struct adm9240_data *data = dev_get_drvdata(dev);
0384 u8 regs[2];
0385 int err;
0386
0387 switch (attr) {
0388 case hwmon_chip_alarms:
0389 err = regmap_bulk_read(data->regmap, ADM9240_REG_INT(0), ®s, 2);
0390 if (err < 0)
0391 return err;
0392 *val = regs[0] | regs[1] << 8;
0393 break;
0394 default:
0395 return -EOPNOTSUPP;
0396 }
0397 return 0;
0398 }
0399
0400 static int adm9240_intrusion_read(struct device *dev, u32 attr, long *val)
0401 {
0402 struct adm9240_data *data = dev_get_drvdata(dev);
0403 unsigned int regval;
0404 int err;
0405
0406 switch (attr) {
0407 case hwmon_intrusion_alarm:
0408 err = regmap_read(data->regmap, ADM9240_REG_INT(1), ®val);
0409 if (err < 0)
0410 return err;
0411 *val = !!(regval & BIT(4));
0412 break;
0413 default:
0414 return -EOPNOTSUPP;
0415 }
0416 return 0;
0417 }
0418
0419 static int adm9240_intrusion_write(struct device *dev, u32 attr, long val)
0420 {
0421 struct adm9240_data *data = dev_get_drvdata(dev);
0422 int err;
0423
0424 switch (attr) {
0425 case hwmon_intrusion_alarm:
0426 if (val)
0427 return -EINVAL;
0428 err = regmap_write(data->regmap, ADM9240_REG_CHASSIS_CLEAR, 0x80);
0429 if (err < 0)
0430 return err;
0431 dev_dbg(data->dev, "chassis intrusion latch cleared\n");
0432 break;
0433 default:
0434 return -EOPNOTSUPP;
0435 }
0436 return 0;
0437 }
0438
0439 static int adm9240_in_read(struct device *dev, u32 attr, int channel, long *val)
0440 {
0441 struct adm9240_data *data = dev_get_drvdata(dev);
0442 unsigned int regval;
0443 int reg;
0444 int err;
0445
0446 switch (attr) {
0447 case hwmon_in_input:
0448 reg = ADM9240_REG_IN(channel);
0449 break;
0450 case hwmon_in_min:
0451 reg = ADM9240_REG_IN_MIN(channel);
0452 break;
0453 case hwmon_in_max:
0454 reg = ADM9240_REG_IN_MAX(channel);
0455 break;
0456 case hwmon_in_alarm:
0457 if (channel < 4) {
0458 reg = ADM9240_REG_INT(0);
0459 } else {
0460 reg = ADM9240_REG_INT(1);
0461 channel -= 4;
0462 }
0463 err = regmap_read(data->regmap, reg, ®val);
0464 if (err < 0)
0465 return err;
0466 *val = !!(regval & BIT(channel));
0467 return 0;
0468 default:
0469 return -EOPNOTSUPP;
0470 }
0471 err = regmap_read(data->regmap, reg, ®val);
0472 if (err < 0)
0473 return err;
0474 *val = IN_FROM_REG(regval, channel);
0475 return 0;
0476 }
0477
0478 static int adm9240_in_write(struct device *dev, u32 attr, int channel, long val)
0479 {
0480 struct adm9240_data *data = dev_get_drvdata(dev);
0481 int reg;
0482
0483 switch (attr) {
0484 case hwmon_in_min:
0485 reg = ADM9240_REG_IN_MIN(channel);
0486 break;
0487 case hwmon_in_max:
0488 reg = ADM9240_REG_IN_MAX(channel);
0489 break;
0490 default:
0491 return -EOPNOTSUPP;
0492 }
0493 return regmap_write(data->regmap, reg, IN_TO_REG(val, channel));
0494 }
0495
0496 static int adm9240_fan_read(struct device *dev, u32 attr, int channel, long *val)
0497 {
0498 struct adm9240_data *data = dev_get_drvdata(dev);
0499 unsigned int regval;
0500 int err;
0501
0502 switch (attr) {
0503 case hwmon_fan_input:
0504 err = regmap_read(data->regmap, ADM9240_REG_FAN(channel), ®val);
0505 if (err < 0)
0506 return err;
0507 if (regval == 255 && data->fan_div[channel] < 3) {
0508
0509 err = adm9240_write_fan_div(data, channel,
0510 ++data->fan_div[channel]);
0511 if (err)
0512 return err;
0513 }
0514 *val = FAN_FROM_REG(regval, BIT(data->fan_div[channel]));
0515 break;
0516 case hwmon_fan_div:
0517 *val = BIT(data->fan_div[channel]);
0518 break;
0519 case hwmon_fan_min:
0520 err = regmap_read(data->regmap, ADM9240_REG_FAN_MIN(channel), ®val);
0521 if (err < 0)
0522 return err;
0523 *val = FAN_FROM_REG(regval, BIT(data->fan_div[channel]));
0524 break;
0525 case hwmon_fan_alarm:
0526 err = regmap_read(data->regmap, ADM9240_REG_INT(0), ®val);
0527 if (err < 0)
0528 return err;
0529 *val = !!(regval & BIT(channel + 6));
0530 break;
0531 default:
0532 return -EOPNOTSUPP;
0533 }
0534 return 0;
0535 }
0536
0537 static int adm9240_fan_write(struct device *dev, u32 attr, int channel, long val)
0538 {
0539 struct adm9240_data *data = dev_get_drvdata(dev);
0540 int err;
0541
0542 switch (attr) {
0543 case hwmon_fan_min:
0544 err = adm9240_fan_min_write(data, channel, val);
0545 if (err < 0)
0546 return err;
0547 break;
0548 default:
0549 return -EOPNOTSUPP;
0550 }
0551 return 0;
0552 }
0553
0554 static int adm9240_temp_read(struct device *dev, u32 attr, int channel, long *val)
0555 {
0556 struct adm9240_data *data = dev_get_drvdata(dev);
0557 unsigned int regval;
0558 int err, temp;
0559
0560 switch (attr) {
0561 case hwmon_temp_input:
0562 err = regmap_read(data->regmap, ADM9240_REG_TEMP, ®val);
0563 if (err < 0)
0564 return err;
0565 temp = regval << 1;
0566 err = regmap_read(data->regmap, ADM9240_REG_TEMP_CONF, ®val);
0567 if (err < 0)
0568 return err;
0569 temp |= regval >> 7;
0570 *val = sign_extend32(temp, 8) * 500;
0571 break;
0572 case hwmon_temp_max:
0573 err = regmap_read(data->regmap, ADM9240_REG_TEMP_MAX(0), ®val);
0574 if (err < 0)
0575 return err;
0576 *val = (s8)regval * 1000;
0577 break;
0578 case hwmon_temp_max_hyst:
0579 err = regmap_read(data->regmap, ADM9240_REG_TEMP_MAX(1), ®val);
0580 if (err < 0)
0581 return err;
0582 *val = (s8)regval * 1000;
0583 break;
0584 case hwmon_temp_alarm:
0585 err = regmap_read(data->regmap, ADM9240_REG_INT(0), ®val);
0586 if (err < 0)
0587 return err;
0588 *val = !!(regval & BIT(4));
0589 break;
0590 default:
0591 return -EOPNOTSUPP;
0592 }
0593 return 0;
0594 }
0595
0596 static int adm9240_temp_write(struct device *dev, u32 attr, int channel, long val)
0597 {
0598 struct adm9240_data *data = dev_get_drvdata(dev);
0599 int reg;
0600
0601 switch (attr) {
0602 case hwmon_temp_max:
0603 reg = ADM9240_REG_TEMP_MAX(0);
0604 break;
0605 case hwmon_temp_max_hyst:
0606 reg = ADM9240_REG_TEMP_MAX(1);
0607 break;
0608 default:
0609 return -EOPNOTSUPP;
0610 }
0611 return regmap_write(data->regmap, reg, TEMP_TO_REG(val));
0612 }
0613
0614 static int adm9240_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
0615 int channel, long *val)
0616 {
0617 switch (type) {
0618 case hwmon_chip:
0619 return adm9240_chip_read(dev, attr, val);
0620 case hwmon_intrusion:
0621 return adm9240_intrusion_read(dev, attr, val);
0622 case hwmon_in:
0623 return adm9240_in_read(dev, attr, channel, val);
0624 case hwmon_fan:
0625 return adm9240_fan_read(dev, attr, channel, val);
0626 case hwmon_temp:
0627 return adm9240_temp_read(dev, attr, channel, val);
0628 default:
0629 return -EOPNOTSUPP;
0630 }
0631 }
0632
0633 static int adm9240_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
0634 int channel, long val)
0635 {
0636 switch (type) {
0637 case hwmon_intrusion:
0638 return adm9240_intrusion_write(dev, attr, val);
0639 case hwmon_in:
0640 return adm9240_in_write(dev, attr, channel, val);
0641 case hwmon_fan:
0642 return adm9240_fan_write(dev, attr, channel, val);
0643 case hwmon_temp:
0644 return adm9240_temp_write(dev, attr, channel, val);
0645 default:
0646 return -EOPNOTSUPP;
0647 }
0648 }
0649
0650 static umode_t adm9240_is_visible(const void *_data, enum hwmon_sensor_types type,
0651 u32 attr, int channel)
0652 {
0653 umode_t mode = 0;
0654
0655 switch (type) {
0656 case hwmon_chip:
0657 switch (attr) {
0658 case hwmon_chip_alarms:
0659 mode = 0444;
0660 break;
0661 default:
0662 break;
0663 }
0664 break;
0665 case hwmon_intrusion:
0666 switch (attr) {
0667 case hwmon_intrusion_alarm:
0668 mode = 0644;
0669 break;
0670 default:
0671 break;
0672 }
0673 break;
0674 case hwmon_temp:
0675 switch (attr) {
0676 case hwmon_temp:
0677 case hwmon_temp_alarm:
0678 mode = 0444;
0679 break;
0680 case hwmon_temp_max:
0681 case hwmon_temp_max_hyst:
0682 mode = 0644;
0683 break;
0684 default:
0685 break;
0686 }
0687 break;
0688 case hwmon_fan:
0689 switch (attr) {
0690 case hwmon_fan_input:
0691 case hwmon_fan_div:
0692 case hwmon_fan_alarm:
0693 mode = 0444;
0694 break;
0695 case hwmon_fan_min:
0696 mode = 0644;
0697 break;
0698 default:
0699 break;
0700 }
0701 break;
0702 case hwmon_in:
0703 switch (attr) {
0704 case hwmon_in_input:
0705 case hwmon_in_alarm:
0706 mode = 0444;
0707 break;
0708 case hwmon_in_min:
0709 case hwmon_in_max:
0710 mode = 0644;
0711 break;
0712 default:
0713 break;
0714 }
0715 break;
0716 default:
0717 break;
0718 }
0719 return mode;
0720 }
0721
0722 static const struct hwmon_ops adm9240_hwmon_ops = {
0723 .is_visible = adm9240_is_visible,
0724 .read = adm9240_read,
0725 .write = adm9240_write,
0726 };
0727
0728 static const struct hwmon_channel_info *adm9240_info[] = {
0729 HWMON_CHANNEL_INFO(chip, HWMON_C_ALARMS),
0730 HWMON_CHANNEL_INFO(intrusion, HWMON_INTRUSION_ALARM),
0731 HWMON_CHANNEL_INFO(temp,
0732 HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MAX_HYST | HWMON_T_ALARM),
0733 HWMON_CHANNEL_INFO(in,
0734 HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
0735 HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
0736 HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
0737 HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
0738 HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM,
0739 HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX | HWMON_I_ALARM),
0740 HWMON_CHANNEL_INFO(fan,
0741 HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_DIV | HWMON_F_ALARM,
0742 HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_DIV | HWMON_F_ALARM),
0743 NULL
0744 };
0745
0746 static const struct hwmon_chip_info adm9240_chip_info = {
0747 .ops = &adm9240_hwmon_ops,
0748 .info = adm9240_info,
0749 };
0750
0751 static bool adm9240_volatile_reg(struct device *dev, unsigned int reg)
0752 {
0753 switch (reg) {
0754 case ADM9240_REG_IN(0) ... ADM9240_REG_IN(5):
0755 case ADM9240_REG_FAN(0) ... ADM9240_REG_FAN(1):
0756 case ADM9240_REG_INT(0) ... ADM9240_REG_INT(1):
0757 case ADM9240_REG_TEMP:
0758 case ADM9240_REG_TEMP_CONF:
0759 case ADM9240_REG_VID_FAN_DIV:
0760 case ADM9240_REG_VID4:
0761 case ADM9240_REG_ANALOG_OUT:
0762 return true;
0763 default:
0764 return false;
0765 }
0766 }
0767
0768 static const struct regmap_config adm9240_regmap_config = {
0769 .reg_bits = 8,
0770 .val_bits = 8,
0771 .use_single_read = true,
0772 .use_single_write = true,
0773 .volatile_reg = adm9240_volatile_reg,
0774 };
0775
0776 static int adm9240_probe(struct i2c_client *client)
0777 {
0778 struct device *dev = &client->dev;
0779 struct device *hwmon_dev;
0780 struct adm9240_data *data;
0781 int err;
0782
0783 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
0784 if (!data)
0785 return -ENOMEM;
0786
0787 data->dev = dev;
0788 mutex_init(&data->update_lock);
0789 data->regmap = devm_regmap_init_i2c(client, &adm9240_regmap_config);
0790 if (IS_ERR(data->regmap))
0791 return PTR_ERR(data->regmap);
0792
0793 err = adm9240_init_client(data);
0794 if (err < 0)
0795 return err;
0796
0797 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data,
0798 &adm9240_chip_info,
0799 adm9240_groups);
0800 return PTR_ERR_OR_ZERO(hwmon_dev);
0801 }
0802
0803 static const struct i2c_device_id adm9240_id[] = {
0804 { "adm9240", adm9240 },
0805 { "ds1780", ds1780 },
0806 { "lm81", lm81 },
0807 { }
0808 };
0809 MODULE_DEVICE_TABLE(i2c, adm9240_id);
0810
0811 static struct i2c_driver adm9240_driver = {
0812 .class = I2C_CLASS_HWMON,
0813 .driver = {
0814 .name = "adm9240",
0815 },
0816 .probe_new = adm9240_probe,
0817 .id_table = adm9240_id,
0818 .detect = adm9240_detect,
0819 .address_list = normal_i2c,
0820 };
0821
0822 module_i2c_driver(adm9240_driver);
0823
0824 MODULE_AUTHOR("Michiel Rook <michiel@grendelproject.nl>, "
0825 "Grant Coady <gcoady.lk@gmail.com> and others");
0826 MODULE_DESCRIPTION("ADM9240/DS1780/LM81 driver");
0827 MODULE_LICENSE("GPL");