Lines Matching refs:cyapa
23 #include "cyapa.h"
345 static int cyapa_pip_event_process(struct cyapa *cyapa,
348 int cyapa_pip_cmd_state_initialize(struct cyapa *cyapa)
350 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
364 cyapa->dev_pwr_mode = UNINIT_PWR_MODE;
365 cyapa->dev_sleep_time = UNINIT_SLEEP_TIME;
371 ssize_t cyapa_i2c_pip_read(struct cyapa *cyapa, u8 *buf, size_t size)
381 ret = i2c_master_recv(cyapa->client, buf, size);
391 ssize_t cyapa_i2c_pip_write(struct cyapa *cyapa, u8 *buf, size_t size)
398 ret = i2c_master_send(cyapa->client, buf, size);
406 static void cyapa_set_pip_pm_state(struct cyapa *cyapa,
409 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
416 static void cyapa_reset_pip_pm_state(struct cyapa *cyapa)
418 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
426 static enum cyapa_pm_stage cyapa_get_pip_pm_state(struct cyapa *cyapa)
428 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
442 int cyapa_empty_pip_output_data(struct cyapa *cyapa,
445 struct input_dev *input = cyapa->input;
446 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
447 enum cyapa_pm_stage pm_stage = cyapa_get_pip_pm_state(cyapa);
465 * Depending on testing in cyapa driver, there are max 5 "02 00"
479 error = cyapa_i2c_pip_read(cyapa, pip->empty_buf,
495 func(cyapa, pip->empty_buf, length)) {
505 error = cyapa_i2c_pip_read(cyapa, pip->empty_buf, length);
515 func(cyapa, pip->empty_buf, length)) {
521 } else if (cyapa->operational && input && input->users &&
525 cyapa_pip_event_process(cyapa,
536 struct cyapa *cyapa,
540 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
547 error = cyapa_i2c_pip_write(cyapa, cmd, cmd_len);
565 struct cyapa *cyapa,
571 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
577 error = cyapa_i2c_pip_write(cyapa, cmd, cmd_len);
589 error = cyapa_empty_pip_output_data(cyapa,
605 struct cyapa *cyapa,
612 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
640 error = cyapa_do_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
649 error = cyapa_empty_pip_output_data(cyapa,
656 error = cyapa_do_i2c_pip_cmd_polling(cyapa, cmd, cmd_len,
669 bool cyapa_sort_tsg_pip_bl_resp_data(struct cyapa *cyapa,
684 bool cyapa_sort_tsg_pip_app_resp_data(struct cyapa *cyapa,
687 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
711 static bool cyapa_sort_pip_application_launch_data(struct cyapa *cyapa,
727 static bool cyapa_sort_gen5_hid_descriptor_data(struct cyapa *cyapa,
755 static bool cyapa_sort_pip_deep_sleep_data(struct cyapa *cyapa,
767 static int gen5_idle_state_parse(struct cyapa *cyapa)
778 * when the trackpad is just power on the cyapa go here.
780 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
783 ret = cyapa_i2c_pip_read(cyapa, resp_data, 3);
790 cyapa->gen = CYAPA_GEN5;
792 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
798 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
816 cyapa->state = CYAPA_STATE_GEN5_BL;
823 cyapa->state = CYAPA_STATE_GEN5_APP;
826 cyapa->state = CYAPA_STATE_NO_DEVICE;
833 static int gen5_hid_description_header_parse(struct cyapa *cyapa, u8 *reg_data)
847 ret = cyapa_i2c_pip_read(cyapa, resp_data,
860 cyapa->gen = CYAPA_GEN5;
861 cyapa->state = CYAPA_STATE_GEN5_BL;
867 cyapa->gen = CYAPA_GEN5;
868 cyapa->state = CYAPA_STATE_GEN5_APP;
874 cyapa->gen = CYAPA_GEN5;
875 cyapa->state = CYAPA_STATE_GEN5_BL;
881 cyapa->gen = CYAPA_GEN5;
882 cyapa->state = CYAPA_STATE_GEN5_APP;
885 cyapa->state = CYAPA_STATE_NO_DEVICE;
891 static int gen5_report_data_header_parse(struct cyapa *cyapa, u8 *reg_data)
917 cyapa->gen = CYAPA_GEN5;
918 cyapa->state = CYAPA_STATE_GEN5_APP;
922 static int gen5_cmd_resp_header_parse(struct cyapa *cyapa, u8 *reg_data)
924 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
934 ret = cyapa_i2c_pip_read(cyapa, pip->empty_buf, length);
943 cyapa->gen = CYAPA_GEN5;
944 cyapa->state = CYAPA_STATE_GEN5_BL;
947 cyapa->gen = CYAPA_GEN5;
948 cyapa->state = CYAPA_STATE_GEN5_APP;
959 cyapa->gen = CYAPA_GEN5;
960 cyapa->state = CYAPA_STATE_GEN5_BL;
966 cyapa->gen = CYAPA_GEN5;
967 cyapa->state = CYAPA_STATE_GEN5_APP;
970 cyapa->state = CYAPA_STATE_NO_DEVICE;
976 static int cyapa_gen5_state_parse(struct cyapa *cyapa, u8 *reg_data, int len)
983 cyapa->state = CYAPA_STATE_NO_DEVICE;
988 gen5_idle_state_parse(cyapa);
992 gen5_hid_description_header_parse(cyapa, reg_data);
997 cyapa->gen = CYAPA_GEN5;
998 cyapa->state = CYAPA_STATE_GEN5_APP;
1002 cyapa->gen = CYAPA_GEN5;
1003 cyapa->state = CYAPA_STATE_GEN5_BL;
1009 gen5_report_data_header_parse(cyapa, reg_data);
1012 gen5_cmd_resp_header_parse(cyapa, reg_data);
1015 if (cyapa->gen == CYAPA_GEN5) {
1022 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1024 if (cyapa->state == CYAPA_STATE_GEN5_APP ||
1025 cyapa->state == CYAPA_STATE_GEN5_BL)
1044 int cyapa_pip_bl_initiate(struct cyapa *cyapa, const struct firmware *fw)
1063 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1103 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1115 static bool cyapa_sort_pip_bl_exit_data(struct cyapa *cyapa, u8 *buf, int len)
1135 int cyapa_pip_bl_exit(struct cyapa *cyapa)
1147 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1165 int cyapa_pip_bl_enter(struct cyapa *cyapa)
1172 error = cyapa_poll_state(cyapa, 500);
1177 if (cyapa_is_pip_bl_mode(cyapa))
1179 else if (!cyapa_is_pip_app_mode(cyapa))
1183 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1191 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1199 cyapa->operational = false;
1200 if (cyapa->gen == CYAPA_GEN5)
1201 cyapa->state = CYAPA_STATE_GEN5_BL;
1202 else if (cyapa->gen == CYAPA_GEN6)
1203 cyapa->state = CYAPA_STATE_GEN6_BL;
1207 static int cyapa_pip_fw_head_check(struct cyapa *cyapa,
1213 switch (cyapa->gen) {
1221 if (cyapa->platform_ver < 2) {
1238 int cyapa_pip_check_fw(struct cyapa *cyapa, const struct firmware *fw)
1240 struct device *dev = &cyapa->client->dev;
1252 if (cyapa_pip_fw_head_check(cyapa,
1313 static int cyapa_pip_write_fw_block(struct cyapa *cyapa,
1369 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
1380 int cyapa_pip_do_fw_update(struct cyapa *cyapa,
1383 struct device *dev = &cyapa->client->dev;
1389 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1399 error = cyapa_pip_write_fw_block(cyapa, &image_records[i]);
1410 static int cyapa_gen5_change_power_state(struct cyapa *cyapa, u8 power_state)
1419 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1429 static int cyapa_gen5_set_interval_time(struct cyapa *cyapa,
1475 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
1486 static int cyapa_gen5_get_interval_time(struct cyapa *cyapa,
1529 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
1544 static int cyapa_gen5_disable_pip_report(struct cyapa *cyapa)
1563 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1574 int cyapa_pip_set_proximity(struct cyapa *cyapa, bool enable)
1584 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1596 int cyapa_pip_deep_sleep(struct cyapa *cyapa, u8 state)
1605 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1614 static int cyapa_gen5_set_power_mode(struct cyapa *cyapa,
1617 struct device *dev = &cyapa->client->dev;
1621 if (cyapa->state != CYAPA_STATE_GEN5_APP)
1624 cyapa_set_pip_pm_state(cyapa, pm_stage);
1626 if (PIP_DEV_GET_PWR_STATE(cyapa) == UNINIT_PWR_MODE) {
1632 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_OFF);
1635 if (PIP_DEV_UNINIT_SLEEP_TIME(cyapa) &&
1636 PIP_DEV_GET_PWR_STATE(cyapa) != PWR_MODE_OFF)
1637 if (cyapa_gen5_get_interval_time(cyapa,
1639 &cyapa->dev_sleep_time) != 0)
1640 PIP_DEV_SET_SLEEP_TIME(cyapa, UNINIT_SLEEP_TIME);
1642 if (PIP_DEV_GET_PWR_STATE(cyapa) == power_mode) {
1646 PIP_DEV_GET_SLEEP_TIME(cyapa) == sleep_time) {
1653 error = cyapa_pip_deep_sleep(cyapa, PIP_DEEP_SLEEP_STATE_OFF);
1659 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_OFF);
1668 if (PIP_DEV_GET_PWR_STATE(cyapa) == PWR_MODE_OFF) {
1669 error = cyapa_pip_deep_sleep(cyapa, PIP_DEEP_SLEEP_STATE_ON);
1677 error = cyapa_gen5_change_power_state(cyapa,
1684 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_FULL_ACTIVE);
1686 error = cyapa_gen5_change_power_state(cyapa,
1693 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_BTN_ONLY);
1700 if (PIP_DEV_UNINIT_SLEEP_TIME(cyapa) ||
1701 sleep_time != PIP_DEV_GET_SLEEP_TIME(cyapa))
1702 if (cyapa_gen5_set_interval_time(cyapa,
1705 PIP_DEV_SET_SLEEP_TIME(cyapa, sleep_time);
1711 error = cyapa_gen5_change_power_state(cyapa, power_state);
1729 cyapa_gen5_disable_pip_report(cyapa);
1731 PIP_DEV_SET_PWR_STATE(cyapa,
1736 cyapa_reset_pip_pm_state(cyapa);
1740 int cyapa_pip_resume_scanning(struct cyapa *cyapa)
1748 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1751 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1759 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1764 int cyapa_pip_suspend_scanning(struct cyapa *cyapa)
1772 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1775 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1783 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1788 static int cyapa_pip_calibrate_pwcs(struct cyapa *cyapa,
1798 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1808 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1823 struct cyapa *cyapa = dev_get_drvdata(dev);
1827 error = cyapa_pip_suspend_scanning(cyapa);
1832 calibrate_error = cyapa_pip_calibrate_pwcs(cyapa,
1838 calibrate_error = cyapa_pip_calibrate_pwcs(cyapa,
1845 error = cyapa_pip_resume_scanning(cyapa);
1901 static void cyapa_gen5_guess_electrodes(struct cyapa *cyapa,
1904 if (cyapa->electrodes_rx != 0) {
1905 *electrodes_rx = cyapa->electrodes_rx;
1906 *electrodes_tx = (cyapa->electrodes_x == *electrodes_rx) ?
1907 cyapa->electrodes_y : cyapa->electrodes_x;
1909 *electrodes_tx = min(cyapa->electrodes_x, cyapa->electrodes_y);
1910 *electrodes_rx = max(cyapa->electrodes_x, cyapa->electrodes_y);
1932 static int cyapa_gen5_read_idac_data(struct cyapa *cyapa,
1974 if (cyapa->aligned_electrodes_rx == 0) {
1975 cyapa_gen5_guess_electrodes(cyapa,
1977 cyapa->aligned_electrodes_rx =
1981 (cyapa->aligned_electrodes_rx + 7) & ~7u;
1991 offset = cyapa->aligned_electrodes_rx * (*data_size);
1992 if (cyapa->electrodes_rx == cyapa->electrodes_x)
1993 electrodes_tx = cyapa->electrodes_y;
1995 electrodes_tx = cyapa->electrodes_x;
1996 max_element_cnt = ((cyapa->aligned_electrodes_rx + 7) &
2000 max_element_cnt = cyapa->electrodes_x +
2001 cyapa->electrodes_y;
2022 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2066 tmp_count < cyapa->aligned_electrodes_rx &&
2100 if (tmp_count == cyapa->aligned_electrodes_rx) {
2101 cyapa->electrodes_rx = cyapa->electrodes_rx ?
2102 cyapa->electrodes_rx : electrodes_rx;
2104 cyapa->electrodes_rx = cyapa->electrodes_rx ?
2105 cyapa->electrodes_rx : electrodes_rx;
2106 cyapa->aligned_electrodes_rx = electrodes_rx;
2108 cyapa->electrodes_rx = cyapa->electrodes_rx ?
2109 cyapa->electrodes_rx : electrodes_tx;
2110 cyapa->aligned_electrodes_rx = tmp_count;
2121 static int cyapa_gen5_read_mutual_idac_data(struct cyapa *cyapa,
2132 error = cyapa_gen5_read_idac_data(cyapa,
2140 error = cyapa_gen5_read_idac_data(cyapa,
2148 static int cyapa_gen5_read_self_idac_data(struct cyapa *cyapa,
2159 error = cyapa_gen5_read_idac_data(cyapa,
2169 error = cyapa_gen5_read_idac_data(cyapa,
2177 static ssize_t cyapa_gen5_execute_panel_scan(struct cyapa *cyapa)
2192 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2205 static int cyapa_gen5_read_panel_scan_raw_data(struct cyapa *cyapa,
2252 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2303 struct cyapa *cyapa = dev_get_drvdata(dev);
2317 if (!cyapa_is_pip_app_mode(cyapa))
2321 error = cyapa_pip_suspend_scanning(cyapa);
2327 error = cyapa_gen5_read_mutual_idac_data(cyapa,
2335 error = cyapa_gen5_read_self_idac_data(cyapa,
2343 error = cyapa_gen5_execute_panel_scan(cyapa);
2348 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2351 cyapa->electrodes_x * cyapa->electrodes_y,
2359 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2362 cyapa->electrodes_x + cyapa->electrodes_y,
2370 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2373 cyapa->electrodes_x * cyapa->electrodes_y,
2381 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2384 cyapa->electrodes_x + cyapa->electrodes_y,
2392 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2395 cyapa->electrodes_x * cyapa->electrodes_y,
2403 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2406 cyapa->electrodes_x + cyapa->electrodes_y,
2415 resume_error = cyapa_pip_resume_scanning(cyapa);
2436 bool cyapa_pip_sort_system_info_data(struct cyapa *cyapa,
2446 static int cyapa_gen5_bl_query_data(struct cyapa *cyapa)
2453 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2461 memcpy(&cyapa->product_id[0], &resp_data[8], 5);
2462 cyapa->product_id[5] = '-';
2463 memcpy(&cyapa->product_id[6], &resp_data[13], 6);
2464 cyapa->product_id[12] = '-';
2465 memcpy(&cyapa->product_id[13], &resp_data[19], 2);
2466 cyapa->product_id[15] = '\0';
2468 cyapa->fw_maj_ver = resp_data[22];
2469 cyapa->fw_min_ver = resp_data[23];
2471 cyapa->platform_ver = (resp_data[26] >> PIP_BL_PLATFORM_VER_SHIFT) &
2477 static int cyapa_gen5_get_query_data(struct cyapa *cyapa)
2485 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2497 cyapa->platform_ver = (resp_data[49] >> PIP_BL_PLATFORM_VER_SHIFT) &
2499 if (cyapa->gen == CYAPA_GEN5 && cyapa->platform_ver < 2) {
2501 cyapa->fw_maj_ver = resp_data[15];
2502 cyapa->fw_min_ver = resp_data[16];
2504 cyapa->fw_maj_ver = resp_data[9];
2505 cyapa->fw_min_ver = resp_data[10];
2508 cyapa->electrodes_x = resp_data[52];
2509 cyapa->electrodes_y = resp_data[53];
2511 cyapa->physical_size_x = get_unaligned_le16(&resp_data[54]) / 100;
2512 cyapa->physical_size_y = get_unaligned_le16(&resp_data[56]) / 100;
2514 cyapa->max_abs_x = get_unaligned_le16(&resp_data[58]);
2515 cyapa->max_abs_y = get_unaligned_le16(&resp_data[60]);
2517 cyapa->max_z = get_unaligned_le16(&resp_data[62]);
2519 cyapa->x_origin = resp_data[64] & 0x01;
2520 cyapa->y_origin = resp_data[65] & 0x01;
2522 cyapa->btn_capability = (resp_data[70] << 3) & CAPABILITY_BTN_MASK;
2524 memcpy(&cyapa->product_id[0], &resp_data[33], 5);
2525 cyapa->product_id[5] = '-';
2526 memcpy(&cyapa->product_id[6], &resp_data[38], 6);
2527 cyapa->product_id[12] = '-';
2528 memcpy(&cyapa->product_id[13], &resp_data[44], 2);
2529 cyapa->product_id[15] = '\0';
2531 if (!cyapa->electrodes_x || !cyapa->electrodes_y ||
2532 !cyapa->physical_size_x || !cyapa->physical_size_y ||
2533 !cyapa->max_abs_x || !cyapa->max_abs_y || !cyapa->max_z)
2539 static int cyapa_gen5_do_operational_check(struct cyapa *cyapa)
2541 struct device *dev = &cyapa->client->dev;
2544 if (cyapa->gen != CYAPA_GEN5)
2547 switch (cyapa->state) {
2549 error = cyapa_pip_bl_exit(cyapa);
2552 cyapa_gen5_bl_query_data(cyapa);
2556 cyapa->state = CYAPA_STATE_GEN5_APP;
2566 error = cyapa_gen5_set_power_mode(cyapa,
2573 if (cyapa->platform_ver >= 2) {
2574 error = cyapa_pip_set_proximity(cyapa, true);
2582 error = cyapa_gen5_get_query_data(cyapa);
2586 if (memcmp(cyapa->product_id, product_id,
2589 __func__, cyapa->product_id);
2605 bool cyapa_pip_irq_cmd_handler(struct cyapa *cyapa)
2607 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
2620 cyapa_i2c_pip_read(cyapa, pip->irq_cmd_buf,
2626 cyapa_i2c_pip_read(cyapa,
2629 pip->resp_sort_func(cyapa,
2647 cyapa_empty_pip_output_data(cyapa,
2673 static void cyapa_pip_report_buttons(struct cyapa *cyapa,
2676 struct input_dev *input = cyapa->input;
2681 if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK) {
2685 if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK) {
2689 if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK) {
2697 static void cyapa_pip_report_proximity(struct cyapa *cyapa,
2700 struct input_dev *input = cyapa->input;
2708 static void cyapa_pip_report_slot_data(struct cyapa *cyapa,
2711 struct input_dev *input = cyapa->input;
2722 if (cyapa->x_origin)
2723 x = cyapa->max_abs_x - x;
2725 if (cyapa->y_origin)
2726 y = cyapa->max_abs_y - y;
2746 static void cyapa_pip_report_touches(struct cyapa *cyapa,
2749 struct input_dev *input = cyapa->input;
2757 cyapa_pip_report_slot_data(cyapa,
2764 int cyapa_pip_irq_handler(struct cyapa *cyapa)
2766 struct device *dev = &cyapa->client->dev;
2771 if (!cyapa_is_pip_app_mode(cyapa)) {
2773 cyapa->gen, cyapa->state);
2777 ret = cyapa_i2c_pip_read(cyapa, (u8 *)&report_data,
2798 ret = cyapa_i2c_pip_read(cyapa, (u8 *)&report_data, report_len);
2805 return cyapa_pip_event_process(cyapa, &report_data);
2808 static int cyapa_pip_event_process(struct cyapa *cyapa,
2811 struct device *dev = &cyapa->client->dev;
2874 cyapa_pip_report_touches(cyapa, report_data);
2876 cyapa_pip_report_proximity(cyapa, report_data);
2878 cyapa_pip_report_buttons(cyapa, report_data);
2883 int cyapa_pip_bl_activate(struct cyapa *cyapa) { return 0; }
2884 int cyapa_pip_bl_deactivate(struct cyapa *cyapa) { return 0; }