mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-13 00:00:00 -04:00
Syna: Modify the suspend and resume process.
TP: Add Panel_state to handle whether to enter deep sleep. Directly call Synaptics' suspend and resume function. Change-Id: Ia2dcb9b6f18213cc381ebe9984f3adbf6542d718 Reviewed-on: https://gerrit.mot.com/1533868 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Jialei Hao <haojl2@motorola.com> Reviewed-by: Jianqi Yang <yangj@motorola.com> Submit-Approved: Jira Key
This commit is contained in:
parent
b5999b0d94
commit
4c6b891415
3 changed files with 76 additions and 182 deletions
|
|
@ -3296,7 +3296,7 @@ static void syna_tcm_helper_work(struct work_struct *work)
|
|||
}
|
||||
|
||||
#if defined(CONFIG_PM) || defined(CONFIG_FB)
|
||||
static int syna_tcm_resume(struct device *dev)
|
||||
int syna_tcm_resume(struct device *dev)
|
||||
{
|
||||
int retval;
|
||||
struct syna_tcm_module_handler *mod_handler;
|
||||
|
|
@ -3395,7 +3395,7 @@ exit:
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int syna_tcm_suspend(struct device *dev)
|
||||
int syna_tcm_suspend(struct device *dev)
|
||||
{
|
||||
struct syna_tcm_module_handler *mod_handler;
|
||||
struct syna_tcm_hcd *tcm_hcd = dev_get_drvdata(dev);
|
||||
|
|
@ -3429,7 +3429,7 @@ static int syna_tcm_suspend(struct device *dev)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_FB
|
||||
static int syna_tcm_early_suspend(struct device *dev)
|
||||
int syna_tcm_early_suspend(struct device *dev)
|
||||
{
|
||||
int retval;
|
||||
struct syna_tcm_module_handler *mod_handler;
|
||||
|
|
|
|||
|
|
@ -49,6 +49,10 @@
|
|||
#include <linux/notifier.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI)
|
||||
#include <linux/touchscreen_mmi.h>
|
||||
#endif
|
||||
|
||||
#define SYNAPTICS_TCM_ID_PRODUCT (1 << 0)
|
||||
#define SYNAPTICS_TCM_ID_VERSION 0x0200
|
||||
#define SYNAPTICS_TCM_ID_SUBVERSION 0
|
||||
|
|
@ -517,8 +521,10 @@ struct syna_tcm_hcd {
|
|||
void (*report_touch)(void);
|
||||
void (*update_watchdog)(struct syna_tcm_hcd *tcm_hcd, bool en);
|
||||
|
||||
#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI)
|
||||
int (*do_fw_update)(void);
|
||||
int (*set_fw_name)(const char* fw_name);
|
||||
#endif
|
||||
};
|
||||
|
||||
struct syna_tcm_module_cb {
|
||||
|
|
@ -582,6 +588,10 @@ int touch_early_suspend(struct syna_tcm_hcd *tcm_hcd);
|
|||
int touch_suspend(struct syna_tcm_hcd *tcm_hcd);
|
||||
int touch_resume(struct syna_tcm_hcd *tcm_hcd);
|
||||
|
||||
int syna_tcm_resume(struct device *dev);
|
||||
int syna_tcm_suspend(struct device *dev);
|
||||
int syna_tcm_early_suspend(struct device *dev);
|
||||
|
||||
static inline int syna_tcm_rmi_read(struct syna_tcm_hcd *tcm_hcd,
|
||||
unsigned short addr, unsigned char *data, unsigned int length)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,6 +16,19 @@
|
|||
#include <linux/regulator/consumer.h>
|
||||
#include "synaptics_core.h"
|
||||
|
||||
#define GET_SYNA_DATA(dev) { \
|
||||
pdev = dev_get_drvdata(dev); \
|
||||
if (!pdev) { \
|
||||
LOGE(dev, "Failed to get platform device");\
|
||||
return -ENODEV; \
|
||||
} \
|
||||
tcm_hcd = platform_get_drvdata(pdev); \
|
||||
if (!tcm_hcd) { \
|
||||
LOGE(dev, "Failed to get driver data"); \
|
||||
return -ENODEV; \
|
||||
} \
|
||||
}
|
||||
|
||||
static int syna_ts_mmi_methods_get_vendor(struct device *dev, void *cdata)
|
||||
{
|
||||
return scnprintf(TO_CHARP(cdata), TS_MMI_MAX_VENDOR_LEN, "%s", "synaptics");
|
||||
|
|
@ -24,34 +37,19 @@ static int syna_ts_mmi_methods_get_vendor(struct device *dev, void *cdata)
|
|||
static int syna_ts_mmi_methods_get_productinfo(struct device *dev, void *cdata)
|
||||
{
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
return scnprintf(TO_CHARP(cdata), 6, "%s", tcm_hcd->id_info.part_number);
|
||||
}
|
||||
|
||||
static int syna_ts_mmi_methods_get_build_id(struct device *dev, void *cdata)
|
||||
{
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
unsigned int buildid;
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev;
|
||||
|
||||
GET_SYNA_DATA(dev);
|
||||
buildid = tcm_hcd->packrat_number;
|
||||
return scnprintf(TO_CHARP(cdata), TS_MMI_MAX_ID_LEN, "%06x", buildid);
|
||||
}
|
||||
|
|
@ -60,17 +58,9 @@ static int syna_ts_mmi_methods_get_build_id(struct device *dev, void *cdata)
|
|||
static int syna_ts_mmi_methods_get_config_id(struct device *dev, void *cdata)
|
||||
{
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
return scnprintf(TO_CHARP(cdata), TS_MMI_MAX_ID_LEN, "%s", tcm_hcd->app_info.customer_config_id);
|
||||
}
|
||||
|
||||
|
|
@ -78,17 +68,9 @@ static int syna_ts_mmi_methods_get_bus_type(struct device *dev, void *idata)
|
|||
{
|
||||
const struct syna_tcm_hw_interface *hw_if;
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
hw_if = tcm_hcd->hw_if;
|
||||
if (!hw_if) {
|
||||
LOGE(dev, "Hardware interface not found\n");
|
||||
|
|
@ -103,17 +85,9 @@ static int syna_ts_mmi_methods_get_irq_status(struct device *dev, void *idata)
|
|||
const struct syna_tcm_hw_interface *hw_if;
|
||||
struct syna_tcm_board_data *bdata;
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
hw_if = tcm_hcd->hw_if;
|
||||
if (!hw_if) {
|
||||
LOGE(dev, "Hardware interface not found\n");
|
||||
|
|
@ -132,17 +106,9 @@ static int syna_ts_mmi_methods_get_drv_irq(struct device *dev, void *idata)
|
|||
{
|
||||
struct syna_tcm_board_data *bdata;
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
bdata = tcm_hcd->hw_if->bdata;
|
||||
if (!bdata) {
|
||||
LOGE(dev, "Failed to get ts board data");
|
||||
|
|
@ -155,17 +121,9 @@ static int syna_ts_mmi_methods_get_drv_irq(struct device *dev, void *idata)
|
|||
static int syna_ts_mmi_methods_get_poweron(struct device *dev, void *idata)
|
||||
{
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
TO_INT(idata) = tcm_hcd->in_suspend == 0 ? 1 : 0;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -173,17 +131,9 @@ static int syna_ts_mmi_methods_get_poweron(struct device *dev, void *idata)
|
|||
static int syna_ts_mmi_methods_get_flashprog(struct device *dev, void *idata)
|
||||
{
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
if (IS_NOT_FW_MODE(tcm_hcd->id_info.mode) ||
|
||||
tcm_hcd->app_status != APP_STATUS_OK)
|
||||
TO_INT(idata) = 1;
|
||||
|
|
@ -197,17 +147,9 @@ static int syna_ts_mmi_methods_drv_irq(struct device *dev, int state)
|
|||
{
|
||||
int retval;
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
mutex_lock(&tcm_hcd->extif_mutex);
|
||||
if (state == 0) {
|
||||
retval = tcm_hcd->enable_irq(tcm_hcd, false, true);
|
||||
|
|
@ -237,17 +179,9 @@ static int syna_ts_mmi_methods_reset(struct device *dev, int type)
|
|||
{
|
||||
bool hw_reset = !!type;
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
if (tcm_hcd->reset)
|
||||
return tcm_hcd->reset_n_reinit(tcm_hcd, hw_reset, true);
|
||||
return -EFAULT;
|
||||
|
|
@ -255,17 +189,9 @@ static int syna_ts_mmi_methods_reset(struct device *dev, int type)
|
|||
|
||||
static int syna_ts_firmware_update(struct device *dev, char *fwname) {
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
LOGI(dev, "HW request update fw");
|
||||
/* set firmware image name */
|
||||
if (tcm_hcd->set_fw_name)
|
||||
|
|
@ -288,17 +214,9 @@ static int syna_ts_mmi_methods_power(struct device *dev, int on)
|
|||
int retval;
|
||||
const struct syna_tcm_board_data *bdata;
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
GET_SYNA_DATA(dev);
|
||||
bdata = tcm_hcd->hw_if->bdata;
|
||||
if (!bdata) {
|
||||
LOGE(dev, "Failed to get ts board data");
|
||||
|
|
@ -339,78 +257,45 @@ exit:
|
|||
|
||||
static int syna_ts_mmi_post_resume(struct device *dev)
|
||||
{
|
||||
int retval;
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
pdev = dev_get_drvdata(dev);
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (!tcm_hcd->in_suspend)
|
||||
return 0;
|
||||
|
||||
retval = tcm_hcd->sleep(tcm_hcd, false);
|
||||
if (retval < 0) {
|
||||
LOGE(tcm_hcd->pdev->dev.parent,
|
||||
"Failed to exit deep sleep\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
touch_resume(tcm_hcd);
|
||||
retval = 0;
|
||||
|
||||
exit:
|
||||
tcm_hcd->in_suspend = false;
|
||||
return retval;
|
||||
return syna_tcm_resume(&pdev->dev);
|
||||
}
|
||||
|
||||
static int syna_ts_mmi_post_suspend(struct device *dev)
|
||||
static int syna_ts_mmi_panel_state(struct device *dev,
|
||||
enum ts_mmi_pm_mode from, enum ts_mmi_pm_mode to)
|
||||
{
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
GET_SYNA_DATA(dev);
|
||||
|
||||
switch (to) {
|
||||
case TS_MMI_PM_DEEPSLEEP:
|
||||
tcm_hcd->wakeup_gesture_enabled = false;
|
||||
syna_tcm_early_suspend(&pdev->dev);
|
||||
syna_tcm_suspend(&pdev->dev);
|
||||
break;
|
||||
|
||||
case TS_MMI_PM_GESTURE:
|
||||
tcm_hcd->wakeup_gesture_enabled = true;
|
||||
syna_tcm_early_suspend(&pdev->dev);
|
||||
syna_tcm_suspend(&pdev->dev);
|
||||
break;
|
||||
|
||||
case TS_MMI_PM_ACTIVE:
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_warn(dev, "panel mode %d is invalid.\n", to);
|
||||
return -EINVAL;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (tcm_hcd->in_suspend)
|
||||
return 0;
|
||||
|
||||
touch_suspend(tcm_hcd);
|
||||
|
||||
tcm_hcd->in_suspend = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int syna_ts_mmi_pre_suspend(struct device *dev)
|
||||
{
|
||||
struct syna_tcm_hcd *tcm_hcd;
|
||||
struct platform_device *pdev = dev_get_drvdata(dev);
|
||||
|
||||
if (!pdev) {
|
||||
LOGE(dev, "Failed to get platform device");
|
||||
return -ENODEV;
|
||||
}
|
||||
tcm_hcd = platform_get_drvdata(pdev);
|
||||
if (!tcm_hcd) {
|
||||
LOGE(dev, "Failed to get driver data");
|
||||
return -ENODEV;
|
||||
}
|
||||
if (tcm_hcd->in_suspend)
|
||||
return 0;
|
||||
|
||||
touch_early_suspend(tcm_hcd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -431,9 +316,8 @@ static struct ts_mmi_methods syna_ts_mmi_methods = {
|
|||
/* Firmware */
|
||||
.firmware_update = syna_ts_firmware_update,
|
||||
/* PM callback */
|
||||
.panel_state = syna_ts_mmi_panel_state,
|
||||
.post_resume = syna_ts_mmi_post_resume,
|
||||
.pre_suspend = syna_ts_mmi_pre_suspend,
|
||||
.post_suspend = syna_ts_mmi_post_suspend,
|
||||
};
|
||||
|
||||
int syna_ts_mmi_dev_register(struct syna_tcm_hcd *tcm_hcd) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue