From nobody Sat Feb 7 06:48:59 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 9A45C342CA9; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; cv=none; b=dXXi7gHOziEWBEoZ3Kdv5MCuCKU9GB8tZOGhF8O5GhtbWiFndVb6DHA5MqBts0PXk6Oyi2A+fYYNYyEjU3CPQ2pd/wJeH+Tk+889ot2qDM5p9ka5Drt4maFQ/unjBkct1o7fRMxIeotKVl+V6BCEgK9Bq+XxagwU6ItPebDMCMs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; c=relaxed/simple; bh=l8dgGOvyViKqNA3K9WF/sqEXyiSpx66TJOe5rYc67ns=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CvalRX7zpJhNk0V+CBYsRffmXgQlOp3oNryphw7AScnp6AlMUJGOMxbs9cPGNXQxYgoQgEpfcM6Q7JFUTrDdVaoRhGOgUYvMPjklj6IQfrqvG5iwf8GfF0j6b6xbsbaFuaKy9X0wMxPfM3DP+YainlmKRxYJn1SVUrZMeppejQE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=J/V3HHKy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="J/V3HHKy" Received: by smtp.kernel.org (Postfix) with ESMTPS id 1536DC2BCB1; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=l8dgGOvyViKqNA3K9WF/sqEXyiSpx66TJOe5rYc67ns=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=J/V3HHKymqrGdGrAzH2tAloc1EKCaVBLZrcbkfZ8EBAnhY7l6Q/34tnsDpAzBfsdU KVKsmgTtPu2IIWbhURRJT6cHgDZjKj7bTVM066JUUgnew+yUfsPQdbnEDRJ6QdzmXJ SHm9yuhu4b91qS6UxzdG4rVy93uLl7/kXoEp8KUOjdwNrntkjLBtsiyD8joVT0sR13 R7SbseBTdVyJuFORpG47s6jJDsVEU0EEAm1seOdt9SlDgpF6Pn2u0oalUACzOElNdX JMjsB98laneU71Kgt/9s8kxF9eWd+cqL7Pb7xa9LWidHfonIH523y/gdK3s21aw+pR 0oc1OIbajPlAg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC14FCD8C9B; Thu, 13 Nov 2025 16:31:06 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:30:57 +0100 Subject: [PATCH v6 1/7] dt-bindings: input: syna,rmi4: Document syna,rmi4-s3706b 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: <20251113-synaptics-rmi4-v6-1-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg , Krzysztof Kozlowski X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1250; i=david@ixit.cz; h=from:subject:message-id; bh=rwhOCivbUtBWH/U4u1pSZSbkJP3diksC8GrYstkJ/kY=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJgCxB6SQi0xX/lkiQ5kGvuMriLATNx2Ns9 QscwJ08Ne+JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg ctZhD/9d44CoZsa81vrG2ivCjGlQHv07MqgyoatoEJfcpFVJX4cV1PGQsver1FIxFEaHZth9+D2 zVgBhZt2aOmpEGyjyh8zwMq+jgm20qL5CxrURRG2NU464ZKxIzyPrNLng+K/tELMxgYdetaBFXx 6wL97x6zgb2iPFVIIBCceuXWoLe1w8gBktSF6EM4xXxvCwF0ZWbWsQajS0cNO8CSKiT/4oDVegc tyCATT/4v0xWTYccky22IPfH85TtlmxuwlE9OhM/je2Ql51DEqvu9lXumRSUssXGP78siZNhNEe wgr7202+5aTGCRq0W6AvQMq46K+oGcNj+GiFKMHz9qiAKnDHydvsl+I1QW2N0oZbYWjrQx1Uedn ZWjxFtvb5qRb32+IbGh2XOkXOpMj4wch6HIX1AWPknsLuJANzWrSaVsh1YK2llZOAmrI+FNsbVn rQUMJ93I7IRBMmtkeLIl/15lLL6f71f5mbX3marfMadlIlItO4SSpmcIfcQ+e0ft3IEfX6RLFfR 0PdG3K4HULDm/VV+7Al9KXesZA0b63DvaL6Y/bpYzlydE8Nx20PVtRYXm+MRxfIPTKTmyJfEy1A 4oa56CbHwbzT/+3H+VsyOuOyCBCSRAXC2t0SEpqwCRiGlU29KO1CSwF/JoZZfOUXQQaJRU7b1X4 +Xl451tqRjgqxhg== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: David Heidelberg Mostly irrelevant for authentic Synaptics touchscreens, but very important for applying workarounds to cheap TS knockoffs. These knockoffs work well with the downstream driver, and since the user has no way to distinguish them, later in this patch set, we introduce workarounds to ensure they function as well as possible. Acked-by: Krzysztof Kozlowski Signed-off-by: David Heidelberg --- Documentation/devicetree/bindings/input/syna,rmi4.yaml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/input/syna,rmi4.yaml b/Docum= entation/devicetree/bindings/input/syna,rmi4.yaml index f369385ffaf02..e0e006c9c9ee4 100644 --- a/Documentation/devicetree/bindings/input/syna,rmi4.yaml +++ b/Documentation/devicetree/bindings/input/syna,rmi4.yaml @@ -18,9 +18,14 @@ description: | =20 properties: compatible: - enum: - - syna,rmi4-i2c - - syna,rmi4-spi + oneOf: + - enum: + - syna,rmi4-i2c + - syna,rmi4-spi + - items: + - enum: + - syna,rmi4-s3706b # OnePlus 6/6T + - const: syna,rmi4-i2c =20 reg: maxItems: 1 --=20 2.51.0 From nobody Sat Feb 7 06:48:59 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 9A381340D9D; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; cv=none; b=aYenA+GnjsabZWvc5NploskrwGjiBKc2QVQ8viUl4Z3hkWFHHU8ab+SFXt13UkbJ5rVsyHwiQobpl2EaSG4J2wUFgjCshYpRtecUzrQcA5+FI6MsGEKvJsVRmKl+lnID+5aJgHBtiQr90b/0sb6GkdZown0T+ALdehhQ477xuEI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; c=relaxed/simple; bh=2edXeF3pBE0VCrUWK6n2lu8ilUcOdB96yNFMEaBy8iA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gpOqAVDOax5WW60XYyTY21EdK/Z2bK6YyvYdq1LdI91dwXiIfh73yA5e8Sz5HY3CXNw3R867VOHLQdRS7HqwJS98Ni846+2Cok4qTI8FLxf6aUSw6ThUAKa2YkGPo7tQQTzUrSZ9lNaUk28XORS5giOZQWw5yELlh1OnuojMmk4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jaQmXL91; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jaQmXL91" Received: by smtp.kernel.org (Postfix) with ESMTPS id 2E9BDC4AF10; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=2edXeF3pBE0VCrUWK6n2lu8ilUcOdB96yNFMEaBy8iA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=jaQmXL913Z/duPpaVmRwALL6UReweG9+PH/KlAzqoVZbmv4NKCBoSABPP8KOhoi5K x+XD8+TbN46ggq+Rv4V/XVgZkDQ2gTydx+CJoIMumaCzLh2MB7oh7kUQaC23ltVIh/ oqX2amIPjRXPdPBhc9OP1v0Y8nb2EWD06kTKE0V7yiMxOv7pHS+fFm8d7sHEEzwdia 2TrPBVZ/yPG/ahhyaHLmUphyXxqZ/RUXPo6eN5FuRVowxja/LbAuMd42xUgMpvNKQu DXG+9SHC1Hn10yuaHdmlpyqV/K5SL9EsJNrPiDIXsRVDTazLMFe87ELnGC8Z39BcFQ xPpZEBc03mABQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AA56CD8C9F; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:30:58 +0100 Subject: [PATCH v6 2/7] Input: synaptics-rmi4 - handle duplicate/unknown PDT entries 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: <20251113-synaptics-rmi4-v6-2-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3801; i=david@ixit.cz; h=from:subject:message-id; bh=rliu2o1Qi+yRFW5F3I2c3wcFpPklta5P0+6DRK0ldac=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJeOSYhfUMq7mVpPYA/XeG6xgS96jdaH7ob tHPsyq0arOJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg cvezD/4zIuF6unpnrHSqNqBDOIVW6CO+asX7mkH/lY8huLjzsELND77BstAH92ucV09TDRR2wHD J8WfpxDv3od8m3WTd2uGSuZkqRmHUWQl5CqIHoKBk/pXbvX8ueeI14/RV8YTAvMyexjEZEEPSLJ VKWjrEbN5r07XL82CvWbvYqRj4pLkkujF9JuG69YUP5mLUsBHfNvS2aax0bXnhoUgTjswxw/QqQ dnZYgIe254VDLAkhV1JxkM3mgCDmDB7FCMYa35TT//DBh0XWtdQrn4nySRUB8nB0ozxohUXrlLm lHQ3oYhKbwNBOc0LjHp1E30h1NzY6jHW5kzjp89zjmqv86zl2GkpsaKZCes4ueyZ34abgSfPqs5 lX4NCxtpOg4/H8q/Z/f0eiElo7KE4T84ddNQvOORZBBC5Cg1cRgA6xV1By/SHRFrVwWlvsuir5j TBU2Cvy0rdPAHj9ddcVgjr83XUAx/yiEoiGMlm/zoBFIVK9FdL+KYZvr0fiYq6brlIcGIEE8lB9 1stVRzP2kGqkOGRtYuEzmB2fVqVKDRkaBHS0VOiCWfMqUbTRA1IFrdDcucIT2CYUSLdFeABlWs4 Dnvcy8PSaKTe+jenPrGawRIJ+hUGCoihD7BFLc/EmJ1U3haV/Ll1uVozfQGUDniA4G5SLMHeSzH rwdmJta/wB5COUA== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Casey Connolly Some third party rmi4-compatible ICs don't expose their PDT entries very well. Add a few checks to skip duplicate entries as well as entries for unsupported functions. This is required to support some phones with third party displays. Validated on a stock OnePlus 6T (original parts): manufacturer: Synaptics, product: S3706B, fw id: 2852315 Co-developed-by: Kaustabh Chakraborty Signed-off-by: Kaustabh Chakraborty Signed-off-by: Casey Connolly Co-developed-by: David Heidelberg Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_driver.c | 42 +++++++++++++++++++++++++++++++++++--= ---- drivers/input/rmi4/rmi_driver.h | 8 ++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_drive= r.c index ccd9338a44dbe..c7d2f68e65487 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -494,12 +494,39 @@ static void rmi_driver_copy_pdt_to_fd(const struct pd= t_entry *pdt, fd->function_version =3D pdt->function_version; } =20 +static bool rmi_pdt_entry_is_valid(struct rmi_device *rmi_dev, + struct pdt_scan_state *state, u8 fn) +{ + switch (fn) { + case 0x01: + case 0x03: + case 0x11: + case 0x12: + case 0x30: + case 0x34: + case 0x3a: + case 0x54: + case 0x55: + if (state->pdts[fn] =3D=3D true) + return false; + break; + default: + rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, + "PDT has unknown function number %#02x\n", fn); + return false; + } + + state->pdts[fn] =3D true; + state->pdt_count++; + return true; +} + #define RMI_SCAN_CONTINUE 0 #define RMI_SCAN_DONE 1 =20 static int rmi_scan_pdt_page(struct rmi_device *rmi_dev, int page, - int *empty_pages, + struct pdt_scan_state *state, void *ctx, int (*callback)(struct rmi_device *rmi_dev, void *ctx, @@ -522,6 +549,9 @@ static int rmi_scan_pdt_page(struct rmi_device *rmi_dev, if (RMI4_END_OF_PDT(pdt_entry.function_number)) break; =20 + if (!rmi_pdt_entry_is_valid(rmi_dev, state, pdt_entry.function_number)) + continue; + retval =3D callback(rmi_dev, ctx, &pdt_entry); if (retval !=3D RMI_SCAN_CONTINUE) return retval; @@ -532,11 +562,11 @@ static int rmi_scan_pdt_page(struct rmi_device *rmi_d= ev, * or more is found, stop scanning. */ if (addr =3D=3D pdt_start) - ++*empty_pages; + ++state->empty_pages; else - *empty_pages =3D 0; + state->empty_pages =3D 0; =20 - return (data->bootloader_mode || *empty_pages >=3D 2) ? + return (data->bootloader_mode || state->empty_pages >=3D 2) ? RMI_SCAN_DONE : RMI_SCAN_CONTINUE; } =20 @@ -545,11 +575,11 @@ int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ct= x, void *ctx, const struct pdt_entry *entry)) { int page; - int empty_pages =3D 0; + struct pdt_scan_state state =3D {0, 0, {0}}; int retval =3D RMI_SCAN_DONE; =20 for (page =3D 0; page <=3D RMI4_MAX_PAGE; page++) { - retval =3D rmi_scan_pdt_page(rmi_dev, page, &empty_pages, + retval =3D rmi_scan_pdt_page(rmi_dev, page, &state, ctx, callback); if (retval !=3D RMI_SCAN_CONTINUE) break; diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_drive= r.h index e84495caab151..a4ae2af93ce3a 100644 --- a/drivers/input/rmi4/rmi_driver.h +++ b/drivers/input/rmi4/rmi_driver.h @@ -46,6 +46,14 @@ struct pdt_entry { u8 function_number; }; =20 +#define RMI_PDT_MAX 0x55 + +struct pdt_scan_state { + u8 empty_pages; + u8 pdt_count; + bool pdts[RMI_PDT_MAX]; +}; + #define RMI_REG_DESC_PRESENSE_BITS (32 * BITS_PER_BYTE) #define RMI_REG_DESC_SUBPACKET_BITS (37 * BITS_PER_BYTE) =20 --=20 2.51.0 From nobody Sat Feb 7 06:48:59 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B05073431F2; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; cv=none; b=ZYMIb7IqalQYpYBs+BrMzFrGYOIOmrN4oOOHmNKBjvNXH+l1T4epDJbH7s3iLEk9lZnsV4Ji48u5yRljJmY8zOnZIb6YqRNOy1j3Zs094w8N3xQwhrVONZoXUM5+yXWcoDlWI3Iq9SN1ErovY25guhmrFJiPxuRrGBr3mDI0aoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; c=relaxed/simple; bh=b5gXFqN7f5GJJUwhRPlPi7ZdTCLQZtsq3U/PN4qzOJQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cP3u3/DiI4wEqqxcQAKE7nL/zPRM+E6VnDRKl5r/sclrKfd9whx3xDe75ntuhqClG/n0AqPKczpZm6T8oyIV96qhdkPP0UPyZK70Np6bOP7vdPTzI+lsmro+5rhyhuDTVEAiezkFMCSVQydlxvZwryOERPTg2BpKSdLa/m/MNzE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hfKn135R; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="hfKn135R" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3D94DC2BC86; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=b5gXFqN7f5GJJUwhRPlPi7ZdTCLQZtsq3U/PN4qzOJQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=hfKn135RXFnMH+kfjbqZa3sGBaAi4fBNPGOkFSRG9lVQtyrYWKtT5URSHQj/iTQ6R 8Edl6tDjAoiSX/l+9c75c/4TIHHFlRpkVw7BjDbpsI4gJhr/JWlhZvPxqWX1j2p36c xbdh0CDaj8pUdE0w6y+shWRVKJMHzcU5VAZiMN6nKudPCafl6FfNjfpZCuz+G61KfC BGLnf4GdrKf/WrKi3lNwJz+Xo1EjeqLgEfA2XF9KqCuhMQBsnruAGK7918Nai8MqZG gFE4WDFS47f16SKgfOHyflIYH+z3WNL/24w+YY7Sza30dPjuThwbFiQl7CCiLbtvVC cBDE6/Fn0/9/w== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18EA7CD8C9E; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:30:59 +0100 Subject: [PATCH v6 3/7] Input: synaptics-rmi4 - f12: use hardcoded values for aftermarket touch ICs 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: <20251113-synaptics-rmi4-v6-3-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6187; i=david@ixit.cz; h=from:subject:message-id; bh=z4vNak61Csdv72X5cclFvPznjgvEQ7qek08VaFKSy5o=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJ9RsTOGL/7aFP5DJDkQrF+bmdhMZEK+sGR RcvervwciGJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg cjh1D/9Pb7gtmsTwUgxCAGahj44SIELknRsDnTicsYeU/blo7RxBcJhWiq9aipUPbm3D53J7QAq ZAvLN093RGqY40qm49u+Csez+DK0wpwknJ3nMqGh1U162DokO94nBTxBalnyJE/uQu8UOmOBRmI rzgs+LaSTEjgmkQL2Xadxv3GZeOJTLZaU8R/D2tRbQROplisvjsFmrekRhzqtBzb91VR5pUNyJb aJNmEppB1u6VlBGqdvH/5KzocMRFK2DZr4P0oYI2INUGBYJtBVfxDGRO1PcqVBiPqoPJX2ljTRo DRP+aOWloyJnOUoOuF3RwXOPtUnP5ZwUajbHo3FB4RfFWxpDW9+3GqatPfVDsTl4Qg5DBVCDfHj NUI93B2SnJaE1Voi3LNa9xknTYutkC3oNjjaCOjJBQ4f5J5w5PmL3WG/dBfkpE7V1kvR40bwMKR 2zekYlD/+43lbUNUw6uSXg5id92EM6f7SU6/gDGLz1HG68phMfC7z6NwR4Z+ceZRdngDmhOGLVj Xgpc54fMrMW1VncR8F0AOOkPxPJ/exFHGFQ70KhNkYCPiD/IUN+Vx69Md3caMkRw5Rb91k61vhA /Hbk0i05uRRktF/OJ4lZ6VF9vSFjxXSQYuOhgijKzbzz4J/fgIpvMuuJgityts/bSBiMde+QKlA HkNX8sDR2e2httw== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Kaustabh Chakraborty Some replacement displays include third-party touch ICs which are devoid of register descriptors. Create a fake data register descriptor for such ICs and provide hardcoded default values. It isn't possible to reliably determine if the touch IC is original or not, so these fallback values are offered as an alternative to the error path when register descriptors aren't available. Signed-off-by: Kaustabh Chakraborty [changes for readability / codeflow, checkpatch fixes] Signed-off-by: Casey Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_f12.c | 117 +++++++++++++++++++++++++++++++++------= ---- 1 file changed, 91 insertions(+), 26 deletions(-) diff --git a/drivers/input/rmi4/rmi_f12.c b/drivers/input/rmi4/rmi_f12.c index 8246fe77114bb..1a103cc5f2235 100644 --- a/drivers/input/rmi4/rmi_f12.c +++ b/drivers/input/rmi4/rmi_f12.c @@ -218,6 +218,41 @@ static void rmi_f12_process_objects(struct f12_data *f= 12, u8 *data1, int size) rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i); } =20 +static void rmi_f12_set_hardcoded_desc(struct rmi_function *fn, struct f12= _data *f12) +{ + struct rmi_2d_sensor *sensor =3D &f12->sensor; + struct rmi_register_desc_item *reg_desc; + + /* We have no f12->data_reg_desc, so the pkt_size is 0, override it with + * a somewhat sensible default (this corresponds to 10 fingers). + */ + sensor->pkt_size =3D 88; + + /* + * There are no register descriptors to get these values from. + * We set them to high values to either be overwritten by the clip + * properties from devicetree, or to just not get in the way. + */ + sensor->max_x =3D 65535; + sensor->max_y =3D 65535; + + /* + * Create the Data1 register descriptor so that touch events + * can work properly. + */ + reg_desc =3D devm_kcalloc(&fn->dev, 1, + sizeof(struct rmi_register_desc_item), GFP_KERNEL); + reg_desc->reg =3D 1; + reg_desc->reg_size =3D 80; + reg_desc->num_subpackets =3D 10; + + f12->data1 =3D reg_desc; + f12->data1_offset =3D 0; + sensor->nbr_fingers =3D reg_desc->num_subpackets; + sensor->report_abs =3D 1; + sensor->attn_size +=3D reg_desc->reg_size; +} + static irqreturn_t rmi_f12_attention(int irq, void *ctx) { int retval; @@ -338,6 +373,40 @@ static int rmi_f12_config(struct rmi_function *fn) return 0; } =20 +static int rmi_f12_sensor_init(struct rmi_function *fn, struct f12_data *f= 12) +{ + struct rmi_2d_sensor *sensor =3D &f12->sensor; + + sensor->fn =3D fn; + f12->data_addr =3D fn->fd.data_base_addr; + + /* On quirky devices that don't have a data_reg_desc we hardcode the pack= et + * in rmi_f12_set_hardcoded_desc(). Make sure not to set it to 0 here. + */ + if (!sensor->pkt_size) + sensor->pkt_size =3D rmi_register_desc_calc_size(&f12->data_reg_desc); + + sensor->axis_align =3D + f12->sensor_pdata.axis_align; + + sensor->x_mm =3D f12->sensor_pdata.x_mm; + sensor->y_mm =3D f12->sensor_pdata.y_mm; + sensor->dribble =3D f12->sensor_pdata.dribble; + + if (sensor->sensor_type =3D=3D rmi_sensor_default) + sensor->sensor_type =3D + f12->sensor_pdata.sensor_type; + + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: data packet size: %d\n", __func__, + sensor->pkt_size); + + sensor->data_pkt =3D devm_kzalloc(&fn->dev, sensor->pkt_size, GFP_KERNEL); + if (!sensor->data_pkt) + return -ENOMEM; + + return 0; +} + static int rmi_f12_probe(struct rmi_function *fn) { struct f12_data *f12; @@ -351,6 +420,7 @@ static int rmi_f12_probe(struct rmi_function *fn) struct rmi_driver_data *drvdata =3D dev_get_drvdata(&rmi_dev->dev); u16 data_offset =3D 0; int mask_size; + bool hardcoded_desc_quirk =3D false; =20 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__); =20 @@ -365,9 +435,9 @@ static int rmi_f12_probe(struct rmi_function *fn) ++query_addr; =20 if (!(buf & BIT(0))) { - dev_err(&fn->dev, - "Behavior of F12 without register descriptors is undefined.\n"); - return -ENODEV; + rmi_dbg(RMI_DEBUG_FN, &fn->dev, + "No register descriptors defined for F12, using fallback\n"); + hardcoded_desc_quirk =3D true; } =20 f12 =3D devm_kzalloc(&fn->dev, sizeof(struct f12_data) + mask_size * 2, @@ -375,6 +445,8 @@ static int rmi_f12_probe(struct rmi_function *fn) if (!f12) return -ENOMEM; =20 + dev_set_drvdata(&fn->dev, f12); + f12->abs_mask =3D (unsigned long *)((char *)f12 + sizeof(struct f12_data)); f12->rel_mask =3D (unsigned long *)((char *)f12 @@ -393,6 +465,18 @@ static int rmi_f12_probe(struct rmi_function *fn) f12->sensor_pdata =3D pdata->sensor_pdata; } =20 + sensor =3D &f12->sensor; + + if (hardcoded_desc_quirk) { + rmi_f12_set_hardcoded_desc(fn, f12); + + ret =3D rmi_f12_sensor_init(fn, f12); + if (ret) + return ret; + + goto skip_register_desc; + } + ret =3D rmi_read_register_desc(rmi_dev, query_addr, &f12->query_reg_desc); if (ret) { @@ -423,29 +507,9 @@ static int rmi_f12_probe(struct rmi_function *fn) } query_addr +=3D 3; =20 - sensor =3D &f12->sensor; - sensor->fn =3D fn; - f12->data_addr =3D fn->fd.data_base_addr; - sensor->pkt_size =3D rmi_register_desc_calc_size(&f12->data_reg_desc); - - sensor->axis_align =3D - f12->sensor_pdata.axis_align; - - sensor->x_mm =3D f12->sensor_pdata.x_mm; - sensor->y_mm =3D f12->sensor_pdata.y_mm; - sensor->dribble =3D f12->sensor_pdata.dribble; - - if (sensor->sensor_type =3D=3D rmi_sensor_default) - sensor->sensor_type =3D - f12->sensor_pdata.sensor_type; - - rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: data packet size: %d\n", __func__, - sensor->pkt_size); - sensor->data_pkt =3D devm_kzalloc(&fn->dev, sensor->pkt_size, GFP_KERNEL); - if (!sensor->data_pkt) - return -ENOMEM; - - dev_set_drvdata(&fn->dev, f12); + ret =3D rmi_f12_sensor_init(fn, f12); + if (ret) + return ret; =20 ret =3D rmi_f12_read_sensor_tuning(f12); if (ret) @@ -543,6 +607,7 @@ static int rmi_f12_probe(struct rmi_function *fn) data_offset +=3D item->reg_size; } =20 +skip_register_desc: /* allocate the in-kernel tracking buffers */ sensor->tracking_pos =3D devm_kcalloc(&fn->dev, sensor->nbr_fingers, sizeof(struct input_mt_pos), --=20 2.51.0 From nobody Sat Feb 7 06:48:59 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 C9B4E34677F; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; cv=none; b=JJnt0SqO4Z3oxUk/oT38RV0bxzd58TxOldtGihY6z1ITla3CrXYP8F/3QuyoPor9rtrTuK1GGXZ3Xpyi7TeuoeEsUNXeuVUOagVIZ/fNofMAiPr/Bt9bpBxLYDmC75cBYdrXgU6lLGZrJa3SofShUC5f7/OH07JUd7g7FmJHECk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; c=relaxed/simple; bh=2UCSydAiM1loDg7uxsyGXgKfm4vSd18iycXMBv+hpi4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VeQpy4cvJO3EYKfGUuT6gmZIIxh3Tqlv7kN88YAipTTcHhU7g4wbnrP9HgA10cEfMl89MVFbQ+gQ+YGCu/+iK6tuXwekDMCakEI4hirtZ3/hFZ8BXoY5W+GRZ29nD7BaKj/v2xO+aeFETepc1hVjs2RTr6OX2HGgRGgu2QUBtps= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=IGvEy4hd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="IGvEy4hd" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4614CC19423; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=2UCSydAiM1loDg7uxsyGXgKfm4vSd18iycXMBv+hpi4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=IGvEy4hdL2q6Jks+L/ngbRe8IO8uBnGApKb2n1FLdjDwuG0azvbkjZF9TnKgFT1OE hJY+Cvp7mhCN7TQplbD8DVu3CjtqpB1OngQrVC2aX/NQc3OpkmeqAocWj0nT5ZetMJ fTYbk87NlNiaPo/7AbCBfBFN0upK73kbWEyvrdGj205AW7DW4OL/vuebku2if0xTys oNTLf8iwshElLP4vKYup9wm/dCqa9qW+Je76yISjvqJiw5Ozs8MI+pmSZv7S56T4Zn Mbx/VxY/rgKXFpcKnOY2FcsIGDAIy7JzDTaqiUFCyF6o7slhzyQmKGMai3Qa0pXEgM TzNC8HpzUlCtA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2B627CD8CA4; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:31:00 +0100 Subject: [PATCH v6 4/7] Input: synaptics-rmi4 - f55: handle zero electrode count 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: <20251113-synaptics-rmi4-v6-4-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1139; i=david@ixit.cz; h=from:subject:message-id; bh=3c7m3oCwzt57bdfzOwx4uaTuzzkZpYNYe5psNsQXnvw=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJcR4qe0+5DRKXSWW3W6rklEUP8UkSMOjdN Bapf6/wdZ6JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg cj79D/44yfCfEMxwOetB0IicsaWLthhNakP/wZaYrQtcOolPO+r+i6lLr+AgBowBgGim8HFT8da qPwLkNQvfvZLiTTenYTNGJ7p7aGhvEUtByPBO+L26Vym/GLYSIm/+6YXeRsyTCVXybn6kD278x/ Otr6n+ri0Ft652mo/6HNVhwA1z0Oi0yaDOCdwoC1QSHlnY2xHeUMDbqf6TS42AblRGFiMVI854D 5L0BjDvNlj4nPd7/a0YBOj1rOKeqS3VrCFfCYWH6KlWS51G9Y3drU19J8QdTGcVb1F4ZDgQsR0V RnYBEkjj2sGxGYnkv4aXJxv+hSxL/pZ0CiyAa4LS9Ymodmi4RAk1Ua9pCWLJNbzmXyioCZ/0gk7 l/SJnB6ZrUgz2X1GSMsVUSDFdhFnDMuNRLMAEZMzEGi4gbeah9pFqkWZR4eWTcblR1TUR+tOqd4 s7RTeUeaphrWbHbBK2itEQMuB5JkfsHblkiy9Sy3mO35zIWDtYPF9ZJNM7dL2BmDF79YDy5ddPn JAJTGbyU0o6sAyVvWY6MkX9G2jct925vKyU7RpVaBuCE3XBcPKiP6QU41h7VPygmPk3gg/P1XnF EO2jsew9yXrWKrxzucs9IvKLMLyrw3AXbJQwJteEZgz2p0wNTeH+WeJBwaOChrRPy4YH56CQxH+ xgeugKgDnjLseAg== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Kaustabh Chakraborty Some third party ICs claim to support f55 but report an electrode count of 0. Catch this and bail out early so that we don't confuse the i2c bus with 0 sized reads. Signed-off-by: Kaustabh Chakraborty [simplify code, adjust wording] Signed-off-by: Casey Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_f55.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/input/rmi4/rmi_f55.c b/drivers/input/rmi4/rmi_f55.c index 488adaca4dd00..776c915b82e72 100644 --- a/drivers/input/rmi4/rmi_f55.c +++ b/drivers/input/rmi4/rmi_f55.c @@ -52,6 +52,11 @@ static int rmi_f55_detect(struct rmi_function *fn) =20 f55->num_rx_electrodes =3D f55->qry[F55_NUM_RX_OFFSET]; f55->num_tx_electrodes =3D f55->qry[F55_NUM_TX_OFFSET]; + if (!f55->num_rx_electrodes || !f55->num_tx_electrodes) { + dev_err(&fn->dev, "%s: F55 query returned no electrodes, giving up\n", + __func__); + return -EINVAL; + } =20 f55->cfg_num_rx_electrodes =3D f55->num_rx_electrodes; f55->cfg_num_tx_electrodes =3D f55->num_rx_electrodes; --=20 2.51.0 From nobody Sat Feb 7 06:48:59 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 C6F03342C9E; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; cv=none; b=Nfk6EmNA1jf+qpYjSNDIevGt09rlVo463hbBH4YsBvH1vY8zyuiAsjbkiHPK0iw3LXFuoxSNn8qDoFY+EVP158d3oz6tzgT6FilTss/iCNwxzhGsPOtM1ZsBag2Nuap6Equxb306tu/aqJbSr8xZ1/KyoA/wy/haw/krNHI7+dU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; c=relaxed/simple; bh=hB+qqidyBXGuG7uEfU72EhcR3BlCA5Fqu/3ObAy7Go4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lH4Sy6eA5xSvyUXm+oQ8baecxFOZQMVXswBeoQuVLoRXopEnEGH0bx7Bod5DmkoQmft4TmFxTGpac1DQbelpkmAMOrtzS4l7PGwbSmAxZUUJOzJL0hR9LtI528hB2rW3hHZ0k9UgNaWrBKivbqXVROdKJHxdN7LAGIWPrMl2i4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NDr4XgcL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NDr4XgcL" Received: by smtp.kernel.org (Postfix) with ESMTPS id 58CD2C2BCB2; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=hB+qqidyBXGuG7uEfU72EhcR3BlCA5Fqu/3ObAy7Go4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=NDr4XgcLGPsK290SYdIGqob/9YyZZtygmgV9OY1sGDBxPZWfgmB7PAUPASgOsJccS ikrZV45VrVyu9xWXNL2eft+og2m3r14fNYIodPVxIoIbSfdMWYu8Uf04iT9fi0s7t5 vG112mEOcIogziv10GemVOBVTtHFia3J8VCp9gIeFYqCsz64PocBaQzRebQ+lnkeL2 iFDbjXkQv8g77rLOkQu+suWrfpO/u3X7j1sUh7kGipICgtS78653RYUSSmpRaHB0Yk rQ28Q8OsR66Z/jGkYnAr8pMxbt/bGb42rXlr0qTGyE+PReyVts3c4bH3HpoB7ARQkj du6/XHa3vsfAw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 39D60CD8CA6; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:31:01 +0100 Subject: [PATCH v6 5/7] Input: synaptics-rmi4 - don't do unaligned reads in IRQ context 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: <20251113-synaptics-rmi4-v6-5-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2420; i=david@ixit.cz; h=from:subject:message-id; bh=2jfYK2Qe0hjHg1A0n2fWZE+x/SealRrGZEErY3nogW8=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJyed9yL+cvKvJ4fbUVF5fvUPdCG7sJJw9Q tRujzGr7WWJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg cnJUEACjvg+R+3IThtsWYfsSlU44fwORQvlngD7TBE+p1lFPZakN2DZTgkPv/2v22gb2BIzTUsd kpoPmjnNmqiE/lS+PXpUdNGe3uyMGQseb1KMKxQxrXYKaaQ49Hcl8Ps9SBI+koGDlHPXSM0jIRC 0t1Aozmxm28FgCnNXbZymwJhOH5Dny4G5NjBOFx1zmF/tyFeoD3Hm1/xADwRR7KUSYh5PGOx2Lf p9Stis5wcPw2HafrfmJioR/X9AFD8OG5Xwc2uOVCr2YWJkK7c0SXdHkCTFackw9NByMtAuYz+Qk AO3ygrdPt349yc3gJRRxsXYgA3xoleIurxoIfk/t8BL2XpVbOj8kY5yNG7zbz/n9WhGjP6xnTJB w6CZHVv11mvoyvHJU5+W2s85zh/HnsXwLiAQISmRlDwsuuXksmA8IDuoh6fOurUVk9j/1y4GTNI Vv9FrnIxm6LEkcG9Xz/D1xJ+3w37D0KJsuzOl6tXBg/UhN6bPo37XE09VZDjTh5ecLrcBO4RRdd 7O4dtOvElE55k+lOIH9Uxeio4hIlnTyLQGR+4UOBovVJRv94h60hTpckcoccnWzRClozSP8sWO5 1PT5HtQGpb5MXcmcuCmIXgmOVy+EG25RLVqVTvHOZcyJiTJUNqHA75KXl+p5QWVPV+w72gc98eA 5a/UUakkugicMgg== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Kaustabh Chakraborty Some replacement displays include third-party touch ICs which incur a significant penalty (1-2 seconds) when doing certain unaligned reads. This is enough to break functionality when it happens in the hot path, so adjust the interrupt handler to not read from an unaligned address. Signed-off-by: Kaustabh Chakraborty Signed-off-by: Casey Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_driver.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_drive= r.c index c7d2f68e65487..93a190e333c66 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -137,9 +137,14 @@ static int rmi_process_interrupt_requests(struct rmi_d= evice *rmi_dev) return 0; =20 if (!data->attn_data.data) { + /* + * Read the device status register as well and ignore it. + * Some aftermarket ICs have issues with interrupt requests + * otherwise. + */ error =3D rmi_read_block(rmi_dev, - data->f01_container->fd.data_base_addr + 1, - data->irq_status, data->num_of_irq_regs); + data->f01_container->fd.data_base_addr, + (u8 *)data->irq_status - 1, data->num_of_irq_regs + 1); if (error < 0) { dev_err(dev, "Failed to read irqs, code=3D%d\n", error); return error; @@ -1079,16 +1084,17 @@ int rmi_probe_interrupts(struct rmi_driver_data *da= ta) data->num_of_irq_regs =3D (data->irq_count + 7) / 8; =20 size =3D BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long); - data->irq_memory =3D devm_kcalloc(dev, size, 4, GFP_KERNEL); + data->irq_memory =3D devm_kzalloc(dev, size * 4 + 1, GFP_KERNEL); if (!data->irq_memory) { dev_err(dev, "Failed to allocate memory for irq masks.\n"); return -ENOMEM; } =20 - data->irq_status =3D data->irq_memory + size * 0; - data->fn_irq_bits =3D data->irq_memory + size * 1; - data->current_irq_mask =3D data->irq_memory + size * 2; - data->new_irq_mask =3D data->irq_memory + size * 3; + /* The first byte is reserved for the device status register */ + data->irq_status =3D data->irq_memory + size * 0 + 1; + data->fn_irq_bits =3D data->irq_memory + size * 1 + 1; + data->current_irq_mask =3D data->irq_memory + size * 2 + 1; + data->new_irq_mask =3D data->irq_memory + size * 3 + 1; =20 return retval; } --=20 2.51.0 From nobody Sat Feb 7 06:48:59 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 060F5351FAC; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051468; cv=none; b=rbcpJa/LuAtB6xso5s10jHzVGYANEHp6OLlxWjm2tzMUU1xrBpfZmP0G8FBAOVgn5Wn4bpe0Br07Jnut0ddhPOSq7KKDkgs1OxhE0+hq9hSUtgFRBbpGHJMnolC7bXWm+nMbibEhARh7ywlXkOvY4r+YzQTW4sOGGyxqbP+UMGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051468; c=relaxed/simple; bh=0WO/jZHmjEuOWBwtHgbc9wuEqlLbCiO8pWpnq7ErWxY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nczkxbkueaJJA88OR1/mpsMNwAv9WzHBZPespXkjrF3uPF6+Hy8Xh/sf/Q2uSrslD+R9c9K5IXzs/tJgXUTNmGn9wiI1PG0NinIKWh8z3tTUxaLGtDFr+k7FoPGrDap2KCAPQ5G3tqbZ6Q8TE23rtjG+6CbE3W1s1I3bEcsq+jw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LQ4NzblF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LQ4NzblF" Received: by smtp.kernel.org (Postfix) with ESMTPS id 64E29C2BCB7; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=0WO/jZHmjEuOWBwtHgbc9wuEqlLbCiO8pWpnq7ErWxY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=LQ4NzblFPh/c5yI1lHr7LHNuAIuEuKwnQxYXyN6vCUlF6AXO6whHC2tclTFIs9iMv cfiCwFduKz6uIe1fBgWwB6doW0mBcbtdHF5p1m0i1/e+OzYxSM0snb1cY1aEaC4fuz EuoV39KnI65UJA1f0c6ztcCPUK+XbQsClrwlFCmPhiM6+kdDN2ydKOR/yQR7GmycRa rl0WbnT9z+6AGIcQm8BWMGw0y7Mdj2iu/54Mry9z7tw8X4Jleh/3moE4DIcNMgofzJ b5iavnXJj0A9IsxpChiL+YFGaM+Qn2+SebpnA0Fkep16Rlg9TFqLIbIw41E7fBkfrd vnI1d5xP8wQEA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47A73CD8CA8; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:31:02 +0100 Subject: [PATCH v6 6/7] Input: synaptics-rmi4 - read product ID on aftermarket touch ICs 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: <20251113-synaptics-rmi4-v6-6-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1203; i=david@ixit.cz; h=from:subject:message-id; bh=fdg+12tEzxS7iHUQg0vbJynpAJ6kRapCVogkHxp+sbM=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJJSUY09P6h/jPNxdHSCu3ss2AzYgdLsAQf 40kLo686jaJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg cqsOD/9THOF3+00OTbZkhaH5F7LZR7lng7MGQ59Ew3D+EuiaZ7sTjIWBF/om2rwFDqOS7ZsFzf7 mKWEI68HbXO5R5M38cOzsyolTb6Q+xdfp7MCUNKHNaCGn7tfrlSWFOYjb66PwZxUD4wTlpDFXL6 DAuhi73YTgp+Du2n9QiwRojTH0cZFicStU4l5aFS/efxUkAeKOYZEpa/FZMRUrLWPiUhGnuswee pdVizwYMloQKq+3+ziueGRPNSkySNFm9uuCY++zTIzyLbJWD0/bJzhUBF/ypvCMe3LlnHcGtq3J TU0IBXUi46h8y6GR9ocBlC30p1yreB2yXHTioYQSPOqSSDan6EIo0Gl1HBA5gEvVY0Nbl1y2udR bU0OWwuTdTQACXbL3XUZwmmOTGBXPMimsQkrflx3EtyctOPXdGIleMBr9EnNRW5MNXNIq8nPYIm qKdBqx78dHSqJAjEIxkHEK5jG/0DNsHBQkPWwIH37L5ANGUXA2NWyvEA7hsy8JVwwUjZPjHPiW4 dX+vBsXgUEdTFuMih5JJK0nZiYwys7rM9W3sg3/JbtFH93jkM9BkPX2jBN6YnWyGEzO2V3AyY9k 2Onxkmot4F3riXdRmIhIUdyWjTEMwyz4MvsqECpHEp3X2B1vGVMxuLyAck+5Bawiz+EX9mz3GtV nt3lTNcrD3oXYpQ== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Kaustabh Chakraborty Some replacement displays include third-party touch ICs which do not report the product ID correctly unless we read directly from the product ID register. Add a check and a fallback read to handle this. Signed-off-by: Kaustabh Chakraborty Signed-off-by: Casey Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_f01.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/input/rmi4/rmi_f01.c b/drivers/input/rmi4/rmi_f01.c index 47be64284b25e..2278e9b6a9207 100644 --- a/drivers/input/rmi4/rmi_f01.c +++ b/drivers/input/rmi4/rmi_f01.c @@ -250,6 +250,20 @@ static int rmi_f01_read_properties(struct rmi_device *= rmi_dev, } } =20 + /* + * Some aftermarket ICs put garbage into the product id field unless + * we read directly from the product id register. + */ + if (props->product_id[0] < 0x20) { + ret =3D rmi_read_block(rmi_dev, query_base_addr + 11, + props->product_id, RMI_PRODUCT_ID_LENGTH); + if (ret) { + dev_err(&rmi_dev->dev, + "Failed to read product id: %d\n", ret); + return ret; + } + } + return 0; } =20 --=20 2.51.0 From nobody Sat Feb 7 06:48:59 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 30D7D363C42; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051468; cv=none; b=bt5Fr+fwpGn7NINJMuywi4rpmZ8TGgDJTlNe877ga3GHL1+MwqSk8bPOrrAE9LvRTS//zNeKjv7V8hSOBr8CGM1roZea7fNukHTOCTEwExGxWR2aDTktfBHreyfG7PfwSbisIafw1rl1RQBVtbQvwEgJTONBpLxUa+3i2nsFQJM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051468; c=relaxed/simple; bh=ImsBrSsWCbftesE+Cb1PYnzgguu50ch+W6P48qu+dUI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZjCwsc/1MNKdFe/4P5nlTD1x5MG1zFE1vJm8eoodC0O0tfyKPGcf5YI/9qoeeGFBIOpqP4mQeym8oljoH/5UP0oDNgDl4f+9LTmhih1tv81kf3a/tzXK2okEOK8ynWX9mrM7SCAWuSuPAHb4GWUpu9CX4Ey5Wv3y47C68Ocy6Do= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qjxCpYfr; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qjxCpYfr" Received: by smtp.kernel.org (Postfix) with ESMTPS id 87BA8C2BCC4; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=ImsBrSsWCbftesE+Cb1PYnzgguu50ch+W6P48qu+dUI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=qjxCpYfrA+jv9Cs/yv229WgXJxRN+0rlmD69yl8QvZ+mQZUWi7J9/5KxAT//fNUpu Xqax7/rVDSDd372Dy60R8t+3UMZhlNTT7hNVug1DlxJLcsuvj7Se96Q4aE4M3eEhQn 4yo4wxAUEckApMesXY7cBeilI7CCmoemizq7I6Mo9fdGq3CnLxRWVSk059BjsOmQ3Y nW3FdeyKjLcKwvSEloJVp2RxBAgvCmi4yGycATT43pX1Ee4ftH4S+focUvYR9Q+LIO ks33tthtdECLMINZTMb3FOUzsvrkIFFeXitKbySepsCDjcWbh0QVMjiwoHKVasDp21 RATVEsFBFzg9Q== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59690CD8CA7; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:31:03 +0100 Subject: [PATCH v6 7/7] Input: synaptics-rmi4 - support fallback values for PDT descriptor bytes 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: <20251113-synaptics-rmi4-v6-7-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5650; i=david@ixit.cz; h=from:subject:message-id; bh=WDxThFuTW5xe6P2WYsbevC4RS4y/BvA9+hBHQwKvAJE=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJZS4oQt3CYBKaahhk76Gf+LJqmETicSXSh LQs/aKqEFaJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg cvTED/9o0xvCKweql1jKRZ1ltYvYsDJWnYgxmZAlbO0XL5K0kgJX4xvJ0w+7KZKwSJmREszyjMX uw4wiFyMxn3lSEJD1NEEbfk0qF8gvUv0rKCTzRTY3yx/gO1BLEMcTvxuLdqrQNAv9WI8xEGpGel HE9kS/SUf9sS+DNLRVsLn7eAfYzqBL+BCjqJrDA7Zs/CBh81ab0Wwvg33V8y0F/i6cX2lt5QpgW NcvwAtFqoJzPhrqupY929bQIdfCI2yOVyuRxmbqWOQmzBXr6U5bTDtiYupfqkIPgKr908J9JapP d0h+4SduEnHHrsN9yFdqU98I7skD9mNREUutvzedrAgG1V6QQsW4JpX+vHvLcKPJ5fXylXWlRs1 UKwVn7dd+6WuJtPydTizVEOykj2kdJ64/niTfW4OUbuJDRTaPS3gDhGt8eRLT903vtkW76JduQ6 9FYtjYimVc+Lh5VX7iHe0KaDZEsRii37wveTvUkdtuyVEOUqr75hXZSEHIlS0d3t8Bji9ZON21G Bo0oSBbn1lDKKoHs30i6G7j5bAVTHC/CS3N2yr06V/ltR2rIQF7raNI4EzXlfJSquXUElmbdeqT lX2yA5V0lsSpSp0V3plDF6vzv7YfsZbE7PXjtXy9tmwmn2RKA12WykfEmsWVy10kSfmyMay3ya6 Z/3zn38+y8pZZvw== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Kaustabh Chakraborty Some replacement displays include third-party touch ICs which do not expose the function number and the interrupt status in its PDT entries. OnePlus 6 (original touch IC) rmi4_i2c 12-0020: read 6 bytes at 0x00e3: 0 (2b 22 0d 06 01 01) OnePlus 6 (aftermarket touch IC) rmi4_i2c 12-0020: read 6 bytes at 0x00e3: 0 (2c 23 0d 06 00 00) Signed-off-by: Kaustabh Chakraborty [codeflow adjustments, checkpatch fixes, wording] Signed-off-by: Casey Connolly Co-developed-by: David Heidelberg Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_driver.c | 62 +++++++++++++++++++++++++++++++++++--= ---- drivers/input/rmi4/rmi_driver.h | 2 ++ include/linux/rmi.h | 3 ++ 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_drive= r.c index 93a190e333c66..bb1db5bbb3abb 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -462,9 +462,10 @@ static int rmi_driver_reset_handler(struct rmi_device = *rmi_dev) return 0; } =20 -static int rmi_read_pdt_entry(struct rmi_device *rmi_dev, - struct pdt_entry *entry, u16 pdt_address) +static int rmi_read_pdt_entry(struct rmi_device *rmi_dev, struct pdt_entry= *entry, + struct pdt_scan_state *state, u16 pdt_address) { + const struct rmi_device_platform_data *pdata =3D rmi_get_platform_data(rm= i_dev); u8 buf[RMI_PDT_ENTRY_SIZE]; int error; =20 @@ -475,6 +476,21 @@ static int rmi_read_pdt_entry(struct rmi_device *rmi_d= ev, return error; } =20 + if (pdata->pdt_fallback_size > state->pdt_count * RMI_OF_PDT_DESC_CELLS += 1) { + /* Use the description bytes from the driver */ + buf[5] =3D pdata->pdt_fallback_desc[state->pdt_count * RMI_OF_PDT_DESC_C= ELLS]; + buf[4] =3D pdata->pdt_fallback_desc[state->pdt_count * RMI_OF_PDT_DESC_C= ELLS + 1]; + + error =3D rmi_read_block(rmi_dev, pdt_address, buf, + RMI_PDT_ENTRY_SIZE - 2); + if (error) { + dev_err(&rmi_dev->dev, + "Read PDT entry at %#06x failed, code: %d.\n", + pdt_address, error); + return error; + } + } + entry->page_start =3D pdt_address & RMI4_PAGE_MASK; entry->query_base_addr =3D buf[0]; entry->command_base_addr =3D buf[1]; @@ -547,7 +563,7 @@ static int rmi_scan_pdt_page(struct rmi_device *rmi_dev, int retval; =20 for (addr =3D pdt_start; addr >=3D pdt_end; addr -=3D RMI_PDT_ENTRY_SIZE)= { - error =3D rmi_read_pdt_entry(rmi_dev, &pdt_entry, addr); + error =3D rmi_read_pdt_entry(rmi_dev, &pdt_entry, state, addr); if (error) return error; =20 @@ -1024,9 +1040,13 @@ static int rmi_driver_remove(struct device *dev) } =20 #ifdef CONFIG_OF -static int rmi_driver_of_probe(struct device *dev, - struct rmi_device_platform_data *pdata) +static const u8 rmi_s3706_fallback_pdt[] =3D {34, 41, 01, 01, 12, 01}; + +static int rmi_driver_of_probe(struct rmi_device *rmi_dev, + struct rmi_device_platform_data *pdata) { + struct device *dev =3D rmi_dev->xport->dev; + u8 buf[RMI_PDT_ENTRY_SIZE]; int retval; =20 retval =3D rmi_of_property_read_u32(dev, &pdata->reset_delay_ms, @@ -1034,11 +1054,37 @@ static int rmi_driver_of_probe(struct device *dev, if (retval) return retval; =20 + /* + * In some aftermerket touch ICs, the first PDT entry is empty and + * the function number register is 0. If so, the driver + * may have provide backup PDT entries. + */ + + retval =3D rmi_read_block(rmi_dev, PDT_START_SCAN_LOCATION, + buf, RMI_PDT_ENTRY_SIZE); + if (retval) { + dev_err(dev, "Read PDT entry at %#06x failed, code: %d.\n", + PDT_START_SCAN_LOCATION, retval); + return retval; + } + + if (!RMI4_END_OF_PDT(buf[5])) + return 0; + + /* List of known PDT entries per compatible. */ + if (of_device_is_compatible(dev->of_node, "syna,rmi4-s3706b")) { + pdata->pdt_fallback_desc =3D rmi_s3706_fallback_pdt; + pdata->pdt_fallback_size =3D ARRAY_SIZE(rmi_s3706_fallback_pdt); + } else { + dev_err(dev, "First PDT entry is empty and no backup values provided.\n"= ); + return -EINVAL; + } + return 0; } #else -static inline int rmi_driver_of_probe(struct device *dev, - struct rmi_device_platform_data *pdata) +static inline int rmi_driver_of_probe(struct rmi_device *rmi_dev, + struct rmi_device_platform_data *pdata) { return -ENODEV; } @@ -1159,7 +1205,7 @@ static int rmi_driver_probe(struct device *dev) pdata =3D rmi_get_platform_data(rmi_dev); =20 if (rmi_dev->xport->dev->of_node) { - retval =3D rmi_driver_of_probe(rmi_dev->xport->dev, pdata); + retval =3D rmi_driver_of_probe(rmi_dev, pdata); if (retval) return retval; } diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_drive= r.h index a4ae2af93ce3a..b931f428713bf 100644 --- a/drivers/input/rmi4/rmi_driver.h +++ b/drivers/input/rmi4/rmi_driver.h @@ -31,6 +31,8 @@ #define RMI_PDT_FUNCTION_VERSION_MASK 0x60 #define RMI_PDT_INT_SOURCE_COUNT_MASK 0x07 =20 +#define RMI_OF_PDT_DESC_CELLS 2 + #define PDT_START_SCAN_LOCATION 0x00e9 #define PDT_END_SCAN_LOCATION 0x0005 #define RMI4_END_OF_PDT(id) ((id) =3D=3D 0x00 || (id) =3D=3D 0xff) diff --git a/include/linux/rmi.h b/include/linux/rmi.h index ab7eea01ab427..4ba2cefac8558 100644 --- a/include/linux/rmi.h +++ b/include/linux/rmi.h @@ -214,6 +214,9 @@ struct rmi_device_platform_data { int reset_delay_ms; int irq; =20 + unsigned int pdt_fallback_size; + const u8 *pdt_fallback_desc; + struct rmi_device_platform_data_spi spi_data; =20 /* function handler pdata */ --=20 2.51.0