From nobody Fri Apr 3 16:03:02 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC3E730BF70; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381237; cv=none; b=PYeqay4D7Tbn4Du5ax1847FysqkXd5ynH9C2CKWZ7F8XzZPq7a+xVhpgeO7CIDihIKbxRWUJGUmys42jahoaHTxesrQ/WPCySzI8Xb5hIcSHcSiTgmVxwsbIad22KFuWXtD06a8jT3AvxdzZ3yr6QtBYr2r7M5wI4ipC5bQGFAk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774381237; c=relaxed/simple; bh=2qx54d071209ocyGH7nQIwEVJpZqWrRVUMn+5JIxUn4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Y4+UALVFrAMoJVHRnY7hqXmjQu4dOO/Pv0vBdbl2mZzv9fL97enzcFcV86sg/6tFe9PUQ9EhftYvkzIEFIDa5V18Xyt1+6mSS+d/QbTUQ+AO4XNxEJNS/Eet7CW9oIIylLfwEcIlgHuci9bFIJNx/jO6lwWpcHDJLqCN2qQgexQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=dT52nG6b; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="dT52nG6b" Received: by smtp.kernel.org (Postfix) with ESMTPS id A65D5C2BCB3; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1774381237; bh=2qx54d071209ocyGH7nQIwEVJpZqWrRVUMn+5JIxUn4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=dT52nG6bo/sOjVefivsNMJfH5z26LsXkJ/HYfAFbBhxm3rlH3J1Glq/lGTeBFdqNf wZvjQN4vDA1OQFrgedvM7C1ZhX6S1LD7JcFGIOUkjkLyv7V5CIsyjqVXflCsRtK3j4 UEwtu6LieuxlSIhb5/YWEANwH1Vs9cl6bCReC49jwVrLosm7S4N4zn0O1+S+fbJXgF TBWKk2RnFjY0dWqKRBdFb2WaDbHQJZWVJvooBq5FA1v8rc1bMXSAkTKxmCXkKsQiAN NX2vF6LmRyALSbB/0YflLHw6jeuOOFlsPdGf1QqK6NF9UXSlksKmED+Xuu2+sd3NWX pp3I9LxyU4+Bw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9813CFEC104; Tue, 24 Mar 2026 19:40:37 +0000 (UTC) From: David Heidelberg via B4 Relay Date: Tue, 24 Mar 2026 20:40:36 +0100 Subject: [PATCH v8 3/7] Input: synaptics-rmi4 - f12: use hardcoded values for aftermarket touch ICs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260324-synaptics-rmi4-v8-3-2168d2df68f5@ixit.cz> References: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> In-Reply-To: <20260324-synaptics-rmi4-v8-0-2168d2df68f5@ixit.cz> To: Kaustabh Chakraborty , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , "Jason A. Donenfeld" , Matthias Schiffer , Vincent Huang , Casey Connolly Cc: David Heidelberg , linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, phone-devel@vger.kernel.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6187; i=david@ixit.cz; h=from:subject:message-id; bh=uIVBzoVvoT9cC0FlMrh8EX/REdV+nI9MyoZTwpNDSos=; b=owEBbQKS/ZANAwAIAWACP8TTSSByAcsmYgBpwuiziVInBiryitVZEQO+JQAVQaSJwpwWggqA7 fhG1O2QJo6JAjMEAAEIAB0WIQTXegnP7twrvVOnBHRgAj/E00kgcgUCacLoswAKCRBgAj/E00kg ciscD/4qDHEqP96d8O5ER74c+ghIzkHyzbr6VCBmcNXwydwzR/ZqkrA5gJ/qP6pzmBrHfOCd4lD gHct7X5lnL8eEn5wAhf76wlIjziajNVJ2wSIVCdq3paZyvsUADxHxhPp7reNjb8oWMCzSLB0Dbd X1tbgFfyX2VyBsJs0oWF7gkDJvpMzIOZhQAdMhvhUbbXCaiNgy774X9Q0gXWEma8bO8PREnG5u4 V27WoIbhxwY+6P8dNgaMRN9G6W194NkgKvvoFbiiQMCLsatmF2K6oL6hmRQ8rf9lyl8TIF4Uinl 8mI5pD0tHoUQ7IcN9xeUhBvoGSnvl4bb6WsmzyAI7ju48kpDuukxDhl5R+IPwSl36nL9morTgYP tZn14YNkOeXdnZTJcyZWMYCP5L+bjymc2ZVapvkz5iMvHBg/IrfMObi0p6wKlsboKFCtseaP/Aa 3yar+Cpf1UPJ9R0HrRa8hbX67O8cnO4wSiRyK4chGA0Xmy/QcnC6raL5X2bHrKMHqi+6RhvNM9N Eev+7tyNZD3fu+HzZgW8EGjcpIZ7LyqP16VtCbqtDiiXAYzJZRK1a7VP+7PvR9yyv5u7RQf2dx5 DAyROC5sVS7rh3tO9WdUtuGC2RTuVXwvJJX9OWI7ds4PYTE4eSUszbvi2bMEics3YA/9OLMe0Du nkkUk5Lvz47i+Fw== X-Developer-Key: i=david@ixit.cz; a=openpgp; fpr=D77A09CFEEDC2BBD53A7047460023FC4D3492072 X-Endpoint-Received: by B4 Relay for david@ixit.cz/default with auth_id=355 X-Original-From: David Heidelberg Reply-To: david@ixit.cz From: Kaustabh Chakraborty Some replacement displays include third-party touch ICs which are devoid of register descriptors. Create a fake data register descriptor for such ICs and provide hardcoded default values. It isn't possible to reliably determine if the touch IC is original or not, so these fallback values are offered as an alternative to the error path when register descriptors aren't available. Signed-off-by: Kaustabh Chakraborty [changes for readability / codeflow, checkpatch fixes] Signed-off-by: Casey Connolly Signed-off-by: David Heidelberg --- drivers/input/rmi4/rmi_f12.c | 117 +++++++++++++++++++++++++++++++++------= ---- 1 file changed, 91 insertions(+), 26 deletions(-) diff --git a/drivers/input/rmi4/rmi_f12.c b/drivers/input/rmi4/rmi_f12.c index 8246fe77114bb..1a103cc5f2235 100644 --- a/drivers/input/rmi4/rmi_f12.c +++ b/drivers/input/rmi4/rmi_f12.c @@ -218,6 +218,41 @@ static void rmi_f12_process_objects(struct f12_data *f= 12, u8 *data1, int size) rmi_2d_sensor_abs_report(sensor, &sensor->objs[i], i); } =20 +static void rmi_f12_set_hardcoded_desc(struct rmi_function *fn, struct f12= _data *f12) +{ + struct rmi_2d_sensor *sensor =3D &f12->sensor; + struct rmi_register_desc_item *reg_desc; + + /* We have no f12->data_reg_desc, so the pkt_size is 0, override it with + * a somewhat sensible default (this corresponds to 10 fingers). + */ + sensor->pkt_size =3D 88; + + /* + * There are no register descriptors to get these values from. + * We set them to high values to either be overwritten by the clip + * properties from devicetree, or to just not get in the way. + */ + sensor->max_x =3D 65535; + sensor->max_y =3D 65535; + + /* + * Create the Data1 register descriptor so that touch events + * can work properly. + */ + reg_desc =3D devm_kcalloc(&fn->dev, 1, + sizeof(struct rmi_register_desc_item), GFP_KERNEL); + reg_desc->reg =3D 1; + reg_desc->reg_size =3D 80; + reg_desc->num_subpackets =3D 10; + + f12->data1 =3D reg_desc; + f12->data1_offset =3D 0; + sensor->nbr_fingers =3D reg_desc->num_subpackets; + sensor->report_abs =3D 1; + sensor->attn_size +=3D reg_desc->reg_size; +} + static irqreturn_t rmi_f12_attention(int irq, void *ctx) { int retval; @@ -338,6 +373,40 @@ static int rmi_f12_config(struct rmi_function *fn) return 0; } =20 +static int rmi_f12_sensor_init(struct rmi_function *fn, struct f12_data *f= 12) +{ + struct rmi_2d_sensor *sensor =3D &f12->sensor; + + sensor->fn =3D fn; + f12->data_addr =3D fn->fd.data_base_addr; + + /* On quirky devices that don't have a data_reg_desc we hardcode the pack= et + * in rmi_f12_set_hardcoded_desc(). Make sure not to set it to 0 here. + */ + if (!sensor->pkt_size) + sensor->pkt_size =3D rmi_register_desc_calc_size(&f12->data_reg_desc); + + sensor->axis_align =3D + f12->sensor_pdata.axis_align; + + sensor->x_mm =3D f12->sensor_pdata.x_mm; + sensor->y_mm =3D f12->sensor_pdata.y_mm; + sensor->dribble =3D f12->sensor_pdata.dribble; + + if (sensor->sensor_type =3D=3D rmi_sensor_default) + sensor->sensor_type =3D + f12->sensor_pdata.sensor_type; + + rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: data packet size: %d\n", __func__, + sensor->pkt_size); + + sensor->data_pkt =3D devm_kzalloc(&fn->dev, sensor->pkt_size, GFP_KERNEL); + if (!sensor->data_pkt) + return -ENOMEM; + + return 0; +} + static int rmi_f12_probe(struct rmi_function *fn) { struct f12_data *f12; @@ -351,6 +420,7 @@ static int rmi_f12_probe(struct rmi_function *fn) struct rmi_driver_data *drvdata =3D dev_get_drvdata(&rmi_dev->dev); u16 data_offset =3D 0; int mask_size; + bool hardcoded_desc_quirk =3D false; =20 rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__); =20 @@ -365,9 +435,9 @@ static int rmi_f12_probe(struct rmi_function *fn) ++query_addr; =20 if (!(buf & BIT(0))) { - dev_err(&fn->dev, - "Behavior of F12 without register descriptors is undefined.\n"); - return -ENODEV; + rmi_dbg(RMI_DEBUG_FN, &fn->dev, + "No register descriptors defined for F12, using fallback\n"); + hardcoded_desc_quirk =3D true; } =20 f12 =3D devm_kzalloc(&fn->dev, sizeof(struct f12_data) + mask_size * 2, @@ -375,6 +445,8 @@ static int rmi_f12_probe(struct rmi_function *fn) if (!f12) return -ENOMEM; =20 + dev_set_drvdata(&fn->dev, f12); + f12->abs_mask =3D (unsigned long *)((char *)f12 + sizeof(struct f12_data)); f12->rel_mask =3D (unsigned long *)((char *)f12 @@ -393,6 +465,18 @@ static int rmi_f12_probe(struct rmi_function *fn) f12->sensor_pdata =3D pdata->sensor_pdata; } =20 + sensor =3D &f12->sensor; + + if (hardcoded_desc_quirk) { + rmi_f12_set_hardcoded_desc(fn, f12); + + ret =3D rmi_f12_sensor_init(fn, f12); + if (ret) + return ret; + + goto skip_register_desc; + } + ret =3D rmi_read_register_desc(rmi_dev, query_addr, &f12->query_reg_desc); if (ret) { @@ -423,29 +507,9 @@ static int rmi_f12_probe(struct rmi_function *fn) } query_addr +=3D 3; =20 - sensor =3D &f12->sensor; - sensor->fn =3D fn; - f12->data_addr =3D fn->fd.data_base_addr; - sensor->pkt_size =3D rmi_register_desc_calc_size(&f12->data_reg_desc); - - sensor->axis_align =3D - f12->sensor_pdata.axis_align; - - sensor->x_mm =3D f12->sensor_pdata.x_mm; - sensor->y_mm =3D f12->sensor_pdata.y_mm; - sensor->dribble =3D f12->sensor_pdata.dribble; - - if (sensor->sensor_type =3D=3D rmi_sensor_default) - sensor->sensor_type =3D - f12->sensor_pdata.sensor_type; - - rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: data packet size: %d\n", __func__, - sensor->pkt_size); - sensor->data_pkt =3D devm_kzalloc(&fn->dev, sensor->pkt_size, GFP_KERNEL); - if (!sensor->data_pkt) - return -ENOMEM; - - dev_set_drvdata(&fn->dev, f12); + ret =3D rmi_f12_sensor_init(fn, f12); + if (ret) + return ret; =20 ret =3D rmi_f12_read_sensor_tuning(f12); if (ret) @@ -543,6 +607,7 @@ static int rmi_f12_probe(struct rmi_function *fn) data_offset +=3D item->reg_size; } =20 +skip_register_desc: /* allocate the in-kernel tracking buffers */ sensor->tracking_pos =3D devm_kcalloc(&fn->dev, sensor->nbr_fingers, sizeof(struct input_mt_pos), --=20 2.53.0