Loading drivers/input/touchscreen/Kconfig +14 −0 Original line number Diff line number Diff line Loading @@ -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 drivers/input/touchscreen/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -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/ drivers/input/touchscreen/synaptics_tcm/Kconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading drivers/input/touchscreen/synaptics_tcm/synaptics_tcm_core.c +141 −83 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading @@ -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, Loading @@ -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; Loading Loading @@ -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; Loading @@ -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, Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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)); Loading @@ -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++; Loading Loading @@ -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) { Loading Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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 Loading @@ -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); Loading @@ -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; Loading @@ -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, Loading Loading @@ -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; } Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) Loading @@ -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."); Loading drivers/input/touchscreen/synaptics_tcm/synaptics_tcm_core.h +3 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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 Loading
drivers/input/touchscreen/Kconfig +14 −0 Original line number Diff line number Diff line Loading @@ -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
drivers/input/touchscreen/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -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/
drivers/input/touchscreen/synaptics_tcm/Kconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading @@ -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. Loading
drivers/input/touchscreen/synaptics_tcm/synaptics_tcm_core.c +141 −83 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading @@ -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, Loading @@ -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; Loading Loading @@ -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; Loading @@ -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, Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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)); Loading @@ -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++; Loading Loading @@ -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) { Loading Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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 Loading @@ -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); Loading @@ -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; Loading @@ -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, Loading Loading @@ -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; } Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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) Loading @@ -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) Loading @@ -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."); Loading
drivers/input/touchscreen/synaptics_tcm/synaptics_tcm_core.h +3 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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