From patchwork Sat Mar 8 14:08:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Heidelberg via B4 Relay X-Patchwork-Id: 14007532 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 8EB587482; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; cv=none; b=nEsz8mFG4jxuN5clt3QkPQaBMW30Ps+3E1K/MKAu4u0ePH+z/H/pS/r7HR8zBus002Kl3fNaBhEL/pXplDRC/PC3WNtiNbWT196hYBefIzO7nLVvbpbRVJ88qhcvg8Ta3yMyFCBpSN4FqOxz3BUwKnKf3j/de/mdEMg3B+NIdpY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; c=relaxed/simple; bh=4IIqHb1ubbSm67oPA82YiDriXUvqZ8bRVc5tBk8MEhk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gnXxT/I3zYxesswuu+Xk+4sOSYJefVqxt2khCzKFgsgvh/95/2rXVFDmQAog2Y/nb6IOYyFTs7O85xmS7UFL4Gmr5/e5oXE2pgBq7q/J8G/3CXqVzLa0f1sk70mpZZnzIVDFyiRUD3Acf2ZkdgMjDdqbzxARrL1+r/erOgyKUfc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DTSuNGxa; 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="DTSuNGxa" Received: by smtp.kernel.org (Postfix) with ESMTPS id 17E45C4CEE7; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741442924; bh=4IIqHb1ubbSm67oPA82YiDriXUvqZ8bRVc5tBk8MEhk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=DTSuNGxafgTn/oFVNzDjglqWzoNgBO/pS5y+FCBgBzCyL3cQQc30bRetgaD3BZm6U cFKZcRAuf07w+g3/RKddzP9i5aW+ARPG5Dvbg3EY58dJV89JVXF7vaOJluZYGV1XpA 2ApUevdh/A/+g/3iS/v4GIgu5eeaoDo6ayn0Y10mrV8ykNyb/mwppKFYSJSnJ5EDbk dvRCZlRu27doPTN5jl5nFKPWbr0pOKhvrUO5WLAuNaP23NyVXaU+ET/llHg54AdeJi rnpIqmA/gFUHsKYI70ObUUGDI+2EFnvdrFy3BZUOR3NtNPcAAPj8AkD89fiuFbZnPN dR93547BBeGGQ== 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 0EFA8C28B25; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sat, 08 Mar 2025 15:08:37 +0100 Subject: [PATCH v3 1/7] dt-bindings: input: syna,rmi4: document syna,pdt-fallback-desc Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250308-synaptics-rmi4-v3-1-215d3e7289a2@ixit.cz> References: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> In-Reply-To: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> To: 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, Caleb Connolly , David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1840; i=david@ixit.cz; h=from:subject:message-id; bh=jfmUi6aalLoxYMxgZ9dsU2ijbzSO/6EcRXn0H1q6Lhw=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBnzE9pmemkpBW5RebUKjneZXgHyLcvBe53wAiOD /zx7wh9UG+JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCZ8xPaQAKCRBgAj/E00kg ci7FEADNz7N+u/eG8cZSNAFeLMmu9Y8psA4jZYFiNqxKdCX7tOnd79NgC7Z87+Pw684EMK2AZLR IzZQRrtS8R/8ZmbA8VNG7FqFOHcsbQ1tm6NpxiE9+yvhZvJFSOJBtre4/U56V7CP7Cr0feg3ALu +UBSpGrGBc6TExUgP3Inh9ybV/RUdsPkWwNQ9DBxmHqOMwECGf1bITBvvmsleB6DDlAw4jzLNLw X3gJH2V4xVJiu1tqkAAgW5QMh2Jse+eE2H0RWdk+ageDilyzM8dZVL8iYYizV+rFeWWTRfqr/PV wV2nkeKxsLCbfA41O1SA1KEwkSVhh+e2hCgz8xQQIwr31TpQW5tHdO4qAV4G424uq0n/al9rAQn o9ClrXLzW2Mg8sY9J6oMkpvmqITYCcQDnLvmJ9KjkHQnSX15RHqztGT6a4P4tTzsTXHFECHhG7y sVaCJZXYWDpzCX6HzsilPg67wbWc8qqgwNpXFmOX3YiDaHTi6Joc0R1lKL0P0+id/93pQwkqjdl mEhrCDz12ZP9IrXRGjMuwtcILKtawkePnRGf6agrQ0uihH6yLZIX56jgSmWe2lNoH52dM/0FL0n a9xkf3wq50swfPgeHg/Z/nkl88uLlyjk5lr0mFk2MR/9egBbCRZCel1bpIB5TZyJF9xRAGhRVNj J+wO6yADY/u6QAA== 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 This new property allows devices to specify some register values which are missing on units with third party replacement displays. These displays use unofficial touch ICs which only implement a subset of the RMI4 specification. Signed-off-by: Caleb Connolly Signed-off-by: David Heidelberg --- Documentation/devicetree/bindings/input/syna,rmi4.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Documentation/devicetree/bindings/input/syna,rmi4.yaml b/Documentation/devicetree/bindings/input/syna,rmi4.yaml index b522c8d3ce0db719ff379f2fefbdca79e73d027c..a80ec0c052cb1b7278f0832dd18ebd3256bc0874 100644 --- a/Documentation/devicetree/bindings/input/syna,rmi4.yaml +++ b/Documentation/devicetree/bindings/input/syna,rmi4.yaml @@ -49,6 +49,24 @@ properties: description: Delay to wait after powering on the device. + syna,pdt-fallback-desc: + $ref: /schemas/types.yaml#/definitions/uint8-matrix + description: + This property provides fallback values for certain register fields that + are missing on devices using third-party replacement displays. + These unofficial displays contain touch controllers that claim RMI4 + compliance but fail to populate the function_number and function_version + registers of their Page Descriptor Table (PDT) entries. + + Since the number of required fallback entries depends on the number of + Page Descriptor Tables supported by a given device, this property + should be provided on a best-effort basis. + + items: + items: + - description: The 5th byte of the PDT entry (function number) + - description: The 4th byte of the PDT entry (version value) + vdd-supply: true vio-supply: true From patchwork Sat Mar 8 14:08:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Heidelberg via B4 Relay X-Patchwork-Id: 14007536 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 9767D192B77; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; cv=none; b=Cr/8svsVNJq4OAJaCMHeI8+oIURmRRlAAVN80xNiC+OeH1U0iaBcGbWi+tymDfG4V17hwaRT3e5v9SfiZYPWDiWPo4CUROETv4p4qsGzN3srlVgfj+3+VVK4NS2WAhg4Fh0cb5iZg0neT574RAoulyAbhOnmHGTsBtfDA1B0DiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; c=relaxed/simple; bh=FessAHfp8llK1MUhLRPld2VGAhXefezsrHZkyVH8U3g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n7V0EMIRiebIO3TfnyFBA55uYsPaRCQ33MJvIoLI+QuL/p2yNBXdpvA0bjWd3P7k9syZVSj6X/CZOY6ZDa+U/K1GRGqz28Ct72KOaYomc/ZWpEUXi19eJFQHbRZuKhg4IQ0W7BUI0igYZecQtU13Mar6yDBEyf6dHCKQaPZlU8k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WWf20P1h; 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="WWf20P1h" Received: by smtp.kernel.org (Postfix) with ESMTPS id 2767BC4CEE5; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741442924; bh=FessAHfp8llK1MUhLRPld2VGAhXefezsrHZkyVH8U3g=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=WWf20P1hdOrPQQXPHAtjIQAYE5RE/1vDaMAtk+Cz53dne0yFMmxkhCeMRFC/YNsNc +nWqueARH7tjMH+R3cIQzF3MSL3F3MY8K4fHu7QDzY/jh6ocjbwuBcS660G9kkxAVP DRyuVePETqkG86OyksvFOM+0D4I8GY0Xho0+a4qCs2W/8Kmiuox0Tvzs0NRGzz987A Z3yrYzY/LzQUQclr4m+tIff/T+xxx0Ye1+zpkezCovqUZvsbHnqizq5rFl30+J0Eix loWJTqpLVgm0byG8vxNyWJ5PjsyCLBZwyvMCwHpe0ufXhGQzET2bRZRXSasBdwq7qu 6O2MNT1xcPiag== 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 1E526C28B30; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sat, 08 Mar 2025 15:08:38 +0100 Subject: [PATCH v3 2/7] Input: synaptics-rmi4 - handle duplicate/unknown PDT entries Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250308-synaptics-rmi4-v3-2-215d3e7289a2@ixit.cz> References: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> In-Reply-To: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> To: 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, Caleb Connolly , methanal , David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3845; i=david@ixit.cz; h=from:subject:message-id; bh=P5bWS9YpBhh6rej3eJlRz9nJ3YiSKMRmC41cjG3uBXo=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBnzE9pYdwMDbjsem/LjTKlRfPTrGJ+w1wdgdQx/ 4J56ibrqMqJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCZ8xPaQAKCRBgAj/E00kg cuzuD/9On3Sjrc+4jUD+JVvOK63+3yiMiXrs7x/BujlnPCN7btowJWUbtqicsLqxBQBdoSqoz70 EiLiLyz4w7MDXXFXtdl0ALqwJ0PrWed7U1AxciUJ1xNHLLp7MYzYfHHbNsLR26ucH1FQvG9PTy3 YGNZ3vT+JouNkeiUy8EMwpB/TKwR+H0eqVGRGV/eqgRE6d5plfcOC27oXOUTae/emEGXa1TRDTs Qh/M/799lvHZrggbNqfzjsOB0NKdSgFI9eSdxqBc6F36i8WOEHNDb0+R3MezPq7t03ENXlalrMC Dv1VPezflsiRKpH2aMGKLeq3AGB6fggNI9BcsJ6xrVoNwIOrcLV2oK6dp1VdiZcwQSDt7rn1uJ5 BdPaZalFX7v2drM/qm/QwB5F/ji29HipO0MU8sbHxLKjW3gaySkkcdLdxhGRQ7L4u9iTH5VoASU 34XVD1KFB5MZVBgMxl4mwMTFxrrel1Cq01N8YXoXJ+mpX14b3PWeMxbGN7YbbP3IJ7Rs4esRIlo WeKp5IZIYzf+PRR2opmza15TRgBeyfTCIU6dj+U/+4jSPNgEgNxHOp8cpp6A98ZklsbE1ymUrCd hLjbV+Y28JntJrhhoBVNmrMOAc6uMYlvTuLTmInKl0YsnO2UP2pIYBr56Y60RyhNqHWz7hM62+x Og8sDg+0sLb3UNQ== 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: methanal Signed-off-by: methanal Signed-off-by: Caleb Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_driver.c | 47 +++++++++++++++++++++++++++++++++++------ drivers/input/rmi4/rmi_driver.h | 6 ++++++ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c index 2168b6cd7167334d44553c9c566f870a4e034179..51c23a407b2731d5b6eaefe9cae6288f97316e34 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -493,12 +493,44 @@ static void rmi_driver_copy_pdt_to_fd(const struct pdt_entry *pdt, fd->function_version = pdt->function_version; } +static bool rmi_pdt_entry_is_valid(struct rmi_device *rmi_dev, + struct pdt_scan_state *state, u8 fn) +{ + unsigned int i; + + switch (fn) { + case 0x01: + case 0x03: + case 0x11: + case 0x12: + case 0x30: + case 0x34: + case 0x3a: + case 0x54: + case 0x55: + break; + + default: + rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, + "PDT has unknown function number %#02x\n", fn); + return false; + } + + for (i = 0; i < state->pdt_count; i++) { + if (state->pdts[i] == fn) + return false; + } + + state->pdts[state->pdt_count++] = fn; + return true; +} + #define RMI_SCAN_CONTINUE 0 #define RMI_SCAN_DONE 1 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 +553,9 @@ static int rmi_scan_pdt_page(struct rmi_device *rmi_dev, if (RMI4_END_OF_PDT(pdt_entry.function_number)) break; + if (!rmi_pdt_entry_is_valid(rmi_dev, state, pdt_entry.function_number)) + continue; + retval = callback(rmi_dev, ctx, &pdt_entry); if (retval != RMI_SCAN_CONTINUE) return retval; @@ -531,11 +566,11 @@ static int rmi_scan_pdt_page(struct rmi_device *rmi_dev, * or more is found, stop scanning. */ if (addr == pdt_start) - ++*empty_pages; + ++state->empty_pages; else - *empty_pages = 0; + state->empty_pages = 0; - return (data->bootloader_mode || *empty_pages >= 2) ? + return (data->bootloader_mode || state->empty_pages >= 2) ? RMI_SCAN_DONE : RMI_SCAN_CONTINUE; } @@ -544,11 +579,11 @@ int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ctx, void *ctx, const struct pdt_entry *entry)) { int page; - int empty_pages = 0; + struct pdt_scan_state state = {0, 0, {0}}; int retval = RMI_SCAN_DONE; for (page = 0; page <= RMI4_MAX_PAGE; page++) { - retval = rmi_scan_pdt_page(rmi_dev, page, &empty_pages, + retval = rmi_scan_pdt_page(rmi_dev, page, &state, ctx, callback); if (retval != RMI_SCAN_CONTINUE) break; diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h index 3bfe9013043ef3dff46249095a5b3116c8f7d9a6..0ecbd19cefffe00ce7c8001db6479a2e213ac466 100644 --- a/drivers/input/rmi4/rmi_driver.h +++ b/drivers/input/rmi4/rmi_driver.h @@ -46,6 +46,12 @@ struct pdt_entry { u8 function_number; }; +struct pdt_scan_state { + u8 empty_pages; + u8 pdt_count; + u8 pdts[254]; +}; + #define RMI_REG_DESC_PRESENSE_BITS (32 * BITS_PER_BYTE) #define RMI_REG_DESC_SUBPACKET_BITS (37 * BITS_PER_BYTE) From patchwork Sat Mar 8 14:08:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Heidelberg via B4 Relay X-Patchwork-Id: 14007535 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 976331487D5; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; cv=none; b=ByPFAKeD6XajlurRziPPlEIclhdynpCujAuUUT+gTJpH/7LQAzbjgPGlTYoqaTdNrgeHOGOo9Xw2qrX3lvdWctc9IaAnLf8hosYQtt1aZaot5rUxpz0Is4gTbOP7IJflEZaAH4fcAhcSOrqpktcGa2wl3IV4WUTK4x98l3f0NIo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; c=relaxed/simple; bh=wYQ194/3LEF9BDeZ5X3NYtx9w0FcHI90nQE6WFWSt8o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kS7T+P2Kv4CON+NM1D3e41U61Yl67NK9gT1MznHzM6Utl0cntwfIna+G8BYAZF24VwIbLoeur0UtI4Gub/Y6R7P7Tf8tBYlU+wbs1UE9OvcV4yBeWCz4vCqHXFjY4u42GjcpBi4kuAupHtelFeeV4spBXkdmNtm+3VGROwDl0Bk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=SSkNQiWW; 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="SSkNQiWW" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3D535C4CEEB; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741442924; bh=wYQ194/3LEF9BDeZ5X3NYtx9w0FcHI90nQE6WFWSt8o=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=SSkNQiWWNt2FnxcYGckUCAvB3tmaVxBbF1pNlD4p/ceFnhXnWxM6vcA6Fv4NX7cue /58OvNeKmuGTCtcnS9EgayDdyKktCTTPz+HzxIJl9chgp0E4pV2R+5cR8TwQy4+Jhu iodb0ZxT4WrjNVCpF+DMT79GQIoZIgovDwWp6nTPzhqrnY6Ez9gbXsf7fv6u7shtCZ jiXkF4wxUE3YofmTBHzIxY+FJ9zxwPREIUzp1l28XUSwn73gEBJ+Y6EgEPHmxcNH4z oj34fGu+tHQPXf0PrjgmXLZ23LD8VWGBFMCadrVnZlHoWQ9l2UrZBiphQJDjxHr/mn uOZEDfX9uOKcg== 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 30ED8C28B2E; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sat, 08 Mar 2025 15:08:39 +0100 Subject: [PATCH v3 3/7] Input: synaptics-rmi4 - f12: use hardcoded values for aftermarket touch ICs Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250308-synaptics-rmi4-v3-3-215d3e7289a2@ixit.cz> References: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> In-Reply-To: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> To: 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, methanal , Caleb Connolly X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6174; i=david@ixit.cz; h=from:subject:message-id; bh=nfbsLl9jEfE//GknaK3m41v5MT/fpViMDSJ+zi8NSmA=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBnzE9p0DwbWSlN34PrHfhiOWKeTuzrS78ynUGFE AIyFH74mxyJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCZ8xPaQAKCRBgAj/E00kg chCqD/0U4Pj1vkN7cvePQZUoWJSSIHeG+gsKFOAnxg+G030mC/R4NtQEDXsCmGootDMCn60w8Sr nbcdVsLZjyA93pO/zgexdyD7b8YHpMmqn1CTNmWGC2mhVZGcGz0Ypnfysbx1fimzWfTtZY9J9Om xWEUeAe/KNZqMldwbAYS/94PqyZE6RoKb87xQsDMVukgQE5SvYJD2XUokG4/7IciR6kcHtfyPny LMMBg6WXZMoqQ911ce8bFXAXorf7m+/T+tbtjOh3dD33UWMd9iVeauhdpJtJ2GAoXLHlnslchy/ xN+UozHJjWxK2Ne4OZ/SbbnWWLyGqi+SzUm/Rp5f9hzH2gLYDiLD+HBtPSGmsyXTx/sEFyFm6L9 EX0rHizBALmh01S9Bk8AGFOemud0Cvejb4ucOH5QDwRyboKQlpsCVGM1istObW2Ady2WrNc3pWx GEgVkUVjW5EzYLBCfYpGpD0e8KmkWiCD401TwWWsZ2mMPG1VASA4um4wmLsNWd7kF2FK+Ofhb/F SkPVAjAWOmlzxDScaD3N97FtaN6HEX+FP20iS4Rpviy1TjP/Ok6TW9hVUWOQl4kQlaFMGjVmuaE u1T36qoCTJo1PhuP9NnHwKPV8RH1R6xyLeFNDw+ByR8ON5wErz+zuF18A+bF910bxjCNJ6mEAHL YRuknGz6KyP+cow== 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: methanal 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: methanal [changes for readability / codeflow, checkpatch fixes] Signed-off-by: Caleb Connolly --- 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..1a103cc5f2235a6eafd7a3f5b89cbfc9e53203d2 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 *f12, u8 *data1, int size) rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i); } +static void rmi_f12_set_hardcoded_desc(struct rmi_function *fn, struct f12_data *f12) +{ + struct rmi_2d_sensor *sensor = &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 = 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 = 65535; + sensor->max_y = 65535; + + /* + * Create the Data1 register descriptor so that touch events + * can work properly. + */ + reg_desc = devm_kcalloc(&fn->dev, 1, + sizeof(struct rmi_register_desc_item), GFP_KERNEL); + reg_desc->reg = 1; + reg_desc->reg_size = 80; + reg_desc->num_subpackets = 10; + + f12->data1 = reg_desc; + f12->data1_offset = 0; + sensor->nbr_fingers = reg_desc->num_subpackets; + sensor->report_abs = 1; + sensor->attn_size += 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; } +static int rmi_f12_sensor_init(struct rmi_function *fn, struct f12_data *f12) +{ + struct rmi_2d_sensor *sensor = &f12->sensor; + + sensor->fn = fn; + f12->data_addr = fn->fd.data_base_addr; + + /* On quirky devices that don't have a data_reg_desc we hardcode the packet + * in rmi_f12_set_hardcoded_desc(). Make sure not to set it to 0 here. + */ + if (!sensor->pkt_size) + sensor->pkt_size = rmi_register_desc_calc_size(&f12->data_reg_desc); + + sensor->axis_align = + f12->sensor_pdata.axis_align; + + sensor->x_mm = f12->sensor_pdata.x_mm; + sensor->y_mm = f12->sensor_pdata.y_mm; + sensor->dribble = f12->sensor_pdata.dribble; + + if (sensor->sensor_type == rmi_sensor_default) + sensor->sensor_type = + 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 = 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 = dev_get_drvdata(&rmi_dev->dev); u16 data_offset = 0; int mask_size; + bool hardcoded_desc_quirk = false; rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__); @@ -365,9 +435,9 @@ static int rmi_f12_probe(struct rmi_function *fn) ++query_addr; 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 = true; } f12 = 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; + dev_set_drvdata(&fn->dev, f12); + f12->abs_mask = (unsigned long *)((char *)f12 + sizeof(struct f12_data)); f12->rel_mask = (unsigned long *)((char *)f12 @@ -393,6 +465,18 @@ static int rmi_f12_probe(struct rmi_function *fn) f12->sensor_pdata = pdata->sensor_pdata; } + sensor = &f12->sensor; + + if (hardcoded_desc_quirk) { + rmi_f12_set_hardcoded_desc(fn, f12); + + ret = rmi_f12_sensor_init(fn, f12); + if (ret) + return ret; + + goto skip_register_desc; + } + ret = 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 += 3; - sensor = &f12->sensor; - sensor->fn = fn; - f12->data_addr = fn->fd.data_base_addr; - sensor->pkt_size = rmi_register_desc_calc_size(&f12->data_reg_desc); - - sensor->axis_align = - f12->sensor_pdata.axis_align; - - sensor->x_mm = f12->sensor_pdata.x_mm; - sensor->y_mm = f12->sensor_pdata.y_mm; - sensor->dribble = f12->sensor_pdata.dribble; - - if (sensor->sensor_type == rmi_sensor_default) - sensor->sensor_type = - 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 = devm_kzalloc(&fn->dev, sensor->pkt_size, GFP_KERNEL); - if (!sensor->data_pkt) - return -ENOMEM; - - dev_set_drvdata(&fn->dev, f12); + ret = rmi_f12_sensor_init(fn, f12); + if (ret) + return ret; ret = rmi_f12_read_sensor_tuning(f12); if (ret) @@ -543,6 +607,7 @@ static int rmi_f12_probe(struct rmi_function *fn) data_offset += item->reg_size; } +skip_register_desc: /* allocate the in-kernel tracking buffers */ sensor->tracking_pos = devm_kcalloc(&fn->dev, sensor->nbr_fingers, sizeof(struct input_mt_pos), From patchwork Sat Mar 8 14:08:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Heidelberg via B4 Relay X-Patchwork-Id: 14007534 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 975DA1465AB; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; cv=none; b=aYz6YUo1As0SEhDnALHwHtJi2F2WVKLc0ZWBNoJNwWLSAxTUwF66M9ADzS5nGg5oSoHn47O5Fr+xxMxWL6rEaidh+GuC7aY+WZxwc9VYjCe4sOxNIGYx+JgtLKb55Sv53Hnic4qc9nLTJfY6LX+u8nxEjyGA5p+/wgDUR/X/7D4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; c=relaxed/simple; bh=OZJFn2kWzXxZtO50ATmH2PlPJ1mrjuXSB8BlOyraUSA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DG6cunpcbkL5r6+/sBxwWqaYkwQPhRT+dqgGy4W/oz9VdyF63x+YtiMYli5/FMEPwk+ukGUjhI8cCJeTKN9rWoT/qTtDFR70PEZay/vQKCA3wJjMplNG9ZbmdW5yaAVG63trjyjeNUg5VnwJEifURtEi1pyxMO2L4QJlm5gmvpk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Sz7h1Jh5; 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="Sz7h1Jh5" Received: by smtp.kernel.org (Postfix) with ESMTPS id 4B65CC4CEF0; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741442924; bh=OZJFn2kWzXxZtO50ATmH2PlPJ1mrjuXSB8BlOyraUSA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=Sz7h1Jh5ZvhUSFeP8L4OE+JzZM/G4ZN9ytia3KyANN6O4ZsUx0KIL7MYlfNj+96kz bvyGkJYFQG2yetRiM2hchCsrBHfxWDZjLoOG4LFMx0ikkIpbVjQvZO41cUSwERps56 WBXuzsAFWLjOs+UELEqMYWaT47kweoqCrZirRwGpMLvvQMSkGcxNJCjwI6KnkO43m2 SCOD/gFbd5I0M8oGVeioVAz5E5tnz8aE5yhvyRhc3+31L2wGUIhJ3z4tvkAl+rEuaF st6eNQlLRU+91dY59q/YuuooZPhfuKtNLISzGoGYelaWYu4HBwxI84Ehn9g+wI9hIi 1F6MFXoXK0dNQ== 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 417B3C282EC; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sat, 08 Mar 2025 15:08:40 +0100 Subject: [PATCH v3 4/7] Input: synaptics-rmi4 - f55: handle zero electrode count Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250308-synaptics-rmi4-v3-4-215d3e7289a2@ixit.cz> References: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> In-Reply-To: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> To: 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, methanal , Caleb Connolly X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1120; i=david@ixit.cz; h=from:subject:message-id; bh=hiDNyT5E2yGpmjVDicyfKBuIVjPA9Ga1ra8J+txE4mY=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBnzE9q/je0m4BVEyzjtbsSLpYZ/5ZJOh5xCum1o Uxcb0p2e+uJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCZ8xPagAKCRBgAj/E00kg cllnD/4tPKZRlakbfkLb68qJ2DccOXIB/VhozmmGfWeG1AhRiiA2as/S77FNWDRXS2ISV9ypUgL +n1qoOudQxEv+Q1yaPCZ3leWhrvraCqOtgDSXlNtk7iJjmhy6sIncaFWItFD83vyS6+zfEm8DMN oqR7R5yNYx/UrND2I6tS3H1EijqJEQr/K2XL9NB3WjrYq9fToGlTenLWQ5EKireO/J/bNB89oBR 7cJyCIaT2jCZnMLWtjz2Pclshwl3tDtxg1gU6ZBGjz/SuT8WNu5EpMo4TrlPGEFjaYRpJOpDRBp hp6oxW1t2TO0IczN0xqwRrmZWApEV4GamxNXbZ5oHwhV86wGsMC1HEuQALdgKdJ2t6xDd8bB7Cm 22ekesLXe1bn1DCLNGrxOP2rv/8KnC9URil6mY7QWMUszf7cQZ0sRro/5qdVH8NVAUqSZKOTdTt bEnCjYJKYbpBH7Zcxk3RvlCAt9ZWe3libiyiiZ32pjh5L1KUg9qxgfgBt1FCK7c/rkVl2ae6+0X uzxB+QZL+iKGg+TDprNB7Znab8XsaSLYxj3HKXS6uZoyvmC8S97KhqTinbmjaXYeHHWXQyBaV59 XVh9GIBHzVCe/XioXCJ9Afqy/FwD9IKi7Q5PdZkI24E+KwtUFp4yraVs5abwT7eJCu3QotbF5h3 RBplUBqCR/w9k5Q== 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: methanal 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: methanal [simplify code, adjust wording] Signed-off-by: Caleb Connolly --- 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..ad2ef14ae9f4e897473db43334792cc3de966d52 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) f55->num_rx_electrodes = f55->qry[F55_NUM_RX_OFFSET]; f55->num_tx_electrodes = f55->qry[F55_NUM_TX_OFFSET]; + if (!f55->num_rx_electrodes || !f55->num_tx_electrodes) { + rmi_dbg(RMI_DEBUG_FN, &fn->dev, + "F55 query returned no electrodes, giving up\n"); + return 0; + } f55->cfg_num_rx_electrodes = f55->num_rx_electrodes; f55->cfg_num_tx_electrodes = f55->num_rx_electrodes; From patchwork Sat Mar 8 14:08:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Heidelberg via B4 Relay X-Patchwork-Id: 14007538 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 DEAE51CAA6A; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442925; cv=none; b=MRnJaoYR95rPQLoweLoMdafv4AzHEQZ4YmfIcejRGhlPAgcmWDmU7d9bidUaa1XIUIfjHvCRVjKVh24OOTc089YMe+R7Be3m9FFEhAr7pvJRjmn6u93K0Ej0evakruEoiW53TzIXoM+l3DXkQgM//nXpC4Mq9Ae5XNw0ds6X+f8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442925; c=relaxed/simple; bh=zIl4vKpzJSVDz/qrzXmoaU6OOU5h8or2T3/8DW4sLaI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JpN/tYAVbA1wKoTlKGLWRfiAHEhzC1LfuU/32SJv4Lw8YTfpitoj2189OQqIhDz0EilhVOQJFcXn6M751oT8bYcGS0Q8gCwWQ9iIAekTwZad4gdAgHq5lmvjIlO2QVwoyRxwVv9bowzZ7TTe0IPLNf2zrL5tQfumUFUmGsOUZKQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=u642Hf4O; 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="u642Hf4O" Received: by smtp.kernel.org (Postfix) with ESMTPS id 57755C4CEEE; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741442924; bh=zIl4vKpzJSVDz/qrzXmoaU6OOU5h8or2T3/8DW4sLaI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=u642Hf4OGayulNKXfn47g8AS9Zl9BIUKab3Hqy8W15Ti/DcPafzJBww20r7VPhELG pDTdZmzFuIt0wZA99Ya73G1ZJfredw6PeGNAW5zBFUBMTjPx1VBCO6FPU/z/trjEBs WfL1dcPmrBdUY/AVNRENHiOiRc/yoDSVkz7E07RQ/Q74eVpx7Wiw5ij42QVU2SXHm0 4eFyR6ZKA5HoLri0rwKeqYKiryGNiRi8/6U/frVLTs4bFZt/l3endHRTytJipM+pr2 BKFKzZOeH9u8Y4EC3kUkkciVtO9BbUqID+llgawP6soIT//UJcdH77YiJMQE2QutmI hgy75C41xGZgQ== 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 509D1C28B25; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sat, 08 Mar 2025 15:08:41 +0100 Subject: [PATCH v3 5/7] Input: synaptics-rmi4 - don't do unaligned reads in IRQ context Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250308-synaptics-rmi4-v3-5-215d3e7289a2@ixit.cz> References: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> In-Reply-To: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> To: 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, methanal , Caleb Connolly X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2407; i=david@ixit.cz; h=from:subject:message-id; bh=4xh1t3yxGMB/ipkF4g5QnA5ESuxz5T9pK1Z5a5i51vs=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBnzE9qc6aq2MLr6q7eHQudH8iSzTBRNGFR0p/O2 E7LBZU0/nqJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCZ8xPagAKCRBgAj/E00kg cmGkEACL+Evc2t0oCoayy0DQ3ERGsg6j4XjsxJxnpp7FjiFuk9mVt2iOJNbH0xS/EnV92ywc9u8 Q440LT+tFgtRezhViMsflCWQHF9lembSFsLMTsNZllrjZTakMY6Vf8r8XPBc/yqFZI3VVSUMm5q FCquL/Rc7DsvhkHUZaSWrB3WPZ+gnmayjA4V1t/O/UJa/0WagRgSl4BcpyqVxEMwadjQfz3YQiR dGnn2o9PxgdNIdVTpQYaYJhEFs5CbiqDsKe8vCrxO08xEqOQu0ds3XoRGXZib+fqaC8uigV8wQy j7rTbzfdQiJkIG4DJm4VUWeyKo+R1xmSLAmZqCjj75oLVyrp2ZUruz259MOYtNsS/l7/Liq/YsW gXDcxSu1uHueVLmSf2Y7x3F31Z8ZS9rXblpn0XQ8eSF50bEH8gzG9z2WlIzN6dnQS881drD8Jab vd4TON0GdHqjDgxzWVCjOT5xg5dN/Jchy/B319JfYxuiUhtWzXlPSP/4jf/iQuzV+9Wb+WUmdNp IVbsBgQ7IrBHzIF6k/WLSEQ5KatA5ARRbLqSaxK73ZXCq6yIZ56s3d0mSZCLrlKFkdOrgRI9Ueq acghTfesBUGXBQ1oRe5V0eSpinBs/Sg99Pbs5VaLJ+xYQXOhHEUtrYnya3j1+0EFXyQ/zNwG1/Q fxLsru3jTyOnz/w== 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: methanal 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: methanal Signed-off-by: Caleb Connolly --- 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_driver.c index 51c23a407b2731d5b6eaefe9cae6288f97316e34..2790f00a58bc66c04656d0cd1b4afe9f843ee093 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_device *rmi_dev) return 0; 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 = 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=%d\n", error); return error; @@ -1083,16 +1088,17 @@ int rmi_probe_interrupts(struct rmi_driver_data *data) data->num_of_irq_regs = (data->irq_count + 7) / 8; size = BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long); - data->irq_memory = devm_kcalloc(dev, size, 4, GFP_KERNEL); + data->irq_memory = 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; } - data->irq_status = data->irq_memory + size * 0; - data->fn_irq_bits = data->irq_memory + size * 1; - data->current_irq_mask = data->irq_memory + size * 2; - data->new_irq_mask = data->irq_memory + size * 3; + /* The first byte is reserved for the device status register */ + data->irq_status = data->irq_memory + size * 0 + 1; + data->fn_irq_bits = data->irq_memory + size * 1 + 1; + data->current_irq_mask = data->irq_memory + size * 2 + 1; + data->new_irq_mask = data->irq_memory + size * 3 + 1; return retval; } From patchwork Sat Mar 8 14:08:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Heidelberg via B4 Relay X-Patchwork-Id: 14007539 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 DEB651CB9EA; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442925; cv=none; b=o4TiG2F0CRk03XrZF4MK55r/PzliS0AxknjoTkUk6M1PGtiYCU70aVpshdSSBxKn49Y6K7/HAu8G2LX8GS+1s5NOHhW/aOgkIuggMqNEXQ2kLPaGd7Rs1aw+Hkl+pbkcz9lqJreToRdKejMwW6ymXy5ykKUkxD81wP5yLC0hRis= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442925; c=relaxed/simple; bh=Yas5xai1IOwpaMITIAgtkXkJZjEndYzw4juhIMuYg7s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=STMjpmDv9OhxKgad0BHHG1NIU2/ITVGR46gCuMtv1frNNU1qlNB/Gi0Mak1zZkRHBLYB+pfrbmtveHieZwnGV0MpchNWY63qicDxWtf1WT9s6Ovx4Q3j7q3dSzC9Y0v/RiIU38NnIwVi0vYTBFiBA45H+yOxxAtjQwKAUmeAJkk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dkbtfH6s; 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="dkbtfH6s" Received: by smtp.kernel.org (Postfix) with ESMTPS id 73D87C4CEF6; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741442924; bh=Yas5xai1IOwpaMITIAgtkXkJZjEndYzw4juhIMuYg7s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=dkbtfH6s9QvO/pBSGS3nAP0IxJk/jviyfMvDu5+qjNTXcgQvptv4FcNZfKrCv5nxN tfNBrGMK7BbG1r/SLBzH9bNRkZuLDiGjdoDDtgD+1gGF/5Dc35Mh2nFjLbiFAF/reQ c3BqlGSB4HOwozLwExWqTT+PDluFh1A06BpNyMihRhIG3tMKlz6yWhMDKPwnNvk7/8 3a+vE+kwzM36E+GiGgATAXmYxd+WHmIdsW7UjSWeRWtcxhd+Q4ftrpf3aE9S5zFXsP fphvM1Jenff1mpKGnMj0UV4yiiMreP/MvfD4LAqgKfcFQ5bW1mWVBM4piQGkCOy3sA Xfr9TwF7axRjw== 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 6397AC28B2E; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sat, 08 Mar 2025 15:08:42 +0100 Subject: [PATCH v3 6/7] Input: synaptics-rmi4 - read product ID on aftermarket touch ICs Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250308-synaptics-rmi4-v3-6-215d3e7289a2@ixit.cz> References: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> In-Reply-To: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> To: 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, methanal , Caleb Connolly X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1190; i=david@ixit.cz; h=from:subject:message-id; bh=fxuJtva2e8FaBzb+bW/oVy+YglxJV7q23OaA59oxqwY=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBnzE9qpBbGcPsA3x2ZHJwwDVetMUitjwHkwxdpL GRZC7qAiN+JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCZ8xPagAKCRBgAj/E00kg cqHJD/4yp/pHJI9xAQ7N2X0bGa8rE4STA/jHtd8IwnR8jCZHsN8u+2GmrD0D5wLeerPvvwQKKOc 0l4qeOBKGKQ0TOpzf2LVNqxf+ml4J70rugkcTySRgjrY/XWAOpnr314xirqucDzWgdme16hDY44 8c7cm/17fEUk0xw+qbFrFJJ70dGCr3U1vZEFJA3C45hMzPfwvQMQtf7mCdG5uEdqpUBcLcBQ6cS HhXcj9Is5e6Df/bc8sSY6fCyRiqdtYQYeHm3h/FzJk8Zr1zx2H7l9bdsYuunWuHIePY64A0nsCv E8YAZVn7uWQH/Ci3BlH1jgCA8jmifzk+eB4XIyLxzxItjcFmW32s4TO/bl5bMV6tciBxINW+FcP g38oR1dByV2Yjaqd8pPhUxsi242e9RgN8SVweq9IAtMIUzv2BAH4H9++kyLfMZoXf6FE1bXPrsc I/Q8JzJuknCwc3pY3dctxoJlGzbMQTUp+TQUMZD9vSXQmWpffTFrEc2jRXe+V6Vaw0aHQ4dqlW0 8VnWCO4NmAtNfBmyBxJKp5+qNmiT17TQOUcBm9kJxx5CDCE/ZvJjxspOsnKFOsSCjE9lMWsq/hj Qn3JNN4N0Uj8g4nH4RrOXslwDPzx2Ftl07N9bwgxvd8Jqag+hAQD89OBYuibWuI6C/TEDrPNohL leiyOtthaX97seQ== 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: methanal 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: methanal Signed-off-by: Caleb Connolly --- 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..2278e9b6a920774b07ec9dd3e452cedc69469be8 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, } } + /* + * 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 = 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; } From patchwork Sat Mar 8 14:08:43 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Heidelberg via B4 Relay X-Patchwork-Id: 14007537 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 CB0071BD4E5; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; cv=none; b=MDpzn/ZBoA9bRePiO240YeqVeA5FSFGluf8d8OiwVfvuPueGD4zabbETJWwaGSZEmvLpvwGA9bQqzVJWLTbd7Yu65QLBkx4E7lJdvTMpS/HyYAeCWC755L1mipBy8a9yqbt8QY6j4tWHKIQty+xcALqr850HW+BzjGEH12Xu6wI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741442924; c=relaxed/simple; bh=Ib1RxKPJXDynmwe5rkzdveYc0pqL9TtucOCQXMLF+aQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lDhTf9pjsA2B8XhCAauPTro7mapsKHN0WPPsnUbIr5/Yqg/SsU0lzciKCpZxRzkw+BTyVAFxRxKkKe2iq93k/UJ1GXZdNi1MYC4suTp91Mpoea09l87zX5lDLnhpWNQNEdiCejvZr4yXxXYI4aNsVsm18YS+3OBhe/KrZlY+dGk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=vJwhmt9w; 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="vJwhmt9w" Received: by smtp.kernel.org (Postfix) with ESMTPS id 805CEC4CEFB; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1741442924; bh=Ib1RxKPJXDynmwe5rkzdveYc0pqL9TtucOCQXMLF+aQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=vJwhmt9wEXKMyvyyfgyOii7S36GnSv8DBHl6qDMRxlD/mL5qIoWa4Npki09dtcRp7 qoxLmbi3YtiTvOguyXcfTzAMCMgmWtx4RPvBwZzZ0gJkaEiQhtuWeJhgtf1ni9/jPb ntmtynaLx7IEt7EJbNTowItltQUVSJBKqf9n+amc+TkDYOAw2vi96L4yccJ3CREl7Y JL06d8jQp5PSGNs9K3kKPPNiufJ1y12TzTocFr5hsbAjs4+7CQKQLaWHvztgH70sW4 qiQzeXvxnWVDaYuQ8gPkLNytMM4B4uMrMCDrsx3oy+sLrjWTmR7B6qjKiuLNtuuEpa ToTJIon34FHtw== 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 74A28C282EC; Sat, 8 Mar 2025 14:08:44 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Sat, 08 Mar 2025 15:08:43 +0100 Subject: [PATCH v3 7/7] Input: synaptics-rmi4 - support fallback values for PDT descriptor bytes Precedence: bulk X-Mailing-List: linux-input@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250308-synaptics-rmi4-v3-7-215d3e7289a2@ixit.cz> References: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> In-Reply-To: <20250308-synaptics-rmi4-v3-0-215d3e7289a2@ixit.cz> To: 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, methanal , Caleb Connolly , David Heidelberg X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6298; i=david@ixit.cz; h=from:subject:message-id; bh=Dn5bsYg4pf/Oeca1et0GD9N++L1Q1XHbzr6rlTyTyRc=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBnzE9qXHjqdifeUGdAvEjMz8T7DdSjpZMWlnOYu zAQbOZe63WJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCZ8xPagAKCRBgAj/E00kg curOD/wJdyymSHG97wQFh8EeZ1106F5az7WIyDPmIUgofVsYkTF3uasNhbkgfPE80jS85WoqIa4 gIAp+YZEC/F//wfVz8hzOm/OFsYJJNTvnYoybV5h4MkK1U4PPo1KUyj3f+Z2UmM5I9HrkDJEiaj QlBtUgF9SNH34XVm4vN2PjKJLk7+zzd8fIedwYu0zhkhRoY98VDAUgn0S6R3lHmpgTxgCJh686F T3kc4BtmMSrLjyTEljMpU0l3WRMH/hNqRassLVwHCVIE9FB65NeknQQwUHYeRP2tknO6qoM5YGc UI/IPQ5ZRjdt6KzmxbzZPeDDeXzMZYEV9PY/2nngYnoDhCQvVamDcFH3gJq3FbW2hZxMgZI5noc rhRL690JIj9kaXtpthFeRL/G8vEuup4FQL15lGCtTIWYMVkkdFDP8s95SBUR8/SGGCUrtyzIED7 Ss9iNQZTgr23jdG/Z3WlD0wOqUMSHmJXJDCTtm+HhaHOnWQZhbF7DMM2Gzs0S5AjsvEQGq09bMu ETE3dnr3vmzi4XnE5gTI57M6y39szjMX3tw1x4S+LEpmqD6Mgu3UO3LUQMtkgL5umfJ2y9qnhV4 HNJMCT094qzX+cbETpNHiJA1cuJiTuIvohMkDId6s8FpXfNjXwejtqcWFklieRj6lrPIJj4xzoz epJI+EeucsSY4jQ== 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: methanal 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) Introduce a new devicetree property `syna,pdt-desc` which can be used to provide platform-specific fallback values for users with a replacement display with an aftermarket touch IC. Signed-off-by: methanal [codeflow adjustments, checkpatch fixes, wording] Signed-off-by: Caleb Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_driver.c | 73 ++++++++++++++++++++++++++++++++++++----- drivers/input/rmi4/rmi_driver.h | 2 ++ include/linux/rmi.h | 3 ++ 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c index 2790f00a58bc66c04656d0cd1b4afe9f843ee093..f233c0b1f8e6a936089fd81344c46b6741d3d82d 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; } -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 = rmi_get_platform_data(rmi_dev); u8 buf[RMI_PDT_ENTRY_SIZE]; int error; @@ -474,6 +475,21 @@ static int rmi_read_pdt_entry(struct rmi_device *rmi_dev, return error; } + if (pdata->pdt_fallback_size > state->pdt_count * RMI_OF_PDT_DESC_CELLS + 1) { + /* Use the description bytes from DT */ + buf[5] = pdata->pdt_fallback_desc[state->pdt_count * RMI_OF_PDT_DESC_CELLS]; + buf[4] = pdata->pdt_fallback_desc[state->pdt_count * RMI_OF_PDT_DESC_CELLS + 1]; + + error = 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 = pdt_address & RMI4_PAGE_MASK; entry->query_base_addr = buf[0]; entry->command_base_addr = buf[1]; @@ -551,7 +567,7 @@ static int rmi_scan_pdt_page(struct rmi_device *rmi_dev, int retval; for (addr = pdt_start; addr >= pdt_end; addr -= RMI_PDT_ENTRY_SIZE) { - error = rmi_read_pdt_entry(rmi_dev, &pdt_entry, addr); + error = rmi_read_pdt_entry(rmi_dev, &pdt_entry, state, addr); if (error) return error; @@ -1028,9 +1044,11 @@ static int rmi_driver_remove(struct device *dev) } #ifdef CONFIG_OF -static int rmi_driver_of_probe(struct device *dev, - struct rmi_device_platform_data *pdata) +static int rmi_driver_of_probe(struct rmi_device *rmi_dev, + struct rmi_device_platform_data *pdata) { + struct device *dev = rmi_dev->xport->dev; + u8 buf[RMI_PDT_ENTRY_SIZE]; int retval; retval = rmi_of_property_read_u32(dev, &pdata->reset_delay_ms, @@ -1038,11 +1056,50 @@ static int rmi_driver_of_probe(struct device *dev, if (retval) return retval; + /* + * In some aftermerket touch ICs, the first PDT entry is empty and + * the function number register is 0. If so, the platform + * may have provided backup PDT entries in the device tree. + */ + + retval = 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; + + pdata->pdt_fallback_size = of_property_count_u8_elems(dev->of_node, + "syna,pdt-fallback-desc"); + + /* The rmi4 driver would fail later anyway, so just error out now. */ + if (pdata->pdt_fallback_size == -EINVAL) { + dev_err(dev, "First PDT entry is empty and no backup values provided\n"); + return -EINVAL; + } + + if (pdata->pdt_fallback_size < 0) { + dev_err(dev, "syna,pdt-fallback-desc property was not specified properly: %d\n", + pdata->pdt_fallback_size); + return pdata->pdt_fallback_size; + } + + pdata->pdt_fallback_desc = devm_kzalloc(dev, pdata->pdt_fallback_size, GFP_KERNEL); + + retval = of_property_read_u8_array(dev->of_node, "syna,pdt-fallback-desc", + pdata->pdt_fallback_desc, pdata->pdt_fallback_size); + if (retval < 0) + return retval; + 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; } @@ -1163,7 +1220,7 @@ static int rmi_driver_probe(struct device *dev) pdata = rmi_get_platform_data(rmi_dev); if (rmi_dev->xport->dev->of_node) { - retval = rmi_driver_of_probe(rmi_dev->xport->dev, pdata); + retval = 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_driver.h index 0ecbd19cefffe00ce7c8001db6479a2e213ac466..67a04133a4d85c56d80d0eafee65797319c75c54 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 +#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) == 0x00 || (id) == 0xff) diff --git a/include/linux/rmi.h b/include/linux/rmi.h index ab7eea01ab4274bfc9efcefcdb0cced6ec34966f..974597960b5ee61b670ab55a78c317710022d7cc 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; + u8 *pdt_fallback_desc; + int pdt_fallback_size; + struct rmi_device_platform_data_spi spi_data; /* function handler pdata */