From nobody Fri Sep 25 00:03:00 2026 Received: from fortymile.utu.fi (fortymile.utu.fi [130.232.247.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3012A4F85DE; Fri, 18 Sep 2026 13:41:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=130.232.247.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738888; cv=none; b=OlAsEztJIkhqI/joJAzM3Pvgk+VjWYeLMHXLMqgrB0tUoZT1Z9XmU7aMmZDY8er2JgeBEgr4Vude6MmtHmYIBpGYdgHpQmci0makSOroQx6L/fAPOV2lMjyS0GBRqHcxh4LBKwXB6GAA7YWyYDf5Rf8Wq/i5McJQ9zwaEOrO4ow= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738888; c=relaxed/simple; bh=kkdoe7sTV6FZQcGXL7P3EQs908f175NF3RWzIpamD4s=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=GtBE4nGpnv11fy8wq1Cm0siLOYBWxb046HbKk60GhajOjJ66jE9AfOy1PMNySCCHs0H7y/C1zfc8FpJ3vJlGXloq4moftHHPUg4Euh0hOVRJR9o+/HJiteBJkrBAU6Awy4YzPt22izJwAuOerBpNFBqsDTQbIr/cMd9KQ+3QeQM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=utu.fi; spf=pass smtp.mailfrom=utu.fi; dkim=pass (2048-bit key) header.d=utu.fi header.i=@utu.fi header.b=dMuW77DN; arc=none smtp.client-ip=130.232.247.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=utu.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=utu.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=utu.fi header.i=@utu.fi header.b="dMuW77DN" Received: from smtp-03.utu.fi (smtp-03.utu.fi [130.232.207.30]) by fortymile.utu.fi with ESMTPS id 68IDf4ek029517-68IDf4em029517 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Fri, 18 Sep 2026 16:41:04 +0300 Received: from ex19-16.utu.fi ([130.232.247.56]) by smtp-03.utu.fi with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1x7Ypr-007PQp-Tt; Fri, 18 Sep 2026 16:41:03 +0300 Received: from lorpotin (91.145.105.139) by ex19-16.utu.fi (130.232.247.56) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 16:41:03 +0300 From: Jaakko Koivisto To: Andreas Klinger , Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko CC: , , Jaakko Koivisto Subject: [PATCH 1/3] iio: chemical: sgp40: Implement get_serial_number-command Date: Fri, 18 Sep 2026 16:40:17 +0300 Message-ID: <20260918134019.1101308-2-jmatko@utu.fi> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260918134019.1101308-1-jmatko@utu.fi> References: <20260918134019.1101308-1-jmatko@utu.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: ex19-16.utu.fi (130.232.247.56) To ex19-16.utu.fi (130.232.247.56) X-FEAS-BEC-Info: WlpIGw0aAQkEARIJHAEHBlJSCRoLAAEeDUhZUEhYSFhIWkhZXkguLT4lWFxYWFhYWFBeUVxfSFhISFpdSAIJCQMDB0YFCUYDBwEeARscBygdHB1GDgFIWUhZXkgJAygB HEUDBAEGDw0aRgwNSFhIWkhZXEhZW1hGWltaRlpYX0ZbWEhQSFhIWEhdSFhIWEhYSFleSAkDKAEcRQMEAQYPDRpGDA1IWEhZXUgJBgwRKAMNGgYNBEYHGg9IWEhaWUgM BA0LAAYNGigKCREEAQoaDUYLBwVIWEhaXUgEAQYdEEUBAQcoHg8NGkYDDRoGDQRGBxoPSFhIWVBIBh0GB0YbCSgJBgkEBw9GCwcFSFg= X-FEAS-Client-IP: 130.232.207.30 X-FE-Last-Public-Client-IP: 130.232.207.30 X-FE-Policy-ID: 3:5:2:SYSTEM X-FE-Hostname: fortymile.utu.fi DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; d=utu.fi; s=out-utu-v3; c=relaxed/relaxed; h=from:to:cc:subject:date:message-id:references:mime-version:content-type; bh=FWHLj1ESnVWitIfn9IvPlEG74Udso9jFOrjE+1hMxZE=; b=dMuW77DNxODWfgNtCkmdd9aVa1LiJ7S6wxkYsqWptkgOHcZTKtZH6NCfB5eiFIfMHwYokIrjQyPv k7MrWPQh9cKqGlaj+PuH3JUVaOE4isFy4thIXr5Me1zKClSJlIvqL4QR2OJw9UOA5GXtzv5LbX76 NKA2nm9TKHXa45zdIqCpWmDoNeYZv3Fk0DXjbSiloKkcPo0XfqYNkybwYiCSKDp07a0GWY5AJ8R+ p8rcmBg/ae/sqKgYgZsfV8hAQxX65ut12UKXAB6IgqriwSz7mm6kzuHPoAKc7Ds88v13oUdFitCr K2OwSzlDqNcXTx4PqtO7fQ/pz47y8SKGSjlwxA== Content-Type: text/plain; charset="utf-8" -Retrieve the chip serial number. -Present the serial number to userspace as device attribute. -Rename the tg_measure -struct now that is is used for multiple commands. Signed-off-by: Jaakko Koivisto --- drivers/iio/chemical/sgp40.c | 78 +++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/drivers/iio/chemical/sgp40.c b/drivers/iio/chemical/sgp40.c index b2b5e32a9eb2..c1e2a992ec2a 100644 --- a/drivers/iio/chemical/sgp40.c +++ b/drivers/iio/chemical/sgp40.c @@ -35,6 +35,7 @@ #include #include #include +#include =20 /* * floating point calculation of voc is done as integer @@ -53,11 +54,12 @@ struct sgp40_data { int rht; int temp; int res_calibbias; + u64 serial_number; /* Prevent concurrent access to rht, tmp, calibbias */ struct mutex lock; }; =20 -struct sgp40_tg_measure { +struct sgp40_command { u8 command[2]; __be16 rht_ticks; u8 rht_crc; @@ -70,6 +72,18 @@ struct sgp40_tg_result { u8 res_crc; } __packed; =20 +/* + * Datasheet table 16. Serial number is given as 48-bit value 0xAAAABBBBCC= CC. + */ +struct sgp40_serial_number_result { + __be16 A; + u8 A_crc; + __be16 B; + u8 B_crc; + __be16 C; + u8 C_crc; +} __packed; + static const struct iio_chan_spec sgp40_channels[] =3D { { .type =3D IIO_CONCENTRATION, @@ -162,6 +176,40 @@ static int sgp40_calc_voc(struct sgp40_data *data, u16= resistance_raw, int *voc) return 0; } =20 +static int sgp40_get_serial_number(struct sgp40_data *data) +{ + int ret; + struct i2c_client *client =3D data->client; + struct sgp40_command get_sn =3D {.command =3D {0x36, 0x82}}; + struct sgp40_serial_number_result res; + + ret =3D i2c_master_send(client, (char*)&get_sn, sizeof(get_sn.command)); + if (ret !=3D sizeof(get_sn.command)) { + dev_err(data->dev, "i2c_master_send ret: %d, expected %zu", ret, sizeof(= get_sn.command)); + return -EIO; + } + msleep(1); + ret =3D i2c_master_recv(client, (char*)&res, sizeof(res)); + if (ret < 0) + return ret; + if (ret !=3D sizeof(res)) { + dev_err(data->dev, "i2c_master_recv ret: %d, expected: %zu", ret, sizeof= (res)); + return -EIO; + } + + if (crc8(sgp40_crc8_table, (u8*)&res.A, 2, SGP40_CRC8_INIT) !=3D res.A_cr= c || + crc8(sgp40_crc8_table, (u8*)&res.B, 2, SGP40_CRC8_INIT) !=3D res.B_cr= c || + crc8(sgp40_crc8_table, (u8*)&res.C, 2, SGP40_CRC8_INIT) !=3D res.C_cr= c) + { + dev_warn(data->dev, "CRC error in get_serial_number"); + } + + data->serial_number =3D 0LL | ((u64)be16_to_cpu(res.A) << 32) | ((u64)be1= 6_to_cpu(res.B) << 16) | (u64)be16_to_cpu(res.C); + dev_dbg(data->dev, "serial number: %llu", data->serial_number); + + return 0; +} + static int sgp40_measure_resistance_raw(struct sgp40_data *data, u16 *resi= stance_raw) { int ret; @@ -169,7 +217,7 @@ static int sgp40_measure_resistance_raw(struct sgp40_da= ta *data, u16 *resistance u32 ticks; u16 ticks16; u8 crc; - struct sgp40_tg_measure tg =3D {.command =3D {0x26, 0x0F}}; + struct sgp40_command tg =3D {.command =3D {0x26, 0x0F}}; struct sgp40_tg_result tgres; =20 mutex_lock(&data->lock); @@ -311,9 +359,31 @@ static int sgp40_write_raw(struct iio_dev *indio_dev, return -EINVAL; } =20 +static ssize_t serial_number_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct sgp40_data *data =3D iio_priv(dev_to_iio_dev(dev)); + + return sysfs_emit_at(buf, 0, "%llu\n", data->serial_number); +} + +static IIO_DEVICE_ATTR_RO(serial_number, 0); + +static struct attribute *sgp40_attributes[] =3D { + &iio_dev_attr_serial_number.dev_attr.attr, + NULL +}; + +static struct attribute_group sgp40_attribute_group =3D { + .attrs =3D sgp40_attributes, +}; + + static const struct iio_info sgp40_info =3D { .read_raw =3D sgp40_read_raw, .write_raw =3D sgp40_write_raw, + .attrs =3D &sgp40_attribute_group, }; =20 static int sgp40_probe(struct i2c_client *client) @@ -347,6 +417,10 @@ static int sgp40_probe(struct i2c_client *client) indio_dev->channels =3D sgp40_channels; indio_dev->num_channels =3D ARRAY_SIZE(sgp40_channels); =20 + ret =3D sgp40_get_serial_number(data); + if (ret) + dev_warn(dev, "failed to retrieve device serial number\n"); + ret =3D devm_iio_device_register(dev, indio_dev); if (ret) dev_err(dev, "failed to register iio device\n"); --=20 2.55.0 From nobody Fri Sep 25 00:03:00 2026 Received: from fortymile.utu.fi (fortymile.utu.fi [130.232.247.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 790FD4F93D3; Fri, 18 Sep 2026 13:41:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=130.232.247.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738890; cv=none; b=bpAqBSJww3hST+Emlba/oduFUrm99sbCKY86NEUKWO2N/VN/CR79DDUjKh84fnLTxsyGwiO3QoOsgqDodlSd5TB56JkZOdRxNr3keyhQmsKj77Tk3fD4UDvXM0GiJ9eHrhmDi5XiwIFCogyaaRcSDc24FKKq7+LiFnz8l/pnejs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738890; c=relaxed/simple; bh=dHZ/Tw7M9UbkFh0Sk8HaCIlpNFpoaRVGh4oDkARZANM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=AvKMj5AA/u0kxiKSXczicXngCGYWY1inp499FH1i1Vpp81UuTGfH6UlrKRjPyOd3Ob5bqxxTS8rpKoEIKH9+RGNpEHkBSUOifkN6PUx+j1pCutrDiAha25RAcOcJ/StP5FMNXBpA25xI/arNpkmS9IjEbYZYQPjl+UVNM8liI50= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=utu.fi; spf=pass smtp.mailfrom=utu.fi; dkim=pass (2048-bit key) header.d=utu.fi header.i=@utu.fi header.b=PS5hI52E; arc=none smtp.client-ip=130.232.247.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=utu.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=utu.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=utu.fi header.i=@utu.fi header.b="PS5hI52E" Received: from smtp-04.utu.fi (smtp-04.utu.fi [130.232.207.47]) by fortymile.utu.fi with ESMTPS id 68IDf5ft029532-68IDf5fv029532 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Fri, 18 Sep 2026 16:41:05 +0300 Received: from ex19-16.utu.fi ([130.232.247.56]) by smtp-04.utu.fi with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1x7Ypt-007NmQ-P0; Fri, 18 Sep 2026 16:41:05 +0300 Received: from lorpotin (91.145.105.139) by ex19-16.utu.fi (130.232.247.56) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 16:41:05 +0300 From: Jaakko Koivisto To: Andreas Klinger , Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko CC: , , Jaakko Koivisto Subject: [PATCH 2/3] iio: chemical: sgp40: Implement execute_self_test-command Date: Fri, 18 Sep 2026 16:40:18 +0300 Message-ID: <20260918134019.1101308-3-jmatko@utu.fi> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260918134019.1101308-1-jmatko@utu.fi> References: <20260918134019.1101308-1-jmatko@utu.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: ex19-16.utu.fi (130.232.247.56) To ex19-16.utu.fi (130.232.247.56) X-FEAS-BEC-Info: WlpIGw0aAQkEARIJHAEHBlJSCRoLAAEeDUhZUEhYSFhIWkhZXkguLT4lWFxYWFhYWFBeUVxfSFhISFpdSAIJCQMDB0YFCUYDBwEeARscBygdHB1GDgFIWUhZXkgJAygB HEUDBAEGDw0aRgwNSFhIWkhZXEhZW1hGWltaRlpYX0ZcX0hQSFhIWEhdSFhIWEhYSFleSAkDKAEcRQMEAQYPDRpGDA1IWEhZXUgJBgwRKAMNGgYNBEYHGg9IWEhaWUgM BA0LAAYNGigKCREEAQoaDUYLBwVIWEhaXUgEAQYdEEUBAQcoHg8NGkYDDRoGDQRGBxoPSFhIWVBIBh0GB0YbCSgJBgkEBw9GCwcFSFg= X-FEAS-Client-IP: 130.232.207.47 X-FE-Last-Public-Client-IP: 130.232.207.47 X-FE-Policy-ID: 3:5:2:SYSTEM X-FE-Hostname: fortymile.utu.fi DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; d=utu.fi; s=out-utu-v3; c=relaxed/relaxed; h=from:to:cc:subject:date:message-id:references:mime-version:content-type; bh=lrcXUwjAaGobVd8SMjEjxNeeU1H6wOM4S4lV4AvdR1I=; b=PS5hI52EzM4x0yxEPFptBHTzaDjnqbelEOsEQM9zAkaGXiUhn9NPTOKDcFy46+r5uOfF3MUr12hn iqdd6aNPIPktfUyC57MFwqW6maz/brSND8MQsY0HQ2dxwv270nqy7F1IV645PT/m2tndZ7r4oOdH ONDNd9UJSdtuue4ca4R4xRHXmKD21+zyz0bGeKNKRv7Jy33MFZBgWn0+bllQjYE5hqif1H+3NFCS pNGGOG5FcaSxoRpwJ4MxYzujar3F2V7ukDIvgCvfejKpjileWQmnTtZPoSJ5pJG06vOuoJNMFeLW Rc/4n1cwssRoWqscd8GNPmenc6ha+CaXE71IOg== Content-Type: text/plain; charset="utf-8" -Run the chip self test routine testing heater and MOX -material. -Log error if the test fails. Datasheet does not clearly state if the chip is completely unusable if the test fails. Because of this the driver will try to use the chip normally even if the self-test has failed. Signed-off-by: Jaakko Koivisto --- drivers/iio/chemical/sgp40.c | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/drivers/iio/chemical/sgp40.c b/drivers/iio/chemical/sgp40.c index c1e2a992ec2a..28d5e737d1dc 100644 --- a/drivers/iio/chemical/sgp40.c +++ b/drivers/iio/chemical/sgp40.c @@ -84,6 +84,19 @@ struct sgp40_serial_number_result { u8 C_crc; } __packed; =20 +/* + * Datasheet table 13. + */ +#define SGP40_SELF_TEST_PASS 0xD4 +#define SGP40_SELF_TEST_FAIL 0x4B + +struct sgp40_self_test_result { + u8 data; + u8 _ignore; + u8 crc; +} __packed; + + static const struct iio_chan_spec sgp40_channels[] =3D { { .type =3D IIO_CONCENTRATION, @@ -210,6 +223,42 @@ static int sgp40_get_serial_number(struct sgp40_data *= data) return 0; } =20 +static int sgp40_execute_self_test(struct sgp40_data *data) +{ + int ret; + struct i2c_client *client =3D data->client; + struct sgp40_command run_test =3D {.command =3D {0x28, 0x0E}}; + struct sgp40_self_test_result res; + + ret =3D i2c_master_send(client, (char*)&run_test, sizeof(run_test.command= )); + if (ret !=3D sizeof(run_test.command)) { + dev_err(data->dev, "i2c_master_send ret: %d, expected %zu", ret, sizeof(= run_test.command)); + return -EIO; + } + msleep(320); + + ret =3D i2c_master_recv(client, (char*)&res, sizeof(res)); + if (ret < 0) + return ret; + if (ret !=3D sizeof(res)) { + dev_err(data->dev, "i2c_master_recv ret: %d, expected: %zu", ret, sizeof= (res)); + return -EIO; + } + + if (crc8(sgp40_crc8_table, (u8*)&res, 2, SGP40_CRC8_INIT) !=3D res.crc) { + dev_warn(data->dev, "CRC error in execute_self_test"); + } + + dev_dbg(data->dev, "self test result: 0x%x", res.data); + switch (res.data) { + case SGP40_SELF_TEST_PASS: + return 0; + case SGP40_SELF_TEST_FAIL: + default: + return res.data; + } +} + static int sgp40_measure_resistance_raw(struct sgp40_data *data, u16 *resi= stance_raw) { int ret; @@ -421,6 +470,10 @@ static int sgp40_probe(struct i2c_client *client) if (ret) dev_warn(dev, "failed to retrieve device serial number\n"); =20 + ret =3D sgp40_execute_self_test(data); + if (ret) + dev_warn(dev, "device self test failed: ret 0x%x", ret); + ret =3D devm_iio_device_register(dev, indio_dev); if (ret) dev_err(dev, "failed to register iio device\n"); --=20 2.55.0 From nobody Fri Sep 25 00:03:00 2026 Received: from fortymile.utu.fi (fortymile.utu.fi [130.232.247.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C47C54FDA41; Fri, 18 Sep 2026 13:41:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=130.232.247.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738892; cv=none; b=htu2oOZrjtMRuT+HY7LmFLI5DLAGjvMwZYXiEu9dNfyBN11Mmm/ZXVhdbcCvfld2R/2GUP0Bk7xZNyaSbpU5Iq290COfw+rSE1PlJxG/XFK29yBJ9lmKgDgmpbJgdRCg0nh9exjtTmcXd8ChTeTfad/tv+7gp0bEUM5VIHMlLfI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789738892; c=relaxed/simple; bh=S0+TGh/h4+UFW61/vihct0C5r6oNSK0lqI/qa/nC41I=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=RxQwKt/WU0dqwQnbrh9YF4KMBs4VrXXcci+dgmSVJGDJBb/gWv94ZwrfnFDrePJiD/tFGAEAVN5KGZjYWkRXK6M6KpG/Vup+iwDWHP9mw0WvWe34NcIDi5RkgT5XKtWjxjC8EzpgGPD9zJ+KVvrO1a5YzKqz5oGT6Xkdxcbekro= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=utu.fi; spf=pass smtp.mailfrom=utu.fi; dkim=pass (2048-bit key) header.d=utu.fi header.i=@utu.fi header.b=Uq8cJlCC; arc=none smtp.client-ip=130.232.247.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=utu.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=utu.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=utu.fi header.i=@utu.fi header.b="Uq8cJlCC" Received: from smtp-04.utu.fi (smtp-04.utu.fi [130.232.207.47]) by fortymile.utu.fi with ESMTPS id 68IDf76a029543-68IDf76c029543 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Fri, 18 Sep 2026 16:41:07 +0300 Received: from ex19-16.utu.fi ([130.232.247.56]) by smtp-04.utu.fi with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1x7Ypv-007Nmd-7o; Fri, 18 Sep 2026 16:41:07 +0300 Received: from lorpotin (91.145.105.139) by ex19-16.utu.fi (130.232.247.56) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Fri, 18 Sep 2026 16:41:06 +0300 From: Jaakko Koivisto To: Andreas Klinger , Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko CC: , , Jaakko Koivisto Subject: [PATCH 3/3] iio: chemical: sgp40: Implement turn_heater_off-command Date: Fri, 18 Sep 2026 16:40:19 +0300 Message-ID: <20260918134019.1101308-4-jmatko@utu.fi> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260918134019.1101308-1-jmatko@utu.fi> References: <20260918134019.1101308-1-jmatko@utu.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: ex19-16.utu.fi (130.232.247.56) To ex19-16.utu.fi (130.232.247.56) X-FEAS-BEC-Info: WlpIGw0aAQkEARIJHAEHBlJSCRoLAAEeDUhZUEhYSFhIWkhZXkguLT4lWFxYWFhYWFBeUVxfSFhISFpdSAIJCQMDB0YFCUYDBwEeARscBygdHB1GDgFIWUhZXkgJAygB HEUDBAEGDw0aRgwNSFhIWkhZXEhZW1hGWltaRlpYX0ZcX0hQSFhIWEhdSFhIWEhYSFleSAkDKAEcRQMEAQYPDRpGDA1IWEhZXUgJBgwRKAMNGgYNBEYHGg9IWEhaWUgM BA0LAAYNGigKCREEAQoaDUYLBwVIWEhaXUgEAQYdEEUBAQcoHg8NGkYDDRoGDQRGBxoPSFhIWVBIBh0GB0YbCSgJBgkEBw9GCwcFSFg= X-FEAS-Client-IP: 130.232.207.47 X-FE-Last-Public-Client-IP: 130.232.207.47 X-FE-Policy-ID: 3:5:2:SYSTEM X-FE-Hostname: fortymile.utu.fi DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; d=utu.fi; s=out-utu-v3; c=relaxed/relaxed; h=from:to:cc:subject:date:message-id:references:mime-version:content-type; bh=SXpp521fGMKCupgRYWcmk2dGLc+m9cXA26+JbieW7lE=; b=Uq8cJlCC40s/wHdr1btAie2yURRTxCkQd6Wnb1AP3dhXlfPqDC2XR5SdgY5Uka7fmmFVuHYPiVLZ HnCLONw/gJcZQZEjY20ZMz+tS6N2a8nj56baB+5TUZd3CwXOd6gMvjaK969ufJzVA9AGDRMMUn/9 3DdQis2nBG412rDYsRIRBtKEYKO2KZcTzkYxzJN+xTBhRve7Jghb8xK2hkuZkJM5La9ABwJfhHlg dEt+7BPA2pxfKKG37Di4IR+1t0Lj99by0dCrh5V49Z7XN4XIb/8AdGBhQZpCLlu/yPjbKZ77/N+R 4YYSuvc5WfNfbuUDC5Em4gsBvSp/fxuFcFXHtQ== Content-Type: text/plain; charset="utf-8" -Turn the heating element off and enter idle mode. -Present the functionality as device attribute, 'echo 1 > turn_heater_off'. Saves approx. 2.5 mA compared to regular operation. The heating element is automatically turned back on when measurement is performed. Signed-off-by: Jaakko Koivisto --- drivers/iio/chemical/sgp40.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/iio/chemical/sgp40.c b/drivers/iio/chemical/sgp40.c index 28d5e737d1dc..a4fc5c778303 100644 --- a/drivers/iio/chemical/sgp40.c +++ b/drivers/iio/chemical/sgp40.c @@ -29,6 +29,7 @@ * by writing to the out values of temp and humidityrelative. */ =20 +#include "linux/device.h" #include #include #include @@ -259,6 +260,21 @@ static int sgp40_execute_self_test(struct sgp40_data *= data) } } =20 +static int sgp40_turn_heater_off(struct sgp40_data *data) +{ + int ret; + struct i2c_client *client =3D data->client; + struct sgp40_command turn_off =3D {.command =3D {0x36, 0x15}}; + + ret =3D i2c_master_send(client, (char*)&turn_off, sizeof(turn_off.command= )); + if (ret !=3D sizeof(turn_off.command)) { + dev_err(data->dev, "i2c_master_send ret: %d, expected %zu", ret, sizeof(= turn_off.command)); + return -EIO; + } + msleep(1); + return 0; +} + static int sgp40_measure_resistance_raw(struct sgp40_data *data, u16 *resi= stance_raw) { int ret; @@ -417,10 +433,22 @@ static ssize_t serial_number_show(struct device *dev, return sysfs_emit_at(buf, 0, "%llu\n", data->serial_number); } =20 +static ssize_t turn_heater_off_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct sgp40_data *data =3D iio_priv(dev_to_iio_dev(dev)); + sgp40_turn_heater_off(data); + + return len; +} + static IIO_DEVICE_ATTR_RO(serial_number, 0); +static IIO_DEVICE_ATTR_WO(turn_heater_off, 0); =20 static struct attribute *sgp40_attributes[] =3D { &iio_dev_attr_serial_number.dev_attr.attr, + &iio_dev_attr_turn_heater_off.dev_attr.attr, NULL }; =20 --=20 2.55.0