* [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345
@ 2026-10-11 17:50 Aleksandrs Vinarskis
2026-10-11 17:50 ` [PATCH v6 1/3] dt-bindings: platform: introduce EC for " Aleksandrs Vinarskis
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Aleksandrs Vinarskis @ 2026-10-11 17:50 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A. R. Silva, Abel Vesa
Cc: Liviu Nicoara, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Abel Vesa, Tobias Heider, Val Packett,
Neil Armstrong, Stephan Gerhold, linux-hardening,
Krzysztof Kozlowski, Dmitry Baryshkov, Konrad Dybcio
This series adds Embedded Controller (EC) driver for Dell XPS 13 9345.
While EC appears to control most of device's peripherals, particular
driver addresses power and thermal managment issues. Key operational
principle involves initial thermistor constants configuration followed
by a periodic reporting of these onboard thermistor values from across
the motherboard to the EC. The latter then handles fan ramp-up/
ramp-down internally. Suspend/Resume must be likewise propagated to EC
for power management.
The driver was developed primarily by analyzing ACPI DSDT's _DSM and
i2c dumps of communication between SoC and EC during various stages of
operation (bootup, suspend, resume).
With EC driver in place, the following issues are addressed:
1. Fans were not properly cooling the laptop, would kick in late and
spin lazily, resulting in heavy throttling. With EC driver fans
start sooner and hit high RPM under heavy load.
2. Fans were not stopping once SoC temperature dropped, they would keep
slowly spinning irrespective of suspend and/or closed lid until the
next powercycle. With EC driver shortly after SoC temperature drops,
thermistors temperature drops, and fans ramp-down.
3. Keyboard and touch row backlight were not turning off during
suspend - only lid close would power off the touch row. With EC
driver behavior matches that of Windows, suspending device with lid
open powers off the peripherals.
As thermistor readout depends on pmic's ADCs, this series introduces
EC driver and its schema, adds missing ADC to hamoa-pmics, and finally
adds thermistor and EC nodes to x1e80100-dell-xps13-9345.dts.
Additional findings:
- Max fan speed depends on Dell's power mode settings, configurable in
BIOS or using Windows app (relies on ACPI-WMI). It appears best
cooling performance is achieved under 'Ultra Performance' profile.
- When the said power mode is changed using Windows app, EC IRQ is
triggered. Windows performs what appears to be thermistor contants
readout, though its not obvious what it is used for.
- Given similarities between Dell XPS 13 series (codename 'tributo')
and Snapdragon-based Latitude, Inspiron ('thena'), including matching
EC address and response to suspend/resume command the EC driver can
be likely used for both, though in-depth testing on 'thena' is
required.
This series depends on QCOM SPMI PMIC5 Gen3 ADC [1], which was added to
`linux-next` for v7.1, but must be picked if this series to be backported.
[1] https://lore.kernel.org/all/20260209105438.596339-1-jishnu.prakash@oss.qualcomm.com/
Signed-off-by: Aleksandrs Vinarskis <alex@vinarskis.com>
---
Changes in v6:
- Fix dts mistake due to rebase
- Link to v5: https://lore.kernel.org/r/20261011-dell-xps-9345-ec-v5-0-2ab1258b84c1@vinarskis.com
Changes in v5:
- Rebase on latest linux-next
- Re-schedule work if suspend fails as per Ilpo
- Fix comments as per Ilpo
- Link to v4: https://lore.kernel.org/r/20260809-dell-xps-9345-ec-v4-0-88306dbbc7aa@vinarskis.com
Changes in v4:
- Change to .data struct provided via compatible, which contains expected
thermistor arrangement and magic init sequence to make it easier to
support new systems as per Bryan
- Change milicelsius spelling, add newline, return as per Bryan
- Link to v3: https://lore.kernel.org/r/20260801-dell-xps-9345-ec-v3-0-9f4bdb5a5dad@vinarskis.com
Changes in v3:
- Rebase on latest linux-next
- Add Neil, Stephan to CC, as they worked on ADC for PMK8550
- Drop VADC for pmk8550 as it was already merged upstream
- Rename PMK8550 registers to use newly upstreamed headers for ADC5_GEN3
in both dt-bindings, device-tree patches
- Rename ADC labels to have meaningful for user names as per Bryan
- Drop Dmitry's RB from last patch since it was almost completely changed
now
- Link to v2: https://lore.kernel.org/r/20260404-dell-xps-9345-ec-v2-0-c977c3caa81f@vinarskis.com
Changes in v2:
- Update cover letter to indicate dependency on QCOM ADC series, only
relevant for backporting
- Update description of dell_xps_ec_suspend: entering suspend does not
necessarily ramp down the fans, if thermistors still report high temps
- Add die_temp/xo_therm to pmk8550 as per Konrad Dybcio
- Add missing header imports as per Ilpo Järvinen
- Add explanation for EC reset pin being reserved
- Fix device-tree: minor issues as per Konrad Dybcio
- Fix device-tree: alingment issues as per Konrad Dybcio
- Fix driver: alingment issues as per Bjorn Andersson
- Fix driver: handle temp value as 16bit register as per Ilpo Järvinen
- Fix bindigs: description and example as per Krzysztof Kozlowski
- Link to v1: https://lore.kernel.org/r/20260401-dell-xps-9345-ec-v1-0-afa5cacd49be@vinarskis.com
---
Aleksandrs Vinarskis (3):
dt-bindings: platform: introduce EC for Dell XPS 13 9345
platform: arm64: dell-xps-ec: new driver
arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC
.../embedded-controller/dell,xps13-9345-ec.yaml | 91 ++++++
MAINTAINERS | 6 +
.../boot/dts/qcom/x1e80100-dell-xps13-9345.dts | 85 +++++-
drivers/platform/arm64/Kconfig | 12 +
drivers/platform/arm64/Makefile | 1 +
drivers/platform/arm64/dell-xps-ec.c | 308 +++++++++++++++++++++
6 files changed, 501 insertions(+), 2 deletions(-)
---
base-commit: c74ef2fbf60ff7e7b956c023a881e87502c1852a
change-id: 20260331-dell-xps-9345-ec-e5f49d1bef61
Best regards,
--
Aleksandrs Vinarskis <alex@vinarskis.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v6 1/3] dt-bindings: platform: introduce EC for Dell XPS 13 9345
2026-10-11 17:50 [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Aleksandrs Vinarskis
@ 2026-10-11 17:50 ` Aleksandrs Vinarskis
2026-10-15 3:07 ` Rob Herring
2026-10-11 17:50 ` [PATCH v6 2/3] platform: arm64: dell-xps-ec: new driver Aleksandrs Vinarskis
` (2 subsequent siblings)
3 siblings, 1 reply; 11+ messages in thread
From: Aleksandrs Vinarskis @ 2026-10-11 17:50 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A. R. Silva, Abel Vesa
Cc: Liviu Nicoara, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Abel Vesa, Tobias Heider, Val Packett,
Neil Armstrong, Stephan Gerhold, linux-hardening,
Krzysztof Kozlowski
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 <krzysztof.kozlowski@oss.qualcomm.com>
Signed-off-by: Aleksandrs Vinarskis <alex@vinarskis.com>
---
.../embedded-controller/dell,xps13-9345-ec.yaml | 91 ++++++++++++++++++++++
MAINTAINERS | 5 ++
2 files changed, 96 insertions(+)
diff --git a/Documentation/devicetree/bindings/embedded-controller/dell,xps13-9345-ec.yaml b/Documentation/devicetree/bindings/embedded-controller/dell,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 <alex@vinarskis.com>
+
+description:
+ The Dell XPS 13 9345 has an Embedded Controller (EC) which handles thermal
+ and power management. It is communicating with SoC over multiple i2c busses.
+ Among other things, it handles fan speed control, thermal shutdown, peripheral
+ 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 <dt-bindings/interrupt-controller/irq.h>
+ #include <arm64/qcom/qcom-adc5-gen3.h>
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ embedded-controller@3b {
+ compatible = "dell,xps13-9345-ec";
+ reg = <0x3b>;
+ interrupts-extended = <&tlmm 66 IRQ_TYPE_LEVEL_LOW>;
+
+ io-channels = <&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 = "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/
+DELL XPS EMBEDDED CONTROLLER DRIVER
+M: Aleksandrs Vinarskis <alex@vinarskis.com>
+S: Maintained
+F: Documentation/devicetree/bindings/embedded-controller/dell,xps13-9345-ec.yaml
+
DELTA AHE-50DC FAN CONTROL MODULE DRIVER
M: Zev Weiss <zev@bewilderbeest.net>
L: linux-hwmon@vger.kernel.org
--
2.54.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v6 2/3] platform: arm64: dell-xps-ec: new driver
2026-10-11 17:50 [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Aleksandrs Vinarskis
2026-10-11 17:50 ` [PATCH v6 1/3] dt-bindings: platform: introduce EC for " Aleksandrs Vinarskis
@ 2026-10-11 17:50 ` Aleksandrs Vinarskis
2026-10-11 17:50 ` [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC Aleksandrs Vinarskis
2026-10-11 21:35 ` [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Liviu Nicoara
3 siblings, 0 replies; 11+ messages in thread
From: Aleksandrs Vinarskis @ 2026-10-11 17:50 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A. R. Silva, Abel Vesa
Cc: Liviu Nicoara, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Abel Vesa, Tobias Heider, Val Packett,
Neil Armstrong, Stephan Gerhold, linux-hardening
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 <alex@vinarskis.com>
---
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 <alex@vinarskis.com>
S: Maintained
F: Documentation/devicetree/bindings/embedded-controller/dell,xps13-9345-ec.yaml
+F: drivers/platform/arm64/dell-xps-ec.c
DELTA AHE-50DC FAN CONTROL MODULE DRIVER
M: Zev Weiss <zev@bewilderbeest.net>
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.
+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/Makefile
index 7681be4a46e9..669dc9e79afb 100644
--- a/drivers/platform/arm64/Makefile
+++ b/drivers/platform/arm64/Makefile
@@ -6,6 +6,7 @@
#
obj-$(CONFIG_EC_ACER_ASPIRE1) += acer-aspire1-ec.o
+obj-$(CONFIG_EC_DELL_XPS) += dell-xps-ec.o
obj-$(CONFIG_EC_HUAWEI_GAOKUN) += huawei-gaokun-ec.o
obj-$(CONFIG_EC_LENOVO_YOGA_C630) += lenovo-yoga-c630.o
obj-$(CONFIG_EC_LENOVO_THINKPAD_T14S) += 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 <alex@vinarskis.com>
+ */
+
+#include <linux/array_size.h>
+#include <linux/container_of.h>
+#include <linux/dev_printk.h>
+#include <linux/device.h>
+#include <linux/devm-helpers.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/iio/consumer.h>
+#include <linux/interrupt.h>
+#include <linux/jiffies.h>
+#include <linux/module.h>
+#include <linux/overflow.h>
+#include <linux/pm.h>
+#include <linux/types.h>
+#include <linux/unaligned.h>
+#include <linux/units.h>
+#include <linux/workqueue.h>
+
+#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 byte.
+ */
+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[] = {
+ 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[] = {
+ /* 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 = {
+ .therms = dell_xps13_9345_therms,
+ .num_therms = ARRAY_SIZE(dell_xps13_9345_therms),
+ .profile = dell_xps13_9345_thermistor_profile,
+ .profile_len = 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] = {};
+ int ret;
+
+ buf[0] = DELL_XPS_EC_SUSPEND_CMD;
+ buf[1] = suspend ? 0x01 : 0x00;
+ /* bytes 2..63 remain zero */
+
+ ret = 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 = milli_celsius / MILLIDEGREE_PER_DECIDEGREE;
+
+ buf[0] = DELL_XPS_EC_TEMP_CMD0;
+ buf[1] = DELL_XPS_EC_TEMP_CMD1;
+ buf[2] = cmd_byte;
+ buf[3] = DELL_XPS_EC_TEMP_CMD3;
+ put_unaligned_le16(deci_celsius, &buf[4]);
+
+ ret = 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 = container_of(work, struct dell_xps_ec,
+ temp_work.work);
+ const struct dell_xps_ec_therm *therms = ec->data->therms;
+ int val, ret;
+ unsigned int i;
+
+ for (i = 0; i < ec->num_therms; i++) {
+ if (!ec->therm_channels[i])
+ continue;
+
+ ret = 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 = 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 = 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=%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 = &client->dev;
+ struct dell_xps_ec *ec;
+ unsigned int i;
+ int ret;
+
+ data = i2c_get_match_data(client);
+ if (!data)
+ return dev_err_probe(dev, -ENODEV, "No match data\n");
+
+ ec = devm_kzalloc(dev, struct_size(ec, therm_channels, data->num_therms),
+ GFP_KERNEL);
+ if (!ec)
+ return -ENOMEM;
+
+ ec->dev = dev;
+ ec->client = client;
+ ec->data = data;
+ ec->num_therms = data->num_therms;
+ i2c_set_clientdata(client, ec);
+
+ /* Set default thermistor profile */
+ ret = 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 = 0; i < ec->num_therms; i++) {
+ ec->therm_channels[i] =
+ devm_iio_channel_get(dev, data->therms[i].name);
+ if (IS_ERR(ec->therm_channels[i])) {
+ ret = PTR_ERR(ec->therm_channels[i]);
+ ec->therm_channels[i] = NULL;
+ if (ret == -EPROBE_DEFER)
+ return ret;
+ dev_warn(dev, "Thermistor %s not available: %d\n",
+ data->therms[i].name, ret);
+ }
+ }
+
+ /* Start periodic temperature reporting */
+ ret = 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 = 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 = dev_get_drvdata(dev);
+
+ int ret;
+
+ cancel_delayed_work_sync(&ec->temp_work);
+
+ ret = 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 would
+ * 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 = dev_get_drvdata(dev);
+ int ret;
+
+ ret = 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[] = {
+ { .compatible = "dell,xps13-9345-ec", .data = &dell_xps13_9345_data },
+ {}
+};
+MODULE_DEVICE_TABLE(of, dell_xps_ec_of_match);
+
+static const struct i2c_device_id dell_xps_ec_i2c_id[] = {
+ { "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 = {
+ SYSTEM_SLEEP_PM_OPS(dell_xps_ec_suspend, dell_xps_ec_resume)
+};
+
+static struct i2c_driver dell_xps_ec_driver = {
+ .driver = {
+ .name = "dell-xps-ec",
+ .of_match_table = dell_xps_ec_of_match,
+ .pm = &dell_xps_ec_pm_ops,
+ },
+ .probe = dell_xps_ec_probe,
+ .id_table = dell_xps_ec_i2c_id,
+};
+module_i2c_driver(dell_xps_ec_driver);
+
+MODULE_AUTHOR("Aleksandrs Vinarskis <alex@vinarskis.com>");
+MODULE_DESCRIPTION("Dell XPS 13 9345 Embedded Controller");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("IIO_CONSUMER");
--
2.54.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC
2026-10-11 17:50 [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Aleksandrs Vinarskis
2026-10-11 17:50 ` [PATCH v6 1/3] dt-bindings: platform: introduce EC for " Aleksandrs Vinarskis
2026-10-11 17:50 ` [PATCH v6 2/3] platform: arm64: dell-xps-ec: new driver Aleksandrs Vinarskis
@ 2026-10-11 17:50 ` Aleksandrs Vinarskis
2026-10-13 17:27 ` Michael Burch
2026-10-14 8:38 ` Abel Vesa
2026-10-11 21:35 ` [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Liviu Nicoara
3 siblings, 2 replies; 11+ messages in thread
From: Aleksandrs Vinarskis @ 2026-10-11 17:50 UTC (permalink / raw)
To: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A. R. Silva, Abel Vesa
Cc: Liviu Nicoara, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Abel Vesa, Tobias Heider, Val Packett,
Neil Armstrong, Stephan Gerhold, linux-hardening,
Dmitry Baryshkov, Konrad Dybcio
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 <dmitry.baryshkov@oss.qualcomm.com>
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Aleksandrs Vinarskis <alex@vinarskis.com>
---
.../boot/dts/qcom/x1e80100-dell-xps13-9345.dts | 85 +++++++++++++++++++++-
1 file changed, 83 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts b/arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts
index f48e6bc35006..bb20cf33847e 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 {
&i2c5 {
clock-frequency = <100000>;
- status = "disabled";
- /* EC @0x3b */
+ status = "okay";
+
+ embedded-controller@3b {
+ compatible = "dell,xps13-9345-ec";
+ reg = <0x3b>;
+
+ interrupts-extended = <&tlmm 66 IRQ_TYPE_LEVEL_LOW>;
+
+ pinctrl-0 = <&ec_int_n_default>;
+ pinctrl-names = "default";
+
+ io-channels = <&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 = "sys_therm0",
+ "sys_therm1",
+ "sys_therm2",
+ "sys_therm3",
+ "sys_therm4",
+ "sys_therm5",
+ "sys_therm6";
+ };
};
&i2c7 {
@@ -1025,6 +1049,57 @@ rtmr0_1p8_reg_en: rtmr0-1p8-reg-en-state {
};
};
+&pmk8550_vadc {
+ sys_therm0: channel@14c {
+ reg = <ADC5_GEN3_AMUX3_GPIO_100K_PU(1)>;
+ qcom,hw-settle-time = <200>;
+ qcom,ratiometric;
+ label = "lpddr5_therm";
+ };
+
+ sys_therm1: channel@14d {
+ reg = <ADC5_GEN3_AMUX4_GPIO_100K_PU(1)>;
+ qcom,hw-settle-time = <200>;
+ qcom,ratiometric;
+ label = "usb_charger_left_therm";
+ };
+
+ sys_therm2: channel@144 {
+ reg = <ADC5_GEN3_AMUX1_THM_100K_PU(1)>;
+ qcom,hw-settle-time = <200>;
+ qcom,ratiometric;
+ label = "vph_pwr_therm";
+ };
+
+ sys_therm3: channel@145 {
+ reg = <ADC5_GEN3_AMUX2_THM_100K_PU(1)>;
+ qcom,hw-settle-time = <200>;
+ qcom,ratiometric;
+ label = "usb_charger_right_therm";
+ };
+
+ sys_therm4: channel@146 {
+ reg = <ADC5_GEN3_AMUX3_THM_100K_PU(1)>;
+ qcom,hw-settle-time = <200>;
+ qcom,ratiometric;
+ label = "ssd_conn_therm";
+ };
+
+ sys_therm5: channel@147 {
+ reg = <ADC5_GEN3_AMUX4_THM_100K_PU(1)>;
+ qcom,hw-settle-time = <200>;
+ qcom,ratiometric;
+ label = "sys_therm5";
+ };
+
+ sys_therm6: channel@148 {
+ reg = <ADC5_GEN3_AMUX5_THM_100K_PU(1)>;
+ qcom,hw-settle-time = <200>;
+ qcom,ratiometric;
+ label = "keyboard_therm";
+ };
+};
+
&qupv3_0 {
status = "okay";
};
@@ -1103,6 +1178,12 @@ cam_indicator_en: cam-indicator-en-state {
bias-disable;
};
+ ec_int_n_default: ec-int-n-state {
+ pins = "gpio66";
+ function = "gpio";
+ bias-disable;
+ };
+
edp_bl_en: edp-bl-en-state {
pins = "gpio74";
function = "gpio";
--
2.54.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345
2026-10-11 17:50 [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Aleksandrs Vinarskis
` (2 preceding siblings ...)
2026-10-11 17:50 ` [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC Aleksandrs Vinarskis
@ 2026-10-11 21:35 ` Liviu Nicoara
3 siblings, 0 replies; 11+ messages in thread
From: Liviu Nicoara @ 2026-10-11 21:35 UTC (permalink / raw)
To: Aleksandrs Vinarskis, Bjorn Andersson, Konrad Dybcio,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Hans de Goede,
Ilpo Järvinen, Bryan O'Donoghue, Kees Cook,
Gustavo A . R . Silva, Abel Vesa
Cc: linux-arm-msm, devicetree, linux-kernel, platform-driver-x86,
Abel Vesa, Tobias Heider, Val Packett, Neil Armstrong,
Stephan Gerhold, linux-hardening, Krzysztof Kozlowski,
Dmitry Baryshkov, Konrad Dybcio
On Sun, 11 Oct 2026 19:50:07 +0200, Aleksandrs Vinarskis wrote:
> This series adds Embedded Controller (EC) driver for Dell XPS 13 9345.
> While EC appears to control most of device's peripherals, particular
> driver addresses power and thermal managment issues.
Tested v6 on a second XPS 13 9345 (BIOS 2.14.0), on 7.2.6 with the
PMIC5 Gen3 ADC and ADC_TM drivers and the board thermal zones [1]
backported. The driver probes, gets all seven channels and reports to
the EC without an error. Two observations from this unit:
1. The two GPIO thermistor channels. Here AMUX3_GPIO (0x14c,
lpddr5_therm) reads the top of the conversion table, ~130 C, from
boot on, and AMUX4_GPIO (0x14d, usb_charger_left_therm) does not
move when a charger warms the left port. AMUX2_GPIO (0x14b) does,
1.6 C in three minutes, and AMUX1_GPIO (0x14a) reads a plausible
board temperature. Windows' ADC1.bin puts SYS_THERM1/2 on
0x14a/0x14b, and hamoa-pmics.dtsi in next defines those two. The
patch configures no PMIC GPIO for AMUX3/4, where mainline sets
pm8550 gpio3 and gpio4 for AMUX1/2; so either the two thermistors
sit on 0x14a/0x14b on this board, or AMUX3/4 want the pin
configuration. As it stands the EC is told the memory is at 130 C.
The fans did not react to that here, at idle on battery.
2. Resume. With the driver loaded, a key press wakes the machine
through the PMIC power key: the EC has powered the keyboard off, as
the comment in the driver says, and the keyboard delivers no event
for the key that woke the machine; instead pm8941-pwrkey reports a
KEY_POWER press and release at resume. With logind's default
HandlePowerKey=poweroff and no desktop holding the power-key
inhibitor, the machine shuts down right after it wakes. With the
inhibitor held, the resume is clean and the machine stays up, so
the resume command does its job. Without the driver the keyboard
wakes the host as an i2c-hid device and no power-key event appears.
Reproduced twice; GNOME and KDE take that inhibitor, so they would
not see it.
[1] https://lore.kernel.org/all/20261006185557.23016-1-lnicoara@thinkoid.org/
Liviu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC
2026-10-11 17:50 ` [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC Aleksandrs Vinarskis
@ 2026-10-13 17:27 ` Michael Burch
2026-10-13 19:53 ` Liviu Nicoara
2026-10-14 8:38 ` Abel Vesa
1 sibling, 1 reply; 11+ messages in thread
From: Michael Burch @ 2026-10-13 17:27 UTC (permalink / raw)
To: Aleksandrs Vinarskis
Cc: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A. R. Silva, Abel Vesa,
Liviu Nicoara, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Abel Vesa, Tobias Heider, Val Packett,
Neil Armstrong, Stephan Gerhold, linux-hardening,
Dmitry Baryshkov, Konrad Dybcio
On Sun, Oct 11, 2026 at 07:50:10PM +0200, Aleksandrs Vinarskis wrote:
> + io-channels = <&pmk8550_vadc ADC5_GEN3_AMUX3_GPIO_100K_PU(1)>,
> + <&pmk8550_vadc ADC5_GEN3_AMUX4_GPIO_100K_PU(1)>,
These two should be AMUX1_GPIO and AMUX2_GPIO. My unit (BIOS 2.14.0)
shows what Liviu reported [1]: 0x14c (lpddr5_therm) reads 130.048 C from
boot on, and that is the value the EC is sent.
The Windows ADC configuration answers Liviu's question, wrong channel or
missing pin configuration. In ADC1 from your qcom-aeob-dumps
(dell-xps-9345/ADC1.json), the channel table puts the seven board
thermistors on SID 1, all with the 100k pull-up:
SYS_THERM1 0x4a AMUX1_GPIO
SYS_THERM2 0x4b AMUX2_GPIO
SYS_THERM3 0x44 AMUX1_THM
SYS_THERM4 0x45 AMUX2_THM
SYS_THERM5 0x46 AMUX3_THM
SYS_THERM6 0x47 AMUX4_THM
SYS_THERM7 0x48 AMUX5_THM
Its GPIO table sets up only two pins as ADC inputs: PM8550 GPIO3 on
channels 0x0a/0x4a and GPIO4 on 0x0b/0x4b. hamoa-pmics.dtsi already
puts those two pins in high impedance for the VADC and defines
channel@14a and channel@14b. Nothing in ADC1 uses AMUX3 or AMUX4 GPIO.
sys_therm2 to sys_therm6 here are SYS_THERM3 to SYS_THERM7, so
sys_thermN is SYS_THERM(N+1), and sys_therm0/1 are 0x14a/0x14b. The
labels fit too: Liviu found the left charger thermistor on AMUX2 GPIO
[2], and sys_therm1 is usb_charger_left_therm.
Readings on a 7.3-rc6 based kernel, idle:
0x14a 40.6 C 0x14c 130.0 C (constant)
0x14b 34.6 C 0x14d 37.0 C
AMUX1-5 THM 34.6 to 40.5 C
> + sys_therm0: channel@14c {
> + reg = <ADC5_GEN3_AMUX3_GPIO_100K_PU(1)>;
[...]
> + sys_therm1: channel@14d {
> + reg = <ADC5_GEN3_AMUX4_GPIO_100K_PU(1)>;
With the change below on a v7.3-rc7 based kernel, sys_therm0 and
sys_therm1 read 45.4 C and 41.0 C, next to 38.2 to 46.8 C on the THM
channels:
--- a/arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts
+++ b/arch/arm64/boot/dts/qcom/x1e80100-dell-xps13-9345.dts
@@ -1133,8 +1133,8 @@ embedded-controller@3b {
pinctrl-0 = <&ec_int_n_default>;
pinctrl-names = "default";
- io-channels = <&pmk8550_vadc ADC5_GEN3_AMUX3_GPIO_100K_PU(1)>,
- <&pmk8550_vadc ADC5_GEN3_AMUX4_GPIO_100K_PU(1)>,
+ io-channels = <&pmk8550_vadc ADC5_GEN3_AMUX1_GPIO_100K_PU(1)>,
+ <&pmk8550_vadc ADC5_GEN3_AMUX2_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)>,
@@ -1439,15 +1439,15 @@ rtmr0_1p8_reg_en: rtmr0-1p8-reg-en-state {
};
&pmk8550_vadc {
- sys_therm0: channel@14c {
- reg = <ADC5_GEN3_AMUX3_GPIO_100K_PU(1)>;
+ sys_therm0: channel@14a {
+ reg = <ADC5_GEN3_AMUX1_GPIO_100K_PU(1)>;
qcom,hw-settle-time = <200>;
qcom,ratiometric;
label = "lpddr5_therm";
};
- sys_therm1: channel@14d {
- reg = <ADC5_GEN3_AMUX4_GPIO_100K_PU(1)>;
+ sys_therm1: channel@14b {
+ reg = <ADC5_GEN3_AMUX2_GPIO_100K_PU(1)>;
qcom,hw-settle-time = <200>;
qcom,ratiometric;
label = "usb_charger_left_therm";
[1] https://lore.kernel.org/r/20261011213528.13207-1-lnicoara@thinkoid.org
[2] https://lore.kernel.org/r/20261006185557.23016-1-lnicoara@thinkoid.org
Michael
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC
2026-10-13 17:27 ` Michael Burch
@ 2026-10-13 19:53 ` Liviu Nicoara
2026-10-22 17:07 ` Aleksandrs Vinarskis
0 siblings, 1 reply; 11+ messages in thread
From: Liviu Nicoara @ 2026-10-13 19:53 UTC (permalink / raw)
To: Michael Burch, Aleksandrs Vinarskis
Cc: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A . R . Silva,
Abel Vesa, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Abel Vesa, Tobias Heider, Val Packett,
Neil Armstrong, Stephan Gerhold, linux-hardening,
Dmitry Baryshkov, Konrad Dybcio
On Tue, 13 Oct 2026 12:27:16 -0500, Michael Burch wrote:
> These two should be AMUX1_GPIO and AMUX2_GPIO. My unit (BIOS 2.14.0)
> shows what Liviu reported [1]: 0x14c (lpddr5_therm) reads 130.048 C from
> boot on, and that is the value the EC is sent.
Same here, and the ADC1 table settles what my readings left open.
On this unit (also BIOS 2.14.0), with all four GPIO channels defined
in one DTB on a 7.2.6 kernel:
0x14a 38.6 C 0x14c 130.0 C (constant)
0x14b 32.7 C 0x14d 34.7 C
A charger on the left USB-C port warmed 0x14b by 1.6 C in three
minutes; 0x14d stayed within 0.1 C. So usb_charger_left_therm is
AMUX2_GPIO, 0x14b, as your table says; 0x14a reads a board
temperature and warms with the SoC.
> + sys_therm0: channel@14a {
> + reg = <ADC5_GEN3_AMUX1_GPIO_100K_PU(1)>;
One note on the shape: hamoa-pmics.dtsi already defines
channel@14a and channel@14b as pm8550_gpio_01 and pm8550_gpio_02,
with gpio3 and gpio4 in high impedance for them. The EC's io-channels
can reference those two directly; redefining the nodes in the board
file only adds the labels, which the EC node does not need.
Happy to test a v7 with the two channels moved.
Liviu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC
2026-10-11 17:50 ` [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC Aleksandrs Vinarskis
2026-10-13 17:27 ` Michael Burch
@ 2026-10-14 8:38 ` Abel Vesa
1 sibling, 0 replies; 11+ messages in thread
From: Abel Vesa @ 2026-10-14 8:38 UTC (permalink / raw)
To: Aleksandrs Vinarskis
Cc: Bjorn Andersson, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A. R. Silva, Abel Vesa,
Liviu Nicoara, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Tobias Heider, Val Packett, Neil Armstrong,
Stephan Gerhold, linux-hardening, Dmitry Baryshkov,
Konrad Dybcio
On 26-10-11 19:50:10, Aleksandrs Vinarskis wrote:
> 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 <dmitry.baryshkov@oss.qualcomm.com>
> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Aleksandrs Vinarskis <alex@vinarskis.com>
Reviewed-by: Abel Vesa <abel.vesa@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v6 1/3] dt-bindings: platform: introduce EC for Dell XPS 13 9345
2026-10-11 17:50 ` [PATCH v6 1/3] dt-bindings: platform: introduce EC for " Aleksandrs Vinarskis
@ 2026-10-15 3:07 ` Rob Herring
0 siblings, 0 replies; 11+ messages in thread
From: Rob Herring @ 2026-10-15 3:07 UTC (permalink / raw)
To: Aleksandrs Vinarskis
Cc: Bjorn Andersson, Konrad Dybcio, Krzysztof Kozlowski,
Conor Dooley, Hans de Goede, Ilpo Järvinen,
Bryan O'Donoghue, Kees Cook, Gustavo A. R. Silva, Abel Vesa,
Liviu Nicoara, linux-arm-msm, devicetree, linux-kernel,
platform-driver-x86, Abel Vesa, Tobias Heider, Val Packett,
Neil Armstrong, Stephan Gerhold, linux-hardening,
Krzysztof Kozlowski
On Sun, Oct 11, 2026 at 07:50:08PM +0200, Aleksandrs Vinarskis wrote:
> 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 <krzysztof.kozlowski@oss.qualcomm.com>
> Signed-off-by: Aleksandrs Vinarskis <alex@vinarskis.com>
> ---
> .../embedded-controller/dell,xps13-9345-ec.yaml | 91 ++++++++++++++++++++++
> MAINTAINERS | 5 ++
> 2 files changed, 96 insertions(+)
Please address sashiko comment.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC
2026-10-13 19:53 ` Liviu Nicoara
@ 2026-10-22 17:07 ` Aleksandrs Vinarskis
2026-10-22 19:27 ` Liviu Nicoara
0 siblings, 1 reply; 11+ messages in thread
From: Aleksandrs Vinarskis @ 2026-10-22 17:07 UTC (permalink / raw)
To: Liviu Nicoara
Cc: Michael Burch, Bjorn Andersson, Konrad Dybcio, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Hans de Goede,
Ilpo Järvinen, Bryan O'Donoghue, Kees Cook,
Gustavo A . R . Silva, Abel Vesa, linux-arm-msm, devicetree,
linux-kernel, platform-driver-x86, Abel Vesa, Tobias Heider,
Val Packett, Neil Armstrong, Stephan Gerhold, linux-hardening,
Dmitry Baryshkov, Konrad Dybcio
On Tuesday, October 13th, 2026 at 21:53, Liviu Nicoara <lnicoara@thinkoid.org> wrote:
> On Tue, 13 Oct 2026 12:27:16 -0500, Michael Burch wrote:
> > These two should be AMUX1_GPIO and AMUX2_GPIO. My unit (BIOS 2.14.0)
> > shows what Liviu reported [1]: 0x14c (lpddr5_therm) reads 130.048 C from
> > boot on, and that is the value the EC is sent.
>
> Same here, and the ADC1 table settles what my readings left open.
> On this unit (also BIOS 2.14.0), with all four GPIO channels defined
> in one DTB on a 7.2.6 kernel:
>
> 0x14a 38.6 C 0x14c 130.0 C (constant)
> 0x14b 32.7 C 0x14d 34.7 C
>
> A charger on the left USB-C port warmed 0x14b by 1.6 C in three
> minutes; 0x14d stayed within 0.1 C. So usb_charger_left_therm is
> AMUX2_GPIO, 0x14b, as your table says; 0x14a reads a board
> temperature and warms with the SoC.
Hey,
Thats a very good find. I have checked and it seems you are right;
Most of mapping between ADC channels relied on schematics that I
managed to get my hands on, its now clear that it is not a most up
to date document... As EC only reacts to some of the temperatures
fed to it and not all, I missed this in my testing.
Ignoring all the information from schematics now, I am trying to
re-verify names for all the ADC channels. I do not think the left
charger you identified is correct - how did you arrive to that
conclusion? Curious to compare to my method. I run a number of
stress tests to narrow it down:
1. RHS charger getting plugged, 10s wait:
LABEL START END DIFF
pm8550_die_temp 49.5°C 49.0°C -0.6°C
vph_pwr_therm 53.3°C 53.1°C -0.2°C
usb_charger_right_therm 45.2°C 47.5°C +2.3°C
ssd_conn_therm 47.0°C 46.6°C -0.4°C
sys_therm5 39.1°C 39.3°C +0.2°C
keyboard_therm 51.6°C 51.3°C -0.3°C
pm8550_gpio_01 51.4°C 51.1°C -0.3°C
pm8550_gpio_02 44.6°C 44.3°C -0.3°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.9°C 35.8°C -0.0°C
pm8550ve_2_die_temp 50.7°C 50.3°C -0.4°C
pmk8550_die_temp 48.1°C 47.6°C -0.5°C
pmc8380_3_die_temp 48.6°C 48.1°C -0.5°C
pmc8380_4_die_temp 47.1°C 46.7°C -0.3°C
pmc8380_5_die_temp 48.8°C 48.3°C -0.5°C
pmc8380_6_die_temp 48.0°C 47.4°C -0.6°C
pm8550ve_8_die_temp 47.3°C 47.8°C +0.5°C
pm8550ve_9_die_temp 51.3°C 51.0°C -0.4°C
Charger unplugged:
LABEL START END DIFF
pm8550_die_temp 49.3°C 48.5°C -0.8°C
vph_pwr_therm 53.0°C 52.5°C -0.6°C
usb_charger_right_therm 47.1°C 45.7°C -1.4°C
ssd_conn_therm 46.5°C 46.1°C -0.4°C
sys_therm5 39.2°C 39.2°C -0.0°C
keyboard_therm 51.3°C 51.0°C -0.3°C
pm8550_gpio_01 51.3°C 51.0°C -0.3°C
pm8550_gpio_02 44.3°C 44.0°C -0.3°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.8°C 35.8°C -0.0°C
pm8550ve_2_die_temp 50.2°C 49.7°C -0.5°C
pmk8550_die_temp 47.5°C 47.3°C -0.3°C
pmc8380_3_die_temp 48.4°C 47.8°C -0.6°C
pmc8380_4_die_temp 46.8°C 46.4°C -0.4°C
pmc8380_5_die_temp 48.6°C 48.0°C -0.6°C
pmc8380_6_die_temp 48.1°C 47.3°C -0.7°C
pm8550ve_8_die_temp 48.2°C 47.3°C -0.9°C
pm8550ve_9_die_temp 51.2°C 50.6°C -0.7°C
`usb_charger_right_therm` gained 2.3C in 10s, lost 1.4C 10s.
Clearly follows.
2. LHS charger getting plugged, 10s wait:
LABEL START END DIFF
pm8550_die_temp 47.6°C 47.3°C -0.3°C
vph_pwr_therm 51.6°C 51.5°C -0.1°C
usb_charger_right_therm 44.2°C 43.6°C -0.5°C
ssd_conn_therm 45.2°C 45.0°C -0.2°C
sys_therm5 38.8°C 38.6°C -0.2°C
keyboard_therm 50.1°C 49.9°C -0.2°C
pm8550_gpio_01 50.0°C 49.7°C -0.3°C
pm8550_gpio_02 43.2°C 43.3°C +0.2°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.8°C 35.8°C -0.0°C
pm8550ve_2_die_temp 49.1°C 48.8°C -0.2°C
pmk8550_die_temp 46.6°C 46.2°C -0.3°C
pmc8380_3_die_temp 47.0°C 46.8°C -0.2°C
pmc8380_4_die_temp 45.6°C 45.4°C -0.2°C
pmc8380_5_die_temp 47.3°C 46.8°C -0.5°C
pmc8380_6_die_temp 46.7°C 46.1°C -0.6°C
pm8550ve_8_die_temp 46.2°C 45.8°C -0.4°C
pm8550ve_9_die_temp 49.8°C 49.5°C -0.3°C
Charger unplugged:
LABEL START END DIFF
pm8550_die_temp 47.3°C 47.2°C -0.1°C
vph_pwr_therm 51.4°C 50.9°C -0.5°C
usb_charger_right_therm 43.8°C 43.4°C -0.4°C
ssd_conn_therm 45.0°C 44.8°C -0.1°C
sys_therm5 38.6°C 38.4°C -0.2°C
keyboard_therm 49.7°C 49.3°C -0.4°C
pm8550_gpio_01 49.6°C 49.2°C -0.5°C
pm8550_gpio_02 43.4°C 43.3°C -0.1°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.8°C 35.8°C +0.0°C
pm8550ve_2_die_temp 48.7°C 48.4°C -0.3°C
pmk8550_die_temp 46.1°C 45.8°C -0.3°C
pmc8380_3_die_temp 46.9°C 46.5°C -0.4°C
pmc8380_4_die_temp 45.4°C 45.0°C -0.4°C
pmc8380_5_die_temp 46.9°C 46.5°C -0.4°C
pmc8380_6_die_temp 46.3°C 45.9°C -0.4°C
pm8550ve_8_die_temp 45.8°C 45.6°C -0.3°C
pm8550ve_9_die_temp 49.5°C 49.1°C -0.4°C
pm8550_gpio_02 does NOT clearly follow. In your test you have
waited multiple minutes, which is enough to heat up a larger
area on the motherboard.
3. SSD stress test, 30s wait:
LABEL START END DIFF
pm8550_die_temp 45.7°C 51.6°C +5.9°C
vph_pwr_therm 49.6°C 55.0°C +5.4°C
usb_charger_right_therm 41.5°C 44.4°C +2.9°C
ssd_conn_therm 42.9°C 47.9°C +5.0°C
sys_therm5 36.7°C 36.9°C +0.2°C
keyboard_therm 47.7°C 53.0°C +5.3°C
pm8550_gpio_01 47.7°C 52.5°C +4.8°C
pm8550_gpio_02 41.0°C 44.6°C +3.6°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.7°C 35.9°C +0.2°C
pm8550ve_2_die_temp 47.0°C 52.4°C +5.4°C
pmk8550_die_temp 44.2°C 48.4°C +4.2°C
pmc8380_3_die_temp 46.0°C 52.8°C +6.8°C
pmc8380_4_die_temp 43.5°C 48.2°C +4.7°C
pmc8380_5_die_temp 46.8°C 51.3°C +4.5°C
pmc8380_6_die_temp 45.3°C 49.7°C +4.4°C
pm8550ve_8_die_temp 44.2°C 47.4°C +3.2°C
pm8550ve_9_die_temp 48.4°C 53.4°C +5.0°C
Cooldown, 10s wait:
LABEL START END DIFF
pm8550_die_temp 50.9°C 50.8°C -0.1°C
vph_pwr_therm 54.0°C 53.2°C -0.8°C
usb_charger_right_therm 44.6°C 44.5°C -0.0°C
ssd_conn_therm 48.1°C 47.9°C -0.2°C
sys_therm5 36.9°C 37.0°C +0.0°C
keyboard_therm 52.4°C 51.7°C -0.7°C
pm8550_gpio_01 52.1°C 51.4°C -0.7°C
pm8550_gpio_02 44.9°C 44.8°C -0.0°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.9°C 35.9°C +0.0°C
pm8550ve_2_die_temp 51.4°C 50.6°C -0.8°C
pmk8550_die_temp 48.2°C 47.6°C -0.6°C
pmc8380_3_die_temp 49.9°C 49.1°C -0.7°C
pmc8380_4_die_temp 47.4°C 46.7°C -0.6°C
pmc8380_5_die_temp 50.2°C 49.2°C -1.0°C
pmc8380_6_die_temp 48.9°C 48.1°C -0.8°C
pm8550ve_8_die_temp 47.2°C 46.9°C -0.3°C
pm8550ve_9_die_temp 52.4°C 51.5°C -0.8°C
This is a bit inconclusive. Both SSD, keyboard, and
pm8550_gpio_01 (LPDDR5, see below) heated up significantly.
4. Stress RAM, 10s wait:
LABEL START END DIFF
pm8550_die_temp 50.5°C 51.0°C +0.5°C
vph_pwr_therm 53.8°C 55.9°C +2.1°C
usb_charger_right_therm 45.8°C 46.3°C +0.5°C
ssd_conn_therm 47.8°C 47.9°C +0.0°C
sys_therm5 39.9°C 39.9°C -0.1°C
keyboard_therm 52.0°C 55.1°C +3.0°C
pm8550_gpio_01 51.9°C 54.7°C +2.8°C
pm8550_gpio_02 45.6°C 45.4°C -0.2°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.9°C 35.8°C -0.0°C
pm8550ve_2_die_temp 51.0°C 53.0°C +2.1°C
pmk8550_die_temp 48.1°C 49.3°C +1.1°C
pmc8380_3_die_temp 50.8°C 52.7°C +1.8°C
pmc8380_4_die_temp 47.3°C 49.7°C +2.4°C
pmc8380_5_die_temp 50.0°C 53.0°C +3.0°C
pmc8380_6_die_temp 48.9°C 52.9°C +4.0°C
pm8550ve_8_die_temp 50.0°C 51.4°C +1.4°C
pm8550ve_9_die_temp 53.7°C 55.7°C +2.0°C
5. Cooldown, 10s wait:
LABEL START END DIFF
pm8550_die_temp 52.2°C 51.3°C -0.8°C
vph_pwr_therm 56.3°C 55.2°C -1.1°C
usb_charger_right_therm 47.2°C 46.7°C -0.5°C
ssd_conn_therm 49.0°C 48.5°C -0.5°C
sys_therm5 39.4°C 39.4°C -0.0°C
keyboard_therm 54.7°C 53.6°C -1.1°C
pm8550_gpio_01 54.6°C 53.4°C -1.1°C
pm8550_gpio_02 45.8°C 45.6°C -0.2°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.9°C 35.9°C +0.0°C
pm8550ve_2_die_temp 53.5°C 52.3°C -1.2°C
pmk8550_die_temp 51.1°C 50.0°C -1.1°C
pmc8380_3_die_temp 51.5°C 50.2°C -1.3°C
pmc8380_4_die_temp 49.7°C 48.7°C -0.9°C
pmc8380_5_die_temp 51.4°C 50.1°C -1.3°C
pmc8380_6_die_temp 50.9°C 49.8°C -1.1°C
pm8550ve_8_die_temp 50.2°C 49.3°C -0.9°C
pm8550ve_9_die_temp 54.3°C 53.3°C -1.0°C
pm8550_gpio_01 and keyboard_therm clearly respond. This
would make sense, I am guessing two sensors are located
very close to each other on the motherboard, but on the
opposite sides of the PCBA.
6. Hairdryer on the keyboard, 10s wait:
LABEL START END DIFF
pm8550_die_temp 49.3°C 49.1°C -0.2°C
vph_pwr_therm 50.6°C 50.4°C -0.2°C
usb_charger_right_therm 43.7°C 43.6°C -0.1°C
ssd_conn_therm 46.4°C 46.3°C -0.1°C
sys_therm5 36.8°C 37.0°C +0.2°C
keyboard_therm 49.6°C 49.4°C -0.2°C
pm8550_gpio_01 49.2°C 48.9°C -0.2°C
pm8550_gpio_02 44.1°C 44.1°C +0.1°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.9°C 35.8°C -0.1°C
pm8550ve_2_die_temp 48.1°C 48.0°C -0.1°C
pmk8550_die_temp 45.3°C 45.1°C -0.2°C
pmc8380_3_die_temp 46.0°C 45.7°C -0.4°C
pmc8380_4_die_temp 44.6°C 44.3°C -0.3°C
pmc8380_5_die_temp 46.3°C 45.9°C -0.3°C
pmc8380_6_die_temp 45.3°C 45.0°C -0.3°C
pm8550ve_8_die_temp 45.4°C 45.1°C -0.3°C
pm8550ve_9_die_temp 48.8°C 48.6°C -0.2°C
Another 10s wait:
LABEL START END DIFF
pm8550_die_temp 49.0°C 49.6°C +0.6°C
vph_pwr_therm 50.6°C 51.0°C +0.5°C
usb_charger_right_therm 43.7°C 44.3°C +0.6°C
ssd_conn_therm 46.5°C 47.2°C +0.7°C
sys_therm5 37.5°C 38.8°C +1.3°C
keyboard_therm 49.6°C 50.2°C +0.7°C
pm8550_gpio_01 49.1°C 49.7°C +0.6°C
pm8550_gpio_02 44.6°C 45.7°C +1.1°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 35.8°C 35.9°C +0.1°C
pm8550ve_2_die_temp 48.2°C 48.6°C +0.4°C
pmk8550_die_temp 45.3°C 46.1°C +0.8°C
pmc8380_3_die_temp 46.0°C 46.4°C +0.4°C
pmc8380_4_die_temp 44.5°C 45.2°C +0.6°C
pmc8380_5_die_temp 46.3°C 46.7°C +0.4°C
pmc8380_6_die_temp 45.3°C 46.0°C +0.7°C
pm8550ve_8_die_temp 45.3°C 46.1°C +0.8°C
pm8550ve_9_die_temp 48.7°C 49.6°C +0.9°C
Cooldown, 10s wait:
LABEL START END DIFF
pm8550_die_temp 55.8°C 55.3°C -0.5°C
vph_pwr_therm 57.8°C 57.3°C -0.5°C
usb_charger_right_therm 51.0°C 50.6°C -0.4°C
ssd_conn_therm 54.0°C 53.6°C -0.4°C
sys_therm5 45.8°C 45.3°C -0.6°C
keyboard_therm 56.3°C 55.8°C -0.5°C
pm8550_gpio_01 55.8°C 55.4°C -0.4°C
pm8550_gpio_02 52.5°C 51.9°C -0.5°C
lpddr5_therm 130.0°C 130.0°C +0.0°C
usb_charger_left_therm 36.0°C 36.0°C +0.0°C
pm8550ve_2_die_temp 54.7°C 54.2°C -0.5°C
pmk8550_die_temp 52.0°C 51.6°C -0.4°C
pmc8380_3_die_temp 51.5°C 51.2°C -0.3°C
pmc8380_4_die_temp 50.3°C 49.9°C -0.4°C
pmc8380_5_die_temp 51.9°C 51.5°C -0.4°C
pmc8380_6_die_temp 51.0°C 50.8°C -0.2°C
pm8550ve_8_die_temp 52.7°C 52.4°C -0.3°C
pm8550ve_9_die_temp 55.4°C 55.1°C -0.3°C
I would say it is also inconclusive; Looks more like
"sys_therm5" is the actual keyboard thermistor.
With this in mind:
ADC5_GEN3_AMUX1_GPIO_100K_PU - Likely "lpddr5_therm"
ADC5_GEN3_AMUX2_GPIO_100K_PU - Li
ADC5_GEN3_AMUX1_THM_100K_PU -
ADC5_GEN3_AMUX2_THM_100K_PU - RHS USB Charger
ADC5_GEN3_AMUX3_THM_100K_PU -
ADC5_GEN3_AMUX4_THM_100K_PU -
ADC5_GEN3_AMUX5_THM_100K_PU -
Would like to hear how you arrived to the labels. I am
in parallel checking if tearing down the laptop would
help me identify which thermistor is which, but this
will take a while. Alternatively, I am leaning to drop
the labels for anything we are not sure about...
P.S. With most platforms starting sys_therm node count
from 1 and not 0, and schematics used to make this
mapping being wrong I would change this series to match
usual convention in the next series.
Regards,
Alex
>
> > + sys_therm0: channel@14a {
> > + reg = <ADC5_GEN3_AMUX1_GPIO_100K_PU(1)>;
>
> One note on the shape: hamoa-pmics.dtsi already defines
> channel@14a and channel@14b as pm8550_gpio_01 and pm8550_gpio_02,
> with gpio3 and gpio4 in high impedance for them. The EC's io-channels
> can reference those two directly; redefining the nodes in the board
> file only adds the labels, which the EC node does not need.
>
> Happy to test a v7 with the two channels moved.
>
> Liviu
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC
2026-10-22 17:07 ` Aleksandrs Vinarskis
@ 2026-10-22 19:27 ` Liviu Nicoara
0 siblings, 0 replies; 11+ messages in thread
From: Liviu Nicoara @ 2026-10-22 19:27 UTC (permalink / raw)
To: Aleksandrs Vinarskis
Cc: Michael Burch, Bjorn Andersson, Konrad Dybcio, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Hans de Goede,
Ilpo Järvinen, Bryan O'Donoghue, Kees Cook,
Gustavo A . R . Silva, Abel Vesa, linux-arm-msm, devicetree,
linux-kernel, platform-driver-x86, Abel Vesa, Tobias Heider,
Val Packett, Neil Armstrong, Stephan Gerhold, linux-hardening,
Dmitry Baryshkov, Konrad Dybcio
On Thu, 22 Oct 2026 17:07:25 +0000, Aleksandrs Vinarskis wrote:
> I do not think the left charger you identified is correct - how did
> you arrive to that conclusion? Curious to compare to my method.
I am afraid my method was simpler and coarser than yours: one run per
port, nineteen samples ten seconds apart, the charger feeding the
system only (battery at 96 % and not charging), on a 7.2.6 kernel
with all four GPIO channels in one DTB. The deltas over three minutes:
Channel Left charger Right charger
0x14b AMUX2_GPIO +1.6 -0.9
0x145 AMUX2_THM +0.1 +3.4
0x146 AMUX3_THM +0.8 -0.1
0x14a AMUX1_GPIO -0.2 +1.3
0x144 AMUX1_THM -0.1 +0.2
0x148 AMUX5_THM -0.2 +1.2
0x147 AMUX4_THM +0.1 +1.8
0x14d AMUX4_GPIO +0.0 -0.0
The other channels fell or held while 0x14b rose, so it was not the
board warming as a whole. But 1.6 C in three minutes, against your
2.3 C in ten seconds on the right, might mean that 0x14b is a sensor
somewhere on the left side of the board, not necessarily on the left
port's power path. Under SSD load it moved with 0x146 and fell with
it in cool-down, which puts it close to the SSD. "Left charger" was
my reading of the sign pattern. Your ten-second test is probably the
better discriminator for a sensor on a power path. If nothing answers
the left charger in ten seconds, the simpler reading is that the left
port has no thermistor of its own among these seven.
> pm8550_gpio_02 does NOT clearly follow. In your test you have
> waited multiple minutes, which is enough to heat up a larger
> area on the motherboard.
Agreed. In your left run it was the only channel with a positive
delta while the board drifted down, which is the same weak signal I
had, and no more than that.
On the two AMUX3/AMUX4 GPIO channels: neither carries a thermistor
on this unit, and your tables say the same for yours. 0x14c reads
130.048 C on every sample, the last row of the conversion table,
where the driver clamps a voltage at or below the lowest it knows.
Its input sits near 0 V. Windows' ADC configuration sets up only
PM8550 GPIO3 and GPIO4 as analog inputs, for AMUX1 and AMUX2, so the
pin behind AMUX3 is in its digital default, and PM8550's low GPIOs
read back here as inputs with a 10 uA pull-down. 0x14d held 34.7 C
within 0.1 C through both chargers and two load runs on this unit,
and 35.8 to 36.0 C through every one of your tests, the hairdryer
included. That is a biased pin, not a sensor. Both nodes can go.
> ADC5_GEN3_AMUX1_GPIO_100K_PU - Likely "lpddr5_therm"
I cannot separate 0x14a from 0x144 and 0x148 by heating. Under a
one-core load reading a file from /dev/shm they rose 14.0, 14.4 and
14.2 C in lockstep, while the SoC's mem TSENS zone rose 20 C. Your
RAM stress warmed every PMIC die by 1 to 4 C as well, so it does not
single out 0x14a either. The three sit with the SoC; which one is the
memory I cannot tell.
> Looks more like "sys_therm5" is the actual keyboard thermistor.
Consistent with what I see. 0x147 is the coolest of the seven, 29 C
at idle, and nearly indifferent to board loads: it gained 2.0 C where
0x144 gained 9.2 under SSD I/O, and 2.5 C where 0x144 gained 14.4
under the CPU load. A sensor away from the board, on the skin side,
fits.
On 0x146: under four minutes of direct-I/O reads it rose 8.2 C
against 10.0 C on the NVMe's own sensor, the largest share of any
channel, and it fell at once when the load stopped while the
SoC-side channels kept rising. Under the CPU-only control its share
halved. I would keep "ssd_conn_therm" on it with partial confidence,
but I will not argue if it goes with the others.
> Alternatively, I am leaning to drop the labels for anything we are
> not sure about...
Or just give them pirate names. Jk.
Agreed. 0x145 as the right charger is what both of us measured.
Everything else is a guess until the teardown. Numbering sys_therm
from 1 matches Windows' SYS_THERM1 to 7, so that helps too.
One consequence on my side: the 9345 thermal-zones patch
(20261006185557.23016-1-lnicoara@thinkoid.org) names its zones
chg-left on 0x14b and ssd on 0x146. I will respin it with neutral
names for the zones that are not settled, so the two patches agree.
Happy to test a v7, including a lid close on the EC interrupt line,
which my v6 run did not cover.
I love this laptop, but I will not open it up just to pinpoint the
right thermistors' locations.
Liviu
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-10-22 19:27 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-11 17:50 [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Aleksandrs Vinarskis
2026-10-11 17:50 ` [PATCH v6 1/3] dt-bindings: platform: introduce EC for " Aleksandrs Vinarskis
2026-10-15 3:07 ` Rob Herring
2026-10-11 17:50 ` [PATCH v6 2/3] platform: arm64: dell-xps-ec: new driver Aleksandrs Vinarskis
2026-10-11 17:50 ` [PATCH v6 3/3] arm64: dts: qcom: x1e80100-dell-xps13-9345: introduce EC Aleksandrs Vinarskis
2026-10-13 17:27 ` Michael Burch
2026-10-13 19:53 ` Liviu Nicoara
2026-10-22 17:07 ` Aleksandrs Vinarskis
2026-10-22 19:27 ` Liviu Nicoara
2026-10-14 8:38 ` Abel Vesa
2026-10-11 21:35 ` [PATCH v6 0/3] Introduce EC driver for Snapdragon X1E based Dell XPS 13 9345 Liviu Nicoara
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®