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

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

Merge "input: touchscreen: synaptics_tcm: Fix Propagation"

parents 2420ab86 abab0968
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -1314,4 +1314,18 @@ source "drivers/input/touchscreen/st/Kconfig"

source "drivers/input/touchscreen/focaltech_touch/Kconfig"

config TOUCHSCREEN_SYNAPTICS_TCM
	bool "Synaptics TCM Touchscreen Driver"
	depends on I2C
	default y
	help
	  Say Y here if you have a Synaptics Touchscreen.

	  If unsure, say N.

	  To compile this driver as a module, choose M here: the
	  module will be called synaptics_tcm.

source "drivers/input/touchscreen/synaptics_tcm/Kconfig"

endif
+1 −0
Original line number Diff line number Diff line
@@ -112,3 +112,4 @@ obj-$(CONFIG_TOUCHSCREEN_RASPBERRYPI_FW) += raspberrypi-ts.o
obj-$(CONFIG_TOUCHSCREEN_IQS5XX)	+= iqs5xx.o
obj-$(CONFIG_TOUCHSCREEN_ST)	+= st/
obj-$(CONFIG_TOUCHSCREEN_FTS)	+= focaltech_touch/
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM)	+= synaptics_tcm/
+7 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
#
menuconfig TOUCHSCREEN_SYNAPTICS_TCM
	bool "Synaptics TCM touchscreen"
	default y
	help
	  Say Y here if you have a Synaptics TCM touchscreen connected
	  to your system.
@@ -41,6 +42,7 @@ endchoice
config TOUCHSCREEN_SYNAPTICS_TCM_CORE
	tristate "Synaptics TCM core module"
	depends on I2C || SPI_MASTER
	default y
	help
	  Say Y here to enable core functionality.

@@ -52,6 +54,7 @@ config TOUCHSCREEN_SYNAPTICS_TCM_CORE
config TOUCHSCREEN_SYNAPTICS_TCM_TOUCH
	tristate "Synaptics TCM touch module"
	depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
	default y
	help
	  Say Y here to enable support for touch reporting.

@@ -63,6 +66,7 @@ config TOUCHSCREEN_SYNAPTICS_TCM_TOUCH
config TOUCHSCREEN_SYNAPTICS_TCM_DEVICE
	tristate "Synaptics TCM device module"
	depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
	default y
	help
	  Say Y here to enable support for TCM device functionality.

@@ -85,6 +89,7 @@ config TOUCHSCREEN_SYNAPTICS_TCM_TESTING
config TOUCHSCREEN_SYNAPTICS_TCM_REFLASH
	tristate "Synaptics TCM reflash module"
	depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
	default y
	help
	  Say Y here to enable support for reflash functionality.

@@ -96,6 +101,7 @@ config TOUCHSCREEN_SYNAPTICS_TCM_REFLASH
config TOUCHSCREEN_SYNAPTICS_TCM_RECOVERY
	tristate "Synaptics TCM recovery module"
	depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
	default y
	help
	  Say Y here to enable support for recovery functionality.

@@ -118,6 +124,7 @@ config TOUCHSCREEN_SYNAPTICS_TCM_ZEROFLASH
config TOUCHSCREEN_SYNAPTICS_TCM_DIAGNOSTICS
	tristate "Synaptics TCM diagnostics module"
	depends on TOUCHSCREEN_SYNAPTICS_TCM_CORE
	default y
	help
	  Say Y here to enable support for diagnostics functionality.

+141 −83
Original line number Diff line number Diff line
@@ -50,6 +50,16 @@

/* #define FORCE_RUN_APPLICATION_FIRMWARE */

#define SYNA_VTG_MIN_UV	2800000

#define SYNA_VTG_MAX_UV	3300000

#define SYNA_LOAD_MAX_UA 30000

#define SYNA_VDD_VTG_MIN_UV 1800000

#define SYNA_VDD_VTG_MAX_UV 2000000

