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),