Lines Matching refs:cyapa
40 static int cyapa_reinitialize(struct cyapa *cyapa);
42 static inline bool cyapa_is_bootloader_mode(struct cyapa *cyapa) in cyapa_is_bootloader_mode() argument
44 if (cyapa->gen == CYAPA_GEN5 && cyapa->state == CYAPA_STATE_GEN5_BL) in cyapa_is_bootloader_mode()
47 if (cyapa->gen == CYAPA_GEN3 && in cyapa_is_bootloader_mode()
48 cyapa->state >= CYAPA_STATE_BL_BUSY && in cyapa_is_bootloader_mode()
49 cyapa->state <= CYAPA_STATE_BL_ACTIVE) in cyapa_is_bootloader_mode()
55 static inline bool cyapa_is_operational_mode(struct cyapa *cyapa) in cyapa_is_operational_mode() argument
57 if (cyapa->gen == CYAPA_GEN5 && cyapa->state == CYAPA_STATE_GEN5_APP) in cyapa_is_operational_mode()
60 if (cyapa->gen == CYAPA_GEN3 && cyapa->state == CYAPA_STATE_OP) in cyapa_is_operational_mode()
67 static ssize_t cyapa_i2c_read(struct cyapa *cyapa, u8 reg, size_t len, in cyapa_i2c_read() argument
70 struct i2c_client *client = cyapa->client; in cyapa_i2c_read()
104 static int cyapa_i2c_write(struct cyapa *cyapa, u8 reg, in cyapa_i2c_write() argument
107 struct i2c_client *client = cyapa->client; in cyapa_i2c_write()
140 static int cyapa_get_state(struct cyapa *cyapa) in cyapa_get_state() argument
145 bool even_addr = ((cyapa->client->addr & 0x0001) == 0); in cyapa_get_state()
150 cyapa->state = CYAPA_STATE_NO_DEVICE; in cyapa_get_state()
158 error = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET, BL_STATUS_SIZE, in cyapa_get_state()
166 if (cyapa->smbus && (error == -ETIMEDOUT || error == -ENXIO)) { in cyapa_get_state()
168 error = cyapa_read_block(cyapa, in cyapa_get_state()
180 cyapa->status[REG_OP_STATUS] = status[REG_OP_STATUS]; in cyapa_get_state()
181 cyapa->status[REG_BL_STATUS] = status[REG_BL_STATUS]; in cyapa_get_state()
182 cyapa->status[REG_BL_ERROR] = status[REG_BL_ERROR]; in cyapa_get_state()
184 if (cyapa->gen == CYAPA_GEN_UNKNOWN || in cyapa_get_state()
185 cyapa->gen == CYAPA_GEN3) { in cyapa_get_state()
186 error = cyapa_gen3_ops.state_parse(cyapa, in cyapa_get_state()
191 if ((cyapa->gen == CYAPA_GEN_UNKNOWN || in cyapa_get_state()
192 cyapa->gen == CYAPA_GEN5) && in cyapa_get_state()
194 error = cyapa_gen5_ops.state_parse(cyapa, in cyapa_get_state()
207 error = cyapa_i2c_write(cyapa, 0, 2, cmd); in cyapa_get_state()
213 error = cyapa_i2c_read(cyapa, BL_HEAD_OFFSET, in cyapa_get_state()
223 if (cyapa->state <= CYAPA_STATE_BL_BUSY) in cyapa_get_state()
246 int cyapa_poll_state(struct cyapa *cyapa, unsigned int timeout) in cyapa_poll_state() argument
252 error = cyapa_get_state(cyapa); in cyapa_poll_state()
253 if (!error && cyapa->state > CYAPA_STATE_BL_BUSY) in cyapa_poll_state()
278 static int cyapa_check_is_operational(struct cyapa *cyapa) in cyapa_check_is_operational() argument
282 error = cyapa_poll_state(cyapa, 4000); in cyapa_check_is_operational()
286 switch (cyapa->gen) { in cyapa_check_is_operational()
288 cyapa->ops = &cyapa_gen5_ops; in cyapa_check_is_operational()
291 cyapa->ops = &cyapa_gen3_ops; in cyapa_check_is_operational()
297 error = cyapa->ops->operational_check(cyapa); in cyapa_check_is_operational()
298 if (!error && cyapa_is_operational_mode(cyapa)) in cyapa_check_is_operational()
299 cyapa->operational = true; in cyapa_check_is_operational()
301 cyapa->operational = false; in cyapa_check_is_operational()
312 static int cyapa_detect(struct cyapa *cyapa) in cyapa_detect() argument
314 struct device *dev = &cyapa->client->dev; in cyapa_detect()
317 error = cyapa_check_is_operational(cyapa); in cyapa_detect()
320 cyapa_is_bootloader_mode(cyapa)) { in cyapa_detect()
334 struct cyapa *cyapa = input_get_drvdata(input); in cyapa_open() local
335 struct i2c_client *client = cyapa->client; in cyapa_open()
338 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_open()
342 if (cyapa->operational) { in cyapa_open()
348 error = cyapa->ops->set_power_mode(cyapa, in cyapa_open()
356 error = cyapa_reinitialize(cyapa); in cyapa_open()
357 if (error || !cyapa->operational) { in cyapa_open()
369 mutex_unlock(&cyapa->state_sync_lock); in cyapa_open()
375 struct cyapa *cyapa = input_get_drvdata(input); in cyapa_close() local
376 struct i2c_client *client = cyapa->client; in cyapa_close()
378 mutex_lock(&cyapa->state_sync_lock); in cyapa_close()
385 if (cyapa->operational) in cyapa_close()
386 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); in cyapa_close()
388 mutex_unlock(&cyapa->state_sync_lock); in cyapa_close()
391 static int cyapa_create_input_dev(struct cyapa *cyapa) in cyapa_create_input_dev() argument
393 struct device *dev = &cyapa->client->dev; in cyapa_create_input_dev()
397 if (!cyapa->physical_size_x || !cyapa->physical_size_y) in cyapa_create_input_dev()
407 input->phys = cyapa->phys; in cyapa_create_input_dev()
411 input->dev.parent = &cyapa->client->dev; in cyapa_create_input_dev()
416 input_set_drvdata(input, cyapa); in cyapa_create_input_dev()
421 input_set_abs_params(input, ABS_MT_POSITION_X, 0, cyapa->max_abs_x, 0, in cyapa_create_input_dev()
423 input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cyapa->max_abs_y, 0, in cyapa_create_input_dev()
425 input_set_abs_params(input, ABS_MT_PRESSURE, 0, cyapa->max_z, 0, 0); in cyapa_create_input_dev()
426 if (cyapa->gen > CYAPA_GEN3) { in cyapa_create_input_dev()
443 if (cyapa->gen >= CYAPA_GEN5) { in cyapa_create_input_dev()
449 cyapa->max_abs_x / cyapa->physical_size_x); in cyapa_create_input_dev()
451 cyapa->max_abs_y / cyapa->physical_size_y); in cyapa_create_input_dev()
453 if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK) in cyapa_create_input_dev()
455 if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK) in cyapa_create_input_dev()
457 if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK) in cyapa_create_input_dev()
460 if (cyapa->btn_capability == CAPABILITY_LEFT_BTN_MASK) in cyapa_create_input_dev()
478 cyapa->input = input; in cyapa_create_input_dev()
482 static void cyapa_enable_irq_for_cmd(struct cyapa *cyapa) in cyapa_enable_irq_for_cmd() argument
484 struct input_dev *input = cyapa->input; in cyapa_enable_irq_for_cmd()
493 if (!input || cyapa->operational) in cyapa_enable_irq_for_cmd()
494 cyapa->ops->set_power_mode(cyapa, in cyapa_enable_irq_for_cmd()
497 if (cyapa->gen >= CYAPA_GEN5) in cyapa_enable_irq_for_cmd()
498 enable_irq(cyapa->client->irq); in cyapa_enable_irq_for_cmd()
502 static void cyapa_disable_irq_for_cmd(struct cyapa *cyapa) in cyapa_disable_irq_for_cmd() argument
504 struct input_dev *input = cyapa->input; in cyapa_disable_irq_for_cmd()
507 if (cyapa->gen >= CYAPA_GEN5) in cyapa_disable_irq_for_cmd()
508 disable_irq(cyapa->client->irq); in cyapa_disable_irq_for_cmd()
509 if (!input || cyapa->operational) in cyapa_disable_irq_for_cmd()
510 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); in cyapa_disable_irq_for_cmd()
546 static int cyapa_initialize(struct cyapa *cyapa) in cyapa_initialize() argument
550 cyapa->state = CYAPA_STATE_NO_DEVICE; in cyapa_initialize()
551 cyapa->gen = CYAPA_GEN_UNKNOWN; in cyapa_initialize()
552 mutex_init(&cyapa->state_sync_lock); in cyapa_initialize()
558 cyapa->suspend_power_mode = PWR_MODE_SLEEP; in cyapa_initialize()
559 cyapa->suspend_sleep_time = in cyapa_initialize()
560 cyapa_pwr_cmd_to_sleep_time(cyapa->suspend_power_mode); in cyapa_initialize()
563 error = cyapa_gen3_ops.initialize(cyapa); in cyapa_initialize()
565 error = cyapa_gen5_ops.initialize(cyapa); in cyapa_initialize()
569 error = cyapa_detect(cyapa); in cyapa_initialize()
574 if (cyapa->operational) in cyapa_initialize()
575 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); in cyapa_initialize()
580 static int cyapa_reinitialize(struct cyapa *cyapa) in cyapa_reinitialize() argument
582 struct device *dev = &cyapa->client->dev; in cyapa_reinitialize()
583 struct input_dev *input = cyapa->input; in cyapa_reinitialize()
590 if (cyapa->operational) in cyapa_reinitialize()
591 cyapa->ops->set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE, 0); in cyapa_reinitialize()
593 error = cyapa_detect(cyapa); in cyapa_reinitialize()
597 if (!input && cyapa->operational) { in cyapa_reinitialize()
598 error = cyapa_create_input_dev(cyapa); in cyapa_reinitialize()
609 if (cyapa->operational) in cyapa_reinitialize()
610 cyapa->ops->set_power_mode(cyapa, PWR_MODE_OFF, 0); in cyapa_reinitialize()
611 } else if (!error && cyapa->operational) { in cyapa_reinitialize()
625 struct cyapa *cyapa = dev_id; in cyapa_irq() local
626 struct device *dev = &cyapa->client->dev; in cyapa_irq()
633 if (cyapa->ops->irq_cmd_handler(cyapa)) { in cyapa_irq()
637 if (!cyapa->input) { in cyapa_irq()
642 cyapa->ops->sort_empty_output_data(cyapa, in cyapa_irq()
647 if (!cyapa->operational || cyapa->ops->irq_handler(cyapa)) { in cyapa_irq()
648 if (!mutex_trylock(&cyapa->state_sync_lock)) { in cyapa_irq()
649 cyapa->ops->sort_empty_output_data(cyapa, in cyapa_irq()
653 cyapa_reinitialize(cyapa); in cyapa_irq()
654 mutex_unlock(&cyapa->state_sync_lock); in cyapa_irq()
674 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_show_suspend_scanrate() local
675 u8 pwr_cmd = cyapa->suspend_power_mode; in cyapa_show_suspend_scanrate()
680 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_show_suspend_scanrate()
684 pwr_cmd = cyapa->suspend_power_mode; in cyapa_show_suspend_scanrate()
685 sleep_time = cyapa->suspend_sleep_time; in cyapa_show_suspend_scanrate()
687 mutex_unlock(&cyapa->state_sync_lock); in cyapa_show_suspend_scanrate()
700 cyapa->gen == CYAPA_GEN3 ? in cyapa_show_suspend_scanrate()
713 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_update_suspend_scanrate() local
717 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_update_suspend_scanrate()
722 cyapa->suspend_power_mode = PWR_MODE_BTN_ONLY; in cyapa_update_suspend_scanrate()
724 cyapa->suspend_power_mode = PWR_MODE_OFF; in cyapa_update_suspend_scanrate()
726 cyapa->suspend_sleep_time = min_t(u16, sleep_time, 1000); in cyapa_update_suspend_scanrate()
727 cyapa->suspend_power_mode = in cyapa_update_suspend_scanrate()
728 cyapa_sleep_time_to_pwr_cmd(cyapa->suspend_sleep_time); in cyapa_update_suspend_scanrate()
733 mutex_unlock(&cyapa->state_sync_lock); in cyapa_update_suspend_scanrate()
754 struct cyapa *cyapa = data; in cyapa_remove_power_wakeup_group() local
756 sysfs_unmerge_group(&cyapa->client->dev.kobj, in cyapa_remove_power_wakeup_group()
760 static int cyapa_prepare_wakeup_controls(struct cyapa *cyapa) in cyapa_prepare_wakeup_controls() argument
762 struct i2c_client *client = cyapa->client; in cyapa_prepare_wakeup_controls()
776 cyapa_remove_power_wakeup_group, cyapa); in cyapa_prepare_wakeup_controls()
778 cyapa_remove_power_wakeup_group(cyapa); in cyapa_prepare_wakeup_controls()
788 static inline int cyapa_prepare_wakeup_controls(struct cyapa *cyapa) in cyapa_prepare_wakeup_controls() argument
799 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_show_rt_suspend_scanrate() local
804 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_show_rt_suspend_scanrate()
808 pwr_cmd = cyapa->runtime_suspend_power_mode; in cyapa_show_rt_suspend_scanrate()
809 sleep_time = cyapa->runtime_suspend_sleep_time; in cyapa_show_rt_suspend_scanrate()
811 mutex_unlock(&cyapa->state_sync_lock); in cyapa_show_rt_suspend_scanrate()
814 cyapa->gen == CYAPA_GEN3 ? in cyapa_show_rt_suspend_scanrate()
823 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_update_rt_suspend_scanrate() local
839 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_update_rt_suspend_scanrate()
843 cyapa->runtime_suspend_sleep_time = min_t(u16, time, 1000); in cyapa_update_rt_suspend_scanrate()
844 cyapa->runtime_suspend_power_mode = in cyapa_update_rt_suspend_scanrate()
845 cyapa_sleep_time_to_pwr_cmd(cyapa->runtime_suspend_sleep_time); in cyapa_update_rt_suspend_scanrate()
847 mutex_unlock(&cyapa->state_sync_lock); in cyapa_update_rt_suspend_scanrate()
870 struct cyapa *cyapa = data; in cyapa_remove_power_runtime_group() local
872 sysfs_unmerge_group(&cyapa->client->dev.kobj, in cyapa_remove_power_runtime_group()
876 static int cyapa_start_runtime(struct cyapa *cyapa) in cyapa_start_runtime() argument
878 struct device *dev = &cyapa->client->dev; in cyapa_start_runtime()
881 cyapa->runtime_suspend_power_mode = PWR_MODE_IDLE; in cyapa_start_runtime()
882 cyapa->runtime_suspend_sleep_time = in cyapa_start_runtime()
883 cyapa_pwr_cmd_to_sleep_time(cyapa->runtime_suspend_power_mode); in cyapa_start_runtime()
892 error = devm_add_action(dev, cyapa_remove_power_runtime_group, cyapa); in cyapa_start_runtime()
894 cyapa_remove_power_runtime_group(cyapa); in cyapa_start_runtime()
909 static inline int cyapa_start_runtime(struct cyapa *cyapa) in cyapa_start_runtime() argument
919 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_show_fm_ver() local
921 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_show_fm_ver()
924 error = scnprintf(buf, PAGE_SIZE, "%d.%d\n", cyapa->fw_maj_ver, in cyapa_show_fm_ver()
925 cyapa->fw_min_ver); in cyapa_show_fm_ver()
926 mutex_unlock(&cyapa->state_sync_lock); in cyapa_show_fm_ver()
933 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_show_product_id() local
937 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_show_product_id()
940 size = scnprintf(buf, PAGE_SIZE, "%s\n", cyapa->product_id); in cyapa_show_product_id()
941 mutex_unlock(&cyapa->state_sync_lock); in cyapa_show_product_id()
945 static int cyapa_firmware(struct cyapa *cyapa, const char *fw_name) in cyapa_firmware() argument
947 struct device *dev = &cyapa->client->dev; in cyapa_firmware()
958 error = cyapa->ops->check_fw(cyapa, fw); in cyapa_firmware()
973 cyapa_enable_irq_for_cmd(cyapa); in cyapa_firmware()
975 error = cyapa->ops->bl_enter(cyapa); in cyapa_firmware()
981 error = cyapa->ops->bl_activate(cyapa); in cyapa_firmware()
987 error = cyapa->ops->bl_initiate(cyapa, fw); in cyapa_firmware()
993 error = cyapa->ops->update_fw(cyapa, fw); in cyapa_firmware()
1000 cyapa_disable_irq_for_cmd(cyapa); in cyapa_firmware()
1012 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_update_fw_store() local
1027 if (cyapa->input) { in cyapa_update_fw_store()
1033 input_unregister_device(cyapa->input); in cyapa_update_fw_store()
1034 cyapa->input = NULL; in cyapa_update_fw_store()
1037 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_update_fw_store()
1043 cyapa_reinitialize(cyapa); in cyapa_update_fw_store()
1047 error = cyapa_firmware(cyapa, fw_name); in cyapa_update_fw_store()
1057 ret = cyapa_reinitialize(cyapa); in cyapa_update_fw_store()
1063 mutex_unlock(&cyapa->state_sync_lock); in cyapa_update_fw_store()
1072 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_calibrate_store() local
1075 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_calibrate_store()
1079 if (cyapa->operational) { in cyapa_calibrate_store()
1080 cyapa_enable_irq_for_cmd(cyapa); in cyapa_calibrate_store()
1081 error = cyapa->ops->calibrate_store(dev, attr, buf, count); in cyapa_calibrate_store()
1082 cyapa_disable_irq_for_cmd(cyapa); in cyapa_calibrate_store()
1087 mutex_unlock(&cyapa->state_sync_lock); in cyapa_calibrate_store()
1094 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_show_baseline() local
1097 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_show_baseline()
1101 if (cyapa->operational) { in cyapa_show_baseline()
1102 cyapa_enable_irq_for_cmd(cyapa); in cyapa_show_baseline()
1103 error = cyapa->ops->show_baseline(dev, attr, buf); in cyapa_show_baseline()
1104 cyapa_disable_irq_for_cmd(cyapa); in cyapa_show_baseline()
1109 mutex_unlock(&cyapa->state_sync_lock); in cyapa_show_baseline()
1113 static char *cyapa_state_to_string(struct cyapa *cyapa) in cyapa_state_to_string() argument
1115 switch (cyapa->state) { in cyapa_state_to_string()
1135 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_show_mode() local
1139 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_show_mode()
1144 cyapa->gen, cyapa_state_to_string(cyapa)); in cyapa_show_mode()
1146 mutex_unlock(&cyapa->state_sync_lock); in cyapa_show_mode()
1173 struct cyapa *cyapa = data; in cyapa_remove_sysfs_group() local
1175 sysfs_remove_group(&cyapa->client->dev.kobj, &cyapa_sysfs_group); in cyapa_remove_sysfs_group()
1182 struct cyapa *cyapa; in cyapa_probe() local
1198 cyapa = devm_kzalloc(dev, sizeof(struct cyapa), GFP_KERNEL); in cyapa_probe()
1199 if (!cyapa) in cyapa_probe()
1204 cyapa->smbus = true; in cyapa_probe()
1206 cyapa->client = client; in cyapa_probe()
1207 i2c_set_clientdata(client, cyapa); in cyapa_probe()
1208 sprintf(cyapa->phys, "i2c-%d-%04x/input0", client->adapter->nr, in cyapa_probe()
1211 error = cyapa_initialize(cyapa); in cyapa_probe()
1223 error = devm_add_action(dev, cyapa_remove_sysfs_group, cyapa); in cyapa_probe()
1225 cyapa_remove_sysfs_group(cyapa); in cyapa_probe()
1230 error = cyapa_prepare_wakeup_controls(cyapa); in cyapa_probe()
1236 error = cyapa_start_runtime(cyapa); in cyapa_probe()
1245 "cyapa", cyapa); in cyapa_probe()
1259 if (cyapa->operational) { in cyapa_probe()
1260 error = cyapa_create_input_dev(cyapa); in cyapa_probe()
1274 struct cyapa *cyapa = i2c_get_clientdata(client); in cyapa_suspend() local
1278 error = mutex_lock_interruptible(&cyapa->state_sync_lock); in cyapa_suspend()
1295 if (cyapa->operational) { in cyapa_suspend()
1296 power_mode = device_may_wakeup(dev) ? cyapa->suspend_power_mode in cyapa_suspend()
1298 error = cyapa->ops->set_power_mode(cyapa, power_mode, in cyapa_suspend()
1299 cyapa->suspend_sleep_time); in cyapa_suspend()
1306 cyapa->irq_wake = (enable_irq_wake(client->irq) == 0); in cyapa_suspend()
1308 mutex_unlock(&cyapa->state_sync_lock); in cyapa_suspend()
1315 struct cyapa *cyapa = i2c_get_clientdata(client); in cyapa_resume() local
1318 mutex_lock(&cyapa->state_sync_lock); in cyapa_resume()
1320 if (device_may_wakeup(dev) && cyapa->irq_wake) { in cyapa_resume()
1322 cyapa->irq_wake = false; in cyapa_resume()
1326 error = cyapa_reinitialize(cyapa); in cyapa_resume()
1332 mutex_unlock(&cyapa->state_sync_lock); in cyapa_resume()
1338 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_runtime_suspend() local
1341 error = cyapa->ops->set_power_mode(cyapa, in cyapa_runtime_suspend()
1342 cyapa->runtime_suspend_power_mode, in cyapa_runtime_suspend()
1343 cyapa->runtime_suspend_sleep_time); in cyapa_runtime_suspend()
1352 struct cyapa *cyapa = dev_get_drvdata(dev); in cyapa_runtime_resume() local
1355 error = cyapa->ops->set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE, 0); in cyapa_runtime_resume()