summaryrefslogtreecommitdiff
path: root/drivers/input/rmi4/rmi_f34.c
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2016-11-30 16:59:30 -0800
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2016-11-30 17:42:17 -0800
commite155d4ee0b878c857f91deb14d6d7dba55c38648 (patch)
tree14d507133b6ebd7bed9bae3a87c144a1cc590f8e /drivers/input/rmi4/rmi_f34.c
parenta64ea311f1e4bc090c89960650637423e86c35c0 (diff)
Input: synaptics-rmi4 - remove mutex calls while updating the firmware
This partially reverts commit 29fd0ec2bdbe ("Input: synaptics-rmi4 - add support for F34 device reflash") irq_mutex should be used only to protect data->current_irq_mask, not preventing incoming input to be processed while the upgrade of the firmware is happening. We can simply disable the irqs when we don't want them to interfere with the upgrade process. Tested on S7300 and S7800 (with F34 v7 patch added) Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Nick Dyer <nick@shmanahar.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/rmi4/rmi_f34.c')
-rw-r--r--drivers/input/rmi4/rmi_f34.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/input/rmi4/rmi_f34.c b/drivers/input/rmi4/rmi_f34.c
index 03df85ac91a5..01936a4a9a6c 100644
--- a/drivers/input/rmi4/rmi_f34.c
+++ b/drivers/input/rmi4/rmi_f34.c
@@ -282,7 +282,8 @@ out:
static int rmi_firmware_update(struct rmi_driver_data *data,
const struct firmware *fw)
{
- struct device *dev = &data->rmi_dev->dev;
+ struct rmi_device *rmi_dev = data->rmi_dev;
+ struct device *dev = &rmi_dev->dev;
struct f34_data *f34;
int ret;
@@ -305,8 +306,10 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
if (ret)
return ret;
+ rmi_disable_irq(rmi_dev, false);
+
/* Tear down functions and re-probe */
- rmi_free_function_list(data->rmi_dev);
+ rmi_free_function_list(rmi_dev);
ret = rmi_probe_interrupts(data);
if (ret)
@@ -322,6 +325,8 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
return -EINVAL;
}
+ rmi_enable_irq(rmi_dev, false);
+
f34 = dev_get_drvdata(&data->f34_container->dev);
/* Perform firmware update */
@@ -329,11 +334,13 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
dev_info(&f34->fn->dev, "Firmware update complete, status:%d\n", ret);
+ rmi_disable_irq(rmi_dev, false);
+
/* Re-probe */
rmi_dbg(RMI_DEBUG_FN, dev, "Re-probing device\n");
- rmi_free_function_list(data->rmi_dev);
+ rmi_free_function_list(rmi_dev);
- ret = rmi_scan_pdt(data->rmi_dev, NULL, rmi_initial_reset);
+ ret = rmi_scan_pdt(rmi_dev, NULL, rmi_initial_reset);
if (ret < 0)
dev_warn(dev, "RMI reset failed!\n");
@@ -345,9 +352,11 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
if (ret)
return ret;
+ rmi_enable_irq(rmi_dev, false);
+
if (data->f01_container->dev.driver)
/* Driver already bound, so enable ATTN now. */
- return rmi_enable_sensor(data->rmi_dev);
+ return rmi_enable_sensor(rmi_dev);
rmi_dbg(RMI_DEBUG_FN, dev, "%s complete\n", __func__);