From nobody Sat Oct 24 20:22:46 2026 Received: from mail-244106.protonmail.ch (mail-244106.protonmail.ch [109.224.244.106]) (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 DA07D34EF0C; Sun, 11 Oct 2026 17:30:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=109.224.244.106 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791739803; cv=none; b=Hn23Z6p8Tnl6dK6dlOCIAbf9BsKcwrmet+oExsm0jjkcyrkK+iWLzw6Z7Ns+HFH4HHjzgDBJegfGo1/0o/fRBkJpuJ0qp5dES0wZUpj541Ej03utH53glelFVoVx5aGSPvWNSGMMUz3lfJCILEF5WX0iMvylv7zXjUe15ZCybZ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791739803; c=relaxed/simple; bh=ip6YK30AyGnoVEqkQGkufJxt3BIpnmO9Rlu8xdx1PAs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hIbU9RHoQ5pd5KbeS9W9A3PLe/5FmZWYgGKWERK8uDCz1OK+K78N4SL8MZQO017GjdFGttBMDDhD3X92xV+fZJIOfszTzLXb4IJvjwGwzwGM64QP1hFPL50xJ6TBNxb2cali4Vmp7ouNbtnKalofqHDodpbn4++nvtq4ZYdt4nI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vinarskis.com; spf=pass smtp.mailfrom=vinarskis.com; dkim=pass (2048-bit key) header.d=vinarskis.com header.i=@vinarskis.com header.b=tdLQDQEB; arc=none smtp.client-ip=109.224.244.106 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vinarskis.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=vinarskis.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=vinarskis.com header.i=@vinarskis.com header.b="tdLQDQEB" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vinarskis.com; s=protonmail3; t=1791739798; x=1791998998; bh=9cUtiNpw0w3qfgB1GP1HhsDq2TLFEBW2lfjHlYEyc0g=; h=From:Date:Subject:Message-Id:References:In-Reply-To:To:Cc:From:To: Cc:Date:Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=tdLQDQEBDY3kCQKIMEJJpbyiX3UiX0d6HvmpCgMz2P4tsokTs/mXqIUWYHQOKEmE6 /ECDZOF1Q5UeQ9R1oFp8zVnv9HbkBLiBe05O984Wc+AnartfxqTrz8Xbfnl2uPTJtI 6Et5LwN3UVb9KhHKAnY1RWlWfE7yn5jakW4wZWJsEa7ew+Z8ydVP2KPsqi7OvtRiU5 OTYLSvw3qFRUZITa8gP51e1WOV1N6odHRNwpjdGbAr1M4u5R01fQRzYRzF7t3gH9SE RbZiKLSfq9YHayJ33XJPUVSjHVzmSpkNcHl8a2kN/kHOQ9CHhooZcLXNQu35QSib/z ucwr2Qkx9uGVA== X-Pm-Submission-Id: 4j2nfV0PR8z1DF4p From: Aleksandrs Vinarskis Date: Sun, 11 Oct 2026 19:29:28 +0200 Subject: [PATCH v5 1/3] dt-bindings: platform: introduce EC for Dell XPS 13 9345 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: <20261011-dell-xps-9345-ec-v5-1-2ab1258b84c1@vinarskis.com> References: <20261011-dell-xps-9345-ec-v5-0-2ab1258b84c1@vinarskis.com> In-Reply-To: <20261011-dell-xps-9345-ec-v5-0-2ab1258b84c1@vinarskis.com> To: Bjorn Andersson , Konrad Dybcio , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Bryan O'Donoghue , Kees Cook , "Gustavo A. R. Silva" , Abel Vesa Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org, Abel Vesa , Tobias Heider , Val Packett , Neil Armstrong , Stephan Gerhold , linux-hardening@vger.kernel.org, Krzysztof Kozlowski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4564; i=alex@vinarskis.com; h=from:subject:message-id; bh=ip6YK30AyGnoVEqkQGkufJxt3BIpnmO9Rlu8xdx1PAs=; b=owGbwMvMwCX2dl3hIv4AZgHG02pJDFmnj/d+zNx8s6fi8K5+jVXa6jLT0yWEzcwjcrrfeOoV/ DRi2PWmo5SFQYyLQVZMkaX7z9e0rkVz1zJc1/gGM4eVCWQIAxenAExkoj4jw/8FHztbTu1ylBc6 Ve/7UnAqn2qIUr/6jvsrSpk/Po6KW8DIcGayTbjgiSdpu6I3pe/ozwgz9hUvF6y1TEo6W8P3OD+ YCwA= X-Developer-Key: i=alex@vinarskis.com; a=openpgp; fpr=8E21FAE2D2967BB123303E8C684FD4BA28133815 Add bindings for Embedded Controller (EC) in Dell XPS 13 9345 (platform codename 'tributo'). It may be partially or fully compatible with EC found in Snapdragon-based Dell Latitude, Inspiron ('thena'). Reviewed-by: Krzysztof Kozlowski Signed-off-by: Aleksandrs Vinarskis --- .../embedded-controller/dell,xps13-9345-ec.yaml | 91 ++++++++++++++++++= ++++ MAINTAINERS | 5 ++ 2 files changed, 96 insertions(+) diff --git a/Documentation/devicetree/bindings/embedded-controller/dell,xps= 13-9345-ec.yaml b/Documentation/devicetree/bindings/embedded-controller/del= l,xps13-9345-ec.yaml new file mode 100644 index 000000000000..3485117b505c --- /dev/null +++ b/Documentation/devicetree/bindings/embedded-controller/dell,xps13-9345= -ec.yaml @@ -0,0 +1,91 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/embedded-controller/dell,xps13-9345-ec.= yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Dell XPS 13 9345 Embedded Controller + +maintainers: + - Aleksandrs Vinarskis + +description: + The Dell XPS 13 9345 has an Embedded Controller (EC) which handles therm= al + and power management. It is communicating with SoC over multiple i2c bus= ses. + Among other things, it handles fan speed control, thermal shutdown, peri= pheral + power supply including trackpad, touch-row, display. For these functions= , it + requires frequently updated thermal readings from onboard thermistors. + +properties: + compatible: + const: dell,xps13-9345-ec + + reg: + const: 0x3b + + interrupts: + maxItems: 1 + + io-channels: + description: + ADC channels connected to the 7 onboard thermistors on PMK8550. + EC requires frequent thermal readings of these channels to perform + automated fan speed control. + items: + - description: ADC channel for sys_therm0 + - description: ADC channel for sys_therm1 + - description: ADC channel for sys_therm2 + - description: ADC channel for sys_therm3 + - description: ADC channel for sys_therm4 + - description: ADC channel for sys_therm5 + - description: ADC channel for sys_therm6 + + io-channel-names: + items: + - const: sys_therm0 + - const: sys_therm1 + - const: sys_therm2 + - const: sys_therm3 + - const: sys_therm4 + - const: sys_therm5 + - const: sys_therm6 + +required: + - compatible + - reg + - interrupts + - io-channels + - io-channel-names + +additionalProperties: false + +examples: + - | + #include + #include + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + embedded-controller@3b { + compatible =3D "dell,xps13-9345-ec"; + reg =3D <0x3b>; + interrupts-extended =3D <&tlmm 66 IRQ_TYPE_LEVEL_LOW>; + + io-channels =3D <&pmk8550_vadc ADC5_GEN3_AMUX3_GPIO_100K_PU(1)= >, + <&pmk8550_vadc ADC5_GEN3_AMUX4_GPIO_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX1_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX2_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX3_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX4_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX5_THM_100K_PU(1)>; + io-channel-names =3D "sys_therm0", + "sys_therm1", + "sys_therm2", + "sys_therm3", + "sys_therm4", + "sys_therm5", + "sys_therm6"; + }; + }; +... diff --git a/MAINTAINERS b/MAINTAINERS index 252b6d7ee163..1aa035cc1c5b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7465,6 +7465,11 @@ S: Maintained F: Documentation/ABI/testing/sysfs-class-firmware-attributes F: drivers/platform/x86/dell/dell-wmi-sysman/ =20 +DELL XPS EMBEDDED CONTROLLER DRIVER +M: Aleksandrs Vinarskis +S: Maintained +F: Documentation/devicetree/bindings/embedded-controller/dell,xps13-9345-e= c.yaml + DELTA AHE-50DC FAN CONTROL MODULE DRIVER M: Zev Weiss L: linux-hwmon@vger.kernel.org --=20 2.54.0 From nobody Sat Oct 24 20:22:46 2026 Received: from mail-08.mail-europe.com (mail-08.mail-europe.com [57.129.93.249]) (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 AC312371D15; Sun, 11 Oct 2026 17:30:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=57.129.93.249 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791739820; cv=none; b=QLaOHL1Sue2m3g3gJXU5LV1EzAR5yq/1JKtNRXto6q7vALwZS4Ef/yen94p17WM/WAGuxMLQVedxpIeXo2jI8mCmvSCfloLLkUWR2F1tvFm8QAprfR+tuhn0XsJT1RVlB74TLt+p2KU5mgBkYoVYnnnPGb9iyT3u8Djg3YEPNGc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791739820; c=relaxed/simple; bh=nSUs4PQP3nCpiJAn8izbwW9MLM8SHOQMVXGYuWtKfV4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eEU++cwFhtMh4nms5/7ht3fcVDnXpoBqXvFVfrwrvgGpgMDKjtRtom0t8vJp1Ihb7V0kAqjVuDHEpHZb6GqSyVz7EfgTont0pgMIxdKy82ES1hVnIzaFGgC8K0j2l3YLrMnJ0ATdI0OEC20UNtRXFRz/ciLJzm1vPVXt9FEsyQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vinarskis.com; spf=pass smtp.mailfrom=vinarskis.com; dkim=pass (2048-bit key) header.d=vinarskis.com header.i=@vinarskis.com header.b=uegZ4O7l; arc=none smtp.client-ip=57.129.93.249 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vinarskis.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=vinarskis.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=vinarskis.com header.i=@vinarskis.com header.b="uegZ4O7l" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vinarskis.com; s=protonmail3; t=1791739800; x=1791999000; bh=hUNoKAFRBWh5arHROPkFP+zL+l8s+p22iEhT2EbzFGk=; h=From:Date:Subject:Message-Id:References:In-Reply-To:To:Cc:From:To: Cc:Date:Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=uegZ4O7lElXf7XPqEPyOGwk4O/IHyvnaget0LC085I00TYdRFmF4lvBa/mABZYSdz Af7YsJhjJvSGy9umVrEsjEw5ALehPFuwgGPWsy4CRWwCspu0R63Go5xn+TMvGJiUwk zDBJ+7u3jOKtvHi+RtGkBkfcF1MMA2R/IrhrlcGXMd3PdeSQIo5b+tr/axp0rpuQV3 dorsfwfPwf9SCf/qAH3X3+9cxLAD+2UVGC1HIc1DgXwPMmXZHjMxRQBL05ZMyuKXhq VA/aQSF/NgSn6YURjRbFY7bc3rUdSiLcmxoz58iO5Y8o/PRDg1X8X8JDkznghBSFcu dvZ6Jes5uvEsg== X-Pm-Submission-Id: 4j2nfX4H3qz1DF4w From: Aleksandrs Vinarskis Date: Sun, 11 Oct 2026 19:29:29 +0200 Subject: [PATCH v5 2/3] platform: arm64: dell-xps-ec: new driver 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: <20261011-dell-xps-9345-ec-v5-2-2ab1258b84c1@vinarskis.com> References: <20261011-dell-xps-9345-ec-v5-0-2ab1258b84c1@vinarskis.com> In-Reply-To: <20261011-dell-xps-9345-ec-v5-0-2ab1258b84c1@vinarskis.com> To: Bjorn Andersson , Konrad Dybcio , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Bryan O'Donoghue , Kees Cook , "Gustavo A. R. Silva" , Abel Vesa Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org, Abel Vesa , Tobias Heider , Val Packett , Neil Armstrong , Stephan Gerhold , linux-hardening@vger.kernel.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=12381; i=alex@vinarskis.com; h=from:subject:message-id; bh=nSUs4PQP3nCpiJAn8izbwW9MLM8SHOQMVXGYuWtKfV4=; b=owGbwMvMwCX2dl3hIv4AZgHG02pJDFmnj/dGyV1/mKAsJTRfojeYecbP/Y+3CK558OPVNs11I ZniYgvlO0pZGMS4GGTFFFm6/3xN61o0dy3DdY1vMHNYmUCGMHBxCsBE5kUwMjQyz+Ip+CDn+WPd bcdN1Y/O2idJugtxTBBNaDN6sub3vZuMDGflCuwkFU5kv9rAePvoEZ7GrfWStlqfih9KiKw4+dD uLQsA X-Developer-Key: i=alex@vinarskis.com; a=openpgp; fpr=8E21FAE2D2967BB123303E8C684FD4BA28133815 Introduce EC driver for Dell XPS 13 9345 (codename 'tributo') which may partially of fully compatible with Snapdragon-based Dell Latitude, Inspiron ('thena'). Primary function of this driver is unblock EC's thermal management, specifically to provide it with necessary information to control device fans, peripherals power. The driver was developed primarily by analyzing ACPI DSDT's _DSM and i2c dumps of communication between SoC and EC. Changes to Windows driver's behavior include increasing temperature feed loop from ~50ms to 100ms here. While Xps's EC is rather complex and controls practically all device peripherals including touch row's brightness and special keys such as mic mute, these do not go over this particular i2c interface. Not yet implemented features: - On lid-close IRQ event is registered. Windows performs what to appears to be thermistor constants readout, though its not obvious what it used for. - According to ACPI's _DSM there is a method to readout fans' RPM. - Initial thermistor constants were sniffed from Windows, these can be likely fine tuned for better cooling performance. - There is additional temperature reading that Windows sents to EC but more rare than others, likely SoC T_j / TZ98 or TZ4. This is the only thermal zone who's reading can exceed 115C without triggering thermal shutdown. - Given similarities between 'tributo' and 'thena' platforms, including EC i2c address, driver can be potentially extended to support both. Signed-off-by: Aleksandrs Vinarskis --- MAINTAINERS | 1 + drivers/platform/arm64/Kconfig | 12 ++ drivers/platform/arm64/Makefile | 1 + drivers/platform/arm64/dell-xps-ec.c | 308 +++++++++++++++++++++++++++++++= ++++ 4 files changed, 322 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 1aa035cc1c5b..29149a1b6ec9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7469,6 +7469,7 @@ DELL XPS EMBEDDED CONTROLLER DRIVER M: Aleksandrs Vinarskis S: Maintained F: Documentation/devicetree/bindings/embedded-controller/dell,xps13-9345-e= c.yaml +F: drivers/platform/arm64/dell-xps-ec.c =20 DELTA AHE-50DC FAN CONTROL MODULE DRIVER M: Zev Weiss diff --git a/drivers/platform/arm64/Kconfig b/drivers/platform/arm64/Kconfig index e32e01b2a9bd..29416f8d7232 100644 --- a/drivers/platform/arm64/Kconfig +++ b/drivers/platform/arm64/Kconfig @@ -33,6 +33,18 @@ config EC_ACER_ASPIRE1 laptop where this information is not properly exposed via the standard ACPI devices. =20 +config EC_DELL_XPS + tristate "Dell XPS 9345 Embedded Controller driver" + depends on ARCH_QCOM || COMPILE_TEST + depends on I2C + depends on IIO + help + Driver for the Embedded Controller in the Qualcomm Snapdragon-based + Dell XPS 13 9345, which handles thermal management and fan speed + control. + + Say M or Y here to include this support. + config EC_HUAWEI_GAOKUN tristate "Huawei Matebook E Go Embedded Controller driver" depends on ARCH_QCOM || COMPILE_TEST diff --git a/drivers/platform/arm64/Makefile b/drivers/platform/arm64/Makef= ile index 7681be4a46e9..669dc9e79afb 100644 --- a/drivers/platform/arm64/Makefile +++ b/drivers/platform/arm64/Makefile @@ -6,6 +6,7 @@ # =20 obj-$(CONFIG_EC_ACER_ASPIRE1) +=3D acer-aspire1-ec.o +obj-$(CONFIG_EC_DELL_XPS) +=3D dell-xps-ec.o obj-$(CONFIG_EC_HUAWEI_GAOKUN) +=3D huawei-gaokun-ec.o obj-$(CONFIG_EC_LENOVO_YOGA_C630) +=3D lenovo-yoga-c630.o obj-$(CONFIG_EC_LENOVO_THINKPAD_T14S) +=3D lenovo-thinkpad-t14s.o diff --git a/drivers/platform/arm64/dell-xps-ec.c b/drivers/platform/arm64/= dell-xps-ec.c new file mode 100644 index 000000000000..cf2dd41b1aa6 --- /dev/null +++ b/drivers/platform/arm64/dell-xps-ec.c @@ -0,0 +1,308 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2026, Aleksandrs Vinarskis + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DELL_XPS_EC_SUSPEND_CMD 0xb9 +#define DELL_XPS_EC_SUSPEND_MSG_LEN 64 + +#define DELL_XPS_EC_TEMP_CMD0 0xfb +#define DELL_XPS_EC_TEMP_CMD1 0x20 +#define DELL_XPS_EC_TEMP_CMD3 0x02 +#define DELL_XPS_EC_TEMP_MSG_LEN 6 +#define DELL_XPS_EC_TEMP_POLL_JIFFIES msecs_to_jiffies(100) + +/* + * Mapping between IIO channel name (as per schematics) and EC command byt= e. + */ +struct dell_xps_ec_therm { + const char *name; + u8 cmd; +}; + +struct dell_xps_ec_data { + const struct dell_xps_ec_therm *therms; + unsigned int num_therms; + const u8 *profile; + size_t profile_len; +}; + +/* + * Format: + * - header/unknown (2 bytes) + * - per-thermistor entries (3 bytes): thermistor_id, param1, param2 + */ +static const u8 dell_xps13_9345_thermistor_profile[] =3D { + 0xff, 0x54, + 0x01, 0x00, 0x2b, /* sys_therm0 */ + 0x02, 0x44, 0x2a, /* sys_therm1 */ + 0x03, 0x44, 0x2b, /* sys_therm2 */ + 0x04, 0x44, 0x28, /* sys_therm3 */ + 0x05, 0x55, 0x2a, /* sys_therm4 */ + 0x06, 0x44, 0x26, /* sys_therm5 */ + 0x07, 0x44, 0x2b, /* sys_therm6 */ +}; + +static const struct dell_xps_ec_therm dell_xps13_9345_therms[] =3D { + /* TODO: 0x01 is sent only occasionally, likely TZ98 or TZ4. */ + { "sys_therm0", 0x02 }, + { "sys_therm1", 0x03 }, + { "sys_therm2", 0x04 }, + { "sys_therm3", 0x05 }, + { "sys_therm4", 0x06 }, + { "sys_therm5", 0x07 }, + { "sys_therm6", 0x08 }, +}; + +static const struct dell_xps_ec_data dell_xps13_9345_data =3D { + .therms =3D dell_xps13_9345_therms, + .num_therms =3D ARRAY_SIZE(dell_xps13_9345_therms), + .profile =3D dell_xps13_9345_thermistor_profile, + .profile_len =3D sizeof(dell_xps13_9345_thermistor_profile), +}; + +struct dell_xps_ec { + struct device *dev; + struct i2c_client *client; + const struct dell_xps_ec_data *data; + struct delayed_work temp_work; + unsigned int num_therms; + struct iio_channel *therm_channels[] __counted_by(num_therms); +}; + +static int dell_xps_ec_suspend_cmd(struct dell_xps_ec *ec, bool suspend) +{ + u8 buf[DELL_XPS_EC_SUSPEND_MSG_LEN] =3D {}; + int ret; + + buf[0] =3D DELL_XPS_EC_SUSPEND_CMD; + buf[1] =3D suspend ? 0x01 : 0x00; + /* bytes 2..63 remain zero */ + + ret =3D i2c_master_send(ec->client, buf, sizeof(buf)); + if (ret < 0) + return ret; + + return 0; +} + +static int dell_xps_ec_send_temp(struct dell_xps_ec *ec, u8 cmd_byte, + int milli_celsius) +{ + u8 buf[DELL_XPS_EC_TEMP_MSG_LEN]; + u16 deci_celsius; + int ret; + + deci_celsius =3D milli_celsius / MILLIDEGREE_PER_DECIDEGREE; + + buf[0] =3D DELL_XPS_EC_TEMP_CMD0; + buf[1] =3D DELL_XPS_EC_TEMP_CMD1; + buf[2] =3D cmd_byte; + buf[3] =3D DELL_XPS_EC_TEMP_CMD3; + put_unaligned_le16(deci_celsius, &buf[4]); + + ret =3D i2c_master_send(ec->client, buf, sizeof(buf)); + if (ret < 0) + return ret; + + return 0; +} + +static void dell_xps_ec_temp_work_fn(struct work_struct *work) +{ + struct dell_xps_ec *ec =3D container_of(work, struct dell_xps_ec, + temp_work.work); + const struct dell_xps_ec_therm *therms =3D ec->data->therms; + int val, ret; + unsigned int i; + + for (i =3D 0; i < ec->num_therms; i++) { + if (!ec->therm_channels[i]) + continue; + + ret =3D iio_read_channel_processed(ec->therm_channels[i], &val); + if (ret < 0) { + dev_err_ratelimited(ec->dev, + "Failed to read thermistor %s: %d\n", + therms[i].name, ret); + continue; + } + + ret =3D dell_xps_ec_send_temp(ec, therms[i].cmd, val); + if (ret < 0) { + dev_err_ratelimited(ec->dev, + "Failed to send temp for %s: %d\n", + therms[i].name, ret); + } + } + + schedule_delayed_work(&ec->temp_work, DELL_XPS_EC_TEMP_POLL_JIFFIES); +} + +static irqreturn_t dell_xps_ec_irq_handler(int irq, void *data) +{ + struct dell_xps_ec *ec =3D data; + + /* + * TODO: IRQ is fired on lid-close. Follow Windows example to read out + * the thermistor thresholds and potentially fan speeds. + */ + dev_dbg(ec->dev, "IRQ triggered (irq=3D%d)\n", irq); + + return IRQ_HANDLED; +} + +static int dell_xps_ec_probe(struct i2c_client *client) +{ + const struct dell_xps_ec_data *data; + struct device *dev =3D &client->dev; + struct dell_xps_ec *ec; + unsigned int i; + int ret; + + data =3D i2c_get_match_data(client); + if (!data) + return dev_err_probe(dev, -ENODEV, "No match data\n"); + + ec =3D devm_kzalloc(dev, struct_size(ec, therm_channels, data->num_therms= ), + GFP_KERNEL); + if (!ec) + return -ENOMEM; + + ec->dev =3D dev; + ec->client =3D client; + ec->data =3D data; + ec->num_therms =3D data->num_therms; + i2c_set_clientdata(client, ec); + + /* Set default thermistor profile */ + ret =3D i2c_master_send(client, data->profile, data->profile_len); + if (ret < 0) + return dev_err_probe(dev, ret, "Failed to set thermistor profile\n"); + + /* Get IIO channels for thermistors */ + for (i =3D 0; i < ec->num_therms; i++) { + ec->therm_channels[i] =3D + devm_iio_channel_get(dev, data->therms[i].name); + if (IS_ERR(ec->therm_channels[i])) { + ret =3D PTR_ERR(ec->therm_channels[i]); + ec->therm_channels[i] =3D NULL; + if (ret =3D=3D -EPROBE_DEFER) + return ret; + dev_warn(dev, "Thermistor %s not available: %d\n", + data->therms[i].name, ret); + } + } + + /* Start periodic temperature reporting */ + ret =3D devm_delayed_work_autocancel(dev, &ec->temp_work, + dell_xps_ec_temp_work_fn); + if (ret) + return ret; + schedule_delayed_work(&ec->temp_work, DELL_XPS_EC_TEMP_POLL_JIFFIES); + dev_dbg(dev, "Started periodic temperature reporting to EC every %d ms\n", + jiffies_to_msecs(DELL_XPS_EC_TEMP_POLL_JIFFIES)); + + /* Request IRQ for EC events */ + ret =3D devm_request_threaded_irq(dev, client->irq, NULL, + dell_xps_ec_irq_handler, + IRQF_ONESHOT, dev_name(dev), ec); + if (ret) + return dev_err_probe(dev, ret, "Failed to request IRQ\n"); + + return 0; +} + +/* + * Notify EC of suspend + * + * This will: + * - Cut power to display/trackpad/keyboard/touchrow, wake-up source still= works. + */ +static int dell_xps_ec_suspend(struct device *dev) +{ + struct dell_xps_ec *ec =3D dev_get_drvdata(dev); + + int ret; + + cancel_delayed_work_sync(&ec->temp_work); + + ret =3D dell_xps_ec_suspend_cmd(ec, true); + if (ret) { + schedule_delayed_work(&ec->temp_work, + DELL_XPS_EC_TEMP_POLL_JIFFIES); + return ret; + } + + return 0; +} + +/* + * Notify EC of resume + * + * This will undo the suspend actions. Without the resume signal, device w= ould + * wake up but be forced back into suspend by EC within seconds. + */ +static int dell_xps_ec_resume(struct device *dev) +{ + struct dell_xps_ec *ec =3D dev_get_drvdata(dev); + int ret; + + ret =3D dell_xps_ec_suspend_cmd(ec, false); + if (ret) + return ret; + + schedule_delayed_work(&ec->temp_work, DELL_XPS_EC_TEMP_POLL_JIFFIES); + + return 0; +} + +static const struct of_device_id dell_xps_ec_of_match[] =3D { + { .compatible =3D "dell,xps13-9345-ec", .data =3D &dell_xps13_9345_data }, + {} +}; +MODULE_DEVICE_TABLE(of, dell_xps_ec_of_match); + +static const struct i2c_device_id dell_xps_ec_i2c_id[] =3D { + { "dell-xps-ec", (kernel_ulong_t)&dell_xps13_9345_data }, + {} +}; +MODULE_DEVICE_TABLE(i2c, dell_xps_ec_i2c_id); + +static const struct dev_pm_ops dell_xps_ec_pm_ops =3D { + SYSTEM_SLEEP_PM_OPS(dell_xps_ec_suspend, dell_xps_ec_resume) +}; + +static struct i2c_driver dell_xps_ec_driver =3D { + .driver =3D { + .name =3D "dell-xps-ec", + .of_match_table =3D dell_xps_ec_of_match, + .pm =3D &dell_xps_ec_pm_ops, + }, + .probe =3D dell_xps_ec_probe, + .id_table =3D dell_xps_ec_i2c_id, +}; +module_i2c_driver(dell_xps_ec_driver); + +MODULE_AUTHOR("Aleksandrs Vinarskis "); +MODULE_DESCRIPTION("Dell XPS 13 9345 Embedded Controller"); +MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS("IIO_CONSUMER"); --=20 2.54.0 From nobody Sat Oct 24 20:22:46 2026 Received: from mail-244108.protonmail.ch (mail-244108.protonmail.ch [109.224.244.108]) (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 6D6AD368D41; Sun, 11 Oct 2026 17:30:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=109.224.244.108 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791739809; cv=none; b=KGN7SqjeybAkrjoBKwaOcRdnHat3rxjRyw/lrWEzrSPjhwsvLwiLTA2mgpCGGJ/rAftmTypc2ZuyoPSLzG/N6tkx+Bvg8AEW0ponFaJkliiL2j7I6OmTfHNlX95oT2R8fxUwQuR1dWRcFwER+UehZR/n2sMRvSYLwJ7lWfzxJ/0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1791739809; c=relaxed/simple; bh=fBkCJHjuCaikQxTDY/gYrM1WpcgBFmsruQ542x7hqeA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J4+cvcewkaMsO4Max2EKFWvEZR2dMtb1tyUW9OmLxuycY3S7UCezX+V4byurWIx4E2h8TJAOwuRgJ/hbKD48I4ufObFieS9pY+nQSrBE08awhudmT7n3ELpKqWEZ6TYTO+v1wEKaeBKezRU3SM5AnaDPQ1pmlm5Un90X7CVhAqk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vinarskis.com; spf=pass smtp.mailfrom=vinarskis.com; dkim=pass (2048-bit key) header.d=vinarskis.com header.i=@vinarskis.com header.b=EQGaq6Sj; arc=none smtp.client-ip=109.224.244.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=vinarskis.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=vinarskis.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=vinarskis.com header.i=@vinarskis.com header.b="EQGaq6Sj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vinarskis.com; s=protonmail3; t=1791739801; x=1791999001; bh=lR9lb9DSxQO3KqEfxw+Y1Y+hJ57hQIgBjo6heGSxEzU=; h=From:Date:Subject:Message-Id:References:In-Reply-To:To:Cc:From:To: Cc:Date:Subject:Reply-To:Feedback-ID:Message-ID:BIMI-Selector; b=EQGaq6Sj1nnB6TqMEDccQrEaKLRU2UBbvGGPUbpQH2y3gzng87/vqkJ1UVwcEJis9 5Dy7306o6+wZbQ1AP2cr6HEEHLxow13AEX0GC0a7G1HfyXocJVd97VtAMfrYS+8dyp eWK4LOaIhhEbbEPFqIlOvNkw0JdyrsxK6m0rchS6MMIt/3/jQjAlDw0k7DXN4MH/QE jyMy2Bq0sF3Cejv8FaSRcjhs88CRBXgzCAwsjLuW4M4LavzR2wikXPb+46uoUmgDpv ridMVInXiXimKMjXMrSnMn6nyUGpy6u2kouQ0p7EeQjrww3AHZKTLhe6ABAFvDFd8L i/aC1FhC++3/g== X-Pm-Submission-Id: 4j2nfb1308z1DF4p From: Aleksandrs Vinarskis Date: Sun, 11 Oct 2026 19:29:30 +0200 Subject: [PATCH v5 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC 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: <20261011-dell-xps-9345-ec-v5-3-2ab1258b84c1@vinarskis.com> References: <20261011-dell-xps-9345-ec-v5-0-2ab1258b84c1@vinarskis.com> In-Reply-To: <20261011-dell-xps-9345-ec-v5-0-2ab1258b84c1@vinarskis.com> To: Bjorn Andersson , Konrad Dybcio , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Bryan O'Donoghue , Kees Cook , "Gustavo A. R. Silva" , Abel Vesa Cc: linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org, Abel Vesa , Tobias Heider , Val Packett , Neil Armstrong , Stephan Gerhold , linux-hardening@vger.kernel.org, Dmitry Baryshkov , Konrad Dybcio X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3728; i=alex@vinarskis.com; h=from:subject:message-id; bh=fBkCJHjuCaikQxTDY/gYrM1WpcgBFmsruQ542x7hqeA=; b=owGbwMvMwCX2dl3hIv4AZgHG02pJDFmnj/cFi167azhL8dL99TIyV+YwczjOejT//f+FwvufT VltIBGyuqOUhUGMi0FWTJGl+8/XtK5Fc9cyXNf4BjOHlQlkCAMXpwBMZN4hhv/V74pV+kN2TT6y puuM8s6lv0ym9dVe6zm55u2rSPvZnUoZDP9D7SNynvO5pB/YxuqzUP3sLHUGdbZ93vandTn0rlZ PC2IEAA== X-Developer-Key: i=alex@vinarskis.com; a=openpgp; fpr=8E21FAE2D2967BB123303E8C684FD4BA28133815 Describe embedded controller, its interrupt and required thermal zones. Add EC's reset GPIO to reserved range, as triggering it during device operation leads to unrecoverable and unusable state. Reviewed-by: Dmitry Baryshkov Reviewed-by: Konrad Dybcio Signed-off-by: Aleksandrs Vinarskis --- .../boot/dts/qcom/x1e80100-dell-xps13-9345.dts | 86 ++++++++++++++++++= +++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts b/arch/a= rm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts index f48e6bc35006..6d99dc47eb16 100644 --- a/arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts +++ b/arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts @@ -759,8 +759,32 @@ retimer_ss0_con_sbu_out: endpoint { =20 &i2c5 { clock-frequency =3D <100000>; - status =3D "disabled"; - /* EC @0x3b */ + status =3D "okay"; + + embedded-controller@3b { + compatible =3D "dell,xps13-9345-ec"; + reg =3D <0x3b>; + + interrupts-extended =3D <&tlmm 66 IRQ_TYPE_LEVEL_LOW>; + + pinctrl-0 =3D <&ec_int_n_default>; + pinctrl-names =3D "default"; + + io-channels =3D <&pmk8550_vadc ADC5_GEN3_AMUX3_GPIO_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX4_GPIO_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX1_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX2_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX3_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX4_THM_100K_PU(1)>, + <&pmk8550_vadc ADC5_GEN3_AMUX5_THM_100K_PU(1)>; + io-channel-names =3D "sys_therm0", + "sys_therm1", + "sys_therm2", + "sys_therm3", + "sys_therm4", + "sys_therm5", + "sys_therm6"; + }; }; =20 &i2c7 { @@ -1025,6 +1049,57 @@ rtmr0_1p8_reg_en: rtmr0-1p8-reg-en-state { }; }; =20 +&pmk8550_vadc { + sys_therm0: channel@14c { + reg =3D ; + qcom,hw-settle-time =3D <200>; + qcom,ratiometric; + label =3D "lpddr5_therm"; + }; + + sys_therm1: channel@14d { + reg =3D ; + qcom,hw-settle-time =3D <200>; + qcom,ratiometric; + label =3D "usb_charger_left_therm"; + }; + + sys_therm2: channel@144 { + reg =3D ; + qcom,hw-settle-time =3D <200>; + qcom,ratiometric; + label =3D "vph_pwr_therm"; + }; + + sys_therm3: channel@145 { + reg =3D ; + qcom,hw-settle-time =3D <200>; + qcom,ratiometric; + label =3D "usb_charger_right_therm"; + }; + + sys_therm4: channel@146 { + reg =3D ; + qcom,hw-settle-time =3D <200>; + qcom,ratiometric; + label =3D "ssd_conn_therm"; + }; + + sys_therm5: channel@147 { + reg =3D ; + qcom,hw-settle-time =3D <200>; + qcom,ratiometric; + label =3D "sys_therm5"; + }; + + sys_therm6: channel@148 { + reg =3D ; + qcom,hw-settle-time =3D <200>; + qcom,ratiometric; + label =3D "keyboard_therm"; + }; +}; + &qupv3_0 { status =3D "okay"; }; @@ -1092,6 +1167,7 @@ &tcsr { =20 &tlmm { gpio-reserved-ranges =3D <44 4>, /* SPI11 (TPM) */ + <65 1>, /* EC Reset, accessible but yields system unusable */ <76 4>, /* SPI19 (TZ Protected) */ <65 1>, /* EC reset */ <238 1>; /* UFS Reset */ @@ -1103,6 +1179,12 @@ cam_indicator_en: cam-indicator-en-state { bias-disable; }; =20 + ec_int_n_default: ec-int-n-state { + pins =3D "gpio66"; + function =3D "gpio"; + bias-disable; + }; + edp_bl_en: edp-bl-en-state { pins =3D "gpio74"; function =3D "gpio"; --=20 2.54.0