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 &&
526 cyapa_pip_event_process(cyapa,
537 struct cyapa *cyapa,
541 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
548 error = cyapa_i2c_pip_write(cyapa, cmd, cmd_len);
566 struct cyapa *cyapa,
572 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
578 error = cyapa_i2c_pip_write(cyapa, cmd, cmd_len);
590 error = cyapa_empty_pip_output_data(cyapa,
606 struct cyapa *cyapa,
613 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
641 error = cyapa_do_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
650 error = cyapa_empty_pip_output_data(cyapa,
657 error = cyapa_do_i2c_pip_cmd_polling(cyapa, cmd, cmd_len,
670 bool cyapa_sort_tsg_pip_bl_resp_data(struct cyapa *cyapa,
685 bool cyapa_sort_tsg_pip_app_resp_data(struct cyapa *cyapa,
688 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
712 static bool cyapa_sort_pip_application_launch_data(struct cyapa *cyapa,
728 static bool cyapa_sort_gen5_hid_descriptor_data(struct cyapa *cyapa,
756 static bool cyapa_sort_pip_deep_sleep_data(struct cyapa *cyapa,
768 static int gen5_idle_state_parse(struct cyapa *cyapa)
779 * when the trackpad is just power on the cyapa go here.
781 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
784 ret = cyapa_i2c_pip_read(cyapa, resp_data, 3);
791 cyapa->gen = CYAPA_GEN5;
793 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
799 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
817 cyapa->state = CYAPA_STATE_GEN5_BL;
824 cyapa->state = CYAPA_STATE_GEN5_APP;
827 cyapa->state = CYAPA_STATE_NO_DEVICE;
834 static int gen5_hid_description_header_parse(struct cyapa *cyapa, u8 *reg_data)
848 ret = cyapa_i2c_pip_read(cyapa, resp_data,
861 cyapa->gen = CYAPA_GEN5;
862 cyapa->state = CYAPA_STATE_GEN5_BL;
868 cyapa->gen = CYAPA_GEN5;
869 cyapa->state = CYAPA_STATE_GEN5_APP;
875 cyapa->gen = CYAPA_GEN5;
876 cyapa->state = CYAPA_STATE_GEN5_BL;
882 cyapa->gen = CYAPA_GEN5;
883 cyapa->state = CYAPA_STATE_GEN5_APP;
886 cyapa->state = CYAPA_STATE_NO_DEVICE;
892 static int gen5_report_data_header_parse(struct cyapa *cyapa, u8 *reg_data)
918 cyapa->gen = CYAPA_GEN5;
919 cyapa->state = CYAPA_STATE_GEN5_APP;
923 static int gen5_cmd_resp_header_parse(struct cyapa *cyapa, u8 *reg_data)
925 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
935 ret = cyapa_i2c_pip_read(cyapa, pip->empty_buf, length);
944 cyapa->gen = CYAPA_GEN5;
945 cyapa->state = CYAPA_STATE_GEN5_BL;
948 cyapa->gen = CYAPA_GEN5;
949 cyapa->state = CYAPA_STATE_GEN5_APP;
960 cyapa->gen = CYAPA_GEN5;
961 cyapa->state = CYAPA_STATE_GEN5_BL;
967 cyapa->gen = CYAPA_GEN5;
968 cyapa->state = CYAPA_STATE_GEN5_APP;
971 cyapa->state = CYAPA_STATE_NO_DEVICE;
977 static int cyapa_gen5_state_parse(struct cyapa *cyapa, u8 *reg_data, int len)
984 cyapa->state = CYAPA_STATE_NO_DEVICE;
989 gen5_idle_state_parse(cyapa);
993 gen5_hid_description_header_parse(cyapa, reg_data);
998 cyapa->gen = CYAPA_GEN5;
999 cyapa->state = CYAPA_STATE_GEN5_APP;
1003 cyapa->gen = CYAPA_GEN5;
1004 cyapa->state = CYAPA_STATE_GEN5_BL;
1010 gen5_report_data_header_parse(cyapa, reg_data);
1013 gen5_cmd_resp_header_parse(cyapa, reg_data);
1016 if (cyapa->gen == CYAPA_GEN5) {
1023 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1025 if (cyapa->state == CYAPA_STATE_GEN5_APP ||
1026 cyapa->state == CYAPA_STATE_GEN5_BL)
1045 int cyapa_pip_bl_initiate(struct cyapa *cyapa, const struct firmware *fw)
1064 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1104 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1116 static bool cyapa_sort_pip_bl_exit_data(struct cyapa *cyapa, u8 *buf, int len)
1136 int cyapa_pip_bl_exit(struct cyapa *cyapa)
1148 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1166 int cyapa_pip_bl_enter(struct cyapa *cyapa)
1173 error = cyapa_poll_state(cyapa, 500);
1178 if (cyapa_is_pip_bl_mode(cyapa))
1180 else if (!cyapa_is_pip_app_mode(cyapa))
1184 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1192 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1200 cyapa->operational = false;
1201 if (cyapa->gen == CYAPA_GEN5)
1202 cyapa->state = CYAPA_STATE_GEN5_BL;
1203 else if (cyapa->gen == CYAPA_GEN6)
1204 cyapa->state = CYAPA_STATE_GEN6_BL;
1208 static int cyapa_pip_fw_head_check(struct cyapa *cyapa,
1214 switch (cyapa->gen) {
1222 if (cyapa->platform_ver < 2) {
1239 int cyapa_pip_check_fw(struct cyapa *cyapa, const struct firmware *fw)
1241 struct device *dev = &cyapa->client->dev;
1253 if (cyapa_pip_fw_head_check(cyapa,
1314 static int cyapa_pip_write_fw_block(struct cyapa *cyapa,
1370 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
1381 int cyapa_pip_do_fw_update(struct cyapa *cyapa,
1384 struct device *dev = &cyapa->client->dev;
1390 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1400 error = cyapa_pip_write_fw_block(cyapa, &image_records[i]);
1411 static int cyapa_gen5_change_power_state(struct cyapa *cyapa, u8 power_state)
1420 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1430 static int cyapa_gen5_set_interval_time(struct cyapa *cyapa,
1476 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
1487 static int cyapa_gen5_get_interval_time(struct cyapa *cyapa,
1530 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, cmd_len,
1545 static int cyapa_gen5_disable_pip_report(struct cyapa *cyapa)
1564 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1575 int cyapa_pip_set_proximity(struct cyapa *cyapa, bool enable)
1585 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1597 int cyapa_pip_deep_sleep(struct cyapa *cyapa, u8 state)
1606 error = cyapa_i2c_pip_cmd_irq_sync(cyapa, cmd, sizeof(cmd),
1615 static int cyapa_gen5_set_power_mode(struct cyapa *cyapa,
1618 struct device *dev = &cyapa->client->dev;
1622 if (cyapa->state != CYAPA_STATE_GEN5_APP)
1625 cyapa_set_pip_pm_state(cyapa, pm_stage);
1627 if (PIP_DEV_GET_PWR_STATE(cyapa) == UNINIT_PWR_MODE) {
1633 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_OFF);
1636 if (PIP_DEV_UNINIT_SLEEP_TIME(cyapa) &&
1637 PIP_DEV_GET_PWR_STATE(cyapa) != PWR_MODE_OFF)
1638 if (cyapa_gen5_get_interval_time(cyapa,
1640 &cyapa->dev_sleep_time) != 0)
1641 PIP_DEV_SET_SLEEP_TIME(cyapa, UNINIT_SLEEP_TIME);
1643 if (PIP_DEV_GET_PWR_STATE(cyapa) == power_mode) {
1647 PIP_DEV_GET_SLEEP_TIME(cyapa) == sleep_time) {
1654 error = cyapa_pip_deep_sleep(cyapa, PIP_DEEP_SLEEP_STATE_OFF);
1660 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_OFF);
1669 if (PIP_DEV_GET_PWR_STATE(cyapa) == PWR_MODE_OFF) {
1670 error = cyapa_pip_deep_sleep(cyapa, PIP_DEEP_SLEEP_STATE_ON);
1678 error = cyapa_gen5_change_power_state(cyapa,
1685 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_FULL_ACTIVE);
1687 error = cyapa_gen5_change_power_state(cyapa,
1694 PIP_DEV_SET_PWR_STATE(cyapa, PWR_MODE_BTN_ONLY);
1701 if (PIP_DEV_UNINIT_SLEEP_TIME(cyapa) ||
1702 sleep_time != PIP_DEV_GET_SLEEP_TIME(cyapa))
1703 if (cyapa_gen5_set_interval_time(cyapa,
1706 PIP_DEV_SET_SLEEP_TIME(cyapa, sleep_time);
1712 error = cyapa_gen5_change_power_state(cyapa, power_state);
1730 cyapa_gen5_disable_pip_report(cyapa);
1732 PIP_DEV_SET_PWR_STATE(cyapa,
1737 cyapa_reset_pip_pm_state(cyapa);
1741 int cyapa_pip_resume_scanning(struct cyapa *cyapa)
1749 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1752 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1760 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1765 int cyapa_pip_suspend_scanning(struct cyapa *cyapa)
1773 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1776 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1784 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1789 static int cyapa_pip_calibrate_pwcs(struct cyapa *cyapa,
1799 cyapa_empty_pip_output_data(cyapa, NULL, NULL, NULL);
1809 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
1824 struct cyapa *cyapa = dev_get_drvdata(dev);
1828 error = cyapa_pip_suspend_scanning(cyapa);
1833 calibrate_error = cyapa_pip_calibrate_pwcs(cyapa,
1839 calibrate_error = cyapa_pip_calibrate_pwcs(cyapa,
1846 error = cyapa_pip_resume_scanning(cyapa);
1902 static void cyapa_gen5_guess_electrodes(struct cyapa *cyapa,
1905 if (cyapa->electrodes_rx != 0) {
1906 *electrodes_rx = cyapa->electrodes_rx;
1907 *electrodes_tx = (cyapa->electrodes_x == *electrodes_rx) ?
1908 cyapa->electrodes_y : cyapa->electrodes_x;
1910 *electrodes_tx = min(cyapa->electrodes_x, cyapa->electrodes_y);
1911 *electrodes_rx = max(cyapa->electrodes_x, cyapa->electrodes_y);
1933 static int cyapa_gen5_read_idac_data(struct cyapa *cyapa,
1975 if (cyapa->aligned_electrodes_rx == 0) {
1976 cyapa_gen5_guess_electrodes(cyapa,
1978 cyapa->aligned_electrodes_rx =
1982 (cyapa->aligned_electrodes_rx + 7) & ~7u;
1992 offset = cyapa->aligned_electrodes_rx * (*data_size);
1993 if (cyapa->electrodes_rx == cyapa->electrodes_x)
1994 electrodes_tx = cyapa->electrodes_y;
1996 electrodes_tx = cyapa->electrodes_x;
1997 max_element_cnt = ((cyapa->aligned_electrodes_rx + 7) &
2001 max_element_cnt = cyapa->electrodes_x +
2002 cyapa->electrodes_y;
2023 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2067 tmp_count < cyapa->aligned_electrodes_rx &&
2101 if (tmp_count == cyapa->aligned_electrodes_rx) {
2102 cyapa->electrodes_rx = cyapa->electrodes_rx ?
2103 cyapa->electrodes_rx : electrodes_rx;
2105 cyapa->electrodes_rx = cyapa->electrodes_rx ?
2106 cyapa->electrodes_rx : electrodes_rx;
2107 cyapa->aligned_electrodes_rx = electrodes_rx;
2109 cyapa->electrodes_rx = cyapa->electrodes_rx ?
2110 cyapa->electrodes_rx : electrodes_tx;
2111 cyapa->aligned_electrodes_rx = tmp_count;
2122 static int cyapa_gen5_read_mutual_idac_data(struct cyapa *cyapa,
2133 error = cyapa_gen5_read_idac_data(cyapa,
2141 error = cyapa_gen5_read_idac_data(cyapa,
2149 static int cyapa_gen5_read_self_idac_data(struct cyapa *cyapa,
2160 error = cyapa_gen5_read_idac_data(cyapa,
2170 error = cyapa_gen5_read_idac_data(cyapa,
2178 static ssize_t cyapa_gen5_execute_panel_scan(struct cyapa *cyapa)
2193 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2206 static int cyapa_gen5_read_panel_scan_raw_data(struct cyapa *cyapa,
2253 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2304 struct cyapa *cyapa = dev_get_drvdata(dev);
2318 if (!cyapa_is_pip_app_mode(cyapa))
2322 error = cyapa_pip_suspend_scanning(cyapa);
2328 error = cyapa_gen5_read_mutual_idac_data(cyapa,
2336 error = cyapa_gen5_read_self_idac_data(cyapa,
2344 error = cyapa_gen5_execute_panel_scan(cyapa);
2349 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2352 cyapa->electrodes_x * cyapa->electrodes_y,
2360 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2363 cyapa->electrodes_x + cyapa->electrodes_y,
2371 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2374 cyapa->electrodes_x * cyapa->electrodes_y,
2382 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2385 cyapa->electrodes_x + cyapa->electrodes_y,
2393 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2396 cyapa->electrodes_x * cyapa->electrodes_y,
2404 error = cyapa_gen5_read_panel_scan_raw_data(cyapa,
2407 cyapa->electrodes_x + cyapa->electrodes_y,
2416 resume_error = cyapa_pip_resume_scanning(cyapa);
2437 bool cyapa_pip_sort_system_info_data(struct cyapa *cyapa,
2447 static int cyapa_gen5_bl_query_data(struct cyapa *cyapa)
2454 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2462 memcpy(&cyapa->product_id[0], &resp_data[8], 5);
2463 cyapa->product_id[5] = '-';
2464 memcpy(&cyapa->product_id[6], &resp_data[13], 6);
2465 cyapa->product_id[12] = '-';
2466 memcpy(&cyapa->product_id[13], &resp_data[19], 2);
2467 cyapa->product_id[15] = '\0';
2469 cyapa->fw_maj_ver = resp_data[22];
2470 cyapa->fw_min_ver = resp_data[23];
2472 cyapa->platform_ver = (resp_data[26] >> PIP_BL_PLATFORM_VER_SHIFT) &
2478 static int cyapa_gen5_get_query_data(struct cyapa *cyapa)
2486 error = cyapa_i2c_pip_cmd_irq_sync(cyapa,
2498 cyapa->platform_ver = (resp_data[49] >> PIP_BL_PLATFORM_VER_SHIFT) &
2500 if (cyapa->gen == CYAPA_GEN5 && cyapa->platform_ver < 2) {
2502 cyapa->fw_maj_ver = resp_data[15];
2503 cyapa->fw_min_ver = resp_data[16];
2505 cyapa->fw_maj_ver = resp_data[9];
2506 cyapa->fw_min_ver = resp_data[10];
2509 cyapa->electrodes_x = resp_data[52];
2510 cyapa->electrodes_y = resp_data[53];
2512 cyapa->physical_size_x = get_unaligned_le16(&resp_data[54]) / 100;
2513 cyapa->physical_size_y = get_unaligned_le16(&resp_data[56]) / 100;
2515 cyapa->max_abs_x = get_unaligned_le16(&resp_data[58]);
2516 cyapa->max_abs_y = get_unaligned_le16(&resp_data[60]);
2518 cyapa->max_z = get_unaligned_le16(&resp_data[62]);
2520 cyapa->x_origin = resp_data[64] & 0x01;
2521 cyapa->y_origin = resp_data[65] & 0x01;
2523 cyapa->btn_capability = (resp_data[70] << 3) & CAPABILITY_BTN_MASK;
2525 memcpy(&cyapa->product_id[0], &resp_data[33], 5);
2526 cyapa->product_id[5] = '-';
2527 memcpy(&cyapa->product_id[6], &resp_data[38], 6);
2528 cyapa->product_id[12] = '-';
2529 memcpy(&cyapa->product_id[13], &resp_data[44], 2);
2530 cyapa->product_id[15] = '\0';
2532 if (!cyapa->electrodes_x || !cyapa->electrodes_y ||
2533 !cyapa->physical_size_x || !cyapa->physical_size_y ||
2534 !cyapa->max_abs_x || !cyapa->max_abs_y || !cyapa->max_z)
2540 static int cyapa_gen5_do_operational_check(struct cyapa *cyapa)
2542 struct device *dev = &cyapa->client->dev;
2545 if (cyapa->gen != CYAPA_GEN5)
2548 switch (cyapa->state) {
2550 error = cyapa_pip_bl_exit(cyapa);
2553 cyapa_gen5_bl_query_data(cyapa);
2557 cyapa->state = CYAPA_STATE_GEN5_APP;
2567 error = cyapa_gen5_set_power_mode(cyapa,
2574 if (cyapa->platform_ver >= 2) {
2575 error = cyapa_pip_set_proximity(cyapa, true);
2583 error = cyapa_gen5_get_query_data(cyapa);
2587 if (memcmp(cyapa->product_id, product_id,
2590 __func__, cyapa->product_id);
2606 bool cyapa_pip_irq_cmd_handler(struct cyapa *cyapa)
2608 struct cyapa_pip_cmd_states *pip = &cyapa->cmd_states.pip;
2621 cyapa_i2c_pip_read(cyapa, pip->irq_cmd_buf,
2627 cyapa_i2c_pip_read(cyapa,
2630 pip->resp_sort_func(cyapa,
2648 cyapa_empty_pip_output_data(cyapa,
2674 static void cyapa_pip_report_buttons(struct cyapa *cyapa,
2677 struct input_dev *input = cyapa->input;
2682 if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK) {
2686 if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK) {
2690 if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK) {
2698 static void cyapa_pip_report_proximity(struct cyapa *cyapa,
2701 struct input_dev *input = cyapa->input;
2709 static void cyapa_pip_report_slot_data(struct cyapa *cyapa,
2712 struct input_dev *input = cyapa->input;
2723 if (cyapa->x_origin)
2724 x = cyapa->max_abs_x - x;
2726 if (cyapa->y_origin)
2727 y = cyapa->max_abs_y - y;
2747 static void cyapa_pip_report_touches(struct cyapa *cyapa,
2750 struct input_dev *input = cyapa->input;
2758 cyapa_pip_report_slot_data(cyapa,
2765 int cyapa_pip_irq_handler(struct cyapa *cyapa)
2767 struct device *dev = &cyapa->client->dev;
2772 if (!cyapa_is_pip_app_mode(cyapa)) {
2774 cyapa->gen, cyapa->state);
2778 ret = cyapa_i2c_pip_read(cyapa, (u8 *)&report_data,
2799 ret = cyapa_i2c_pip_read(cyapa, (u8 *)&report_data, report_len);
2806 return cyapa_pip_event_process(cyapa, &report_data);
2809 static int cyapa_pip_event_process(struct cyapa *cyapa,
2812 struct device *dev = &cyapa->client->dev;
2875 cyapa_pip_report_touches(cyapa, report_data);
2877 cyapa_pip_report_proximity(cyapa, report_data);
2879 cyapa_pip_report_buttons(cyapa, report_data);
2884 int cyapa_pip_bl_activate(struct cyapa *cyapa) { return 0; }
2885 int cyapa_pip_bl_deactivate(struct cyapa *cyapa) { return 0; }