Loading drivers/input/touchscreen/focaltech_touch/focaltech_core.c +50 −24 Original line number Diff line number Diff line Loading @@ -102,6 +102,7 @@ static int fts_ts_suspend(struct device *dev); static int fts_ts_resume(struct device *dev); static irqreturn_t fts_irq_handler(int irq, void *data); static int fts_ts_probe_delayed(struct fts_ts_data *fts_data); static int fts_ts_enable_reg(struct fts_ts_data *ts_data, bool enable); #ifdef CONFIG_FTS_TRUSTED_TOUCH Loading Loading @@ -740,7 +741,6 @@ static void fts_ts_trusted_touch_abort_pvm(struct fts_ts_data *fts_data) case PVM_I2C_RESOURCE_ACQUIRED: case PVM_INTERRUPT_ENABLED: fts_ts_bus_put(fts_data); complete(&fts_data->trusted_touch_powerdown); case TRUSTED_TOUCH_PVM_INIT: case PVM_I2C_RESOURCE_RELEASED: atomic_set(&fts_data->trusted_touch_enabled, 0); Loading Loading @@ -779,6 +779,8 @@ static int fts_ts_bus_get(struct fts_ts_data *fts_data) { int rc = 0; reinit_completion(&fts_data->trusted_touch_powerdown); fts_ts_enable_reg(fts_data, true); mutex_lock(&fts_data->fts_clk_io_ctrl_mutex); rc = pm_runtime_get_sync(fts_data->client->adapter->dev.parent); if (rc >= 0 && fts_data->core_clk != NULL && Loading @@ -799,6 +801,8 @@ static void fts_ts_bus_put(struct fts_ts_data *fts_data) fts_ts_clk_disable_unprepare(fts_data); pm_runtime_put_sync(fts_data->client->adapter->dev.parent); mutex_unlock(&fts_data->fts_clk_io_ctrl_mutex); complete(&fts_data->trusted_touch_powerdown); fts_ts_enable_reg(fts_data, false); } static struct hh_notify_vmid_desc *fts_ts_vm_get_vmid(hh_vmid_t vmid) Loading Loading @@ -849,7 +853,6 @@ static void fts_trusted_touch_pvm_vm_mode_disable(struct fts_ts_data *fts_data) fts_ts_bus_put(fts_data); fts_ts_trusted_touch_set_pvm_driver_state(fts_data, PVM_I2C_RESOURCE_RELEASED); complete(&fts_data->trusted_touch_powerdown); fts_ts_trusted_touch_set_pvm_driver_state(fts_data, TRUSTED_TOUCH_PVM_INIT); atomic_set(&fts_data->trusted_touch_enabled, 0); Loading Loading @@ -1026,7 +1029,6 @@ static int fts_ts_trusted_touch_pvm_vm_mode_enable(struct fts_ts_data *fts_data) } fts_ts_trusted_touch_set_pvm_driver_state(fts_data, PVM_IRQ_LENT_NOTIFIED); reinit_completion(&fts_data->trusted_touch_powerdown); atomic_set(&fts_data->trusted_touch_enabled, 1); pr_debug("trusted touch enabled\n"); return rc; Loading Loading @@ -2067,7 +2069,7 @@ static int fts_pinctrl_select_release(struct fts_ts_data *ts) } #endif /* FTS_PINCTRL_EN */ static int fts_power_source_ctrl(struct fts_ts_data *ts_data, int enable) static int fts_ts_enable_reg(struct fts_ts_data *ts_data, bool enable) { int ret = 0; Loading @@ -2076,40 +2078,58 @@ static int fts_power_source_ctrl(struct fts_ts_data *ts_data, int enable) return -EINVAL; } FTS_FUNC_ENTER(); if (enable) { if (ts_data->power_disabled) { FTS_DEBUG("regulator enable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = regulator_enable(ts_data->vdd); if (ret) { if (ret) FTS_ERROR("enable vdd regulator failed,ret=%d", ret); } if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { ret = regulator_enable(ts_data->vcc_i2c); if (ret) { if (ret) FTS_ERROR("enable vcc_i2c regulator failed,ret=%d", ret); } } ts_data->power_disabled = false; } } else { if (!ts_data->power_disabled) { FTS_DEBUG("regulator disable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = regulator_disable(ts_data->vdd); if (ret) { if (ret) FTS_ERROR("disable vdd regulator failed,ret=%d", ret); } if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { ret = regulator_disable(ts_data->vcc_i2c); if (ret) { if (ret) FTS_ERROR("disable vcc_i2c regulator failed,ret=%d", ret); } } return ret; } static int fts_power_source_ctrl(struct fts_ts_data *ts_data, int enable) { int ret = 0; if (IS_ERR_OR_NULL(ts_data->vdd)) { FTS_ERROR("vdd is invalid"); return -EINVAL; } FTS_FUNC_ENTER(); if (enable) { if (ts_data->power_disabled) { FTS_DEBUG("regulator enable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = fts_ts_enable_reg(ts_data, true); if (ret) FTS_ERROR("Touch reg enable failed\n"); ts_data->power_disabled = false; } } else { if (!ts_data->power_disabled) { FTS_DEBUG("regulator disable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = fts_ts_enable_reg(ts_data, false); if (ret) FTS_ERROR("Touch reg disable failed"); ts_data->power_disabled = true; } } Loading Loading @@ -2889,6 +2909,12 @@ static int fts_ts_resume(struct device *dev) return 0; } #ifdef CONFIG_ST_TRUSTED_TOUCH if (atomic_read(&ts_data->trusted_touch_enabled)) wait_for_completion_interruptible( &ts_data->trusted_touch_powerdown); #endif fts_release_all_finger(); if (!ts_data->ic_info.is_incell) { Loading Loading
drivers/input/touchscreen/focaltech_touch/focaltech_core.c +50 −24 Original line number Diff line number Diff line Loading @@ -102,6 +102,7 @@ static int fts_ts_suspend(struct device *dev); static int fts_ts_resume(struct device *dev); static irqreturn_t fts_irq_handler(int irq, void *data); static int fts_ts_probe_delayed(struct fts_ts_data *fts_data); static int fts_ts_enable_reg(struct fts_ts_data *ts_data, bool enable); #ifdef CONFIG_FTS_TRUSTED_TOUCH Loading Loading @@ -740,7 +741,6 @@ static void fts_ts_trusted_touch_abort_pvm(struct fts_ts_data *fts_data) case PVM_I2C_RESOURCE_ACQUIRED: case PVM_INTERRUPT_ENABLED: fts_ts_bus_put(fts_data); complete(&fts_data->trusted_touch_powerdown); case TRUSTED_TOUCH_PVM_INIT: case PVM_I2C_RESOURCE_RELEASED: atomic_set(&fts_data->trusted_touch_enabled, 0); Loading Loading @@ -779,6 +779,8 @@ static int fts_ts_bus_get(struct fts_ts_data *fts_data) { int rc = 0; reinit_completion(&fts_data->trusted_touch_powerdown); fts_ts_enable_reg(fts_data, true); mutex_lock(&fts_data->fts_clk_io_ctrl_mutex); rc = pm_runtime_get_sync(fts_data->client->adapter->dev.parent); if (rc >= 0 && fts_data->core_clk != NULL && Loading @@ -799,6 +801,8 @@ static void fts_ts_bus_put(struct fts_ts_data *fts_data) fts_ts_clk_disable_unprepare(fts_data); pm_runtime_put_sync(fts_data->client->adapter->dev.parent); mutex_unlock(&fts_data->fts_clk_io_ctrl_mutex); complete(&fts_data->trusted_touch_powerdown); fts_ts_enable_reg(fts_data, false); } static struct hh_notify_vmid_desc *fts_ts_vm_get_vmid(hh_vmid_t vmid) Loading Loading @@ -849,7 +853,6 @@ static void fts_trusted_touch_pvm_vm_mode_disable(struct fts_ts_data *fts_data) fts_ts_bus_put(fts_data); fts_ts_trusted_touch_set_pvm_driver_state(fts_data, PVM_I2C_RESOURCE_RELEASED); complete(&fts_data->trusted_touch_powerdown); fts_ts_trusted_touch_set_pvm_driver_state(fts_data, TRUSTED_TOUCH_PVM_INIT); atomic_set(&fts_data->trusted_touch_enabled, 0); Loading Loading @@ -1026,7 +1029,6 @@ static int fts_ts_trusted_touch_pvm_vm_mode_enable(struct fts_ts_data *fts_data) } fts_ts_trusted_touch_set_pvm_driver_state(fts_data, PVM_IRQ_LENT_NOTIFIED); reinit_completion(&fts_data->trusted_touch_powerdown); atomic_set(&fts_data->trusted_touch_enabled, 1); pr_debug("trusted touch enabled\n"); return rc; Loading Loading @@ -2067,7 +2069,7 @@ static int fts_pinctrl_select_release(struct fts_ts_data *ts) } #endif /* FTS_PINCTRL_EN */ static int fts_power_source_ctrl(struct fts_ts_data *ts_data, int enable) static int fts_ts_enable_reg(struct fts_ts_data *ts_data, bool enable) { int ret = 0; Loading @@ -2076,40 +2078,58 @@ static int fts_power_source_ctrl(struct fts_ts_data *ts_data, int enable) return -EINVAL; } FTS_FUNC_ENTER(); if (enable) { if (ts_data->power_disabled) { FTS_DEBUG("regulator enable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = regulator_enable(ts_data->vdd); if (ret) { if (ret) FTS_ERROR("enable vdd regulator failed,ret=%d", ret); } if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { ret = regulator_enable(ts_data->vcc_i2c); if (ret) { if (ret) FTS_ERROR("enable vcc_i2c regulator failed,ret=%d", ret); } } ts_data->power_disabled = false; } } else { if (!ts_data->power_disabled) { FTS_DEBUG("regulator disable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = regulator_disable(ts_data->vdd); if (ret) { if (ret) FTS_ERROR("disable vdd regulator failed,ret=%d", ret); } if (!IS_ERR_OR_NULL(ts_data->vcc_i2c)) { ret = regulator_disable(ts_data->vcc_i2c); if (ret) { if (ret) FTS_ERROR("disable vcc_i2c regulator failed,ret=%d", ret); } } return ret; } static int fts_power_source_ctrl(struct fts_ts_data *ts_data, int enable) { int ret = 0; if (IS_ERR_OR_NULL(ts_data->vdd)) { FTS_ERROR("vdd is invalid"); return -EINVAL; } FTS_FUNC_ENTER(); if (enable) { if (ts_data->power_disabled) { FTS_DEBUG("regulator enable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = fts_ts_enable_reg(ts_data, true); if (ret) FTS_ERROR("Touch reg enable failed\n"); ts_data->power_disabled = false; } } else { if (!ts_data->power_disabled) { FTS_DEBUG("regulator disable !"); gpio_direction_output(ts_data->pdata->reset_gpio, 0); msleep(1); ret = fts_ts_enable_reg(ts_data, false); if (ret) FTS_ERROR("Touch reg disable failed"); ts_data->power_disabled = true; } } Loading Loading @@ -2889,6 +2909,12 @@ static int fts_ts_resume(struct device *dev) return 0; } #ifdef CONFIG_ST_TRUSTED_TOUCH if (atomic_read(&ts_data->trusted_touch_enabled)) wait_for_completion_interruptible( &ts_data->trusted_touch_powerdown); #endif fts_release_all_finger(); if (!ts_data->ic_info.is_incell) { Loading