Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a95635ac authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "input: touchscreen: focaltech: queue touch suspend work on workqueue"

parents 2fe40972 5d9381b0
Loading
Loading
Loading
Loading
+52 −26
Original line number Diff line number Diff line
@@ -296,7 +296,9 @@ static int fts_ts_vm_handle_vm_hardware(struct fts_ts_data *fts_data)
	return rc;
}

static void fts_ts_vm_irq_on_lend_callback(void *data, enum hh_irq_label label)
static void fts_ts_vm_irq_on_lend_callback(void *data,
					unsigned long notif_type,
					enum hh_irq_label label)
{
	struct fts_ts_data *fts_data = data;
	struct irq_data *irq_data;
@@ -472,6 +474,10 @@ static void fts_ts_trusted_touch_vm_mode_disable(struct fts_ts_data *fts_data)
			pr_err("Failed to release irq rc:%d\n", rc);
		else
			atomic_set(&fts_data->vm_info->tvm_owns_irq, 0);

		rc = hh_irq_release_notify(fts_data->vm_info->irq_label);
		if (rc)
			pr_err("Failed to notify release irq rc:%d\n", rc);
	}
	atomic_set(&fts_data->trusted_touch_enabled, 0);
	reinit_completion(&fts_data->resource_checkpoint);
@@ -600,6 +606,7 @@ static void fts_ts_trusted_touch_complete(struct fts_ts_data *fts_data)
}

static void fts_ts_vm_irq_on_release_callback(void *data,
					unsigned long notif_type,
					enum hh_irq_label label)
{
	struct fts_ts_data *fts_data = data;
@@ -730,7 +737,7 @@ static int fts_ts_trusted_touch_vm_mode_enable(struct fts_ts_data *fts_data)
	}
	atomic_set(&vm_info->pvm_owns_iomem, 0);

	rc = hh_irq_lend(vm_info->irq_label, vm_info->vm_name,
	rc = hh_irq_lend_v2(vm_info->irq_label, vm_info->vm_name,
		fts_data->irq, &fts_ts_vm_irq_on_release_callback, fts_data);
	if (rc) {
		pr_err("Failed to lend irq\n");
@@ -738,6 +745,12 @@ static int fts_ts_trusted_touch_vm_mode_enable(struct fts_ts_data *fts_data)
	}
	atomic_set(&vm_info->pvm_owns_irq, 0);

	rc = hh_irq_lend_notify(vm_info->irq_label);
	if (rc) {
		pr_err("Failed to notify irq\n");
		return -EINVAL;
	}

	reinit_completion(&fts_data->trusted_touch_powerdown);
	atomic_set(&fts_data->trusted_touch_enabled, 1);
	pr_debug("trusted touch enabled\n");
@@ -809,7 +822,7 @@ static int fts_ts_vm_init(struct fts_ts_data *fts_data)
		goto init_fail;
	}
	vm_info->mem_cookie = mem_cookie;
	rc = hh_irq_wait_for_lend(vm_info->irq_label, HH_PRIMARY_VM,
	rc = hh_irq_wait_for_lend_v2(vm_info->irq_label, HH_PRIMARY_VM,
			&fts_ts_vm_irq_on_lend_callback, fts_data);
	atomic_set(&vm_info->tvm_owns_irq, 0);
	atomic_set(&vm_info->tvm_owns_iomem, 0);
@@ -2113,13 +2126,19 @@ static void fts_resume_work(struct work_struct *work)
	fts_ts_resume(ts_data->dev);
}

static void fts_suspend_work(struct work_struct *work)
{
	struct fts_ts_data *ts_data = container_of(work, struct fts_ts_data,
					resume_work);

	fts_ts_suspend(ts_data->dev);
}

