int get_tk_fw_version(struct abov_tk_info *info, bool bootmode) { struct i2c_client *client = info->client; u8 buf; int ret; int retry = 3; ret = abov_tk_i2c_read(client, ABOV_FW_VER, &buf, 1); if (ret < 0) { while (retry--) { dev_err(&client->dev, "%s read fail(%d)\n", __func__, retry); if (!bootmode) abov_tk_reset(info); else return -1; ret = abov_tk_i2c_read(client, ABOV_FW_VER, &buf, 1); if (ret == 0) break; } if (retry == 0) return -1; } info->fw_ver = buf; dev_notice(&client->dev, "%s : 0x%x\n", __func__, buf); return 0; }
static irqreturn_t abov_tk_interrupt(int irq, void *dev_id) { struct abov_tk_info *info = dev_id; struct i2c_client *client = info->client; int ret, retry; u8 buf, button; bool press; ret = abov_tk_i2c_read(client, ABOV_BTNSTATUS, &buf, 1); if (ret < 0) { retry = 3; while (retry--) { dev_err(&client->dev, "%s read fail(%d)\n", __func__, retry); ret = abov_tk_i2c_read(client, ABOV_BTNSTATUS, &buf, 1); if (ret == 0) break; else msleep(10); } if (retry == 0) { abov_tk_reset(info); return IRQ_HANDLED; } } button = buf & 0x03; press = !!(buf & 0x8); if (press) { input_report_key(info->input_dev, touchkey_keycode[button], 0); #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP dev_notice(&client->dev, "key R\n"); #else dev_notice(&client->dev, "key R : %d(%d)\n", touchkey_keycode[button], buf); #endif } else { input_report_key(info->input_dev, touchkey_keycode[button], 1); #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP dev_notice(&client->dev, "key P\n"); #else dev_notice(&client->dev, "key P : %d(%d)\n", touchkey_keycode[button], buf); #endif } input_sync(info->input_dev); return IRQ_HANDLED; }
static irqreturn_t abov_tk_interrupt(int irq, void *dev_id) { struct abov_tk_info *info = dev_id; struct i2c_client *client = info->client; int ret, retry; u8 buf; bool press; ret = abov_tk_i2c_read(client, ABOV_BTNSTATUS, &buf, 1); if (ret < 0) { retry = 3; while (retry--) { dev_err(&client->dev, "%s read fail(%d)\n", __func__, retry); ret = abov_tk_i2c_read(client, ABOV_BTNSTATUS, &buf, 1); if (ret == 0) break; else msleep(10); } if (retry == 0) { abov_tk_reset(info); return IRQ_HANDLED; } } if (info->dual_mode) { int menu_data = buf & 0x03; int back_data = (buf >> 2) & 0x03; u8 menu_press = !(menu_data % 2); u8 back_press = !(back_data % 2); if (menu_data) input_report_key(info->input_dev, touchkey_keycode[1], menu_press); if (back_data) input_report_key(info->input_dev, touchkey_keycode[2], back_press); #ifdef CONFIG_SAMSUNG_PRODUCT_SHIP dev_notice(&client->dev, "key %s%s ver0x%02x\n", menu_data ? (menu_press ? "P" : "R") : "", back_data ? (back_press ? "P" : "R") : "", info->fw_ver); #else dev_notice(&client->dev, "%s%s%x ver0x%02x\n", menu_data ? (menu_press ? "menu P " : "menu R ") : "", back_data ? (back_press ? "back P " : "back R ") : "", buf, info->fw_ver); #endif } else {