From mboxrd@z Thu Jan 1 00:00:00 1970 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 B05073431F2; Thu, 13 Nov 2025 16:31:07 +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=1763051467; cv=none; b=ZYMIb7IqalQYpYBs+BrMzFrGYOIOmrN4oOOHmNKBjvNXH+l1T4epDJbH7s3iLEk9lZnsV4Ji48u5yRljJmY8zOnZIb6YqRNOy1j3Zs094w8N3xQwhrVONZoXUM5+yXWcoDlWI3Iq9SN1ErovY25guhmrFJiPxuRrGBr3mDI0aoI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763051467; c=relaxed/simple; bh=b5gXFqN7f5GJJUwhRPlPi7ZdTCLQZtsq3U/PN4qzOJQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cP3u3/DiI4wEqqxcQAKE7nL/zPRM+E6VnDRKl5r/sclrKfd9whx3xDe75ntuhqClG/n0AqPKczpZm6T8oyIV96qhdkPP0UPyZK70Np6bOP7vdPTzI+lsmro+5rhyhuDTVEAiezkFMCSVQydlxvZwryOERPTg2BpKSdLa/m/MNzE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=hfKn135R; 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="hfKn135R" Received: by smtp.kernel.org (Postfix) with ESMTPS id 3D94DC2BC86; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1763051467; bh=b5gXFqN7f5GJJUwhRPlPi7ZdTCLQZtsq3U/PN4qzOJQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=hfKn135RXFnMH+kfjbqZa3sGBaAi4fBNPGOkFSRG9lVQtyrYWKtT5URSHQj/iTQ6R 8Edl6tDjAoiSX/l+9c75c/4TIHHFlRpkVw7BjDbpsI4gJhr/JWlhZvPxqWX1j2p36c xbdh0CDaj8pUdE0w6y+shWRVKJMHzcU5VAZiMN6nKudPCafl6FfNjfpZCuz+G61KfC BGLnf4GdrKf/WrKi3lNwJz+Xo1EjeqLgEfA2XF9KqCuhMQBsnruAGK7918Nai8MqZG gFE4WDFS47f16SKgfOHyflIYH+z3WNL/24w+YY7Sza30dPjuThwbFiQl7CCiLbtvVC cBDE6/Fn0/9/w== 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 18EA7CD8C9E; Thu, 13 Nov 2025 16:31:07 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Thu, 13 Nov 2025 17:30:59 +0100 Subject: [PATCH v6 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 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20251113-synaptics-rmi4-v6-3-d9836afab801@ixit.cz> References: <20251113-synaptics-rmi4-v6-0-d9836afab801@ixit.cz> In-Reply-To: <20251113-synaptics-rmi4-v6-0-d9836afab801@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, Casey Connolly , phone-devel@vger.kernel.org, David Heidelberg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6187; i=david@ixit.cz; h=from:subject:message-id; bh=z4vNak61Csdv72X5cclFvPznjgvEQ7qek08VaFKSy5o=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpFgfJ9RsTOGL/7aFP5DJDkQrF+bmdhMZEK+sGR RcvervwciGJAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCaRYHyQAKCRBgAj/E00kg cjh1D/9Pb7gtmsTwUgxCAGahj44SIELknRsDnTicsYeU/blo7RxBcJhWiq9aipUPbm3D53J7QAq ZAvLN093RGqY40qm49u+Csez+DK0wpwknJ3nMqGh1U162DokO94nBTxBalnyJE/uQu8UOmOBRmI rzgs+LaSTEjgmkQL2Xadxv3GZeOJTLZaU8R/D2tRbQROplisvjsFmrekRhzqtBzb91VR5pUNyJb aJNmEppB1u6VlBGqdvH/5KzocMRFK2DZr4P0oYI2INUGBYJtBVfxDGRO1PcqVBiPqoPJX2ljTRo DRP+aOWloyJnOUoOuF3RwXOPtUnP5ZwUajbHo3FB4RfFWxpDW9+3GqatPfVDsTl4Qg5DBVCDfHj NUI93B2SnJaE1Voi3LNa9xknTYutkC3oNjjaCOjJBQ4f5J5w5PmL3WG/dBfkpE7V1kvR40bwMKR 2zekYlD/+43lbUNUw6uSXg5id92EM6f7SU6/gDGLz1HG68phMfC7z6NwR4Z+ceZRdngDmhOGLVj Xgpc54fMrMW1VncR8F0AOOkPxPJ/exFHGFQ70KhNkYCPiD/IUN+Vx69Md3caMkRw5Rb91k61vhA /Hbk0i05uRRktF/OJ4lZ6VF9vSFjxXSQYuOhgijKzbzz4J/fgIpvMuuJgityts/bSBiMde+QKlA HkNX8sDR2e2httw== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Kaustabh Chakraborty Some replacement displays include third-party touch ICs which are devoid of register descriptors. Create a fake data register descriptor for such ICs and provide hardcoded default values. It isn't possible to reliably determine if the touch IC is original or not, so these fallback values are offered as an alternative to the error path when register descriptors aren't available. Signed-off-by: Kaustabh Chakraborty [changes for readability / codeflow, checkpatch fixes] Signed-off-by: Casey Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_f12.c | 117 +++++++++++++++++++++++++++++++++---------- 1 file changed, 91 insertions(+), 26 deletions(-) diff --git a/drivers/input/rmi4/rmi_f12.c b/drivers/input/rmi4/rmi_f12.c index 8246fe77114bb..1a103cc5f2235 100644 --- a/drivers/input/rmi4/rmi_f12.c +++ b/drivers/input/rmi4/rmi_f12.c @@ -218,6 +218,41 @@ static void rmi_f12_process_objects(struct f12_data *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), -- 2.51.0