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

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

Merge "input: touchscreen: synaptics_dsx: new drm notifier"

parents 3bf343ac c92296e3
Loading
Loading
Loading
Loading
+39 −32
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@
#include <linux/input/mt.h>
#endif

#include <linux/msm_drm_notify.h>
#include <linux/completion.h>

#define INPUT_PHYS_NAME "synaptics_dsx/touch_input"
@@ -129,7 +128,7 @@ static int synaptics_rmi4_reset_device(struct synaptics_rmi4_data *rmi4_data,
		bool rebuild);
static int synaptics_rmi4_dsi_panel_notifier_cb(struct notifier_block *self,
		unsigned long event, void *data);

struct drm_panel *active_panel;
#ifdef CONFIG_HAS_EARLYSUSPEND
#ifndef CONFIG_FB
#define USE_EARLYSUSPEND
@@ -4282,14 +4281,16 @@ static int synaptics_rmi4_probe(struct platform_device *pdev)
	rmi4_data->initialized = false;
	rmi4_data->fb_notifier.notifier_call =
					synaptics_rmi4_dsi_panel_notifier_cb;
	retval = msm_drm_register_client(&rmi4_data->fb_notifier);
	if (active_panel) {
		retval = drm_panel_notifier_register(active_panel,
				&rmi4_data->fb_notifier);
		if (retval < 0) {
			dev_err(&pdev->dev,
					"%s: Failed to register fb notifier client\n",
					__func__);
			goto err_drm_reg;
		}

	}
	rmi4_data->rmi4_probe_wq = create_singlethread_workqueue(
						"Synaptics_rmi4_probe_wq");
	if (!rmi4_data->rmi4_probe_wq) {
@@ -4304,7 +4305,9 @@ static int synaptics_rmi4_probe(struct platform_device *pdev)
	return retval;

err_probe_wq:
	msm_drm_unregister_client(&rmi4_data->fb_notifier);
	if (active_panel)
		drm_panel_notifier_unregister(active_panel,
				&rmi4_data->fb_notifier);

err_drm_reg:
	kfree(rmi4_data);
@@ -4536,7 +4539,9 @@ static void synaptics_rmi4_defer_probe(struct work_struct *work)

err_get_reg:
err_drm_init_wait:
	msm_drm_unregister_client(&rmi4_data->fb_notifier);
	if (active_panel)
		drm_panel_notifier_unregister(active_panel,
				&rmi4_data->fb_notifier);
	cancel_work_sync(&rmi4_data->rmi4_probe_work);
	destroy_workqueue(rmi4_data->rmi4_probe_wq);
	kfree(rmi4_data);
@@ -4576,7 +4581,9 @@ static int synaptics_rmi4_remove(struct platform_device *pdev)

	synaptics_rmi4_irq_enable(rmi4_data, false, false);

	msm_drm_unregister_client(&rmi4_data->fb_notifier);
	if (active_panel)
		drm_panel_notifier_unregister(active_panel,
				&rmi4_data->fb_notifier);

#ifdef USE_EARLYSUSPEND
	unregister_early_suspend(&rmi4_data->early_suspend);
@@ -4624,18 +4631,18 @@ static int synaptics_rmi4_dsi_panel_notifier_cb(struct notifier_block *self,
		unsigned long event, void *data)
{
	int transition;
	struct msm_drm_notifier *evdata = data;
	struct drm_panel_notifier *evdata = data;
	struct synaptics_rmi4_data *rmi4_data =
			container_of(self, struct synaptics_rmi4_data,
			fb_notifier);

	if (!evdata || (evdata->id != 0))
	if (!evdata)
		return 0;

	if (evdata && evdata->data && rmi4_data) {
		if (event == MSM_DRM_EARLY_EVENT_BLANK) {
		if (event == DRM_PANEL_EARLY_EVENT_BLANK) {
			transition = *(int *)evdata->data;
			if (transition == MSM_DRM_BLANK_POWERDOWN) {
			if (transition == DRM_PANEL_BLANK_POWERDOWN) {
				if (rmi4_data->initialized)
					synaptics_rmi4_suspend(
							&rmi4_data->pdev->dev);
@@ -4645,9 +4652,9 @@ static int synaptics_rmi4_dsi_panel_notifier_cb(struct notifier_block *self,
	}

	if (evdata && evdata->data && rmi4_data) {
		if (event == MSM_DRM_EVENT_BLANK) {
		if (event == DRM_PANEL_EVENT_BLANK) {
			transition = *(int *)evdata->data;
			if (transition == MSM_DRM_BLANK_UNBLANK) {
			if (transition == DRM_PANEL_BLANK_UNBLANK) {
				if (rmi4_data->initialized)
					synaptics_rmi4_resume(
							&rmi4_data->pdev->dev);
+4 −0
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@
#include <linux/earlysuspend.h>
#endif

#include <drm/drm_panel.h>

#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38))
#define KERNEL_ABOVE_2_6_38
#endif
@@ -133,6 +135,8 @@ enum exp_fn {
	RMI_LAST,
};

extern struct drm_panel *active_panel;

/*
 * struct synaptics_rmi4_fn_desc - function descriptor fields in PDT entry
 * @query_base_addr: base address for query registers
+28 −0
Original line number Diff line number Diff line
@@ -451,6 +451,30 @@ static int synaptics_rmi4_i2c_write(struct synaptics_rmi4_data *rmi4_data,
	return retval;
}

int check_dt(struct device_node *np)
{
	int i;
	int count;
	struct device_node *node;
	struct drm_panel *panel;

	count = of_count_phandle_with_args(np, "panel", NULL);
	if (count <= 0)
		return 0;

	for (i = 0; i < count; i++) {
		node = of_parse_phandle(np, "panel", i);
		panel = of_drm_find_panel(node);
		of_node_put(node);
		if (!IS_ERR(panel)) {
			active_panel = panel;
			return 0;
		}
	}

	return -ENODEV;
}

static struct synaptics_dsx_bus_access bus_access = {
	.type = BUS_I2C,
	.read = synaptics_rmi4_i2c_read,
@@ -466,6 +490,10 @@ static int synaptics_rmi4_i2c_probe(struct i2c_client *client,
		const struct i2c_device_id *dev_id)
{
	int retval;

	if (check_dt(client->dev.of_node))
		return -ENODEV;

	if (!i2c_check_functionality(client->adapter,
			I2C_FUNC_SMBUS_BYTE_DATA)) {
		dev_err(&client->dev,