Lines Matching +full:per +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* Sensirion SHT3x-DIS humidity and temperature sensor driver.
17 #include <linux/hwmon-sysfs.h>
47 /* delays for single-shot mode i2c commands, both in us */
58 #define SHT3X_MIN_TEMPERATURE -45000
85 /* 0.5 measurements per second */
87 /* 1 measurements per second */
89 /* 2 measurements per second */
91 /* 4 measurements per second */
93 /* 10 measurements per second */
99 /* 0.5 measurements per second */
101 /* 1 measurements per second */
103 /* 2 measurements per second */
105 /* 4 measurements per second */
107 /* 10 measurements per second */
113 /* 0.5 measurements per second */
115 /* 1 measurements per second */
117 /* 2 measurements per second */
119 /* 4 measurements per second */
121 /* 10 measurements per second */
201 return number_of_modes - 1; in get_mode_from_update_interval()
211 mutex_lock(&data->i2c_lock); in sht3x_read_from_command()
215 ret = ret < 0 ? ret : -EIO; in sht3x_read_from_command()
224 ret = ret < 0 ? ret : -EIO; in sht3x_read_from_command()
230 mutex_unlock(&data->i2c_lock); in sht3x_read_from_command()
238 * T = -45 + 175 * ST / 2^16 in sht3x_extract_temperature()
241 return ((21875 * (int)raw) >> 13) - 45000; in sht3x_extract_temperature()
254 static struct sht3x_data *sht3x_update_client(struct device *dev) in sht3x_update_client()
257 struct i2c_client *client = data->client; in sht3x_update_client()
258 u16 interval_ms = mode_to_update_interval[data->mode]; in sht3x_update_client()
264 mutex_lock(&data->data_lock); in sht3x_update_client()
266 * Only update cached readings once per update interval in periodic in sht3x_update_client()
273 if (time_after(jiffies, data->last_update + interval_jiffies)) { in sht3x_update_client()
274 ret = sht3x_read_from_command(client, data, data->command, buf, in sht3x_update_client()
275 sizeof(buf), data->wait_time); in sht3x_update_client()
280 data->temperature = sht3x_extract_temperature(val); in sht3x_update_client()
282 data->humidity = sht3x_extract_humidity(val); in sht3x_update_client()
283 data->last_update = jiffies; in sht3x_update_client()
287 mutex_unlock(&data->data_lock); in sht3x_update_client()
294 static int temp1_input_read(struct device *dev) in temp1_input_read()
301 return data->temperature; in temp1_input_read()
304 static int humidity1_input_read(struct device *dev) in humidity1_input_read()
311 return data->humidity; in humidity1_input_read()
326 struct i2c_client *client = data->client; in limits_update()
331 commands->read_command, buffer, in limits_update()
340 data->temperature_limits[index] = temperature; in limits_update()
341 data->humidity_limits[index] = humidity; in limits_update()
347 static int temp1_limit_read(struct device *dev, int index) in temp1_limit_read()
351 return data->temperature_limits[index]; in temp1_limit_read()
354 static int humidity1_limit_read(struct device *dev, int index) in humidity1_limit_read()
358 return data->humidity_limits[index]; in humidity1_limit_read()
364 static size_t limit_write(struct device *dev, in limit_write()
374 struct i2c_client *client = data->client; in limit_write()
379 memcpy(position, commands->write_command, SHT3X_CMD_LENGTH); in limit_write()
393 position - SHT3X_WORD_LEN, in limit_write()
397 mutex_lock(&data->i2c_lock); in limit_write()
399 mutex_unlock(&data->i2c_lock); in limit_write()
402 return ret < 0 ? ret : -EIO; in limit_write()
404 data->temperature_limits[index] = temperature; in limit_write()
405 data->humidity_limits[index] = humidity; in limit_write()
410 static int temp1_limit_write(struct device *dev, int index, int val) in temp1_limit_write()
418 mutex_lock(&data->data_lock); in temp1_limit_write()
420 data->humidity_limits[index]); in temp1_limit_write()
421 mutex_unlock(&data->data_lock); in temp1_limit_write()
426 static int humidity1_limit_write(struct device *dev, int index, int val) in humidity1_limit_write()
433 mutex_lock(&data->data_lock); in humidity1_limit_write()
434 ret = limit_write(dev, index, data->temperature_limits[index], in humidity1_limit_write()
436 mutex_unlock(&data->data_lock); in humidity1_limit_write()
444 * For single-shot mode, only non blocking mode is support, in sht3x_select_command()
447 if (data->mode > 0) { in sht3x_select_command()
448 data->command = sht3x_cmd_measure_periodic_mode; in sht3x_select_command()
449 data->wait_time = 0; in sht3x_select_command()
451 if (data->repeatability == high_repeatability) { in sht3x_select_command()
452 data->command = sht3x_cmd_measure_single_hpm; in sht3x_select_command()
453 data->wait_time = SHT3X_SINGLE_WAIT_TIME_HPM; in sht3x_select_command()
454 } else if (data->repeatability == medium_repeatability) { in sht3x_select_command()
455 data->command = sht3x_cmd_measure_single_mpm; in sht3x_select_command()
456 data->wait_time = SHT3X_SINGLE_WAIT_TIME_MPM; in sht3x_select_command()
458 data->command = sht3x_cmd_measure_single_lpm; in sht3x_select_command()
459 data->wait_time = SHT3X_SINGLE_WAIT_TIME_LPM; in sht3x_select_command()
464 static int status_register_read(struct device *dev, in status_register_read()
469 struct i2c_client *client = data->client; in status_register_read()
477 static int temp1_alarm_read(struct device *dev) in temp1_alarm_read()
490 static int humidity1_alarm_read(struct device *dev) in humidity1_alarm_read()
503 static ssize_t heater_enable_show(struct device *dev, in heater_enable_show()
518 static ssize_t heater_enable_store(struct device *dev, in heater_enable_store()
524 struct i2c_client *client = data->client; in heater_enable_store()
532 mutex_lock(&data->i2c_lock); in heater_enable_store()
541 mutex_unlock(&data->i2c_lock); in heater_enable_store()
546 static int update_interval_read(struct device *dev) in update_interval_read()
550 return mode_to_update_interval[data->mode]; in update_interval_read()
553 static int update_interval_write(struct device *dev, int val) in update_interval_write()
559 struct i2c_client *client = data->client; in update_interval_write()
563 mutex_lock(&data->data_lock); in update_interval_write()
565 if (mode == data->mode) { in update_interval_write()
566 mutex_unlock(&data->data_lock); in update_interval_write()
570 mutex_lock(&data->i2c_lock); in update_interval_write()
577 if (data->mode > 0) { in update_interval_write()
582 data->mode = 0; in update_interval_write()
586 if (data->repeatability == high_repeatability) in update_interval_write()
587 command = periodic_measure_commands_hpm[mode - 1]; in update_interval_write()
588 else if (data->repeatability == medium_repeatability) in update_interval_write()
589 command = periodic_measure_commands_mpm[mode - 1]; in update_interval_write()
591 command = periodic_measure_commands_lpm[mode - 1]; in update_interval_write()
600 data->mode = mode; in update_interval_write()
604 mutex_unlock(&data->i2c_lock); in update_interval_write()
605 mutex_unlock(&data->data_lock); in update_interval_write()
607 return ret < 0 ? ret : -EIO; in update_interval_write()
612 static ssize_t repeatability_show(struct device *dev, in repeatability_show()
618 return sysfs_emit(buf, "%d\n", data->repeatability); in repeatability_show()
621 static ssize_t repeatability_store(struct device *dev, in repeatability_store()
636 return -EINVAL; in repeatability_store()
638 data->repeatability = val; in repeatability_store()
683 if (chip_data->chip_id == sts3x) in sht3x_is_visible()
705 static int sht3x_read(struct device *dev, enum hwmon_sensor_types type, in sht3x_read()
717 return -EOPNOTSUPP; in sht3x_read()
745 return -EOPNOTSUPP; in sht3x_read()
773 return -EOPNOTSUPP; in sht3x_read()
777 return -EOPNOTSUPP; in sht3x_read()
783 static int sht3x_write(struct device *dev, enum hwmon_sensor_types type, in sht3x_write()
794 return -EOPNOTSUPP; in sht3x_write()
811 return -EOPNOTSUPP; in sht3x_write()
829 return -EOPNOTSUPP; in sht3x_write()
833 return -EOPNOTSUPP; in sht3x_write()
841 struct i2c_client *client = data->client; in sht3x_serial_number_read()
850 data->serial_number = (buffer[0] << 24) | (buffer[1] << 16) | in sht3x_serial_number_read()
853 debugfs_create_u32("serial_number", 0444, client->debugfs, &data->serial_number); in sht3x_serial_number_read()
871 struct device *hwmon_dev; in sht3x_probe()
872 struct i2c_adapter *adap = client->adapter; in sht3x_probe()
873 struct device *dev = &client->dev; in sht3x_probe()
876 * we require full i2c support since the sht3x uses multi-byte read and in sht3x_probe()
877 * writes as well as multi-byte commands which are not supported by in sht3x_probe()
881 return -ENODEV; in sht3x_probe()
886 return ret < 0 ? ret : -ENODEV; in sht3x_probe()
890 return -ENOMEM; in sht3x_probe()
892 data->repeatability = high_repeatability; in sht3x_probe()
893 data->mode = 0; in sht3x_probe()
894 data->last_update = jiffies - msecs_to_jiffies(3000); in sht3x_probe()
895 data->client = client; in sht3x_probe()
896 data->chip_id = (uintptr_t)i2c_get_match_data(client); in sht3x_probe()
901 mutex_init(&data->i2c_lock); in sht3x_probe()
902 mutex_init(&data->data_lock); in sht3x_probe()
915 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data, in sht3x_probe()
925 /* device ID table */