* [PATCH v1 16/63] Input: atmel_mxt_ts - handle cfg filename via pdata/sysfs
2019-08-16 8:32 [PATCH v1 15/63] Input: atmel_mxt_ts - allow specification of firmware file name Jiada Wang
@ 2019-08-16 8:32 ` Jiada Wang
2019-08-16 8:32 ` [PATCH v1 17/63] Input: atmel_mxt_ts - allow input name to be specified in platform data Jiada Wang
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Jiada Wang @ 2019-08-16 8:32 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
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.
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
.../bindings/input/atmel,maxtouch.txt | 3 +
drivers/input/touchscreen/atmel_mxt_ts.c | 101 +++++++++++++++---
2 files changed, 92 insertions(+), 12 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 ca317d267be1..a5ac2cc93f3f 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 {
@@ -2574,13 +2578,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;
@@ -3077,19 +3089,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");
}
@@ -3097,6 +3111,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 */
@@ -3388,6 +3406,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[] = {
@@ -3402,11 +3469,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
};
@@ -3507,7 +3576,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) {
@@ -3574,6 +3643,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_read_u32_array(dev, keymap_property,
NULL, 0);
@@ -3673,6 +3744,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.19.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v1 17/63] Input: atmel_mxt_ts - allow input name to be specified in platform data
2019-08-16 8:32 [PATCH v1 15/63] Input: atmel_mxt_ts - allow specification of firmware file name Jiada Wang
2019-08-16 8:32 ` [PATCH v1 16/63] Input: atmel_mxt_ts - handle cfg filename via pdata/sysfs Jiada Wang
@ 2019-08-16 8:32 ` Jiada Wang
2019-08-16 8:32 ` [PATCH v1 18/63] Input: atmel_mxt_ts - add config checksum attribute to sysfs Jiada Wang
2019-08-16 8:32 ` [PATCH v1 19/63] Input: atmel_mxt_ts - check data->input_dev is not null in mxt_input_sync() Jiada Wang
3 siblings, 0 replies; 5+ messages in thread
From: Jiada Wang @ 2019-08-16 8:32 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: Nick Dyer <nick.dyer@itdev.co.uk>
Android systems identify the input device and map to IDC file by using the
input device name. To avoid unnecessary deltas to the driver file, allow
this to be set from the platform data.
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit cbf94a7bda754d2e1899d9f50313a0bccc91422d)
[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>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
.../devicetree/bindings/input/atmel,maxtouch.txt | 2 ++
drivers/input/touchscreen/atmel_mxt_ts.c | 9 ++++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
index 713ce870805c..d7db16920083 100644
--- a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
+++ b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
@@ -40,6 +40,8 @@ Optional properties for main touchpad device:
- 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.
+- atmel,input_name: Override name of input device from the default.
+
Example:
touch@4b {
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index a5ac2cc93f3f..4f335c3da994 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -336,6 +336,7 @@ struct mxt_data {
char *fw_name;
char *cfg_name;
const char *pcfg_name;
+ const char *input_name;
/* Cached parameters from object table */
u16 T5_address;
@@ -2407,7 +2408,11 @@ static int mxt_initialize_input_device(struct mxt_data *data)
if (!input_dev)
return -ENOMEM;
- input_dev->name = "Atmel maXTouch Touchscreen";
+ if (data->input_name)
+ input_dev->name = data->input_name;
+ else
+ input_dev->name = "Atmel maXTouch Touchscreen";
+
input_dev->phys = data->phys;
input_dev->id.bustype = BUS_I2C;
input_dev->dev.parent = dev;
@@ -3645,6 +3650,8 @@ static int mxt_parse_device_properties(struct mxt_data *data)
device_property_read_string(dev, "atmel,cfg_name", &data->pcfg_name);
+ device_property_read_string(dev, "atmel,input_name", &data->input_name);
+
if (device_property_present(dev, keymap_property)) {
n_keys = device_property_read_u32_array(dev, keymap_property,
NULL, 0);
--
2.19.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH v1 18/63] Input: atmel_mxt_ts - add config checksum attribute to sysfs
2019-08-16 8:32 [PATCH v1 15/63] Input: atmel_mxt_ts - allow specification of firmware file name Jiada Wang
2019-08-16 8:32 ` [PATCH v1 16/63] Input: atmel_mxt_ts - handle cfg filename via pdata/sysfs Jiada Wang
2019-08-16 8:32 ` [PATCH v1 17/63] Input: atmel_mxt_ts - allow input name to be specified in platform data Jiada Wang
@ 2019-08-16 8:32 ` Jiada Wang
2019-08-16 8:32 ` [PATCH v1 19/63] Input: atmel_mxt_ts - check data->input_dev is not null in mxt_input_sync() Jiada Wang
3 siblings, 0 replies; 5+ messages in thread
From: Jiada Wang @ 2019-08-16 8:32 UTC (permalink / raw)
To: nick, dmitry.torokhov; +Cc: linux-input, linux-kernel, jiada_wang, george_davis
From: karl tsou <karl.funlab@gmail.com>
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
(cherry picked from ndyer/linux/for-upstream commit 03477477ddbe5dcad42853ab3f84166a8f807acf)
[gdavis: Forward port and fix conflicts.]
Signed-off-by: George G. Davis <george_davis@mentor.com>
Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 4f335c3da994..a4f8364ecca9 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -3122,6 +3122,15 @@ static int mxt_configure_objects(struct mxt_data *data,
return error;
}
+/* Configuration crc check sum is returned as hex xxxxxx */
+static ssize_t mxt_config_crc_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct mxt_data *data = dev_get_drvdata(dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%06x\n", data->config_crc);
+}
+
/* Firmware Version is returned as Major.Minor.Build */
static ssize_t mxt_fw_version_show(struct device *dev,
struct device_attribute *attr, char *buf)
@@ -3475,12 +3484,14 @@ 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 DEVICE_ATTR(config_crc, S_IRUGO, mxt_config_crc_show, NULL);
static struct attribute *mxt_attrs[] = {
&dev_attr_fw_version.attr,
&dev_attr_hw_version.attr,
&dev_attr_object.attr,
&dev_attr_update_cfg.attr,
+ &dev_attr_config_crc.attr,
NULL
};
--
2.19.2
^ permalink raw reply related [flat|nested] 5+ messages in thread