From nobody Wed Jun 17 07:35:40 2026 Received: from mout-p-103.mailbox.org (mout-p-103.mailbox.org [80.241.56.161]) (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 DAACC29B79B; Mon, 27 Apr 2026 07:16:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=80.241.56.161 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777274170; cv=none; b=r0dhjBv86z/5dhMX3pXFZJ0BxGQm78MPd+GU9a0Jgif8uXKbq2p2K0owaNl6O5EcbKW6HShpG1eSU9xbwEoVQvxUZm1Cp/MKmTCmB1JMYRbe5LOi7AOSblBVmvN9Z543ZBvV9T89uKtZ/F370Lr+cuhG8IQLuIQ9cJ6NF8cxeqc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777274170; c=relaxed/simple; bh=UUJ+sQlUX0eKGbwjj7s23No22l4ycBNMxqdDXNrNx9E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bHV7C7AJlhNCiiv8Aa8uCwQ/cdK7z4oeujcW2yjRODAcZcWdeqHlrTijxeuBdjJ+s987hcg4NsRkpaoBViAMBCmA9JPpDnoq0DdbhgtAUFwu+itGY6JcKN/oc7DRtBGF6pT/X04uN8uEjWGi2dpsmnRoGDzUDLelnnpDohBYrro= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org; spf=pass smtp.mailfrom=mailbox.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=aQvW6l7m; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=eF3jyJ5V; arc=none smtp.client-ip=80.241.56.161 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mailbox.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="aQvW6l7m"; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="eF3jyJ5V" Received: from smtp202.mailbox.org (smtp202.mailbox.org [IPv6:2001:67c:2050:b231:465::202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4g3vxK61pwz9tqK; Mon, 27 Apr 2026 09:16:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1777274165; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L6ZIoV8NyEqxJxOQGFAZMu0kTEjbJpCkm/yISo2WeSY=; b=aQvW6l7mWTbSdvBxLqKa03ir7+okL6YqcYeVhf3cjYrToXjGTVqnKaC69JRWY4aZMiHGgo lTADtbFYaRu+j22K8rfMn/EWvnan/R5pmamTpxBTXBHo0hcvWLBrgqaoethHvLQUPR8Iaf 8Fz1ZlEQqqXkzYlgGFWgjp8IFFU2vf18Ij0V5YP3v2UXBZxTURXqZ2iCvbOsnl5BGPgaqk XSM/rGLrtISRZhObaqsiNz7wJB1136Lhk+NoCKDM9CNOazhFQlxQBaVLPA6+xnFU47Wkz/ L+Fk8EtMz2dzCFYz46FYHXuak0hMy03nblyPD62lBCPgQgtO7YpurPqeB9kDSA== Authentication-Results: outgoing_mbo_mout; dkim=pass header.d=mailbox.org header.s=mail20150812 header.b=eF3jyJ5V; spf=pass (outgoing_mbo_mout: domain of shuwei.wu@mailbox.org designates 2001:67c:2050:b231:465::202 as permitted sender) smtp.mailfrom=shuwei.wu@mailbox.org From: Shuwei Wu DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1777274163; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L6ZIoV8NyEqxJxOQGFAZMu0kTEjbJpCkm/yISo2WeSY=; b=eF3jyJ5V0x3FRCE7gbq4vNeywOSfSt2CEuN86+AsB+Hx0GTY1RDn8bsJte5bjTDavX+07n iVdI8q0MPC4LKcvpwfe2Mhe96kTypBTIpEFjytTRNDxKZTBXTZxv6QRUk1mTgGzFauUJyd e7iSAXpa/gItk51Z6xMcrSl4h6q/FOhEWFmSrzLXALJnG66ENOVtTjoqaJtj4MZ7Uco5+v clMejNE9DH5IDluGQBreZ5G3GEOLEaoy+8D9ap4uKlOYj7RDTgxCu6oWlpjFulU8XhtGvn /yVYrDpbvd4ams9vGMHi4gk0dYEd2jHGt2rlF3AwFl0WoSBUmo182s80RCWruw== Date: Mon, 27 Apr 2026 15:15:15 +0800 Subject: [PATCH v5 1/3] dt-bindings: thermal: Add SpacemiT K1 thermal sensor 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: <20260427-k1-thermal-v5-1-df39187480ed@mailbox.org> References: <20260427-k1-thermal-v5-0-df39187480ed@mailbox.org> In-Reply-To: <20260427-k1-thermal-v5-0-df39187480ed@mailbox.org> To: "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Shuwei Wu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, Krzysztof Kozlowski X-Developer-Signature: v=1; a=ed25519-sha256; t=1777274126; l=2550; i=shuwei.wu@mailbox.org; s=20251125; h=from:subject:message-id; bh=UUJ+sQlUX0eKGbwjj7s23No22l4ycBNMxqdDXNrNx9E=; b=dmeyx6ZIhgdI5BY6CDdaKniHUOVN8OAuWqefmqf1d3SHOBPY0FNFqjlyHOB2LZij01cRhR82m Fa4gu0aBFxLBzYeEcxlKysbFAKG8ibyO/CXqkYYBD11RQGpbEzTfH/5 X-Developer-Key: i=shuwei.wu@mailbox.org; a=ed25519; pk=qZs6i2UZnXkmjUrwO5HJxcfpCvgSNrR4dcU5cjtfTSk= X-MBO-RS-ID: de908bd57847811520f X-MBO-RS-META: uzdnzot9irjhq4qy9r8zxa5gqmy4rwp6 X-Rspamd-Queue-Id: 4g3vxK61pwz9tqK Document the SpacemiT K1 Thermal Sensor, which supports monitoring temperatures for five zones: soc, package, gpu, cluster0, and cluster1. Reviewed-by: Krzysztof Kozlowski Signed-off-by: Shuwei Wu --- Changes in v2: - Rename binding file to spacemit,k1-tsensor.yaml and update compatible --- .../bindings/thermal/spacemit,k1-tsensor.yaml | 76 ++++++++++++++++++= ++++ 1 file changed, 76 insertions(+) diff --git a/Documentation/devicetree/bindings/thermal/spacemit,k1-tsensor.= yaml b/Documentation/devicetree/bindings/thermal/spacemit,k1-tsensor.yaml new file mode 100644 index 000000000000..6dad76a7dd36 --- /dev/null +++ b/Documentation/devicetree/bindings/thermal/spacemit,k1-tsensor.yaml @@ -0,0 +1,76 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/thermal/spacemit,k1-tsensor.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: SpacemiT K1 Thermal Sensor + +description: + The SpacemiT K1 Thermal Sensor monitors the temperature of the SoC + using multiple internal sensors (e.g., soc, package, gpu, clusters). + +maintainers: + - Shuwei Wu + +$ref: thermal-sensor.yaml# + +properties: + compatible: + const: spacemit,k1-tsensor + + reg: + maxItems: 1 + + clocks: + items: + - description: Core clock for thermal sensor + - description: Bus clock for thermal sensor + + clock-names: + items: + - const: core + - const: bus + + interrupts: + maxItems: 1 + + resets: + items: + - description: Reset for the thermal sensor + + "#thermal-sensor-cells": + const: 1 + description: + The first cell indicates the sensor ID. + 0 =3D soc + 1 =3D package + 2 =3D gpu + 3 =3D cluster0 + 4 =3D cluster1 + +required: + - compatible + - reg + - clocks + - clock-names + - interrupts + - resets + - "#thermal-sensor-cells" + +additionalProperties: false + +examples: + - | + #include + + thermal@d4018000 { + compatible =3D "spacemit,k1-tsensor"; + reg =3D <0xd4018000 0x100>; + clocks =3D <&syscon_apbc CLK_TSEN>, + <&syscon_apbc CLK_TSEN_BUS>; + clock-names =3D "core", "bus"; + interrupts =3D <61>; + resets =3D <&syscon_apbc RESET_TSEN>; + #thermal-sensor-cells =3D <1>; + }; --=20 2.53.0 From nobody Wed Jun 17 07:35:40 2026 Received: from mout-p-202.mailbox.org (mout-p-202.mailbox.org [80.241.56.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 BE87129B79B; Mon, 27 Apr 2026 07:16:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=80.241.56.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777274193; cv=none; b=ZLeyPXNNkk2w+/53qNN5vMoOB7R/4hhHcjZijwVFQEEMtNAXOQVhbhkWmKypbkk8Sfy38mdYI+fQtjgeTtLw+XjjDGytZHxVb8nu28Ijr0NvM0qGD0LVRrr+5qE8bThtacZg1gCL5mIVdFI2nvlqaNrsAMy3682QY4bb7l2orJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777274193; c=relaxed/simple; bh=40uFKLlug3xRmfReVZDY8ggtW3G2p6wJj1cxhpTHt/I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lgWOOedHhEn/qFFkrmvP9o3ANOFRWqlQ1MmEsLIrtAoodFpCsK0uVIVzwIZtZ02kliNezYz8qr0HC72HjK1pMBl0wbvXeU8+jofwHfVic9P0iUB4tvRXjFcA4kqocQdrrKfxf2E3wKU+uGzW9npQWNcba5HW/viPkLFOOqiUMUY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org; spf=pass smtp.mailfrom=mailbox.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=SYi7QIug; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=x4qH5AtX; arc=none smtp.client-ip=80.241.56.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mailbox.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="SYi7QIug"; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="x4qH5AtX" Received: from smtp202.mailbox.org (smtp202.mailbox.org [10.196.197.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-202.mailbox.org (Postfix) with ESMTPS id 4g3vxf5X5Hz9tfH; Mon, 27 Apr 2026 09:16:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1777274182; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QGi5l/ReSkqj1hDBSIlraZeAIAxFExTyQJawcOh+JOI=; b=SYi7QIugrHAVuoF3loLyMJd5FKjQ5lmqZVkmoCZVgWh+o05JuC784GsnILK35QD5qJjFp5 FiOSuRBCBrkOeG0RCNKA4h4Pr//3ZqnvXWq7mVsba36rauavL/7FGVDEPShvvfFEWplTje cGjo3f3sY9Vg96aKEckOdXifisK0DhZ/XQKtOcKkToyhpcXo0/CB2nUOpzOhuRM1dbDt4r QwLS8CSX/+78XeB+efDj6V2gg4hKHK3tiAsAZoTnD7co2wtOfe80nNZPn+ibp9C63NW2WE Jix/b1zHjdJI3HHUBaAgUSGryEc9Du6Rb+X9QwxZQZb8vAa7b/4pOxJ1Wvo1dA== From: Shuwei Wu DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1777274181; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QGi5l/ReSkqj1hDBSIlraZeAIAxFExTyQJawcOh+JOI=; b=x4qH5AtXw4afikn8542/d5I8xvyLMOlf9LVZEh6qJNXSGkPKFWY6+ESnzgsCJlREH/4toX 7dKcpKQOXvIkFFlTdNKA6LbixPVGitd0vVT/DcXk1OfCKw3YgLwYokOCsMsYRToi2cC3bB wI67ObBvJokmb45ew+/W8PMF5HIcy38+b1Q1jJ+lTtLR1Ey2j+V73anr/0kn+awiyoYqQr tCTyEIJHlmIE7wrt4ZRJg96twxW5f5BzmjvwF0pTc0ZChJk44wepT2m6nwn3Mtjtp9BdFF otqN3IRXaCJcGEr4Z0w1fTtrsD5AC8sofCknBbakyv7yvBhdfbGHA+Kyq+gxUw== Date: Mon, 27 Apr 2026 15:15:16 +0800 Subject: [PATCH v5 2/3] thermal: spacemit: k1: Add thermal sensor support 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: <20260427-k1-thermal-v5-2-df39187480ed@mailbox.org> References: <20260427-k1-thermal-v5-0-df39187480ed@mailbox.org> In-Reply-To: <20260427-k1-thermal-v5-0-df39187480ed@mailbox.org> To: "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Shuwei Wu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, Anand Moon , Troy Mitchell , Yao Zi , Vincent Legoll , Gong Shuai X-Developer-Signature: v=1; a=ed25519-sha256; t=1777274126; l=12421; i=shuwei.wu@mailbox.org; s=20251125; h=from:subject:message-id; bh=40uFKLlug3xRmfReVZDY8ggtW3G2p6wJj1cxhpTHt/I=; b=Qef2+57eQQ7GqHReXmMz0skYPrnDBMqCq2OWCO9sNeRiRlCF1gbYUJUsV+SahlL2+tpuEIiwr YheES5IyNCeDT38cKxVDZXdWKIqwnVwNQczbZOlQCiu8AVANEKEJ0Ft X-Developer-Key: i=shuwei.wu@mailbox.org; a=ed25519; pk=qZs6i2UZnXkmjUrwO5HJxcfpCvgSNrR4dcU5cjtfTSk= X-MBO-RS-ID: 8f80b0325b8a66b0012 X-MBO-RS-META: ka81k9rf4ga37sw8j5ox73rit3mpc5cd The thermal sensor on K1 supports monitoring five temperature zones. The driver registers these sensors with the thermal framework and supports standard operations: - Reading temperature (millidegree Celsius) - Setting high/low thresholds for interrupts Reviewed-by: Anand Moon Tested-by: Anand Moon Reviewed-by: Troy Mitchell Reviewed-by: Yao Zi Tested-by: Vincent Legoll # OrangePi-RV2 Tested-by: Gong Shuai Signed-off-by: Shuwei Wu --- Changes in v5: - Register threaded IRQ handler before enabling interrupts - Clamp high and low trip points with clamp_val in set_trips Changes in v4: - Add 'depends on THERMAL_OF' in drivers/thermal/spacemit/Kconfig Changes in v3: - Align multi-line assignments as suggested by reviewer - Remove unnecessary variable definitions Changes in v2: - Rename k1_thermal.c to k1_tsensor.c for better hardware alignment - Move driver to drivers/thermal/spacemit/ - Add Kconfig/Makefile for spacemit and update top-level build files - Refactor names, style, code alignment, and comments - Simplify probe and error handling --- drivers/thermal/Kconfig | 2 + drivers/thermal/Makefile | 1 + drivers/thermal/spacemit/Kconfig | 19 +++ drivers/thermal/spacemit/Makefile | 3 + drivers/thermal/spacemit/k1_tsensor.c | 280 ++++++++++++++++++++++++++++++= ++++ 5 files changed, 305 insertions(+) diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index b10080d61860..1c4a5cd5a23e 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig @@ -472,6 +472,8 @@ endmenu =20 source "drivers/thermal/renesas/Kconfig" =20 +source "drivers/thermal/spacemit/Kconfig" + source "drivers/thermal/tegra/Kconfig" =20 config GENERIC_ADC_THERMAL diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile index bb21e7ea7fc6..3b249195c088 100644 --- a/drivers/thermal/Makefile +++ b/drivers/thermal/Makefile @@ -65,6 +65,7 @@ obj-y +=3D mediatek/ obj-$(CONFIG_GENERIC_ADC_THERMAL) +=3D thermal-generic-adc.o obj-$(CONFIG_UNIPHIER_THERMAL) +=3D uniphier_thermal.o obj-$(CONFIG_AMLOGIC_THERMAL) +=3D amlogic_thermal.o +obj-y +=3D spacemit/ obj-$(CONFIG_SPRD_THERMAL) +=3D sprd_thermal.o obj-$(CONFIG_KHADAS_MCU_FAN_THERMAL) +=3D khadas_mcu_fan.o obj-$(CONFIG_LOONGSON2_THERMAL) +=3D loongson2_thermal.o diff --git a/drivers/thermal/spacemit/Kconfig b/drivers/thermal/spacemit/Kc= onfig new file mode 100644 index 000000000000..de7b5ece5af2 --- /dev/null +++ b/drivers/thermal/spacemit/Kconfig @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: GPL-2.0-only +menu "SpacemiT thermal drivers" +depends on ARCH_SPACEMIT || COMPILE_TEST + +config SPACEMIT_K1_TSENSOR + tristate "SpacemiT K1 thermal sensor driver" + depends on THERMAL_OF + help + This driver provides support for the thermal sensor + integrated in the SpacemiT K1 SoC. + + The thermal sensor monitors temperatures for five thermal zones: + soc, package, gpu, cluster0, and cluster1. It supports reporting + temperature values and handling high/low threshold interrupts. + + Say Y here if you want to enable thermal monitoring on SpacemiT K1. + If compiled as a module, it will be called k1_tsensor. + +endmenu diff --git a/drivers/thermal/spacemit/Makefile b/drivers/thermal/spacemit/M= akefile new file mode 100644 index 000000000000..82b30741e4ec --- /dev/null +++ b/drivers/thermal/spacemit/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-only + +obj-$(CONFIG_SPACEMIT_K1_TSENSOR) +=3D k1_tsensor.o diff --git a/drivers/thermal/spacemit/k1_tsensor.c b/drivers/thermal/spacem= it/k1_tsensor.c new file mode 100644 index 000000000000..79222d233129 --- /dev/null +++ b/drivers/thermal/spacemit/k1_tsensor.c @@ -0,0 +1,280 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Thermal sensor driver for SpacemiT K1 SoC + * + * Copyright (C) 2026 Shuwei Wu + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../thermal_hwmon.h" + +#define K1_TSENSOR_PCTRL_REG 0x00 +#define K1_TSENSOR_PCTRL_ENABLE BIT(0) +#define K1_TSENSOR_PCTRL_TEMP_MODE BIT(3) +#define K1_TSENSOR_PCTRL_RAW_SEL BIT(7) + +#define K1_TSENSOR_PCTRL_CTUNE GENMASK(11, 8) +#define K1_TSENSOR_PCTRL_SW_CTRL GENMASK(21, 18) +#define K1_TSENSOR_PCTRL_HW_AUTO_MODE BIT(23) + +#define K1_TSENSOR_EN_REG 0x08 +#define K1_TSENSOR_EN_ALL GENMASK(MAX_SENSOR_NUMBER - 1, 0) + +#define K1_TSENSOR_TIME_REG 0x0C +#define K1_TSENSOR_TIME_WAIT_REF_CNT GENMASK(3, 0) +#define K1_TSENSOR_TIME_ADC_CNT_RST GENMASK(7, 4) +#define K1_TSENSOR_TIME_FILTER_PERIOD GENMASK(21, 20) +#define K1_TSENSOR_TIME_MASK GENMASK(23, 0) + +#define K1_TSENSOR_INT_CLR_REG 0x10 +#define K1_TSENSOR_INT_EN_REG 0x14 +#define K1_TSENSOR_INT_STA_REG 0x18 + +#define K1_TSENSOR_INT_EN_MASK BIT(0) +#define K1_TSENSOR_INT_MASK(x) (GENMASK(2, 1) << ((x) * 2)) + +#define K1_TSENSOR_DATA_BASE_REG 0x20 +#define K1_TSENSOR_DATA_REG(x) (K1_TSENSOR_DATA_BASE_REG + ((x) / 2) * 4) +#define K1_TSENSOR_DATA_LOW_MASK GENMASK(15, 0) +#define K1_TSENSOR_DATA_HIGH_MASK GENMASK(31, 16) + +#define K1_TSENSOR_THRSH_BASE_REG 0x40 +#define K1_TSENSOR_THRSH_REG(x) (K1_TSENSOR_THRSH_BASE_REG + ((x) * 4)) +#define K1_TSENSOR_THRSH_LOW_MASK GENMASK(15, 0) +#define K1_TSENSOR_THRSH_HIGH_MASK GENMASK(31, 16) + +#define MAX_SENSOR_NUMBER 5 + +/* Hardware offset value required for temperature calculation */ +#define TEMPERATURE_OFFSET 278 + +struct k1_tsensor_channel { + struct k1_tsensor *ts; + struct thermal_zone_device *tzd; + int id; +}; + +struct k1_tsensor { + void __iomem *base; + struct k1_tsensor_channel ch[MAX_SENSOR_NUMBER]; +}; + +static void k1_tsensor_init(struct k1_tsensor *ts) +{ + u32 val; + + /* Disable all the interrupts */ + writel(0xffffffff, ts->base + K1_TSENSOR_INT_EN_REG); + + /* Configure ADC sampling time and filter period */ + val =3D readl(ts->base + K1_TSENSOR_TIME_REG); + val &=3D ~K1_TSENSOR_TIME_MASK; + val |=3D K1_TSENSOR_TIME_FILTER_PERIOD | + K1_TSENSOR_TIME_ADC_CNT_RST | + K1_TSENSOR_TIME_WAIT_REF_CNT; + writel(val, ts->base + K1_TSENSOR_TIME_REG); + + /* + * Enable all sensors' auto mode, enable dither control, + * consecutive mode, and power up sensor. + */ + val =3D readl(ts->base + K1_TSENSOR_PCTRL_REG); + val &=3D ~K1_TSENSOR_PCTRL_SW_CTRL; + val &=3D ~K1_TSENSOR_PCTRL_CTUNE; + val |=3D K1_TSENSOR_PCTRL_RAW_SEL | + K1_TSENSOR_PCTRL_TEMP_MODE | + K1_TSENSOR_PCTRL_HW_AUTO_MODE | + K1_TSENSOR_PCTRL_ENABLE; + writel(val, ts->base + K1_TSENSOR_PCTRL_REG); + + /* Enable each sensor */ + val =3D readl(ts->base + K1_TSENSOR_EN_REG); + val |=3D K1_TSENSOR_EN_ALL; + writel(val, ts->base + K1_TSENSOR_EN_REG); +} + +static void k1_tsensor_enable_irq(struct k1_tsensor_channel *ch) +{ + struct k1_tsensor *ts =3D ch->ts; + u32 val; + + val =3D readl(ts->base + K1_TSENSOR_INT_CLR_REG); + val |=3D K1_TSENSOR_INT_MASK(ch->id); + writel(val, ts->base + K1_TSENSOR_INT_CLR_REG); + + val =3D readl(ts->base + K1_TSENSOR_INT_EN_REG); + val &=3D ~K1_TSENSOR_INT_MASK(ch->id); + writel(val, ts->base + K1_TSENSOR_INT_EN_REG); + + /* Enable thermal interrupt */ + val =3D readl(ts->base + K1_TSENSOR_INT_EN_REG); + val |=3D K1_TSENSOR_INT_EN_MASK; + writel(val, ts->base + K1_TSENSOR_INT_EN_REG); +} + +/* + * The conversion formula used is: + * T(m=C2=B0C) =3D (((raw_value & mask) >> shift) - TEMPERATURE_OFFSET) * = 1000 + */ +static int k1_tsensor_get_temp(struct thermal_zone_device *tz, int *temp) +{ + struct k1_tsensor_channel *ch =3D thermal_zone_device_priv(tz); + struct k1_tsensor *ts =3D ch->ts; + u32 val; + + val =3D readl(ts->base + K1_TSENSOR_DATA_REG(ch->id)); + if (ch->id % 2) + *temp =3D FIELD_GET(K1_TSENSOR_DATA_HIGH_MASK, val); + else + *temp =3D FIELD_GET(K1_TSENSOR_DATA_LOW_MASK, val); + + *temp -=3D TEMPERATURE_OFFSET; + *temp *=3D 1000; + + return 0; +} + +/* + * For each sensor, the hardware threshold register is 32 bits: + * - Lower 16 bits [15:0] configure the low threshold temperature. + * - Upper 16 bits [31:16] configure the high threshold temperature. + */ +static int k1_tsensor_set_trips(struct thermal_zone_device *tz, int low, i= nt high) +{ + struct k1_tsensor_channel *ch =3D thermal_zone_device_priv(tz); + struct k1_tsensor *ts =3D ch->ts; + u32 val; + + if (low >=3D high) + return -EINVAL; + + low =3D clamp_val(low / 1000 + TEMPERATURE_OFFSET, TEMPERATURE_OFFSET, + FIELD_MAX(K1_TSENSOR_THRSH_LOW_MASK)); + high =3D clamp_val(high / 1000 + TEMPERATURE_OFFSET, TEMPERATURE_OFFSET, + FIELD_MAX(K1_TSENSOR_THRSH_HIGH_MASK)); + + val =3D readl(ts->base + K1_TSENSOR_THRSH_REG(ch->id)); + + val &=3D ~(K1_TSENSOR_THRSH_LOW_MASK | K1_TSENSOR_THRSH_HIGH_MASK); + val |=3D FIELD_PREP(K1_TSENSOR_THRSH_LOW_MASK, low); + val |=3D FIELD_PREP(K1_TSENSOR_THRSH_HIGH_MASK, high); + + writel(val, ts->base + K1_TSENSOR_THRSH_REG(ch->id)); + + return 0; +} + +static const struct thermal_zone_device_ops k1_tsensor_ops =3D { + .get_temp =3D k1_tsensor_get_temp, + .set_trips =3D k1_tsensor_set_trips, +}; + +static irqreturn_t k1_tsensor_irq_thread(int irq, void *data) +{ + struct k1_tsensor *ts =3D (struct k1_tsensor *)data; + int mask, status, i; + + status =3D readl(ts->base + K1_TSENSOR_INT_STA_REG); + + for (i =3D 0; i < MAX_SENSOR_NUMBER; i++) { + if (status & K1_TSENSOR_INT_MASK(i)) { + mask =3D readl(ts->base + K1_TSENSOR_INT_CLR_REG); + mask |=3D K1_TSENSOR_INT_MASK(i); + writel(mask, ts->base + K1_TSENSOR_INT_CLR_REG); + thermal_zone_device_update(ts->ch[i].tzd, THERMAL_EVENT_UNSPECIFIED); + } + } + + return IRQ_HANDLED; +} + +static int k1_tsensor_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct k1_tsensor *ts; + struct reset_control *reset; + struct clk *clk; + int i, irq, ret; + + ts =3D devm_kzalloc(dev, sizeof(*ts), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + ts->base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(ts->base)) + return dev_err_probe(dev, PTR_ERR(ts->base), "Failed to get reg\n"); + + reset =3D devm_reset_control_get_exclusive_deasserted(dev, NULL); + if (IS_ERR(reset)) + return dev_err_probe(dev, PTR_ERR(reset), "Failed to get/deassert reset = control\n"); + + clk =3D devm_clk_get_enabled(dev, "core"); + if (IS_ERR(clk)) + return dev_err_probe(dev, PTR_ERR(clk), "Failed to get core clock\n"); + + clk =3D devm_clk_get_enabled(dev, "bus"); + if (IS_ERR(clk)) + return dev_err_probe(dev, PTR_ERR(clk), "Failed to get bus clock\n"); + + k1_tsensor_init(ts); + + irq =3D platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + ret =3D devm_request_threaded_irq(dev, irq, NULL, + k1_tsensor_irq_thread, + IRQF_ONESHOT, "k1_tsensor", ts); + if (ret < 0) + return ret; + + for (i =3D 0; i < MAX_SENSOR_NUMBER; ++i) { + ts->ch[i].id =3D i; + ts->ch[i].ts =3D ts; + ts->ch[i].tzd =3D devm_thermal_of_zone_register(dev, i, ts->ch + i, &k1_= tsensor_ops); + if (IS_ERR(ts->ch[i].tzd)) + return PTR_ERR(ts->ch[i].tzd); + + /* Attach sysfs hwmon attributes for userspace monitoring */ + ret =3D devm_thermal_add_hwmon_sysfs(dev, ts->ch[i].tzd); + if (ret) + dev_warn(dev, "Failed to add hwmon sysfs attributes\n"); + + k1_tsensor_enable_irq(ts->ch + i); + } + + platform_set_drvdata(pdev, ts); + + return 0; +} + +static const struct of_device_id k1_tsensor_dt_ids[] =3D { + { .compatible =3D "spacemit,k1-tsensor" }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, k1_tsensor_dt_ids); + +static struct platform_driver k1_tsensor_driver =3D { + .driver =3D { + .name =3D "k1_tsensor", + .of_match_table =3D k1_tsensor_dt_ids, + }, + .probe =3D k1_tsensor_probe, +}; +module_platform_driver(k1_tsensor_driver); + +MODULE_DESCRIPTION("SpacemiT K1 Thermal Sensor Driver"); +MODULE_AUTHOR("Shuwei Wu "); +MODULE_LICENSE("GPL"); --=20 2.53.0 From nobody Wed Jun 17 07:35:40 2026 Received: from mout-p-201.mailbox.org (mout-p-201.mailbox.org [80.241.56.171]) (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 62263346FD2; Mon, 27 Apr 2026 07:16:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=80.241.56.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777274205; cv=none; b=G8iRC1qi9Crzv8ch8D7z4q0Maz1hx+dA9+P1E/6bh+q5M5xrE1gP6DmUlBEr9Kd2mJJnQ9u8g0mxvVv4FBpXG+m02RexfW8sKbMiGdFZs1YR1jHEkAGBpc9/NkM5pReDS5xVLDYtuAW0FK3Nk/8BkUJUggkJvFb3XhYzBgz1eZQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777274205; c=relaxed/simple; bh=8HzKh0CsYmGIMngJ/4+BYykBWGiMmfP0pM8J1UsfrB0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oyezWWMrC98FVzkBwZGaevlgyL1KGlsS2n6T4gDNMtHppGuIDgrITj+QbNn3OqunwdPz6QPt5yZfcpIMWkPa+Jf2g5Yzjsy51Y87cLiCi7MRCL3y/gvmnAH6CknYyQQnKM5efl4zHQCgHH4wyuO0MvY7myNMRJgprChoblMdBP0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org; spf=pass smtp.mailfrom=mailbox.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=Zl9Pj3qB; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=txtDWcEB; arc=none smtp.client-ip=80.241.56.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mailbox.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="Zl9Pj3qB"; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="txtDWcEB" Received: from smtp202.mailbox.org (smtp202.mailbox.org [10.196.197.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4g3vxv4gTyz9tty; Mon, 27 Apr 2026 09:16:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1777274195; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VNJkRq0Y8simejX2Aa8XtIUh6Eyf4vR8aRfuoLPHrWY=; b=Zl9Pj3qBfuKkbhhIB73UH0q0hqcVm6qjP6z4eldu+8C7/fN6RLYMhKRIraW/Hl1DcNKwLL eTQd/9evh+MGwoXxx9xWzaq/mw5OehGTHgqFNlngxfMZ/+mgksiHGFWjL0xvMqcMWSx4Fe 8SBjWYrS5SI2P2uJFzzohxRtwL1hW7J5V4Y3rgEOO9HejIx4SVdyGPLuGDjOFrtsz7fpzK KEcUwwxubv7cyclG4MvuiIDKHOAew3F8i3iZoS/jG2+ZTsef+cy81tD7pajQeFYQULGOfo yaftIBD4kQ5jmyJgJ2dJ+8gX2rVqXZJDQ6h7ZtzdLSA4QibvVRDAa9KdAFR2dA== From: Shuwei Wu DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1777274193; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VNJkRq0Y8simejX2Aa8XtIUh6Eyf4vR8aRfuoLPHrWY=; b=txtDWcEBiElxI0YPtmeKnq5I2+M25J+FjsalJWL40Fsb6PzGrmwrTFPKwEKbNOHS5wDAOP uKmc/EdJn5YO0gh5Cvy83Q1zRatlR8kj2ewbc8Wlo1b3Z4/UsFm/brdF+/uaJSLSl8mSyp 2NWF/BKO3TrballD9OKKXehU5F+q0iRPDgt21kM0kvfoCN4Nw9vpWhDRvwt4GJkrb+neVT PVrwXBy8l7k17xDim5lHMtysIIreKAiDRxgpAaCxk9uR4eqq1tXzpMfEe1nHZjmGKauVvQ SQ2NVrI3EV7XtghjC/Yv1KQren//EjMD1paABk45IPW7b7E733jwvOKLtNlLEg== Date: Mon, 27 Apr 2026 15:15:17 +0800 Subject: [PATCH v5 3/3] riscv: dts: spacemit: Add thermal sensor for K1 SoC 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: <20260427-k1-thermal-v5-3-df39187480ed@mailbox.org> References: <20260427-k1-thermal-v5-0-df39187480ed@mailbox.org> In-Reply-To: <20260427-k1-thermal-v5-0-df39187480ed@mailbox.org> To: "Rafael J. Wysocki" , Daniel Lezcano , Zhang Rui , Lukasz Luba , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Yixun Lan , Shuwei Wu , Philipp Zabel , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti Cc: linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-riscv@lists.infradead.org, spacemit@lists.linux.dev, linux-kernel@vger.kernel.org, Vincent Legoll , Gong Shuai X-Developer-Signature: v=1; a=ed25519-sha256; t=1777274126; l=3192; i=shuwei.wu@mailbox.org; s=20251125; h=from:subject:message-id; bh=8HzKh0CsYmGIMngJ/4+BYykBWGiMmfP0pM8J1UsfrB0=; b=sPSo1p+fRgWfsIBAcWspbSex6Q+7fR3ybqJIkbskOZxkD7AxY1MFkmmpVh5Ps5X0eCAf+8hUc hsumGXIewy5C1H9TpeSr6e4GKLgjDuLuNCIUPPOzBwuo3D/wRuRSSQn X-Developer-Key: i=shuwei.wu@mailbox.org; a=ed25519; pk=qZs6i2UZnXkmjUrwO5HJxcfpCvgSNrR4dcU5cjtfTSk= X-MBO-RS-META: 1edu9cugtjhi4dqfs4p77qwrqgmidauy X-MBO-RS-ID: 5067cfa422e911d2738 Include the Thermal Sensor node in the SpacemiT K1 dtsi with definitions for registers, clocks, and interrupts. Additionally, configure thermal zones for the soc, package, gpu, and clusters to enable temperature monitoring via the thermal framework. Tested-by: Vincent Legoll # OrangePi-RV2 Tested-by: Gong Shuai Signed-off-by: Shuwei Wu Reviewed-by: Yixun Lan --- Changes in v2: - Update compatible to "spacemit,k1-tsensor" --- arch/riscv/boot/dts/spacemit/k1.dtsi | 101 +++++++++++++++++++++++++++++++= ++++ 1 file changed, 101 insertions(+) diff --git a/arch/riscv/boot/dts/spacemit/k1.dtsi b/arch/riscv/boot/dts/spa= cemit/k1.dtsi index 529ec68e9c23..e9952204224e 100644 --- a/arch/riscv/boot/dts/spacemit/k1.dtsi +++ b/arch/riscv/boot/dts/spacemit/k1.dtsi @@ -339,6 +339,96 @@ osc_32k: clock-32k { }; }; =20 + thermal-zones { + soc-thermal { + polling-delay-passive =3D <0>; + polling-delay =3D <0>; + thermal-sensors =3D <&thermal 0>; + + trips { + soc-crit { + temperature =3D <115000>; + hysteresis =3D <0>; + type =3D "critical"; + }; + }; + }; + + package-thermal { + polling-delay-passive =3D <0>; + polling-delay =3D <0>; + thermal-sensors =3D <&thermal 1>; + + trips { + package-crit { + temperature =3D <115000>; + hysteresis =3D <0>; + type =3D "critical"; + }; + }; + }; + + gpu-thermal { + polling-delay-passive =3D <100>; + polling-delay =3D <0>; + thermal-sensors =3D <&thermal 2>; + + trips { + gpu-alert { + temperature =3D <85000>; + hysteresis =3D <2000>; + type =3D "passive"; + }; + + gpu-crit { + temperature =3D <115000>; + hysteresis =3D <0>; + type =3D "critical"; + }; + }; + }; + + cluster0-thermal { + polling-delay-passive =3D <100>; + polling-delay =3D <0>; + thermal-sensors =3D <&thermal 3>; + + trips { + cluster0-alert { + temperature =3D <85000>; + hysteresis =3D <2000>; + type =3D "passive"; + }; + + cluster0-crit { + temperature =3D <115000>; + hysteresis =3D <0>; + type =3D "critical"; + }; + }; + }; + + cluster1-thermal { + polling-delay-passive =3D <100>; + polling-delay =3D <0>; + thermal-sensors =3D <&thermal 4>; + + trips { + cluster1-alert { + temperature =3D <85000>; + hysteresis =3D <2000>; + type =3D "passive"; + }; + + cluster1-crit { + temperature =3D <115000>; + hysteresis =3D <0>; + type =3D "critical"; + }; + }; + }; + }; + soc { compatible =3D "simple-bus"; interrupt-parent =3D <&plic>; @@ -494,6 +584,17 @@ syscon_apbc: system-controller@d4015000 { #reset-cells =3D <1>; }; =20 + thermal: thermal@d4018000 { + compatible =3D "spacemit,k1-tsensor"; + reg =3D <0x0 0xd4018000 0x0 0x100>; + clocks =3D <&syscon_apbc CLK_TSEN>, + <&syscon_apbc CLK_TSEN_BUS>; + clock-names =3D "core", "bus"; + interrupts =3D <61>; + resets =3D <&syscon_apbc RESET_TSEN>; + #thermal-sensor-cells =3D <1>; + }; + i2c6: i2c@d4018800 { compatible =3D "spacemit,k1-i2c"; reg =3D <0x0 0xd4018800 0x0 0x38>; --=20 2.53.0