From nobody Mon Feb 9 11:50:31 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 07CF01D5CD1; Mon, 5 May 2025 07:53:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746431588; cv=none; b=UjtxXYWw7XNVHErJLXP4PHXI0IqbbsnimbMVWEM8Hu92s4+Ojr00hN2lXsdrzH3PBrrpl/iTflkRSThmiW2pZUNgPuJOsS8a180A9AfEVUXbpkPyQO/3gbTL8LvTd7yN4Hp5WAZaYJ2NgNiLCTxPOPmpRgpzaufPto/khs9OXoc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746431588; c=relaxed/simple; bh=1v1/rio6XCqOmkruQ3uZOyPmUNsBY2ySnofdSs8eHtk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aw1Dd49ZU543n84OIxzJGxl+5bJhECog5fxLZrJlnVrvaa1QM6Ees8Eo+hh8JDZ0ENc307e05XPKyriw03QYD4pcGN0PHTjW5zw+h92eVpyfIWwP3t1OhHMT1DWY5rbPOHaVGMCB+xPXLLAcSgZUaC6rKhnjmkh5D+PeVsQXDHg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qa60GQzp; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qa60GQzp" Received: by smtp.kernel.org (Postfix) with ESMTPS id 8CC5CC4CEEF; Mon, 5 May 2025 07:53:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746431587; bh=1v1/rio6XCqOmkruQ3uZOyPmUNsBY2ySnofdSs8eHtk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=qa60GQzpw/wAXqtDhfmgaTgx5xgsrgze4xOFuh1zVt9gIWt/EzlUTc4JtCQiSbxew ibuf1mCXuKs9GqFgoDX4i2Pke6YRVNWvLduBSbr51tXjIG4c8tJmEmOxLjRsJXq+1c 83EyM4If7EElP0eCFbLdP0OdKyVX1IN8Pc8r6v+uQRvnMp4BHVE9Bh9o20xOV46GYa K3kmkOAgXlqSIKbXKriKpuUpZ6b40eKieFYDfMzGTe2ymMrxsiEAoBJF//QBAVx5HC 7UBoz0q1vtjvhzl1w8M0sO0viwxHuMcMDk+I4IgI7NJF4Z6crJzMLonH0FOhUxJg/q W0LL3DKvzZw1Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7E2BAC3ABB6; Mon, 5 May 2025 07:53:07 +0000 (UTC) From: =?utf-8?q?T=C3=B3th_J=C3=A1nos_via_B4_Relay?= Date: Mon, 05 May 2025 09:52:58 +0200 Subject: [PATCH v2 1/2] dt-bindings: trivial-devices: Document SEN0322 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250505-iio-chemical-sen0322-v2-1-217473983b42@gmail.com> References: <20250505-iio-chemical-sen0322-v2-0-217473983b42@gmail.com> In-Reply-To: <20250505-iio-chemical-sen0322-v2-0-217473983b42@gmail.com> To: Jonathan Cameron , Lars-Peter Clausen , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?T=C3=B3th_J=C3=A1nos?= X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1746431586; l=910; i=gomba007@gmail.com; s=20230706; h=from:subject:message-id; bh=1Mfxr5j12EbsEQWdQ2AY6ErLyezlks+9xDkOv+/nbsM=; b=kXQ6usTnCkZCv9d+dDS63qVsNQQKiFnQ8HkGcdC1VNXiaCoHf+pk17QrpX1IWEgIK0Usw2W/p OIvrkfPYZrTAu6I4g6MXLaDFdxwqtQ2AulBIOxE9E1azy83JaR8s3Xt X-Developer-Key: i=gomba007@gmail.com; a=ed25519; pk=iY9MjPCbud82ULS2PQJIq3QwjKyP/Sg730I6T2M8Y5U= X-Endpoint-Received: by B4 Relay for gomba007@gmail.com/20230706 with auth_id=60 X-Original-From: =?utf-8?q?T=C3=B3th_J=C3=A1nos?= Reply-To: gomba007@gmail.com From: T=C3=B3th J=C3=A1nos Add documentation for the DFRobot SEN0322 oxygen sensor. Signed-off-by: T=C3=B3th J=C3=A1nos Acked-by: Krzysztof Kozlowski --- Documentation/devicetree/bindings/trivial-devices.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/trivial-devices.yaml b/Docum= entation/devicetree/bindings/trivial-devices.yaml index 8da408107e55..a25bf2135649 100644 --- a/Documentation/devicetree/bindings/trivial-devices.yaml +++ b/Documentation/devicetree/bindings/trivial-devices.yaml @@ -85,6 +85,8 @@ properties: - devantech,srf08 # Devantech SRF10 ultrasonic ranger - devantech,srf10 + # DFRobot SEN0322 oxygen sensor + - dfrobot,sen0322 # DH electronics GmbH on-board CPLD trivial SPI device - dh,dhcom-board # DA9053: flexible system level PMIC with multicore support --=20 2.34.1 From nobody Mon Feb 9 11:50:31 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 22E561DB92E; Mon, 5 May 2025 07:53:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746431588; cv=none; b=qJ+8c636yiKN0a6MCtOCABQuBQSZSRrC97eKXXMGLecYCp2I9oaP9TL8rjTTEHST2vk1y7SfMJZuc+xSdHJTsnFnAnam6toHc8A3FnQypiJQPZuN6+WEFwbAjhZty0XhtUYvqJghDwE+J30yV6h49y8+bflft5dsc0t0lUpplGI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746431588; c=relaxed/simple; bh=MSe+1bL4T7T5yLyCxT/LtF/TipUjifPRsdogN76ZR08=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rcR1n/OuEcahqJ8gLrK7C6zxfbkdugXVNeMEK3WYABTG37IWcbqhwQAVehf2F2uMZdyeFmkWovDqffGjRH1tNuAr2OXXi+/r7pYXG8qCd9cZu0VwG3jeBGJOuzv/+7F03W+/wkVCDl0uulrpb565n2VnygZGLXkuCSxD8j2EGsA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=sIqgDWYk; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="sIqgDWYk" Received: by smtp.kernel.org (Postfix) with ESMTPS id 9EEFFC4CEF3; Mon, 5 May 2025 07:53:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746431587; bh=MSe+1bL4T7T5yLyCxT/LtF/TipUjifPRsdogN76ZR08=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=sIqgDWYkxYO9hwua14hDvAQazgfzvVMTR0ITxsmtxpfdRvq2RFmMJBXlNNzzlbiJJ 7DyQ2FeBXrtUDEh5hewT2BmLd8dqQj+gahTfP1vuppq/16CsrUq4PCipbNLCZyQ4XM g1C0XiYyWGPOLWUB0v28D03YN2oXgc1yM4C+9NoZTpWMsYS/38aDsnY5kC42vWqS7j fNUUmTHxxR7/KGc47XEAmYzmAMZiagtgbwja0QlyI1T5m8TsIy1elb0tmTlilc2Nei zKgTcymQjPz38i5hwEEBwRFUptPyHte6U7GkYfcxKJra8oAVCUqLiFv7rGCwJz2n7H ERMXjVZtCIn1Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8EE8AC3ABB9; Mon, 5 May 2025 07:53:07 +0000 (UTC) From: =?utf-8?q?T=C3=B3th_J=C3=A1nos_via_B4_Relay?= Date: Mon, 05 May 2025 09:52:59 +0200 Subject: [PATCH v2 2/2] iio: chemical: Add driver for SEN0322 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250505-iio-chemical-sen0322-v2-2-217473983b42@gmail.com> References: <20250505-iio-chemical-sen0322-v2-0-217473983b42@gmail.com> In-Reply-To: <20250505-iio-chemical-sen0322-v2-0-217473983b42@gmail.com> To: Jonathan Cameron , Lars-Peter Clausen , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?T=C3=B3th_J=C3=A1nos?= X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1746431586; l=6411; i=gomba007@gmail.com; s=20230706; h=from:subject:message-id; bh=kGgUJNo4JLDrOfSDrHdUo8ywpuUB7t3OGctsBa/s52E=; b=dMdonfYCaXqHWTClgc82m/iAASOQWdAZkPlw8Xfzm0D4vmF6acMyhijlhDJPPAgSmu1ERqyJZ DSD70P/PKFaBHGGFrA63RRdXy3SCjWUvACpw+LR5/1NW57FHgy0PSO6 X-Developer-Key: i=gomba007@gmail.com; a=ed25519; pk=iY9MjPCbud82ULS2PQJIq3QwjKyP/Sg730I6T2M8Y5U= X-Endpoint-Received: by B4 Relay for gomba007@gmail.com/20230706 with auth_id=60 X-Original-From: =?utf-8?q?T=C3=B3th_J=C3=A1nos?= Reply-To: gomba007@gmail.com From: T=C3=B3th J=C3=A1nos Add support for the DFRobot SEN0322 oxygen sensor. Datasheet: https://wiki.dfrobot.com/Gravity_I2C_Oxygen_Sensor_SKU_SEN0322 To instantiate (assuming device is connected to I2C-2): echo 'sen0322 0x73' > /sys/class/i2c-dev/i2c-2/device/new_device To get the oxygen concentration (assuming device is iio:device0) multiply the values read from: /sys/bus/iio/devices/iio:device0/in_concentration_raw /sys/bus/iio/devices/iio:device0/in_concentration_scale Signed-off-by: T=C3=B3th J=C3=A1nos --- MAINTAINERS | 6 ++ drivers/iio/chemical/Kconfig | 10 +++ drivers/iio/chemical/Makefile | 1 + drivers/iio/chemical/sen0322.c | 167 +++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 184 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 3cbf9ac0d83f..6fda7a2f1248 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -6852,6 +6852,12 @@ L: linux-rtc@vger.kernel.org S: Maintained F: drivers/rtc/rtc-sd2405al.c =20 +DFROBOT SEN0322 DRIVER +M: T=C3=B3th J=C3=A1nos +L: linux-iio@vger.kernel.org +S: Maintained +F: drivers/iio/chemical/sen0322.c + DH ELECTRONICS DHSOM SOM AND BOARD SUPPORT M: Christoph Niedermaier M: Marek Vasut diff --git a/drivers/iio/chemical/Kconfig b/drivers/iio/chemical/Kconfig index 330fe0af946f..60a81863d123 100644 --- a/drivers/iio/chemical/Kconfig +++ b/drivers/iio/chemical/Kconfig @@ -166,6 +166,16 @@ config SCD4X To compile this driver as a module, choose M here: the module will be called scd4x. =20 +config SEN0322 + tristate "SEN0322 oxygen sensor" + depends on I2C + select REGMAP_I2C + help + Say Y here to build support for the DFRobot SEN0322 oxygen sensor. + + To compile this driver as a module, choose M here: the module will + be called sen0322. + config SENSIRION_SGP30 tristate "Sensirion SGPxx gas sensors" depends on I2C diff --git a/drivers/iio/chemical/Makefile b/drivers/iio/chemical/Makefile index 4866db06bdc9..deeff0e4e6f7 100644 --- a/drivers/iio/chemical/Makefile +++ b/drivers/iio/chemical/Makefile @@ -20,6 +20,7 @@ obj-$(CONFIG_SCD30_CORE) +=3D scd30_core.o obj-$(CONFIG_SCD30_I2C) +=3D scd30_i2c.o obj-$(CONFIG_SCD30_SERIAL) +=3D scd30_serial.o obj-$(CONFIG_SCD4X) +=3D scd4x.o +obj-$(CONFIG_SEN0322) +=3D sen0322.o obj-$(CONFIG_SENSEAIR_SUNRISE_CO2) +=3D sunrise_co2.o obj-$(CONFIG_SENSIRION_SGP30) +=3D sgp30.o obj-$(CONFIG_SENSIRION_SGP40) +=3D sgp40.o diff --git a/drivers/iio/chemical/sen0322.c b/drivers/iio/chemical/sen0322.c new file mode 100644 index 000000000000..c2dfb0ff7f40 --- /dev/null +++ b/drivers/iio/chemical/sen0322.c @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Driver for the DFRobot SEN0322 oxygen sensor. + * + * Datasheet: + * https://wiki.dfrobot.com/Gravity_I2C_Oxygen_Sensor_SKU_SEN0322 + * + * Possible I2C slave addresses: + * 0x70 + * 0x71 + * 0x72 + * 0x73 + * + * Copyright (C) 2025 T=C3=B3th J=C3=A1nos + */ + +#include +#include + +#include + +#define SEN0322_REG_DATA 0x03 +#define SEN0322_REG_COEFF 0x0A + +struct sen0322 { + struct regmap *regmap; +}; + +static int sen0322_read_scale(struct sen0322 *sen0322, int *num, int *den) +{ + u32 val; + int ret; + + ret =3D regmap_read(sen0322->regmap, SEN0322_REG_COEFF, &val); + if (ret < 0) + return ret; + + if (val) { + *num =3D val; + *den =3D 100000; + } else { + *num =3D 209; + *den =3D 120000; + } + + dev_dbg(regmap_get_device(sen0322->regmap), "scale: %d/%d\n", + *num, *den); + + return 0; +} + +static int sen0322_read_data(struct sen0322 *sen0322) +{ + u8 data[4] =3D { 0 }; + int ret; + + ret =3D regmap_bulk_read(sen0322->regmap, SEN0322_REG_DATA, data, 3); + if (ret < 0) + return ret; + + ret =3D data[0] * 100 + data[1] * 10 + data[2]; + + dev_dbg(regmap_get_device(sen0322->regmap), "data: %d\n", ret); + + return ret; +} + +static int sen0322_read_raw(struct iio_dev *iio_dev, + const struct iio_chan_spec *chan, + int *val, int *val2, long mask) +{ + struct sen0322 *sen0322 =3D iio_priv(iio_dev); + int ret; + + switch (mask) { + case IIO_CHAN_INFO_RAW: + switch (chan->type) { + case IIO_CONCENTRATION: + ret =3D sen0322_read_data(sen0322); + if (ret < 0) + return ret; + + *val =3D ret; + return IIO_VAL_INT; + + default: + return -EINVAL; + } + + case IIO_CHAN_INFO_SCALE: + switch (chan->type) { + case IIO_CONCENTRATION: + ret =3D sen0322_read_scale(sen0322, val, val2); + if (ret < 0) + return ret; + + return IIO_VAL_FRACTIONAL; + + default: + return -EINVAL; + } + + default: + return -EINVAL; + } +} + +static const struct iio_info sen0322_info =3D { + .read_raw =3D sen0322_read_raw, +}; + +static const struct regmap_config sen0322_regmap_conf =3D { + .reg_bits =3D 8, + .val_bits =3D 8, +}; + +static const struct iio_chan_spec sen0322_channel =3D { + .type =3D IIO_CONCENTRATION, + .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | + BIT(IIO_CHAN_INFO_SCALE), +}; + +static int sen0322_probe(struct i2c_client *client) +{ + struct sen0322 *sen0322; + struct iio_dev *iio_dev; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + return -ENODEV; + + iio_dev =3D devm_iio_device_alloc(&client->dev, sizeof(*sen0322)); + if (!iio_dev) + return -ENOMEM; + + sen0322 =3D iio_priv(iio_dev); + + sen0322->regmap =3D devm_regmap_init_i2c(client, &sen0322_regmap_conf); + if (IS_ERR(sen0322->regmap)) + return PTR_ERR(sen0322->regmap); + + iio_dev->info =3D &sen0322_info; + iio_dev->name =3D "sen0322"; + iio_dev->channels =3D &sen0322_channel; + iio_dev->num_channels =3D 1; + iio_dev->modes =3D INDIO_DIRECT_MODE; + + return devm_iio_device_register(&client->dev, iio_dev); +} + +static const struct of_device_id sen0322_of_match[] =3D { + { .compatible =3D "dfrobot,sen0322" }, + { } +}; +MODULE_DEVICE_TABLE(of, sen0322_of_match); + +static struct i2c_driver sen0322_driver =3D { + .driver =3D { + .name =3D "sen0322", + .of_match_table =3D sen0322_of_match, + }, + .probe =3D sen0322_probe, +}; +module_i2c_driver(sen0322_driver); + +MODULE_AUTHOR("T=C3=B3th J=C3=A1nos "); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("SEN0322 oxygen sensor driver"); --=20 2.34.1