#define NOTIFIER_PRIORITY 2

#define RESPONSE_TIMEOUT_MS 3000
@@ -1911,6 +1921,22 @@ static int syna_tcm_enable_regulator(struct syna_tcm_hcd *tcm_hcd, bool en)
	}

	if (tcm_hcd->bus_reg) {
		retval = regulator_set_voltage(tcm_hcd->bus_reg,
				SYNA_VDD_VTG_MIN_UV, SYNA_VDD_VTG_MAX_UV);
		if (retval) {
			LOGE(tcm_hcd->pdev->dev.parent,
				"set bus regulator voltage failed\n");
			goto exit;
		}

		retval = regulator_set_load(tcm_hcd->bus_reg,
						SYNA_LOAD_MAX_UA);
		if (retval) {
			LOGE(tcm_hcd->pdev->dev.parent,
				"set bus regulator load failed\n");
			goto exit;
		}

		retval = regulator_enable(tcm_hcd->bus_reg);
		if (retval < 0) {
			LOGE(tcm_hcd->pdev->dev.parent,
@@ -1920,6 +1946,23 @@ static int syna_tcm_enable_regulator(struct syna_tcm_hcd *tcm_hcd, bool en)
	}

	if (tcm_hcd->pwr_reg) {
		if (regulator_count_voltages(tcm_hcd->pwr_reg) > 0) {
			retval = regulator_set_voltage(tcm_hcd->pwr_reg,
				SYNA_VTG_MIN_UV, SYNA_VTG_MAX_UV);
			if (retval) {
				LOGE(tcm_hcd->pdev->dev.parent,
					"set power regulator voltage failed\n");
				goto disable_bus_reg;
			}
			retval = regulator_set_load(tcm_hcd->pwr_reg,
							SYNA_LOAD_MAX_UA);
			if (retval) {
				LOGE(tcm_hcd->pdev->dev.parent,
					"set power regulator load failed\n");
				goto disable_bus_reg;
			}
		}

		retval = regulator_enable(tcm_hcd->pwr_reg);
		if (retval < 0) {
			LOGE(tcm_hcd->pdev->dev.parent,
@@ -1932,12 +1975,22 @@ static int syna_tcm_enable_regulator(struct syna_tcm_hcd *tcm_hcd, bool en)
	return 0;

disable_pwr_reg:
	if (tcm_hcd->pwr_reg)
	if (tcm_hcd->pwr_reg) {
		if (regulator_count_voltages(tcm_hcd->pwr_reg) > 0) {
			regulator_set_load(tcm_hcd->pwr_reg, 0);
			regulator_set_voltage(tcm_hcd->pwr_reg, 0,
							SYNA_VTG_MAX_UV);
		}
		regulator_disable(tcm_hcd->pwr_reg);
	}

disable_bus_reg:
	if (tcm_hcd->bus_reg)
	if (tcm_hcd->bus_reg) {
		regulator_set_load(tcm_hcd->bus_reg, 0);
		regulator_set_voltage(tcm_hcd->bus_reg, 0,
						SYNA_VDD_VTG_MAX_UV);
		regulator_disable(tcm_hcd->bus_reg);
	}

exit:
	return retval;
@@ -2840,6 +2893,9 @@ static int syna_tcm_resume(struct device *dev)

	if (!tcm_hcd->init_okay)
		syna_tcm_deferred_probe(dev);

	if (!tcm_hcd->in_suspend)
		return 0;
	else {
		if (tcm_hcd->irq_enabled) {
			tcm_hcd->watchdog.run = false;
@@ -2848,8 +2904,11 @@ static int syna_tcm_resume(struct device *dev)
		}
	}

	if (!tcm_hcd->in_suspend)
		return 0;
	retval = syna_tcm_enable_regulator(tcm_hcd, true);
	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to enable regulators\n");
	}

	retval = pinctrl_select_state(
			tcm_hcd->ts_pinctrl,
@@ -2945,6 +3004,7 @@ static int syna_tcm_suspend(struct device *dev)
{
	struct syna_tcm_module_handler *mod_handler;
	struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
	int retval;

	if (tcm_hcd->in_suspend || !tcm_hcd->init_okay)
		return 0;
@@ -2967,11 +3027,17 @@ static int syna_tcm_suspend(struct device *dev)
		}
	}

	retval = syna_tcm_enable_regulator(tcm_hcd, false);
	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to disable regulators\n");
	}

	mutex_unlock(&mod_pool.mutex);

	tcm_hcd->in_suspend = true;

	return 0;
	return retval;
}
#endif

@@ -3040,21 +3106,18 @@ static int syna_tcm_fb_notifier_cb(struct notifier_block *nb,
		unsigned long action, void *data)
{
	int retval = 0;
	int *transition;
	struct msm_drm_notifier *evdata = data;
	int transition;
	struct drm_panel_notifier *evdata = data;
	struct syna_tcm_hcd *tcm_hcd =
			container_of(nb, struct syna_tcm_hcd, fb_notifier);

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

	if (!evdata->data || !tcm_hcd)
	if (!evdata)
		return 0;

	transition = (int *) evdata->data;
	transition = *(int *)evdata->data;

	if (atomic_read(&tcm_hcd->firmware_flashing)
		&& *transition == MSM_DRM_BLANK_POWERDOWN) {
		&& transition == DRM_PANEL_BLANK_POWERDOWN) {
		retval = wait_event_interruptible_timeout(tcm_hcd->reflash_wq,
				!atomic_read(&tcm_hcd->firmware_flashing),
				msecs_to_jiffies(RESPONSE_TIMEOUT_MS));
@@ -3066,21 +3129,21 @@ static int syna_tcm_fb_notifier_cb(struct notifier_block *nb,
		}
	}

	if (action == MSM_DRM_EARLY_EVENT_BLANK &&
			*transition == MSM_DRM_BLANK_POWERDOWN)
	if (action == DRM_PANEL_EARLY_EVENT_BLANK &&
			transition == DRM_PANEL_BLANK_POWERDOWN)
		retval = syna_tcm_early_suspend(&tcm_hcd->pdev->dev);
	else if (action == MSM_DRM_EVENT_BLANK) {
		if (*transition == MSM_DRM_BLANK_POWERDOWN) {
	else if (action == DRM_PANEL_EVENT_BLANK) {
		if (transition == DRM_PANEL_BLANK_POWERDOWN) {
			retval = syna_tcm_suspend(&tcm_hcd->pdev->dev);
			tcm_hcd->fb_ready = 0;
		} else if (*transition == MSM_DRM_BLANK_UNBLANK) {
		} else if (transition == DRM_PANEL_BLANK_UNBLANK) {
#ifndef RESUME_EARLY_UNBLANK
			retval = syna_tcm_resume(&tcm_hcd->pdev->dev);
			tcm_hcd->fb_ready++;
#endif
		}
	} else if (action == MSM_DRM_EARLY_EVENT_BLANK &&
			*transition == MSM_DRM_BLANK_UNBLANK) {
	} else if (action == DRM_PANEL_EARLY_EVENT_BLANK &&
			transition == DRM_PANEL_BLANK_UNBLANK) {
#ifdef RESUME_EARLY_UNBLANK
		retval = syna_tcm_resume(&tcm_hcd->pdev->dev);
		tcm_hcd->fb_ready++;
@@ -3249,6 +3312,7 @@ static int syna_tcm_probe(struct platform_device *pdev)
	struct syna_tcm_hcd *tcm_hcd;
	const struct syna_tcm_board_data *bdata;
	const struct syna_tcm_hw_interface *hw_if;
	struct drm_panel *active_panel = tcm_get_panel();

	hw_if = pdev->dev.platform_data;
	if (!hw_if) {
@@ -3356,10 +3420,30 @@ static int syna_tcm_probe(struct platform_device *pdev)
		goto err_get_regulator;
	}

	retval = syna_tcm_enable_regulator(tcm_hcd, true);
	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to enable regulators\n");
		goto err_enable_regulator;
	}

	retval = syna_tcm_config_gpio(tcm_hcd);
	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to configure GPIO's\n");
		goto err_config_gpio;
	}

	retval = synaptics_tcm_pinctrl_init(tcm_hcd);
	if (!retval && tcm_hcd->ts_pinctrl) {
		retval = pinctrl_select_state(
				tcm_hcd->ts_pinctrl,
				tcm_hcd->pinctrl_state_active);
		if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent, "Failed to init pinctrl\n");
		goto err_pinctrl_init;
			LOGE(tcm_hcd->pdev->dev.parent,
					"%s: Failed to select %s pinstate %d\n",
					__func__, PINCTRL_STATE_ACTIVE, retval);
		}
	}

	sysfs_dir = kobject_create_and_add(PLATFORM_DRIVER_NAME,
@@ -3405,11 +3489,17 @@ static int syna_tcm_probe(struct platform_device *pdev)

#ifdef CONFIG_DRM
	tcm_hcd->fb_notifier.notifier_call = syna_tcm_fb_notifier_cb;
	retval = msm_drm_register_client(&tcm_hcd->fb_notifier);
	if (active_panel) {
		retval = drm_panel_notifier_register(active_panel,
				&tcm_hcd->fb_notifier);
		if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to register DRM notifier client\n");
			dev_err(&pdev->dev,
					"%s: Failed to register fb notifier client\n",
					__func__);
			goto err_drm_reg;
		}
	}

#elif CONFIG_FB
	tcm_hcd->fb_notifier.notifier_call = syna_tcm_fb_notifier_cb;
	retval = fb_register_client(&tcm_hcd->fb_notifier);
@@ -3452,7 +3542,9 @@ static int syna_tcm_probe(struct platform_device *pdev)

err_create_run_kthread:
#ifdef CONFIG_DRM
	msm_drm_unregister_client(&tcm_hcd->fb_notifier);
	if (active_panel)
		drm_panel_notifier_unregister(active_panel,
				&tcm_hcd->fb_notifier);
#elif CONFIG_FB
	fb_unregister_client(&tcm_hcd->fb_notifier);
#endif
@@ -3475,7 +3567,21 @@ static int syna_tcm_probe(struct platform_device *pdev)
	kobject_put(tcm_hcd->sysfs_dir);

err_sysfs_create_dir:
err_pinctrl_init:
	if (bdata->irq_gpio >= 0)
		syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0);

	if (bdata->power_gpio >= 0)
		syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0);

	if (bdata->reset_gpio >= 0)
		syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio, false, 0, 0);

