Lines Matching refs:cyapa
24 #include "cyapa.h"
229 static int cyapa_gen3_try_poll_handler(struct cyapa *cyapa);
233 * @cyapa - private data structure of the driver
244 ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len,
251 struct i2c_client *client = cyapa->client;
277 static s32 cyapa_read_byte(struct cyapa *cyapa, u8 cmd_idx)
281 if (cyapa->smbus) {
287 return i2c_smbus_read_byte_data(cyapa->client, cmd);
290 static s32 cyapa_write_byte(struct cyapa *cyapa, u8 cmd_idx, u8 value)
294 if (cyapa->smbus) {
300 return i2c_smbus_write_byte_data(cyapa->client, cmd, value);
303 ssize_t cyapa_i2c_reg_read_block(struct cyapa *cyapa, u8 reg, size_t len,
306 return i2c_smbus_read_i2c_block_data(cyapa->client, reg, len, values);
309 static ssize_t cyapa_i2c_reg_write_block(struct cyapa *cyapa, u8 reg,
312 return i2c_smbus_write_i2c_block_data(cyapa->client, reg, len, values);
315 ssize_t cyapa_read_block(struct cyapa *cyapa, u8 cmd_idx, u8 *values)
320 if (cyapa->smbus) {
323 return cyapa_smbus_read_block(cyapa, cmd, len, values);
327 return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
334 static int cyapa_gen3_state_parse(struct cyapa *cyapa, u8 *reg_data, int len)
336 cyapa->state = CYAPA_STATE_NO_DEVICE;
349 cyapa->gen = CYAPA_GEN3;
350 cyapa->state = CYAPA_STATE_BL_IDLE;
354 cyapa->gen = CYAPA_GEN3;
356 cyapa->state = CYAPA_STATE_BL_BUSY;
360 cyapa->state = CYAPA_STATE_BL_ACTIVE;
362 cyapa->state = CYAPA_STATE_BL_IDLE;
374 cyapa->gen = CYAPA_GEN3;
375 cyapa->state = CYAPA_STATE_OP;
380 cyapa->gen = CYAPA_GEN3;
381 cyapa->state = CYAPA_STATE_OP;
384 cyapa->gen = CYAPA_GEN3;
385 cyapa->state = CYAPA_STATE_BL_BUSY;
388 if (cyapa->gen == CYAPA_GEN3 && (cyapa->state == CYAPA_STATE_OP ||
389 cyapa->state == CYAPA_STATE_BL_IDLE ||
390 cyapa->state == CYAPA_STATE_BL_ACTIVE ||
391 cyapa->state == CYAPA_STATE_BL_BUSY))
409 static int cyapa_gen3_bl_enter(struct cyapa *cyapa)
414 error = cyapa_poll_state(cyapa, 500);
417 if (cyapa->state == CYAPA_STATE_BL_IDLE) {
422 if (cyapa->state != CYAPA_STATE_OP)
425 cyapa->operational = false;
426 cyapa->state = CYAPA_STATE_NO_DEVICE;
427 error = cyapa_write_byte(cyapa, CYAPA_CMD_SOFT_RESET, 0x01);
434 error = cyapa_poll_state(cyapa, 500);
443 if ((cyapa->state == CYAPA_STATE_BL_IDLE) &&
444 !(cyapa->status[REG_BL_STATUS] & BL_STATUS_WATCHDOG))
451 if ((cyapa->state != CYAPA_STATE_BL_IDLE) ||
452 (cyapa->status[REG_BL_STATUS] & BL_STATUS_WATCHDOG))
458 static int cyapa_gen3_bl_activate(struct cyapa *cyapa)
462 error = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_activate),
469 error = cyapa_poll_state(cyapa, 11000);
472 if (cyapa->state != CYAPA_STATE_BL_ACTIVE)
478 static int cyapa_gen3_bl_deactivate(struct cyapa *cyapa)
482 error = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_deactivate),
489 error = cyapa_poll_state(cyapa, 500);
492 if (cyapa->state != CYAPA_STATE_BL_IDLE)
510 static int cyapa_gen3_bl_exit(struct cyapa *cyapa)
514 error = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_exit), bl_exit);
529 error = cyapa_poll_state(cyapa, 4000);
532 if (cyapa->state != CYAPA_STATE_OP)
564 static int cyapa_gen3_check_fw(struct cyapa *cyapa, const struct firmware *fw)
566 struct device *dev = &cyapa->client->dev;
608 static int cyapa_gen3_write_buffer(struct cyapa *cyapa,
623 error = cyapa_i2c_reg_write_block(cyapa, 0, cmd_len + 1, cmd);
646 static int cyapa_gen3_write_fw_block(struct cyapa *cyapa,
666 ret = cyapa_gen3_write_buffer(cyapa, (u8 *)&write_block_cmd,
677 ret = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET,
698 static int cyapa_gen3_write_blocks(struct cyapa *cyapa,
710 error = cyapa_gen3_write_fw_block(cyapa, block, data);
717 static int cyapa_gen3_do_fw_update(struct cyapa *cyapa,
720 struct device *dev = &cyapa->client->dev;
724 error = cyapa_gen3_write_blocks(cyapa,
733 error = cyapa_gen3_write_blocks(cyapa,
748 struct cyapa *cyapa = dev_get_drvdata(dev);
752 ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
764 ret = cyapa_write_byte(cyapa, CYAPA_CMD_SOFT_RESET,
781 ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
802 struct cyapa *cyapa = dev_get_drvdata(dev);
807 ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
819 ret = cyapa_write_byte(cyapa, CYAPA_CMD_SOFT_RESET,
831 ret = cyapa_read_byte(cyapa, CYAPA_CMD_DEV_STATUS);
847 ret = cyapa_read_byte(cyapa, CYAPA_CMD_MAX_BASELINE);
854 ret = cyapa_read_byte(cyapa, CYAPA_CMD_MIN_BASELINE);
907 static int cyapa_gen3_set_power_mode(struct cyapa *cyapa, u8 power_mode,
910 struct input_dev *input = cyapa->input;
917 if (cyapa->state != CYAPA_STATE_OP)
922 ret = cyapa_read_byte(cyapa, CYAPA_CMD_POWER_MODE);
943 ret = cyapa_write_byte(cyapa, CYAPA_CMD_POWER_MODE, power);
955 if (cyapa->operational && input && input->users &&
966 cyapa_gen3_try_poll_handler(cyapa);
975 static int cyapa_gen3_set_proximity(struct cyapa *cyapa, bool enable)
980 static int cyapa_gen3_get_query_data(struct cyapa *cyapa)
985 if (cyapa->state != CYAPA_STATE_OP)
988 ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_QUERY, query_data);
992 memcpy(&cyapa->product_id[0], &query_data[0], 5);
993 cyapa->product_id[5] = '-';
994 memcpy(&cyapa->product_id[6], &query_data[5], 6);
995 cyapa->product_id[12] = '-';
996 memcpy(&cyapa->product_id[13], &query_data[11], 2);
997 cyapa->product_id[15] = '\0';
999 cyapa->fw_maj_ver = query_data[15];
1000 cyapa->fw_min_ver = query_data[16];
1002 cyapa->btn_capability = query_data[19] & CAPABILITY_BTN_MASK;
1004 cyapa->gen = query_data[20] & 0x0f;
1006 cyapa->max_abs_x = ((query_data[21] & 0xf0) << 4) | query_data[22];
1007 cyapa->max_abs_y = ((query_data[21] & 0x0f) << 8) | query_data[23];
1009 cyapa->physical_size_x =
1011 cyapa->physical_size_y =
1014 cyapa->max_z = 255;
1019 static int cyapa_gen3_bl_query_data(struct cyapa *cyapa)
1024 ret = cyapa_i2c_reg_read_block(cyapa, 0, CYAPA_CMD_LEN, bl_data);
1036 cyapa->fw_maj_ver = bl_data[GEN3_BL_IDLE_FW_MAJ_VER_OFFSET];
1037 cyapa->fw_min_ver = bl_data[GEN3_BL_IDLE_FW_MIN_VER_OFFSET];
1057 static int cyapa_gen3_do_operational_check(struct cyapa *cyapa)
1059 struct device *dev = &cyapa->client->dev;
1062 switch (cyapa->state) {
1064 error = cyapa_gen3_bl_deactivate(cyapa);
1073 cyapa_gen3_bl_query_data(cyapa);
1075 error = cyapa_gen3_bl_exit(cyapa);
1087 error = cyapa_gen3_set_power_mode(cyapa,
1092 error = cyapa_gen3_get_query_data(cyapa);
1097 if (cyapa->gen != CYAPA_GEN3) {
1099 cyapa->gen);
1104 if (memcmp(cyapa->product_id, product_id,
1107 cyapa->product_id);
1123 static bool cyapa_gen3_irq_cmd_handler(struct cyapa *cyapa)
1126 if (cyapa->gen != CYAPA_GEN3)
1129 if (cyapa->operational)
1144 static int cyapa_gen3_event_process(struct cyapa *cyapa,
1147 struct input_dev *input = cyapa->input;
1168 if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK)
1171 if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK)
1174 if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK)
1182 static int cyapa_gen3_irq_handler(struct cyapa *cyapa)
1184 struct device *dev = &cyapa->client->dev;
1188 ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_DATA, (u8 *)&data);
1202 return cyapa_gen3_event_process(cyapa, &data);
1211 static int cyapa_gen3_try_poll_handler(struct cyapa *cyapa)
1216 ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_DATA, (u8 *)&data);
1225 return cyapa_gen3_event_process(cyapa, &data);
1229 static int cyapa_gen3_initialize(struct cyapa *cyapa) { return 0; }
1230 static int cyapa_gen3_bl_initiate(struct cyapa *cyapa,
1232 static int cyapa_gen3_empty_output_data(struct cyapa *cyapa,