sht3x.c (20263B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* Sensirion SHT3x-DIS humidity and temperature sensor driver. 3 * The SHT3x comes in many different versions, this driver is for the 4 * I2C version only. 5 * 6 * Copyright (C) 2016 Sensirion AG, Switzerland 7 * Author: David Frey <david.frey@sensirion.com> 8 * Author: Pascal Sachs <pascal.sachs@sensirion.com> 9 */ 10 11#include <asm/page.h> 12#include <linux/crc8.h> 13#include <linux/delay.h> 14#include <linux/err.h> 15#include <linux/hwmon.h> 16#include <linux/hwmon-sysfs.h> 17#include <linux/i2c.h> 18#include <linux/init.h> 19#include <linux/kernel.h> 20#include <linux/module.h> 21#include <linux/slab.h> 22#include <linux/jiffies.h> 23#include <linux/platform_data/sht3x.h> 24 25/* commands (high precision mode) */ 26static const unsigned char sht3x_cmd_measure_blocking_hpm[] = { 0x2c, 0x06 }; 27static const unsigned char sht3x_cmd_measure_nonblocking_hpm[] = { 0x24, 0x00 }; 28 29/* commands (low power mode) */ 30static const unsigned char sht3x_cmd_measure_blocking_lpm[] = { 0x2c, 0x10 }; 31static const unsigned char sht3x_cmd_measure_nonblocking_lpm[] = { 0x24, 0x16 }; 32 33/* commands for periodic mode */ 34static const unsigned char sht3x_cmd_measure_periodic_mode[] = { 0xe0, 0x00 }; 35static const unsigned char sht3x_cmd_break[] = { 0x30, 0x93 }; 36 37/* commands for heater control */ 38static const unsigned char sht3x_cmd_heater_on[] = { 0x30, 0x6d }; 39static const unsigned char sht3x_cmd_heater_off[] = { 0x30, 0x66 }; 40 41/* other commands */ 42static const unsigned char sht3x_cmd_read_status_reg[] = { 0xf3, 0x2d }; 43static const unsigned char sht3x_cmd_clear_status_reg[] = { 0x30, 0x41 }; 44 45/* delays for non-blocking i2c commands, both in us */ 46#define SHT3X_NONBLOCKING_WAIT_TIME_HPM 15000 47#define SHT3X_NONBLOCKING_WAIT_TIME_LPM 4000 48 49#define SHT3X_WORD_LEN 2 50#define SHT3X_CMD_LENGTH 2 51#define SHT3X_CRC8_LEN 1 52#define SHT3X_RESPONSE_LENGTH 6 53#define SHT3X_CRC8_POLYNOMIAL 0x31 54#define SHT3X_CRC8_INIT 0xFF 55#define SHT3X_MIN_TEMPERATURE -45000 56#define SHT3X_MAX_TEMPERATURE 130000 57#define SHT3X_MIN_HUMIDITY 0 58#define SHT3X_MAX_HUMIDITY 100000 59 60enum sht3x_chips { 61 sht3x, 62 sts3x, 63}; 64 65enum sht3x_limits { 66 limit_max = 0, 67 limit_max_hyst, 68 limit_min, 69 limit_min_hyst, 70}; 71 72DECLARE_CRC8_TABLE(sht3x_crc8_table); 73 74/* periodic measure commands (high precision mode) */ 75static const char periodic_measure_commands_hpm[][SHT3X_CMD_LENGTH] = { 76 /* 0.5 measurements per second */ 77 {0x20, 0x32}, 78 /* 1 measurements per second */ 79 {0x21, 0x30}, 80 /* 2 measurements per second */ 81 {0x22, 0x36}, 82 /* 4 measurements per second */ 83 {0x23, 0x34}, 84 /* 10 measurements per second */ 85 {0x27, 0x37}, 86}; 87 88/* periodic measure commands (low power mode) */ 89static const char periodic_measure_commands_lpm[][SHT3X_CMD_LENGTH] = { 90 /* 0.5 measurements per second */ 91 {0x20, 0x2f}, 92 /* 1 measurements per second */ 93 {0x21, 0x2d}, 94 /* 2 measurements per second */ 95 {0x22, 0x2b}, 96 /* 4 measurements per second */ 97 {0x23, 0x29}, 98 /* 10 measurements per second */ 99 {0x27, 0x2a}, 100}; 101 102struct sht3x_limit_commands { 103 const char read_command[SHT3X_CMD_LENGTH]; 104 const char write_command[SHT3X_CMD_LENGTH]; 105}; 106 107static const struct sht3x_limit_commands limit_commands[] = { 108 /* temp1_max, humidity1_max */ 109 [limit_max] = { {0xe1, 0x1f}, {0x61, 0x1d} }, 110 /* temp_1_max_hyst, humidity1_max_hyst */ 111 [limit_max_hyst] = { {0xe1, 0x14}, {0x61, 0x16} }, 112 /* temp1_min, humidity1_min */ 113 [limit_min] = { {0xe1, 0x02}, {0x61, 0x00} }, 114 /* temp_1_min_hyst, humidity1_min_hyst */ 115 [limit_min_hyst] = { {0xe1, 0x09}, {0x61, 0x0B} }, 116}; 117 118#define SHT3X_NUM_LIMIT_CMD ARRAY_SIZE(limit_commands) 119 120static const u16 mode_to_update_interval[] = { 121 0, 122 2000, 123 1000, 124 500, 125 250, 126 100, 127}; 128 129struct sht3x_data { 130 struct i2c_client *client; 131 struct mutex i2c_lock; /* lock for sending i2c commands */ 132 struct mutex data_lock; /* lock for updating driver data */ 133 134 u8 mode; 135 const unsigned char *command; 136 u32 wait_time; /* in us*/ 137 unsigned long last_update; /* last update in periodic mode*/ 138 139 struct sht3x_platform_data setup; 140 141 /* 142 * cached values for temperature and humidity and limits 143 * the limits arrays have the following order: 144 * max, max_hyst, min, min_hyst 145 */ 146 int temperature; 147 int temperature_limits[SHT3X_NUM_LIMIT_CMD]; 148 u32 humidity; 149 u32 humidity_limits[SHT3X_NUM_LIMIT_CMD]; 150}; 151 152static u8 get_mode_from_update_interval(u16 value) 153{ 154 size_t index; 155 u8 number_of_modes = ARRAY_SIZE(mode_to_update_interval); 156 157 if (value == 0) 158 return 0; 159 160 /* find next faster update interval */ 161 for (index = 1; index < number_of_modes; index++) { 162 if (mode_to_update_interval[index] <= value) 163 return index; 164 } 165 166 return number_of_modes - 1; 167} 168 169static int sht3x_read_from_command(struct i2c_client *client, 170 struct sht3x_data *data, 171 const char *command, 172 char *buf, int length, u32 wait_time) 173{ 174 int ret; 175 176 mutex_lock(&data->i2c_lock); 177 ret = i2c_master_send(client, command, SHT3X_CMD_LENGTH); 178 179 if (ret != SHT3X_CMD_LENGTH) { 180 ret = ret < 0 ? ret : -EIO; 181 goto out; 182 } 183 184 if (wait_time) 185 usleep_range(wait_time, wait_time + 1000); 186 187 ret = i2c_master_recv(client, buf, length); 188 if (ret != length) { 189 ret = ret < 0 ? ret : -EIO; 190 goto out; 191 } 192 193 ret = 0; 194out: 195 mutex_unlock(&data->i2c_lock); 196 return ret; 197} 198 199static int sht3x_extract_temperature(u16 raw) 200{ 201 /* 202 * From datasheet: 203 * T = -45 + 175 * ST / 2^16 204 * Adapted for integer fixed point (3 digit) arithmetic. 205 */ 206 return ((21875 * (int)raw) >> 13) - 45000; 207} 208 209static u32 sht3x_extract_humidity(u16 raw) 210{ 211 /* 212 * From datasheet: 213 * RH = 100 * SRH / 2^16 214 * Adapted for integer fixed point (3 digit) arithmetic. 215 */ 216 return (12500 * (u32)raw) >> 13; 217} 218 219static struct sht3x_data *sht3x_update_client(struct device *dev) 220{ 221 struct sht3x_data *data = dev_get_drvdata(dev); 222 struct i2c_client *client = data->client; 223 u16 interval_ms = mode_to_update_interval[data->mode]; 224 unsigned long interval_jiffies = msecs_to_jiffies(interval_ms); 225 unsigned char buf[SHT3X_RESPONSE_LENGTH]; 226 u16 val; 227 int ret = 0; 228 229 mutex_lock(&data->data_lock); 230 /* 231 * Only update cached readings once per update interval in periodic 232 * mode. In single shot mode the sensor measures values on demand, so 233 * every time the sysfs interface is called, a measurement is triggered. 234 * In periodic mode however, the measurement process is handled 235 * internally by the sensor and reading out sensor values only makes 236 * sense if a new reading is available. 237 */ 238 if (time_after(jiffies, data->last_update + interval_jiffies)) { 239 ret = sht3x_read_from_command(client, data, data->command, buf, 240 sizeof(buf), data->wait_time); 241 if (ret) 242 goto out; 243 244 val = be16_to_cpup((__be16 *)buf); 245 data->temperature = sht3x_extract_temperature(val); 246 val = be16_to_cpup((__be16 *)(buf + 3)); 247 data->humidity = sht3x_extract_humidity(val); 248 data->last_update = jiffies; 249 } 250 251out: 252 mutex_unlock(&data->data_lock); 253 if (ret) 254 return ERR_PTR(ret); 255 256 return data; 257} 258 259/* sysfs attributes */ 260static ssize_t temp1_input_show(struct device *dev, 261 struct device_attribute *attr, char *buf) 262{ 263 struct sht3x_data *data = sht3x_update_client(dev); 264 265 if (IS_ERR(data)) 266 return PTR_ERR(data); 267 268 return sprintf(buf, "%d\n", data->temperature); 269} 270 271static ssize_t humidity1_input_show(struct device *dev, 272 struct device_attribute *attr, char *buf) 273{ 274 struct sht3x_data *data = sht3x_update_client(dev); 275 276 if (IS_ERR(data)) 277 return PTR_ERR(data); 278 279 return sprintf(buf, "%u\n", data->humidity); 280} 281 282/* 283 * limits_update must only be called from probe or with data_lock held 284 */ 285static int limits_update(struct sht3x_data *data) 286{ 287 int ret; 288 u8 index; 289 int temperature; 290 u32 humidity; 291 u16 raw; 292 char buffer[SHT3X_RESPONSE_LENGTH]; 293 const struct sht3x_limit_commands *commands; 294 struct i2c_client *client = data->client; 295 296 for (index = 0; index < SHT3X_NUM_LIMIT_CMD; index++) { 297 commands = &limit_commands[index]; 298 ret = sht3x_read_from_command(client, data, 299 commands->read_command, buffer, 300 SHT3X_RESPONSE_LENGTH, 0); 301 302 if (ret) 303 return ret; 304 305 raw = be16_to_cpup((__be16 *)buffer); 306 temperature = sht3x_extract_temperature((raw & 0x01ff) << 7); 307 humidity = sht3x_extract_humidity(raw & 0xfe00); 308 data->temperature_limits[index] = temperature; 309 data->humidity_limits[index] = humidity; 310 } 311 312 return ret; 313} 314 315static ssize_t temp1_limit_show(struct device *dev, 316 struct device_attribute *attr, 317 char *buf) 318{ 319 struct sht3x_data *data = dev_get_drvdata(dev); 320 u8 index = to_sensor_dev_attr(attr)->index; 321 int temperature_limit = data->temperature_limits[index]; 322 323 return scnprintf(buf, PAGE_SIZE, "%d\n", temperature_limit); 324} 325 326static ssize_t humidity1_limit_show(struct device *dev, 327 struct device_attribute *attr, 328 char *buf) 329{ 330 struct sht3x_data *data = dev_get_drvdata(dev); 331 u8 index = to_sensor_dev_attr(attr)->index; 332 u32 humidity_limit = data->humidity_limits[index]; 333 334 return scnprintf(buf, PAGE_SIZE, "%u\n", humidity_limit); 335} 336 337/* 338 * limit_store must only be called with data_lock held 339 */ 340static size_t limit_store(struct device *dev, 341 size_t count, 342 u8 index, 343 int temperature, 344 u32 humidity) 345{ 346 char buffer[SHT3X_CMD_LENGTH + SHT3X_WORD_LEN + SHT3X_CRC8_LEN]; 347 char *position = buffer; 348 int ret; 349 u16 raw; 350 struct sht3x_data *data = dev_get_drvdata(dev); 351 struct i2c_client *client = data->client; 352 const struct sht3x_limit_commands *commands; 353 354 commands = &limit_commands[index]; 355 356 memcpy(position, commands->write_command, SHT3X_CMD_LENGTH); 357 position += SHT3X_CMD_LENGTH; 358 /* 359 * ST = (T + 45) / 175 * 2^16 360 * SRH = RH / 100 * 2^16 361 * adapted for fixed point arithmetic and packed the same as 362 * in limit_show() 363 */ 364 raw = ((u32)(temperature + 45000) * 24543) >> (16 + 7); 365 raw |= ((humidity * 42950) >> 16) & 0xfe00; 366 367 *((__be16 *)position) = cpu_to_be16(raw); 368 position += SHT3X_WORD_LEN; 369 *position = crc8(sht3x_crc8_table, 370 position - SHT3X_WORD_LEN, 371 SHT3X_WORD_LEN, 372 SHT3X_CRC8_INIT); 373 374 mutex_lock(&data->i2c_lock); 375 ret = i2c_master_send(client, buffer, sizeof(buffer)); 376 mutex_unlock(&data->i2c_lock); 377 378 if (ret != sizeof(buffer)) 379 return ret < 0 ? ret : -EIO; 380 381 data->temperature_limits[index] = temperature; 382 data->humidity_limits[index] = humidity; 383 return count; 384} 385 386static ssize_t temp1_limit_store(struct device *dev, 387 struct device_attribute *attr, 388 const char *buf, 389 size_t count) 390{ 391 int temperature; 392 int ret; 393 struct sht3x_data *data = dev_get_drvdata(dev); 394 u8 index = to_sensor_dev_attr(attr)->index; 395 396 ret = kstrtoint(buf, 0, &temperature); 397 if (ret) 398 return ret; 399 400 temperature = clamp_val(temperature, SHT3X_MIN_TEMPERATURE, 401 SHT3X_MAX_TEMPERATURE); 402 mutex_lock(&data->data_lock); 403 ret = limit_store(dev, count, index, temperature, 404 data->humidity_limits[index]); 405 mutex_unlock(&data->data_lock); 406 407 return ret; 408} 409 410static ssize_t humidity1_limit_store(struct device *dev, 411 struct device_attribute *attr, 412 const char *buf, 413 size_t count) 414{ 415 u32 humidity; 416 int ret; 417 struct sht3x_data *data = dev_get_drvdata(dev); 418 u8 index = to_sensor_dev_attr(attr)->index; 419 420 ret = kstrtou32(buf, 0, &humidity); 421 if (ret) 422 return ret; 423 424 humidity = clamp_val(humidity, SHT3X_MIN_HUMIDITY, SHT3X_MAX_HUMIDITY); 425 mutex_lock(&data->data_lock); 426 ret = limit_store(dev, count, index, data->temperature_limits[index], 427 humidity); 428 mutex_unlock(&data->data_lock); 429 430 return ret; 431} 432 433static void sht3x_select_command(struct sht3x_data *data) 434{ 435 /* 436 * In blocking mode (clock stretching mode) the I2C bus 437 * is blocked for other traffic, thus the call to i2c_master_recv() 438 * will wait until the data is ready. For non blocking mode, we 439 * have to wait ourselves. 440 */ 441 if (data->mode > 0) { 442 data->command = sht3x_cmd_measure_periodic_mode; 443 data->wait_time = 0; 444 } else if (data->setup.blocking_io) { 445 data->command = data->setup.high_precision ? 446 sht3x_cmd_measure_blocking_hpm : 447 sht3x_cmd_measure_blocking_lpm; 448 data->wait_time = 0; 449 } else { 450 if (data->setup.high_precision) { 451 data->command = sht3x_cmd_measure_nonblocking_hpm; 452 data->wait_time = SHT3X_NONBLOCKING_WAIT_TIME_HPM; 453 } else { 454 data->command = sht3x_cmd_measure_nonblocking_lpm; 455 data->wait_time = SHT3X_NONBLOCKING_WAIT_TIME_LPM; 456 } 457 } 458} 459 460static int status_register_read(struct device *dev, 461 struct device_attribute *attr, 462 char *buffer, int length) 463{ 464 int ret; 465 struct sht3x_data *data = dev_get_drvdata(dev); 466 struct i2c_client *client = data->client; 467 468 ret = sht3x_read_from_command(client, data, sht3x_cmd_read_status_reg, 469 buffer, length, 0); 470 471 return ret; 472} 473 474static ssize_t temp1_alarm_show(struct device *dev, 475 struct device_attribute *attr, 476 char *buf) 477{ 478 char buffer[SHT3X_WORD_LEN + SHT3X_CRC8_LEN]; 479 int ret; 480 481 ret = status_register_read(dev, attr, buffer, 482 SHT3X_WORD_LEN + SHT3X_CRC8_LEN); 483 if (ret) 484 return ret; 485 486 return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x04)); 487} 488 489static ssize_t humidity1_alarm_show(struct device *dev, 490 struct device_attribute *attr, 491 char *buf) 492{ 493 char buffer[SHT3X_WORD_LEN + SHT3X_CRC8_LEN]; 494 int ret; 495 496 ret = status_register_read(dev, attr, buffer, 497 SHT3X_WORD_LEN + SHT3X_CRC8_LEN); 498 if (ret) 499 return ret; 500 501 return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x08)); 502} 503 504static ssize_t heater_enable_show(struct device *dev, 505 struct device_attribute *attr, 506 char *buf) 507{ 508 char buffer[SHT3X_WORD_LEN + SHT3X_CRC8_LEN]; 509 int ret; 510 511 ret = status_register_read(dev, attr, buffer, 512 SHT3X_WORD_LEN + SHT3X_CRC8_LEN); 513 if (ret) 514 return ret; 515 516 return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x20)); 517} 518 519static ssize_t heater_enable_store(struct device *dev, 520 struct device_attribute *attr, 521 const char *buf, 522 size_t count) 523{ 524 struct sht3x_data *data = dev_get_drvdata(dev); 525 struct i2c_client *client = data->client; 526 int ret; 527 bool status; 528 529 ret = kstrtobool(buf, &status); 530 if (ret) 531 return ret; 532 533 mutex_lock(&data->i2c_lock); 534 535 if (status) 536 ret = i2c_master_send(client, (char *)&sht3x_cmd_heater_on, 537 SHT3X_CMD_LENGTH); 538 else 539 ret = i2c_master_send(client, (char *)&sht3x_cmd_heater_off, 540 SHT3X_CMD_LENGTH); 541 542 mutex_unlock(&data->i2c_lock); 543 544 return ret; 545} 546 547static ssize_t update_interval_show(struct device *dev, 548 struct device_attribute *attr, 549 char *buf) 550{ 551 struct sht3x_data *data = dev_get_drvdata(dev); 552 553 return scnprintf(buf, PAGE_SIZE, "%u\n", 554 mode_to_update_interval[data->mode]); 555} 556 557static ssize_t update_interval_store(struct device *dev, 558 struct device_attribute *attr, 559 const char *buf, 560 size_t count) 561{ 562 u16 update_interval; 563 u8 mode; 564 int ret; 565 const char *command; 566 struct sht3x_data *data = dev_get_drvdata(dev); 567 struct i2c_client *client = data->client; 568 569 ret = kstrtou16(buf, 0, &update_interval); 570 if (ret) 571 return ret; 572 573 mode = get_mode_from_update_interval(update_interval); 574 575 mutex_lock(&data->data_lock); 576 /* mode did not change */ 577 if (mode == data->mode) { 578 mutex_unlock(&data->data_lock); 579 return count; 580 } 581 582 mutex_lock(&data->i2c_lock); 583 /* 584 * Abort periodic measure mode. 585 * To do any changes to the configuration while in periodic mode, we 586 * have to send a break command to the sensor, which then falls back 587 * to single shot (mode = 0). 588 */ 589 if (data->mode > 0) { 590 ret = i2c_master_send(client, sht3x_cmd_break, 591 SHT3X_CMD_LENGTH); 592 if (ret != SHT3X_CMD_LENGTH) 593 goto out; 594 data->mode = 0; 595 } 596 597 if (mode > 0) { 598 if (data->setup.high_precision) 599 command = periodic_measure_commands_hpm[mode - 1]; 600 else 601 command = periodic_measure_commands_lpm[mode - 1]; 602 603 /* select mode */ 604 ret = i2c_master_send(client, command, SHT3X_CMD_LENGTH); 605 if (ret != SHT3X_CMD_LENGTH) 606 goto out; 607 } 608 609 /* select mode and command */ 610 data->mode = mode; 611 sht3x_select_command(data); 612 613out: 614 mutex_unlock(&data->i2c_lock); 615 mutex_unlock(&data->data_lock); 616 if (ret != SHT3X_CMD_LENGTH) 617 return ret < 0 ? ret : -EIO; 618 619 return count; 620} 621 622static SENSOR_DEVICE_ATTR_RO(temp1_input, temp1_input, 0); 623static SENSOR_DEVICE_ATTR_RO(humidity1_input, humidity1_input, 0); 624static SENSOR_DEVICE_ATTR_RW(temp1_max, temp1_limit, limit_max); 625static SENSOR_DEVICE_ATTR_RW(humidity1_max, humidity1_limit, limit_max); 626static SENSOR_DEVICE_ATTR_RW(temp1_max_hyst, temp1_limit, limit_max_hyst); 627static SENSOR_DEVICE_ATTR_RW(humidity1_max_hyst, humidity1_limit, 628 limit_max_hyst); 629static SENSOR_DEVICE_ATTR_RW(temp1_min, temp1_limit, limit_min); 630static SENSOR_DEVICE_ATTR_RW(humidity1_min, humidity1_limit, limit_min); 631static SENSOR_DEVICE_ATTR_RW(temp1_min_hyst, temp1_limit, limit_min_hyst); 632static SENSOR_DEVICE_ATTR_RW(humidity1_min_hyst, humidity1_limit, 633 limit_min_hyst); 634static SENSOR_DEVICE_ATTR_RO(temp1_alarm, temp1_alarm, 0); 635static SENSOR_DEVICE_ATTR_RO(humidity1_alarm, humidity1_alarm, 0); 636static SENSOR_DEVICE_ATTR_RW(heater_enable, heater_enable, 0); 637static SENSOR_DEVICE_ATTR_RW(update_interval, update_interval, 0); 638 639static struct attribute *sht3x_attrs[] = { 640 &sensor_dev_attr_temp1_input.dev_attr.attr, 641 &sensor_dev_attr_humidity1_input.dev_attr.attr, 642 &sensor_dev_attr_temp1_max.dev_attr.attr, 643 &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, 644 &sensor_dev_attr_humidity1_max.dev_attr.attr, 645 &sensor_dev_attr_humidity1_max_hyst.dev_attr.attr, 646 &sensor_dev_attr_temp1_min.dev_attr.attr, 647 &sensor_dev_attr_temp1_min_hyst.dev_attr.attr, 648 &sensor_dev_attr_humidity1_min.dev_attr.attr, 649 &sensor_dev_attr_humidity1_min_hyst.dev_attr.attr, 650 &sensor_dev_attr_temp1_alarm.dev_attr.attr, 651 &sensor_dev_attr_humidity1_alarm.dev_attr.attr, 652 &sensor_dev_attr_heater_enable.dev_attr.attr, 653 &sensor_dev_attr_update_interval.dev_attr.attr, 654 NULL 655}; 656 657static struct attribute *sts3x_attrs[] = { 658 &sensor_dev_attr_temp1_input.dev_attr.attr, 659 NULL 660}; 661 662ATTRIBUTE_GROUPS(sht3x); 663ATTRIBUTE_GROUPS(sts3x); 664 665static const struct i2c_device_id sht3x_ids[]; 666 667static int sht3x_probe(struct i2c_client *client) 668{ 669 int ret; 670 struct sht3x_data *data; 671 struct device *hwmon_dev; 672 struct i2c_adapter *adap = client->adapter; 673 struct device *dev = &client->dev; 674 const struct attribute_group **attribute_groups; 675 676 /* 677 * we require full i2c support since the sht3x uses multi-byte read and 678 * writes as well as multi-byte commands which are not supported by 679 * the smbus protocol 680 */ 681 if (!i2c_check_functionality(adap, I2C_FUNC_I2C)) 682 return -ENODEV; 683 684 ret = i2c_master_send(client, sht3x_cmd_clear_status_reg, 685 SHT3X_CMD_LENGTH); 686 if (ret != SHT3X_CMD_LENGTH) 687 return ret < 0 ? ret : -ENODEV; 688 689 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); 690 if (!data) 691 return -ENOMEM; 692 693 data->setup.blocking_io = false; 694 data->setup.high_precision = true; 695 data->mode = 0; 696 data->last_update = jiffies - msecs_to_jiffies(3000); 697 data->client = client; 698 crc8_populate_msb(sht3x_crc8_table, SHT3X_CRC8_POLYNOMIAL); 699 700 if (client->dev.platform_data) 701 data->setup = *(struct sht3x_platform_data *)dev->platform_data; 702 703 sht3x_select_command(data); 704 705 mutex_init(&data->i2c_lock); 706 mutex_init(&data->data_lock); 707 708 /* 709 * An attempt to read limits register too early 710 * causes a NACK response from the chip. 711 * Waiting for an empirical delay of 500 us solves the issue. 712 */ 713 usleep_range(500, 600); 714 715 ret = limits_update(data); 716 if (ret) 717 return ret; 718 719 if (i2c_match_id(sht3x_ids, client)->driver_data == sts3x) 720 attribute_groups = sts3x_groups; 721 else 722 attribute_groups = sht3x_groups; 723 724 hwmon_dev = devm_hwmon_device_register_with_groups(dev, 725 client->name, 726 data, 727 attribute_groups); 728 729 if (IS_ERR(hwmon_dev)) 730 dev_dbg(dev, "unable to register hwmon device\n"); 731 732 return PTR_ERR_OR_ZERO(hwmon_dev); 733} 734 735/* device ID table */ 736static const struct i2c_device_id sht3x_ids[] = { 737 {"sht3x", sht3x}, 738 {"sts3x", sts3x}, 739 {} 740}; 741 742MODULE_DEVICE_TABLE(i2c, sht3x_ids); 743 744static struct i2c_driver sht3x_i2c_driver = { 745 .driver.name = "sht3x", 746 .probe_new = sht3x_probe, 747 .id_table = sht3x_ids, 748}; 749 750module_i2c_driver(sht3x_i2c_driver); 751 752MODULE_AUTHOR("David Frey <david.frey@sensirion.com>"); 753MODULE_AUTHOR("Pascal Sachs <pascal.sachs@sensirion.com>"); 754MODULE_DESCRIPTION("Sensirion SHT3x humidity and temperature sensor driver"); 755MODULE_LICENSE("GPL");