err_config_gpio:
	syna_tcm_enable_regulator(tcm_hcd, false);

err_enable_regulator:
	syna_tcm_get_regulator(tcm_hcd, false);

err_get_regulator:
	device_init_wakeup(&pdev->dev, 0);

@@ -3487,6 +3593,7 @@ static int syna_tcm_probe(struct platform_device *pdev)
	RELEASE_BUFFER(tcm_hcd->out);
	RELEASE_BUFFER(tcm_hcd->in);

err_drm_reg:
	kfree(tcm_hcd);

	return retval;
@@ -3495,33 +3602,8 @@ static int syna_tcm_probe(struct platform_device *pdev)
static int syna_tcm_deferred_probe(struct device *dev)
{
	int retval;
	const struct syna_tcm_board_data *bdata;
	struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);

	retval = pinctrl_select_state(
			tcm_hcd->ts_pinctrl,
			tcm_hcd->pinctrl_state_active);

	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to pinctrl_select_state\n");
		goto err_pinctrl_select_state;
	}

	retval = syna_tcm_enable_regulator(tcm_hcd, true);
	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to enable regulators\n");
		goto err_enable_regulator;
	}

	retval = syna_tcm_config_gpio(tcm_hcd);
	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
				"Failed to configure GPIO's\n");
		goto err_config_gpio;
	}

	retval = tcm_hcd->enable_irq(tcm_hcd, true, NULL);
	if (retval < 0) {
		LOGE(tcm_hcd->pdev->dev.parent,
@@ -3552,27 +3634,6 @@ static int syna_tcm_deferred_probe(struct device *dev)
#endif
err_enable_irq:

err_config_gpio:
	syna_tcm_enable_regulator(tcm_hcd, false);

err_enable_regulator:
	syna_tcm_get_regulator(tcm_hcd, false);

err_pinctrl_select_state:
	if (!tcm_hcd->hw_if || !tcm_hcd->hw_if->bdata)
		return -EINVAL;

	bdata = tcm_hcd->hw_if->bdata;

	if (bdata->irq_gpio >= 0)
		syna_tcm_set_gpio(tcm_hcd, bdata->irq_gpio, false, 0, 0);

	if (bdata->power_gpio >= 0)
		syna_tcm_set_gpio(tcm_hcd, bdata->power_gpio, false, 0, 0);

	if (bdata->reset_gpio >= 0)
		syna_tcm_set_gpio(tcm_hcd, bdata->reset_gpio, false, 0, 0);

	return retval;
}

@@ -3584,6 +3645,7 @@ static int syna_tcm_remove(struct platform_device *pdev)
	struct syna_tcm_module_handler *tmp_handler;
	struct syna_tcm_hcd *tcm_hcd = platform_get_drvdata(pdev);
	const struct syna_tcm_board_data *bdata = tcm_hcd->hw_if->bdata;
	struct drm_panel *active_panel = tcm_get_panel();

	mutex_lock(&mod_pool.mutex);

@@ -3624,7 +3686,9 @@ static int syna_tcm_remove(struct platform_device *pdev)
	kthread_stop(tcm_hcd->notifier_thread);

#ifdef CONFIG_DRM
	msm_drm_unregister_client(&tcm_hcd->fb_notifier);
	if (active_panel)
		drm_panel_notifier_unregister(active_panel,
				&tcm_hcd->fb_notifier);
#elif CONFIG_FB
	fb_unregister_client(&tcm_hcd->fb_notifier);
#endif
@@ -3668,11 +3732,6 @@ static int syna_tcm_remove(struct platform_device *pdev)
	return 0;
}

