diff --git a/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.c b/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.c index 5967718a10fb..35175ac9ee2e 100644 --- a/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.c +++ b/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.c @@ -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; diff --git a/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.h b/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.h index d68d2b65cd23..ecb0a9503e38 100644 --- a/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.h +++ b/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_core.h @@ -49,6 +49,10 @@ #include #endif +#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) +#include +#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) { diff --git a/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_ts_mmi.c b/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_ts_mmi.c index cc184f4e3401..082f91002c60 100644 --- a/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_ts_mmi.c +++ b/drivers/input/touchscreen/synaptics_tcm_mmi_v2/synaptics_ts_mmi.c @@ -16,6 +16,19 @@ #include #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) {