From nobody Sat Oct 4 08:03:31 2025 Received: from out-170.mta1.migadu.com (out-170.mta1.migadu.com [95.215.58.170]) (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 5427D7404E for ; Mon, 18 Aug 2025 18:32:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541951; cv=none; b=k9845+Y54TvQtjq4b66w69fMr/kW7Nz2CXmIEE0/vUt7hi0O27KlwvFgbrN1OisXT/AGKM80qvxGJ1tDRIZNZO7e3ktisuiwV2ZJvvRUfwP6gQ2Qoe2zI58z9HG0Wzh484A4TIJpiIWN57dbnpPuAIgVPdBDu1jPbGbRNV7/l2Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541951; c=relaxed/simple; bh=wFAQBvDPC15RotmXu1BO07WKmXxW+BAHy5N+pqi2mQM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=U1PedfdHbE1yXijG1rJZN4Kc5juznQujnU0AvBB//t77GMyLhUlayNz1aY41ULc6s7nSWnfB5uri7M2PLBuaJDsewMIVvdNm2dddNy20bM56xezGBR2knY7tGzekVto1F7vOZVnNhBntr4ATorWnvipyE2T51ZKMh1zbUyCNqa8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=linux.dev; arc=none smtp.client-ip=95.215.58.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Ben Collins To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Andrew Hepp Cc: Ben Collins , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/6] dt-bindings: iio: mcp9600: Set default 3 for thermocouple-type Date: Mon, 18 Aug 2025 14:32:09 -0400 Message-Id: <20250818183214.380847-2-bcollins@kernel.org> In-Reply-To: <20250818183214.380847-1-bcollins@kernel.org> References: <20250818183214.380847-1-bcollins@kernel.org> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Ben Collins As is already documented in this file, Type-K is the default, so make that explicit in the dt-bindings. Signed-off-by: Ben Collins Reviewed-by: Krzysztof Kozlowski --- .../devicetree/bindings/iio/temperature/microchip,mcp9600.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/iio/temperature/microchip,mc= p9600.yaml b/Documentation/devicetree/bindings/iio/temperature/microchip,mc= p9600.yaml index d2cafa38a544..57b387a1accc 100644 --- a/Documentation/devicetree/bindings/iio/temperature/microchip,mcp9600.y= aml +++ b/Documentation/devicetree/bindings/iio/temperature/microchip,mcp9600.y= aml @@ -37,6 +37,7 @@ properties: =20 thermocouple-type: $ref: /schemas/types.yaml#/definitions/uint32 + default: 3 description: Type of thermocouple (THERMOCOUPLE_TYPE_K if omitted). Use defines in dt-bindings/iio/temperature/thermocouple.h. --=20 2.39.5 From nobody Sat Oct 4 08:03:31 2025 Received: from out-179.mta1.migadu.com (out-179.mta1.migadu.com [95.215.58.179]) (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 2BE2E2652B0; Mon, 18 Aug 2025 18:32:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541953; cv=none; b=rv89Y3Fa29aW9A+0AuA8Yir2aGTRX+jvj9N9WgrPweUzZ7GoMkkxgusGi6Yms143maq2BSu8E2q4951FvReTHICvclwotybCdG8NsUsJ98rgj5oX0DqnLk9qYMRAxH0MBJ9XTldyfIiwwP4H9/mKK6TF2eJluvrS2gavvX03Px4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541953; c=relaxed/simple; bh=04rUiRnzldCIjyPYAIClUR+pVbQQ203qGVqhTFqmibo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Kk3oFfQpuPJAE1CB9/btPiueZHKqCayBrwuFkfCe4WzNvSiMf2TJ4gDl/+DoPRrlAhyKGMv+fqRstHG7C+crWzTYLBgoB6vUkysSIVP+2dShmx2bhzhYdGu9OFubg1/gAYvZ10qk8EBCqLIeay424r+hXnF/wCCEKKl8LboIEkU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=linux.dev; arc=none smtp.client-ip=95.215.58.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Ben Collins To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Andrew Hepp Cc: Ben Collins , linux-iio@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/6] dt-bindings: iio: mcp9600: Add microchip,mcp9601 and add constraints Date: Mon, 18 Aug 2025 14:32:10 -0400 Message-Id: <20250818183214.380847-3-bcollins@kernel.org> In-Reply-To: <20250818183214.380847-1-bcollins@kernel.org> References: <20250818183214.380847-1-bcollins@kernel.org> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Ben Collins Add microchip,mcp9601 compatible in addition to the original microchip,mcp9600 to designate support between these two chips. The current dt-binding has open-circuit and short-circuit as interrupt names, but these are only supported in mcp9601. The OC and SC detection requires that mcp9601 VSENSE be wired up, which not only enables the OC SC interrupts, but also the OC and SC status register bits. Add a microchip,vsense boolean to show the chip is wired for this support. Add constraints so this feature only applies if the mcp9601 compatible is selected. Signed-off-by: Ben Collins --- .../iio/temperature/microchip,mcp9600.yaml | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/iio/temperature/microchip,mc= p9600.yaml b/Documentation/devicetree/bindings/iio/temperature/microchip,mc= p9600.yaml index 57b387a1accc..c22edb4ab852 100644 --- a/Documentation/devicetree/bindings/iio/temperature/microchip,mcp9600.y= aml +++ b/Documentation/devicetree/bindings/iio/temperature/microchip,mcp9600.y= aml @@ -4,7 +4,7 @@ $id: http://devicetree.org/schemas/iio/temperature/microchip,mcp9600.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# =20 -title: Microchip MCP9600 thermocouple EMF converter +title: Microchip MCP9600 and similar thermocouple EMF converters =20 maintainers: - Andrew Hepp @@ -14,7 +14,11 @@ description: =20 properties: compatible: - const: microchip,mcp9600 + oneOf: + - const: microchip,mcp9600 + - items: + - const: microchip,mcp9601 + - const: microchip,mcp9600 =20 reg: maxItems: 1 @@ -34,6 +38,8 @@ properties: - alert2 - alert3 - alert4 + - open-circuit + - short-circuit =20 thermocouple-type: $ref: /schemas/types.yaml#/definitions/uint32 @@ -43,8 +49,37 @@ properties: Use defines in dt-bindings/iio/temperature/thermocouple.h. Supported types are B, E, J, K, N, R, S, T. =20 + microchip,vsense: + type: boolean + description: + This flag indicates that the chip has been wired with VSENSE to + enable open and short circuit detect. + vdd-supply: true =20 +allOf: + - if: + properties: + compatible: + not: + contains: + const: microchip,mcp9601 + then: + properties: + interrupts: + minItems: 1 + maxItems: 4 + interrupt-names: + minItems: 1 + maxItems: 4 + items: + enum: + - alert1 + - alert2 + - alert3 + - alert4 + microchip,vsense: false + required: - compatible - reg @@ -64,8 +99,27 @@ examples: reg =3D <0x60>; interrupt-parent =3D <&gpio>; interrupts =3D <25 IRQ_TYPE_EDGE_RISING>; - interrupt-names =3D "open-circuit"; + interrupt-names =3D "alert1"; thermocouple-type =3D ; vdd-supply =3D <&vdd>; }; }; + - | + #include + #include + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + temperature-sensor@62 { + compatible =3D "microchip,mcp9601", + "microchip,mcp9600"; + microchip,vsense; + reg =3D <0x62>; + interrupt-parent =3D <&gpio>; + interrupts =3D <22 IRQ_TYPE_EDGE_RISING + 23 IRQ_TYPE_EDGE_RISING>; + interrupt-names =3D "open-circuit", "short-circuit"; + vdd-supply =3D <&vdd>; + }; + }; --=20 2.39.5 From nobody Sat Oct 4 08:03:31 2025 Received: from out-174.mta1.migadu.com (out-174.mta1.migadu.com [95.215.58.174]) (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 C5144272E75 for ; Mon, 18 Aug 2025 18:32:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541956; cv=none; b=gpFx9hNN38l8uRzItozR7zhJiQOaFNQAnAMY2TbgNYKortP0f6vygL46RqP19BsTHbgGJp4RgA9fBibjvSoIDGIrQwN8fI7ns/Y8ZkXuVbq4DT4Trwl6j6hptaVKu+jDBo8Tja6nR6dmWrIaq/I7OVrrBYu3paXNniaa2e5yzsQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541956; c=relaxed/simple; bh=EMEfVoIkhdaTT/q1cFOuKIau767Ak8G2A/FRpJqcVBk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jtrLErp5uI/QrnCimm/j5qExczx9PBRVZ7Ifl2fXn6EZgu9b2kFlMVAJW/lIg33b7ak+OFNaoqxV6Q4JfNQ0E6FdjDLbNsAvjxNGDYEFFesC+TNPwnE6iPa3z7rK6BEhgn2BaVHEWCtUd131woFVu/7oaZ6bj/PQTb/xdPzacWw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=linux.dev; arc=none smtp.client-ip=95.215.58.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Ben Collins To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko Cc: Ben Collins , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/6] iio: mcp9600: White space and fixed width cleanup Date: Mon, 18 Aug 2025 14:32:11 -0400 Message-Id: <20250818183214.380847-4-bcollins@kernel.org> In-Reply-To: <20250818183214.380847-1-bcollins@kernel.org> References: <20250818183214.380847-1-bcollins@kernel.org> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Ben Collins Make tabs consistent for register definitions and also fix width to byte size. Signed-off-by: Ben Collins Reviewed-by: David Lechner Reviewed-by: David Lechner --- drivers/iio/temperature/mcp9600.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/iio/temperature/mcp9600.c b/drivers/iio/temperature/mc= p9600.c index 6e9108d5cf75..40906bb200ec 100644 --- a/drivers/iio/temperature/mcp9600.c +++ b/drivers/iio/temperature/mcp9600.c @@ -23,25 +23,25 @@ #include =20 /* MCP9600 registers */ -#define MCP9600_HOT_JUNCTION 0x0 -#define MCP9600_COLD_JUNCTION 0x2 -#define MCP9600_STATUS 0x4 +#define MCP9600_HOT_JUNCTION 0x00 +#define MCP9600_COLD_JUNCTION 0x02 +#define MCP9600_STATUS 0x04 #define MCP9600_STATUS_ALERT(x) BIT(x) -#define MCP9600_ALERT_CFG1 0x8 +#define MCP9600_ALERT_CFG1 0x08 #define MCP9600_ALERT_CFG(x) (MCP9600_ALERT_CFG1 + (x - 1)) #define MCP9600_ALERT_CFG_ENABLE BIT(0) #define MCP9600_ALERT_CFG_ACTIVE_HIGH BIT(2) #define MCP9600_ALERT_CFG_FALLING BIT(3) #define MCP9600_ALERT_CFG_COLD_JUNCTION BIT(4) -#define MCP9600_ALERT_HYSTERESIS1 0xc +#define MCP9600_ALERT_HYSTERESIS1 0x0c #define MCP9600_ALERT_HYSTERESIS(x) (MCP9600_ALERT_HYSTERESIS1 + (x - 1)) #define MCP9600_ALERT_LIMIT1 0x10 #define MCP9600_ALERT_LIMIT(x) (MCP9600_ALERT_LIMIT1 + (x - 1)) #define MCP9600_ALERT_LIMIT_MASK GENMASK(15, 2) -#define MCP9600_DEVICE_ID 0x20 +#define MCP9600_DEVICE_ID 0x20 =20 /* MCP9600 device id value */ -#define MCP9600_DEVICE_ID_MCP9600 0x40 +#define MCP9600_DEVICE_ID_MCP9600 0x40 =20 #define MCP9600_ALERT_COUNT 4 =20 --=20 2.39.5 From nobody Sat Oct 4 08:03:31 2025 Received: from out-176.mta1.migadu.com (out-176.mta1.migadu.com [95.215.58.176]) (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 5F3D5272E75 for ; Mon, 18 Aug 2025 18:32:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541960; cv=none; b=LwaeqwEkPulIFk13Vyff5UT+HXX5zn0YLIUAMExBZWj8BiGBgkwGuqnMTJvdDNo4IsdX0jvl0aAC6Rx0Emx6kvfD72KoQmbawxxY3gFnyr8/wxnfGsv6cqlrgTvU5ndFsjxB4i1ZKVqmrSoPkk0oC+nPZgs/dNPa6cx31VumQS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541960; c=relaxed/simple; bh=L3xMOG9WePvHrT3MEdtiMzqT9SAxkZsCeWRwVmxoJps=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FYTklqZpkHdDG/JjXPazvsc/Fznci/1cryjoyNgS0QlfVoozvvG+mCXuod6UJqDE2Pa/sNaItE4QBVt54+iQHsxkuUAjrHXnVitih56tqMMSxqEnsQ3rK0Gllj4FUt7mqWcJeVQiCFBxE2hbZWBwWOHA7u6vT4v1AdwPma5S5nw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=linux.dev; arc=none smtp.client-ip=95.215.58.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Ben Collins To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko Cc: Ben Collins , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/6] iio: mcp9600: Recognize chip id for mcp9601 Date: Mon, 18 Aug 2025 14:32:12 -0400 Message-Id: <20250818183214.380847-5-bcollins@kernel.org> In-Reply-To: <20250818183214.380847-1-bcollins@kernel.org> References: <20250818183214.380847-1-bcollins@kernel.org> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Ben Collins The current driver works with mcp9601, but emits a warning because it does not recognize the chip id. MCP9601 is a superset of MCP9600. The drivers works without changes on this chipset. However, the 9601 chip supports open/closed-circuit detection if wired properly, so we'll need to be able to differentiate between them. Signed-off-by: Ben Collins Reviewed-by: David Lechner --- drivers/iio/temperature/Kconfig | 8 +++-- drivers/iio/temperature/mcp9600.c | 55 +++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/drivers/iio/temperature/Kconfig b/drivers/iio/temperature/Kcon= fig index 1244d8e17d50..9328b2250ace 100644 --- a/drivers/iio/temperature/Kconfig +++ b/drivers/iio/temperature/Kconfig @@ -173,11 +173,13 @@ config MAX31865 will be called max31865. =20 config MCP9600 - tristate "MCP9600 thermocouple EMF converter" + tristate "MCP9600 and similar thermocouple EMF converters" depends on I2C help - If you say yes here you get support for MCP9600 - thermocouple EMF converter connected via I2C. + If you say yes here you get support for... + - MCP9600 + - MCP9601 + ...thermocouple EMF converters connected via I2C. =20 This driver can also be built as a module. If so, the module will be called mcp9600. diff --git a/drivers/iio/temperature/mcp9600.c b/drivers/iio/temperature/mc= p9600.c index 40906bb200ec..a5fad80250d3 100644 --- a/drivers/iio/temperature/mcp9600.c +++ b/drivers/iio/temperature/mcp9600.c @@ -42,6 +42,7 @@ =20 /* MCP9600 device id value */ #define MCP9600_DEVICE_ID_MCP9600 0x40 +#define MCP9600_DEVICE_ID_MCP9601 0x41 =20 #define MCP9600_ALERT_COUNT 4 =20 @@ -123,6 +124,11 @@ static const struct iio_chan_spec mcp9600_channels[][2= ] =3D { MCP9600_CHANNELS(2, 0, 2, 0), /* Alerts: 1 2 3 4 */ }; =20 +struct mcp_chip_info { + u8 chip_id; + const char *chip_name; +}; + struct mcp9600_data { struct i2c_client *client; }; @@ -416,16 +422,33 @@ static int mcp9600_probe_alerts(struct iio_dev *indio= _dev) =20 static int mcp9600_probe(struct i2c_client *client) { + const struct mcp_chip_info *chip_info =3D i2c_get_match_data(client); struct iio_dev *indio_dev; struct mcp9600_data *data; - int ret, ch_sel; + int ch_sel, dev_id, ret; + + if (!chip_info) + return dev_err_probe(&client->dev, -EINVAL, + "No chip-info found for device\n"); + + dev_id =3D i2c_smbus_read_byte_data(client, MCP9600_DEVICE_ID); + if (dev_id < 0) + return dev_err_probe(&client->dev, dev_id, + "Failed to read device ID\n"); + + switch (dev_id) { + case MCP9600_DEVICE_ID_MCP9600: + case MCP9600_DEVICE_ID_MCP9601: + if (dev_id !=3D chip_info->chip_id) + dev_warn(&client->dev, + "Expected id %02x, but device responded with %02x\n", + chip_info->chip_id, dev_id); + break; =20 - ret =3D i2c_smbus_read_byte_data(client, MCP9600_DEVICE_ID); - if (ret < 0) - return dev_err_probe(&client->dev, ret, "Failed to read device ID\n"); - if (ret !=3D MCP9600_DEVICE_ID_MCP9600) - dev_warn(&client->dev, "Expected ID %x, got %x\n", - MCP9600_DEVICE_ID_MCP9600, ret); + default: + dev_warn(&client->dev, "Unknown id %x, using %x\n", dev_id, + chip_info->chip_id); + } =20 indio_dev =3D devm_iio_device_alloc(&client->dev, sizeof(*data)); if (!indio_dev) @@ -439,7 +462,7 @@ static int mcp9600_probe(struct i2c_client *client) return ch_sel; =20 indio_dev->info =3D &mcp9600_info; - indio_dev->name =3D "mcp9600"; + indio_dev->name =3D chip_info->chip_name; indio_dev->modes =3D INDIO_DIRECT_MODE; indio_dev->channels =3D mcp9600_channels[ch_sel]; indio_dev->num_channels =3D ARRAY_SIZE(mcp9600_channels[ch_sel]); @@ -447,14 +470,26 @@ static int mcp9600_probe(struct i2c_client *client) return devm_iio_device_register(&client->dev, indio_dev); } =20 +static const struct mcp_chip_info mcp9600_chip_info =3D { + .chip_id =3D MCP9600_DEVICE_ID_MCP9600, + .chip_name =3D "mcp9600", +}; + +static const struct mcp_chip_info mcp9601_chip_info =3D { + .chip_id =3D MCP9600_DEVICE_ID_MCP9601, + .chip_name =3D "mcp9601", +}; + static const struct i2c_device_id mcp9600_id[] =3D { - { "mcp9600" }, + { "mcp9600", .driver_data =3D (kernel_ulong_t)&mcp9600_chip_info }, + { "mcp9601", .driver_data =3D (kernel_ulong_t)&mcp9601_chip_info }, { } }; MODULE_DEVICE_TABLE(i2c, mcp9600_id); =20 static const struct of_device_id mcp9600_of_match[] =3D { - { .compatible =3D "microchip,mcp9600" }, + { .compatible =3D "microchip,mcp9600", .data =3D &mcp9600_chip_info }, + { .compatible =3D "microchip,mcp9601", .data =3D &mcp9601_chip_info }, { } }; MODULE_DEVICE_TABLE(of, mcp9600_of_match); --=20 2.39.5 From nobody Sat Oct 4 08:03:31 2025 Received: from out-172.mta1.migadu.com (out-172.mta1.migadu.com [95.215.58.172]) (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 5CB512253A0 for ; Mon, 18 Aug 2025 18:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541961; cv=none; b=PbewaFBKy/Jj3pH6wQizNMJB3kvQtYhrrEISBeJRdccXNPPSVNu2r20Hm8KG9HOuJcFehcIHmCklS1VCg28v+ujvYOlvBocjmyzlkEOdt3EdJi6KY2QSgUA85ahKWLeNhqtir9ypkcUr+Jh33AfpYp8cbz6NGa/o2kTdBVr0+U8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541961; c=relaxed/simple; bh=RL8XtDY8Tzi1/X7SpFPKSJptRATbpWDXcOQSvV+ecFs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kuv72uW3KNdtdUUoxEjYJE0LBdkKDOSm4BMPoWRzXZoYWpwgmjLtBVTgUJaAM9BXQTHWOXJgvlgV/lza7KGNr9SmcT1jbrEBu8xUQm6pNLnvyvhl5F7cD4BrfYLxrK6NU64loHk1keYW5eueTtCNRoIPj296zoB/nSs/EBBQKnQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=linux.dev; arc=none smtp.client-ip=95.215.58.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Ben Collins To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko Cc: Ben Collins , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 5/6] iio: mcp9600: Add support for thermocouple-type Date: Mon, 18 Aug 2025 14:32:13 -0400 Message-Id: <20250818183214.380847-6-bcollins@kernel.org> In-Reply-To: <20250818183214.380847-1-bcollins@kernel.org> References: <20250818183214.380847-1-bcollins@kernel.org> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Ben Collins dt-bindings documentation for this driver claims to support thermocouple-type, but the driver does not actually make use of the property. Implement usage of the property to configure the chip for the selected thermocouple-type. Signed-off-by: Ben Collins Reviewed-by: David Lechner --- drivers/iio/temperature/mcp9600.c | 69 +++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/drivers/iio/temperature/mcp9600.c b/drivers/iio/temperature/mc= p9600.c index a5fad80250d3..9b017820efc1 100644 --- a/drivers/iio/temperature/mcp9600.c +++ b/drivers/iio/temperature/mcp9600.c @@ -22,11 +22,15 @@ #include #include =20 +#include + /* MCP9600 registers */ #define MCP9600_HOT_JUNCTION 0x00 #define MCP9600_COLD_JUNCTION 0x02 #define MCP9600_STATUS 0x04 #define MCP9600_STATUS_ALERT(x) BIT(x) +#define MCP9600_SENSOR_CFG 0x05 +#define MCP9600_SENSOR_TYPE_MASK GENMASK(6, 4) #define MCP9600_ALERT_CFG1 0x08 #define MCP9600_ALERT_CFG(x) (MCP9600_ALERT_CFG1 + (x - 1)) #define MCP9600_ALERT_CFG_ENABLE BIT(0) @@ -66,6 +70,30 @@ static const char * const mcp9600_alert_name[MCP9600_ALE= RT_COUNT] =3D { [MCP9600_ALERT4] =3D "alert4", }; =20 +/* Map between dt-bindings enum and the chip's type value */ +static const unsigned int mcp9600_type_map[] =3D { + [THERMOCOUPLE_TYPE_K] =3D 0, + [THERMOCOUPLE_TYPE_J] =3D 1, + [THERMOCOUPLE_TYPE_T] =3D 2, + [THERMOCOUPLE_TYPE_N] =3D 3, + [THERMOCOUPLE_TYPE_S] =3D 4, + [THERMOCOUPLE_TYPE_E] =3D 5, + [THERMOCOUPLE_TYPE_B] =3D 6, + [THERMOCOUPLE_TYPE_R] =3D 7, +}; + +/* Map thermocouple type to a char for iio info in sysfs */ +static const int mcp9600_tc_types[] =3D { + [THERMOCOUPLE_TYPE_K] =3D 'K', + [THERMOCOUPLE_TYPE_J] =3D 'J', + [THERMOCOUPLE_TYPE_T] =3D 'T', + [THERMOCOUPLE_TYPE_N] =3D 'N', + [THERMOCOUPLE_TYPE_S] =3D 'S', + [THERMOCOUPLE_TYPE_E] =3D 'E', + [THERMOCOUPLE_TYPE_B] =3D 'B', + [THERMOCOUPLE_TYPE_R] =3D 'R', +}; + static const struct iio_event_spec mcp9600_events[] =3D { { .type =3D IIO_EV_TYPE_THRESH, @@ -89,6 +117,7 @@ static const struct iio_event_spec mcp9600_events[] =3D { .type =3D IIO_TEMP, \ .address =3D MCP9600_HOT_JUNCTION, \ .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | \ + BIT(IIO_CHAN_INFO_THERMOCOUPLE_TYPE) | \ BIT(IIO_CHAN_INFO_SCALE), \ .event_spec =3D &mcp9600_events[hj_ev_spec_off], \ .num_event_specs =3D hj_num_ev, \ @@ -131,6 +160,7 @@ struct mcp_chip_info { =20 struct mcp9600_data { struct i2c_client *client; + u32 thermocouple_type; }; =20 static int mcp9600_read(struct mcp9600_data *data, @@ -165,11 +195,32 @@ static int mcp9600_read_raw(struct iio_dev *indio_dev, *val =3D 62; *val2 =3D 500000; return IIO_VAL_INT_PLUS_MICRO; + case IIO_CHAN_INFO_THERMOCOUPLE_TYPE: + *val =3D mcp9600_tc_types[data->thermocouple_type]; + return IIO_VAL_CHAR; default: return -EINVAL; } } =20 +static int mcp9600_config(struct mcp9600_data *data) +{ + struct i2c_client *client =3D data->client; + int ret; + u8 cfg; + + cfg =3D FIELD_PREP(MCP9600_SENSOR_TYPE_MASK, + mcp9600_type_map[data->thermocouple_type]); + + ret =3D i2c_smbus_write_byte_data(client, MCP9600_SENSOR_CFG, cfg); + if (ret < 0) { + dev_err(&client->dev, "Failed to set sensor configuration\n"); + return ret; + } + + return 0; +} + static int mcp9600_get_alert_index(int channel2, enum iio_event_direction = dir) { if (channel2 =3D=3D IIO_MOD_TEMP_AMBIENT) { @@ -457,6 +508,24 @@ static int mcp9600_probe(struct i2c_client *client) data =3D iio_priv(indio_dev); data->client =3D client; =20 + /* Accept type from dt with default of Type-K. */ + data->thermocouple_type =3D THERMOCOUPLE_TYPE_K; + ret =3D device_property_read_u32(&client->dev, "thermocouple-type", + &data->thermocouple_type); + if (ret < 0 && ret !=3D -EINVAL) + return dev_err_probe(&client->dev, ret, + "Error reading thermocouple-type property\n"); + + if (data->thermocouple_type >=3D ARRAY_SIZE(mcp9600_type_map)) + return dev_err_probe(&client->dev, -EINVAL, + "Invalid thermocouple-type property %u.\n", + data->thermocouple_type); + + /* Set initial config. */ + ret =3D mcp9600_config(data); + if (ret < 0) + return ret; + ch_sel =3D mcp9600_probe_alerts(indio_dev); if (ch_sel < 0) return ch_sel; --=20 2.39.5 From nobody Sat Oct 4 08:03:31 2025 Received: from out-173.mta1.migadu.com (out-173.mta1.migadu.com [95.215.58.173]) (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 21C312741CF for ; Mon, 18 Aug 2025 18:32:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541960; cv=none; b=Ov5/A6oogUQ41Wq8i/kfw6ye1M9e6VeNtXYee96TW8HIpcIZR/hZTjgG1uLmOXET3GPx1b/Uat4Da4kUGdgfroqXzSvqsHX95AtgyCoJq2/dlGiPwDjgugMCikK8a6PIt2PKahguqo5MS+ZKiEiFmA+YigP7+4HYHwadozNQuMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755541960; c=relaxed/simple; bh=1O+DhnbVUgPggWlTkzKxgorM2h3F5+HuS99sAmIKvJY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ifoswEImyTtZTGkPiccVbw/ChEnyo4KnbV/vI2gJx1t3MKhj22mAKcpQlBJSNvOgzJ6Pk6+s0WsAU012ZBW+iyYhcAYLO15nSPHFbrb56IRk9DoKkEeEygVDzH3UuYdub5Qr4ipsWLNRjS+rIaDKwS1kqmic0iGKq0vk96TKZs8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=linux.dev; arc=none smtp.client-ip=95.215.58.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Ben Collins To: Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko Cc: Ben Collins , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/6] iio: mcp9600: Add support for IIR filter Date: Mon, 18 Aug 2025 14:32:14 -0400 Message-Id: <20250818183214.380847-7-bcollins@kernel.org> In-Reply-To: <20250818183214.380847-1-bcollins@kernel.org> References: <20250818183214.380847-1-bcollins@kernel.org> 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-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Ben Collins MCP9600 supports an IIR filter with 7 levels. Add IIR attribute to allow get/set of this value. Use a filter_type[none, ema] for enabling the IIR filter. Signed-off-by: Ben Collins --- drivers/iio/temperature/mcp9600.c | 157 ++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/drivers/iio/temperature/mcp9600.c b/drivers/iio/temperature/mc= p9600.c index 9b017820efc1..0ec47cbeb88c 100644 --- a/drivers/iio/temperature/mcp9600.c +++ b/drivers/iio/temperature/mcp9600.c @@ -31,6 +31,7 @@ #define MCP9600_STATUS_ALERT(x) BIT(x) #define MCP9600_SENSOR_CFG 0x05 #define MCP9600_SENSOR_TYPE_MASK GENMASK(6, 4) +#define MCP9600_FILTER_MASK GENMASK(2, 0) #define MCP9600_ALERT_CFG1 0x08 #define MCP9600_ALERT_CFG(x) (MCP9600_ALERT_CFG1 + (x - 1)) #define MCP9600_ALERT_CFG_ENABLE BIT(0) @@ -94,6 +95,27 @@ static const int mcp9600_tc_types[] =3D { [THERMOCOUPLE_TYPE_R] =3D 'R', }; =20 +enum mcp9600_filter { + MCP9600_FILTER_TYPE_NONE, + MCP9600_FILTER_TYPE_EMA, +}; + +static const char * const mcp9600_filter_type[] =3D { + [MCP9600_FILTER_TYPE_NONE] =3D "none", + [MCP9600_FILTER_TYPE_EMA] =3D "ema", +}; + +static const int mcp_iir_coefficients_avail[7][2] =3D { + /* Level 0 is no filter */ + { 0, 524549 }, + { 0, 243901 }, + { 0, 119994 }, + { 0, 59761 }, + { 0, 29851 }, + { 0, 14922 }, + { 0, 7461 }, +}; + static const struct iio_event_spec mcp9600_events[] =3D { { .type =3D IIO_EV_TYPE_THRESH, @@ -118,7 +140,11 @@ static const struct iio_event_spec mcp9600_events[] = =3D { .address =3D MCP9600_HOT_JUNCTION, \ .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_THERMOCOUPLE_TYPE) | \ + BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) | \ BIT(IIO_CHAN_INFO_SCALE), \ + .info_mask_separate_available =3D \ + BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ + .ext_info =3D mcp9600_ext_filter, \ .event_spec =3D &mcp9600_events[hj_ev_spec_off], \ .num_event_specs =3D hj_num_ev, \ }, \ @@ -134,6 +160,26 @@ static const struct iio_event_spec mcp9600_events[] = =3D { }, \ } =20 +static int mcp9600_get_filter(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan); +static int mcp9600_set_filter(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + unsigned int mode); + +static const struct iio_enum mcp9600_filter_enum =3D { + .items =3D mcp9600_filter_type, + .num_items =3D ARRAY_SIZE(mcp9600_filter_type), + .get =3D mcp9600_get_filter, + .set =3D mcp9600_set_filter, +}; + +static const struct iio_chan_spec_ext_info mcp9600_ext_filter[] =3D { + IIO_ENUM("filter_type", IIO_SHARED_BY_ALL, &mcp9600_filter_enum), + IIO_ENUM_AVAILABLE("filter_type", IIO_SHARED_BY_ALL, + &mcp9600_filter_enum), + { } +}; + static const struct iio_chan_spec mcp9600_channels[][2] =3D { MCP9600_CHANNELS(0, 0, 0, 0), /* Alerts: - - - - */ MCP9600_CHANNELS(1, 0, 0, 0), /* Alerts: 1 - - - */ @@ -161,6 +207,8 @@ struct mcp_chip_info { struct mcp9600_data { struct i2c_client *client; u32 thermocouple_type; + /* Filter enabled is 1-7, with 0 being off (filter_type none) */ + u8 filter_level; }; =20 static int mcp9600_read(struct mcp9600_data *data, @@ -191,13 +239,45 @@ static int mcp9600_read_raw(struct iio_dev *indio_dev, if (ret) return ret; return IIO_VAL_INT; + case IIO_CHAN_INFO_SCALE: *val =3D 62; *val2 =3D 500000; return IIO_VAL_INT_PLUS_MICRO; + case IIO_CHAN_INFO_THERMOCOUPLE_TYPE: *val =3D mcp9600_tc_types[data->thermocouple_type]; return IIO_VAL_CHAR; + + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + if (data->filter_level =3D=3D 0) + return -EINVAL; + + *val =3D mcp_iir_coefficients_avail[data->filter_level - 1][0]; + *val2 =3D mcp_iir_coefficients_avail[data->filter_level - 1][1]; + return IIO_VAL_INT_PLUS_MICRO; + + default: + return -EINVAL; + } +} + +static int mcp9600_read_avail(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + const int **vals, int *type, int *length, + long mask) +{ + struct mcp9600_data *data =3D iio_priv(indio_dev); + + switch (mask) { + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + if (data->filter_level =3D=3D 0) + return -EINVAL; + + *vals =3D (int *)mcp_iir_coefficients_avail; + *type =3D IIO_VAL_INT_PLUS_MICRO; + *length =3D 2 * ARRAY_SIZE(mcp_iir_coefficients_avail); + return IIO_AVAIL_LIST; default: return -EINVAL; } @@ -211,6 +291,7 @@ static int mcp9600_config(struct mcp9600_data *data) =20 cfg =3D FIELD_PREP(MCP9600_SENSOR_TYPE_MASK, mcp9600_type_map[data->thermocouple_type]); + FIELD_MODIFY(MCP9600_FILTER_MASK, &cfg, data->filter_level); =20 ret =3D i2c_smbus_write_byte_data(client, MCP9600_SENSOR_CFG, cfg); if (ret < 0) { @@ -221,6 +302,79 @@ static int mcp9600_config(struct mcp9600_data *data) return 0; } =20 +static int mcp9600_write_raw_get_fmt(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + long mask) +{ + switch (mask) { + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + return IIO_VAL_INT_PLUS_MICRO; + default: + return -EINVAL; + } +} + +static int mcp9600_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, int val2, long mask) +{ + struct mcp9600_data *data =3D iio_priv(indio_dev); + int i; + + switch (mask) { + case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: + for (i =3D 0; i < ARRAY_SIZE(mcp_iir_coefficients_avail); i++) { + if (mcp_iir_coefficients_avail[i][0] =3D=3D val && + mcp_iir_coefficients_avail[i][1] =3D=3D val2) + break; + } + + if (i =3D=3D ARRAY_SIZE(mcp_iir_coefficients_avail)) + return -EINVAL; + + data->filter_level =3D i + 1; + return mcp9600_config(data); + + default: + return -EINVAL; + } +} + +static int mcp9600_get_filter(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan) +{ + struct mcp9600_data *data =3D iio_priv(indio_dev); + + if (data->filter_level =3D=3D 0) + return MCP9600_FILTER_TYPE_NONE; + + return MCP9600_FILTER_TYPE_EMA; +} + +static int mcp9600_set_filter(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + unsigned int mode) +{ + struct mcp9600_data *data =3D iio_priv(indio_dev); + + switch (mode) { + case MCP9600_FILTER_TYPE_NONE: + data->filter_level =3D 0; + return mcp9600_config(data); + + case MCP9600_FILTER_TYPE_EMA: + if (data->filter_level =3D=3D 0) { + /* Minimum filter by default */ + data->filter_level =3D 1; + return mcp9600_config(data); + } + return 0; + + default: + return -EINVAL; + } +} + static int mcp9600_get_alert_index(int channel2, enum iio_event_direction = dir) { if (channel2 =3D=3D IIO_MOD_TEMP_AMBIENT) { @@ -358,6 +512,9 @@ static int mcp9600_write_thresh(struct iio_dev *indio_d= ev, =20 static const struct iio_info mcp9600_info =3D { .read_raw =3D mcp9600_read_raw, + .read_avail =3D mcp9600_read_avail, + .write_raw =3D mcp9600_write_raw, + .write_raw_get_fmt =3D mcp9600_write_raw_get_fmt, .read_event_config =3D mcp9600_read_event_config, .write_event_config =3D mcp9600_write_event_config, .read_event_value =3D mcp9600_read_thresh, --=20 2.39.5