/* * ILITEK Touch IC driver * * Copyright (C) 2011 ILI Technology Corporation. * * Author: Dicky Chiang * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "ili9881x_sec_fn.h" static int sec_fn_load_fw(int update_mode, bool signing) { int ret = 0; bool esd_en = ilits->wq_esd_ctrl, bat_en = ilits->wq_bat_ctrl; static unsigned char g_user_buf[USER_STR_BUFF] = {0}; input_info(true, ilits->dev, "%s Prepar to upgarde firmware\n", __func__); mutex_lock(&ilits->touch_mutex); memset(g_user_buf, 0, USER_STR_BUFF * sizeof(unsigned char)); if (esd_en) ili_wq_ctrl(WQ_ESD, DISABLE); if (bat_en) ili_wq_ctrl(WQ_BAT, DISABLE); ilits->signing = signing; if (update_mode == BUILT_IN) { ilits->fw_open = REQUEST_FIRMWARE; } else if (update_mode == UMS) { ilits->fw_open = FILP_OPEN; if (ilits->signing) ilits->md_fw_filp_path = TSP_PATH_EXTERNAL_FW_SIGNED; else ilits->md_fw_filp_path = TSP_PATH_EXTERNAL_FW; } else { ilits->fw_open = REQUEST_FIRMWARE; } ilits->force_fw_update = ENABLE; ilits->node_update = true; ret = ili_fw_upgrade_handler(NULL); ilits->node_update = false; ilits->force_fw_update = DISABLE; ilits->fw_open = REQUEST_FIRMWARE; g_user_buf[0] = 0x0; g_user_buf[1] = (ret < 0) ? -ret : ret; if (g_user_buf[1] == 0) input_info(true, ilits->dev, "%s Upgrade firmware = PASS\n", __func__); else input_err(true, ilits->dev, "%s Upgrade firmware = FAIL\n", __func__); /* Reason for fail */ if (g_user_buf[1] == EFW_CONVERT_FILE) { g_user_buf[0] = 0xFF; input_err(true, ilits->dev, "%s Failed to convert hex/ili file, abort!\n", __func__); } else if (g_user_buf[1] == ENOMEM) { input_err(true, ilits->dev, "%s Failed to allocate memory, abort!\n", __func__); } else if (g_user_buf[1] == EFW_ICE_MODE) { input_err(true, ilits->dev, "%s Failed to operate ice mode, abort!\n", __func__); } else if (g_user_buf[1] == EFW_CRC) { input_err(true, ilits->dev, "%s CRC not matched, abort!\n", __func__); } else if (g_user_buf[1] == EFW_REST) { input_err(true, ilits->dev, "%s Failed to do reset, abort!\n", __func__); } else if (g_user_buf[1] == EFW_ERASE) { input_err(true, ilits->dev, "%s Failed to erase flash, abort!\n", __func__); } else if (g_user_buf[1] == EFW_PROGRAM) { input_err(true, ilits->dev, "%s Failed to program flash, abort!\n", __func__); } else if (g_user_buf[1] == EFW_INTERFACE) { input_err(true, ilits->dev, "%s Failed to hex file interface no match, abort!\n", __func__); } if (esd_en) ili_wq_ctrl(WQ_ESD, ENABLE); if (bat_en) ili_wq_ctrl(WQ_BAT, ENABLE); set_current_ic_mode(SET_MODE_NORMAL); mutex_unlock(&ilits->touch_mutex); return ret; } static void fw_update(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[64] = { 0 }; int retval = 0; sec_cmd_set_default_result(sec); /* Factory cmd for firmware update * argument represent what is source of firmware like below. * * 0 : [BUILT_IN] Getting firmware which is for user. * 1 : [UMS] Getting firmware from sd card. * 2 : none * 3 : [FFU] Getting firmware from apk. */ if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } switch (sec->cmd_param[0]) { case BUILT_IN: retval = sec_fn_load_fw(BUILT_IN, NORMAL); break; case UMS: #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP retval = sec_fn_load_fw(UMS, SIGNING); #else retval = sec_fn_load_fw(UMS, NORMAL); #endif break; default: input_info(true, ilits->dev, "%s: Not supported value:%d\n", __func__, sec->cmd_param[0]); retval = -1; break; } if (retval < 0) snprintf(buff, sizeof(buff), "FAIL"); else snprintf(buff, sizeof(buff), "OK"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); } static void aot_enable(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[SEC_CMD_STR_LEN] = { 0 }; struct gesture_symbol *ptr_sym = &ilits->ges_sym; u8 *ptr; u32 ges_sym_value = 0; sec_cmd_set_default_result(sec); if (!ilits->enable_settings_aot) { input_err(true, ilits->dev, "%s: Not support AOT!\n", __func__); goto out; } ptr = (u8 *) ptr_sym; ges_sym_value = (ptr[0] | (ptr[1] << 8) | (ptr[2] << 16)) & DOUBLE_TAP_MASK; input_info(true, ilits->dev, "%s cmd:%d, gesture:%d, ilits->ges_sym:0x%x, ges_sym_value:0x%x\n", __func__, sec->cmd_param[0], ilits->gesture, ilits->ges_sym, ges_sym_value); if (!!sec->cmd_param[0]) { ilits->gesture = !!sec->cmd_param[0]; } else { if (!ges_sym_value) ilits->gesture = !!sec->cmd_param[0]; } ilits->ges_sym.double_tap = (u8)!!sec->cmd_param[0]; snprintf(buff, sizeof(buff), "%s", "OK"); sec->cmd_state = SEC_CMD_STATUS_OK; sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); input_info(true, ilits->dev, "%s, %s, gesture:%d, ilits->ges_sym:0x%x\n", __func__, sec->cmd_result, ilits->gesture, ilits->ges_sym); return; out: snprintf(buff, sizeof(buff), "%s", "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); input_info(true, ilits->dev, "%s, %s, gesture:%d, ilits->ges_sym:0x%x\n", __func__, sec->cmd_result, ilits->gesture, ilits->ges_sym); } static void spay_enable(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[SEC_CMD_STR_LEN] = { 0 }; struct gesture_symbol *ptr_sym = &ilits->ges_sym; u8 *ptr; u32 ges_sym_value = 0; sec_cmd_set_default_result(sec); if (!ilits->support_spay_gesture_mode) { input_err(true, ilits->dev, "%s: Not support SPAY!\n", __func__); goto out; } ptr = (u8 *) ptr_sym; ges_sym_value = (ptr[0] | (ptr[1] << 8) | (ptr[2] << 16)) & ALPHABET_LINE_2_TOP_MASK; input_info(true, ilits->dev, "%s cmd:%d, gesture:%d, ilits->ges_sym:0x%x, ges_sym_value:0x%x\n", __func__, sec->cmd_param[0], ilits->gesture, ilits->ges_sym, ges_sym_value); if (!!sec->cmd_param[0]) { ilits->gesture = !!sec->cmd_param[0]; } else { if (!ges_sym_value) ilits->gesture = !!sec->cmd_param[0]; } ilits->ges_sym.alphabet_line_2_top = (u8)!!sec->cmd_param[0]; snprintf(buff, sizeof(buff), "%s", "OK"); sec->cmd_state = SEC_CMD_STATUS_OK; sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); input_info(true, ilits->dev, "%s, %s, gesture:%d, ilits->ges_sym:0x%x\n", __func__, sec->cmd_result, ilits->gesture, ilits->ges_sym); return; out: snprintf(buff, sizeof(buff), "%s", "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); input_info(true, ilits->dev, "%s, %s, gesture:%d, ilits->ges_sym:0x%x\n", __func__, sec->cmd_result, ilits->gesture, ilits->ges_sym); } static void get_chip_vendor(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[16] = { 0 }; strncpy(buff, "ILI", sizeof(buff)); sec_cmd_set_default_result(sec); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, strnlen(buff, sizeof(buff)), "IC_VENDOR"); sec->cmd_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %s\n", __func__, buff); } static void get_chip_name(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[16] = { 0 }; strncpy(buff, "ILI9881X", sizeof(buff)); sec_cmd_set_default_result(sec); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, strnlen(buff, sizeof(buff)), "IC_NAME"); sec->cmd_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %s\n", __func__, buff); } static void get_fw_ver_bin(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); snprintf(buff, sizeof(buff), "%c%c%02d%02d%02d%02d", ilits->fw_customer_info[0], ilits->fw_customer_info[1], ilits->fw_customer_info[2], ilits->fw_customer_info[3], ilits->fw_customer_info[4], ilits->fw_customer_info[5]); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, strnlen(buff, sizeof(buff)), "FW_VER_BIN"); sec->cmd_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %s\n", __func__, buff); } static void get_fw_ver_ic(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; u8 cmd[1] = {0x26}; u8 buf[8] = {0}; u8 retry = 25, checksum = 0; char buff[16] = { 0 }; char model[7] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } do { if (ilits->wrapper(cmd, sizeof(u8), buf, 8, ON, OFF) < 0) input_err(true, ilits->dev, "%s Write pre cmd failed\n", __func__); checksum = ili_calc_packet_checksum(buf, 7); if (retry <= 0) { input_info(true, ilits->dev, "%s failed get ic version\n", __func__); memset(&buf, 0x00, sizeof(buf)); break; } retry--; } while (checksum != buf[7]); input_info(true, ilits->dev, "%s %02d%c%c%02d%02d%02d%02d%02d\n", __func__, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); snprintf(buff, sizeof(buff), "%c%c%02d%02d%02d%02d", buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); snprintf(model, sizeof(model), "%c%c%02d%02d", buf[1], buf[2], buf[3], buf[4]); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) { sec_cmd_set_cmd_result_all(sec, buff, strnlen(buff, sizeof(buff)), "FW_VER_IC"); sec_cmd_set_cmd_result_all(sec, model, strnlen(model, sizeof(model)), "FW_MODEL"); } sec->cmd_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %s\n", __func__, buff); return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) { sec_cmd_set_cmd_result_all(sec, buff, strnlen(buff, sizeof(buff)), "FW_VER_IC"); sec_cmd_set_cmd_result_all(sec, buff, strnlen(model, sizeof(model)), "FW_MODEL"); } } static void get_x_num(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); snprintf(buff, sizeof(buff), "%d", ilits->xch_num); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec->cmd_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %s\n", __func__, buff); } static void get_y_num(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); snprintf(buff, sizeof(buff), "%d", ilits->ych_num); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec->cmd_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %s\n", __func__, buff); } static void run_sram_test(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; sec_cmd_set_default_result(sec); test_sram(sec); } static void run_raw_test_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "raw data(no bk)"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, RAWDATANOBK_LCMON_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "RAW"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "RAW"); } static void run_raw_doze_test_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "doze raw data"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, DOZERAW_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "RAW_DOZE"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "RAW_DOZE"); } static void run_cal_dac_test_read(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "calibration data(dac)"; ilits->allnode = TEST_MODE_MIN_MAX; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, DAC_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "CAL_DAC"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "CAL_DAC"); } static void run_cal_dac_test_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "calibration data(dac)"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, DAC_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "CAL_DAC"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "CAL_DAC"); } static void run_open_test_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "open test_c"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, OPENTESTC_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "OPEN"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "OPEN"); } static void run_short_test_read(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "short test"; ilits->allnode = TEST_MODE_MIN_MAX; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, SHORTTEST_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "SHORT"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "SHORT"); } static void run_short_test_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "short test"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, SHORTTEST_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "SHORT"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "SHORT"); } static void run_noise_test_read(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "noise peak to peak(with panel)"; ilits->allnode = TEST_MODE_MIN_MAX; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, NOISEPP_LCMON_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "NOISE"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "NOISE"); } static void run_noise_test_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "noise peak to peak(with panel)"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, NOISEPP_LCMON_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "NOISE"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "NOISE"); } static void run_noise_doze_test_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } ilits->current_mpitem = "doze peak to peak"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, DOZEPP_PATH, ON); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "NOISE_DOZE"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "NOISE_DOZE"); } static void run_noise_test_read_lcdoff(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->power_status == POWER_OFF_STATUS) { input_err(true, ilits->dev, "%s failed(power off state).\n", __func__); goto out; } ilits->current_mpitem = "noise peak to peak(with panel) (lcm off)"; ilits->allnode = TEST_MODE_MIN_MAX; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, NOISEPP_LCMOFF_PATH, OFF); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "NOISE_OFF"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "NOISE_OFF"); } static void run_noise_test_read_all_lcdoff(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->power_status == POWER_OFF_STATUS) { input_err(true, ilits->dev, "%s failed(power off state).\n", __func__); goto out; } ilits->current_mpitem = "noise peak to peak(with panel) (lcm off)"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, NOISEPP_LCMOFF_PATH, OFF); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "NOISE_OFF"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "NOISE_OFF"); } static void run_noise_doze_test_read_all_lcdoff(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->power_status == POWER_OFF_STATUS) { input_err(true, ilits->dev, "%s failed(power off state).\n", __func__); goto out; } ilits->current_mpitem = "peak to peak_td (lcm off)"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, P2P_TD_PATH, OFF); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "NOISE_DOZE_OFF"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "NOISE_DOZE_OFF"); } static void run_raw_doze_test_read_all_lcdoff(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->power_status == POWER_OFF_STATUS) { input_err(true, ilits->dev, "%s failed(power off state).\n", __func__); goto out; } ilits->current_mpitem = "raw data_td (lcm off)"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, RAWDATATD_PATH, OFF); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "RAW_DOZE_OFF"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "RAW_DOZE_OFF"); } static void run_raw_test_read_all_lcdoff(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->power_status == POWER_OFF_STATUS) { input_err(true, ilits->dev, "%s failed(power off state).\n", __func__); goto out; } ilits->current_mpitem = "raw data(no bk) (lcm off)"; ilits->allnode = TEST_MODE_ALL_NODE; ilits->node_min = ilits->node_max = 0; ret = ilitek_node_mp_test_read(sec, RAWDATANOBK_LCMOFF_PATH, OFF); if (ret < 0) { snprintf(ilits->print_buf, SEC_CMD_STR_LEN, "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } sec_cmd_set_cmd_result(sec, ilits->print_buf, strlen(ilits->print_buf)); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, ilits->print_buf, SEC_CMD_STR_LEN, "RAW_OFF"); ilits->current_mpitem = ""; sec->cmd_state = SEC_CMD_STATUS_OK; return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); if (sec->cmd_all_factory_state == SEC_CMD_STATUS_RUNNING) sec_cmd_set_cmd_result_all(sec, buff, SEC_CMD_STR_LEN, "RAW_OFF"); } static void factory_cmd_result_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); sec->cmd_all_factory_state = SEC_CMD_STATUS_FAIL; return; } sec->item_count = 0; memset(sec->cmd_result_all, 0x00, SEC_CMD_RESULT_STR_LEN); sec->cmd_all_factory_state = SEC_CMD_STATUS_RUNNING; get_chip_vendor(sec); get_chip_name(sec); get_fw_ver_bin(sec); get_fw_ver_ic(sec); run_sram_test(sec); run_cal_dac_test_read(sec); run_short_test_read(sec); run_noise_test_read(sec); ilits->actual_tp_mode = P5_X_FW_AP_MODE; if (ilits->fw_upgrade_mode == UPGRADE_IRAM) { if (ili_fw_upgrade_handler(NULL) < 0) input_err(true, ilits->dev, "%s FW upgrade failed during mp test\n", __func__); } else { if (ili_reset_ctrl(ilits->reset) < 0) input_err(true, ilits->dev, "%s TP Reset failed during mp test\n", __func__); } atomic_set(&ilits->mp_stat, DISABLE); sec->cmd_all_factory_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %d%s\n", __func__, sec->item_count, sec->cmd_result_all); } static void factory_lcdoff_cmd_result_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; if (ilits->power_status == POWER_OFF_STATUS) { input_err(true, ilits->dev, "%s failed(power off state).\n", __func__); sec->cmd_all_factory_state = SEC_CMD_STATUS_FAIL; return; } sec->item_count = 0; memset(sec->cmd_result_all, 0x00, SEC_CMD_RESULT_STR_LEN); sec->cmd_all_factory_state = SEC_CMD_STATUS_RUNNING; run_noise_test_read_lcdoff(sec); atomic_set(&ilits->mp_stat, DISABLE); sec->cmd_all_factory_state = SEC_CMD_STATUS_OK; input_info(true, ilits->dev, "%s: %d%s\n", __func__, sec->item_count, sec->cmd_result_all); } static void incell_power_control(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[SEC_CMD_STR_LEN] = { 0 }; sec_cmd_set_default_result(sec); input_info(true, ilits->dev, "%s: %d\n", __func__, sec->cmd_param[0]); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); ret = -1; goto out; } switch (sec->cmd_param[0]) { case INCELL_POWER_DISABLE: ilits->incell_power_state = INCELL_POWER_DISABLE; ili_incell_power_control(INCELL_POWER_DISABLE); break; case INCELL_POWER_ENABLE: ilits->incell_power_state = INCELL_POWER_ENABLE; ili_incell_power_control(INCELL_POWER_ENABLE); break; default: input_info(true, ilits->dev, "%s: Not supported value:%d\n", __func__, sec->cmd_param[0]); ret = -1; break; } out: if (ret < 0) { snprintf(buff, sizeof(buff), "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { snprintf(buff, sizeof(buff), "OK"); sec->cmd_state = SEC_CMD_STATUS_OK; } sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); } static void run_prox_intensity_read_all(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char data[SEC_CMD_STR_LEN] = { 0 }; int ret = 0; char buff[16] = { 0 }; sec_cmd_set_default_result(sec); if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); goto out; } if (ilits->prox_face_mode && !ilits->started_prox_intensity) { input_info(true, ilits->dev, "%s: start\n", __func__); ilits->started_prox_intensity = true; ret = debug_mode_onoff(true); if (ret < 0) input_err(true, ilits->dev, "%s: debug_mode_onoff setting failed\n", __func__); } if (ret < 0) { input_err(true, ilits->dev, "%s: debug_mode_onoff setting failed\n", __func__); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { snprintf(data, sizeof(data), "SUM_X:%d THD_X:%d", ilits->proximity_sum, ilits->proximity_thd); sec->cmd_state = SEC_CMD_STATUS_OK; } sec_cmd_set_cmd_result(sec, data, strlen(data)); return; out: sec->cmd_state = SEC_CMD_STATUS_FAIL; snprintf(buff, sizeof(buff), "%s", "NG"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); } static void ear_detect_enable(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[SEC_CMD_STR_LEN] = { 0 }; sec_cmd_set_default_result(sec); mutex_lock(&ilits->touch_mutex); input_info(true, ilits->dev, "%s: %d\n", __func__, sec->cmd_param[0]); if ((sec->cmd_param[0] != EAR_DETECT_DISABLE) && (sec->cmd_param[0] != EAR_DETECT_NORMAL_MODE) && (sec->cmd_param[0] != EAR_DETECT_INSENSITIVE_MODE)) { input_info(true, ilits->dev, "%s: Not supported value:%d\n", __func__, sec->cmd_param[0]); ret = -1; goto out; } ilits->prox_face_mode = sec->cmd_param[0]; if (ilits->tp_suspend) { input_info(true, ilits->dev, "%s: now screen off stae, it'll setting after screen on(%d)\n", __func__, ilits->prox_face_mode); goto out; } ret = ili_ic_func_ctrl("proximity", ilits->prox_face_mode); if (ret < 0) input_err(true, ilits->dev, "%s Ear Detect Mode Setting failed\n", __func__); if((ilits->prox_face_mode == EAR_DETECT_DISABLE) && ilits->started_prox_intensity) { debug_mode_onoff(false); ilits->started_prox_intensity = false; } out: if (ret < 0) { snprintf(buff, sizeof(buff), "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { snprintf(buff, sizeof(buff), "OK"); sec->cmd_state = SEC_CMD_STATUS_OK; } mutex_unlock(&ilits->touch_mutex); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); } static void prox_lp_scan_mode(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; int ret = 0; char buff[SEC_CMD_STR_LEN] = { 0 }; sec_cmd_set_default_result(sec); mutex_lock(&ilits->touch_mutex); input_info(true, ilits->dev, "%s: %d\n", __func__, sec->cmd_param[0]); if (!ilits->prox_lp_scan_enabled) { input_err(true, ilits->dev, "%s: Not support LPSCAN!\n", __func__); ret = -1; goto out; } if (ilits->power_status == POWER_ON_STATUS) { input_info(true, ilits->dev, "%s now screen on stae, it'll setting after screen off\n", __func__); if (sec->cmd_param[0] == PORX_LP_SCAN_ON) ilits->prox_lp_scan_mode_enabled = true; else ilits->prox_lp_scan_mode_enabled = false; goto out; } if (ilits->power_status != LP_PROX_STATUS) { input_err(true, ilits->dev, "%s failed(power off state).\n", __func__); ret = -1; goto out; } switch (sec->cmd_param[0]) { case PORX_LP_SCAN_OFF: if (ilits->prox_face_mode) { if (ili_ic_func_ctrl("sleep", SLEEP_IN) < 0) input_err(true, ilits->dev, "%s Write sleep in cmd failed\n", __func__); ilits->prox_lp_scan_mode_enabled = false; } else { input_err(true, ilits->dev, "%s prox_face_mode disabled\n", __func__); } break; case PORX_LP_SCAN_ON: if (ilits->prox_face_mode) { ili_switch_tp_mode(P5_X_FW_GESTURE_MODE); ret = ili_ic_func_ctrl("lpwg", 0x21);//proximity report start if (ret < 0) input_err(true, ilits->dev, "%s proximity report start failed\n", __func__); ilits->prox_lp_scan_mode_enabled = true; } else { input_err(true, ilits->dev, "%s prox_face_mode disabled\n", __func__); } break; default: input_info(true, ilits->dev, "%s: Not supported value:%d\n", __func__, sec->cmd_param[0]); ret = -1; break; } out: if (ret < 0) { snprintf(buff, sizeof(buff), "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { snprintf(buff, sizeof(buff), "OK"); sec->cmd_state = SEC_CMD_STATUS_OK; } mutex_unlock(&ilits->touch_mutex); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); } static void dead_zone_enable(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[SEC_CMD_STR_LEN] = { 0 }; int ret; sec_cmd_set_default_result(sec); mutex_lock(&ilits->touch_mutex); if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > 1) { snprintf(buff, sizeof(buff), "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { if (ilits->tp_suspend) { input_info(true, ilits->dev, "%s: now screen off stae, it'll setting after screen on\n", __func__, sec->cmd_param[0]); ilits->dead_zone_enabled = sec->cmd_param[0]; snprintf(buff, sizeof(buff), "OK"); goto out; } if (sec->cmd_param[0]) ret = ili_ic_func_ctrl("dead_zone_ctrl", DEAD_ZONE_ENABLE); else ret = ili_ic_func_ctrl("dead_zone_ctrl", DEAD_ZONE_DISABLE); if (ret < 0) { input_err(true, ilits->dev, "%s Failed to enable dead zone, cmd:%d\n", __func__, sec->cmd_param[0]); snprintf(buff, sizeof(buff), "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { snprintf(buff, sizeof(buff), "OK"); sec->cmd_state = SEC_CMD_STATUS_OK; } } out: mutex_unlock(&ilits->touch_mutex); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); } static void set_sip_mode(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[SEC_CMD_STR_LEN] = { 0 }; int ret; sec_cmd_set_default_result(sec); mutex_lock(&ilits->touch_mutex); if (sec->cmd_param[0] < 0 || sec->cmd_param[0] > 1) { snprintf(buff, sizeof(buff), "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { if (ilits->tp_suspend) { input_info(true, ilits->dev, "%s: now screen off stae, it'll setting after screen on\n", __func__, sec->cmd_param[0]); ilits->sip_mode_enabled = sec->cmd_param[0]; snprintf(buff, sizeof(buff), "OK"); goto out; } if (sec->cmd_param[0]) ret = ili_ic_func_ctrl("sip_mode", SIP_MODE_ENABLE); else ret = ili_ic_func_ctrl("sip_mode", SIP_MODE_DISABLE); if (ret < 0) { input_err(true, ilits->dev, "%s Failed to enable sip_mode, cmd:%d\n", __func__, sec->cmd_param[0]); snprintf(buff, sizeof(buff), "NG"); sec->cmd_state = SEC_CMD_STATUS_FAIL; } else { snprintf(buff, sizeof(buff), "OK"); sec->cmd_state = SEC_CMD_STATUS_OK; } } out: mutex_unlock(&ilits->touch_mutex); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec_cmd_set_cmd_exit(sec); } static void not_support_cmd(void *device_data) { struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data; char buff[SEC_CMD_STR_LEN] = { 0 }; sec_cmd_set_default_result(sec); snprintf(buff, sizeof(buff), "NA"); sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff))); sec->cmd_state = SEC_CMD_STATUS_NOT_APPLICABLE; sec_cmd_set_cmd_exit(sec); } static struct sec_cmd sec_cmds[] = { {SEC_CMD("fw_update", fw_update),}, {SEC_CMD_H("aot_enable", aot_enable),}, {SEC_CMD_H("spay_enable", spay_enable),}, {SEC_CMD("get_chip_vendor", get_chip_vendor),}, {SEC_CMD("get_chip_name", get_chip_name),}, {SEC_CMD("get_fw_ver_bin", get_fw_ver_bin),}, {SEC_CMD("get_fw_ver_ic", get_fw_ver_ic),}, {SEC_CMD("get_x_num", get_x_num),}, {SEC_CMD("get_y_num", get_y_num),}, {SEC_CMD("run_sram_test", run_sram_test),}, {SEC_CMD("run_raw_test_read_all", run_raw_test_read_all),}, {SEC_CMD("run_raw_doze_test_read_all", run_raw_doze_test_read_all),}, {SEC_CMD("run_cal_dac_test_read", run_cal_dac_test_read),}, {SEC_CMD("run_cal_dac_test_read_all", run_cal_dac_test_read_all),}, {SEC_CMD("run_open_test_read_all", run_open_test_read_all),}, {SEC_CMD("run_short_test_read", run_short_test_read),}, {SEC_CMD("run_short_test_read_all", run_short_test_read_all),}, {SEC_CMD("run_noise_test_read", run_noise_test_read),}, {SEC_CMD("run_noise_test_read_all", run_noise_test_read_all),}, {SEC_CMD("run_noise_doze_test_read_all", run_noise_doze_test_read_all),}, {SEC_CMD("run_noise_test_read_lcdoff", run_noise_test_read_lcdoff),}, {SEC_CMD("run_noise_test_read_all_lcdoff", run_noise_test_read_all_lcdoff),}, {SEC_CMD("run_noise_doze_test_read_all_lcdoff", run_noise_doze_test_read_all_lcdoff),}, {SEC_CMD("run_raw_doze_test_read_all_lcdoff", run_raw_doze_test_read_all_lcdoff),}, {SEC_CMD("run_raw_test_read_all_lcdoff", run_raw_test_read_all_lcdoff),}, {SEC_CMD("factory_cmd_result_all", factory_cmd_result_all),}, {SEC_CMD("factory_lcdoff_cmd_result_all", factory_lcdoff_cmd_result_all),}, {SEC_CMD_H("incell_power_control", incell_power_control),}, {SEC_CMD("run_prox_intensity_read_all", run_prox_intensity_read_all),}, {SEC_CMD_H("ear_detect_enable", ear_detect_enable),}, {SEC_CMD_H("prox_lp_scan_mode", prox_lp_scan_mode),}, {SEC_CMD("dead_zone_enable", dead_zone_enable),}, {SEC_CMD("set_sip_mode", set_sip_mode),}, {SEC_CMD("not_support_cmd", not_support_cmd),}, }; static ssize_t sensitivity_mode_show(struct device *dev, struct device_attribute *attr, char *buf) { int i; char tempv[10] = { 0 }; char buff[SENSITIVITY_POINT_CNT * 10] = { 0 }; for (i = 0; i < SENSITIVITY_POINT_CNT; i++) { if (i != 0) strlcat(buff, ",", sizeof(buff)); snprintf(tempv, 10, "%d", ilits->sensitivity_info[i]); strlcat(buff, tempv, sizeof(buff)); } input_info(true, ilits->dev, "%s: sensitivity mode : %s\n", __func__, buff); return snprintf(buf, SEC_CMD_BUF_SIZE, "%s", buff); } static ssize_t sensitivity_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int ret; unsigned long value = 0; if (ilits->tp_suspend) { input_err(true, ilits->dev, "%s failed(screen off state).\n", __func__); return -EINVAL; } if (count > 2) return -EINVAL; ret = kstrtoul(buf, 10, &value); if (ret != 0) return ret; input_info(true, ilits->dev, "%s: start on/off:%d\n", __func__, value); if (value) debug_mode_onoff(true); else debug_mode_onoff(false); input_info(true, ilits->dev, "%s: done\n", __func__); return count; } static ssize_t read_support_feature(struct device *dev, struct device_attribute *attr, char *buf) { u32 feature = 0; if (ilits->enable_settings_aot) feature |= INPUT_FEATURE_ENABLE_SETTINGS_AOT; if (ilits->enable_sysinput_enabled) feature |= INPUT_FEATURE_ENABLE_SYSINPUT_ENABLED; if (ilits->prox_lp_scan_enabled) feature |= INPUT_FEATURE_ENABLE_PROX_LP_SCAN_ENABLED; input_info(true, ilits->dev, "%s: %d%s%s%s\n", __func__, feature, feature & INPUT_FEATURE_ENABLE_SETTINGS_AOT ? " aot" : "", feature & INPUT_FEATURE_ENABLE_SYSINPUT_ENABLED ? " SE" : "", feature & INPUT_FEATURE_ENABLE_PROX_LP_SCAN_ENABLED ? " LPSCAN" : ""); return snprintf(buf, SEC_CMD_BUF_SIZE, "%d", feature); } static ssize_t prox_power_off_show(struct device *dev, struct device_attribute *attr, char *buf) { input_info(true, ilits->dev, "%s: %d\n", __func__, ilits->prox_power_off); return snprintf(buf, SEC_CMD_BUF_SIZE, "%ld", ilits->prox_power_off); } static ssize_t prox_power_off_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { long data; int ret; ret = kstrtol(buf, 10, &data); if (ret < 0) return ret; input_info(true, ilits->dev, "%s: %ld\n", __func__, data); ilits->prox_power_off = data; return count; } static ssize_t protos_event_show(struct device *dev, struct device_attribute *attr, char *buf) { input_info(true, ilits->dev, "%s: %d\n", __func__, ilits->proxmity_face); return snprintf(buf, SEC_CMD_BUF_SIZE, "%d", ilits->proxmity_face != 3 ? 0 : 3); } static ssize_t protos_event_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { u8 data; int ret; ret = kstrtou8(buf, 10, &data); if (ret < 0) return ret; mutex_lock(&ilits->touch_mutex); input_info(true, ilits->dev, "%s: %d\n", __func__, data); if ((data != EAR_DETECT_DISABLE) && (data != EAR_DETECT_NORMAL_MODE) && (data != EAR_DETECT_INSENSITIVE_MODE)) { input_info(true, ilits->dev, "%s: Not supported value:%d\n", __func__, data); mutex_unlock(&ilits->touch_mutex); return count; } ilits->prox_face_mode = data; if (ilits->tp_suspend) { input_info(true, ilits->dev, "%s: now screen off stae, it'll setting after screen on(%d)\n", __func__, ilits->prox_face_mode); mutex_unlock(&ilits->touch_mutex); return count; } ret = ili_ic_func_ctrl("proximity", ilits->prox_face_mode); if (ret < 0) input_err(true, ilits->dev, "%s Ear Detect Mode Setting failed\n", __func__); mutex_unlock(&ilits->touch_mutex); return count; } static ssize_t enabled_show(struct device *dev, struct device_attribute *attr, char *buf) { input_info(true, ilits->dev, "%s: %d\n", __func__, ilits->screen_off_sate); return snprintf(buf, SEC_CMD_BUF_SIZE, "%d", ilits->screen_off_sate); } static ssize_t enabled_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int buff[2]; int ret; ret = sscanf(buf, "%d,%d", &buff[0], &buff[1]); if (ret != 2) { input_err(true, ilits->dev, "%s: failed read params [%d]\n", __func__, ret); return -EINVAL; } input_info(true, ilits->dev, "%s: %d %d\n", __func__, buff[0], buff[1]); /* handle same sequence : buff[0] = LCD_ON, LCD_DOZE1, LCD_DOZE2*/ if (buff[0] == LCD_DOZE1 || buff[0] == LCD_DOZE2) buff[0] = LCD_ON; switch (buff[0]) { case LCD_OFF: if (buff[1] == LCD_EARLY_EVENT) { if (ili_sleep_handler(TP_EARLY_SUSPEND) < 0) input_err(true, ilits->dev, "%s TP suspend failed\n", __func__); } break; case LCD_ON: if (buff[1] == LCD_EARLY_EVENT) { if ((ilits->screen_off_sate != TP_EARLY_RESUME) && (ilits->screen_off_sate != TP_RESUME)) ili_sleep_handler(TP_EARLY_RESUME); } else if (buff[1] == LCD_LATE_EVENT) { if (ili_sleep_handler(TP_RESUME) < 0) input_err(true, ilits->dev, "%s TP resume failed\n", __func__); } break; default: ILI_DBG("%s Unknown event\n", __func__); break; } return count; } static DEVICE_ATTR(sensitivity_mode, S_IRUGO | S_IWUSR | S_IWGRP, sensitivity_mode_show, sensitivity_mode_store); static DEVICE_ATTR(support_feature, S_IRUGO, read_support_feature, NULL); static DEVICE_ATTR(prox_power_off, S_IRUGO | S_IWUSR | S_IWGRP, prox_power_off_show, prox_power_off_store); static DEVICE_ATTR(virtual_prox, S_IRUGO | S_IWUSR | S_IWGRP, protos_event_show, protos_event_store); static DEVICE_ATTR(enabled, S_IRUGO | S_IWUSR | S_IWGRP, enabled_show, enabled_store); static struct attribute *cmd_attributes[] = { &dev_attr_sensitivity_mode.attr, &dev_attr_support_feature.attr, &dev_attr_prox_power_off.attr, &dev_attr_virtual_prox.attr, &dev_attr_enabled.attr, NULL, }; static struct attribute_group cmd_attr_group = { .attrs = cmd_attributes, }; int ili_sec_fn_init(void) { int retval; input_info(true, ilits->dev, "%s\n", __func__); retval = sec_cmd_init(&ilits->sec, sec_cmds, ARRAY_SIZE(sec_cmds), SEC_CLASS_DEVT_TSP); if (retval < 0) { input_err(true, ilits->dev, "%s: Failed to sec_cmd_init\n", __func__); goto exit; } retval = sysfs_create_group(&ilits->sec.fac_dev->kobj, &cmd_attr_group); if (retval < 0) { input_err(true, ilits->dev, "%s: Failed to create sysfs attributes\n", __func__); goto exit; } ilits->pFrame = kzalloc(ilits->panel_wid * ilits->panel_hei * sizeof(short), GFP_KERNEL); if (!ilits->pFrame) { input_err(true, ilits->dev, "%s: Failed to alloc memory pFrame\n", __func__); retval = -EINVAL; goto exit; } return 0; exit: return retval; } void ili_sec_fn_remove(void) { input_info(true, ilits->dev, "%s\n", __func__); kfree(ilits->pFrame); sysfs_remove_group(&ilits->sec.fac_dev->kobj, &cmd_attr_group); sec_cmd_exit(&ilits->sec, SEC_CLASS_DEVT_TSP); }