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:
litong 2020-04-14 13:07:57 +08:00 • committed by litong20
commit 4c6b891415
3 changed files with 76 additions and 182 deletions

View file

@ -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;

View file

@ -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)
{

View file

@ -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) {