From nobody Sun Oct 5 16:16:35 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 86E08213E89; Thu, 31 Jul 2025 21:07:14 +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=1753996034; cv=none; b=r3AqHbGtu9ABT3dIvcYl2MXI2ClPY9rM+APzwapZPBpp/NnbufkXHJv7QS0ERoomad/cS0Og3EMgTLR8codel8GozrOiV+W5QP7zTpJ0JW/wxrAYEza3jdyb+0/EQMk/mECJfPSRPZQ8tkNPwS7Obt6YVqfTs+kYBv/+zWwvUNQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753996034; c=relaxed/simple; bh=eXBngxo0rpKFGqwkE/sdjN/hReVUcEgEPsE4tFp3n1w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Rf8uNy+/HLyS5WlZPKKYIT+Qe+fU9Dznoje1nIMQ6Tqj5uNJZ0pRd/GHUB2L/WVtO6CKExWiT0KS3GeMNGxrP/724oyAXdqO1woVkTaRYMhE7YIG3ik18MR7hTkT4iHkIz0NXbzH4i5IHWR/VFoNOia6lCiLNMS7rVtobysC2Pg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=d9jEzjQG; 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="d9jEzjQG" Received: by smtp.kernel.org (Postfix) with ESMTPS id 218B6C4CEF7; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753996034; bh=eXBngxo0rpKFGqwkE/sdjN/hReVUcEgEPsE4tFp3n1w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=d9jEzjQGRW0vTsYImcXOfzktuKM3G3A7kkncc0n0v8nGPEwR6YFkWwkJiVJIgbzwq 5udISIghvLn7f++zokNTvfj8ArX+9NmWzvhyGMJZIeL0erlK+cG+D2MSoRLHADilN0 EQrrjaMAwxa6jMtNiTD1uGW2Mkv1SAABidLedwGLvnUV+FCmcCvZZyLOMwOQNEg2sJ glXiyT05Yc+++BL6NrwbVW7MIoEBp21mJyG2PM+HAkRVD55i0rNCyXxfslWzvKEK56 ydVSsqxxFit3W5T2s+/vb90f0VSBvwEaWpnP8C3xJwLZcMPezk9t8i55/1n1u5bKZS wIxxS2yh9I+tw== 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 121E5C87FD2; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 31 Jul 2025 23:06:51 +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: <20250731-synaptics-rmi4-v5-1-cd0d87d34afa@ixit.cz> References: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@ixit.cz> In-Reply-To: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@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, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Casey Connolly , 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=13S3lrILNzt/3asS2mqAeBe39EneqcPGVQTM//ivAKg=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBoi9r/7nSHwOgYs+0IMyD3zeC4tC01+w3tfVRxM NrrDb/HSI6JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaIva/wAKCRBgAj/E00kg ciQCD/0eMYcEqyE2cQvCK3PXANlBINqBcth8xK9GhDii1u/H175U8IQLL+ciZXbZY3JDGECKvj+ KwyJGcNicEV8nMAEyzSHlVOgZsdflfFse/32VFPsq3S3TfWizfj0zWRtBKiWP7HICQypqGMVd4H 5mHWlFVPrA6GmjTNN5EJl4FtCYkpOPn2XKOJwzoFXrhs9mBMbZP7fkNFOiwbnAT4+6GknB6CnD+ 3K6rl5pCxAOn2LW00FmbmVcaifzAU6yBHubV1zOAS+lQo5aadr23nDyu3Hnp9xM6oaUUvW23Cxs VwwP4IM6BNNIttjhTYENOyST399HwcPT9TRtD4sk6SCfRE6d/a2GktXWf4WEL5NJlqcDUXqO2FY feqNi4BdFaKwaiuCqraIeI1uom8Dtezxqug0MJn0KS54uaBp6t4dBoGA8OtRdSCjxELEjvGuf/n YRJi8XGvphFhH9OQGRUTtoueIf6XHEumz9I2ZvPxQrEd0YjdQC7Ddf7GaUHF+o4FPjNjDwCXowp mXiPYfcqiqHSslzUD5psjdMm5Ub61Ppa1CTmG4IJMrLziZd8SeYI2Ox7wGj1lKi2tdepPtsCO3v ZidbNAFew6bTX3xSN1QIu0uAWQ9DqnvcHr/yFCf0gVur3Jg3+TauQayflVAbPG/SLICELXnqpvY bzN1XHjfzdLoZKg== 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.1 From nobody Sun Oct 5 16:16:35 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 86DAC1C7013; Thu, 31 Jul 2025 21:07:14 +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=1753996034; cv=none; b=h4aCUZ5jIr6MsLfHMMJ7ck73KnhS0i0NLVGiJkR+uImdkyIAR9dk4sX3ltn3wo0Kw2r5FrPlCijHaBP6FcdzwcMdjGZRlxg2EDGuqyUfXa76oGBiqD8wb+LPwDd7n+aRHCTalBEXN8PLP9WHjP7SWQYUFE56P2qLHdGszon1kgg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753996034; c=relaxed/simple; bh=8Wy6v2zEQbv4sE727EkXinUIUXS+RivX/F8LgeXpAlI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JtU8hgfqjFyIKXiF6CufG6AgbAHqvXYILD+95ckZ0D57XKU9lrltjBCuKIa5wmZG26KV2ti+BFprV/jZIP7vPxVjt3F4+DBjU7I24n3hrJYgsFK43CiOwsWDhqopCB6ylXFVGQpY+xYcSVLb/gI5dzRXTqsySXcdQ9f7tup+48k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=iQ9HW67n; 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="iQ9HW67n" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3571CC4AF0B; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753996034; bh=8Wy6v2zEQbv4sE727EkXinUIUXS+RivX/F8LgeXpAlI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=iQ9HW67n5LezlAL5uB8bjV8oaT3OfPg/1OQJYGdq4On1A9zd4NuK0iWKr6oykKtnS 6BVggUdR7YxJubu71RFRlHbgR0d6nTXHNFOZX2PnLol1yGQIjXXzqbSJ7oLwaPZeAM EpYAC7hDk2q4fZyI1AXTKpuXhoS76khA3V9UPMRvwUYtIk0lP5bZoa1otACmKOd2tK jppqJRUtw+WoVHXJeryqzFkM17xZ8zItQovAZUQVYDk35MzhCL2ipxEDyWD8MTn5N/ Set0/q3+3cwORzFNrbjCWkyHT1IfxuPBlq+Berw1isEwqUS0RK3EjFrZJD9S0EJZnt zL1g9czl5TlCA== 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 26BF2C87FD3; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 31 Jul 2025 23:06:52 +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: <20250731-synaptics-rmi4-v5-2-cd0d87d34afa@ixit.cz> References: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@ixit.cz> In-Reply-To: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@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, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Casey Connolly , Casey Connolly , 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=F9hWc6iEWSUhrphcXba0Kd7/xUCyyQbMphuPjYrJ+MU=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBoi9r/01ZjoHUNzKf1pAOvuFd4lomDhPPoItJBK N2y/6kuuv6JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaIva/wAKCRBgAj/E00kg cixZEACkkm2d9FC8rr7Yw7k+JZ7wJwukDpiDuS1GpOt7qfUuU8H8oa440noemFd0MZIljnb3MeC MuSvDH/rqKR4BSQTQ2okEEQjm/2OdpNIZkv9NzgfMHt78lUK+6MF8gwXGPjD0s/8C8rZHiyqnRD RkG3QIlx0DV5Qn+tCqooXFdTvo6yManiBoU8e6N+mHpPvQk3iIxLTg40UnJ2aRMKJMxu847cs1g dmG7/BljXVdhdT7bhf8Qkv07eZ2IbavHcs8GddWEsm4CuBEnFBk1KqBOIg8nHsUlTxe1OdFjPOx 34Ji/iDIrK0sRmXp50yi9nS+mUX4eD/RQRk1JY9nZ/OdvllJ9/qfVOxl9jw9yNbFapboX2VbMuT mlHPbECoTj54lqJv06EVveBFT3robZPBJ63XasTE3Uv16UlEZ1AilgXl2UzQ387H9mZxN3YMFIx cVMKIzfwJtu3EDKZkQ11w1Sa2cSlPH+kVAkdB6YTt7pfz2/V9cv6yMHLSN0a1d4uPnKkRlacRzw kJEMs8bhx7udi4NkVDl1bwYviW9M2Kg1j2QbpjIrrT72cu5jT2f07y07R/fwkTHZDNAjC2OFidB +r+Bl8+UY3eNWmV703KIDpDmYx3o7SUYZjgNgGVYtX7qAktGNb0vahDdec9zMDi+7n1zCjsZ3qW epD8BJjAiH8bqbg== 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: 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.1 From nobody Sun Oct 5 16:16:35 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 A61ED221FA0; Thu, 31 Jul 2025 21:07:14 +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=1753996034; cv=none; b=kaH19cYPXiI8hP1BGGRyv6eg2tGRwCY3v1jRYxtQ+jTAdBlqnPGvHCQuyOEOtZwCLZgPQlAN/opF58B/7/GT7yBEFdoXS6i4UTDUbP3M+F7fNbhbu2anXumHLJEwyZZJzGPDIISRvv6YFao+jTMArLDT2K2t2/Ya3FByBaMN4IM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753996034; c=relaxed/simple; bh=WdPF/cC8LC3htAms9KpAu2xgqdYjXXg0Up/9TzJ3SO4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g8HmYvSIXNF7dM07uuydbPnrBM7H+WPUU/Hblx9SDOB+TUa3phB5g/Il2oRe0b1/Q/nZimepcTPimAWuhOUM66zDDzrrgB8VRUknMLcWEWV1Tm4AVmdZk4V6z1Recd8JXKCg83514JaUt2nayfCSN+adienBaAfR5pmeJX0OP+8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=a1ERDWXi; 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="a1ERDWXi" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4B06CC4CEF4; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753996034; bh=WdPF/cC8LC3htAms9KpAu2xgqdYjXXg0Up/9TzJ3SO4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=a1ERDWXivRq5e3VPsUBItQRAl2J7IQ7OhgcFfj2HHKdPdVJKzEe1mfy9v222gu0+2 sP+EWzeExe7XwNrQeVxxFSUxI3BFv3MMml8LzO/eaBlaVNcUVBN9nQnjoyR4w+jqRl AbRN9t3MNxIH+35sVbm0/zn5IeLcw+BPfRPWe/tOs7pyO01OccWsPBKc+kKXaYmcnw EN53jXTUjjxilad+qM1CYw/ku/7X/9Dfk7M/HrugAcXMSXZVOB7SLDyc52P39RQCk4 9XkJIVHMKzNcS6opi6S+uAAGHoJMaSAJan6DHjxbwlyjE/Gn6w3U+YAGOAFSE6fxgZ fkwgeM2HyiYPQ== 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 39562C87FD6; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 31 Jul 2025 23:06:53 +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: <20250731-synaptics-rmi4-v5-3-cd0d87d34afa@ixit.cz> References: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@ixit.cz> In-Reply-To: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@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, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Casey Connolly , 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=ricXe6yk/5+TIKlQtxt1oMTaSqZP1i68UXtX5FFQ3T4=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBoi9r/md4k2gkGqPUPzhPq95CcT7bB/dh/D6Uy0 X6likF9OmmJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaIva/wAKCRBgAj/E00kg cuPND/9PqFoKbBgFT30hlSwYjgkuvb7BgQ6Nr1qxb7BubBjDe46w1yux512Tno88ky0HWVNOReM B1IiGTRJq/WRdqgc6f/cJWOmZmctm6FuW+aXSKNAerCz5qFKTaIQUASGuPlC+tGJbo0dmCW9Nbi LMHPc6kBXmyHPwxmfqikqpo5V2U0k4nsIonqNHJ2KfjY54Q7svRtqS2HwGltr2Mwcwdq9YZMc+8 Agy7fzHbe0KjUSw469GZHJovR3TiA6XGEO9/3REMRowoPQaLz3N0Ys6lVRsn02qv7ihGgF3olmU MBQYlDnisUI/PFwIhyOyUdQ/PZ7QTfOv1RgFsziyeYri2gxNvdwu5rtwHJrQk0jrMZBWVkryO4y kaa1FBEuWAV/b5Sj3+6S3nnk10BhOYOcYEhYY8yfVx2K7snKc1yPDJFYY2xa9CVaVNVFgGW3Ct2 WH2A7pKcrbRLMGeN5s9JyVSVYsmyWuhqxZ1m4mVnfzzEQLh/jDiWrP8NTdjqGjo6B6lXPSP3qG4 5JdQJg7nB4SRVm6haNhmZWdjoIZoMbca272RjUsTvQ4ZLinO9WdU1Px6mypRcxVZLYmZ8URAxoo K6cjXGgush6cekLPzHW70whOrQVQxTK8ibeWRPDbqJBuAYm++Bjc3aYQ43WZiNmL9SEUHIztw99 c04quLbRjI40O0g== 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.1 From nobody Sun Oct 5 16:16:35 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 D3ED125DB1D; Thu, 31 Jul 2025 21:07:14 +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=1753996034; cv=none; b=RqVe1jnEkdylB6hyL66AEaXWBXHhvuxMaGf2h1lEZLHB5UBlOcl8V4l8vtQ3ek7aZabV1XRaxnWhxX0JtFaWWkavI6FXyMoFInxWx7h2u+hakxtRxJPtwBmZIB/O0mTpX3KTeDNCsPOVsGZHTwdGq97cR2fvoPvx3X7zCYc1WBQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753996034; c=relaxed/simple; bh=htFTGLky3TEgi9HsVZOj+L4Uzq4ebrKWnhK5GMMQFs4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FUzFUMwCbB3iwYU2t6W4UVIjjimNz+dvabHJQqkV4r5/V8OQmxqAvPElGdZuDIlVU1rZrSQQ7sq3okjMTCXlPnEKkE8KgbErDdzAVeP4WmiWzg5GcnyDmi/iQdSdbDSGvoB/H4sn2cEXJd1L6zeQoP/kbhUC06kskT+tEi2CzYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=elgbP5jM; 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="elgbP5jM" Received: by smtp.kernel.org (Postfix) with ESMTPS id 568CFC4CEFC; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753996034; bh=htFTGLky3TEgi9HsVZOj+L4Uzq4ebrKWnhK5GMMQFs4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=elgbP5jMJM5GvMQ0rbcrgHPDUzZSni6sEDOCEkcnuh2n8hWGcKsJlh00u/YQ2NOQk Bly+azUeN69h0Rz2uEZs0RjOreExfHFmmm9GRNOxhgJq3H/ZtDQDcXF2wgJ1gRkXGu Eb/SWyUUurMBY1jc0Amigb0HzoBNCuspdnGr1fLtWze0p3BmLH0Z9An8K6XCHUeUoK JXLzlmglaKFc4n0BXOkBsrDECmPSbOSlHdPmn1xmc/ewxqUydI8UBbsoE/tQOpjj5q mFhk5ki11FXA6/05woxxPpTG/G79rv6kiqiSAoIO/5IE5qJQLHu97J5gBAwZtJOZLz 0lzmebyXHEckw== 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 49EFDC87FCA; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 31 Jul 2025 23:06:54 +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: <20250731-synaptics-rmi4-v5-4-cd0d87d34afa@ixit.cz> References: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@ixit.cz> In-Reply-To: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@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, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Casey Connolly , 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=wuBeXWxX9IEl8wN119G//hfgPIbwZX/r8TMKzYa1UEA=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBoi9r/6DrNHPt89NnVK8ZIxo7ctM/6RdpRqIImN XWRRt0/8jCJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaIva/wAKCRBgAj/E00kg cuOcEACH/xHd/nYf9XC5knzgiadJ67qYgQDNUH803fmUoeMuf/5t09OGxrhKVmrWCoF3eltUW9o Dsuhcs3tVRUoKmzT717DyXFMFbWR1h+LbtUiwNWn1Au8RcKq8SmnySAbnBzezrQdpxzvBqYBy83 ww9QwUB1ks1twXrRn79JGNiYJkreh4gpnBRkCo1RWnLhWYJPCj6z/NTGSr8X4onYWqrcnBnumeO wXEdX55G3E0eiCFL89dSN/Olca01z5HYOR1klb4Tt8tsAsyngD6olnOvunEAYpFWLl2CiAHDO8n 0EMwkbBpnLCYptyXIu8YvvfvIqLGs05oq/X97K1DYMCaKJgogKIc1TedHYbVnQmM6OkovQNY672 MVcYj/c5hlGu7IYjz3qH1lNJBILE/514qtSku0D2VdjMpoBOBjCoZefDIoSV0vOk1tmAweKP7Qt 4QWqFekVEWdh2XIBC2PU5iLr8W/xEXQ4AlAIcgUD40GGvZzzR1IBAZLg02FSmh1mdsO680D8bJj pVfTzQFCyurVTxDMdHmlIzsp/C3dhA55K9/oHKFoQ4DNmY39MUOHTQkSK9L6LVU8ZBRFfUS9G3A hbsw0uICFop6SqR1NehX06B2U3ETn7P/+xRsYwBP1SsbdLdMQP4w1YsTaa0w1getER2cNf5SQ3t ANt1w+V6hnJNYoQ== 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.1 From nobody Sun Oct 5 16:16:35 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 D376A25A2C7; Thu, 31 Jul 2025 21:07:14 +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=1753996034; cv=none; b=jPKezBccfZxI6FxhW+2DZEGPNhx/qyLMWDnQBjbQPmvOhbngY6pxvEFgFDhYxFWbZ9IHKuEfZpBPnjrXrEyZqqcSdiUQKYUfzDAD/AjIoNmGCUNN7pwFFjU40KU4QzZye8I1fN8Yu/VY8XCf6hqxq8tNG3OaejfesGCLwALH98Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753996034; c=relaxed/simple; bh=UM/UMXZTT3f43442MNjWHmb98pxtVokV8S1YFltYOFQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Aek3b2iBXNN56roZdwXM+Eva2FlixoggwKCpJJEKPsfb207gUkw+Z93hZ9Ydf9D2f+8/6jO4WC1mJUbUndHJwr+lgkKhlrBG0MwE11MMLVgFsdxPoa/mJey2QRy2736m/i7oEu8B3eN49OH4MK9beChKltNziilmHfLqGf3CnDo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=FYHpBfZG; 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="FYHpBfZG" Received: by smtp.kernel.org (Postfix) with ESMTPS id 67D2FC4CEFE; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753996034; bh=UM/UMXZTT3f43442MNjWHmb98pxtVokV8S1YFltYOFQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=FYHpBfZGONuIYxnFbpEiMTO45DMYBSgn93wjcrhHQPKDI9ZROMEWJVHoBvAtUN4XE 27skb8Q8MJiUiG89FI9nCcOMhufCj5lF1DdUhfcw0Q+UE0S+HjuZoCBp+zOGxofB6F r935TPpOAJnhuHIAZ2fDOSU/tIVMP9ohMdseTOWea7OoevErLhi466WskiPXP/IEX/ c+A9rTM8YD0MqGx9fhmNLPOPjUWNeZ1tPkCvGHMt+kaOyS72NowgrkDQb3+ta0SjPN vOok/gRwVF8hpMSOG9mtM1f1c77c/t8ddtApyutG7oleCj/ybGmw+H89YsdyXQalsg 0PeczxuKjPzpA== 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 5BE9FC87FDA; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 31 Jul 2025 23:06:55 +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: <20250731-synaptics-rmi4-v5-5-cd0d87d34afa@ixit.cz> References: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@ixit.cz> In-Reply-To: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@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, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Casey Connolly , 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=Nyz1YCbWJwORQMBcpF1SBjXVXtSklYzZW6mP61MM2z8=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBoi9r/1r/PGC5D4fNDIHK0ZJt7U7Uz62vLzmrqS W0YSzM6coSJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaIva/wAKCRBgAj/E00kg cp8wD/94hEgArL13OukACP2YpcKMvJt/pO6G6oxP/GZnOfc9AVvNtvc69nL4mEmegxGdS/xANnz L6vt04au0PGH3ks6ChAyxwjqClqGPQ8tKj5obtadGQ7RYcwJP5UYU9OZvqbcy2iEf8x06nasksl BRkpCOeyrkACowwJrv6/fF4r3e9c3x0ITfLA3h8hdl+74kWr5RQTd7zBJrVuYnwIBWe7D0E/4Ap 0zcuBu+jxAt4/T9mNK8nJOJqBgUpz88EsYfWjQ1hJc06VcAHoH6BZE7aGjmk0Ymn1E5kWKwqY7p XKazQlqNLmP/YTAhcVUWUQT4nwZMaIXLkQA/VwsH5YVURFCSRQU9hBKVF9/D3r4XMb+S+Y/HEh6 EhpkfMalE2Vk2A/r0qcS4cWDREQcEV0FVu4kg9w35XwCbQqjbJi6YvbSjkonzmV6RgFvT2hHpRM i573xePIsX9OJLqqA72kqfnxdwjCY/krSi4794czhqG1MDasmCepJfOiABlBZEvsL02vkJY85oD 2yq2qvi1Rn4u7ind5nOUewJPL6x/7aKx9RRSfgkt8JfM+mAxTIYPbiFrYx0J6dijVSkmCkK2FCS EolWi9GYX/csI0hLvnabYpW+pCs/vsW1zxmoeoBIKlJYXdEqpHwO87PNY6BoiHmPE3bG3RcsKIT nUHEQoCFCPkmXhQ== 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.1 From nobody Sun Oct 5 16:16:35 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 D1FEE25A2BF; Thu, 31 Jul 2025 21:07:14 +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=1753996034; cv=none; b=XwTQe4lslNJRwWDSziUkmWBqHvg/mbNfxTrSFChEkcBHv2QPLgnVU+Wj/ZdHSUrntqyAcTU2D7UTSHVDWHfa4NDEaMlbLmwA6BCPMWlgb4g37XqGa09qqrtEOQ1r9SCpJEQzCodr1KMPwYz3n9Sj1NQVPw2R/exI4sqwJ+IvTJs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753996034; c=relaxed/simple; bh=2pHNOV+TAIFZZ9Mpk73B9jYNd9FN+OKd7NX70urKO5s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=u3m+4/BJaWVc2neL2zANLl3UmKe6J//OW9mNKmJVzTlnmVULz6zX5wWPDPtkI5FIZtLRAl5xGVLPd4R26E1Ntp6kxszI7g3wr+qoWQWSvHad7mvVMQGFqraKCP3ooaJz19SyUFP0XWC6DusorRWoa34grBMYwJWkDdpYC40CCTM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jMY2qboP; 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="jMY2qboP" Received: by smtp.kernel.org (Postfix) with ESMTPS id 75B5DC116C6; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753996034; bh=2pHNOV+TAIFZZ9Mpk73B9jYNd9FN+OKd7NX70urKO5s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=jMY2qboPJo5k37HrT+7Tta1nK4Lvj04gToF/EU+BgmdzQCawLbKfj3g9WF4gLfXcK WhJIck9Riqrm5NB/9CHUeodxvGe1fkAtursFtlNONcP/r4gw/I+aWpW98UTmT4QjQv WuMuzd0GF2O1ToiQTd/wCsIhULXkTPlwWPK1bdbMVpurwQp8/RinfziRifPJleDXh/ dS2sNasjtGwRfoUvrYfgovwyTb6YY5wi1ZAOjWU/aiCSpKz5xucycjzCeIVqftEmHd ZziYGKNSIPP8bga0JmFddOZbfFe0wGuCBJx5+dyZHssK5pq4fjKIm+3ogox0nTSnaF /II7vjHNgVhWw== 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 6D0E7C87FD3; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 31 Jul 2025 23:06:56 +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: <20250731-synaptics-rmi4-v5-6-cd0d87d34afa@ixit.cz> References: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@ixit.cz> In-Reply-To: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@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, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Casey Connolly , 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=foQKt41rQkAeUSTCVE7iH9xBlmzERmbzM9YslceBQZg=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBoi9sAu/mrgfMKeArK4vh6IGkuRovnV9p7Dg8Qd izMhSnge8uJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaIvbAAAKCRBgAj/E00kg cvO2D/4758jMTi2wt46u0dMYho4JQK93gvpMFXOmSZ4yEd/qAXieqjaq9KhTlCfR7nq2zT7lC88 y4Du/w1Ia56A/x166kgDBHbpCMAV6hsMQC8s8V9LeEx1QHc7+H8nH1MhWY1rsRXLeiCj6qEP1r5 aaXLNSg/Xs55Bb4aSePSsStVSoMUkcTTbT6FnYEz6GjkbsUm3iPRwska4ShU+Mgaf3d/eSpld4e 7YGrUk5jniMsnqaUp4lkm/Kqb1gXwn9Mef0VzXAXySuZPBB3mwG4cbLP1psqQmZVAe3cjwiGQ4g rSTy0gPgjYOEveWdf5OBTv5V4bNrtDqaw3+vsJhaiJJfEO9V24vgBZEccBhOSMys4Wpm2HtfYUs OhX+rud5tIDle2BbHJzePCabhfsei7fhK+mJBaMbvbETwpOSblK3l7R6Q0aPwSVWXuAIqpGO/8b lYMetz6P5DzdtHRU7IXVCwkOI3Dll+0guyPy0R+MjLHUfcMGGP7ntzUewKKZLJ1uQd9FMwofYs6 ss2ZDXeyXEXGAIQ7S8A8c6xOSovrGKV726iBOhcFyNlvY9iuQ9YhJoVP1aDvTvGXvpFg2o/9uHU 8tD/wbpmoSi0YSxanOyOPwSlRu+YuIEt9qD3oFYNM+GYxIo1ET3qFhOWTk9gi2jISoY0t9iZkrN VXd8ZSXOo62nM4A== 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.1 From nobody Sun Oct 5 16:16:35 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 D1E4125A2AA; Thu, 31 Jul 2025 21:07:14 +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=1753996034; cv=none; b=WuWs0Ah+/M0YAYT52qkxdSkpTt9M3aX+VCW2s8eNGUoCmoPC9INPjYlKqKlSnJGTISbVtDMewoIuwVKjDSOlEhHi4RRonGKdpR+wiHofycZGpKY+7S+nqwNclAzEs51E+jkYdrxZMfv5MOG07q5FTIWofuJKBrqEWwNkF1BeFGk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753996034; c=relaxed/simple; bh=wt3tMAQNjH7QXUaT5eywmVu/MXm11C/CrJGLDrJreYA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FLSzZ70PsUmeEDOdczBEA6KIHi8eOFvAnFa8ZM5M5wQo29OHXkGXW/awpz6jKhhCb0VbH7e5dWfQl0G/FXgS+EWALmMuTlJ34mfa6eSqec9clcA8zkMCEwVfASm+hJKf6JPybh77YZZAqBiNVxONK2cc0cIwK+lkQFfBB0UPq7o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eY5+g//L; 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="eY5+g//L" Received: by smtp.kernel.org (Postfix) with ESMTPS id 8CB22C4CEFA; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1753996034; bh=wt3tMAQNjH7QXUaT5eywmVu/MXm11C/CrJGLDrJreYA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=eY5+g//LlTwO25ZbP4CL0rUVWZn5nYE77o+W9iUMc425RaeIzE1lKd4eO8UpoIQys zKAoRfsYqugYOiXbyiFEF40UeF+ln823vEk5qkZyFw+L4OiPGvWfhdDQY8F1LHuMOV yob+YKlgflwEC1SuNK/qWZbmbufpkUXowfO+3bOYwGS/HZINHzcpqJaL0qMZdfiIhZ 2hERSwPxkdiAB1OOVV/GHAlPWxtE9JAO7YLDK4Lt4uxCWbS8QH+soK/2zJxS6yrXXz TJ8WKH8qKGlOwN8zk6O0zmPaYkwzmXZ2P/BQbCyHpHuyWh+m9shlJpK/W0FAV3wIWe UEcdzvqFOEEbw== 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 82C88C87FDA; Thu, 31 Jul 2025 21:07:14 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 31 Jul 2025 23:06:57 +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: <20250731-synaptics-rmi4-v5-7-cd0d87d34afa@ixit.cz> References: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@ixit.cz> In-Reply-To: <20250731-synaptics-rmi4-v5-0-cd0d87d34afa@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, phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, Casey Connolly , 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=ydrRSeYmz91rM0r0O51CFGQGWObxeUx/kic8zsab5pU=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBoi9sA62W8kpS2OpUixDcfLR+/8BrR6vclDOk42 wshGTV0+omJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaIvbAAAKCRBgAj/E00kg cppaD/9LTKRWfrwP+q5uMdfCLQ3ye+gWB93AYjKrF9B4aD0WbLljUlsjSgm8h8GQ7mZhTmQwd8v F/Df6SBrC9A+JrLdTK/DJbqbCyRLRqzykRWKcso2SvWdAZCGPyXvR09lgmoy0uy4wgSJgC30ZlX +GJHcWkY776skUedrynlHk3v4IDn1enRxLLLB9h2QXEy8rhAMgMM06tJCXIhFEAqyzRamGWbNB3 XkO0zgeAekobK/r6UxERU2t4hhnwXAei74SbLYW8Dys9/I1N5lX+1EzKUGGAVQHMZvf55j2u100 nTTGYJrVqoFuCArOLNrLF2nVNWx8sU2xB7QmSo8yw7yc9DymRs1+vrdzLv0HvxSOv/JAkhfooy1 giFtnB4V/QL5kgoB6tDbDlH8ZmHAIX9P6APvN2a4sb2lWlZ3WnUcs4A1VS7dD7BirLMvs777BXO frrrTIYdwagNWGr9oQLIeZzgMEIQxl3OxgVlwPGTNmCVwCEdVn6olxrBJx5DEqTSr1m7BqDBjTX +yw6ZRPUXzDeNMgip+QTuVRcf1mxQvXJ34Roun2Bv75+LMKd8N1SllMWobm65zVAOhZJ3eMh4P4 MhsZ9EcX+keIUFlvXed3l+MwJ5OLDpv6ea1jzq74Q+xNnVctPzvHtED10q88svoF6Tvs5uVmkF8 JL8xAkKrG8WHaFA== 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.1