static void syna_tcm_shutdown(struct platform_device *pdev)
{
	syna_tcm_remove(pdev);
}

#ifdef CONFIG_PM
static const struct dev_pm_ops syna_tcm_dev_pm_ops = {
#if !defined(CONFIG_DRM) && !defined(CONFIG_FB)
@@ -3692,7 +3751,6 @@ static struct platform_driver syna_tcm_driver = {
	},
	.probe = syna_tcm_probe,
	.remove = syna_tcm_remove,
	.shutdown = syna_tcm_shutdown,
};

static int __init syna_tcm_module_init(void)
@@ -3713,7 +3771,7 @@ static void __exit syna_tcm_module_exit(void)
	syna_tcm_bus_exit();
}

module_init(syna_tcm_module_init);
late_initcall(syna_tcm_module_init);
module_exit(syna_tcm_module_exit);

MODULE_AUTHOR("Synaptics, Inc.");
+3 −1
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@
#include <linux/slab.h>
#include <linux/input/synaptics_tcm.h>
#ifdef CONFIG_DRM
#include <linux/msm_drm_notify.h>
#include <drm/drm_panel.h>
#elif CONFIG_FB
#include <linux/fb.h>
#include <linux/notifier.h>
@@ -522,6 +522,8 @@ struct syna_tcm_hw_interface {
	const struct syna_tcm_bus_io *bus_io;
};

struct drm_panel *tcm_get_panel(void);

int syna_tcm_bus_init(void);

void syna_tcm_bus_exit(void);
Loading