lm95234.c (19958B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Driver for Texas Instruments / National Semiconductor LM95234 4 * 5 * Copyright (c) 2013, 2014 Guenter Roeck <linux@roeck-us.net> 6 * 7 * Derived from lm95241.c 8 * Copyright (C) 2008, 2010 Davide Rizzo <elpa.rizzo@gmail.com> 9 */ 10 11#include <linux/module.h> 12#include <linux/init.h> 13#include <linux/slab.h> 14#include <linux/jiffies.h> 15#include <linux/i2c.h> 16#include <linux/hwmon.h> 17#include <linux/hwmon-sysfs.h> 18#include <linux/err.h> 19#include <linux/mutex.h> 20#include <linux/sysfs.h> 21 22#define DRVNAME "lm95234" 23 24enum chips { lm95233, lm95234 }; 25 26static const unsigned short normal_i2c[] = { 27 0x18, 0x2a, 0x2b, 0x4d, 0x4e, I2C_CLIENT_END }; 28 29/* LM95234 registers */ 30#define LM95234_REG_MAN_ID 0xFE 31#define LM95234_REG_CHIP_ID 0xFF 32#define LM95234_REG_STATUS 0x02 33#define LM95234_REG_CONFIG 0x03 34#define LM95234_REG_CONVRATE 0x04 35#define LM95234_REG_STS_FAULT 0x07 36#define LM95234_REG_STS_TCRIT1 0x08 37#define LM95234_REG_STS_TCRIT2 0x09 38#define LM95234_REG_TEMPH(x) ((x) + 0x10) 39#define LM95234_REG_TEMPL(x) ((x) + 0x20) 40#define LM95234_REG_UTEMPH(x) ((x) + 0x19) /* Remote only */ 41#define LM95234_REG_UTEMPL(x) ((x) + 0x29) 42#define LM95234_REG_REM_MODEL 0x30 43#define LM95234_REG_REM_MODEL_STS 0x38 44#define LM95234_REG_OFFSET(x) ((x) + 0x31) /* Remote only */ 45#define LM95234_REG_TCRIT1(x) ((x) + 0x40) 46#define LM95234_REG_TCRIT2(x) ((x) + 0x49) /* Remote channel 1,2 */ 47#define LM95234_REG_TCRIT_HYST 0x5a 48 49#define NATSEMI_MAN_ID 0x01 50#define LM95233_CHIP_ID 0x89 51#define LM95234_CHIP_ID 0x79 52 53/* Client data (each client gets its own) */ 54struct lm95234_data { 55 struct i2c_client *client; 56 const struct attribute_group *groups[3]; 57 struct mutex update_lock; 58 unsigned long last_updated, interval; /* in jiffies */ 59 bool valid; /* false until following fields are valid */ 60 /* registers values */ 61 int temp[5]; /* temperature (signed) */ 62 u32 status; /* fault/alarm status */ 63 u8 tcrit1[5]; /* critical temperature limit */ 64 u8 tcrit2[2]; /* high temperature limit */ 65 s8 toffset[4]; /* remote temperature offset */ 66 u8 thyst; /* common hysteresis */ 67 68 u8 sensor_type; /* temperature sensor type */ 69}; 70 71static int lm95234_read_temp(struct i2c_client *client, int index, int *t) 72{ 73 int val; 74 u16 temp = 0; 75 76 if (index) { 77 val = i2c_smbus_read_byte_data(client, 78 LM95234_REG_UTEMPH(index - 1)); 79 if (val < 0) 80 return val; 81 temp = val << 8; 82 val = i2c_smbus_read_byte_data(client, 83 LM95234_REG_UTEMPL(index - 1)); 84 if (val < 0) 85 return val; 86 temp |= val; 87 *t = temp; 88 } 89 /* 90 * Read signed temperature if unsigned temperature is 0, 91 * or if this is the local sensor. 92 */ 93 if (!temp) { 94 val = i2c_smbus_read_byte_data(client, 95 LM95234_REG_TEMPH(index)); 96 if (val < 0) 97 return val; 98 temp = val << 8; 99 val = i2c_smbus_read_byte_data(client, 100 LM95234_REG_TEMPL(index)); 101 if (val < 0) 102 return val; 103 temp |= val; 104 *t = (s16)temp; 105 } 106 return 0; 107} 108 109static u16 update_intervals[] = { 143, 364, 1000, 2500 }; 110 111/* Fill value cache. Must be called with update lock held. */ 112 113static int lm95234_fill_cache(struct lm95234_data *data, 114 struct i2c_client *client) 115{ 116 int i, ret; 117 118 ret = i2c_smbus_read_byte_data(client, LM95234_REG_CONVRATE); 119 if (ret < 0) 120 return ret; 121 122 data->interval = msecs_to_jiffies(update_intervals[ret & 0x03]); 123 124 for (i = 0; i < ARRAY_SIZE(data->tcrit1); i++) { 125 ret = i2c_smbus_read_byte_data(client, LM95234_REG_TCRIT1(i)); 126 if (ret < 0) 127 return ret; 128 data->tcrit1[i] = ret; 129 } 130 for (i = 0; i < ARRAY_SIZE(data->tcrit2); i++) { 131 ret = i2c_smbus_read_byte_data(client, LM95234_REG_TCRIT2(i)); 132 if (ret < 0) 133 return ret; 134 data->tcrit2[i] = ret; 135 } 136 for (i = 0; i < ARRAY_SIZE(data->toffset); i++) { 137 ret = i2c_smbus_read_byte_data(client, LM95234_REG_OFFSET(i)); 138 if (ret < 0) 139 return ret; 140 data->toffset[i] = ret; 141 } 142 143 ret = i2c_smbus_read_byte_data(client, LM95234_REG_TCRIT_HYST); 144 if (ret < 0) 145 return ret; 146 data->thyst = ret; 147 148 ret = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL); 149 if (ret < 0) 150 return ret; 151 data->sensor_type = ret; 152 153 return 0; 154} 155 156static int lm95234_update_device(struct lm95234_data *data) 157{ 158 struct i2c_client *client = data->client; 159 int ret; 160 161 mutex_lock(&data->update_lock); 162 163 if (time_after(jiffies, data->last_updated + data->interval) || 164 !data->valid) { 165 int i; 166 167 if (!data->valid) { 168 ret = lm95234_fill_cache(data, client); 169 if (ret < 0) 170 goto abort; 171 } 172 173 data->valid = false; 174 for (i = 0; i < ARRAY_SIZE(data->temp); i++) { 175 ret = lm95234_read_temp(client, i, &data->temp[i]); 176 if (ret < 0) 177 goto abort; 178 } 179 180 ret = i2c_smbus_read_byte_data(client, LM95234_REG_STS_FAULT); 181 if (ret < 0) 182 goto abort; 183 data->status = ret; 184 185 ret = i2c_smbus_read_byte_data(client, LM95234_REG_STS_TCRIT1); 186 if (ret < 0) 187 goto abort; 188 data->status |= ret << 8; 189 190 ret = i2c_smbus_read_byte_data(client, LM95234_REG_STS_TCRIT2); 191 if (ret < 0) 192 goto abort; 193 data->status |= ret << 16; 194 195 data->last_updated = jiffies; 196 data->valid = true; 197 } 198 ret = 0; 199abort: 200 mutex_unlock(&data->update_lock); 201 202 return ret; 203} 204 205static ssize_t temp_show(struct device *dev, struct device_attribute *attr, 206 char *buf) 207{ 208 struct lm95234_data *data = dev_get_drvdata(dev); 209 int index = to_sensor_dev_attr(attr)->index; 210 int ret = lm95234_update_device(data); 211 212 if (ret) 213 return ret; 214 215 return sprintf(buf, "%d\n", 216 DIV_ROUND_CLOSEST(data->temp[index] * 125, 32)); 217} 218 219static ssize_t alarm_show(struct device *dev, struct device_attribute *attr, 220 char *buf) 221{ 222 struct lm95234_data *data = dev_get_drvdata(dev); 223 u32 mask = to_sensor_dev_attr(attr)->index; 224 int ret = lm95234_update_device(data); 225 226 if (ret) 227 return ret; 228 229 return sprintf(buf, "%u", !!(data->status & mask)); 230} 231 232static ssize_t type_show(struct device *dev, struct device_attribute *attr, 233 char *buf) 234{ 235 struct lm95234_data *data = dev_get_drvdata(dev); 236 u8 mask = to_sensor_dev_attr(attr)->index; 237 int ret = lm95234_update_device(data); 238 239 if (ret) 240 return ret; 241 242 return sprintf(buf, data->sensor_type & mask ? "1\n" : "2\n"); 243} 244 245static ssize_t type_store(struct device *dev, struct device_attribute *attr, 246 const char *buf, size_t count) 247{ 248 struct lm95234_data *data = dev_get_drvdata(dev); 249 unsigned long val; 250 u8 mask = to_sensor_dev_attr(attr)->index; 251 int ret = lm95234_update_device(data); 252 253 if (ret) 254 return ret; 255 256 ret = kstrtoul(buf, 10, &val); 257 if (ret < 0) 258 return ret; 259 260 if (val != 1 && val != 2) 261 return -EINVAL; 262 263 mutex_lock(&data->update_lock); 264 if (val == 1) 265 data->sensor_type |= mask; 266 else 267 data->sensor_type &= ~mask; 268 data->valid = false; 269 i2c_smbus_write_byte_data(data->client, LM95234_REG_REM_MODEL, 270 data->sensor_type); 271 mutex_unlock(&data->update_lock); 272 273 return count; 274} 275 276static ssize_t tcrit2_show(struct device *dev, struct device_attribute *attr, 277 char *buf) 278{ 279 struct lm95234_data *data = dev_get_drvdata(dev); 280 int index = to_sensor_dev_attr(attr)->index; 281 int ret = lm95234_update_device(data); 282 283 if (ret) 284 return ret; 285 286 return sprintf(buf, "%u", data->tcrit2[index] * 1000); 287} 288 289static ssize_t tcrit2_store(struct device *dev, struct device_attribute *attr, 290 const char *buf, size_t count) 291{ 292 struct lm95234_data *data = dev_get_drvdata(dev); 293 int index = to_sensor_dev_attr(attr)->index; 294 long val; 295 int ret = lm95234_update_device(data); 296 297 if (ret) 298 return ret; 299 300 ret = kstrtol(buf, 10, &val); 301 if (ret < 0) 302 return ret; 303 304 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, index ? 255 : 127); 305 306 mutex_lock(&data->update_lock); 307 data->tcrit2[index] = val; 308 i2c_smbus_write_byte_data(data->client, LM95234_REG_TCRIT2(index), val); 309 mutex_unlock(&data->update_lock); 310 311 return count; 312} 313 314static ssize_t tcrit2_hyst_show(struct device *dev, 315 struct device_attribute *attr, char *buf) 316{ 317 struct lm95234_data *data = dev_get_drvdata(dev); 318 int index = to_sensor_dev_attr(attr)->index; 319 int ret = lm95234_update_device(data); 320 321 if (ret) 322 return ret; 323 324 /* Result can be negative, so be careful with unsigned operands */ 325 return sprintf(buf, "%d", 326 ((int)data->tcrit2[index] - (int)data->thyst) * 1000); 327} 328 329static ssize_t tcrit1_show(struct device *dev, struct device_attribute *attr, 330 char *buf) 331{ 332 struct lm95234_data *data = dev_get_drvdata(dev); 333 int index = to_sensor_dev_attr(attr)->index; 334 335 return sprintf(buf, "%u", data->tcrit1[index] * 1000); 336} 337 338static ssize_t tcrit1_store(struct device *dev, struct device_attribute *attr, 339 const char *buf, size_t count) 340{ 341 struct lm95234_data *data = dev_get_drvdata(dev); 342 int index = to_sensor_dev_attr(attr)->index; 343 int ret = lm95234_update_device(data); 344 long val; 345 346 if (ret) 347 return ret; 348 349 ret = kstrtol(buf, 10, &val); 350 if (ret < 0) 351 return ret; 352 353 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 255); 354 355 mutex_lock(&data->update_lock); 356 data->tcrit1[index] = val; 357 i2c_smbus_write_byte_data(data->client, LM95234_REG_TCRIT1(index), val); 358 mutex_unlock(&data->update_lock); 359 360 return count; 361} 362 363static ssize_t tcrit1_hyst_show(struct device *dev, 364 struct device_attribute *attr, char *buf) 365{ 366 struct lm95234_data *data = dev_get_drvdata(dev); 367 int index = to_sensor_dev_attr(attr)->index; 368 int ret = lm95234_update_device(data); 369 370 if (ret) 371 return ret; 372 373 /* Result can be negative, so be careful with unsigned operands */ 374 return sprintf(buf, "%d", 375 ((int)data->tcrit1[index] - (int)data->thyst) * 1000); 376} 377 378static ssize_t tcrit1_hyst_store(struct device *dev, 379 struct device_attribute *attr, 380 const char *buf, size_t count) 381{ 382 struct lm95234_data *data = dev_get_drvdata(dev); 383 int index = to_sensor_dev_attr(attr)->index; 384 int ret = lm95234_update_device(data); 385 long val; 386 387 if (ret) 388 return ret; 389 390 ret = kstrtol(buf, 10, &val); 391 if (ret < 0) 392 return ret; 393 394 val = DIV_ROUND_CLOSEST(val, 1000); 395 val = clamp_val((int)data->tcrit1[index] - val, 0, 31); 396 397 mutex_lock(&data->update_lock); 398 data->thyst = val; 399 i2c_smbus_write_byte_data(data->client, LM95234_REG_TCRIT_HYST, val); 400 mutex_unlock(&data->update_lock); 401 402 return count; 403} 404 405static ssize_t offset_show(struct device *dev, struct device_attribute *attr, 406 char *buf) 407{ 408 struct lm95234_data *data = dev_get_drvdata(dev); 409 int index = to_sensor_dev_attr(attr)->index; 410 int ret = lm95234_update_device(data); 411 412 if (ret) 413 return ret; 414 415 return sprintf(buf, "%d", data->toffset[index] * 500); 416} 417 418static ssize_t offset_store(struct device *dev, struct device_attribute *attr, 419 const char *buf, size_t count) 420{ 421 struct lm95234_data *data = dev_get_drvdata(dev); 422 int index = to_sensor_dev_attr(attr)->index; 423 int ret = lm95234_update_device(data); 424 long val; 425 426 if (ret) 427 return ret; 428 429 ret = kstrtol(buf, 10, &val); 430 if (ret < 0) 431 return ret; 432 433 /* Accuracy is 1/2 degrees C */ 434 val = clamp_val(DIV_ROUND_CLOSEST(val, 500), -128, 127); 435 436 mutex_lock(&data->update_lock); 437 data->toffset[index] = val; 438 i2c_smbus_write_byte_data(data->client, LM95234_REG_OFFSET(index), val); 439 mutex_unlock(&data->update_lock); 440 441 return count; 442} 443 444static ssize_t update_interval_show(struct device *dev, 445 struct device_attribute *attr, char *buf) 446{ 447 struct lm95234_data *data = dev_get_drvdata(dev); 448 int ret = lm95234_update_device(data); 449 450 if (ret) 451 return ret; 452 453 return sprintf(buf, "%lu\n", 454 DIV_ROUND_CLOSEST(data->interval * 1000, HZ)); 455} 456 457static ssize_t update_interval_store(struct device *dev, 458 struct device_attribute *attr, 459 const char *buf, size_t count) 460{ 461 struct lm95234_data *data = dev_get_drvdata(dev); 462 int ret = lm95234_update_device(data); 463 unsigned long val; 464 u8 regval; 465 466 if (ret) 467 return ret; 468 469 ret = kstrtoul(buf, 10, &val); 470 if (ret < 0) 471 return ret; 472 473 for (regval = 0; regval < 3; regval++) { 474 if (val <= update_intervals[regval]) 475 break; 476 } 477 478 mutex_lock(&data->update_lock); 479 data->interval = msecs_to_jiffies(update_intervals[regval]); 480 i2c_smbus_write_byte_data(data->client, LM95234_REG_CONVRATE, regval); 481 mutex_unlock(&data->update_lock); 482 483 return count; 484} 485 486static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0); 487static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1); 488static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2); 489static SENSOR_DEVICE_ATTR_RO(temp4_input, temp, 3); 490static SENSOR_DEVICE_ATTR_RO(temp5_input, temp, 4); 491 492static SENSOR_DEVICE_ATTR_RO(temp2_fault, alarm, BIT(0) | BIT(1)); 493static SENSOR_DEVICE_ATTR_RO(temp3_fault, alarm, BIT(2) | BIT(3)); 494static SENSOR_DEVICE_ATTR_RO(temp4_fault, alarm, BIT(4) | BIT(5)); 495static SENSOR_DEVICE_ATTR_RO(temp5_fault, alarm, BIT(6) | BIT(7)); 496 497static SENSOR_DEVICE_ATTR_RW(temp2_type, type, BIT(1)); 498static SENSOR_DEVICE_ATTR_RW(temp3_type, type, BIT(2)); 499static SENSOR_DEVICE_ATTR_RW(temp4_type, type, BIT(3)); 500static SENSOR_DEVICE_ATTR_RW(temp5_type, type, BIT(4)); 501 502static SENSOR_DEVICE_ATTR_RW(temp1_max, tcrit1, 0); 503static SENSOR_DEVICE_ATTR_RW(temp2_max, tcrit2, 0); 504static SENSOR_DEVICE_ATTR_RW(temp3_max, tcrit2, 1); 505static SENSOR_DEVICE_ATTR_RW(temp4_max, tcrit1, 3); 506static SENSOR_DEVICE_ATTR_RW(temp5_max, tcrit1, 4); 507 508static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst, tcrit1_hyst, 0); 509static SENSOR_DEVICE_ATTR_RO(temp2_max_hyst, tcrit2_hyst, 0); 510static SENSOR_DEVICE_ATTR_RO(temp3_max_hyst, tcrit2_hyst, 1); 511static SENSOR_DEVICE_ATTR_RO(temp4_max_hyst, tcrit1_hyst, 3); 512static SENSOR_DEVICE_ATTR_RO(temp5_max_hyst, tcrit1_hyst, 4); 513 514static SENSOR_DEVICE_ATTR_RO(temp1_max_alarm, alarm, BIT(0 + 8)); 515static SENSOR_DEVICE_ATTR_RO(temp2_max_alarm, alarm, BIT(1 + 16)); 516static SENSOR_DEVICE_ATTR_RO(temp3_max_alarm, alarm, BIT(2 + 16)); 517static SENSOR_DEVICE_ATTR_RO(temp4_max_alarm, alarm, BIT(3 + 8)); 518static SENSOR_DEVICE_ATTR_RO(temp5_max_alarm, alarm, BIT(4 + 8)); 519 520static SENSOR_DEVICE_ATTR_RW(temp2_crit, tcrit1, 1); 521static SENSOR_DEVICE_ATTR_RW(temp3_crit, tcrit1, 2); 522 523static SENSOR_DEVICE_ATTR_RO(temp2_crit_hyst, tcrit1_hyst, 1); 524static SENSOR_DEVICE_ATTR_RO(temp3_crit_hyst, tcrit1_hyst, 2); 525 526static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, alarm, BIT(1 + 8)); 527static SENSOR_DEVICE_ATTR_RO(temp3_crit_alarm, alarm, BIT(2 + 8)); 528 529static SENSOR_DEVICE_ATTR_RW(temp2_offset, offset, 0); 530static SENSOR_DEVICE_ATTR_RW(temp3_offset, offset, 1); 531static SENSOR_DEVICE_ATTR_RW(temp4_offset, offset, 2); 532static SENSOR_DEVICE_ATTR_RW(temp5_offset, offset, 3); 533 534static DEVICE_ATTR_RW(update_interval); 535 536static struct attribute *lm95234_common_attrs[] = { 537 &sensor_dev_attr_temp1_input.dev_attr.attr, 538 &sensor_dev_attr_temp2_input.dev_attr.attr, 539 &sensor_dev_attr_temp3_input.dev_attr.attr, 540 &sensor_dev_attr_temp2_fault.dev_attr.attr, 541 &sensor_dev_attr_temp3_fault.dev_attr.attr, 542 &sensor_dev_attr_temp2_type.dev_attr.attr, 543 &sensor_dev_attr_temp3_type.dev_attr.attr, 544 &sensor_dev_attr_temp1_max.dev_attr.attr, 545 &sensor_dev_attr_temp2_max.dev_attr.attr, 546 &sensor_dev_attr_temp3_max.dev_attr.attr, 547 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, 548 &sensor_dev_attr_temp2_max_hyst.dev_attr.attr, 549 &sensor_dev_attr_temp3_max_hyst.dev_attr.attr, 550 &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, 551 &sensor_dev_attr_temp2_max_alarm.dev_attr.attr, 552 &sensor_dev_attr_temp3_max_alarm.dev_attr.attr, 553 &sensor_dev_attr_temp2_crit.dev_attr.attr, 554 &sensor_dev_attr_temp3_crit.dev_attr.attr, 555 &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, 556 &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr, 557 &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr, 558 &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr, 559 &sensor_dev_attr_temp2_offset.dev_attr.attr, 560 &sensor_dev_attr_temp3_offset.dev_attr.attr, 561 &dev_attr_update_interval.attr, 562 NULL 563}; 564 565static const struct attribute_group lm95234_common_group = { 566 .attrs = lm95234_common_attrs, 567}; 568 569static struct attribute *lm95234_attrs[] = { 570 &sensor_dev_attr_temp4_input.dev_attr.attr, 571 &sensor_dev_attr_temp5_input.dev_attr.attr, 572 &sensor_dev_attr_temp4_fault.dev_attr.attr, 573 &sensor_dev_attr_temp5_fault.dev_attr.attr, 574 &sensor_dev_attr_temp4_type.dev_attr.attr, 575 &sensor_dev_attr_temp5_type.dev_attr.attr, 576 &sensor_dev_attr_temp4_max.dev_attr.attr, 577 &sensor_dev_attr_temp5_max.dev_attr.attr, 578 &sensor_dev_attr_temp4_max_hyst.dev_attr.attr, 579 &sensor_dev_attr_temp5_max_hyst.dev_attr.attr, 580 &sensor_dev_attr_temp4_max_alarm.dev_attr.attr, 581 &sensor_dev_attr_temp5_max_alarm.dev_attr.attr, 582 &sensor_dev_attr_temp4_offset.dev_attr.attr, 583 &sensor_dev_attr_temp5_offset.dev_attr.attr, 584 NULL 585}; 586 587static const struct attribute_group lm95234_group = { 588 .attrs = lm95234_attrs, 589}; 590 591static int lm95234_detect(struct i2c_client *client, 592 struct i2c_board_info *info) 593{ 594 struct i2c_adapter *adapter = client->adapter; 595 int address = client->addr; 596 u8 config_mask, model_mask; 597 int mfg_id, chip_id, val; 598 const char *name; 599 600 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 601 return -ENODEV; 602 603 mfg_id = i2c_smbus_read_byte_data(client, LM95234_REG_MAN_ID); 604 if (mfg_id != NATSEMI_MAN_ID) 605 return -ENODEV; 606 607 chip_id = i2c_smbus_read_byte_data(client, LM95234_REG_CHIP_ID); 608 switch (chip_id) { 609 case LM95233_CHIP_ID: 610 if (address != 0x18 && address != 0x2a && address != 0x2b) 611 return -ENODEV; 612 config_mask = 0xbf; 613 model_mask = 0xf9; 614 name = "lm95233"; 615 break; 616 case LM95234_CHIP_ID: 617 if (address != 0x18 && address != 0x4d && address != 0x4e) 618 return -ENODEV; 619 config_mask = 0xbc; 620 model_mask = 0xe1; 621 name = "lm95234"; 622 break; 623 default: 624 return -ENODEV; 625 } 626 627 val = i2c_smbus_read_byte_data(client, LM95234_REG_STATUS); 628 if (val & 0x30) 629 return -ENODEV; 630 631 val = i2c_smbus_read_byte_data(client, LM95234_REG_CONFIG); 632 if (val & config_mask) 633 return -ENODEV; 634 635 val = i2c_smbus_read_byte_data(client, LM95234_REG_CONVRATE); 636 if (val & 0xfc) 637 return -ENODEV; 638 639 val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL); 640 if (val & model_mask) 641 return -ENODEV; 642 643 val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL_STS); 644 if (val & model_mask) 645 return -ENODEV; 646 647 strlcpy(info->type, name, I2C_NAME_SIZE); 648 return 0; 649} 650 651static int lm95234_init_client(struct i2c_client *client) 652{ 653 int val, model; 654 655 /* start conversion if necessary */ 656 val = i2c_smbus_read_byte_data(client, LM95234_REG_CONFIG); 657 if (val < 0) 658 return val; 659 if (val & 0x40) 660 i2c_smbus_write_byte_data(client, LM95234_REG_CONFIG, 661 val & ~0x40); 662 663 /* If diode type status reports an error, try to fix it */ 664 val = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL_STS); 665 if (val < 0) 666 return val; 667 model = i2c_smbus_read_byte_data(client, LM95234_REG_REM_MODEL); 668 if (model < 0) 669 return model; 670 if (model & val) { 671 dev_notice(&client->dev, 672 "Fixing remote diode type misconfiguration (0x%x)\n", 673 val); 674 i2c_smbus_write_byte_data(client, LM95234_REG_REM_MODEL, 675 model & ~val); 676 } 677 return 0; 678} 679 680static const struct i2c_device_id lm95234_id[]; 681 682static int lm95234_probe(struct i2c_client *client) 683{ 684 struct device *dev = &client->dev; 685 struct lm95234_data *data; 686 struct device *hwmon_dev; 687 int err; 688 689 data = devm_kzalloc(dev, sizeof(struct lm95234_data), GFP_KERNEL); 690 if (!data) 691 return -ENOMEM; 692 693 data->client = client; 694 mutex_init(&data->update_lock); 695 696 /* Initialize the LM95234 chip */ 697 err = lm95234_init_client(client); 698 if (err < 0) 699 return err; 700 701 data->groups[0] = &lm95234_common_group; 702 if (i2c_match_id(lm95234_id, client)->driver_data == lm95234) 703 data->groups[1] = &lm95234_group; 704 705 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, 706 data, data->groups); 707 return PTR_ERR_OR_ZERO(hwmon_dev); 708} 709 710/* Driver data (common to all clients) */ 711static const struct i2c_device_id lm95234_id[] = { 712 { "lm95233", lm95233 }, 713 { "lm95234", lm95234 }, 714 { } 715}; 716MODULE_DEVICE_TABLE(i2c, lm95234_id); 717 718static struct i2c_driver lm95234_driver = { 719 .class = I2C_CLASS_HWMON, 720 .driver = { 721 .name = DRVNAME, 722 }, 723 .probe_new = lm95234_probe, 724 .id_table = lm95234_id, 725 .detect = lm95234_detect, 726 .address_list = normal_i2c, 727}; 728 729module_i2c_driver(lm95234_driver); 730 731MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>"); 732MODULE_DESCRIPTION("LM95233/LM95234 sensor driver"); 733MODULE_LICENSE("GPL");