+static int iqs263_i2c_read_bytes(struct iqs253_chip *chip,
+ u8 cmd)
+{
+ int ret = 0;
+
+ iqs253_detect_comwindow(chip);
+ ret = i2c_smbus_read_word_data(chip->client, cmd);
+ if (ret < 0)
+ pr_err("iqs263 i2c read from %d failed", cmd);
+ usleep_range(1000, 1100);
+ return ret;
+}
+
+static void iqs263_wait_for_ati_finish(struct iqs253_chip *iqs253_chip)
+{
+ int ret;
+
+ do {
+ iqs253_detect_comwindow(iqs253_chip);
+ ret = iqs263_i2c_read_bytes(iqs253_chip, SYST_FLAGS);
+ } while (ret & ATI_IN_PROGRESS);
+}
+
+/* must call holding lock */
+static int iqs263_i2c_write_bytes(struct iqs253_chip *chip,
+ struct cmd_val_pair *cmd_val)
+{
+ int ret = 0;
+
+ iqs253_detect_comwindow(chip);
+ ret = i2c_smbus_write_i2c_block_data(chip->client, cmd_val->cmd,
+ cmd_val->len, cmd_val->vals);
+ if (ret < 0)
+ pr_err("iqs263 i2c write to %d failed", cmd_val->cmd);
+ usleep_range(1000, 1100);
+ return ret;
+}
+
+static int iqs263_i2c_read_word(struct iqs253_chip *chip, u8 cmd)
+{
+ int ret = 0;
+ u8 data_buffer[2];
+
+ iqs253_detect_comwindow(chip);
+ ret = i2c_smbus_read_i2c_block_data(chip->client, cmd, 2, data_buffer);
+ if (ret < 0)
+ pr_err("iqs263 i2c word read : %d failed", cmd);
+ else
+ ret = (data_buffer[0] & 0x0f) | ((data_buffer[1] << 8) & 0xF0);
+
+ return ret;
+}
+
+/* must call holding lock */
+static int iqs263_set(struct iqs253_chip *iqs253_chip)
+{
+ int ret = 0, j;
+ struct cmd_val_pair *cmd_val_pair_map;
+
+ pr_debug("%s :<-- INIT START -->\n", __func__);
+
+ if (iqs253_chip->version != 263)
+ return 0;
+
+ for (j = 0; j < ARRAY_SIZE(cmd_val_map_iqs263); j++) {
+
+ cmd_val_pair_map = &cmd_val_map_iqs263[j];
+
+ if (cmd_val_pair_map->cmd == ATI) {
+ iqs263_wait_for_ati_finish(iqs253_chip);
+ continue;
+ }
+
+ if (!cmd_val_pair_map->len)
+ continue;
+
+ ret = iqs263_i2c_write_bytes(iqs253_chip,
+ cmd_val_pair_map);
+ if (ret)
+ return ret;
+ }
+
+ pr_debug("%s :<--INIT DONE -->\n", __func__);
+ return 0;
+}
+