summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/maxim_sti.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/touchscreen/maxim_sti.c')
-rw-r--r--drivers/input/touchscreen/maxim_sti.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/maxim_sti.c b/drivers/input/touchscreen/maxim_sti.c
index aaaaf1535f10..0ce23fba16cd 100644
--- a/drivers/input/touchscreen/maxim_sti.c
+++ b/drivers/input/touchscreen/maxim_sti.c
@@ -66,6 +66,7 @@ struct dev_data {
u32 nl_seq;
u8 nl_mc_group_count;
bool nl_enabled;
+ bool start_fusion;
bool suspend_in_progress;
bool resume_in_progress;
bool expect_resume_ack;
@@ -1565,6 +1566,9 @@ static int processing_thread(void *arg)
struct dev_data *dd = arg;
struct maxim_sti_pdata *pdata = dd->spi->dev.platform_data;
struct sk_buff *skb;
+ char *argv[] = { pdata->touch_fusion, "daemon",
+ pdata->nl_family,
+ pdata->config_file, NULL };
int ret, ret2;
bool fusion_dead;
@@ -1585,11 +1589,21 @@ static int processing_thread(void *arg)
find_get_pid(dd->fusion_process),
PIDTYPE_PID) == NULL) {
stop_scan_canned(dd);
+ dd->start_fusion = true;
dd->fusion_process = (pid_t)0;
#if INPUT_ENABLE_DISABLE
dd->input_no_deconfig = true;
#endif
}
+ if (dd->start_fusion) {
+ do {
+ ret = call_usermodehelper(argv[0], argv, NULL,
+ UMH_WAIT_EXEC);
+ if (ret != 0)
+ msleep(100);
+ } while (ret != 0 && !kthread_should_stop());
+ dd->start_fusion = false;
+ }
if (kthread_should_stop())
break;
@@ -1811,6 +1825,7 @@ static int probe(struct spi_device *spi)
#endif
/* start up Touch Fusion */
+ dd->start_fusion = true;
wake_up_process(dd->thread);
INFO("driver loaded; version %s; release date %s", DRIVER_VERSION,
DRIVER_RELEASE);