From nobody Fri Apr 3 10:19:39 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 B72663090F4; Tue, 24 Mar 2026 19:40:37 +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=1774381237; cv=none; b=AnKhCKvk8qQVP/gyhUp+dnyTMlYYyJ59smKVXpSB4xnLXdQz9H5o6quoOlr2y+IyqWXDQoRlvuIqhGn2LlyWvUryXxGivXE6uW6ri/InUeZqWv8uhSXHfGygAvatFmtoR4nI17Lz3DGyVv5XMA1roO6UbkVdFmGR/cPc0RP0RK4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381237; 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=M1GdxWP7rEzkFsIv+njIh23TMIdN/MK3QEnccqYDEYo/PU7Wovxw9jiwy6XHONxcfltEYfcAmw6FQh2nrERqI0l27cGARZb/DBGS9/2p9Q5EbYUcmjPKUAw71iN2JEilxCGZhzs4fz27oH0sDGMXXvvsYDA9/Yg8dZOC5h7EWw0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TpMQ9lpI; 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="TpMQ9lpI" Received: by smtp.kernel.org (Postfix) with ESMTPS id 739F4C2BCB1; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381237; bh=oBgPDt/LJlibW8Hgm1a/bsT5ObHlCxGW++DUgK9IrHg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=TpMQ9lpIOvOTw2sOL0HLdY+Kt4Z2biTP1epI1DkBqVuaZpnUdxzlxtYuclMhztO0H LDtmCIfitaNFslqfT8LhwuF21ZuEeeGRVXcABkDYxh7ZAaGkvOPKUrtAFffNgq8QXE Xy/IoXn7LOQrDFoOukgki/hYZyRBv8XbYP0b7DU/xKtNsT4TFn4cvjwtNM8mX6uiJd +5dyYoyAytj+ALTE+39qKqwJ16B4VKXh7sFgevlpIP2/aGSxEH72dUQElK4jyt/DJ6 g3j2Ybqx3F3SoW7tWHyYyB7rfHGx8lXTKbX36SMbgGjb0DxpaK9KdznCBQBFPjPRES YOO2bFmkXynNg== 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 6BCE9FEC100; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:34 +0100 Subject: [PATCH v8 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: <20260324-synaptics-rmi4-v8-1-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, 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/ZANAwAIAWACP8TTSSByAcsmYgBpwuiz5xzrEArqFAw1SDTk+XBbdHXOUSvBr9h7/ xUG9+OoW5SJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg chtYD/9X46MqQT6R/aqVMflAKUjVnBv+ZV7Yq4B5/B3qd0ceScFj+t8IeLuqQSeYZwH/cNsSZwc Joex4ttjsmlvz/5KEwyDRx3wJQb4Ms8QRHTlrxgY4atncDJPI2kWopUwDpnCAdrRvWtYAYbuxSq VE8dNM7ISwWAcmqsY29m40mJKW1MyUrUUjFOKxZ9ZjjqtzbIXcpIaytsTnCXDWiGPb4SqXR2vOt rhmqZuCAQ4t8+MDnL5fOrvVXD7VBi5/Uv02fe7qkIcNrvKGngH5toerJhN6R1wlKnwUho/g6QT8 xnGZTx/zPRjPQ6r7IgzLS9INdHg1bq5X9TCSWr1tpGZucmh3cEJa/VfqVpL15iXFgDy19h9qad3 kl+R4Sp92e3yUpGcEHmoQqje7V6fkl5jlj4T1wGB3qH0/vgN3DZM3agT1J3l/kYU9+oVFNZT0gU QMFtdkDFZbC3EiP9ae+rzi9UuMR4Z4KMYMGSsltoAtBS/HOuCYrrXGFyUDJozDk/yDw6Xcm7d0N QAZQNssfHEn0xPamkd/62CNa5FOMhBLJ7gV5rLz/XseSR0ZJTLU9boc7UxBy26p6lK7WvhGlVBm U8fjvmEB8HSQATpNT2++j8d6jYIQz+eu5MjLMR4Pyn55IviA+Dg+RKSTCHCwJI8txv7nV9Jp4vG Lp2AptRLL5DVGag== 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 Fri Apr 3 10:19:39 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 B784130B533; Tue, 24 Mar 2026 19:40:37 +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=1774381237; cv=none; b=YSF8mmgEVVQOSYFqx4NpL/A3jn9X3qud80KdgCpET1XqU34wBlYup+yBTY2KJ6DuAyIIcBd6BLawx+8715muPY8f9iG2af33PGZoghWNqdCw3sJMPYlu7jVXZluvbFoyb5ynwTdafMHy1fJuxpT6WK9SL/skJlWFdTocGwIhLWc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381237; c=relaxed/simple; bh=hBNSassvHp22I8n0Rdny6FBg5i1FuQGAA6jCWjJDhw8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CGytpFUsZZOYBuVfkFno60Kt0OdzIWFs0xC58QD37WbZBKQETZ1O2nYFJ1RngC+XH62LmVziKPGEa7X70XlTfnIftF/gibUZWhi6NhP0QfwwVytGDPvVtfOKKJzR88dM87Z+KAUuPPVLh3W/8ts5MkICe5DSv1nGYox62GQFFjs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=XMBJL+kx; 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="XMBJL+kx" Received: by smtp.kernel.org (Postfix) with ESMTPS id 8ACE8C2BC9E; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381237; bh=hBNSassvHp22I8n0Rdny6FBg5i1FuQGAA6jCWjJDhw8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=XMBJL+kxGdbm0ZdHGaz0kprqaGjvV2LuYKkyLIVmYRAi/aHn6BwhXv6DlFMhfE32W xOX5zghQMz5PvgP46uCGYDyjt0L0AXLd2LqWyRnnjlD81vh2K22tISVjnhRs7Mn/hI qnA/lSNOcWWVsHxAkLFZzMtHevibRBm8y2l2mVD/FuAR9tIV2H1cHkWC7b1D0v2+zX uH8Nia/rsscAhkRcEQyZjX9iNsHFqxid+zP2NwCCgLz6q4W19l2Gi4ns/xN0/JiSfu iIgw9OMCkUgfUtGF/e0+Ae3Au6+yT0sfeqe7FTybBJmMHMNUG2CCAj2VGm0NM9rujJ 20w0MHveLxHbQ== 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 815ADFEC103; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:35 +0100 Subject: [PATCH v8 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: <20260324-synaptics-rmi4-v8-2-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, phone-devel@vger.kernel.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3764; i=david@ixit.cz; h=from:subject:message-id; bh=D7LTxErg5nBRM3MbUkmE1QMDLecysc7WaWg0nG8dins=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpwuizA75+UF16qnuk37Z0x+LaA45EdHnR0fIQH GDIR5eKTRSJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg cuX0D/9fYCD3ElUInuZCs8htEiR3PokFl09Jk/fwUoyj8IN2zS28Xl+oky7AZx3njSxn9LL9kCL a0NvQHUoJmBc8y21USbPu/14+fKkJZmqLxCOyLkQIc3Dnw0G/zn6z9uswccBxBBePUYfVp7uN76 xjKAc+ETiULlqubujiSLiV1Uk8zkbYhbWtfoY0YbKeKvuf2xX09jW6jSCVAEH4+9+Jkyx+7zKzL gtVyFEpy5Ciw5T1pqlAHWP2QM2Exu4HaKfen6LPO6J4M9wTauWxw5bClMldC9cn0l7S40mxhYUC fzmRi5AJhGfXQwf5Bqz9xxHkHGkclGgYftbq8Bm6zOCH9nsuWgOMBYngDoUHwsmrGms7yt2yNM+ SALIBgNald6Z7zglmxHQviXJw4a9ULCNLqLsZu+ehVw5/mQblAqOcyouT7EtmDahnbQWbCNORke ignjgrbC1pXnXQa1+UnpvkCmAN1iISfQFv+wHrjhLhIGhfumTZsDkhHysoWgBO/xxPcWUveWova uEpuOpdrf3s2xPD7WgEwy7mnre5buCQqWaR+ZQdFGbhI4uufD+pMJF1Zn2ahEQ2NAYEsvtkhpQC DU6XUEJMTkji5aXjnLU2EkWfEsxsg5kw7LGAhLmTvXsJRB6NGrYo0uXT5M1P6xaipbjcuDOcsEk 4l1O1K36NTsgPHA== 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 | 41 +++++++++++++++++++++++++++++++++++--= ---- drivers/input/rmi4/rmi_driver.h | 7 +++++++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_drive= r.c index ccd9338a44dbe..dea04cf076eb4 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -494,12 +494,38 @@ 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; + 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 +548,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 +561,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 +574,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..2c47373c3d177 100644 --- a/drivers/input/rmi4/rmi_driver.h +++ b/drivers/input/rmi4/rmi_driver.h @@ -46,6 +46,13 @@ struct pdt_entry { u8 function_number; }; =20 +#define RMI_PDT_MAX 0x55 + +struct pdt_scan_state { + u8 empty_pages; + bool pdts[RMI_PDT_MAX + 1]; +}; + #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 Fri Apr 3 10:19:39 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 CC3E730BF70; Tue, 24 Mar 2026 19:40:37 +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=1774381237; cv=none; b=PYeqay4D7Tbn4Du5ax1847FysqkXd5ynH9C2CKWZ7F8XzZPq7a+xVhpgeO7CIDihIKbxRWUJGUmys42jahoaHTxesrQ/WPCySzI8Xb5hIcSHcSiTgmVxwsbIad22KFuWXtD06a8jT3AvxdzZ3yr6QtBYr2r7M5wI4ipC5bQGFAk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381237; c=relaxed/simple; bh=2qx54d071209ocyGH7nQIwEVJpZqWrRVUMn+5JIxUn4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y4+UALVFrAMoJVHRnY7hqXmjQu4dOO/Pv0vBdbl2mZzv9fL97enzcFcV86sg/6tFe9PUQ9EhftYvkzIEFIDa5V18Xyt1+6mSS+d/QbTUQ+AO4XNxEJNS/Eet7CW9oIIylLfwEcIlgHuci9bFIJNx/jO6lwWpcHDJLqCN2qQgexQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dT52nG6b; 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="dT52nG6b" Received: by smtp.kernel.org (Postfix) with ESMTPS id A65D5C2BCB3; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381237; bh=2qx54d071209ocyGH7nQIwEVJpZqWrRVUMn+5JIxUn4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=dT52nG6bo/sOjVefivsNMJfH5z26LsXkJ/HYfAFbBhxm3rlH3J1Glq/lGTeBFdqNf wZvjQN4vDA1OQFrgedvM7C1ZhX6S1LD7JcFGIOUkjkLyv7V5CIsyjqVXflCsRtK3j4 UEwtu6LieuxlSIhb5/YWEANwH1Vs9cl6bCReC49jwVrLosm7S4N4zn0O1+S+fbJXgF TBWKk2RnFjY0dWqKRBdFb2WaDbHQJZWVJvooBq5FA1v8rc1bMXSAkTKxmCXkKsQiAN NX2vF6LmRyALSbB/0YflLHw6jeuOOFlsPdGf1QqK6NF9UXSlksKmED+Xuu2+sd3NWX pp3I9LxyU4+Bw== 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 9813CFEC104; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:36 +0100 Subject: [PATCH v8 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: <20260324-synaptics-rmi4-v8-3-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, 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/ZANAwAIAWACP8TTSSByAcsmYgBpwuiziVInBiryitVZEQO+JQAVQaSJwpwWggqA7 fhG1O2QJo6JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg ciscD/4qDHEqP96d8O5ER74c+ghIzkHyzbr6VCBmcNXwydwzR/ZqkrA5gJ/qP6pzmBrHfOCd4lD gHct7X5lnL8eEn5wAhf76wlIjziajNVJ2wSIVCdq3paZyvsUADxHxhPp7reNjb8oWMCzSLB0Dbd X1tbgFfyX2VyBsJs0oWF7gkDJvpMzIOZhQAdMhvhUbbXCaiNgy774X9Q0gXWEma8bO8PREnG5u4 V27WoIbhxwY+6P8dNgaMRN9G6W194NkgKvvoFbiiQMCLsatmF2K6oL6hmRQ8rf9lyl8TIF4Uinl 8mI5pD0tHoUQ7IcN9xeUhBvoGSnvl4bb6WsmzyAI7ju48kpDuukxDhl5R+IPwSl36nL9morTgYP tZn14YNkOeXdnZTJcyZWMYCP5L+bjymc2ZVapvkz5iMvHBg/IrfMObi0p6wKlsboKFCtseaP/Aa 3yar+Cpf1UPJ9R0HrRa8hbX67O8cnO4wSiRyK4chGA0Xmy/QcnC6raL5X2bHrKMHqi+6RhvNM9N Eev+7tyNZD3fu+HzZgW8EGjcpIZ7LyqP16VtCbqtDiiXAYzJZRK1a7VP+7PvR9yyv5u7RQf2dx5 DAyROC5sVS7rh3tO9WdUtuGC2RTuVXwvJJX9OWI7ds4PYTE4eSUszbvi2bMEics3YA/9OLMe0Du nkkUk5Lvz47i+Fw== 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 Fri Apr 3 10:19:39 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 DF75230FC0F; Tue, 24 Mar 2026 19:40:37 +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=1774381238; cv=none; b=o3eskyVa/Lwd1RZDm/Z8x2VaUErEFmU2/3NZJuRDtkVozdeOfqkr6caStHWVgV6WBJD0DpfujyvvZ59RUtJN8OpZTKqkK15zjDYb5cAcmVXWR9aVaIMX71yHLKG3AOQsrK61hsCJOfUNK0/h4Z2K6/lY2vOE9TIGlN6iofZnpIw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381238; 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=CFBTrEab0Ft7UDm1cgqk6AqQpRwY7vdCJ/RNi0WAGvtZlBlF4GVimohjeEmawSuDWAKx3RgvI1nrSNxw7TyReZsqYgnVfdtFVtRG/KBNM2yG8w68y/EQ7squ2tHs41F1g02WfP5uvMA5btYjA3Yip621ETpPN+t921o6oPPtL6k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=H6UacMPt; 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="H6UacMPt" Received: by smtp.kernel.org (Postfix) with ESMTPS id BE00FC2BCB7; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381237; bh=BU6kdVo0x4D70Au3+d7B1+eMYVpO0+uLzE4YH6wdmWA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=H6UacMPtSdlGAM0kRe9ClzdtimofE6SaOzPGkr/5RNs5m2WMpwM1Xnf28Mvi5H0RG PV7qefx5PEKHEinVmf8/j4lulU8HBvdtl9JDKUTeiEIi/7tqAFYTFObrmMk5MEW8Gb eia+DVAGv6Ku8JyufUp7aB+9DihSZPZZS+oh4bKsXE1RFn9WzBjcIv5hbW1NEaC55P AIL7xy1jE8cqF9HctYIvxqa7/24fZCdRU0hAg5wtTIvtesK1vuXGpSRj+74CbALPyC V40OxxxmYLANDOm30hcv0XLpPKiP8F6yfzdDiTW3sZMXzQRFntYZak8dG4Omxhng9P bc9vn9dIdvttQ== 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 B41A4FEC100; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:37 +0100 Subject: [PATCH v8 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: <20260324-synaptics-rmi4-v8-4-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, 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/ZANAwAIAWACP8TTSSByAcsmYgBpwuizsK4wbsCpKaelusCTqcOTmYH5iCrIp7Aaj bx1cvZplzeJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg cpSfEAC1mYqRx9nANs4VvHg3Eodu4ms5VZyhlwzQYVSPPPnue7tDOLzk+GnBJiavMuS6tf5FeK6 +JsCIKEXZ6in228e6fwxbvyxIbb3d8tQOfFMbS4yzW8tL1gXd+mf7MJ+JB2dWYoloGkRMZIuMY6 Zyhs/WQgbas5SC2nfDrE7S9BTKQzcVp3mQDbuXcNu9N0TS8C/51+5GFxh/zsrxDh8h0N5i84LZQ FvKQ/1gbibyfeiAZC+AKPARe621vqtfkCxJir3rsuCDKt/XGXg5pm2iLdjmNTdi+Kn29EKi9BLm WYJnX3C2rw98aW4e3c4+BcUjF92sfzKJztkyYVhvJDuVZnMbz2uZegD3+BpF+m3+5xwAUMStKuh XLiIUDu0oz+p+qYD5OSZefbEZ6cxSxHjqw23sGInCkO8I4fIYB0niCwEgbwN2vRFUST3nZBpjNp Uke+iyjyuy2+tA9hTN36qCws079kjeJCWRjbZr0QgUodS1K0Ri6vgTm0HJizU0UCY45gUm3FBw2 0dhtrs8RA6eykM4Zh/Nz+savsgycC9/r2Drp0cMt7Lx8eGqTJhpG3EbuKKLlrJynQZ+V/k/EQCK ezRy9uRvzDUy9TKEIFX2fRa+Eru4ogWIgPihx0We7ptGbIt99l3Ycu1Z30DaEXR20FRhg/aqjFQ Rz6Jhsw3CGpwn5A== 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 Fri Apr 3 10:19:39 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 2586231691A; Tue, 24 Mar 2026 19:40:38 +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=1774381238; cv=none; b=sLySzvH2W6hwQs4hZrfmeGboNOqUCwfvLcY7y826UR8hxCjleTzrvbbCTFLlzM6dFuFteDVHKR+680ajO0cdA4nZPqXbX7wfHS0KGZNPX8/P8fTHsMPlojLw3ZUUFxgotYjt9HkalmGe2WrkmDZBUS20I+gkUwPTV2BWfTx3J+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381238; c=relaxed/simple; bh=VCse1xCtxoF4MyEFsHZyYJfrLmDWd9cd/+XS4IjkZ5Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O3PyQxlnD+z75OE/4N0Pa8NzIIwNuFXQ97QWdgGbu6Iz//Sao/w8qebQHcQ3iSdAutzvw8r58aG0qLtw2EBII3FEBItHs3UohwG3lfaeweHxDfMQsiyjzTBRv8TYtWPzVxnWrPjnrqE2H3MkcZIniN5fQId5ue+bs1JfJT/0JUQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=s/ou4nn3; 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="s/ou4nn3" Received: by smtp.kernel.org (Postfix) with ESMTPS id D2942C2BCB8; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381237; bh=VCse1xCtxoF4MyEFsHZyYJfrLmDWd9cd/+XS4IjkZ5Y=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=s/ou4nn3BRkMDgMGdlcSLPB3x2JLF31GA4loWC+T/WZHTW2lwN6lYdzqJGOa7IPdE 5WwZWtDGjpXVviUhLgneUl7ZzwbPV828b/iNptJHm29UT5pluEtuPto4WAguAVn4FG HKKbFFBcfj5arTzlwzTFXNy2IEK8RLCIfKIEu9MXjs1VdgVjojIqfL5o+RiCX5AoxM cMMWfaWF5U4zQKug+0u9T7Cy+Cnl6danPSTgQioNPWJU7AqlfAsUFspLmlaB7hfr4/ 5SX8BJEituhNa+FIvojGWBu6zYWZQNxtqxeE7zwv7yq6T+5noLhXinoU7UdKmi9Jbx +FCCWhXflhevQ== 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 CA6BEFEC104; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:38 +0100 Subject: [PATCH v8 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: <20260324-synaptics-rmi4-v8-5-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, 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=pY5k/gqKTi/BEjLe/7aOST0jOUN5xJW885H1HFH5k7g=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpwuizj1L2aPn4MWac2tmQe6Qi/G4LK/0KyGikI U94HP8mh8iJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg cob2EACe4bPaqNvBuA6OAvRf5kP9P+B4hA6NPtrVYoaFG6S47TdvTIHi9rUl7IhvrmluaRQ375F hEexpWn9xoYcoDw/2sqxPvC0bz1p5YGDA12IJ1dShlK5FdDqobL2gEF1TVi3mNFouHq0cMd5s6p wWymAkE+cMf6Z7Bfp7S1AGoEGlkAI/9iFsTAbDnZgH1mNiuBo1YN7ZQ8RznJ35ZD465atpbUia/ 9j12Hj1Zi+VzcoPAeENeG77NkuwoVd8r+CJt5KtHZjaJQkMojEvuXLVbr9bZcE36G1Wy+D/VsGC 5crAaLcdw12jA2agAY70/63MyulyujOCgWlpNaeS+JWeOnlCkQLMVb8Tn2fObwMI879i16eQRwF 7LfFC3TvFP4P3wNzWFAWbIEQRVOI3MdERz/3HuTW2T0ebO7hJZkyViVQwByBXC3PvX/eWacderx 58HMG86iUog3HltZzboHrn/m6diQ4etaFVg7TK+WaMZv2+YjRka6xM16qPxxqM5SuFau9fnkQLl n1BGgQd05rGNjTAtD1kLh/p5P2XMJdNYtjgE9GcdIxjEwiRnGy1Gf5jeMdy2sMRXL2P9a+u+uaH GN9fJ7eBcDND6sK+lTX+o2pd+zNtbFsiO5diQgPGgAQXbr+6p4WYrn5fZozdHhULfT1BX3cZndd mrXFzZqxl+cCqzQ== 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 dea04cf076eb4..fc84799c36e04 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; @@ -1078,16 +1083,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 Fri Apr 3 10:19:39 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 254493168EB; Tue, 24 Mar 2026 19:40:38 +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=1774381238; cv=none; b=uXis/3B1fxh3s6tafY+sv/sYAEaVItOWMAIzsMRFN7lL7ICJ3Gg6+OP0GC3p2IMQb8U1gbmGe18jJOVs9gq/94rwjJClQlQRC3eFT0C4uN+luLYw3fgGRINVfnAXDOHQUS1SveacFv28vyqeCJ7/T/oyhxs/TTqT6DQCykeehhQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381238; c=relaxed/simple; bh=Dg8VJs/6qaDCZA5ZK4yQ/nkLOVVgN9sIgg9C2DqA2gE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Yas6AqMJGUg4iqr/7n3UipxcI5JOX85DJCEJD+K9D0BCMV92kOrHj419fs+ca+BtCfEeqeu44IQFln3rI4a2Gp7SxQpwVHQn4rQQjMRBY954cJUUFXpaxMpND3RSZaoEap/kTzOiOk3B3dnmWbuga9V52Tbt0B+TZU5Nuodqs2w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=licYyHWh; 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="licYyHWh" Received: by smtp.kernel.org (Postfix) with ESMTPS id E900DC19424; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381238; bh=Dg8VJs/6qaDCZA5ZK4yQ/nkLOVVgN9sIgg9C2DqA2gE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=licYyHWh9UGw0Z1DxRbkDvywClKLnTm7S2xE3xihmb5NnlWOA29tiVaCofVmPQjyS NDO+r13LY7gUgItnicOyG+OFY/4vr2Ymk1fCJ8Uqs7KNQ0QnYLdes+4dVTTsY7gxbE CyFatEg28gQ/ioG9+2Epl5ANBj85Se+TIO50cGLZ77ZX8+bB5XOr4OoZknOcNVVBad VicwQW1epPqzuhmE9ajtMFEaPcAP9CsCYTmFtUbBQVWwn0QTA06KGjs6AaR8u46o2S fK2gPXQm6XiM0KsEmU2k+IFAVkTMQJ9u2mQQ09Ug1r7jOGbpvrDerVqTxBAIhQsBJS zaoDzKT2K9idA== 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 DEC69FEC107; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:39 +0100 Subject: [PATCH v8 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: <20260324-synaptics-rmi4-v8-6-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, 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/ZANAwAIAWACP8TTSSByAcsmYgBpwuiz73HYFSz4nvYs55kwH2sVPDHjVzycuzdMJ 9dqxbcxelWJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg cvLgEACW+vsbDps/I+o10IjyH3n1mPzRHIoKgx4RNG0JxQcL0qL1aZh1AoKsl3sJDOxh9BNPhUH bN7atpm5IpetbAKYP31CE6MeQAqh1O105msFY3AL7BQAevkKKOMppPkGZ0HPlMMOkyWe4nSs7su Z+2L4b22MINxr2j+oIeA76wPCZbpRA8iIirQ6ANwXe6Jx3FXt1iH1DkKPrp1MhuQ3j8Q3p58wmY mD604EZfH0aB/MddniNDvTe84RV8IUBewPRDKrS/s/RO92pkz7PuWx5NMON/2UpR4COEXisRfJp UxQSIKG9LCYQCtrJZNk28pOU+ka0yUVkQXliv6Rt40NmBneQBAOIzcBbx1RplZjfCB8lEl/Chet HJ2E/WMg7LD+o26+sPdrSHPwl7g9mRCWc+PWG75J82Kqm4ceuC+Cg30Vrb6skrNYJgaYpoZzIuB OLPdTIMzDrYbEcFX2uPGpi9Tkso5rhzgMwlWyzii5V2xHD7PNfkY1cfsPn7pyPLHlsETrxvtcNU BmRQX1rfhQlUei1S3HmwHcwd/dBZTW0JvjLnMPhE3rO3bnFCf8huxM6iDdDekv/zGayaFPX31Vp RKrF1NA2FfYK2B17XSwduhDKn0F1TAFqqy5ZZ61w5zWvAmJKeBDDI+nKPX5oqqB8Qy3Xocwa6OQ 8HLotFs4tz4xwPw== 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 Fri Apr 3 10:19:39 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 3A083318EF4; Tue, 24 Mar 2026 19:40:38 +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=1774381238; cv=none; b=E09TvC/xV90PQjJcQpPwSDcTSOKa3a7iNK750/YHHE6z2lBxREOgz1aksycnqhuduxuLQ6yHhkgs4LKLaPO2gBFT6ghh0uZRUWzo6C42Odz2I2tpitY6DVnkuxN6ZJyRw0LFb4FzfkcEt0I1VtZSVGSfovKt7i9RQIefggxPrdY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381238; c=relaxed/simple; bh=vv7Jx5f+p3CbVVrajot+2Qq9/m4eiTjIeY+O7y7B8LA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DxQXyisuT36xhKnsNBSYVsFlhaEMPaQXI5RI8zqEkDDkZnMIEp+mLCHAKJw0eAyVI0R/6b9NC8HbhC1khEEbiWlVzq8U6XcB3ZCsFhq6q5EjWmXtfjDPDO49Onr1LysBbVM5XKDCvRNymzFexU+BnSJ882UD9WmOEonKRnlhUwE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JTHwaOTh; 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="JTHwaOTh" Received: by smtp.kernel.org (Postfix) with ESMTPS id 09AB2C2BCB4; Tue, 24 Mar 2026 19:40:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381238; bh=vv7Jx5f+p3CbVVrajot+2Qq9/m4eiTjIeY+O7y7B8LA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=JTHwaOThiYKOWS0iXVeC0jyhB967r3WwbIP8ijcGIY7TpI9zDAIrTwZGvIuGhZxLw du9YKGoFoLoZTEupr8Avh4PMgZxdiEr3uNIa0EOnDVBzB0V63F59WgzTUc0qZakptQ Rtyj0smxObX+gFg2iOnHEhjjnUrQG3g2B/mH+pAPmcYxyHB/2GOpzEQxxDgT3UNX18 UDN1E4WTt49FebYJAwLVQSCVe1akCcSuyIqhbm7Msj7CF9wrf0Nf8q56GoQVnQOM5P tWLzOZwLZ5U35LJL+Zuk/6q4oowj1yMiBsJGPFRwWSUpC2zvxsu1LR97My2LeKIuHk NEw6oqtaBD03Q== 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 014B9FEC109; Tue, 24 Mar 2026 19:40:38 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:40 +0100 Subject: [PATCH v8 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: <20260324-synaptics-rmi4-v8-7-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, phone-devel@vger.kernel.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5957; i=david@ixit.cz; h=from:subject:message-id; bh=oycBmO6+alAHChTgcVntFPjFGi9MJgeIlaP3WOd+GKk=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpwuizJps7ZgGmFw/XEevWBPL92vIX6eVe2vcnH +CpwnZyzTSJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg crM9D/93iexmaEYWmKFC7sNr44+vewYC7OIpu3sufVWsGHFUq44LzxHHQpMCGtcU9IjCwTF94kj yFcJM/KvKu8UMPCngS3+ttekoRBkhiZhUGYhVMGZAH4MeAQyEHyo4SfydT4rN7vOIqPnfY0RDTU elfPW4uUr6go/PdBmbzEcQS5KZi1XpWIq6Br4K6YVfMbJHofRtTibNPBvbr5m/6JzmMCmOJHYEQ 8Jgz7UNqfsZjWHvY5ye36kK4uzR5YoujnBMj4cS5zbsjk7Nts41lxnxjv1Qlrs6zcJ5oSfLGQ9k +Tu+/zUegB+hKROxfxQT3FO3OH3hI/l07pjJjvO05zaiygrAH+PpwFluDgbLhu2o5RkVBbLCgRT a8AGQTJuHGfo3WYrKahc14s3ZtJdLQ8sup/hDYeaHY85PIOVSSMk6WKPpchrPOPNzwwk6qQdw2G PYm+REAJm99W2TT9WKHAv4+wqiE3u0Cj2iQ4z+EPLKrdp+8vMUEAf1evVHKm2FpJThCu9uOcKsU AUwMhB/5D2CyzBqSD1TLihXlm2snipzPgKDsvr1zwGx5jt309mf/uJC4q+LmWciGs9/Xu9Gu2PX F67NwWoUjqnsTbeEYIiYeKwwRMubuXsBM5L2+I0CfqNIkP/+pCL7k1Bkd7pXU9BuZeUHSA1aaC0 8UrgcD2SR05OrgQ== 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 | 63 +++++++++++++++++++++++++++++++++++--= ---- drivers/input/rmi4/rmi_driver.h | 3 ++ include/linux/rmi.h | 3 ++ 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_drive= r.c index fc84799c36e04..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]; @@ -522,6 +538,7 @@ static bool rmi_pdt_entry_is_valid(struct rmi_device *r= mi_dev, } =20 state->pdts[fn] =3D true; + state->pdt_count++; return true; } =20 @@ -546,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 @@ -1023,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, @@ -1033,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; } @@ -1158,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 2c47373c3d177..a6a29fde49f35 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) @@ -50,6 +52,7 @@ struct pdt_entry { =20 struct pdt_scan_state { u8 empty_pages; + u8 pdt_count; bool pdts[RMI_PDT_MAX + 1]; }; =20 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