From nobody Tue Oct 7 01:56:31 2025 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 81F4A2DCC13; Tue, 15 Jul 2025 11:49:12 +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=1752580152; cv=none; b=Gw+x640P2N4wamJxs5VTB9+6yNYKxrfUdTPdHsR4NT2H2o6N7LbYjoq1DmaQSqnwnlIXqApLtTeW/d4560BxLXj1MxgnYBXHNKiZMgsckhidGJeZnLTVcbt6s4ZFOQzDgp7eZarzL9cNqdNhACSIczJpf68P9efTCfDe75cllEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752580152; c=relaxed/simple; bh=DYbbVrjqWkoup9Q75iFzh70qZM5vDLpxKKe1FlyKl/U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OeZXrC6OfLwtu5gQxTe50py9ap4vMtT7gd4tlLt0DHGTwwQKJyMsg/R1gRwYnt1EzS2haLPSXcqixF+sEo/JtUNSs7/BF4XxYZ3s8APvmp6y3SLHOlYSHj7NJG4FSleQ73i7zeJ3ylZ4ZuKGjBKbFPGVLs+MK3GB8cyrRCGwMq8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=GtHoTJEM; 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="GtHoTJEM" Received: by smtp.kernel.org (Postfix) with ESMTPS id 2CE14C4CEF8; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752580152; bh=DYbbVrjqWkoup9Q75iFzh70qZM5vDLpxKKe1FlyKl/U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=GtHoTJEM6F6rOLQFsAbGoD0/5NkYhrk0uWmaCIwfdckw8cn+8C6m9f52qi8SvmGMc RA6p8hj/9cfx8pubHo5Ft2sxoDyst0iikifK6OGV9Zq+5v5rFHZ79K/Q9zugoDBPDI fuTA0f1xtD6aTy95K3lASO5oGz+sXu/CAHxlO10VNJwG3m44VTyVmrZvOBuwqhNyND bEd9c/qEFNUTQMb2tj7tiuGtBcaajlm7f+QVYxTo/kZ+qnKwAYXzDV7AVt6yftzhte Yq7g4bg8G+ksGPxJL+J50hMuUa6ibCow6J1fMju7X/2//6g/Vmb2s66EX42XxKeZCs DlyafQJUOiEzg== 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 156DEC83F21; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 15 Jul 2025 13:49:00 +0200 Subject: [PATCH RESEND v5 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: <20250715-synaptics-rmi4-v5-1-ca255962c122@ixit.cz> References: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> In-Reply-To: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Connolly , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Krzysztof Kozlowski , David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1304; i=david@ixit.cz; h=from:subject:message-id; bh=jlm0TtzM+qwlqfeZi52UxUZv7l7Eivv2BkocqxTGAHc=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBodkA0542TUS1GhEXdCACJaU7dwt2BzADN4kt+k 0XQwmfV/6mJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaHZANAAKCRBgAj/E00kg cjmwD/wJ+i9YGl/wWRC/JpI6fnwMtVKc2sBAhlgJ0QwZrjR5Y9aI+RT6TzPQ/RoFrBkLyj+6aIm R937UWS4QiTRk0nibiWQa5xMsAW8zbe8sQaYoc6IXRQCni8SuzmKCA/VWvaab57DXvimSbs4o/D AQZy+hQ90rRJRRqUdLM3JqC3tH9316wMVlY9Sew7pRi7qjOJJ6eZr+tdCHnIa3yKJZhZ2nYQJS1 5bRU9LNrmkv1XP3CqXrE3+OItNc+qfC495RKjZ/bC1y/GIcz/hdxktwnyFffUx4C7RPAiSmJ7Wl 9F1oxbWj1HNbObIChuA493I4QZJySlzNH+7/GlazlooLlc7zEdFSsriZrubPYA+5dDorMK9h0eb Z9Qw8rcLT7UBWL1IizDBlVGP4CgIM8iPjmPDLsQMhSxDdcAAlRd2zgj0HGuoF0vi4dCk1iR4P4k DfG5IfGyuL0cYttEmvLC8SqmXZzxNtV7aCSIAB/0Qra9qzuMaHhs4Owwv/tIL3eLPrrLatPOOk1 /JjI1YYDw/+vg7idiB+KviPUA8+95aSUoF9iBEyXIJzJsj3S7d6mB03bAVBqEZFxyhgaQVUZ9kl TsJwl1AnkH5ziUVhOnEDUdxo5GvjwB94QZX0kQj08cx+Y+SeKpzyHH5SwZsPW83zLsbA60scNCx tEqZjdPcsvnvDlw== 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 b522c8d3ce0db719ff379f2fefbdca79e73d027c..d5d0225e3826fa5a0559cbd9911= 5c505ab113aa0 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.50.0 From nobody Tue Oct 7 01:56:31 2025 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 8D6EF2DCC1F; Tue, 15 Jul 2025 11:49:12 +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=1752580152; cv=none; b=oaduw8G6bq+4N2YKpfAAqdjcs2j+Yk6Fp+5ju6ruvaZNp8yeL4UGb4hT5PxS+Lg1BstsMy1fbLpvz17mevcV56TGc+AQEmpJpHUQNU9KdrFu8Pjkyw1aUwQiqPftd895DuDvPhe370toLr8dFhzu/aY15BnVt6wTmJU0sUVleyQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752580152; c=relaxed/simple; bh=K3YyvrVUo9TJ+BoNxaTwXhbXTnbVRUtjpc3gKo2u96g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JoLfu+53OTPnJLRmJ1QGuhHGwiU1c2YnP+ZseqlYZwIZKOHEFiPPG5FjOFVRGFbiK4lmbKsZyss/cEPk7Ra5qzd2ycyDryjMXZS/+OCB87+hRSVhe0fnx/URTHSDdy1ajuB3PHxIFtiIABZDuVtMBGB/4w7523ei1nZYbn3voZk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=j5EJ9iyw; 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="j5EJ9iyw" Received: by smtp.kernel.org (Postfix) with ESMTPS id 35965C4CEF9; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752580152; bh=K3YyvrVUo9TJ+BoNxaTwXhbXTnbVRUtjpc3gKo2u96g=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=j5EJ9iywUgxi5tUx0U3szIAM/W+7FlxmyfQNoMoa+PQNLHSJvwDw6XcR2svW7zjHc 0xoS7q8Lm+Lgi3oDBmOQxlgSL29o0yFGykUQIyqZrAXCEKyQjRF7XsRuHQ74ULuQgq WJEMgX8R4Ipp2YbZ7MCmrAE8I06s+PZhoc/dayt9vayCJIRrfZCtwSSUZdMy5I2SEf FLrGatBL7dvo3WRgzptEWhBBJTNR3R5QNo4rp4pkpHeRaWv8NrpxIE6ryUrcI1n9rq dJix3tjLL5EdXxucJ2vTiM2uXa52w1DCRK99CjCEm++ds4qg4hM0rpgGiF7ci53BHk 4s0P8JnuPlXWg== 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 23DD2C83F27; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 15 Jul 2025 13:49:01 +0200 Subject: [PATCH RESEND v5 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: <20250715-synaptics-rmi4-v5-2-ca255962c122@ixit.cz> References: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> In-Reply-To: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Connolly , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3909; i=david@ixit.cz; h=from:subject:message-id; bh=DMyfmGUjTKWkjf5dJQfenW4XErBynGEc7q5TZ856CIQ=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBodkA0uoNTZ5PIKCSrNjx/8FWKCpvGOHd1NLk8/ a5zI8/WhnyJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaHZANAAKCRBgAj/E00kg cuhFD/9KrJPjQxFYJXITh9nq4LzZhLCkJyy0RMyk438mS+17jD3iAoYVpVgJnSNoyLeY9gqSUb7 nhR4+LsVLmyQICgGw6ykGjFxc16Q4NUQJzvln2IkRgmcz8U7ZFg3cDDXJ6Tmxnb1GuyGo7xyT9p kvFjw1YoxA1AYkw8wxMXMAr5AnrF7KbxnKvFyCQlpdHo3MbqDu7CFsdWUCjHX/dSHbiN7BcaiQG 7Bd26T0f9nYxV68VpFiWunYRojavSWk0lmv8qnkXXTkHXTDKu/kw3Lwqs3a2I7EEn06mKOt4fST 7LlrzBW9PO5pws5cKWtFTk+b/ZFtVrN9xOWlOKQFq43zNNZ4znnbyKKc2VJ/KJQeCGMCHqHpZnK TQIlWIYxE77AOl7IOonCCLTKsKJhlhJ1CRbkDJlRyBh8np4m1fSJa1TTLzdurfyyIersQ29yx/H ZjdZ6dfRH8MKq6QicfmcIDOGi+iWQmkXJGrJSuDqWJuWjAuwg3Ek9OlWVHjZInaL957ZW7aSxoc rTnxDh0PQwKJOfRtu8FNF46Gx8atfE70pFxLZ2zlbOi46InUzKSqnUnbwXPA0HR2BHV+PAKOWdH mAQZZYyxLRtGcK9wJ68+wLhABEyUN4ksyYeM/uDwy0zE8TawI0SwwHDPW08TjoScDKqX5oCUyTx eSBRgv0blvUY6xg== 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: Caleb 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: Caleb 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 2168b6cd7167334d44553c9c566f870a4e034179..0f6dbe586c652d641178f43ec27= df3613126ca66 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -493,12 +493,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, @@ -521,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; @@ -531,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 @@ -544,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 3bfe9013043ef3dff46249095a5b3116c8f7d9a6..cb1cacd013a3f39db96935f705f= 18018bf15adff 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.50.0 From nobody Tue Oct 7 01:56:31 2025 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 8D68623D2A4; Tue, 15 Jul 2025 11:49:12 +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=1752580152; cv=none; b=RuRACuKJ2EutttjIHp9YyYSbB0wQaHgdeGEWBFYEOGUMZCNoHEa0sQZ4m4gkklBswy+E7m4/QPGlNGkyhGCVHfVWpqKo8I4uagvYjZePy6942EQCc1dYHdG0Ta5ItrgozDOE+FBbLurd3IxQxGOwhqpzUwCfeHzDST8GnEowfy8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752580152; c=relaxed/simple; bh=+v33/GT8VNZ2a0IWr0u4gHxRzbuIIDZA/HnlljjzVo0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RBz2uA2wJ8WS655QjFWV8Tl3ualDWQLITPk3aD0uieswEGw/CAzKTcPkCPrXXJjM7XGkH9pQJ/Y6P2+4wQNReTuMQJNWzmK2jME0ehTDNWPnrAnLr3DmTIl3BIzFIaFqgNK1XHGe3gsHBY7iEyYXVh410hOPu/jhvN37kmEEfEM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JwxE+k+/; 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="JwxE+k+/" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3EBEFC4CEE3; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752580152; bh=+v33/GT8VNZ2a0IWr0u4gHxRzbuIIDZA/HnlljjzVo0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=JwxE+k+/KBX3n6xjTNT9/miOHo1CfVUbFEsmtaGzHS+HIf8z5vcpUpODf/TLW/mh6 DOKVRo9hrBfMwVvBVI7VgCrAfuGQsUCR8iTJakLJwkfmKXDZxVtrCozNLOmv8YN3Mf UA2F4m0yOgB1o46yH09n+TA4DG0P9DAWfj/rRFmwEcatkJli+vEBdig5y7+Z+o0QIJ 303aKsACmQW+mee01UFQojPk7WoWQHi6mHpDF5/szSdLEBAuKWlKI+c6ZwsEXLB44F qMsGjB+kLwlg5F5PMFRtwu5Y+UPBo7wj7sQ5SXOu/ZrZQ1bDkXSt/zHpaTwIpPDWmx IgLyvyTUr5qnQ== 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 33230C83F17; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 15 Jul 2025 13:49:02 +0200 Subject: [PATCH RESEND v5 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: <20250715-synaptics-rmi4-v5-3-ca255962c122@ixit.cz> References: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> In-Reply-To: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Connolly , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6241; i=david@ixit.cz; h=from:subject:message-id; bh=wWX9Nwa4G4RJUBvdMkhnVjSL2oOd+Af8dSjqvQue9y8=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBodkA06fTD/F1ed8dL4rjj2M77/9DJaD6zQ2zVj 4hVbf71z5KJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaHZANAAKCRBgAj/E00kg cqTJD/9xeHnQPoBBD2AC8FW98wSScjx/2jl3hcquCeJZywvF9BKtKxcelbSg1tC3bxNov/DRulj bBjdo4FNrE/NL55wFUK3jIahfJchjW1zTlJNuU5wQxpjmjFS0KxqjlRvLwpjNBIHe0B567MZtqN J70kHztzdK3jy7wkGQudM5x7e6SvH2McPcbgvAtXyrb/hSGH+tOYypmQHVan9H51voXgxBYSUuM inXj5WFMX0MlnDuNEOTCtrWZPUEBvzRC5375YXAdjkjfJf0bfSiAyYAcA1SXXBOPIP5Myl55Ds7 W/XRDYI4gvPe8dhv1F+x24q2NhKjBFLtHpZF3sPCG0K6YQ2gjDRaJvv+tVe++PocAVHCNceo76o ArQzN4VGJkZSxk5gMTm6reZQATU/G1zEQZUUHeCd0VOep9DF/Ht60pOpQGzV2nbtQSrRdlrQKsT jLg4LOrqf3PuKnB758J8G6yTCLPtiejIrrCUODuount6pfPDZdhW5WF5PDp7o4ow/mdCwJR2Pb9 9vgqQgzZC3gRcEeFMxLfI0oJWsr6LaWvYLgn4krRXYcBEATiJRr9H1pibgR5N0rkuGaYEuwys/u W6MvSDPX9q70+Jl2hLZtOO0QHhefhu1jGkVUttZzRNQfw3QijIZyc5KKUsxMSFtJgq8nTIT17Wz mPZ8KsZVu06XX4w== 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: Caleb 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 8246fe77114bbd8b795ba35d5a37ede8727fc7cb..1a103cc5f2235a6eafd7a3f5b89= cbfc9e53203d2 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.50.0 From nobody Tue Oct 7 01:56:31 2025 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 B75C72DCF5F; Tue, 15 Jul 2025 11:49:12 +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=1752580152; cv=none; b=gKpobzCqJe1PR7mUdAVoUD9DnIIUfYNWy8XdhGP2dkAudqtvsgJBubMb0WDgfj7oQLHBJUbWoZjZeWGKMrdoWqyU0DkwFkK4P0sfY8qxv0onlKHxSFSD5kJp78jCxlY1LNXyALU+zDLE01wxJmzibp0LdofzOLjHclYgEDk2a2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752580152; c=relaxed/simple; bh=iwkJxWCzdw/DqxSg2p7SwDIf6pxYkQ2qU47CMRtmIv0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RdIu0ZJsub1EiCeWoo29YZzrX5K8YmM1UKT05AmnLzSm+k2SuMfFvblxR9Tcx1FtyOvrqQM92buRdFkawn5u0m6j9f9b6FEmYt5tbUcPriZ4iRvUc51I6BGg9aoH3nLAoUtEXglzCGcGAdbQ10XrGlvplW1gxu3C+1R4vsEooN8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V9ZAJEBR; 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="V9ZAJEBR" Received: by smtp.kernel.org (Postfix) with ESMTPS id 54242C113CF; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752580152; bh=iwkJxWCzdw/DqxSg2p7SwDIf6pxYkQ2qU47CMRtmIv0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=V9ZAJEBRPWJR3QIN2ftNRAWt9S/AZ3FLjTOq43zBFkSIT+k+wECQfy5PBhWCDYAXt /jNrAGeRV8wizwuKhuvoNgJOpb1tYwm3BDmFIAXF7ZznPW4HIdhYBKbzbf37nvizs0 Ras8Yv3ANHRQ1lrcjTEJD06qwSKdG+olE6YXnO/HHMGDmafSlX0zPqaF8a173lOiF9 uC/wdZzeQAzg35jdvRlOc/ZOPFQ76NqhwaJCdOJxyRyYTFySZoqwgrLwWdT3I3/Ddp smbH8sITeiGMmM9TUq7rtr7+VgQzQ4ncdrbWacc3CRj7aOHSIJWl4Io7ZQ3ZLD0G8q RLHapjdxIcTuw== 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 410BCC83F2E; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 15 Jul 2025 13:49:03 +0200 Subject: [PATCH RESEND v5 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: <20250715-synaptics-rmi4-v5-4-ca255962c122@ixit.cz> References: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> In-Reply-To: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Connolly , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1193; i=david@ixit.cz; h=from:subject:message-id; bh=A7OEIYExnthRZy4ymNUZNgZK4sBdBKSSdlBwvDvnG2E=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBodkA0QZAibncQ1s/mo8VQvjALZfHDgWvMVr1nt tYHJcP7LY+JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaHZANAAKCRBgAj/E00kg cuDcD/46CbHny1DxeQA6WAL0HoJPZz4HDmuIqAd6q6Bn3jt1oXvkQAHjr5ldRee7pyCJ+EN2Hq0 HeHpOUlvszPWcBboJqjtJ5kzuTncCDx+JsgY6ZeG31fu5VvBnoR77IDkDfoXhStq1G89GFFHTYS ngZFqWQ/MV2PpVLbGV5XGgrrFD3vNcbslGYulHyNGOHkKwk6O1nUf3gVvO6r6pgwZIY7ULxzckl GcOQU4Mz3ntJUiyaY09ZW3hI8FF7WmtDK/YIS/uk7rQoGCDhRO5dqNqRRE9jP6p/HiFn8IUpsFw fQaWi0ZS5mHkIYfs7NSXBr78tlaT8KyKAxZX66h6vOhbjtPr2bFLpassZJBH9RJWN/jQ4On7Qhn uonHZCs4Yq7YZqeCELf69MZ3p2inpXCd1noFedz/FGdDXeT7xaWCcSaNsRk3HGBUvKQR12Dllyi rOU/5hRM747Nf8pKrvE8D57QAS/d0ljnVl39Gx5ccF7tuRqQrj0Bv6zl71YjcToOncYPNokSbC6 BRNkW6sztjLfLxtgimLJp3WjJk43EL3OkVVKOZ2vDpHFjjhxZqY22F43/2IOvogMhl2EEvaKFn6 4RLmFPlLW2BxaRQXn779d9wqp+j5k6r3Fbse2Y+rkkRadm3unj7ogrPnvPmeMxvlm+hgervyDOD EGRLstT/93Up2pQ== 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: Caleb 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 488adaca4dd00482cd1106d813b32871092c83a0..776c915b82e72b8a6eb5ec701cc= e9059c87089c4 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.50.0 From nobody Tue Oct 7 01:56:31 2025 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 D150B2DE6E9; Tue, 15 Jul 2025 11:49:12 +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=1752580152; cv=none; b=MZgC7lIMNeGMHnPHKP+Bcsbr/qq0HQAJnzx5DM3YxaQ58LzPpl8LFeAMFHc5esypI6NBXrHvUoBi9hk8vkXezSJxltcleyUzDTKnILMdHl7lUYxyyIMdtKn+OsKEO+Lcg0P4RNUelh/7rXnwzHxXIGvaVejXEgurlioohh+ZHbg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752580152; c=relaxed/simple; bh=kcVdgMNyxkprvkrJSVWIaBKv0MQa5679dzIj2akZEUE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ckwVUGAcvodGLHZInXSk47HDGU2XbkLECK/My54kqc/zca2/J5loYZjPaK/NzhGllovV6mLp8P4J1DVRjgnVG/kWZ+zq+tMtRP/10E1H5KipS2OombiTdcFGxR4WsdZm1Gs19Qmf+A9RFHjVoTUQBetiC9j53D8MDIfPCtuudzo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=kg9iy2YL; 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="kg9iy2YL" Received: by smtp.kernel.org (Postfix) with ESMTPS id 5CE17C113D0; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752580152; bh=kcVdgMNyxkprvkrJSVWIaBKv0MQa5679dzIj2akZEUE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=kg9iy2YL0FAjnIsmCNpqZLVAq2F1n/txlM5XLvylO4Id1SfugnkyBG/h3PlxSSpMZ iYtqSeDjCkhAHA8YF8B9KxrSjiszUDM35vbYCjLTYK0MwRqRolIejabTBYZ74tJ0bJ vrCQJNvhKMPXPG6LUPG6jzCrzksnTwaYisdXP096r+0/2AJR5KVWUThG5c5TiZPsds BUFeUTN/LSb+2thfmCwO17BoZF6067gGEZ0iNKiltO0eXNGnYTkC34g+Q/sV4xgV+X pccgk2fdjZA9CV1A/4YrEXuT5aOYhcOnZFmnje2sdbF3eN2trLWjUYtINdeSXLwtDv mZcqBDU5YN02Q== 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 500DEC83F21; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 15 Jul 2025 13:49:04 +0200 Subject: [PATCH RESEND v5 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: <20250715-synaptics-rmi4-v5-5-ca255962c122@ixit.cz> References: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> In-Reply-To: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Connolly , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2474; i=david@ixit.cz; h=from:subject:message-id; bh=sP59iLntdNydn6cGwdMRKHmsnGb09LYhSRQOTcq2UmM=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBodkA0U00JJmtnQ97oZCmJKgeLP1RABAz3ZJDA2 FRM9V3UxmmJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaHZANAAKCRBgAj/E00kg csQaD/9h/CUwpF5v8eNo1RLL5GBWKzli1ZLg166bOY73NGZ0KeD5veqOUOUB10pYQdRx17Kgdv/ 2dgZ8Lha2dphOgGxnpmvDGKqVzoACV9wXK9BwNek/scGNj8EdylCxSM5SAbeMPujYjCX7a3/Dgt oxEJO7+I25H21a4k26Ql3qvZd8lpPh6HhKcyDjBqxUA5qJ3Arti8+stTjshUax0/5VTNhtUAXws mUhYIjmPRRr8gMNQQCzMNfigtVKw63crQESpGaYSbWetILy9sMLSgG4HyCeq9cVylQZshppyPH4 Hd2NtciAK/zSHf60Zt5BzYtb55QDKu8oGwrBnQe/VQoVan9RhoOnBR/tH1fH0qtQHkHxscdAGrP hBHq3OwcDgnlkRAFaQjKNhg87zlO/z9AzVBAqy8WT2Jgd4q0aO7ga0HIKdh0/oD0y+ERjcL4hu1 ivXL6M1xz2spxlnbw7Putx7UODgvzBgqo9xvvUig8YE5jB/lFRrJxlaHiHHl8lkiKlGYISajsJ7 CQ3wpvNtQ4AhxDWV+pScXXBarNDc3PtiAtQBipFOihXSLItHOfM7sCjpNMbrn/waufHL9L9oWnA T9LcNM3jDRzsuYDDlpjHJWkvPVck5pFLOxDu/tn5AOO5XqsHn6j6qH71rQBQ+71VnkirNqPNccz 5aXlLjGrG8i7mDQ== 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: Caleb 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 0f6dbe586c652d641178f43ec27df3613126ca66..f977541d8913525d53a59e1d53c= 33897f1c93901 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -136,9 +136,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.50.0 From nobody Tue Oct 7 01:56:31 2025 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 B5F292DCF50; Tue, 15 Jul 2025 11:49:12 +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=1752580152; cv=none; b=YXfnkCSajXan6rMocGUJSvRkK0/Gyn5+PUJmDh04jhvJsriQS/RWkdThVyGVL2KC3NhsvnbGlgiQf0/fo+5f0LmUsG0eNtYQkf27YnAJDgi0RzMgVinFk+ixcvq24CnpnkaI9gnVTlbjPq13dsgPTF3Eksfq2+PRgB6Sy3uNsHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752580152; c=relaxed/simple; bh=CWj2q2iFgW5iCNI6agU0nIdCloBgasfYop+w6kOO7GQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Wy/eSIIogwPZjzA/yBoS8VO/vETNNvABEIMj5c/yazrwbbCHfWOfrI3GS67fJcwzENxq4oOUuy5yRkp9Bb9b9wOMIbCBrddxHatBx7QD6gB2twTIoSXNP6as1aSdCTWZ0JBunPT+IHEXTGCuTUwSSDp+s4DRuFdTYdxV792Nx34= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JqnFnekX; 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="JqnFnekX" Received: by smtp.kernel.org (Postfix) with ESMTPS id 65437C4CEFF; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752580152; bh=CWj2q2iFgW5iCNI6agU0nIdCloBgasfYop+w6kOO7GQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=JqnFnekXqlZPsia0NIwrVheBHrOFqW85heXKArhC1oGl5aJvyZWUrL9MAG6UcPUVb dEWExj4ZhrXNQ+AxyU0VIfbF8K9OBFCRl17XmwuFA+53ctGm9yQ0kglvhxDQRUcxvq DFBRA/qWrp7fg7jHm6v6QuXipmmN1VjSplYo0B39In1Jr6bvrUK7fYPU80Mg0Aidq4 fBpzKqYUb19nB9H+rzZRUqFaJgSlQ+9F18IJZcAMREuENQQ8IEKeNtM7v885nrZcrh wEcYJtUw4rk4Koel/Yui4oN/6lSbI4Y0eSdhIUCBQDFP4BqivSYPdisrrMuK6cSjUn Apcos7CeB3Big== 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 5CCFEC83F27; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 15 Jul 2025 13:49:05 +0200 Subject: [PATCH RESEND v5 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: <20250715-synaptics-rmi4-v5-6-ca255962c122@ixit.cz> References: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> In-Reply-To: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Connolly , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1257; i=david@ixit.cz; h=from:subject:message-id; bh=Sh+t0WcseDQHFJEFbXieonJc4P0xUM6YkeQyPxTCtsk=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBodkA0Iia17vtPtthzTNCm/Tbp/HKpiHjAJdN11 zzrs3FOWEiJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaHZANAAKCRBgAj/E00kg clQSEACEiURfdgKtkgQFtUJQPEC7zzLRG9WdiPIDhH4DtERRzH9DU9E9qlfzF5S+bLnx+F7qdaf 9+wsjRKnTROT+czEhCZrW2f/OmPmOYavRIma5UlF3/NA1LCL636sgt6D2ZUUFDzUvazbofYBdEd z5WkAOZ6VkdOK/HregncRxOCI49gHKRxvfTIU8d3qHYuJjvo6IagSsiD8BC+jBtgSDybdwmLyEK 4al4xI82LY/YLd9j6YFBHUxF7q/58uNw5n6HI628Q9Bj3ry8zGKAPf430Joeg6mTsuJxd3fhVr9 cZLTb5VbjCFhM0WLjF+TAlpqIMIcKvsHZiONiX6fmZnL4To9BFCxECD+SW2CubEYtqrNbzVTcE3 mONx2gvBxuaLc4Jb43c+y4sEWdyNjCE9h2ZfHo1Um4FnZ9sYcS9m3tf2n1/i52NMKQs3od2VPA/ 0lXU5bssRHbXZZGGg1bDZRac9qZW5B45sg4sLZWrLMJC4qrzOQbq2IG5kM5POI3M5asO4iLfQ93 DPORPq/YOsnRN2ScaSWs81ra6Lv2urlMls3tXeODJLe8dwSFwnj/aUVbCP0ByBu1UOFJznaPI20 3aDRib/m14dyXS7KWCMM8zokR4U67mCc3NXA3KDAgw9w22WDhClPKsO5RrabgmyUb7zMXudXeHc iVIeLRmxOEJS4uw== 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: Caleb 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 47be64284b25ede8103ada86d6b58fd3a26976bb..2278e9b6a920774b07ec9dd3e45= 2cedc69469be8 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.50.0 From nobody Tue Oct 7 01:56:31 2025 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 D06792DE6E7; Tue, 15 Jul 2025 11:49:12 +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=1752580152; cv=none; b=eHW6Oag86nTraAdcDnyMh6l3qxy55rr6CfylkJ0qy1Jjy2bj/Pvt9ACPLh45G+WJHmCnkLEReXfqgGVeCBkCTfqaZWA58OTN/UvxVYjmzjYdtSIIjdSWAJ3xMUWUs1QB+p19rLNXmndSUaob9O/zeT+ckiHuci0W91cOGfHus5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752580152; c=relaxed/simple; bh=M6+o8JpQ/TBL6a2gpDPsjQMBcB0dz89E5FugIoYP1mo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jMF2rvG1D+keLbBDDZNY9pFkAneIu1uyBzmP7AoWa/9oFwq7fj/nFqmviGLZCXbV45v7Z3grrZAUHo3YFU5cfTFWl2+weGk0VvFilJq9KSJPC2eALSVKW/R88B5LyI3/iShV6hNN+WlX0WRcLrKxtrfTxzLhmh3MJTg8ue6B5SI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lXxMN+Xk; 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="lXxMN+Xk" Received: by smtp.kernel.org (Postfix) with ESMTPS id 75A54C4CEF6; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752580152; bh=M6+o8JpQ/TBL6a2gpDPsjQMBcB0dz89E5FugIoYP1mo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=lXxMN+XksVSJoCqF1rNTcv018ElcLpnM7P62UNDySUzJb5c2xXnhfhOuCUE0OinOq cYWmjhQrwyJNOSEYk3wBVpf0QGwGEempE3N2QXTpyw3XWt8/8uemnyjqzf0ZQ4ybFk jtWyBeT+byLb9XqBbevB8AZU5MOqaxbQ7lD5MFulPjKwZMYAnfRpjYGfzviMItXM8/ QTqMBexj1Dfq9kh5k+CjleHksxiCRumqMLE7pqEhMjBGXMELlBxH56IT2g7j7mWmdX uyvZvSZkrNGLnmZKJQBmCi2foS4OLq7qS47qHJ7SWfjADFWh20flz7vtPg6W2yiJPO 4g6oWwgQc5qcg== 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 6D114C83F22; Tue, 15 Jul 2025 11:49:12 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 15 Jul 2025 13:49:06 +0200 Subject: [PATCH RESEND v5 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: <20250715-synaptics-rmi4-v5-7-ca255962c122@ixit.cz> References: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> In-Reply-To: <20250715-synaptics-rmi4-v5-0-ca255962c122@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Caleb Connolly , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5812; i=david@ixit.cz; h=from:subject:message-id; bh=0+m46Sy94J+PlGPLtsegoEaaqVZ3KHZFG9gM8kTZvJ0=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBodkA0IIENa+SrSLJ5/Tk7T0Jj60C09EJPvIBv1 2/gFXC1tMeJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaHZANAAKCRBgAj/E00kg ciUPD/4+/vOvVXAaIP8TOcWs1fenDp8yhZZp2yxAet8IENccLD4DCLZeaN7zdpHLLdKEkiBdsiP D8NyxD66DHYnPggt+BH781op4huRR7sGvunlf/5An4mrmYL/X2fo5MOCXyIf/agDDW2CxRPxvhN Lfbejmvu81hc1hmd3vKmRvJA8pQlteqS02TVDPq1DupmLbqB2oifafPHxkTbU9PFw/M0iCPlF0Z xRc4AUhPC5U7szZcfzFHC+Ezq4PL0GyqaJo1vA5pxwwK9EtSckYbFxb+gK/2NsLoI+KDMsaRZau CND90bRndZepyuUbVLeA40T9cctWhdVsMeHJhzZ4Qmn5lqix+UgpeJjRsLcTE6oHr7NftFaq9Vf 1AIZ1p1OPcshImycPjsXCiQ3y4hmF7wkNOzft+PiP2fkQPFOV5Jd2eIeiMkRqBO1SKtk5IJzJnt LHxJQyPtQ7JCXReMJ8EvoODReICjlXhsuzITVr2Ky/7WhPCqmenJPBbXG9vaB1Od5vAQtoNraoG h000GXYLb96AtaHKKpf1eWEoELfHbTTZVVHUm2pP4rohAHnZCimV72NvTEaOC4U1R+Teir7wmDM GkLyJkDzYFWG6jDvl8d0wSFT3gqVTwbI3SCW3cNmYPaxTslCgqvBHi8Cehg9nBrAF8rJY5487zf EVwSCRFlmW0xR6g== 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: Caleb 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 f977541d8913525d53a59e1d53c33897f1c93901..e736e90c071466cc61a441bcb30= 61564e039bfc8 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -461,9 +461,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 @@ -474,6 +475,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]; @@ -546,7 +562,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 +1039,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 +1053,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 +1204,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 cb1cacd013a3f39db96935f705f18018bf15adff..3b87d177db59591691a56ce7ac0= 3dd2e8671421d 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 ab7eea01ab4274bfc9efcefcdb0cced6ec34966f..4ba2cefac85583a4ba65c70dca4= 18a2c7c65362a 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.50.0