0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/module.h>
0012 #include <linux/init.h>
0013 #include <linux/slab.h>
0014 #include <linux/jiffies.h>
0015 #include <linux/i2c.h>
0016 #include <linux/hwmon.h>
0017 #include <linux/hwmon-sysfs.h>
0018 #include <linux/err.h>
0019 #include <linux/mutex.h>
0020 #include <linux/sysfs.h>
0021
0022 #define DRVNAME "lm95234"
0023
0024 enum chips { lm95233, lm95234 };
0025
0026 static const unsigned short normal_i2c[] = {
0027 0x18, 0x2a, 0x2b, 0x4d, 0x4e, I2C_CLIENT_END };
0028
0029
0030 #define LM95234_REG_MAN_ID 0xFE
0031 #define LM95234_REG_CHIP_ID 0xFF
0032 #define LM95234_REG_STATUS 0x02
0033 #define LM95234_REG_CONFIG 0x03
0034 #define LM95234_REG_CONVRATE 0x04
0035 #define LM95234_REG_STS_FAULT 0x07
0036 #define LM95234_REG_STS_TCRIT1 0x08
0037 #define LM95234_REG_STS_TCRIT2 0x09
0038 #define LM95234_REG_TEMPH(x) ((x) + 0x10)
0039 #define LM95234_REG_TEMPL(x) ((x) + 0x20)
0040 #define LM95234_REG_UTEMPH(x) ((x) + 0x19)
0041 #define LM95234_REG_UTEMPL(x) ((x) + 0x29)
0042 #define LM95234_REG_REM_MODEL 0x30
0043 #define LM95234_REG_REM_MODEL_STS 0x38
0044 #define LM95234_REG_OFFSET(x) ((x) + 0x31)
0045 #define LM95234_REG_TCRIT1(x) ((x) + 0x40)
0046 #define LM95234_REG_TCRIT2(x) ((x) + 0x49)
0047 #define LM95234_REG_TCRIT_HYST 0x5a
0048
0049 #define NATSEMI_MAN_ID 0x01
0050 #define LM95233_CHIP_ID 0x89
0051 #define LM95234_CHIP_ID 0x79
0052
0053
0054 struct lm95234_data {
0055 struct i2c_client *client;
0056 const struct attribute_group *groups[3];
0057 struct mutex update_lock;
0058 unsigned long last_updated, interval;
0059 bool valid;
0060
0061 int temp[5];
0062 u32 status;
0063 u8 tcrit1[5];
0064 u8 tcrit2[2];
0065 s8 toffset[4];
0066 u8 thyst;
0067
0068 u8 sensor_type;
0069 };
0070
0071 static int lm95234_read_temp(struct i2c_client *client, int index, int *t)
0072 {
0073 int val;
0074 u16 temp = 0;
0075
0076 if (index) {
0077 val = i2c_smbus_read_byte_data(client,
0078 LM95234_REG_UTEMPH(index - 1));
0079 if (val < 0)
0080 return val;
0081 temp = val << 8;
0082 val = i2c_smbus_read_byte_data(client,
0083 LM95234_REG_UTEMPL(index - 1));
0084 if (val < 0)
0085 return val;
0086 temp |= val;
0087 *t = temp;
0088 }
0089
0090
0091
0092
0093 if (!temp) {
0094 val = i2c_smbus_read_byte_data(client,
0095 LM95234_REG_TEMPH(index));
0096 if (val < 0)
0097 return val;
0098 temp = val << 8;
0099 val = i2c_smbus_read_byte_data(client,
0100 LM95234_REG_TEMPL(index));
0101 if (val < 0)
0102 return val;
0103 temp |= val;
0104 *t = (s16)temp;
0105 }
0106 return 0;
0107 }
0108
0109 static u16 update_intervals[] = { 143, 364, 1000, 2500 };
0110
0111
0112
0113 static int lm95234_fill_cache(struct lm95234_data *data,
0114 struct i2c_client *client)
0115 {
0116 int i, ret;
0117
0118 ret = i2c_smbus_read_byte_data(client, LM95234_REG_CONVRATE);
0119 if (ret < 0)
0120 return ret;
0121
0122 data->interval = msecs_to_jiffies(update_intervals[ret & 0x03]);
0123
0124 for (i = 0; i < ARRAY_SIZE(data->tcrit1); i++) {
0125 ret = i2c_smbus_read_byte_data(client, LM95234_REG_TCRIT1(i));
0126 if (ret < 0)
0127 return ret;
0128 data->tcrit1[i] = ret;
0129 }
0130 for (i = 0; i < ARRAY_SIZE(data->tcrit2); i++) {
0131 ret = i2c_smbus_read_byte_data(client, LM95234_REG_TCRIT2(i));
0132 if (ret < 0)
0133 return ret;
0134 data->tcrit2[i] = ret;
0135 }
0136 for (i = 0; i < ARRAY_SIZE(data->toffset); i++) {
0137 ret = i2c_smbus_read_byte_data(client, LM95234_REG_OFFSET(i));
0138 if (ret < 0)
0139 return ret;
0140 data->toffset[i] = ret;
0141 }
0142
0143 ret = i2c_smbus_read_byte_data(client, LM95234_REG_TCRIT_HYST);
0144 if (ret < 0)
0145 return ret;
0146 data->thyst = ret;
0147
0148 ret = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL);
0149 if (ret < 0)
0150 return ret;
0151 data->sensor_type = ret;
0152
0153 return 0;
0154 }
0155
0156 static int lm95234_update_device(struct lm95234_data *data)
0157 {
0158 struct i2c_client *client = data->client;
0159 int ret;
0160
0161 mutex_lock(&data->update_lock);
0162
0163 if (time_after(jiffies, data->last_updated + data->interval) ||
0164 !data->valid) {
0165 int i;
0166
0167 if (!data->valid) {
0168 ret = lm95234_fill_cache(data, client);
0169 if (ret < 0)
0170 goto abort;
0171 }
0172
0173 data->valid = false;
0174 for (i = 0; i < ARRAY_SIZE(data->temp); i++) {
0175 ret = lm95234_read_temp(client, i, &data->temp[i]);
0176 if (ret < 0)
0177 goto abort;
0178 }
0179
0180 ret = i2c_smbus_read_byte_data(client, LM95234_REG_STS_FAULT);
0181 if (ret < 0)
0182 goto abort;
0183 data->status = ret;
0184
0185 ret = i2c_smbus_read_byte_data(client, LM95234_REG_STS_TCRIT1);
0186 if (ret < 0)
0187 goto abort;
0188 data->status |= ret << 8;
0189
0190 ret = i2c_smbus_read_byte_data(client, LM95234_REG_STS_TCRIT2);
0191 if (ret < 0)
0192 goto abort;
0193 data->status |= ret << 16;
0194
0195 data->last_updated = jiffies;
0196 data->valid = true;
0197 }
0198 ret = 0;
0199 abort:
0200 mutex_unlock(&data->update_lock);
0201
0202 return ret;
0203 }
0204
0205 static ssize_t temp_show(struct device *dev, struct device_attribute *attr,
0206 char *buf)
0207 {
0208 struct lm95234_data *data = dev_get_drvdata(dev);
0209 int index = to_sensor_dev_attr(attr)->index;
0210 int ret = lm95234_update_device(data);
0211
0212 if (ret)
0213 return ret;
0214
0215 return sprintf(buf, "%d\n",
0216 DIV_ROUND_CLOSEST(data->temp[index] * 125, 32));
0217 }
0218
0219 static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
0220 char *buf)
0221 {
0222 struct lm95234_data *data = dev_get_drvdata(dev);
0223 u32 mask = to_sensor_dev_attr(attr)->index;
0224 int ret = lm95234_update_device(data);
0225
0226 if (ret)
0227 return ret;
0228
0229 return sprintf(buf, "%u", !!(data->status & mask));
0230 }
0231
0232 static ssize_t type_show(struct device *dev, struct device_attribute *attr,
0233 char *buf)
0234 {
0235 struct lm95234_data *data = dev_get_drvdata(dev);
0236 u8 mask = to_sensor_dev_attr(attr)->index;
0237 int ret = lm95234_update_device(data);
0238
0239 if (ret)
0240 return ret;
0241
0242 return sprintf(buf, data->sensor_type & mask ? "1\n" : "2\n");
0243 }
0244
0245 static ssize_t type_store(struct device *dev, struct device_attribute *attr,
0246 const char *buf, size_t count)
0247 {
0248 struct lm95234_data *data = dev_get_drvdata(dev);
0249 unsigned long val;
0250 u8 mask = to_sensor_dev_attr(attr)->index;
0251 int ret = lm95234_update_device(data);
0252
0253 if (ret)
0254 return ret;
0255
0256 ret = kstrtoul(buf, 10, &val);
0257 if (ret < 0)
0258 return ret;
0259
0260 if (val != 1 && val != 2)
0261 return -EINVAL;
0262
0263 mutex_lock(&data->update_lock);
0264 if (val == 1)
0265 data->sensor_type |= mask;
0266 else
0267 data->sensor_type &= ~mask;
0268 data->valid = false;
0269 i2c_smbus_write_byte_data(data->client, LM95234_REG_REM_MODEL,
0270 data->sensor_type);
0271 mutex_unlock(&data->update_lock);
0272
0273 return count;
0274 }
0275
0276 static ssize_t tcrit2_show(struct device *dev, struct device_attribute *attr,
0277 char *buf)
0278 {
0279 struct lm95234_data *data = dev_get_drvdata(dev);
0280 int index = to_sensor_dev_attr(attr)->index;
0281 int ret = lm95234_update_device(data);
0282
0283 if (ret)
0284 return ret;
0285
0286 return sprintf(buf, "%u", data->tcrit2[index] * 1000);
0287 }
0288
0289 static ssize_t tcrit2_store(struct device *dev, struct device_attribute *attr,
0290 const char *buf, size_t count)
0291 {
0292 struct lm95234_data *data = dev_get_drvdata(dev);
0293 int index = to_sensor_dev_attr(attr)->index;
0294 long val;
0295 int ret = lm95234_update_device(data);
0296
0297 if (ret)
0298 return ret;
0299
0300 ret = kstrtol(buf, 10, &val);
0301 if (ret < 0)
0302 return ret;
0303
0304 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, index ? 255 : 127);
0305
0306 mutex_lock(&data->update_lock);
0307 data->tcrit2[index] = val;
0308 i2c_smbus_write_byte_data(data->client, LM95234_REG_TCRIT2(index), val);
0309 mutex_unlock(&data->update_lock);
0310
0311 return count;
0312 }
0313
0314 static ssize_t tcrit2_hyst_show(struct device *dev,
0315 struct device_attribute *attr, char *buf)
0316 {
0317 struct lm95234_data *data = dev_get_drvdata(dev);
0318 int index = to_sensor_dev_attr(attr)->index;
0319 int ret = lm95234_update_device(data);
0320
0321 if (ret)
0322 return ret;
0323
0324
0325 return sprintf(buf, "%d",
0326 ((int)data->tcrit2[index] - (int)data->thyst) * 1000);
0327 }
0328
0329 static ssize_t tcrit1_show(struct device *dev, struct device_attribute *attr,
0330 char *buf)
0331 {
0332 struct lm95234_data *data = dev_get_drvdata(dev);
0333 int index = to_sensor_dev_attr(attr)->index;
0334
0335 return sprintf(buf, "%u", data->tcrit1[index] * 1000);
0336 }
0337
0338 static ssize_t tcrit1_store(struct device *dev, struct device_attribute *attr,
0339 const char *buf, size_t count)
0340 {
0341 struct lm95234_data *data = dev_get_drvdata(dev);
0342 int index = to_sensor_dev_attr(attr)->index;
0343 int ret = lm95234_update_device(data);
0344 long val;
0345
0346 if (ret)
0347 return ret;
0348
0349 ret = kstrtol(buf, 10, &val);
0350 if (ret < 0)
0351 return ret;
0352
0353 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 255);
0354
0355 mutex_lock(&data->update_lock);
0356 data->tcrit1[index] = val;
0357 i2c_smbus_write_byte_data(data->client, LM95234_REG_TCRIT1(index), val);
0358 mutex_unlock(&data->update_lock);
0359
0360 return count;
0361 }
0362
0363 static ssize_t tcrit1_hyst_show(struct device *dev,
0364 struct device_attribute *attr, char *buf)
0365 {
0366 struct lm95234_data *data = dev_get_drvdata(dev);
0367 int index = to_sensor_dev_attr(attr)->index;
0368 int ret = lm95234_update_device(data);
0369
0370 if (ret)
0371 return ret;
0372
0373
0374 return sprintf(buf, "%d",
0375 ((int)data->tcrit1[index] - (int)data->thyst) * 1000);
0376 }
0377
0378 static ssize_t tcrit1_hyst_store(struct device *dev,
0379 struct device_attribute *attr,
0380 const char *buf, size_t count)
0381 {
0382 struct lm95234_data *data = dev_get_drvdata(dev);
0383 int index = to_sensor_dev_attr(attr)->index;
0384 int ret = lm95234_update_device(data);
0385 long val;
0386
0387 if (ret)
0388 return ret;
0389
0390 ret = kstrtol(buf, 10, &val);
0391 if (ret < 0)
0392 return ret;
0393
0394 val = DIV_ROUND_CLOSEST(val, 1000);
0395 val = clamp_val((int)data->tcrit1[index] - val, 0, 31);
0396
0397 mutex_lock(&data->update_lock);
0398 data->thyst = val;
0399 i2c_smbus_write_byte_data(data->client, LM95234_REG_TCRIT_HYST, val);
0400 mutex_unlock(&data->update_lock);
0401
0402 return count;
0403 }
0404
0405 static ssize_t offset_show(struct device *dev, struct device_attribute *attr,
0406 char *buf)
0407 {
0408 struct lm95234_data *data = dev_get_drvdata(dev);
0409 int index = to_sensor_dev_attr(attr)->index;
0410 int ret = lm95234_update_device(data);
0411
0412 if (ret)
0413 return ret;
0414
0415 return sprintf(buf, "%d", data->toffset[index] * 500);
0416 }
0417
0418 static ssize_t offset_store(struct device *dev, struct device_attribute *attr,
0419 const char *buf, size_t count)
0420 {
0421 struct lm95234_data *data = dev_get_drvdata(dev);
0422 int index = to_sensor_dev_attr(attr)->index;
0423 int ret = lm95234_update_device(data);
0424 long val;
0425
0426 if (ret)
0427 return ret;
0428
0429 ret = kstrtol(buf, 10, &val);
0430 if (ret < 0)
0431 return ret;
0432
0433
0434 val = clamp_val(DIV_ROUND_CLOSEST(val, 500), -128, 127);
0435
0436 mutex_lock(&data->update_lock);
0437 data->toffset[index] = val;
0438 i2c_smbus_write_byte_data(data->client, LM95234_REG_OFFSET(index), val);
0439 mutex_unlock(&data->update_lock);
0440
0441 return count;
0442 }
0443
0444 static ssize_t update_interval_show(struct device *dev,
0445 struct device_attribute *attr, char *buf)
0446 {
0447 struct lm95234_data *data = dev_get_drvdata(dev);
0448 int ret = lm95234_update_device(data);
0449
0450 if (ret)
0451 return ret;
0452
0453 return sprintf(buf, "%lu\n",
0454 DIV_ROUND_CLOSEST(data->interval * 1000, HZ));
0455 }
0456
0457 static ssize_t update_interval_store(struct device *dev,
0458 struct device_attribute *attr,
0459 const char *buf, size_t count)
0460 {
0461 struct lm95234_data *data = dev_get_drvdata(dev);
0462 int ret = lm95234_update_device(data);
0463 unsigned long val;
0464 u8 regval;
0465
0466 if (ret)
0467 return ret;
0468
0469 ret = kstrtoul(buf, 10, &val);
0470 if (ret < 0)
0471 return ret;
0472
0473 for (regval = 0; regval < 3; regval++) {
0474 if (val <= update_intervals[regval])
0475 break;
0476 }
0477
0478 mutex_lock(&data->update_lock);
0479 data->interval = msecs_to_jiffies(update_intervals[regval]);
0480 i2c_smbus_write_byte_data(data->client, LM95234_REG_CONVRATE, regval);
0481 mutex_unlock(&data->update_lock);
0482
0483 return count;
0484 }
0485
0486 static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0);
0487 static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1);
0488 static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2);
0489 static SENSOR_DEVICE_ATTR_RO(temp4_input, temp, 3);
0490 static SENSOR_DEVICE_ATTR_RO(temp5_input, temp, 4);
0491
0492 static SENSOR_DEVICE_ATTR_RO(temp2_fault, alarm, BIT(0) | BIT(1));
0493 static SENSOR_DEVICE_ATTR_RO(temp3_fault, alarm, BIT(2) | BIT(3));
0494 static SENSOR_DEVICE_ATTR_RO(temp4_fault, alarm, BIT(4) | BIT(5));
0495 static SENSOR_DEVICE_ATTR_RO(temp5_fault, alarm, BIT(6) | BIT(7));
0496
0497 static SENSOR_DEVICE_ATTR_RW(temp2_type, type, BIT(1));
0498 static SENSOR_DEVICE_ATTR_RW(temp3_type, type, BIT(2));
0499 static SENSOR_DEVICE_ATTR_RW(temp4_type, type, BIT(3));
0500 static SENSOR_DEVICE_ATTR_RW(temp5_type, type, BIT(4));
0501
0502 static SENSOR_DEVICE_ATTR_RW(temp1_max, tcrit1, 0);
0503 static SENSOR_DEVICE_ATTR_RW(temp2_max, tcrit2, 0);
0504 static SENSOR_DEVICE_ATTR_RW(temp3_max, tcrit2, 1);
0505 static SENSOR_DEVICE_ATTR_RW(temp4_max, tcrit1, 3);
0506 static SENSOR_DEVICE_ATTR_RW(temp5_max, tcrit1, 4);
0507
0508 static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst, tcrit1_hyst, 0);
0509 static SENSOR_DEVICE_ATTR_RO(temp2_max_hyst, tcrit2_hyst, 0);
0510 static SENSOR_DEVICE_ATTR_RO(temp3_max_hyst, tcrit2_hyst, 1);
0511 static SENSOR_DEVICE_ATTR_RO(temp4_max_hyst, tcrit1_hyst, 3);
0512 static SENSOR_DEVICE_ATTR_RO(temp5_max_hyst, tcrit1_hyst, 4);
0513
0514 static SENSOR_DEVICE_ATTR_RO(temp1_max_alarm, alarm, BIT(0 + 8));
0515 static SENSOR_DEVICE_ATTR_RO(temp2_max_alarm, alarm, BIT(1 + 16));
0516 static SENSOR_DEVICE_ATTR_RO(temp3_max_alarm, alarm, BIT(2 + 16));
0517 static SENSOR_DEVICE_ATTR_RO(temp4_max_alarm, alarm, BIT(3 + 8));
0518 static SENSOR_DEVICE_ATTR_RO(temp5_max_alarm, alarm, BIT(4 + 8));
0519
0520 static SENSOR_DEVICE_ATTR_RW(temp2_crit, tcrit1, 1);
0521 static SENSOR_DEVICE_ATTR_RW(temp3_crit, tcrit1, 2);
0522
0523 static SENSOR_DEVICE_ATTR_RO(temp2_crit_hyst, tcrit1_hyst, 1);
0524 static SENSOR_DEVICE_ATTR_RO(temp3_crit_hyst, tcrit1_hyst, 2);
0525
0526 static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, alarm, BIT(1 + 8));
0527 static SENSOR_DEVICE_ATTR_RO(temp3_crit_alarm, alarm, BIT(2 + 8));
0528
0529 static SENSOR_DEVICE_ATTR_RW(temp2_offset, offset, 0);
0530 static SENSOR_DEVICE_ATTR_RW(temp3_offset, offset, 1);
0531 static SENSOR_DEVICE_ATTR_RW(temp4_offset, offset, 2);
0532 static SENSOR_DEVICE_ATTR_RW(temp5_offset, offset, 3);
0533
0534 static DEVICE_ATTR_RW(update_interval);
0535
0536 static struct attribute *lm95234_common_attrs[] = {
0537 &sensor_dev_attr_temp1_input.dev_attr.attr,
0538 &sensor_dev_attr_temp2_input.dev_attr.attr,
0539 &sensor_dev_attr_temp3_input.dev_attr.attr,
0540 &sensor_dev_attr_temp2_fault.dev_attr.attr,
0541 &sensor_dev_attr_temp3_fault.dev_attr.attr,
0542 &sensor_dev_attr_temp2_type.dev_attr.attr,
0543 &sensor_dev_attr_temp3_type.dev_attr.attr,
0544 &sensor_dev_attr_temp1_max.dev_attr.attr,
0545 &sensor_dev_attr_temp2_max.dev_attr.attr,
0546 &sensor_dev_attr_temp3_max.dev_attr.attr,
0547 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
0548 &sensor_dev_attr_temp2_max_hyst.dev_attr.attr,
0549 &sensor_dev_attr_temp3_max_hyst.dev_attr.attr,
0550 &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
0551 &sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
0552 &sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
0553 &sensor_dev_attr_temp2_crit.dev_attr.attr,
0554 &sensor_dev_attr_temp3_crit.dev_attr.attr,
0555 &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr,
0556 &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr,
0557 &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
0558 &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
0559 &sensor_dev_attr_temp2_offset.dev_attr.attr,
0560 &sensor_dev_attr_temp3_offset.dev_attr.attr,
0561 &dev_attr_update_interval.attr,
0562 NULL
0563 };
0564
0565 static const struct attribute_group lm95234_common_group = {
0566 .attrs = lm95234_common_attrs,
0567 };
0568
0569 static struct attribute *lm95234_attrs[] = {
0570 &sensor_dev_attr_temp4_input.dev_attr.attr,
0571 &sensor_dev_attr_temp5_input.dev_attr.attr,
0572 &sensor_dev_attr_temp4_fault.dev_attr.attr,
0573 &sensor_dev_attr_temp5_fault.dev_attr.attr,
0574 &sensor_dev_attr_temp4_type.dev_attr.attr,
0575 &sensor_dev_attr_temp5_type.dev_attr.attr,
0576 &sensor_dev_attr_temp4_max.dev_attr.attr,
0577 &sensor_dev_attr_temp5_max.dev_attr.attr,
0578 &sensor_dev_attr_temp4_max_hyst.dev_attr.attr,
0579 &sensor_dev_attr_temp5_max_hyst.dev_attr.attr,
0580 &sensor_dev_attr_temp4_max_alarm.dev_attr.attr,
0581 &sensor_dev_attr_temp5_max_alarm.dev_attr.attr,
0582 &sensor_dev_attr_temp4_offset.dev_attr.attr,
0583 &sensor_dev_attr_temp5_offset.dev_attr.attr,
0584 NULL
0585 };
0586
0587 static const struct attribute_group lm95234_group = {
0588 .attrs = lm95234_attrs,
0589 };
0590
0591 static int lm95234_detect(struct i2c_client *client,
0592 struct i2c_board_info *info)
0593 {
0594 struct i2c_adapter *adapter = client->adapter;
0595 int address = client->addr;
0596 u8 config_mask, model_mask;
0597 int mfg_id, chip_id, val;
0598 const char *name;
0599
0600 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
0601 return -ENODEV;
0602
0603 mfg_id = i2c_smbus_read_byte_data(client, LM95234_REG_MAN_ID);
0604 if (mfg_id != NATSEMI_MAN_ID)
0605 return -ENODEV;
0606
0607 chip_id = i2c_smbus_read_byte_data(client, LM95234_REG_CHIP_ID);
0608 switch (chip_id) {
0609 case LM95233_CHIP_ID:
0610 if (address != 0x18 && address != 0x2a && address != 0x2b)
0611 return -ENODEV;
0612 config_mask = 0xbf;
0613 model_mask = 0xf9;
0614 name = "lm95233";
0615 break;
0616 case LM95234_CHIP_ID:
0617 if (address != 0x18 && address != 0x4d && address != 0x4e)
0618 return -ENODEV;
0619 config_mask = 0xbc;
0620 model_mask = 0xe1;
0621 name = "lm95234";
0622 break;
0623 default:
0624 return -ENODEV;
0625 }
0626
0627 val = i2c_smbus_read_byte_data(client, LM95234_REG_STATUS);
0628 if (val & 0x30)
0629 return -ENODEV;
0630
0631 val = i2c_smbus_read_byte_data(client, LM95234_REG_CONFIG);
0632 if (val & config_mask)
0633 return -ENODEV;
0634
0635 val = i2c_smbus_read_byte_data(client, LM95234_REG_CONVRATE);
0636 if (val & 0xfc)
0637 return -ENODEV;
0638
0639 val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL);
0640 if (val & model_mask)
0641 return -ENODEV;
0642
0643 val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL_STS);
0644 if (val & model_mask)
0645 return -ENODEV;
0646
0647 strlcpy(info->type, name, I2C_NAME_SIZE);
0648 return 0;
0649 }
0650
0651 static int lm95234_init_client(struct i2c_client *client)
0652 {
0653 int val, model;
0654
0655
0656 val = i2c_smbus_read_byte_data(client, LM95234_REG_CONFIG);
0657 if (val < 0)
0658 return val;
0659 if (val & 0x40)
0660 i2c_smbus_write_byte_data(client, LM95234_REG_CONFIG,
0661 val & ~0x40);
0662
0663
0664 val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL_STS);
0665 if (val < 0)
0666 return val;
0667 model = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL);
0668 if (model < 0)
0669 return model;
0670 if (model & val) {
0671 dev_notice(&client->dev,
0672 "Fixing remote diode type misconfiguration (0x%x)\n",
0673 val);
0674 i2c_smbus_write_byte_data(client, LM95234_REG_REM_MODEL,
0675 model & ~val);
0676 }
0677 return 0;
0678 }
0679
0680 static const struct i2c_device_id lm95234_id[];
0681
0682 static int lm95234_probe(struct i2c_client *client)
0683 {
0684 struct device *dev = &client->dev;
0685 struct lm95234_data *data;
0686 struct device *hwmon_dev;
0687 int err;
0688
0689 data = devm_kzalloc(dev, sizeof(struct lm95234_data), GFP_KERNEL);
0690 if (!data)
0691 return -ENOMEM;
0692
0693 data->client = client;
0694 mutex_init(&data->update_lock);
0695
0696
0697 err = lm95234_init_client(client);
0698 if (err < 0)
0699 return err;
0700
0701 data->groups[0] = &lm95234_common_group;
0702 if (i2c_match_id(lm95234_id, client)->driver_data == lm95234)
0703 data->groups[1] = &lm95234_group;
0704
0705 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
0706 data, data->groups);
0707 return PTR_ERR_OR_ZERO(hwmon_dev);
0708 }
0709
0710
0711 static const struct i2c_device_id lm95234_id[] = {
0712 { "lm95233", lm95233 },
0713 { "lm95234", lm95234 },
0714 { }
0715 };
0716 MODULE_DEVICE_TABLE(i2c, lm95234_id);
0717
0718 static struct i2c_driver lm95234_driver = {
0719 .class = I2C_CLASS_HWMON,
0720 .driver = {
0721 .name = DRVNAME,
0722 },
0723 .probe_new = lm95234_probe,
0724 .id_table = lm95234_id,
0725 .detect = lm95234_detect,
0726 .address_list = normal_i2c,
0727 };
0728
0729 module_i2c_driver(lm95234_driver);
0730
0731 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
0732 MODULE_DESCRIPTION("LM95233/LM95234 sensor driver");
0733 MODULE_LICENSE("GPL");