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