Commit 50c22cd1 authored by Matt Ranostay's avatar Matt Ranostay Committed by Guenter Roeck

hwmon: (sht3x) add humidity heater element control

The enables control of the SHT31 sensors heating element that can turned
on to remove excess humidity.

Cc: Guenter Roeck <linux@roeck-us.net>
Cc: David Frey <david.frey@sensirion.com>
Signed-off-by: default avatarMatt Ranostay <mranostay@gmail.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 803decce
...@@ -67,6 +67,10 @@ temp1_alarm: alarm flag is set to 1 if the temperature is outside the ...@@ -67,6 +67,10 @@ temp1_alarm: alarm flag is set to 1 if the temperature is outside the
configured limits. Alarm only works in periodic measure mode configured limits. Alarm only works in periodic measure mode
humidity1_alarm: alarm flag is set to 1 if the humidity is outside the humidity1_alarm: alarm flag is set to 1 if the humidity is outside the
configured limits. Alarm only works in periodic measure mode configured limits. Alarm only works in periodic measure mode
heater_enable: heater enable, heating element removes excess humidity from
sensor
0: turned off
1: turned on
update_interval: update interval, 0 for single shot, interval in msec update_interval: update interval, 0 for single shot, interval in msec
for periodic measurement. If the interval is not supported for periodic measurement. If the interval is not supported
by the sensor, the next faster interval is chosen by the sensor, the next faster interval is chosen
...@@ -44,6 +44,10 @@ static const unsigned char sht3x_cmd_measure_nonblocking_lpm[] = { 0x24, 0x16 }; ...@@ -44,6 +44,10 @@ static const unsigned char sht3x_cmd_measure_nonblocking_lpm[] = { 0x24, 0x16 };
static const unsigned char sht3x_cmd_measure_periodic_mode[] = { 0xe0, 0x00 }; static const unsigned char sht3x_cmd_measure_periodic_mode[] = { 0xe0, 0x00 };
static const unsigned char sht3x_cmd_break[] = { 0x30, 0x93 }; static const unsigned char sht3x_cmd_break[] = { 0x30, 0x93 };
/* commands for heater control */
static const unsigned char sht3x_cmd_heater_on[] = { 0x30, 0x6d };
static const unsigned char sht3x_cmd_heater_off[] = { 0x30, 0x66 };
/* other commands */ /* other commands */
static const unsigned char sht3x_cmd_read_status_reg[] = { 0xf3, 0x2d }; static const unsigned char sht3x_cmd_read_status_reg[] = { 0xf3, 0x2d };
static const unsigned char sht3x_cmd_clear_status_reg[] = { 0x30, 0x41 }; static const unsigned char sht3x_cmd_clear_status_reg[] = { 0x30, 0x41 };
...@@ -507,6 +511,49 @@ static ssize_t humidity1_alarm_show(struct device *dev, ...@@ -507,6 +511,49 @@ static ssize_t humidity1_alarm_show(struct device *dev,
return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x08)); return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x08));
} }
static ssize_t heater_enable_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
char buffer[SHT3X_WORD_LEN + SHT3X_CRC8_LEN];
int ret;
ret = status_register_read(dev, attr, buffer,
SHT3X_WORD_LEN + SHT3X_CRC8_LEN);
if (ret)
return ret;
return scnprintf(buf, PAGE_SIZE, "%d\n", !!(buffer[0] & 0x20));
}
static ssize_t heater_enable_store(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct sht3x_data *data = dev_get_drvdata(dev);
struct i2c_client *client = data->client;
int ret;
bool status;
ret = kstrtobool(buf, &status);
if (ret)
return ret;
mutex_lock(&data->i2c_lock);
if (status)
ret = i2c_master_send(client, (char *)&sht3x_cmd_heater_on,
SHT3X_CMD_LENGTH);
else
ret = i2c_master_send(client, (char *)&sht3x_cmd_heater_off,
SHT3X_CMD_LENGTH);
mutex_unlock(&data->i2c_lock);
return ret;
}
static ssize_t update_interval_show(struct device *dev, static ssize_t update_interval_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
...@@ -612,6 +659,8 @@ static SENSOR_DEVICE_ATTR(humidity1_min_hyst, S_IRUGO | S_IWUSR, ...@@ -612,6 +659,8 @@ static SENSOR_DEVICE_ATTR(humidity1_min_hyst, S_IRUGO | S_IWUSR,
static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, temp1_alarm_show, NULL, 0); static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, temp1_alarm_show, NULL, 0);
static SENSOR_DEVICE_ATTR(humidity1_alarm, S_IRUGO, humidity1_alarm_show, static SENSOR_DEVICE_ATTR(humidity1_alarm, S_IRUGO, humidity1_alarm_show,
NULL, 0); NULL, 0);
static SENSOR_DEVICE_ATTR(heater_enable, S_IRUGO | S_IWUSR,
heater_enable_show, heater_enable_store, 0);
static SENSOR_DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, static SENSOR_DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR,
update_interval_show, update_interval_store, 0); update_interval_show, update_interval_store, 0);
...@@ -628,6 +677,7 @@ static struct attribute *sht3x_attrs[] = { ...@@ -628,6 +677,7 @@ static struct attribute *sht3x_attrs[] = {
&sensor_dev_attr_humidity1_min_hyst.dev_attr.attr, &sensor_dev_attr_humidity1_min_hyst.dev_attr.attr,
&sensor_dev_attr_temp1_alarm.dev_attr.attr, &sensor_dev_attr_temp1_alarm.dev_attr.attr,
&sensor_dev_attr_humidity1_alarm.dev_attr.attr, &sensor_dev_attr_humidity1_alarm.dev_attr.attr,
&sensor_dev_attr_heater_enable.dev_attr.attr,
&sensor_dev_attr_update_interval.dev_attr.attr, &sensor_dev_attr_update_interval.dev_attr.attr,
NULL NULL
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment