From a587eada610d8dbdb3d4d1c9429d023dceb3d4b6 Mon Sep 17 00:00:00 2001 From: wangyq13 Date: Thu, 10 Dec 2020 11:47:39 +0800 Subject: [PATCH] input: focaltech_v2_mmi: add usb charger detection focaltech_v2_mmi: Add usb charger detection function. NO_PROP_NEEDED: Change-Id: Ia93898563a7247a0ab8ae7d1b1bdd83ad4dd912b Signed-off-by: wangyq13 Reviewed-on: https://gerrit.mot.com/1824123 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Jun Weng Reviewed-by: Wei Deng Reviewed-by: Jichao Zou Submit-Approved: Jira Key --- .../focaltech_v2_mmi/focaltech_config.h | 5 ++ .../focaltech_v2_mmi/focaltech_core.c | 57 +++++++++++++++++++ .../focaltech_v2_mmi/focaltech_core.h | 11 ++++ .../focaltech_v2_mmi/focaltech_ts_mmi.c | 15 +++++ 4 files changed, 88 insertions(+) diff --git a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_config.h b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_config.h index c7b91cb27a7b..0120da352a5c 100644 --- a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_config.h +++ b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_config.h @@ -229,6 +229,11 @@ */ #define FTS_GET_MODULE_NUM 0 +/* + * Usb detect support + */ +#define FTS_USB_DETECT_EN 1 + /* * module_id: mean vendor_id generally, also maybe gpio or lcm_id... * If means vendor_id, the FTS_MODULE_ID = PANEL_ID << 8 + VENDOR_ID diff --git a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.c b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.c index b202275578ac..3dfdd9370d4b 100644 --- a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.c +++ b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.c @@ -681,11 +681,64 @@ static int fts_read_parse_touchdata(struct fts_ts_data *data) return 0; } +#if FTS_USB_DETECT_EN +static void fts_mcu_usb_detect_set(uint8_t usb_connected) +{ + uint8_t write_data = 0; + uint8_t read_data = 0; + uint8_t retry_cnt = 0; + int ret = 0; + + do{ + if (usb_connected == 0x01) { + write_data= 0x01; + ret = fts_write_reg(FTS_REG_CHARGER_MODE_EN, write_data); + if (ret < 0) + FTS_ERROR("set register USB IN fail, ret=%d", ret); + FTS_INFO("%s: USB detect status IN!\n", __func__); + } else { + write_data= 0x00; + ret = fts_write_reg(FTS_REG_CHARGER_MODE_EN, write_data); + if (ret < 0) + FTS_ERROR("set register USB OUT fail, ret=%d", ret); + FTS_INFO("%s: USB detect status OUT!\n", __func__); + } + + ret = fts_read_reg(FTS_REG_CHARGER_MODE_EN, &read_data); + if (ret < 0) + FTS_ERROR("read 8b register fail, ret=%d", ret); + retry_cnt++; + }while((write_data != read_data) && retry_cnt < FTS_REG_RETRY_TIMES); +} + +void fts_cable_detect_func(bool force_renew) +{ + struct fts_ts_data *ts_data = fts_data; + uint8_t connect_status = 0; + connect_status = ts_data->usb_detect_flag; + + if ((connect_status != ts_data->usb_connected) || force_renew) { + if (connect_status) { + ts_data->usb_connected = 0x01; + } else { + ts_data->usb_connected = 0x00; + } + + fts_mcu_usb_detect_set(ts_data->usb_connected); + FTS_INFO("%s: Cable status change: 0x%2.2X\n", __func__, ts_data->usb_connected); + } +} +#endif + static void fts_irq_read_report(void) { int ret = 0; struct fts_ts_data *ts_data = fts_data; +#if FTS_USB_DETECT_EN + fts_cable_detect_func(false); +#endif + #if FTS_ESDCHECK_EN fts_esdcheck_set_intr(1); #endif @@ -1813,6 +1866,10 @@ static int fts_ts_resume(struct device *dev) } ts_data->suspended = false; +#if FTS_USB_DETECT_EN + fts_cable_detect_func(true); +#endif + FTS_FUNC_EXIT(); return 0; } diff --git a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.h b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.h index 333cffbced01..95e450d5e5dc 100644 --- a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.h +++ b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_core.h @@ -65,6 +65,9 @@ #if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) #include #endif +#ifdef FTS_USB_DETECT_EN +#include +#endif /***************************************************************************** * Private constant and macro definitions using #define @@ -103,6 +106,9 @@ #define FTX_MAX_COMPATIBLE_TYPE 4 #define FTX_MAX_COMMMAND_LENGTH 16 +#ifdef FTS_USB_DETECT_EN +#define FTS_REG_RETRY_TIMES 5 +#endif /***************************************************************************** @@ -209,6 +215,11 @@ struct fts_ts_data { struct early_suspend early_suspend; #endif +#if FTS_USB_DETECT_EN + bool usb_detect_flag; + uint8_t usb_connected; +#endif + #if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) struct ts_mmi_class_methods *imports; #endif diff --git a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_ts_mmi.c b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_ts_mmi.c index 79232b795c18..f28131ef2e84 100644 --- a/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_ts_mmi.c +++ b/drivers/input/touchscreen/focaltech_v2_mmi/focaltech_ts_mmi.c @@ -191,6 +191,18 @@ static int fts_mmi_firmware_update(struct device *dev, char *fwname) return 0; } +#if FTS_USB_DETECT_EN +static int fts_mmi_charger_mode(struct device *dev, int mode) +{ + struct fts_ts_data *ts_data; + + GET_TS_DATA(dev); + ts_data->usb_detect_flag = !!mode; + + return 0; +} +#endif + static int fts_mmi_panel_state(struct device *dev, enum ts_mmi_pm_mode from, enum ts_mmi_pm_mode to) { @@ -339,6 +351,9 @@ static struct ts_mmi_methods fts_mmi_methods = { .drv_irq = fts_mmi_methods_drv_irq, #if FTS_POWER_SOURCE_CUST_EN .power = fts_mmi_methods_power, +#endif +#if FTS_USB_DETECT_EN + .charger_mode = fts_mmi_charger_mode, #endif /* Firmware */ .firmware_update = fts_mmi_firmware_update,