From patchwork Mon May 27 03:26:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Selvaraj via B4 Relay X-Patchwork-Id: 13674555 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 AAA3B6FCB; Mon, 27 May 2024 03:26:35 +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=1716780395; cv=none; b=LPteHRgqCjpwXyBidxdOw5m95p+k5t0HkpH55bNS+iFmh2Y+V9lOdP41U++bBlzFkXRGuUGQciRCoJ2PCRfUtWUOAaEn94w10x2WNFW4If2gA0ScWcDRN7sjlBKRFsoWLvITXtWZdOfOr2a0hDvLLNy+xI7C8kfj2CmCn4WMJsI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1716780395; c=relaxed/simple; bh=sRnU5qC2PxVrGwCNhW2CRwScmAF/9srHVz76HkT1GDY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ba3DXN6A6DzQODg1Ss1kMrNjStnelRtPnFKiYSWO+rHCHXDdZyfqVIwrG4jASu1YslFWsbXFTDrw6JjJDz/jK1M0h7I+FKH+q/GnI0t+7gQoL0YT+nPpH4z5td6sbtcKxIRaYhCjppnR7tjinOptC8K7voilrMS6qgSu43HVap0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UroemmQb; 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="UroemmQb" Received: by smtp.kernel.org (Postfix) with ESMTPS id 498CAC4AF08; Mon, 27 May 2024 03:26:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1716780395; bh=sRnU5qC2PxVrGwCNhW2CRwScmAF/9srHVz76HkT1GDY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=UroemmQb1iS8M22O9HDplMfp2oH2nX7Ms//Park4TtfLTG0CrESsk617sABLDbNOC 0vZRF7c2I5yn/crhT7WktLhW2ZYg08r5emUf++20sSSP1k9VQTOAHgX6rJZc8li754 I7tXzNqfXYpObcaukBZNqpCS75ajwBmDPOJPUDqosQAyh9S+VJBVxEwI1X09aR/us3 NqBsvb4ZLJSW3GHuhHM8rZSLTDqloJsqTJtoLmrA2200l0TEJ15UbyTcnRoVYL46Rh b6vs2RtthHO5z9pcW4ZxANh3ZyxHXi+6KkDXEJ5VAksC/K6/Qf+1SrntLAo5BfCBp7 qLI7MWXn3vj5Q== 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 3B0EEC25B74; Mon, 27 May 2024 03:26:35 +0000 (UTC) From: Joel Selvaraj via B4 Relay Date: Sun, 26 May 2024 22:26:26 -0500 Subject: [PATCH v3 3/3] Input: novatek-nvt-ts: add support for NT36672A touchscreen Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240526-nvt-ts-devicetree-regulator-support-v3-3-aa88d10ccd9a@gmail.com> References: <20240526-nvt-ts-devicetree-regulator-support-v3-0-aa88d10ccd9a@gmail.com> In-Reply-To: <20240526-nvt-ts-devicetree-regulator-support-v3-0-aa88d10ccd9a@gmail.com> To: Hans de Goede , Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, platform-driver-x86@vger.kernel.org, Joel Selvaraj X-Mailer: b4 0.14-dev X-Developer-Signature: v=1; a=ed25519-sha256; t=1716780394; l=5304; i=joelselvaraj.oss@gmail.com; s=20240420; h=from:subject:message-id; bh=MB6mu8tW7G0nPCXhHpubqPGJ+o4YFgHR52Qhx/rofXY=; b=SdHqukimWtDJ9sPHoMQR0BVDdUPCUQol75wSA8aMy9UBE7zjfzP9wP/J0Y1CwdPukDdm+GIQe B49CcwhH0vUCbLKsbMew7ntMe02WY+vFGD0kJnRg/cHGWBtNDHY7aAd X-Developer-Key: i=joelselvaraj.oss@gmail.com; a=ed25519; pk=qT4gsuVtlPE0Dpr+tQA/Fumm7wzVP6qfeVaY+6pX04s= X-Endpoint-Received: by B4 Relay for joelselvaraj.oss@gmail.com/20240420 with auth_id=165 X-Original-From: Joel Selvaraj Reply-To: joelselvaraj.oss@gmail.com From: Joel Selvaraj Extend the novatek touchscreen driver to support NT36672A chip which is found in phones like qcom/sdm845-xiaomi-beryllium-tianma.dts. Added devicetree support for the driver and used i2c chip data to handle the variation in chip id and wake type. Also added vcc and iovcc regulators which are used to power the touchscreen hardware. Signed-off-by: Joel Selvaraj --- drivers/input/touchscreen/novatek-nvt-ts.c | 78 +++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/drivers/input/touchscreen/novatek-nvt-ts.c b/drivers/input/touchscreen/novatek-nvt-ts.c index 224fd112b25a9..7a82a1b09f9d5 100644 --- a/drivers/input/touchscreen/novatek-nvt-ts.c +++ b/drivers/input/touchscreen/novatek-nvt-ts.c @@ -31,9 +31,6 @@ #define NVT_TS_PARAMS_CHIP_ID 0x0e #define NVT_TS_PARAMS_SIZE 0x0f -#define NVT_TS_SUPPORTED_WAKE_TYPE 0x05 -#define NVT_TS_SUPPORTED_CHIP_ID 0x05 - #define NVT_TS_MAX_TOUCHES 10 #define NVT_TS_MAX_SIZE 4096 @@ -51,11 +48,18 @@ static const int nvt_ts_irq_type[4] = { IRQF_TRIGGER_HIGH }; +struct nvt_ts_i2c_chip_data { + u8 wake_type; + u8 chip_id; +}; + struct nvt_ts_data { struct i2c_client *client; struct input_dev *input; struct gpio_desc *reset_gpio; + struct regulator_bulk_data regulators[2]; struct touchscreen_properties prop; + const struct nvt_ts_i2c_chip_data *chip; int max_touches; u8 buf[NVT_TS_TOUCH_SIZE * NVT_TS_MAX_TOUCHES]; }; @@ -139,9 +143,23 @@ static irqreturn_t nvt_ts_irq(int irq, void *dev_id) return IRQ_HANDLED; } +static void nvt_ts_disable_regulators(void *_data) +{ + struct nvt_ts_data *data = _data; + + regulator_bulk_disable(ARRAY_SIZE(data->regulators), data->regulators); +} + static int nvt_ts_start(struct input_dev *dev) { struct nvt_ts_data *data = input_get_drvdata(dev); + int error; + + error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), data->regulators); + if (error) { + dev_err(&data->client->dev, "failed to enable regulators\n"); + return error; + } enable_irq(data->client->irq); gpiod_set_value_cansleep(data->reset_gpio, 0); @@ -155,6 +173,7 @@ static void nvt_ts_stop(struct input_dev *dev) disable_irq(data->client->irq); gpiod_set_value_cansleep(data->reset_gpio, 1); + nvt_ts_disable_regulators(data); } static int nvt_ts_suspend(struct device *dev) @@ -199,9 +218,37 @@ static int nvt_ts_probe(struct i2c_client *client) if (!data) return -ENOMEM; + data->chip = device_get_match_data(&client->dev); + if (!data->chip) + return -EINVAL; + data->client = client; i2c_set_clientdata(client, data); + /* + * VCC is the analog voltage supply + * IOVCC is the digital voltage supply + */ + data->regulators[0].supply = "vcc"; + data->regulators[1].supply = "iovcc"; + error = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->regulators), data->regulators); + if (error) { + dev_err(dev, "cannot get regulators: %d\n", error); + return error; + } + + error = regulator_bulk_enable(ARRAY_SIZE(data->regulators), data->regulators); + if (error) { + dev_err(dev, "failed to enable regulators\n"); + return error; + } + + error = devm_add_action_or_reset(dev, nvt_ts_disable_regulators, data); + if (error) { + dev_err(dev, "failed to install regulator disable handler\n"); + return error; + } + data->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); error = PTR_ERR_OR_ZERO(data->reset_gpio); if (error) { @@ -225,8 +272,8 @@ static int nvt_ts_probe(struct i2c_client *client) if (width > NVT_TS_MAX_SIZE || height >= NVT_TS_MAX_SIZE || data->max_touches > NVT_TS_MAX_TOUCHES || irq_type >= ARRAY_SIZE(nvt_ts_irq_type) || - data->buf[NVT_TS_PARAMS_WAKE_TYPE] != NVT_TS_SUPPORTED_WAKE_TYPE || - data->buf[NVT_TS_PARAMS_CHIP_ID] != NVT_TS_SUPPORTED_CHIP_ID) { + data->buf[NVT_TS_PARAMS_WAKE_TYPE] != data->chip->wake_type || + data->buf[NVT_TS_PARAMS_CHIP_ID] != data->chip->chip_id) { dev_err(dev, "Unsupported touchscreen parameters: %*ph\n", NVT_TS_PARAMS_SIZE, data->buf); return -EIO; @@ -277,8 +324,26 @@ static int nvt_ts_probe(struct i2c_client *client) return 0; } +static const struct nvt_ts_i2c_chip_data nvt_nt11205_ts_data = { + .wake_type = 0x05, + .chip_id = 0x05, +}; + +static const struct nvt_ts_i2c_chip_data nvt_nt36672a_ts_data = { + .wake_type = 0x01, + .chip_id = 0x08, +}; + +static const struct of_device_id nvt_ts_of_match[] = { + { .compatible = "novatek,nt11205-ts", .data = &nvt_nt11205_ts_data }, + { .compatible = "novatek,nt36672a-ts", .data = &nvt_nt36672a_ts_data }, + { } +}; +MODULE_DEVICE_TABLE(of, nvt_ts_of_match); + static const struct i2c_device_id nvt_ts_i2c_id[] = { - { "NT11205-ts" }, + { "NT11205-ts", (unsigned long) &nvt_nt11205_ts_data }, + { "NT36672A-ts", (unsigned long) &nvt_nt36672a_ts_data }, { } }; MODULE_DEVICE_TABLE(i2c, nvt_ts_i2c_id); @@ -287,6 +352,7 @@ static struct i2c_driver nvt_ts_driver = { .driver = { .name = "novatek-nvt-ts", .pm = pm_sleep_ptr(&nvt_ts_pm_ops), + .of_match_table = nvt_ts_of_match, }, .probe = nvt_ts_probe, .id_table = nvt_ts_i2c_id,