static int fb_notifier_callback(struct notifier_block *self,
				unsigned long event, void *data)
{
	struct drm_panel_notifier *evdata = data;
	int *blank = NULL;
	struct fts_ts_data *ts_data = container_of(self, struct fts_ts_data,
			fb_notif);

	if (!evdata)
		return 0;
@@ -2143,8 +2162,8 @@ static int fb_notifier_callback(struct notifier_block *self,

	case DRM_PANEL_BLANK_POWERDOWN:
		if (event == DRM_PANEL_EARLY_EVENT_BLANK) {
			cancel_work_sync(&fts_data->resume_work);
			fts_ts_suspend(ts_data->dev);
			queue_work(fts_data->ts_workqueue,
					&fts_data->suspend_work);
		} else if (event == DRM_PANEL_EVENT_BLANK) {
			FTS_DEBUG("suspend: event = %lu, not care\n", event);
		}
@@ -2167,13 +2186,19 @@ static void fts_resume_work(struct work_struct *work)
	fts_ts_resume(ts_data->dev);
}

static void fts_suspend_work(struct work_struct *work)
{
	struct fts_ts_data *ts_data = container_of(work, struct fts_ts_data,
					resume_work);

	fts_ts_suspend(ts_data->dev);
}

static int fb_notifier_callback(struct notifier_block *self,
				unsigned long event, void *data)
{
	struct fb_event *evdata = data;
	int *blank = NULL;
	struct fts_ts_data *ts_data = container_of(self, struct fts_ts_data,
					fb_notif);

	if (!(event == FB_EARLY_EVENT_BLANK || event == FB_EVENT_BLANK)) {
		FTS_INFO("event(%lu) do not need process\n", event);
@@ -2227,7 +2252,6 @@ static void fts_ts_late_resume(struct early_suspend *handler)

static int fts_ts_probe_delayed(struct fts_ts_data *fts_data)
{
	int error = 0;
	int ret = 0;

/* Avoid setting up hardware for TVM during probe */
@@ -2267,24 +2291,24 @@ static int fts_ts_probe_delayed(struct fts_ts_data *fts_data)
#ifdef CONFIG_ARCH_QTI_VM
tvm_setup:
#endif
	error = fts_irq_registration(fts_data);
	if (error) {
	ret = fts_irq_registration(fts_data);
	if (ret) {
		FTS_ERROR("request irq failed");
#ifdef CONFIG_ARCH_QTI_VM
		return error;
		return ret;
#endif
		goto err_irq_req;
	}

#ifdef CONFIG_ARCH_QTI_VM
	return error;
	return ret;
#endif

	ret = fts_fwupg_init(fts_data);
	if (ret)
		FTS_ERROR("init fw upgrade fail");

	return error;
	return 0;

err_irq_req:
	if (gpio_is_valid(fts_data->pdata->reset_gpio))
@@ -2296,7 +2320,7 @@ static int fts_ts_probe_delayed(struct fts_ts_data *fts_data)
	fts_power_source_exit(fts_data);
#endif
err_gpio_config:
	return error;
	return ret;
}

static int fts_ts_probe_entry(struct fts_ts_data *ts_data)
@@ -2388,9 +2412,20 @@ static int fts_ts_probe_entry(struct fts_ts_data *ts_data)
	}
#endif

#ifdef CONFIG_FTS_TRUSTED_TOUCH
	fts_ts_trusted_touch_init(ts_data);
	mutex_init(&(ts_data->fts_clk_io_ctrl_mutex));
#endif
	ret = fts_ts_probe_delayed(ts_data);
	if (ret) {
		FTS_ERROR("Failed to enable resources\n");
		goto err_probe_delayed;
	}

#if defined(CONFIG_DRM)
	if (ts_data->ts_workqueue) {
		INIT_WORK(&ts_data->resume_work, fts_resume_work);
		INIT_WORK(&ts_data->suspend_work, fts_suspend_work);
	}
	ts_data->fb_notif.notifier_call = fb_notifier_callback;

@@ -2402,6 +2437,7 @@ static int fts_ts_probe_entry(struct fts_ts_data *ts_data)
#elif defined(CONFIG_FB)
	if (ts_data->ts_workqueue) {
		INIT_WORK(&ts_data->resume_work, fts_resume_work);
		INIT_WORK(&ts_data->suspend_work, fts_suspend_work);
	}
	ts_data->fb_notif.notifier_call = fb_notifier_callback;
	ret = fb_register_client(&ts_data->fb_notif);
@@ -2415,16 +2451,6 @@ static int fts_ts_probe_entry(struct fts_ts_data *ts_data)
	register_early_suspend(&ts_data->early_suspend);
#endif

#ifdef CONFIG_FTS_TRUSTED_TOUCH
	fts_ts_trusted_touch_init(ts_data);
	mutex_init(&(ts_data->fts_clk_io_ctrl_mutex));
#endif
	ret = fts_ts_probe_delayed(ts_data);
	if (ret) {
		FTS_ERROR("Failed to enable resources\n");
		goto err_probe_delayed;
	}

	FTS_FUNC_EXIT();
	return 0;

+1 −0
Original line number Diff line number Diff line
@@ -178,6 +178,7 @@ struct fts_ts_data {
	struct delayed_work esdcheck_work;
	struct delayed_work prc_work;
	struct work_struct resume_work;
	struct work_struct suspend_work;
	struct ftxxxx_proc proc;
	spinlock_t irq_lock;
	struct mutex report_mutex;
+18 −4
Original line number Diff line number Diff line
@@ -301,7 +301,9 @@ static int fts_vm_handle_vm_hardware(struct fts_ts_info *info)
	return rc;
}

static void fts_vm_irq_on_lend_callback(void *data, enum hh_irq_label label)
static void fts_vm_irq_on_lend_callback(void *data,
					unsigned long notif_type,
					enum hh_irq_label label)
{
	struct fts_ts_info *info = data;
	struct irq_data *irq_data;
@@ -477,6 +479,10 @@ static void fts_trusted_touch_vm_mode_disable(struct fts_ts_info *info)
			pr_err("Failed to release irq rc:%d\n", rc);
		else
			atomic_set(&info->vm_info->tvm_owns_irq, 0);

		rc = hh_irq_release_notify(info->vm_info->irq_label);
		if (rc)
			pr_err("Failed to notify release irq rc:%d\n", rc);
	}
	atomic_set(&info->trusted_touch_enabled, 0);
	reinit_completion(&info->resource_checkpoint);
@@ -604,7 +610,9 @@ static void fts_trusted_touch_complete(struct fts_ts_info *info)
	}
}

static void fts_vm_irq_on_release_callback(void *data, enum hh_irq_label label)
static void fts_vm_irq_on_release_callback(void *data,
					unsigned long notif_type,
					enum hh_irq_label label)
{
	struct fts_ts_info *info = data;
	int rc = 0;
@@ -735,7 +743,7 @@ static int fts_trusted_touch_vm_mode_enable(struct fts_ts_info *info)
	}
	atomic_set(&vm_info->pvm_owns_iomem, 0);

	rc = hh_irq_lend(vm_info->irq_label, vm_info->vm_name,
	rc = hh_irq_lend_v2(vm_info->irq_label, vm_info->vm_name,
		info->client->irq, &fts_vm_irq_on_release_callback, info);
	if (rc) {
		pr_err("Failed to lend irq\n");
@@ -743,6 +751,12 @@ static int fts_trusted_touch_vm_mode_enable(struct fts_ts_info *info)
	}
	atomic_set(&vm_info->pvm_owns_irq, 0);

	rc = hh_irq_lend_notify(vm_info->irq_label);
	if (rc) {
		pr_err("Failed to notify irq\n");
		return -EINVAL;
	}

	reinit_completion(&info->trusted_touch_powerdown);
	atomic_set(&info->trusted_touch_enabled, 1);
	pr_debug("trusted touch enabled\n");
@@ -813,7 +827,7 @@ static int fts_vm_init(struct fts_ts_info *info)
		goto init_fail;
	}
	vm_info->mem_cookie = mem_cookie;
	rc = hh_irq_wait_for_lend(vm_info->irq_label, HH_PRIMARY_VM,
	rc = hh_irq_wait_for_lend_v2(vm_info->irq_label, HH_PRIMARY_VM,
			&fts_vm_irq_on_lend_callback, info);
	atomic_set(&vm_info->tvm_owns_irq, 0);
	atomic_set(&vm_info->tvm_owns_iomem, 0);