From nobody Mon Jun 8 09:48:09 2026 Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 560142DA749 for ; Fri, 29 May 2026 22:22:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.68 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780093347; cv=none; b=VXkgI1ZL0bByFR+mbab6An3hCLtnLZApqcDBmTAdBZu7m3jtUXTQRiCYp5xSS80FRUtWsPGnFwbUTEjbITzmPKheS99MFGnGiWkL4plVOVfWzit/Bu/NNBIhvbhlZTblnmzdGauJ4oXsWr1DYTOF+S8hVCyoKwGfO5hxyDUGRkg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780093347; c=relaxed/simple; bh=JEuQL2RJL9RfwrvEv1c547OKbPPTm0o029ut/0JwHsU=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=lL1ZHAwQnyVTd7GYhOPc4Dz+hyS+2bjgzVRtjDPglZdBH9vjz7pqbOvYrIv+X8tWE9oD6fpCxsZobQgJ0XgN/9d7lyaWBrLGjRko1SsMJWLWNqLRApiZYAPCCVA8YwVlO8yfXTBLQHcgeVRR6GTfJJzVe4f+JBga6FAe2aOL+jE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=SEiSm7a6; arc=none smtp.client-ip=209.85.221.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="SEiSm7a6" Received: by mail-wr1-f68.google.com with SMTP id ffacd0b85a97d-45ef1198766so701692f8f.0 for ; Fri, 29 May 2026 15:22:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1780093345; x=1780698145; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=ELmzuHQxMU1Wo0i+tJpd+1vni6BbbsF517DJDCEMeA0=; b=SEiSm7a68iSpsewPY8aLbRVmU2xbfSR+q1qOh1WLvNLJftVz7ZlW7fZdXY10jWbFgY DYCNwIk2SFOT4nIyywd/zHmdg2cuNLl7W5iyAeCP744pA1UR9ZPtE0gxNv8enW5LpPDM EmZDhxTenDrSCaBCtrHbfhW89ZNazY6/T9V0KTu6k4WR7pI4G071N/LbD02qSYUP809J vpAINPq1Hc5k8fzWjUUikPkG05ab2pxwiP3jQTETA2PqKRywMhrS889yMzcn0I1JrKyW 7cP8PdPiFkQVtxcPjAxqJI6bf0kBskx8+zJPGBiOzxP5EvQdFuI7PS85tqdrhGr2SmoE jkpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1780093345; x=1780698145; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=ELmzuHQxMU1Wo0i+tJpd+1vni6BbbsF517DJDCEMeA0=; b=OUjpA+d4ENvE7SyJZ3rcM5rCc2qNbubMvDSkpsu4N1sadD8ovG8e8wY7dYb5h6pY7q RiW+dIKnQ+Xsql1xF64TWVdliZ9J5DlLNiSfoeoLOJCuQz/bxNOoTp+8l6DO3tSiBdDC fVVwqP2hF6n9Ps9uid26G7W/VBUsBExMz+3fwdUNKXmice/46LwmkdRKEBOm1xk25cIr PJwsQX1b2Y9eSO2ETzC77B6V9Rvcsn9PdqvAl2JNH0f+lwtBRenmiqpLVsbfovYZB9kk X21Ys9v4K2GXnYCkpFf5D0P8Ou5gc9GvrMZscaYTkbTfCTbu0CxDFNbM1uL+MNHwjNy9 fHgA== X-Forwarded-Encrypted: i=1; AFNElJ9rLr5RbowQksGXSep08pfGqoOjkJR/3AiKojgK4YVpnLIKJbFOh/ApaQRrsKSs//RG+n7VwC60f7wo6nw=@vger.kernel.org X-Gm-Message-State: AOJu0YzGyHwT0PeAHDZ+G5L61Tcgtw5nFVUqZZLcf4jsBHRZu7GoOF2P yYVFFpWrud/7tkYp3syuqluEg3Xq9LsC2YYHX20bdE4plENhS6K24dLu X-Gm-Gg: Acq92OHUZCHcYcmUg7ttGciFeU2c/AlejTxhSrtq9XyKaQZzKXXinGcyucOkUIDlMjb uA8HsDuT7wHOibsoazylnG3+vvNKu4xD7yH7MIBeGL8jRdy1BgX0udsSSckg+TxyMQgzKdJIAq+ CcTCOVQzUrwRgKy7NVa8Xir85XXEO7gKR2BpxSXugcwMro94Jw5Ya6Czl/Nj199BHVZB5z2z4+o bp6jDFi6h5ZGqInNZg/Jm6gzwtcFJnF5zNQ877g2p9epcqcvTBvYy2/4wpYRXGu0Mzs9milNYKA HZUurl06Nm7GR45If0F3i2KNlMJHIngBwf9mb9tLapXjoCJefgN/rOi/3L0kpO4mffk3Oi4kc16 GvMZdrNsKKrCYjlFiOhlUBYayzobK7mSZDYlbL2uaq6fMbGQ43KDFQQTch37r57reSBpoAIjOnW 3fSFnrdeHapPjPuXUMwUYg+P8lZh86XX1uREjjcuzvnc6Ijh+GaRxC+rDqdK2GWcXrxg== X-Received: by 2002:a05:6000:1869:b0:45e:8ad3:86a9 with SMTP id ffacd0b85a97d-45ef13397a5mr7475761f8f.8.1780093344577; Fri, 29 May 2026 15:22:24 -0700 (PDT) Received: from machine (host-176-37-220-32.b025.la.net.ua. [176.37.220.32]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45ef354b5bdsm6068735f8f.21.2026.05.29.15.22.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 May 2026 15:22:23 -0700 (PDT) From: d3z-the-dev To: Even Xu , Xinpeng Sun , Jiri Kosina , Benjamin Tissoires Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Abhishek Tamboli , Sakari Ailus , d3z-the-dev Subject: [PATCH] HID: intel-thc-hid: intel-quickspi: reset touch IC on system resume Date: Sat, 30 May 2026 01:22:10 +0300 Message-ID: <20260529222210.1532876-1-d3z.the.dev@gmail.com> X-Mailer: git-send-email 2.54.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On the Surface Pro 10 (Meteor Lake) the touchscreen stops working after a suspend/resume cycle and only recovers after a reboot. The driver logs "GET_DEVICE_INFO: recv failed: -11" on resume. The touch IC loses power during system suspend (s2idle) on this platform, the same way it does across hibernation. quickspi_resume() only restores the THC port, interrupts and DMA and sends a HIDSPI_ON command, assuming the touch IC kept its power and state. When it has actually lost power the HIDSPI_ON command is never acknowledged and the descriptor read fails, leaving the touchscreen dead until the module is reloaded. quickspi_restore() already handles this for hibernation by running reset_tic() and reconfiguring the THC SPI/LTR settings. Make quickspi_resume() do the same: quiesce interrupts, re-select the THC port, reconfigure the SPI input/output addresses and read/write parameters, run reset_tic() to re-enumerate the device and restore the LTR configuration. Tested on a Surface Pro 10 across multiple s2idle suspend/resume cycles. Link: https://github.com/linux-surface/linux-surface/issues/1799 Signed-off-by: d3z-the-dev --- .../intel-quickspi/pci-quickspi.c | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c b/driv= ers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c index f669235f1883..d59278a3e5c1 100644 --- a/drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c +++ b/drivers/hid/intel-thc-hid/intel-quickspi/pci-quickspi.c @@ -780,24 +780,54 @@ static int quickspi_resume(struct device *device) if (!qsdev) return -ENODEV; =20 + ret =3D thc_interrupt_quiesce(qsdev->thc_hw, true); + if (ret) + return ret; + ret =3D thc_port_select(qsdev->thc_hw, THC_PORT_TYPE_SPI); if (ret) return ret; =20 + thc_spi_input_output_address_config(qsdev->thc_hw, + qsdev->input_report_hdr_addr, + qsdev->input_report_bdy_addr, + qsdev->output_report_addr); + + ret =3D thc_spi_read_config(qsdev->thc_hw, qsdev->spi_freq_val, + qsdev->spi_read_io_mode, + qsdev->spi_read_opcode, + qsdev->spi_packet_size); + if (ret) + return ret; + + ret =3D thc_spi_write_config(qsdev->thc_hw, qsdev->spi_freq_val, + qsdev->spi_write_io_mode, + qsdev->spi_write_opcode, + qsdev->spi_packet_size, + qsdev->performance_limit); + if (ret) + return ret; + thc_interrupt_config(qsdev->thc_hw); =20 thc_interrupt_enable(qsdev->thc_hw, true); =20 - ret =3D thc_dma_configure(qsdev->thc_hw); + /* The TIC may lose power across system suspend, reset it to recover */ + ret =3D reset_tic(qsdev); if (ret) return ret; =20 - ret =3D thc_interrupt_quiesce(qsdev->thc_hw, false); + ret =3D thc_dma_configure(qsdev->thc_hw); if (ret) return ret; =20 - if (!device_may_wakeup(qsdev->dev)) - return quickspi_set_power(qsdev, HIDSPI_ON); + thc_ltr_config(qsdev->thc_hw, + qsdev->active_ltr_val, + qsdev->low_power_ltr_val); + + thc_change_ltr_mode(qsdev->thc_hw, THC_LTR_MODE_ACTIVE); + + qsdev->state =3D QUICKSPI_ENABLED; =20 return 0; } --=20 2.54.0