OSDN Git Service

synaptics_dsx_force: update from sagit-p-oss
authorwloot <wlootlxt123@gmail.com>
Thu, 11 Jul 2019 12:30:05 +0000 (20:30 +0800)
committerArian <arian.kulmer@web.de>
Tue, 19 Nov 2019 15:24:38 +0000 (16:24 +0100)
Change-Id: Ib849ac8e3891261fbcee8201d93e887a1a975514

drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.c

index acfabf6..f9de5d7 100644 (file)
 static int synaptics_rmi4_check_status(struct synaptics_rmi4_data *rmi4_data,
                bool *was_in_bl_mode);
 static int synaptics_rmi4_free_fingers(struct synaptics_rmi4_data *rmi4_data);
-static void synaptics_rmi4_set_configured(struct synaptics_rmi4_data *rmi4_data);
+static int synaptics_rmi4_reinit_device(struct synaptics_rmi4_data *rmi4_data);
 static int synaptics_rmi4_reset_device(struct synaptics_rmi4_data *rmi4_data,
                bool rebuild);
 static void synaptics_rmi4_sleep_enable(struct synaptics_rmi4_data *rmi4_data,
@@ -2011,7 +2011,7 @@ static void synaptics_rmi4_sensor_report(struct synaptics_rmi4_data *rmi4_data,
        }
        if (status.unconfigured && !status.flash_prog) {
                pr_notice("%s: spontaneous reset detected\n", __func__);
-               synaptics_rmi4_set_configured(rmi4_data);
+               synaptics_rmi4_reinit_device(rmi4_data);
        }
 
        if (!report)
@@ -4562,6 +4562,49 @@ exit:
        return;
 }
 
+static int synaptics_rmi4_reinit_device(struct synaptics_rmi4_data *rmi4_data)
+{
+       int retval;
+       struct synaptics_rmi4_fn *fhandler;
+       struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+       struct synaptics_rmi4_device_info *rmi;
+
+       rmi = &(rmi4_data->rmi4_mod_info);
+
+       mutex_lock(&(rmi4_data->rmi4_reset_mutex));
+
+       synaptics_rmi4_free_fingers(rmi4_data);
+
+       if (!list_empty(&rmi->support_fn_list)) {
+               list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+                       if (fhandler->fn_number == SYNAPTICS_RMI4_F12) {
+                               synaptics_rmi4_f12_set_enables(rmi4_data, 0);
+                               break;
+                       }
+               }
+       }
+
+       retval = synaptics_rmi4_int_enable(rmi4_data, true);
+       if (retval < 0)
+               goto exit;
+
+       mutex_lock(&exp_data.mutex);
+       if (!list_empty(&exp_data.list)) {
+               list_for_each_entry(exp_fhandler, &exp_data.list, link)
+                       if (exp_fhandler->exp_fn->reinit != NULL)
+                               exp_fhandler->exp_fn->reinit(rmi4_data);
+       }
+       mutex_unlock(&exp_data.mutex);
+
+       synaptics_rmi4_set_configured(rmi4_data);
+
+       retval = 0;
+
+exit:
+       mutex_unlock(&(rmi4_data->rmi4_reset_mutex));
+       return retval;
+}
+
 static int synaptics_rmi4_reset_device(struct synaptics_rmi4_data *rmi4_data,
                bool rebuild)
 {