diff options
-rw-r--r-- | Kbuild | 1 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | goodix_brl_hw.c | 2 | ||||
-rw-r--r-- | goodix_ts_core.c | 88 | ||||
-rw-r--r-- | goodix_ts_core.h | 6 | ||||
-rw-r--r-- | touch_apis.c | 4 | ||||
-rw-r--r-- | touch_apis.h | 8 | ||||
-rw-r--r-- | touch_pm.c | 288 | ||||
-rw-r--r-- | touch_pm.h | 87 |
9 files changed, 56 insertions, 430 deletions
@@ -12,5 +12,4 @@ goodix_brl_touch-objs += \ goodix_ts_utils.o \ goodix_ts_proc.o \ touch_apis.o \ - touch_pm.o \ touch_mf_mode.o @@ -4,7 +4,7 @@ M ?= $(shell pwd) KBUILD_OPTIONS += CONFIG_TOUCHSCREEN_GOODIX_BRL=m EXTRA_CFLAGS += -DDYNAMIC_DEBUG_MODULE EXTRA_CFLAGS += -DCONFIG_TOUCHSCREEN_GOODIX_BRL_SPI -EXTRA_CFLAGS += -DCONFIG_TOUCHSCREEN_PM +EXTRA_CFLAGS += -DCONFIG_GTI_PM #EXTRA_CFLAGS += -DCONFIG_TOUCHSCREEN_MOTION_FILTER #EXTRA_CFLAGS += -DCONFIG_TOUCHSCREEN_TBN EXTRA_CFLAGS += -DCONFIG_GOOG_TOUCH_INTERFACE diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index ce5451c..f0d6290 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -264,7 +264,7 @@ int brl_suspend(struct goodix_ts_core *cd) int brl_resume(struct goodix_ts_core *cd) { u32 cmd_reg = cd->ic_info.misc.cmd_addr; - u8 cmd_buf[] = { 0x00, 0x00, 0x05, 0xC4, 0x00, 0xC9, 0x00 }; + u8 cmd_buf[] = { 0x00, 0x00, 0x04, 0xA7, 0xAB, 0x00 }; int retry = 20; u8 rcv_buf[2]; diff --git a/goodix_ts_core.c b/goodix_ts_core.c index 365752b..12c2fd8 100644 --- a/goodix_ts_core.c +++ b/goodix_ts_core.c @@ -35,6 +35,8 @@ struct goodix_module goodix_modules; int core_module_prob_sate = CORE_MODULE_UNPROBED; +static const struct dev_pm_ops dev_pm_ops; + static int goodix_send_ic_config(struct goodix_ts_core *cd, int type); /** * __do_register_ext_module - register external module @@ -826,23 +828,22 @@ int set_sensing_enabled(struct device *dev, bool enabled) return 0; } -bool get_wake_lock_state(struct device *dev, enum tpm_wakelock_type type) +bool get_wake_lock_state(struct device *dev, enum gti_pm_wakelock_type type) { struct goodix_ts_core *cd = dev_get_drvdata(dev); - return tpm_get_lock_state(&cd->tpm, type); + return goog_pm_wake_check_locked(cd->gti, type); } int set_wake_lock_state( - struct device *dev, enum tpm_wakelock_type type, bool locked) + struct device *dev, enum gti_pm_wakelock_type type, bool locked) { struct goodix_ts_core *cd = dev_get_drvdata(dev); int ret = 0; - if (locked) { - ret = tpm_lock_wakelock(&cd->tpm, type); - } else { - ret = tpm_unlock_wakelock(&cd->tpm, type); - } + if (locked) + ret = goog_pm_wake_lock(cd->gti, type, false); + else + ret = goog_pm_wake_unlock(cd->gti, type); return ret; } @@ -850,7 +851,18 @@ int set_wake_lock_state( static int gti_default_handler(void *private_data, enum gti_cmd_type cmd_type, struct gti_union_cmd_data *cmd) { - return -ESRCH; + int err = 0; + + switch (cmd_type) { + case GTI_CMD_NOTIFY_DISPLAY_STATE: + case GTI_CMD_NOTIFY_DISPLAY_VREFRESH: + err = -EOPNOTSUPP; + break; + default: + err = -ESRCH; + break; + } + return err; } static int get_mutual_sensor_data( @@ -1502,9 +1514,8 @@ static irqreturn_t goodix_ts_threadirq_func(int irq, void *data) cpu_latency_qos_update_request(&core_data->pm_qos_req, 100 /* usec */); -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) - tpm_lock_wakelock(&core_data->tpm, - TPM_WAKELOCK_TYPE_IRQ | TPM_WAKELOCK_TYPE_NON_WAKE_UP); +#if IS_ENABLED(CONFIG_GTI_PM) + goog_pm_wake_lock(core_data->gti, GTI_PM_WAKELOCK_TYPE_IRQ, true); #endif ts_esd->irq_status = true; @@ -1518,9 +1529,8 @@ static irqreturn_t goodix_ts_threadirq_func(int irq, void *data) ret = ext_module->funcs->irq_event(core_data, ext_module); if (ret == EVT_CANCEL_IRQEVT) { mutex_unlock(&goodix_modules.mutex); -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) - tpm_unlock_wakelock( - &core_data->tpm, TPM_WAKELOCK_TYPE_IRQ); +#if IS_ENABLED(CONFIG_GTI_PM) + goog_pm_wake_unlock(core_data->gti, GTI_PM_WAKELOCK_TYPE_IRQ); #endif return IRQ_HANDLED; } @@ -1555,8 +1565,8 @@ static irqreturn_t goodix_ts_threadirq_func(int irq, void *data) hw_ops->after_event_handler(core_data); } -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) - tpm_unlock_wakelock(&core_data->tpm, TPM_WAKELOCK_TYPE_IRQ); +#if IS_ENABLED(CONFIG_GTI_PM) + goog_pm_wake_unlock(core_data->gti, GTI_PM_WAKELOCK_TYPE_IRQ); #endif cpu_latency_qos_update_request(&core_data->pm_qos_req, PM_QOS_DEFAULT_VALUE); @@ -2209,7 +2219,7 @@ static int goodix_ts_resume(struct goodix_ts_core *core_data) /* reset device or power on*/ if (core_data->board_data.sleep_enable) - hw_ops->resume(core_data); + hw_ops->reset(core_data, GOODIX_NORMAL_RESET_DELAY_MS); else goodix_ts_power_on(core_data); @@ -2360,19 +2370,6 @@ int goodix_ts_stage2_init(struct goodix_ts_core *cd) cpu_latency_qos_add_request(&cd->pm_qos_req, PM_QOS_DEFAULT_VALUE); -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) - cd->tpm.pdev = cd->pdev; -#ifdef CONFIG_OF - cd->tpm.of_node = cd->bus->dev->of_node; -#endif - cd->tpm.resume = goodix_ts_pm_resume; - cd->tpm.suspend = goodix_ts_pm_suspend; - ret = tpm_register_notification(&cd->tpm); - if (ret < 0) { - ts_info("Failed to egister touch pm"); - goto err_init_tpm; - } -#endif #if IS_ENABLED(CONFIG_FB) cd->fb_notifier.notifier_call = goodix_ts_fb_notifier_callback; if (fb_register_client(&cd->fb_notifier)) @@ -2429,6 +2426,14 @@ int goodix_ts_stage2_init(struct goodix_ts_core *cd) cd->gti = goog_touch_interface_probe( cd, cd->bus->dev, cd->input_dev, gti_default_handler, options); + +#if IS_ENABLED(CONFIG_GTI_PM) + ret = goog_pm_register_notification(cd->gti, &dev_pm_ops); + if (ret < 0) { + ts_info("Failed to egister gti pm"); + goto err_init_tpm; + } +#endif #endif /* create procfs files */ @@ -2486,6 +2491,10 @@ err_init_gesture: err_init_esd: goodix_ts_procfs_exit(cd); err_init_procfs: +#if IS_ENABLED(CONFIG_GTI_PM) + goog_pm_unregister_notification(cd->gti); +err_init_tpm: +#endif touch_apis_deinit(&cd->pdev->dev); err_init_apis: goodix_ts_sysfs_exit(cd); @@ -2493,10 +2502,6 @@ err_init_sysfs: #if IS_ENABLED(CONFIG_FB) fb_unregister_client(&cd->fb_notifier); #endif -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) - tpm_unregister_notification(&cd->tpm); -err_init_tpm: -#endif cpu_latency_qos_remove_request(&cd->pm_qos_req); goodix_ts_pen_dev_remove(cd); err_finger: @@ -2693,6 +2698,7 @@ static int goodix_ts_probe(struct platform_device *pdev) core_data->pdev = pdev; core_data->bus = bus_interface; platform_set_drvdata(pdev, core_data); + dev_set_drvdata(bus_interface->dev, core_data); ret = goodix_pinctrl_init(core_data); if (ret) { @@ -2782,9 +2788,6 @@ static int goodix_ts_remove(struct platform_device *pdev) gesture_module_exit(); inspect_module_exit(); hw_ops->irq_enable(core_data, false); -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) - tpm_unregister_notification(&core_data->tpm); -#endif #if IS_ENABLED(CONFIG_FB) fb_unregister_client(&core_data->fb_notifier); #endif @@ -2797,6 +2800,9 @@ static int goodix_ts_remove(struct platform_device *pdev) goodix_ts_pen_dev_remove(core_data); goodix_ts_sysfs_exit(core_data); #if IS_ENABLED(CONFIG_GOOG_TOUCH_INTERFACE) +#if IS_ENABLED(CONFIG_GTI_PM) + goog_pm_unregister_notification(core_data->gti); +#endif goog_touch_interface_remove(core_data->gti); #endif touch_apis_deinit(&core_data->pdev->dev); @@ -2809,11 +2815,8 @@ static int goodix_ts_remove(struct platform_device *pdev) #if IS_ENABLED(CONFIG_PM) static const struct dev_pm_ops dev_pm_ops = { -#if !IS_ENABLED(CONFIG_FB) && !IS_ENABLED(CONFIG_HAS_EARLYSUSPEND) && \ - !IS_ENABLED(CONFIG_TOUCHSCREEN_PM) .suspend = goodix_ts_pm_suspend, .resume = goodix_ts_pm_resume, -#endif }; #endif @@ -2827,8 +2830,11 @@ static struct platform_driver goodix_ts_driver = { .name = GOODIX_CORE_DRIVER_NAME, .owner = THIS_MODULE, #if IS_ENABLED(CONFIG_PM) +#if !IS_ENABLED(CONFIG_FB) && !IS_ENABLED(CONFIG_HAS_EARLYSUSPEND) && \ + !IS_ENABLED(CONFIG_GTI_PM) .pm = &dev_pm_ops, #endif +#endif }, .probe = goodix_ts_probe, .remove = goodix_ts_remove, diff --git a/goodix_ts_core.h b/goodix_ts_core.h index 4c536c1..74d1ec0 100644 --- a/goodix_ts_core.h +++ b/goodix_ts_core.h @@ -41,9 +41,6 @@ #include <linux/notifier.h> #endif #include "touch_apis.h" -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) -#include "touch_pm.h" -#endif #if IS_ENABLED(CONFIG_TOUCHSCREEN_MOTION_FILTER) #include "touch_mf_mode.h" #endif @@ -669,9 +666,6 @@ struct goodix_ts_core { #if IS_ENABLED(CONFIG_FB) struct notifier_block fb_notifier; #endif -#if IS_ENABLED(CONFIG_TOUCHSCREEN_PM) - struct touch_pm tpm; -#endif #if IS_ENABLED(CONFIG_TOUCHSCREEN_MOTION_FILTER) struct touch_mf tmf; #endif diff --git a/touch_apis.c b/touch_apis.c index 319a043..8caa94d 100644 --- a/touch_apis.c +++ b/touch_apis.c @@ -301,7 +301,7 @@ static ssize_t wake_lock_show( if (apis->get_wake_lock_state != NULL) { locked = apis->get_wake_lock_state( - dev, TPM_WAKELOCK_TYPE_FORCE_ACTIVE); + dev, GTI_PM_WAKELOCK_TYPE_FORCE_ACTIVE); ret = snprintf(buf, PAGE_SIZE, "result: %s\n", locked ? "locked" : "unlocked"); } else { @@ -329,7 +329,7 @@ static ssize_t wake_lock_store(struct device *dev, if (apis->set_wake_lock_state != NULL) { ret = apis->set_wake_lock_state( - dev, TPM_WAKELOCK_TYPE_FORCE_ACTIVE, locked); + dev, GTI_PM_WAKELOCK_TYPE_FORCE_ACTIVE, locked); if (ret < 0) { return ret; } diff --git a/touch_apis.h b/touch_apis.h index 18b7528..dda4f89 100644 --- a/touch_apis.h +++ b/touch_apis.h @@ -11,7 +11,9 @@ #if IS_ENABLED(CONFIG_TOUCHSCREEN_MOTION_FILTER) #include "touch_mf_mode.h" #endif -#include "touch_pm.h" +#if IS_ENABLED(CONFIG_GOOG_TOUCH_INTERFACE) +#include <goog_touch_interface.h> +#endif enum scan_mode { SCAN_MODE_AUTO = 0, @@ -47,9 +49,9 @@ struct touch_apis_data { int (*set_scan_mode)(struct device *dev, enum scan_mode mode); int (*set_sensing_enabled)(struct device *dev, bool enabled); bool (*get_wake_lock_state)( - struct device *dev, enum tpm_wakelock_type type); + struct device *dev, enum gti_pm_wakelock_type type); int (*set_wake_lock_state)( - struct device *dev, enum tpm_wakelock_type type, bool locked); + struct device *dev, enum gti_pm_wakelock_type type, bool locked); }; extern int touch_apis_init(struct device *dev, struct touch_apis_data *data); diff --git a/touch_pm.c b/touch_pm.c deleted file mode 100644 index d9a9d87..0000000 --- a/touch_pm.c +++ /dev/null @@ -1,288 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Sysfs APIs for Google Pixel devices. - * - * Copyright 2022 Google LLC. - */ - -#include "touch_pm.h" - -struct drm_connector *tpm_get_bridge_connector(struct drm_bridge *bridge) -{ - struct drm_connector *connector; - struct drm_connector_list_iter conn_iter; - - drm_connector_list_iter_begin(bridge->dev, &conn_iter); - drm_for_each_connector_iter(connector, &conn_iter) - { - if (connector->encoder == bridge->encoder) - break; - } - drm_connector_list_iter_end(&conn_iter); - return connector; -} - -static bool tpm_bridge_is_lp_mode(struct drm_connector *connector) -{ - if (connector && connector->state) { - struct exynos_drm_connector_state *s = - to_exynos_connector_state(connector->state); - return s->exynos_mode.is_lp_mode; - } - return false; -} - -static void tpm_panel_bridge_enable(struct drm_bridge *bridge) -{ - struct touch_pm *tpm = - container_of(bridge, struct touch_pm, panel_bridge); - - pr_debug("%s\n", __func__); - if (!tpm->is_panel_lp_mode) - tpm_lock_wakelock(tpm, TPM_WAKELOCK_TYPE_SCREEN_ON); -} - -static void tpm_panel_bridge_disable(struct drm_bridge *bridge) -{ - struct touch_pm *tpm = - container_of(bridge, struct touch_pm, panel_bridge); - - if (bridge->encoder && bridge->encoder->crtc) { - const struct drm_crtc_state *crtc_state = - bridge->encoder->crtc->state; - - if (drm_atomic_crtc_effectively_active(crtc_state)) - return; - } - - pr_debug("%s\n", __func__); - tpm_unlock_wakelock(tpm, TPM_WAKELOCK_TYPE_SCREEN_ON); -} - -static void tpm_panel_bridge_mode_set(struct drm_bridge *bridge, - const struct drm_display_mode *mode, - const struct drm_display_mode *adjusted_mode) -{ - struct touch_pm *tpm = - container_of(bridge, struct touch_pm, panel_bridge); - - pr_debug("%s\n", __func__); - - if (!tpm->connector || !tpm->connector->state) { - pr_info("%s: Get bridge connector.\n", __func__); - tpm->connector = tpm_get_bridge_connector(bridge); - } - - tpm->is_panel_lp_mode = tpm_bridge_is_lp_mode(tpm->connector); - if (tpm->is_panel_lp_mode) - tpm_unlock_wakelock(tpm, TPM_WAKELOCK_TYPE_SCREEN_ON); - else - tpm_lock_wakelock(tpm, TPM_WAKELOCK_TYPE_SCREEN_ON); -} - -static const struct drm_bridge_funcs panel_bridge_funcs = { - .enable = tpm_panel_bridge_enable, - .disable = tpm_panel_bridge_disable, - .mode_set = tpm_panel_bridge_mode_set, -}; - -static int tpm_register_panel_bridge(struct touch_pm *tpm) -{ -#ifdef CONFIG_OF - tpm->panel_bridge.of_node = tpm->of_node; -#endif - tpm->panel_bridge.funcs = &panel_bridge_funcs; - drm_bridge_add(&tpm->panel_bridge); - return 0; -} - -static void tpm_unregister_panel_bridge(struct drm_bridge *bridge) -{ - struct drm_bridge *node; - - drm_bridge_remove(bridge); - - if (!bridge->dev) /* not attached */ - return; - - drm_modeset_lock(&bridge->dev->mode_config.connection_mutex, NULL); - list_for_each_entry(node, &bridge->encoder->bridge_chain, - chain_node) if (node == bridge) - { - if (bridge->funcs->detach) - bridge->funcs->detach(bridge); - list_del(&bridge->chain_node); - break; - } - drm_modeset_unlock(&bridge->dev->mode_config.connection_mutex); - bridge->dev = NULL; -} - -int tpm_lock_wakelock(struct touch_pm *tpm, enum tpm_wakelock_type type) -{ - int ret = 0; - int lock = type & TPM_WAKELOCK_TYPE_LOCK_MASK; - bool wait_resume = false; - - mutex_lock(&tpm->lock_mutex); - - if (tpm->locks & lock) { - dev_dbg(&tpm->pdev->dev, - "unexpectedly lock: locks=0x%04X, lock=0x%04X\n", - tpm->locks, lock); - mutex_unlock(&tpm->lock_mutex); - return -EINVAL; - } - - /* - * If NON_WAKE_UP is set and the pm is suspend, we should ignore it. - * For example, IRQs should only keep the bus active. IRQs received - * while the pm is suspend should be ignored. - */ - if (type & TPM_WAKELOCK_TYPE_NON_WAKE_UP && tpm->locks == 0) { - mutex_unlock(&tpm->lock_mutex); - return -EAGAIN; - } - - tpm->locks |= lock; - - if ((type & TPM_WAKELOCK_TYPE_NON_WAKE_UP) != 0) { - mutex_unlock(&tpm->lock_mutex); - return ret; - } - - /* - * When triggering a wake, wait up to one second to resume. - * SCREEN_ON does not need to wait. - */ - if (lock != TPM_WAKELOCK_TYPE_SCREEN_ON) { - wait_resume = true; - } - - mutex_unlock(&tpm->lock_mutex); - - /* Complete or cancel any outstanding transitions */ - cancel_work_sync(&tpm->suspend_work); - cancel_work_sync(&tpm->resume_work); - queue_work(tpm->event_wq, &tpm->resume_work); - - if (wait_resume) { - wait_for_completion_timeout(&tpm->bus_resumed, HZ); - if (tpm->pwr_state != TPM_PWR_ON) { - dev_err(&tpm->pdev->dev, - "Failed to wake the touch bus.\n"); - ret = -ETIMEDOUT; - } - } - - return ret; -} - -int tpm_unlock_wakelock(struct touch_pm *tpm, enum tpm_wakelock_type type) -{ - int ret = 0; - int lock = type & TPM_WAKELOCK_TYPE_LOCK_MASK; - - mutex_lock(&tpm->lock_mutex); - - if (!(tpm->locks & lock)) { - dev_dbg(&tpm->pdev->dev, - "unexpectedly unlock: locks=0x%04X, lock=0x%04X\n", - tpm->locks, lock); - mutex_unlock(&tpm->lock_mutex); - return -EINVAL; - } - - tpm->locks &= ~lock; - - if (tpm->locks == 0) { - mutex_unlock(&tpm->lock_mutex); - /* Complete or cancel any outstanding transitions */ - cancel_work_sync(&tpm->suspend_work); - cancel_work_sync(&tpm->resume_work); - - mutex_lock(&tpm->lock_mutex); - if (tpm->locks == 0) - queue_work(tpm->event_wq, &tpm->suspend_work); - } - mutex_unlock(&tpm->lock_mutex); - - return ret; -} - -bool tpm_get_lock_state(struct touch_pm *tpm, enum tpm_wakelock_type type) -{ - return tpm->locks & type ? true : false; -} - -int tpm_get_lock_states(struct touch_pm *tpm) -{ - return tpm->locks; -} - -static void tpm_suspend_work(struct work_struct *work) -{ - struct touch_pm *tpm = - container_of(work, struct touch_pm, suspend_work); - - /* exit directly if device is already in suspend state */ - if (tpm->pwr_state == TPM_PWR_OFF) - return; - tpm->pwr_state = TPM_PWR_OFF; - - reinit_completion(&tpm->bus_resumed); - if (tpm->suspend) { - tpm->suspend(&tpm->pdev->dev); - } -} - -static void tpm_resume_work(struct work_struct *work) -{ - struct touch_pm *tpm = container_of(work, struct touch_pm, resume_work); - - /* exit directly if device isn't in suspend state */ - if (tpm->pwr_state == TPM_PWR_ON) - return; - tpm->pwr_state = TPM_PWR_ON; - - if (tpm->resume) { - tpm->resume(&tpm->pdev->dev); - } - complete_all(&tpm->bus_resumed); -} - -int tpm_register_notification(struct touch_pm *tpm) -{ - int ret = 0; - - tpm->pwr_state = TPM_PWR_ON; - tpm->locks = 0; - tpm->event_wq = alloc_workqueue( - "tpm_wq", WQ_UNBOUND | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1); - if (!tpm->event_wq) { - dev_err(&tpm->pdev->dev, "Cannot create work thread\n"); - ret = -ENOMEM; - goto err_alloc_workqueue; - } - - mutex_init(&tpm->lock_mutex); - INIT_WORK(&tpm->suspend_work, tpm_suspend_work); - INIT_WORK(&tpm->resume_work, tpm_resume_work); - - init_completion(&tpm->bus_resumed); - complete_all(&tpm->bus_resumed); - - tpm_register_panel_bridge(tpm); - return ret; - -err_alloc_workqueue: - return ret; -} - -int tpm_unregister_notification(struct touch_pm *tpm) -{ - tpm_unregister_panel_bridge(&tpm->panel_bridge); - tpm->resume = NULL; - tpm->suspend = NULL; - return 0; -} diff --git a/touch_pm.h b/touch_pm.h deleted file mode 100644 index 2288015..0000000 --- a/touch_pm.h +++ /dev/null @@ -1,87 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Sysfs APIs for Google Pixel devices. - * - * Copyright 2022 Google LLC. - */ - -#ifndef _TOUCH_PM_H_ -#define _TOUCH_PM_H_ - -#include <linux/mutex.h> -#include <linux/platform_device.h> -#include <samsung/exynos_drm_connector.h> -#include <samsung/panel/panel-samsung-drv.h> - -enum tpm_power_state { - TPM_PWR_OFF = 0, - TPM_PWR_ON, -}; - -#define TPM_WAKELOCK_TYPE_LOCK_MASK 0xFFFF -/** - * @brief: wakelock type. - */ -enum tpm_wakelock_type { - TPM_WAKELOCK_TYPE_SCREEN_ON = (1 << 0), - TPM_WAKELOCK_TYPE_IRQ = (1 << 1), - TPM_WAKELOCK_TYPE_FW_UPDATE = (1 << 2), - TPM_WAKELOCK_TYPE_SYSFS = (1 << 3), - TPM_WAKELOCK_TYPE_FORCE_ACTIVE = (1 << 4), - TPM_WAKELOCK_TYPE_BUGREPORT = (1 << 5), - TPM_WAKELOCK_TYPE_NON_WAKE_UP = (1 << 16), -}; - -struct touch_pm { - /* PLatform device driver */ - struct platform_device *pdev; -#ifdef CONFIG_OF - struct device_node *of_node; -#endif - - struct work_struct suspend_work; - struct work_struct resume_work; - struct workqueue_struct *event_wq; - struct completion bus_resumed; - - u32 locks; - struct mutex lock_mutex; - - /* flags */ - int pwr_state; - - struct drm_bridge panel_bridge; - struct drm_connector *connector; - bool is_panel_lp_mode; - - /* Specific function pointer to resume the device from suspend state. - * - * @param - * [ in] dev: an instance of device - * - * @return - * on success, 0; otherwise, negative value on error. - */ - int (*resume)(struct device *dev); - - /* Specific function pointer to put device into suspend state. - * - * @param - * [ in] dev: an instance of device - * - * @return - * on success, 0; otherwise, negative value on error. - */ - int (*suspend)(struct device *dev); -}; - -extern int tpm_lock_wakelock(struct touch_pm *tpm, enum tpm_wakelock_type type); -extern int tpm_unlock_wakelock( - struct touch_pm *tpm, enum tpm_wakelock_type type); -extern bool tpm_get_lock_state( - struct touch_pm *tpm, enum tpm_wakelock_type type); -extern int tpm_get_lock_states(struct touch_pm *tpm); -extern int tpm_register_notification(struct touch_pm *tpm); -extern int tpm_unregister_notification(struct touch_pm *tpm); - -#endif |