From nobody Sun Dec 28 22:49:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EA339C10DC3 for ; Mon, 4 Dec 2023 16:51:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343593AbjLDQvv (ORCPT ); Mon, 4 Dec 2023 11:51:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49078 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229513AbjLDQvn (ORCPT ); Mon, 4 Dec 2023 11:51:43 -0500 Received: from mxout017.mail.hostpoint.ch (mxout017.mail.hostpoint.ch [IPv6:2a00:d70:0:e::317]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2B0F2BB; Mon, 4 Dec 2023 08:51:48 -0800 (PST) Received: from [10.0.2.46] (helo=asmtp013.mail.hostpoint.ch) by mxout017.mail.hostpoint.ch with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.96.2 (FreeBSD)) (envelope-from ) id 1rACAV-000EP4-1k; Mon, 04 Dec 2023 17:51:39 +0100 Received: from 157.20.79.83.dynamic.wline.res.cust.swisscom.ch ([83.79.20.157] helo=thinkpad.localdomain) by asmtp013.mail.hostpoint.ch with esmtpa (Exim 4.96.2 (FreeBSD)) (envelope-from ) id 1rACAV-000JX2-1G; Mon, 04 Dec 2023 17:51:39 +0100 X-Authenticated-Sender-Id: code@stefan-gloor.ch From: Stefan Gloor To: jdelvare@suse.com, linux@roeck-us.net, corbet@lwn.net, linux-hwmon@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stefan Gloor Subject: [PATCH v2 1/2] hwmon: sht3x: add sts3x support Date: Mon, 4 Dec 2023 17:50:03 +0100 Message-ID: <20231204165004.8491-2-code@stefan-gloor.ch> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231204165004.8491-1-code@stefan-gloor.ch> References: <20231204165004.8491-1-code@stefan-gloor.ch> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Vs-State: 0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add information regarding the existing support for sts3x series and update the datasheet links. Signed-off-by: Stefan Gloor --- Documentation/hwmon/sht3x.rst | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Documentation/hwmon/sht3x.rst b/Documentation/hwmon/sht3x.rst index 87864ffd1777..957c854f5d08 100644 --- a/Documentation/hwmon/sht3x.rst +++ b/Documentation/hwmon/sht3x.rst @@ -9,7 +9,19 @@ Supported chips: =20 Addresses scanned: none =20 - Datasheet: https://www.sensirion.com/file/datasheet_sht3x_digital + Datasheets: + - https://sensirion.com/media/documents/213E6A3B/63A5A569/Datashee= t_SHT3x_DIS.pdf + - https://sensirion.com/media/documents/051DF50B/639C8101/Sensirio= n_Humidity_and_Temperature_Sensors_Datasheet_SHT33.pdf + + * Sensirion STS3x-DIS + + Prefix: 'sts3x' + + Addresses scanned: none + + Datasheets: + - https://sensirion.com/media/documents/1DA31AFD/61641F76/Sensirio= n_Temperature_Sensors_STS3x_Datasheet.pdf + - https://sensirion.com/media/documents/292A335C/65537BAF/Sensirio= n_Datasheet_STS32_STS33.pdf =20 Author: =20 @@ -19,16 +31,17 @@ Author: Description ----------- =20 -This driver implements support for the Sensirion SHT3x-DIS chip, a humidity -and temperature sensor. Temperature is measured in degrees celsius, relati= ve -humidity is expressed as a percentage. In the sysfs interface, all values = are -scaled by 1000, i.e. the value for 31.5 degrees celsius is 31500. +This driver implements support for the Sensirion SHT3x-DIS and STS3x-DIS +series of humidity and temperature sensors. Temperature is measured in deg= rees +celsius, relative humidity is expressed as a percentage. In the sysfs inte= rface, +all values are scaled by 1000, i.e. the value for 31.5 degrees celsius is = 31500. =20 The device communicates with the I2C protocol. Sensors can have the I2C -addresses 0x44 or 0x45, depending on the wiring. See -Documentation/i2c/instantiating-devices.rst for methods to instantiate the= device. +addresses 0x44 or 0x45 (0x4a or 0x4b for sts3x), depending on the wiring. = See +Documentation/i2c/instantiating-devices.rst for methods to instantiate the +device. =20 -Even if sht3x sensor supports clock-strech(blocking mode) and non-strench +Even if sht3x sensor supports clock-stretch (blocking mode) and non-stretch (non-blocking mode) in single-shot mode, this driver only supports the lat= ter. =20 The sht3x sensor supports a single shot mode as well as 5 periodic measure --=20 2.41.0 From nobody Sun Dec 28 22:49:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0BAB6C4167B for ; Mon, 4 Dec 2023 16:51:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235439AbjLDQvt (ORCPT ); Mon, 4 Dec 2023 11:51:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235424AbjLDQvn (ORCPT ); Mon, 4 Dec 2023 11:51:43 -0500 Received: from mxout017.mail.hostpoint.ch (mxout017.mail.hostpoint.ch [IPv6:2a00:d70:0:e::317]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 356B3C6; Mon, 4 Dec 2023 08:51:48 -0800 (PST) Received: from [10.0.2.46] (helo=asmtp013.mail.hostpoint.ch) by mxout017.mail.hostpoint.ch with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.96.2 (FreeBSD)) (envelope-from ) id 1rACAV-000EP8-2S; Mon, 04 Dec 2023 17:51:39 +0100 Received: from 157.20.79.83.dynamic.wline.res.cust.swisscom.ch ([83.79.20.157] helo=thinkpad.localdomain) by asmtp013.mail.hostpoint.ch with esmtpa (Exim 4.96.2 (FreeBSD)) (envelope-from ) id 1rACAV-000JX2-1i; Mon, 04 Dec 2023 17:51:39 +0100 X-Authenticated-Sender-Id: code@stefan-gloor.ch From: Stefan Gloor To: jdelvare@suse.com, linux@roeck-us.net, corbet@lwn.net, linux-hwmon@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Stefan Gloor Subject: [PATCH v2 2/2] hwmon: sht3x: read out sensor serial number Date: Mon, 4 Dec 2023 17:50:04 +0100 Message-ID: <20231204165004.8491-3-code@stefan-gloor.ch> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231204165004.8491-1-code@stefan-gloor.ch> References: <20231204165004.8491-1-code@stefan-gloor.ch> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Vs-State: 0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The temperature/humidity sensors of the STS3x/SHT3x family are calibrated and factory-programmed with a unique serial number. For some sensors, this serial number can be used to obtain a calibration certificate via an API provided by the manufacturer (Sensirion). Expose the serial number via debugfs. Tested with: 2x STS31, 1x STS32, 1x SHT31 Signed-off-by: Stefan Gloor --- Documentation/hwmon/sht3x.rst | 11 +++++++ drivers/hwmon/sht3x.c | 55 +++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/Documentation/hwmon/sht3x.rst b/Documentation/hwmon/sht3x.rst index 957c854f5d08..9585fa7c5a5d 100644 --- a/Documentation/hwmon/sht3x.rst +++ b/Documentation/hwmon/sht3x.rst @@ -65,6 +65,10 @@ When the temperature and humidity readings move back bet= ween the hysteresis values, the alert bit is set to 0 and the alert pin on the sensor is set to low. =20 +The serial number exposed to debugfs allows for unique identification of t= he +sensors. For sts32, sts33 and sht33, the manufacturer provides calibration +certificates through an API. + sysfs-Interface --------------- =20 @@ -99,3 +103,10 @@ repeatability: write or read repeatability, higher= repeatability means - 1: medium repeatability - 2: high repeatability =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D + +debugfs-Interface +----------------- + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D +serial_number: unique serial number of the sensor in decimal +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D diff --git a/drivers/hwmon/sht3x.c b/drivers/hwmon/sht3x.c index 79657910b79e..537365c6213b 100644 --- a/drivers/hwmon/sht3x.c +++ b/drivers/hwmon/sht3x.c @@ -10,6 +10,7 @@ =20 #include #include +#include #include #include #include @@ -41,6 +42,7 @@ static const unsigned char sht3x_cmd_heater_off[] = =3D { 0x30, 0x66 }; /* other commands */ static const unsigned char sht3x_cmd_read_status_reg[] =3D { 0xf3,= 0x2d }; static const unsigned char sht3x_cmd_clear_status_reg[] =3D { 0x30,= 0x41 }; +static const unsigned char sht3x_cmd_read_serial_number[] =3D { 0x37,= 0x80 }; =20 /* delays for single-shot mode i2c commands, both in us */ #define SHT3X_SINGLE_WAIT_TIME_HPM 15000 @@ -163,12 +165,14 @@ struct sht3x_data { enum sht3x_chips chip_id; struct mutex i2c_lock; /* lock for sending i2c commands */ struct mutex data_lock; /* lock for updating driver data */ + struct dentry *debugfs; =20 u8 mode; const unsigned char *command; u32 wait_time; /* in us*/ unsigned long last_update; /* last update in periodic mode*/ enum sht3x_repeatability repeatability; + u32 serial_number; =20 /* * cached values for temperature and humidity and limits @@ -831,6 +835,50 @@ static int sht3x_write(struct device *dev, enum hwmon_= sensor_types type, } } =20 +#ifdef CONFIG_DEBUG_FS + +static void sht3x_debugfs_init(struct sht3x_data *data) +{ + char name[32]; + struct dentry *sensor_dir; + + data->debugfs =3D debugfs_lookup("sht3x", NULL); + if (IS_ERR_OR_NULL(data->debugfs)) + data->debugfs =3D debugfs_create_dir("sht3x", NULL); + + snprintf(name, sizeof(name), "i2c%u-%02x", + data->client->adapter->nr, data->client->addr); + sensor_dir =3D debugfs_create_dir(name, data->debugfs); + debugfs_create_u32("serial_number", 0444, + sensor_dir, &data->serial_number); +} + +#else + +static void sht3x_debugfs_init(struct sht3x_data *data) +{ +} + +#endif + +static int sht3x_serial_number_read(struct sht3x_data *data) +{ + int ret; + char buffer[SHT3X_RESPONSE_LENGTH]; + struct i2c_client *client =3D data->client; + + ret =3D sht3x_read_from_command(client, data, + sht3x_cmd_read_serial_number, + buffer, + SHT3X_RESPONSE_LENGTH, 0); + if (ret) + return ret; + + data->serial_number =3D (buffer[0] << 24) | (buffer[1] << 16) | + (buffer[3] << 8) | buffer[4]; + return ret; +} + static const struct hwmon_ops sht3x_ops =3D { .is_visible =3D sht3x_is_visible, .read =3D sht3x_read, @@ -899,6 +947,13 @@ static int sht3x_probe(struct i2c_client *client) if (ret) return ret; =20 + ret =3D sht3x_serial_number_read(data); + if (ret) { + dev_dbg(dev, "unable to read serial number\n"); + data->serial_number =3D 0; + } + sht3x_debugfs_init(data); + hwmon_dev =3D devm_hwmon_device_register_with_info(dev, client->name, data, --=20 2.41.0