From nobody Sat Apr 4 04:54:47 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 1E7233CD8C3; Fri, 20 Mar 2026 16:44:44 +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=1774025085; cv=none; b=u6JMvQixEIvyoqGyT7iz83ycF6it/WKQaAl9ZMiGoYEYM2QmqXs3Bt+E8qtvo5gCUtSSSPQF2oBTFHL5qKuWeR27QeJNEZ8jma2ct6yA7NOuvK6kN3WDh8UpPaShYAl/FIpn6rtjiReW5K9vmK2pSQj/PDBb/Wn1tSs+y2VeRT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774025085; c=relaxed/simple; bh=oBgPDt/LJlibW8Hgm1a/bsT5ObHlCxGW++DUgK9IrHg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CXBtaKv99Y4D2OyAd72RSzQOsOmQxYRnFhB6U0FAWeuy4L8IVzeJDbZSL0Juu8ydPvYFktwFN1RzBm0Jz0I9NCumnjCWnjYIfAejZfzgVoCU9KezjG2PeJv5xp8SmqUekrqtIdBbruYeb+ehli9F/Vn0w0wx50sp7bS1IcEINeE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XmZFsZVI; 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="XmZFsZVI" Received: by smtp.kernel.org (Postfix) with ESMTPS id C4E2FC4CEF7; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774025084; bh=oBgPDt/LJlibW8Hgm1a/bsT5ObHlCxGW++DUgK9IrHg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=XmZFsZVI+31jraRImDi6OMYMDGs3HACVonHW6gpFSwDKSRelODQp7FB0ixUoL3xnK 7QLu7beD+FYvXXDXndzhAp0Y6aDCxBjMQv5500XIcO6YxaDR85fAguEVgBtxr6mKfp Trlytaj0Uh6Fo3P7coKTDwxB2uRlo+ABwRT8VJrl6iVWnXuCB/Nk0K3V2VbbKJHyi3 hsDNW5eg/m8uHhsB1wnvV76USrPGRucCvRptvrB+rTEpZXzKqrWj8rcgxKjQ4xDZMo RiQhbTY1gRK0ArR+mby8Lu1NtCPA18ZNomqRtZ6Rv1uiDhaE8dEr6xY2yG/F87p67g zCDFHxGCEn26w== 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 BC36210987B0; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Fri, 20 Mar 2026 17:44:42 +0100 Subject: [PATCH v7 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: <20260320-synaptics-rmi4-v7-1-379360de18d0@ixit.cz> References: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> In-Reply-To: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org, 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=sEfAUOYzG1M4zvx/Xv8wME49V12PqhPhJ6Tk21Hc6yo=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpvXl6DQoVjnt6AUjpK6l5YSqeNhZzWp2I7/L/S gRrU92ruVuJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCab15egAKCRBgAj/E00kg cnlaD/9GRWZMPIKiTohJQYNue8Ey+/mhCM0p030duqBy4yVAV+yGqsT+DJuI/79njzgOVVfJ0nR 87MSeH6uER7+Oco7eXBYx+izh2vaSkhUS9GYPftdMl6n1Me/bl344FtY/y5Z8CC3aiNsmrgdk/4 yY9CkWYZYZk3hTEGeKv5Y+F/RWb2ge8LIpMjzU5OcdbGfKTzXFlYKRsepAxA9fdtQC+A9A7L0PL Dc0677JIuV5Wg918OCtKqkfcPWXcPyaUdBY5+fS2UEyymCL/b86MbkzPZpzIoLeM4phAF1MUBy+ /HCG4KU15EckBLE5/Q9Y8m0BrzxcxKuE+TdVjDRwzPE22I9cJXNKXXxi/G2h6B/a+hft8ACRMJ3 LU9qP4YD8SK1E1P97PNYl7ORnf2fDvmgMvhbaOthu6omZNAmvh7K1yHi4oWMfgg1NhCS5MGBmGT orZZrUYT7HMw6pX5LpsEN+2Zi2rQ3RAQjYD401A6aVO+NRI70gxA50c+VMOIJfNtctRxzIodhxH oIM2lo6J8LH21SQreek3IJhrZHutHgJe6LgcrTfGroi/5d1F5qC39lpORJ7dXyUS+9iswzzRJcW hh73xvCA/8FJIXGphU98uF+CqU9W8aUFUYgYrCzZyaptzTWxw23fIuZZ5CsMnyO2E4By6Xjhaoo 6mfHIDH0TMXzboQ== 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 8685ef4481f4a..fb4804ac3544d 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.53.0 From nobody Sat Apr 4 04:54:47 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 1E66C3C9ED1; Fri, 20 Mar 2026 16:44:45 +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=1774025085; cv=none; b=JScudnadUz76fBLzUkUg7n1v1u3sDzcwwS9XWbBopMpS83gqUXKZzAMVVI4pLRP9RkxuR7nYeqcE3nzPRrKF/kGWly6K0po+CSuWg/gqA0vhu1lC8KKu0SPZqH/vcftmwYFF8JPYrNIAHMrV1PF7GU+tULNLFMFzTbdGexDcMps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774025085; c=relaxed/simple; bh=mx4BBb4FfvTCLbKpeQw8LtCyrmtuoUdH6OgDIV5QXZY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PyQjYsoPLeT3oOyqJWrlYBovtH5Xi6ZSLxWU3K3UidWQAXKyLKOIxuGz7Bl8gOGWs/zJUHpnFB6YFGyz+fm02DvtAx+xh+mhOE0HFBXQAN71ZYYnuIKVZebDZkGX6ZfE0gytpVyl2QIYaeYD4+yn6ld55olCElUTK5A/W6Whu9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z0ZCvXA8; 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="Z0ZCvXA8" Received: by smtp.kernel.org (Postfix) with ESMTPS id D2690C2BC87; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774025084; bh=mx4BBb4FfvTCLbKpeQw8LtCyrmtuoUdH6OgDIV5QXZY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Z0ZCvXA8KWwyWhuq0Ob0gk3PhdpzOnGNGXm4pVNBzBu5eFZHU2+KscZp6BIBzHnSt MkNEseU5SOEpU2qmSCB3FrmfiRv/FqciP1ohgywyFaea1IfzrHCaY8f9NOe6a8Q00r FL1QB+L6LNi3RuUcH3BPbvZ5F5dwh3OfXZkrHPo8fPN9vnmo+jRrE0oQvaPVJNmOF+ tK2Ro5eMmO7WtZ2c8XnVb3EBwf9YTweEDJkylPlBWwAJxQrpmFb1TJmQOGBPpTF5Ce 4uz0s/vcIh1j4pyKnNsKm9dq+7Z0BVTVdOOdxAakMwaj3ie30H8ds/udDhrYSaQp/q 3S8y+A+t5xm4A== 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 CA2A710987B3; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Fri, 20 Mar 2026 17:44:43 +0100 Subject: [PATCH v7 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: <20260320-synaptics-rmi4-v7-2-379360de18d0@ixit.cz> References: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> In-Reply-To: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org 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=86uZKh7RWLmJOMtEcC3sJGbiTauy/sS6lizTqTxChes=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpvXl6C1ta5vyYx6wULHbaQ3MYh5yG33y3bevCx OIzzNHWGk2JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCab15egAKCRBgAj/E00kg csyED/0ZrwcS23TEnGMKkuMAxUV601ExyBBW+Ngwi80ORpCnEdbosRgdYDfHzKRwWLz9kWzixAv 0h2eh7edlSJh0z3wrRZPG6MRA0tJG3vVM8HXh5WaDo5niDFrpzhOvDdaKiHWW4zGiX651mgS0XL sWcLEQLcmExiGOMgOGOGLKRduxqTA6+KPeA/V0r87QsatJo3N/DBx8r8G6+vUQWME4lxe8dRkp8 iA1W5UfnyXu0VqmEpMjM+MlFLfBpuOq9mMFLS0orX4VGMv1X0uumbdYl5hDTMW/Xwkj8iNRFBwC 6Bjyifhac+b/pyxBYUGb6udnnoXNl0qGDJtUvvKatoHCJFNvRMDTkmMe5wIOWQl3QkjdtlTlFl7 cRPLNu9URFhDkNxbZPG4QyCz41ZpFbWrN3PvTJaw3Wcah69bmcnRSL+0c3b25EjPUpu1d7lB7te gUFeTRABpRAZGDfmDQHVRrs+cs3UElW+rx+u/I/wTxUUbP4kM3pIG/SUPYzgTsCDK4yKOwiv0Kq iNZv2oWKqWsd97uMk01TpdC+rpFabDo6Ovx8kSMVZOqxEz1oKnr7dkxYo7JehgJPTBLbGLcvby5 3tiVnm6sCRRCOtqWXoOjgwHPqPKKX9MCGgt8SrpZxcfaf6OaiRk1gpBFRTUSOXxvdmsFX5QqZph ieQTwhHoxvFv4vg== 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.53.0 From nobody Sat Apr 4 04:54:47 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 1E7B53CF663; Fri, 20 Mar 2026 16:44:45 +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=1774025085; cv=none; b=XpQa9GrmN5vLWUpsr+KOcJnjk9fDwartdHie00E6FON0MsgenATrZ0Wq3+FxigezC+y58gMS+JcopnuzJM5HCEoSPzkv38pMw7K/gJWwlQLD28/nHa3V5AaM/fkFxhDa1OuHEfgQOomvpf48WOnJjt9Mnp2x8T5e8Zo6x0+2QVY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774025085; c=relaxed/simple; bh=2qx54d071209ocyGH7nQIwEVJpZqWrRVUMn+5JIxUn4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oxDCf72jX8yEoqCAdzRIgbpRNknwAltNc8vYmVKWOTNd6psiKzuZycfawXb1bfBmk2t5eG3n8G0lpkYfBDWC2uwecRP9ru9wQYzT2DYo2/3a8agi+BUOdgmmCtalzkSHRdSDnE1lZfpDeE1ZT9FyJw/VH3qVB5vYCiIkckDYxPo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Sv9obyGM; 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="Sv9obyGM" Received: by smtp.kernel.org (Postfix) with ESMTPS id E20CEC2BCB1; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774025085; bh=2qx54d071209ocyGH7nQIwEVJpZqWrRVUMn+5JIxUn4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Sv9obyGMUWlporr3rgXvyWCTzj7MgyUPpEbmmWsXqSkXvKCfX4aY0x5g2FpSf3xXO eI8YkbpCKZ7dEJjqX6zRnM6gh0BkiBDbhnpsZYNZKTnh302her+TMyhKMW8r4626f3 BXxVc82M0zTMc+My67HGkPiUaK2x+T4cP4TbEEjvlfo2CuSzsOvvn3yZfuejXClZhs PlzIDXegq0/fGc1PR/Pcyk0QNsFOsW5Jv1SRcQ/feJLThcuZrpfA3IrUtusDHvdGG5 RtmE9mxLQp4Vqnizw2mMleCLegI7QqHLmTVuLsM4Y/11V2LBlHOVIWOBwF6gDnsHS1 hZzrc3Xb8swJw== 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 DA25D10987B5; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Fri, 20 Mar 2026 17:44:44 +0100 Subject: [PATCH v7 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: <20260320-synaptics-rmi4-v7-3-379360de18d0@ixit.cz> References: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> In-Reply-To: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org 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=uIVBzoVvoT9cC0FlMrh8EX/REdV+nI9MyoZTwpNDSos=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpvXl7GSgwspf4fym8Www61d0rWJ1969SVB34st rHnnZ4UqhqJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCab15ewAKCRBgAj/E00kg csg1D/40/AEYnuVZXC1NZxp9XrYJkWLYPq542ApAPwFA+gD3XKjdn7hWhpMlqPF7UsDDWNxe8Jo f2EjxDXYc1EonGb1mK/0gZ57qLdBe1QJgtChzd7DhBjR8qs6VJEEKSFc5nRMdx7K/bfwM0HVgCF QNYD0wmqhw/SI7ZiMNJ/1Z8kDQshyNT9UKpPWeBVVaDwdGkiBgxeYaTP2K6W77fmHrhgR+iIQYm lLe5OAvwI/yiysZrWmU+zjx0cVET04wWOctEjBjGyjO57yURDbk8H2y7d9/Qm3xsT9aWLex7vLw g+KCe8Y5H/vlm3Ad6OGlZR11R+eDJdi9zrk3UIiB1D1DEpTeaDpKJwK698de0LCUb6bSitNZ1cv RbRS0dygfdr9YVybK4FIKDDd6nirZsscHLbyXHsia/sbXxLNiaGWf7z+DUmH9kSIENrCtP5E/V6 NleAc2OJYvoUJ7Vh/+sUMQOUIcjoKVeAsl3ND5AJxTvukj70VD5RmMmFuto2N9FgqO435Czmd1s ZRk4tzhSi+PNhfYdjXfiNhoRs00m4yAldpxKLRP77Isc7vubnJNz+eVfIuqmYVbK+DW3utP7hQW /WMkup0mm1eLm8unvH5AQ8K8qUcY5aZizkJxN/xnZcgBvYQH8BKRexCfvq270VzqY9iQ7fS2pE0 oRnNGlqFamHeK1A== 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.53.0 From nobody Sat Apr 4 04:54:47 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 27F1E3CFF61; Fri, 20 Mar 2026 16:44:45 +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=1774025085; cv=none; b=feYlMcdgnhE+aNlPh74QKzQw6q8/4Z+VkR+8ouWKDRMzLntqmF5IIosYVpujfqytP+1CRpP6l1fGsJpoGa0rJ5ZGVh8wFzZ3xClwsnkMAsjV3xCkjUVZ3+Pm8mnmNOFdrPMwMqhVpXKQ6ODI7euechy7CBCf2yP9N3shyXI3i48= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774025085; c=relaxed/simple; bh=BU6kdVo0x4D70Au3+d7B1+eMYVpO0+uLzE4YH6wdmWA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P3tRjLPs8Y83o51PpQLP3paDtMU63Q6sXAoarpnuk1DDHEDyM3oFhBeu6sVtIrUbaVXj1/crsJiH+JQ/bJPuAsNQ8Djf3UBxdzdz2EYFonEs07rMsKRJWF/C0vL+Izb/SURweL1riYq7g5PhOcAzDs4HWaeLlIUYxCl0Bd76Rv0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RxgLClzM; 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="RxgLClzM" Received: by smtp.kernel.org (Postfix) with ESMTPS id F0615C2BCB0; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774025085; bh=BU6kdVo0x4D70Au3+d7B1+eMYVpO0+uLzE4YH6wdmWA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=RxgLClzMp1rr8GwMcLP049NK9cYWyZTO04tfXAwUPr1ApfmRDVfsitquHuJqQeaTn oi8gQxSas0GvNZ5Fo0SrZa579ERm3PTrFr8sPeiPfYHTrMm7h+VCRCmxGstHId4JaZ /+iUPt8+j/8F4/yBOp/R54kTAnqBa3H8UkIZN6KLTLrcnc3oI/0/rme91nAsrjcJ88 1u2C0LpCL24lhDDroI5D5EUam8AJHQY6oLuTOx0lPQFHHig2oz69ldNlNeTg8ZwvaI VNGdBTTM5zhxFIkDrtA/dHqZ9qqzRzd8jWYfQ5IdjT1TERVApZuQF9Dn10OUrBkrOo fEI2zTjcd+htw== 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 E85F310987B7; Fri, 20 Mar 2026 16:44:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Fri, 20 Mar 2026 17:44:45 +0100 Subject: [PATCH v7 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: <20260320-synaptics-rmi4-v7-4-379360de18d0@ixit.cz> References: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> In-Reply-To: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org 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=AmUwE6dlCCX02pALY0B7wBasdQMVqYZC32vlnsSfL44=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpvXl7/pqB1jbTnOT25HQzbiHjSJxghiXVEFt6P c+AXX9sjEeJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCab15ewAKCRBgAj/E00kg crFUD/9KPBitTbe3GmT0dwbYVEkdnHvBGVEUT0z8TTB3Ovk+dE4my9X33BijUL52X53vWXx1ek0 1VUAFpg95Uo0piNjuG/jplIoTHISeQhOjVriFgmyWvsQdqnNYhle+JBDRy2DNKJMo5enxRJcMrL gSkG6v+H6NIE0mDPTrWnDlcgNs/Q/coU/4mDojlN64/OtnqnvQWDrAghJKwO044lbWFmN4YhNu1 fcQf67s9d02FVp4Wb6BoVKVFu4NvrNUcrxV1l8PojD+XTkDkhUiJ//1DUKexFYc4ffQsh+vBxMn TvmYjAhDKSWa9fFV3CvRma7GGsYmc3+VJF0smo4GJiBGt5E2axaOvauGNSDqOb0nWEWD9C3mFT5 d6NvdgKqphchrYP/FcneYLjeg6cLZJZ4Plb3M1Ze6+OHy95GlaGpAem53TZdhQeReK8/p6bhJDd EgA1T3nxcPiltag+Vg2hQt/KxFiCnAlelhHX6mU5YmKENS8hI3YpcM+HeuGA8hjX8E+rruwJwLQ AFQ+GlEJ9TR/2S/rp3++ONjZG6C7/x3dv7dVTKWPP5e/M0ysepBFZjGp1P3+B5vAQXEzdCQS8Jg Cvdmm4fyVmOcMwJQSp2sG3nDMtDYs2weEVb19mcgj0D+Ny7lhkSu7gsoZRNuCBy5errnB9G1iU/ x+xt48fBeaZTJkA== 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.53.0 From nobody Sat Apr 4 04:54:47 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 5FD213D1CD4; Fri, 20 Mar 2026 16:44:45 +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=1774025085; cv=none; b=gk34hc4W5iy10puG6tLDndmTS6/KFuxj2ldSN99PoOMtm7P4gYiR1aLFm5NFZiK/fbnAyppMvbdSSAW9pcgWjvTrEoCwN3DsDOL7Z/hL6/iWMDAxtnMUwYjoR+7TIHMf9jIzS0tkXSxWfkPqaQ3F1dOacnXK8UuogQANST+8Kvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774025085; c=relaxed/simple; bh=6wiTozsunteALN2TZ8+G3lYckaOGvnP3fbNsIzPunsM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rh3BTjGREslnsDoLuuNGk8Zn/hjIRv+uCFXG9fJGqsBMe1GDlcKBoQGRbRqxxBcDFuy2R0Kb27BlNoqkQfNM6mVlnEdyIe2UVjBX47AITMcSbAeEXyQJYm2Pd4ekwhalepT1GXRsuiI/Dr85pILIEbf5SdtvbzxAdhnog7qCHes= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=oIP/1Xms; 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="oIP/1Xms" Received: by smtp.kernel.org (Postfix) with ESMTPS id 0A1ECC2BCB4; Fri, 20 Mar 2026 16:44:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774025085; bh=6wiTozsunteALN2TZ8+G3lYckaOGvnP3fbNsIzPunsM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=oIP/1XmsPpKrdaulkH9sH7gC2SjJkmTXautx+EqtgDYsOISLvkQeytbgEipxDNnxq b41cTETA9XETKIAsfr1phD1J4jRE2lNtFUAh2SSq+M7xD6Sb1vPzw1z79eOkzBXNDg NsC7Ymes47tcsr6fV9KByCamCH1GQyKSPeORD5n3xjiHLXx4Z24KI99zguQlVcnAuB EZP+TEa2wu9RvTYipchThYOivg0n4Of1YUjTcfR9y0ZK9zEF8zBeTalw4S1mc2Py7S bz4tQcZNcO+sHmhE9J+g2t1ABJ55Xy/tQyrs2p27vkc58bK5n3TqDyyEjd877+pqXr j8Nh2sdlZgTQA== 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 01F8D10987B3; Fri, 20 Mar 2026 16:44:45 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Fri, 20 Mar 2026 17:44:46 +0100 Subject: [PATCH v7 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: <20260320-synaptics-rmi4-v7-5-379360de18d0@ixit.cz> References: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> In-Reply-To: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org 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=zRJuDyKVtFumRqddTNRUEZ+d9fZy9eN/okm7djVZni0=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpvXl7OTZlkJKvt3AzFoFODIMPKidxQ6tYv0RwT wCCDXaLHAaJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCab15ewAKCRBgAj/E00kg ciw9EACkN9Fi59wUyHOCPN7mjIChrskAlcbQH/bJhWyBAikS8NCCGLZU95mZoJYgdjsfldzpkX+ OzboUnWF9brUjVrnnR7CdqHz0yQGwyLwbQISAMer9uxvnoKmI7AbCFPivBjHknaZpy/BoWQzwOh 3tZVW2jWrf4ggDeg9chp32D4VzVCy7eoCZiztuO4QDXYtJaLOL2YALXCklDyUgI1rOympHHHeuE cWHG2D9PX+T3I6F242Oug8pLNy4qXfRFhAjvALxmjnmuYRJpAlqGyZhyOVmVytuCu0bZ5LuZGgy CPrAASTLUjwLGPoyXifdFvjo0s+BZYS9oPEAAkDbaTVK6f3u3anTzgRhQqnD0MtOKfMXmBL/+SZ KUoy5D/KgSQI4WEwKLViShZkX0MCddoCKR6BQ8l05vnrFhMXRnAQxAvUhH1L1YOHp2gVa4YQH++ jqGiXwYA/CEg6wT/V8xbTEO9mN9XZKKiVSaDMfF3GFHm0yfwdkCYnmC/U9jEfKoMk3J94Hv0qVU 6tBJbScbDLWIMNlE79QjHZyYipwf5TozehdYplxUqpRuzel9kvUI+RP4elCmMFJ7bO+HZKpUYEk CWoXmsbPF6doh81B+Sv5dISVixA+Q3guGTaM6J1ZA7sszdZHJSt94hnMFoZmPEcfmKE5dImuZR6 /VEw349Bx34Kzgw== 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.53.0 From nobody Sat Apr 4 04:54:47 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 640843D2FF5; Fri, 20 Mar 2026 16:44:45 +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=1774025085; cv=none; b=jWo0cbKwK2cMJeonKrTNr3/OnX/aZF5Bd+P06fPg4TAIOdQe+v3+ybqvv4emxJxbrDrUkbXT4VDX/RQDhk/qrpevQKBhdskjCIGobzZe6L9j4z6B189PZ9i0emcTYBumQXRxpF4PT/ABostzvbtMBTWpjKllQiv3dkjR1d8QzJ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774025085; c=relaxed/simple; bh=Dg8VJs/6qaDCZA5ZK4yQ/nkLOVVgN9sIgg9C2DqA2gE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Cefx0vgnd82vOJXB3lmf23NsH7N5o/x+cDmHvwVJReGg7J/WYzcqjXEfny0of0V2u1XcfRMdaVg/8I9NvGF9Q9vmdARerxtthXtWo4tdkeIct5QrE8vAU6sYS5/QgsimnMASSY5DKcNtxt4CSPgZbsfPVXcTR9d6uoYMyO5MKjQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k6KQvHT0; 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="k6KQvHT0" Received: by smtp.kernel.org (Postfix) with ESMTPS id 17679C2BCB6; Fri, 20 Mar 2026 16:44:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774025085; bh=Dg8VJs/6qaDCZA5ZK4yQ/nkLOVVgN9sIgg9C2DqA2gE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=k6KQvHT0EsuSQMuNGZN/SnSMTNe6p/vy+WFfOII2NdGyOUlAGeZleHlk7NKGRqGeY 7+kBrATovWBMmXeqHhY6FX73IcDA+ah5qGkjTyMGy24/S2GDVyUjOU10YvEPM+xjxJ 7eVumEpOVrkrQalGlkH32bU77+Q3j/p6lbB2NuqsSx8J6ha/m7GRH0NX0sC1+Pa8IM T1n48jx0NjQ0cDYggXNnZWJC2w2/ls3lENUo0weXpzxKtIE462KThrfYQUOVSHIgkR 5v868kPBYBPRWMf+f3+JEvcgUBl85ihqUkLEDvmIvoBIrrZce1avdHcdEELNb7km/j 6tyJd96ow/R9A== 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 0F89B10987B6; Fri, 20 Mar 2026 16:44:45 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Fri, 20 Mar 2026 17:44:47 +0100 Subject: [PATCH v7 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: <20260320-synaptics-rmi4-v7-6-379360de18d0@ixit.cz> References: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> In-Reply-To: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org 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=CMV2802aTv/oc1MkDukEK0bp3xh70HXQEEwQSB5KFZI=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpvXl7NLLzGO8qCVp/Q9HhBBv4aiAiHF48BHyI6 XFzx0U5EImJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCab15ewAKCRBgAj/E00kg crVED/9nvywg8EHTH0qMFq+ZYfPb5cTMzoUrzinCajuPGSe9/dDIWh/s2c+nhD9EF99z+WBL7GL 5n6EFxb4XF4zPC8FBkAho4p6YrrZOqi4PywJ1jTb4mBAQSHl+rL4AdnwZc9kaiG9oHEdrNxC/in XSlVRGpTox2FF5Su9vBFX8ENxCI142httbHKSWcjQwkStLt/dyEQFHmOCZb1JplN0G25qTV34v9 eW8qQwXHsGeV2zL7MZmlq3SSOIpOEADx+mcphGzgsL1iWxJPWGCBw/fDh2wMaw5KiXdokyQib9b NQT6/fpzWahYClWvPWpd+QOczCSm0qwCjUaFQEqzYldReB+Jv0lPCkMgrb4e3rr615NFcsrhP9B baJchCHkXLQPs0nTIRwTFKkKuGg8mCBFRmEYEIVisE27YSJtNlMipqRWs3mxtEIWa2gM8Rt6NvI ofnqa0Y9AWXr0AqVSGvA1Kc+/Wj25r3KuDlms5Woxxf6QuXe3hO4Sg9WhrJJcKud93vpKr0ZO1K SUIB70rjPbaGEd0X5Ocox61BNHlW4Rpa3LfQ74Sehw8pbwIUWT/4ry6xnIuT06c6qScz+izk3HP HfvT+AOckCm/+yAJfLl1M5vg+vx2ea9WtIpYfDo9zLXb0zaxxm6uby4GZ2nGhYB+qgCVzyBWh6L wh+uhsITDRE+xkQ== 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.53.0 From nobody Sat Apr 4 04:54:47 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 538003D1CC9; Fri, 20 Mar 2026 16:44:45 +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=1774025085; cv=none; b=OsgQGjD/MY/2G5ytrA3m0RBoieeIBOl1xu8n9/XTL7RZfj0TB0s1MYG48QRbJNxmwW2vfIYHyLrWFmxKRhW2NT+T1bq4otpVZz28ZK2dJMr+5L+5J7uJItfA1/xLpClucEQCoU9F3j0udrviviWQAKI8LYf0H3U0r1dFAiBvFmY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774025085; c=relaxed/simple; bh=3JqlcwNzqVml1mGtEsepM1GlRvW7I4xqcXmLf3QfRQ0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lARJw+5QgW0t/zSZ+1Ls7QlyviYFnJOwvzHqK2qM+koZkx1ej9CH1/PTK8pPtgz/81EshKtw8Vi/LppAxInhbHVtYaISXBefLAKo9FMYuuW+26Fvysqvihe4L7b/atNga9owpWsQpnjUEn5gtIUKS4IcVgcEzos2+UqL1dS2Y3E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=svRE+y0z; 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="svRE+y0z" Received: by smtp.kernel.org (Postfix) with ESMTPS id 27325C2BCB8; Fri, 20 Mar 2026 16:44:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774025085; bh=3JqlcwNzqVml1mGtEsepM1GlRvW7I4xqcXmLf3QfRQ0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=svRE+y0zcTmYVS0Kvmam0dyXyke8zgbA7qsFFjxANjUT5Gk6LrZJ/+R4cnInj3JIx /2ch+qCdxr/3Bv+ZLakY+XqHFjqE38e70/oe7GIK6wd3iNhsq39ZVn8/mfkC7hGd5c WRMZW5WsQT/bESvN0LVvgfDvIS7v85kN4RBsSH0FLuY4oXQmw5qXnsbMO/Ifv/nRh1 V1Govt8otQi2/+Pa9BisFK+zwef6oeg06xd/FJHePLGaJ/rXRyURHN7i5zagCfpLcJ OK6te09y2qZqHozIjzPam0ELW6VUtda8BJhnGV/Tb0Yd4dXtQPJhAHv89Yyq2mwakB h+asLOFmKMshg== 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 1E76A10987B5; Fri, 20 Mar 2026 16:44:45 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Fri, 20 Mar 2026 17:44:48 +0100 Subject: [PATCH v7 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: <20260320-synaptics-rmi4-v7-7-379360de18d0@ixit.cz> References: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> In-Reply-To: <20260320-synaptics-rmi4-v7-0-379360de18d0@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Casey Connolly , phone-devel@vger.kernel.org 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=QMO1uzX1oG+qWT4REjO5yGwZjOwaRzQblxJ3S0B14zU=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpvXl7Q9U4PfdLwey2srzJGevl8h0ui7MAH+72Q qcqBZmvDheJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCab15ewAKCRBgAj/E00kg clvrD/9diJd5zIoKHMycuW8cwdpYvPIbOPmI1d9P9zCktRm+AoYEdCRGN3rQ8iWb4uS3mh6mLPH nd7V1IN2f4shG/5O9nF8qRfn/QAGQn2DQzkWdKnnrbMhB7QNYI1m1VNr+U/FS5jRNrs6fmUSL/M YBd2E4od79C9D40X2Jrrr6pSbocRf3aiCov3F0vZo8QGdtPBpeRWPEnc8O2RYDPoOHxEksmi8aw tyuxrvlT1EVryWOP1uL06L52h4laLAqoXXX+c0hGK4ZFIlJPHtqFl0kgjWSl5pW5Y88H/RGkMM2 WEwjmpJdkL4L+QuXX7CkxFjDAbaT4g6j1EltdwYEzAD/OwPr43IXoDVqM+PApKlbzd5Z6R8eabr Y32kY3h25vKjEwBUSYiiG7zaXfE4TqE8aBzSl0BlWLNENIGFfBEBnLduP6sWTBugN9e+Br+RdNo VtyfxA6SgpbO2qWtXFffbtcRhhS9asc6huLQOrZQ9zdeZmBlvyBUWFqupm503lCAMKoIsJQluxA gBclZ0Qukqmy6lM10CCVcswWlX7sv8iVFI8lF7OuVxC8iLUUM48Jl5e4VVPpjNM5r04D5VJ2hpD b0c0p8h8NcaLUtKBNi5PHdu7SlnXD/8WNuQyREmGHqtn+nSpaLP7Xenr4UFmNligUY/FjiARsgP jOtxnlDdGPMh9lw== 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.53.0