summaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2016-11-30 19:59:30 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2016-11-30 20:42:17 -0500
commite155d4ee0b878c857f91deb14d6d7dba55c38648 (patch)
tree14d507133b6ebd7bed9bae3a87c144a1cc590f8e /drivers/input
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')
-rw-r--r--drivers/input/rmi4/rmi_driver.c40
-rw-r--r--drivers/input/rmi4/rmi_f34.c19
2 files changed, 22 insertions, 37 deletions
diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index f04fc4152c1f..27c731ab71b8 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -42,8 +42,6 @@ void rmi_free_function_list(struct rmi_device *rmi_dev)
42 42
43 rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Freeing function list\n"); 43 rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Freeing function list\n");
44 44
45 mutex_lock(&data->irq_mutex);
46
47 devm_kfree(&rmi_dev->dev, data->irq_memory); 45 devm_kfree(&rmi_dev->dev, data->irq_memory);
48 data->irq_memory = NULL; 46 data->irq_memory = NULL;
49 data->irq_status = NULL; 47 data->irq_status = NULL;
@@ -60,8 +58,6 @@ void rmi_free_function_list(struct rmi_device *rmi_dev)
60 list_del(&fn->node); 58 list_del(&fn->node);
61 rmi_unregister_function(fn); 59 rmi_unregister_function(fn);
62 } 60 }
63
64 mutex_unlock(&data->irq_mutex);
65} 61}
66EXPORT_SYMBOL_GPL(rmi_free_function_list); 62EXPORT_SYMBOL_GPL(rmi_free_function_list);
67 63
@@ -160,25 +156,24 @@ static int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
160 if (!data) 156 if (!data)
161 return 0; 157 return 0;
162 158
163 mutex_lock(&data->irq_mutex);
164 if (!data->irq_status || !data->f01_container) {
165 mutex_unlock(&data->irq_mutex);
166 return 0;
167 }
168
169 if (!rmi_dev->xport->attn_data) { 159 if (!rmi_dev->xport->attn_data) {
170 error = rmi_read_block(rmi_dev, 160 error = rmi_read_block(rmi_dev,
171 data->f01_container->fd.data_base_addr + 1, 161 data->f01_container->fd.data_base_addr + 1,
172 data->irq_status, data->num_of_irq_regs); 162 data->irq_status, data->num_of_irq_regs);
173 if (error < 0) { 163 if (error < 0) {
174 dev_err(dev, "Failed to read irqs, code=%d\n", error); 164 dev_err(dev, "Failed to read irqs, code=%d\n", error);
175 mutex_unlock(&data->irq_mutex);
176 return error; 165 return error;
177 } 166 }
178 } 167 }
179 168
169 mutex_lock(&data->irq_mutex);
180 bitmap_and(data->irq_status, data->irq_status, data->current_irq_mask, 170 bitmap_and(data->irq_status, data->irq_status, data->current_irq_mask,
181 data->irq_count); 171 data->irq_count);
172 /*
173 * At this point, irq_status has all bits that are set in the
174 * interrupt status register and are enabled.
175 */
176 mutex_unlock(&data->irq_mutex);
182 177
183 /* 178 /*
184 * It would be nice to be able to use irq_chip to handle these 179 * It would be nice to be able to use irq_chip to handle these
@@ -194,8 +189,6 @@ static int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
194 if (data->input) 189 if (data->input)
195 input_sync(data->input); 190 input_sync(data->input);
196 191
197 mutex_unlock(&data->irq_mutex);
198
199 return 0; 192 return 0;
200} 193}
201 194
@@ -263,18 +256,12 @@ static int rmi_suspend_functions(struct rmi_device *rmi_dev)
263 struct rmi_function *entry; 256 struct rmi_function *entry;
264 int retval; 257 int retval;
265 258
266 mutex_lock(&data->irq_mutex);
267
268 list_for_each_entry(entry, &data->function_list, node) { 259 list_for_each_entry(entry, &data->function_list, node) {
269 retval = suspend_one_function(entry); 260 retval = suspend_one_function(entry);
270 if (retval < 0) { 261 if (retval < 0)
271 mutex_unlock(&data->irq_mutex);
272 return retval; 262 return retval;
273 }
274 } 263 }
275 264
276 mutex_unlock(&data->irq_mutex);
277
278 return 0; 265 return 0;
279} 266}
280 267
@@ -303,18 +290,12 @@ static int rmi_resume_functions(struct rmi_device *rmi_dev)
303 struct rmi_function *entry; 290 struct rmi_function *entry;
304 int retval; 291 int retval;
305 292
306 mutex_lock(&data->irq_mutex);
307
308 list_for_each_entry(entry, &data->function_list, node) { 293 list_for_each_entry(entry, &data->function_list, node) {
309 retval = resume_one_function(entry); 294 retval = resume_one_function(entry);
310 if (retval < 0) { 295 if (retval < 0)
311 mutex_unlock(&data->irq_mutex);
312 return retval; 296 return retval;
313 }
314 } 297 }
315 298
316 mutex_unlock(&data->irq_mutex);
317
318 return 0; 299 return 0;
319} 300}
320 301
@@ -1043,8 +1024,6 @@ int rmi_init_functions(struct rmi_driver_data *data)
1043 int irq_count; 1024 int irq_count;
1044 int retval; 1025 int retval;
1045 1026
1046 mutex_lock(&data->irq_mutex);
1047
1048 irq_count = 0; 1027 irq_count = 0;
1049 rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Creating functions.\n", __func__); 1028 rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Creating functions.\n", __func__);
1050 retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function); 1029 retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
@@ -1069,13 +1048,10 @@ int rmi_init_functions(struct rmi_driver_data *data)
1069 goto err_destroy_functions; 1048 goto err_destroy_functions;
1070 } 1049 }
1071 1050
1072 mutex_unlock(&data->irq_mutex);
1073
1074 return 0; 1051 return 0;
1075 1052
1076err_destroy_functions: 1053err_destroy_functions:
1077 rmi_free_function_list(rmi_dev); 1054 rmi_free_function_list(rmi_dev);
1078 mutex_unlock(&data->irq_mutex);
1079 return retval; 1055 return retval;
1080} 1056}
1081EXPORT_SYMBOL_GPL(rmi_init_functions); 1057EXPORT_SYMBOL_GPL(rmi_init_functions);
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:
282static int rmi_firmware_update(struct rmi_driver_data *data, 282static int rmi_firmware_update(struct rmi_driver_data *data,
283 const struct firmware *fw) 283 const struct firmware *fw)
284{ 284{
285 struct device *dev = &data->rmi_dev->dev; 285 struct rmi_device *rmi_dev = data->rmi_dev;
286 struct device *dev = &rmi_dev->dev;
286 struct f34_data *f34; 287 struct f34_data *f34;
287 int ret; 288 int ret;
288 289
@@ -305,8 +306,10 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
305 if (ret) 306 if (ret)
306 return ret; 307 return ret;
307 308
309 rmi_disable_irq(rmi_dev, false);
310
308 /* Tear down functions and re-probe */ 311 /* Tear down functions and re-probe */
309 rmi_free_function_list(data->rmi_dev); 312 rmi_free_function_list(rmi_dev);
310 313
311 ret = rmi_probe_interrupts(data); 314 ret = rmi_probe_interrupts(data);
312 if (ret) 315 if (ret)
@@ -322,6 +325,8 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
322 return -EINVAL; 325 return -EINVAL;
323 } 326 }
324 327
328 rmi_enable_irq(rmi_dev, false);
329
325 f34 = dev_get_drvdata(&data->f34_container->dev); 330 f34 = dev_get_drvdata(&data->f34_container->dev);
326 331
327 /* Perform firmware update */ 332 /* Perform firmware update */
@@ -329,11 +334,13 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
329 334
330 dev_info(&f34->fn->dev, "Firmware update complete, status:%d\n", ret); 335 dev_info(&f34->fn->dev, "Firmware update complete, status:%d\n", ret);
331 336
337 rmi_disable_irq(rmi_dev, false);
338
332 /* Re-probe */ 339 /* Re-probe */
333 rmi_dbg(RMI_DEBUG_FN, dev, "Re-probing device\n"); 340 rmi_dbg(RMI_DEBUG_FN, dev, "Re-probing device\n");
334 rmi_free_function_list(data->rmi_dev); 341 rmi_free_function_list(rmi_dev);
335 342
336 ret = rmi_scan_pdt(data->rmi_dev, NULL, rmi_initial_reset); 343 ret = rmi_scan_pdt(rmi_dev, NULL, rmi_initial_reset);
337 if (ret < 0) 344 if (ret < 0)
338 dev_warn(dev, "RMI reset failed!\n"); 345 dev_warn(dev, "RMI reset failed!\n");
339 346
@@ -345,9 +352,11 @@ static int rmi_firmware_update(struct rmi_driver_data *data,
345 if (ret) 352 if (ret)
346 return ret; 353 return ret;
347 354
355 rmi_enable_irq(rmi_dev, false);
356
348 if (data->f01_container->dev.driver) 357 if (data->f01_container->dev.driver)
349 /* Driver already bound, so enable ATTN now. */ 358 /* Driver already bound, so enable ATTN now. */
350 return rmi_enable_sensor(data->rmi_dev); 359 return rmi_enable_sensor(rmi_dev);
351 360
352 rmi_dbg(RMI_DEBUG_FN, dev, "%s complete\n", __func__); 361 rmi_dbg(RMI_DEBUG_FN, dev, "%s complete\n", __func__);
353 362