All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiada Wang <jiada_wang@mentor.com>
To: <jikos@kernel.org>, <benjamin.tissoires@redhat.com>,
	<rydberg@bitmath.org>, <dmitry.torokhov@gmail.com>,
	<nick@shmanahar.org>
Cc: <linux-input@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<jiada_wang@mentor.com>, <erosca@de.adit-jv.com>,
	<Andrew_Gabbasov@mentor.com>
Subject: [PATCH v5 16/48] Input: atmel_mxt_ts - handle cfg filename via pdata/sysfs
Date: Wed, 6 Nov 2019 16:01:14 +0900	[thread overview]
Message-ID: <20191106070146.18759-17-jiada_wang@mentor.com> (raw)
In-Reply-To: <20191106070146.18759-1-jiada_wang@mentor.com>

From: Nick Dyer <nick.dyer@itdev.co.uk>

There may be multiple maXTouch chips on a single device which will require
different configuration files. Add a platform data value for the
configuration filename.

Add sysfs entry to write configuration file if the platform data is not
set.

Split out the object initialisation code from mxt_initialize() into
mxt_configure_objects() to allow this.

Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Acked-by: Yufeng Shen <miletus@chromium.org>
(cherry picked from ndyer/linux/for-upstream commit 71a2a4d1954460b949a16b607f72bafab294ca79)
[gdavis: Resolve forward port conflicts due to applying upstream
	 commit 96a938aa214e ("Input: atmel_mxt_ts - remove platform
	 data support").]
Signed-off-by: George G. Davis <george_davis@mentor.com>
[gdavis: Squash fix from Vladimir Zapolskiy:
	 - Input: atmel_mxt_ts - fix error paths in mxt_configure_objects()]
Signed-off-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
---
Notes:
- Squash fix from Vladimir Zapolskiy:
  + Input: atmel_mxt_ts - fix error paths in mxt_configure_objects()

    Fail in mxt_update_cfg() is critical, because the driver state machine
    is broken and it can not be safely used afterwards.

[jiada: Squash fix from ndyer/linux/for-upstream commit c909ada856861f305653b127db3ea0fa60264331
	- Input: atmel_mxt_ts - check data->input_dev is not null in mxt_input_sync()]
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
 .../bindings/input/atmel,maxtouch.txt         |   3 +
 drivers/input/touchscreen/atmel_mxt_ts.c      | 109 +++++++++++++++---
 2 files changed, 97 insertions(+), 15 deletions(-)

diff --git a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
index e28139ce3cae..713ce870805c 100644
--- a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
+++ b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
@@ -37,6 +37,9 @@ Optional properties for main touchpad device:
     MXT_SUSPEND_REGULATOR - use regulators to power down device during suspend
     Definitions are in <dt-bindings/input/atmel_mxt_ts.h>.
 
+- atmel,cfg_name: Provide name of configuration file in OBP_RAW format. This
+    will be downloaded from the firmware loader on probe to the device.
+
 Example:
 
 	touch@4b {
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index a0e367bc6e83..362b7630ec6e 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -34,7 +34,6 @@
 #include <dt-bindings/input/atmel_mxt_ts.h>
 
 /* Configuration file */
-#define MXT_CFG_NAME		"maxtouch.cfg"
 #define MXT_CFG_MAGIC		"OBP_RAW V1"
 
 /* Registers */
@@ -335,6 +334,8 @@ struct mxt_data {
 	struct regulator *reg_vdd;
 	struct regulator *reg_avdd;
 	char *fw_name;
+	char *cfg_name;
+	const char *pcfg_name;
 
 	/* Cached parameters from object table */
 	u16 T5_address;
@@ -377,6 +378,9 @@ struct mxt_data {
 
 	/* Indicates whether device is in suspend */
 	bool suspended;
+
+	/* Indicates whether device is updating configuration */
+	bool updating_config;
 };
 
 struct mxt_vb2_buffer {
@@ -833,9 +837,11 @@ static void mxt_input_button(struct mxt_data *data, u8 *message)
 
 static void mxt_input_sync(struct mxt_data *data)
 {
-	input_mt_report_pointer_emulation(data->input_dev,
-					  data->t19_num_keys);
-	input_sync(data->input_dev);
+	if (data->input_dev) {
+		input_mt_report_pointer_emulation(data->input_dev,
+						  data->t19_num_keys);
+		input_sync(data->input_dev);
+	}
 }
 
 static void mxt_proc_t9_message(struct mxt_data *data, u8 *message)
@@ -2578,13 +2584,21 @@ static int mxt_initialize(struct mxt_data *data)
 	if (error)
 		return error;
 
-	error = request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME,
-					&client->dev, GFP_KERNEL, data,
-					mxt_config_cb);
-	if (error) {
-		dev_err(&client->dev, "Failed to invoke firmware loader: %d\n",
-			error);
-		goto err_free_sysfs;
+	if (data->cfg_name) {
+		error = request_firmware_nowait(THIS_MODULE, true,
+						data->cfg_name,
+						&client->dev,
+						GFP_KERNEL, data,
+						mxt_config_cb);
+		if (error) {
+			dev_err(&client->dev, "Failed to invoke firmware loader: %d\n",
+				error);
+			goto err_free_sysfs;
+		}
+	} else {
+		error = mxt_configure_objects(data, NULL);
+		if (error)
+			goto err_free_sysfs;
 	}
 
 	return 0;
@@ -3081,19 +3095,21 @@ static int mxt_configure_objects(struct mxt_data *data,
 	error = mxt_init_t7_power_cfg(data);
 	if (error) {
 		dev_err(dev, "Failed to initialize power cfg\n");
-		return error;
+		goto err_free_object_table;
 	}
 
 	if (cfg) {
 		error = mxt_update_cfg(data, cfg);
-		if (error)
+		if (error) {
 			dev_warn(dev, "Error %d updating config\n", error);
+			goto err_free_object_table;
+		}
 	}
 
 	if (data->multitouch) {
 		error = mxt_initialize_input_device(data);
 		if (error)
-			return error;
+			goto err_free_object_table;
 	} else {
 		dev_warn(dev, "No touch object detected\n");
 	}
@@ -3101,6 +3117,10 @@ static int mxt_configure_objects(struct mxt_data *data,
 	mxt_debug_init(data);
 
 	return 0;
+
+err_free_object_table:
+	mxt_free_object_table(data);
+	return error;
 }
 
 /* Firmware Version is returned as Major.Minor.Build */
@@ -3392,6 +3412,55 @@ static ssize_t mxt_update_fw_store(struct device *dev,
 	return count;
 }
 
+static ssize_t mxt_update_cfg_store(struct device *dev,
+		struct device_attribute *attr,
+		const char *buf, size_t count)
+{
+	struct mxt_data *data = dev_get_drvdata(dev);
+	const struct firmware *cfg;
+	int ret;
+
+	ret = mxt_update_file_name(dev, &data->cfg_name, buf, count);
+	if (ret)
+		return ret;
+
+	ret = request_firmware(&cfg, data->cfg_name, dev);
+	if (ret < 0) {
+		dev_err(dev, "Failure to request config file %s\n",
+			data->cfg_name);
+		ret = -ENOENT;
+		goto out;
+	}
+
+	data->updating_config = true;
+
+	mxt_free_input_device(data);
+
+	if (data->suspended) {
+		if (data->suspend_mode == MXT_SUSPEND_REGULATOR) {
+			enable_irq(data->irq);
+			mxt_regulator_enable(data);
+		} else if (data->suspend_mode == MXT_SUSPEND_DEEP_SLEEP) {
+			mxt_set_t7_power_cfg(data, MXT_POWER_CFG_RUN);
+			mxt_acquire_irq(data);
+		}
+
+		data->suspended = false;
+	}
+
+	ret = mxt_configure_objects(data, cfg);
+	if (ret)
+		goto release;
+
+	ret = count;
+
+release:
+	release_firmware(cfg);
+out:
+	data->updating_config = false;
+	return ret;
+}
+
 static DEVICE_ATTR(update_fw, S_IWUSR, NULL, mxt_update_fw_store);
 
 static struct attribute *mxt_fw_attrs[] = {
@@ -3406,11 +3475,13 @@ static const struct attribute_group mxt_fw_attr_group = {
 static DEVICE_ATTR(fw_version, S_IRUGO, mxt_fw_version_show, NULL);
 static DEVICE_ATTR(hw_version, S_IRUGO, mxt_hw_version_show, NULL);
 static DEVICE_ATTR(object, S_IRUGO, mxt_object_show, NULL);
+static DEVICE_ATTR(update_cfg, S_IWUSR, NULL, mxt_update_cfg_store);
 
 static struct attribute *mxt_attrs[] = {
 	&dev_attr_fw_version.attr,
 	&dev_attr_hw_version.attr,
 	&dev_attr_object.attr,
+	&dev_attr_update_cfg.attr,
 	NULL
 };
 
@@ -3511,7 +3582,7 @@ static int mxt_stop(struct mxt_data *data)
 {
 	int ret;
 
-	if (data->suspended || data->in_bootloader)
+	if (data->suspended || data->in_bootloader || data->updating_config)
 		return 0;
 
 	switch (data->suspend_mode) {
@@ -3580,6 +3651,8 @@ static int mxt_parse_device_properties(struct mxt_data *data)
 	int n_keys;
 	int error;
 
+	device_property_read_string(dev, "atmel,cfg_name", &data->pcfg_name);
+
 	if (device_property_present(dev, keymap_property)) {
 		n_keys = device_property_count_u32(dev, keymap_property);
 		if (n_keys <= 0) {
@@ -3704,6 +3777,12 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
 	if (error)
 		return error;
 
+	if (data->pcfg_name)
+		mxt_update_file_name(&data->client->dev,
+				     &data->cfg_name,
+				     data->pcfg_name,
+				     strlen(data->pcfg_name));
+
 	data->reset_gpio = devm_gpiod_get_optional(&client->dev,
 						   "reset", GPIOD_OUT_LOW);
 	if (IS_ERR(data->reset_gpio)) {
-- 
2.17.1


  parent reply	other threads:[~2019-11-06  7:03 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-06  7:00 [PATCH v5 00/48] atmel_mxt_ts misc Jiada Wang
2019-11-06  7:00 ` [PATCH v5 01/48] Input: introduce input_mt_report_slot_inactive Jiada Wang
2019-11-06 21:11   ` Henrik Rydberg
2019-11-14  9:44   ` [Input] 9290ec3cea: suspend_stress.fail kernel test robot
2019-11-14  9:44     ` kernel test robot
2019-11-15 19:29     ` Dmitry Torokhov
2019-11-15 19:29       ` Dmitry Torokhov
2019-11-18  8:01       ` kernel test robot
2019-11-06  7:01 ` [PATCH v5 02/48] Input: atmel_mxt_ts - rework sysfs init/remove Jiada Wang
2019-11-06  7:01 ` [PATCH v5 03/48] Input: atmel_mxt_ts - only read messages in mxt_acquire_irq() when necessary Jiada Wang
2019-11-06  7:01 ` [PATCH v5 04/48] Input: atmel_mxt_ts - split large i2c transfers into blocks Jiada Wang
2019-11-06  7:01 ` [PATCH v5 05/48] Input: atmel_mxt_ts - output status from T48 Noise Supression Jiada Wang
2019-11-06  7:01 ` [PATCH v5 06/48] Input: atmel_mxt_ts - output status from T42 Touch Suppression Jiada Wang
2019-11-06  7:01 ` [PATCH v5 07/48] Input: atmel_mxt_ts - implement T9 vector/orientation support Jiada Wang
2019-11-06  7:01 ` [PATCH v5 08/48] Input: atmel_mxt_ts - implement T15 Key Array support Jiada Wang
2019-11-06  7:01 ` [PATCH v5 09/48] Input: atmel_mxt_ts - handle reports from T47 Stylus object Jiada Wang
2019-11-06  7:01 ` [PATCH v5 10/48] Input: atmel_mxt_ts - implement support for T107 active stylus Jiada Wang
2019-11-06  7:01 ` [PATCH v5 11/48] Input: atmel_mxt_ts - add debug for T92 gesture and T93 touch seq msgs Jiada Wang
2019-11-06  7:01 ` [PATCH v5 12/48] Input: atmel_mxt_ts - release touch state during suspend Jiada Wang
2019-11-06  7:01 ` [PATCH v5 13/48] Input: atmel_mxt_ts - add regulator control support Jiada Wang
2019-11-06  7:01 ` [PATCH v5 14/48] Input: atmel_mxt_ts - report failures in suspend/resume Jiada Wang
2019-11-06  7:01 ` [PATCH v5 15/48] Input: atmel_mxt_ts - allow specification of firmware file name Jiada Wang
2019-11-06  7:01 ` Jiada Wang [this message]
2019-11-06  7:01 ` [PATCH v5 17/48] Input: atmel_mxt_ts - allow input name to be specified in platform data Jiada Wang
2019-11-06  7:01 ` [PATCH v5 18/48] Input: atmel_mxt_ts - add config checksum attribute to sysfs Jiada Wang
2019-11-06  7:01 ` [PATCH v5 19/48] Input: atmel_mxt_ts - refactor firmware flash to extract context into struct Jiada Wang
2019-11-06  7:01 ` [PATCH v5 20/48] Input: atmel_mxt_ts - refactor code to enter bootloader into separate func Jiada Wang
2019-11-06  7:01 ` [PATCH v5 21/48] Input: atmel_mxt_ts - combine bootloader version query with probe Jiada Wang
2019-11-06  7:01 ` [PATCH v5 22/48] Input: atmel_mxt_ts - improve bootloader state machine handling Jiada Wang
2019-11-06  7:01 ` [PATCH v5 23/48] Input: atmel_mxt_ts - rename bl_completion to chg_completion Jiada Wang
2019-11-06  7:01 ` [PATCH v5 24/48] Input: atmel_mxt_ts - make bootloader interrupt driven Jiada Wang
2019-11-06  7:01 ` [PATCH v5 25/48] Input: atmel_mxt_ts - delay enabling IRQ when not using regulators Jiada Wang
2019-11-06  7:01 ` [PATCH v5 26/48] Input: atmel_mxt_ts - implement I2C retries Jiada Wang
2019-11-06  7:01 ` [PATCH v5 27/48] Input: atmel_mxt_ts - orientation is not present in hover Jiada Wang
2019-11-06  7:01 ` [PATCH v5 28/48] Input: atmel_mxt_ts - implement debug output for messages Jiada Wang
2019-11-06  7:01 ` [PATCH v5 29/48] Input: atmel_mxt_ts - implement improved debug message interface Jiada Wang
2019-11-06  7:01 ` [PATCH v5 30/48] Input: atmel_mxt_ts - eliminate data->raw_info_block Jiada Wang
2019-11-06  7:01 ` [PATCH v5 31/48] Input: atmel_mxt_ts - Change call-points of mxt_free_* functions Jiada Wang
2019-11-06  7:01 ` [PATCH v5 32/48] Input: atmel_mxt_ts - rely on calculated_crc rather than file config_crc Jiada Wang
2019-11-06  7:01 ` [PATCH v5 33/48] input: atmel_mxt_ts: export GPIO reset line via sysfs Jiada Wang
2019-11-06  7:01 ` [PATCH v5 34/48] input: atmel_mxt_ts: Add Missing Delay for reset handling of Atmel touch panel controller in detachable displays Jiada Wang
2019-11-06  7:01 ` [PATCH v5 35/48] Input: atmel_mxt_ts: Add support for run self-test routine Jiada Wang
2019-11-06  7:01 ` [PATCH v5 36/48] Input: atmel_mxt_ts: Limit the max bytes transferred in an i2c transaction Jiada Wang
2019-11-06  7:01 ` [PATCH v5 37/48] Input: atmel_mxt_ts: return error from mxt_process_messages_until_invalid() Jiada Wang
2019-11-06  7:01 ` [PATCH v5 38/48] Input: Atmel: improve error handling in mxt_start() Jiada Wang
2019-11-06  7:01 ` [PATCH v5 39/48] Input: Atmel: improve error handling in mxt_initialize() Jiada Wang
2019-11-06  7:01 ` [PATCH v5 40/48] Input: Atmel: improve error handling in mxt_update_cfg() Jiada Wang
2019-11-06  7:01 ` [PATCH v5 41/48] Input: Atmel: Improve error handling in mxt_initialize_input_device() Jiada Wang
2019-11-06  7:01 ` [PATCH v5 42/48] Input: Atmel: handle ReportID "0x00" while processing T5 messages Jiada Wang
2019-11-06  7:01 ` [PATCH v5 43/48] Input: Atmel: use T44 object to process " Jiada Wang
2019-11-06  7:01 ` [PATCH v5 44/48] Input: atmel_mxt_ts: use gpiod_set_value_cansleep for reset pin Jiada Wang
2019-11-06  7:01 ` [PATCH v5 45/48] input: touchscreen: atmel_mxt_ts: Added sysfs entry for touchscreen status Jiada Wang
2019-11-06  7:01 ` [PATCH v5 46/48] input: atmel_mxt_ts: added sysfs interface to update atmel T38 data Jiada Wang
2019-11-06  7:01 ` [PATCH v5 47/48] Input: atmel_mxt_ts: Implement synchronization during various operation Jiada Wang
2019-11-06  7:01 ` [PATCH v5 48/48] Input: atmel_mxt_ts - Fix compilation warning Jiada Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191106070146.18759-17-jiada_wang@mentor.com \
    --to=jiada_wang@mentor.com \
    --cc=Andrew_Gabbasov@mentor.com \
    --cc=benjamin.tissoires@redhat.com \
    --cc=dmitry.torokhov@gmail.com \
    --cc=erosca@de.adit-jv.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nick@shmanahar.org \
    --cc=rydberg@bitmath.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.