12562756dSMasaki Ota /* 22562756dSMasaki Ota * Copyright (c) 2016 Masaki Ota <masaki.ota@jp.alps.com> 32562756dSMasaki Ota * 42562756dSMasaki Ota * This program is free software; you can redistribute it and/or modify it 52562756dSMasaki Ota * under the terms of the GNU General Public License as published by the Free 62562756dSMasaki Ota * Software Foundation; either version 2 of the License, or (at your option) 72562756dSMasaki Ota * any later version. 82562756dSMasaki Ota */ 92562756dSMasaki Ota 102562756dSMasaki Ota #include <linux/kernel.h> 112562756dSMasaki Ota #include <linux/hid.h> 122562756dSMasaki Ota #include <linux/input.h> 132562756dSMasaki Ota #include <linux/input/mt.h> 142562756dSMasaki Ota #include <linux/module.h> 152562756dSMasaki Ota #include <asm/unaligned.h> 162562756dSMasaki Ota #include "hid-ids.h" 172562756dSMasaki Ota 182562756dSMasaki Ota /* ALPS Device Product ID */ 192562756dSMasaki Ota #define HID_PRODUCT_ID_T3_BTNLESS 0xD0C0 202562756dSMasaki Ota #define HID_PRODUCT_ID_COSMO 0x1202 212562756dSMasaki Ota #define HID_PRODUCT_ID_U1_PTP_1 0x1207 222562756dSMasaki Ota #define HID_PRODUCT_ID_U1 0x1209 232562756dSMasaki Ota #define HID_PRODUCT_ID_U1_PTP_2 0x120A 242562756dSMasaki Ota #define HID_PRODUCT_ID_U1_DUAL 0x120B 252562756dSMasaki Ota #define HID_PRODUCT_ID_T4_BTNLESS 0x120C 262562756dSMasaki Ota 272562756dSMasaki Ota #define DEV_SINGLEPOINT 0x01 282562756dSMasaki Ota #define DEV_DUALPOINT 0x02 292562756dSMasaki Ota 302562756dSMasaki Ota #define U1_MOUSE_REPORT_ID 0x01 /* Mouse data ReportID */ 312562756dSMasaki Ota #define U1_ABSOLUTE_REPORT_ID 0x03 /* Absolute data ReportID */ 322562756dSMasaki Ota #define U1_FEATURE_REPORT_ID 0x05 /* Feature ReportID */ 332562756dSMasaki Ota #define U1_SP_ABSOLUTE_REPORT_ID 0x06 /* Feature ReportID */ 342562756dSMasaki Ota 352562756dSMasaki Ota #define U1_FEATURE_REPORT_LEN 0x08 /* Feature Report Length */ 362562756dSMasaki Ota #define U1_FEATURE_REPORT_LEN_ALL 0x0A 372562756dSMasaki Ota #define U1_CMD_REGISTER_READ 0xD1 382562756dSMasaki Ota #define U1_CMD_REGISTER_WRITE 0xD2 392562756dSMasaki Ota 402562756dSMasaki Ota #define U1_DEVTYPE_SP_SUPPORT 0x10 /* SP Support */ 412562756dSMasaki Ota #define U1_DISABLE_DEV 0x01 422562756dSMasaki Ota #define U1_TP_ABS_MODE 0x02 432562756dSMasaki Ota #define U1_SP_ABS_MODE 0x80 442562756dSMasaki Ota 452562756dSMasaki Ota #define ADDRESS_U1_DEV_CTRL_1 0x00800040 462562756dSMasaki Ota #define ADDRESS_U1_DEVICE_TYP 0x00800043 472562756dSMasaki Ota #define ADDRESS_U1_NUM_SENS_X 0x00800047 482562756dSMasaki Ota #define ADDRESS_U1_NUM_SENS_Y 0x00800048 492562756dSMasaki Ota #define ADDRESS_U1_PITCH_SENS_X 0x00800049 502562756dSMasaki Ota #define ADDRESS_U1_PITCH_SENS_Y 0x0080004A 512562756dSMasaki Ota #define ADDRESS_U1_RESO_DWN_ABS 0x0080004E 522562756dSMasaki Ota #define ADDRESS_U1_PAD_BTN 0x00800052 532562756dSMasaki Ota #define ADDRESS_U1_SP_BTN 0x0080009F 542562756dSMasaki Ota 552562756dSMasaki Ota #define MAX_TOUCHES 5 562562756dSMasaki Ota 572562756dSMasaki Ota /** 582562756dSMasaki Ota * struct u1_data 592562756dSMasaki Ota * 602562756dSMasaki Ota * @input: pointer to the kernel input device 612562756dSMasaki Ota * @input2: pointer to the kernel input2 device 622562756dSMasaki Ota * @hdev: pointer to the struct hid_device 632562756dSMasaki Ota * 642562756dSMasaki Ota * @dev_ctrl: device control parameter 652562756dSMasaki Ota * @dev_type: device type 662562756dSMasaki Ota * @sen_line_num_x: number of sensor line of X 672562756dSMasaki Ota * @sen_line_num_y: number of sensor line of Y 682562756dSMasaki Ota * @pitch_x: sensor pitch of X 692562756dSMasaki Ota * @pitch_y: sensor pitch of Y 702562756dSMasaki Ota * @resolution: resolution 712562756dSMasaki Ota * @btn_info: button information 722562756dSMasaki Ota * @x_active_len_mm: active area length of X (mm) 732562756dSMasaki Ota * @y_active_len_mm: active area length of Y (mm) 742562756dSMasaki Ota * @x_max: maximum x coordinate value 752562756dSMasaki Ota * @y_max: maximum y coordinate value 76*c7083d3fSMasaki Ota * @x_min: minimum x coordinate value 77*c7083d3fSMasaki Ota * @y_min: minimum y coordinate value 782562756dSMasaki Ota * @btn_cnt: number of buttons 792562756dSMasaki Ota * @sp_btn_cnt: number of stick buttons 805d8c720dSMasaki Ota * @has_sp: boolean of sp existense 81*c7083d3fSMasaki Ota * @max_fingers: total number of fingers 822562756dSMasaki Ota */ 832562756dSMasaki Ota struct u1_dev { 842562756dSMasaki Ota struct input_dev *input; 852562756dSMasaki Ota struct input_dev *input2; 862562756dSMasaki Ota struct hid_device *hdev; 872562756dSMasaki Ota 882562756dSMasaki Ota u8 dev_ctrl; 892562756dSMasaki Ota u8 dev_type; 902562756dSMasaki Ota u8 sen_line_num_x; 912562756dSMasaki Ota u8 sen_line_num_y; 922562756dSMasaki Ota u8 pitch_x; 932562756dSMasaki Ota u8 pitch_y; 942562756dSMasaki Ota u8 resolution; 952562756dSMasaki Ota u8 btn_info; 962562756dSMasaki Ota u8 sp_btn_info; 972562756dSMasaki Ota u32 x_active_len_mm; 982562756dSMasaki Ota u32 y_active_len_mm; 992562756dSMasaki Ota u32 x_max; 1002562756dSMasaki Ota u32 y_max; 101*c7083d3fSMasaki Ota u32 x_min; 102*c7083d3fSMasaki Ota u32 y_min; 1032562756dSMasaki Ota u32 btn_cnt; 1042562756dSMasaki Ota u32 sp_btn_cnt; 1055d8c720dSMasaki Ota u8 has_sp; 106*c7083d3fSMasaki Ota u8 max_fingers; 1072562756dSMasaki Ota }; 1082562756dSMasaki Ota 1092562756dSMasaki Ota static int u1_read_write_register(struct hid_device *hdev, u32 address, 1102562756dSMasaki Ota u8 *read_val, u8 write_val, bool read_flag) 1112562756dSMasaki Ota { 1122562756dSMasaki Ota int ret, i; 1132562756dSMasaki Ota u8 check_sum; 1142562756dSMasaki Ota u8 *input; 1152562756dSMasaki Ota u8 *readbuf; 1162562756dSMasaki Ota 117819d64e5SMasaki Ota input = kzalloc(U1_FEATURE_REPORT_LEN, GFP_KERNEL); 1182562756dSMasaki Ota if (!input) 1192562756dSMasaki Ota return -ENOMEM; 1202562756dSMasaki Ota 1212562756dSMasaki Ota input[0] = U1_FEATURE_REPORT_ID; 1222562756dSMasaki Ota if (read_flag) { 1232562756dSMasaki Ota input[1] = U1_CMD_REGISTER_READ; 1242562756dSMasaki Ota input[6] = 0x00; 1252562756dSMasaki Ota } else { 1262562756dSMasaki Ota input[1] = U1_CMD_REGISTER_WRITE; 1272562756dSMasaki Ota input[6] = write_val; 1282562756dSMasaki Ota } 1292562756dSMasaki Ota 1302562756dSMasaki Ota put_unaligned_le32(address, input + 2); 1312562756dSMasaki Ota 1322562756dSMasaki Ota /* Calculate the checksum */ 1332562756dSMasaki Ota check_sum = U1_FEATURE_REPORT_LEN_ALL; 1342562756dSMasaki Ota for (i = 0; i < U1_FEATURE_REPORT_LEN - 1; i++) 1352562756dSMasaki Ota check_sum += input[i]; 1362562756dSMasaki Ota 1372562756dSMasaki Ota input[7] = check_sum; 1382562756dSMasaki Ota ret = hid_hw_raw_request(hdev, U1_FEATURE_REPORT_ID, input, 139819d64e5SMasaki Ota U1_FEATURE_REPORT_LEN, 140819d64e5SMasaki Ota HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 1412562756dSMasaki Ota 1422562756dSMasaki Ota if (ret < 0) { 1432562756dSMasaki Ota dev_err(&hdev->dev, "failed to read command (%d)\n", ret); 1442562756dSMasaki Ota goto exit; 1452562756dSMasaki Ota } 1462562756dSMasaki Ota 1472562756dSMasaki Ota if (read_flag) { 148819d64e5SMasaki Ota readbuf = kzalloc(U1_FEATURE_REPORT_LEN, GFP_KERNEL); 149819d64e5SMasaki Ota if (!readbuf) { 1507ee2eaa3SAxel Lin ret = -ENOMEM; 1517ee2eaa3SAxel Lin goto exit; 152819d64e5SMasaki Ota } 153819d64e5SMasaki Ota 1542562756dSMasaki Ota ret = hid_hw_raw_request(hdev, U1_FEATURE_REPORT_ID, readbuf, 155819d64e5SMasaki Ota U1_FEATURE_REPORT_LEN, 15663b3a7d0SJiri Kosina HID_FEATURE_REPORT, HID_REQ_GET_REPORT); 1572562756dSMasaki Ota 1582562756dSMasaki Ota if (ret < 0) { 1592562756dSMasaki Ota dev_err(&hdev->dev, "failed read register (%d)\n", ret); 1607ee2eaa3SAxel Lin kfree(readbuf); 1612562756dSMasaki Ota goto exit; 1622562756dSMasaki Ota } 1632562756dSMasaki Ota 1642562756dSMasaki Ota *read_val = readbuf[6]; 165819d64e5SMasaki Ota 166819d64e5SMasaki Ota kfree(readbuf); 1672562756dSMasaki Ota } 1682562756dSMasaki Ota 169819d64e5SMasaki Ota ret = 0; 1702562756dSMasaki Ota 1712562756dSMasaki Ota exit: 1722562756dSMasaki Ota kfree(input); 1732562756dSMasaki Ota return ret; 1742562756dSMasaki Ota } 1752562756dSMasaki Ota 1762562756dSMasaki Ota static int alps_raw_event(struct hid_device *hdev, 1772562756dSMasaki Ota struct hid_report *report, u8 *data, int size) 1782562756dSMasaki Ota { 179819d64e5SMasaki Ota unsigned int x, y, z; 180819d64e5SMasaki Ota int i; 181819d64e5SMasaki Ota short sp_x, sp_y; 1822562756dSMasaki Ota struct u1_dev *hdata = hid_get_drvdata(hdev); 1832562756dSMasaki Ota 1842562756dSMasaki Ota switch (data[0]) { 1852562756dSMasaki Ota case U1_MOUSE_REPORT_ID: 1862562756dSMasaki Ota break; 1872562756dSMasaki Ota case U1_FEATURE_REPORT_ID: 1882562756dSMasaki Ota break; 1892562756dSMasaki Ota case U1_ABSOLUTE_REPORT_ID: 1902562756dSMasaki Ota for (i = 0; i < MAX_TOUCHES; i++) { 191819d64e5SMasaki Ota u8 *contact = &data[i * 5]; 192819d64e5SMasaki Ota 193819d64e5SMasaki Ota x = get_unaligned_le16(contact + 3); 194819d64e5SMasaki Ota y = get_unaligned_le16(contact + 5); 195819d64e5SMasaki Ota z = contact[7] & 0x7F; 1962562756dSMasaki Ota 1972562756dSMasaki Ota input_mt_slot(hdata->input, i); 1982562756dSMasaki Ota 199819d64e5SMasaki Ota if (z != 0) { 2002562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 2012562756dSMasaki Ota MT_TOOL_FINGER, 1); 2029a54cf46SMasaki Ota input_report_abs(hdata->input, 2039a54cf46SMasaki Ota ABS_MT_POSITION_X, x); 2049a54cf46SMasaki Ota input_report_abs(hdata->input, 2059a54cf46SMasaki Ota ABS_MT_POSITION_Y, y); 2069a54cf46SMasaki Ota input_report_abs(hdata->input, 2079a54cf46SMasaki Ota ABS_MT_PRESSURE, z); 2082562756dSMasaki Ota } else { 2092562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 2102562756dSMasaki Ota MT_TOOL_FINGER, 0); 2112562756dSMasaki Ota } 2122562756dSMasaki Ota } 2132562756dSMasaki Ota 2142562756dSMasaki Ota input_mt_sync_frame(hdata->input); 2152562756dSMasaki Ota 216819d64e5SMasaki Ota input_report_key(hdata->input, BTN_LEFT, 217819d64e5SMasaki Ota data[1] & 0x1); 218819d64e5SMasaki Ota input_report_key(hdata->input, BTN_RIGHT, 219819d64e5SMasaki Ota (data[1] & 0x2)); 220819d64e5SMasaki Ota input_report_key(hdata->input, BTN_MIDDLE, 221819d64e5SMasaki Ota (data[1] & 0x4)); 222819d64e5SMasaki Ota 223819d64e5SMasaki Ota input_sync(hdata->input); 2242562756dSMasaki Ota 2252562756dSMasaki Ota return 1; 2262562756dSMasaki Ota 2272562756dSMasaki Ota case U1_SP_ABSOLUTE_REPORT_ID: 228819d64e5SMasaki Ota sp_x = get_unaligned_le16(data+2); 229819d64e5SMasaki Ota sp_y = get_unaligned_le16(data+4); 2302562756dSMasaki Ota 2312562756dSMasaki Ota sp_x = sp_x / 8; 2322562756dSMasaki Ota sp_y = sp_y / 8; 2332562756dSMasaki Ota 234819d64e5SMasaki Ota input_report_rel(hdata->input2, REL_X, sp_x); 235819d64e5SMasaki Ota input_report_rel(hdata->input2, REL_Y, sp_y); 2362562756dSMasaki Ota 237819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_LEFT, 238819d64e5SMasaki Ota data[1] & 0x1); 239819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_RIGHT, 240819d64e5SMasaki Ota (data[1] & 0x2)); 241819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_MIDDLE, 242819d64e5SMasaki Ota (data[1] & 0x4)); 2432562756dSMasaki Ota 244819d64e5SMasaki Ota input_sync(hdata->input2); 2452562756dSMasaki Ota 2462562756dSMasaki Ota return 1; 2472562756dSMasaki Ota } 2482562756dSMasaki Ota 2492562756dSMasaki Ota return 0; 2502562756dSMasaki Ota } 2512562756dSMasaki Ota 2522562756dSMasaki Ota #ifdef CONFIG_PM 2532562756dSMasaki Ota static int alps_post_reset(struct hid_device *hdev) 2542562756dSMasaki Ota { 2552562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 25604fd4cb0SKai-Heng Feng NULL, U1_TP_ABS_MODE | U1_SP_ABS_MODE, false); 2572562756dSMasaki Ota } 2582562756dSMasaki Ota 2592562756dSMasaki Ota static int alps_post_resume(struct hid_device *hdev) 2602562756dSMasaki Ota { 2612562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 26204fd4cb0SKai-Heng Feng NULL, U1_TP_ABS_MODE | U1_SP_ABS_MODE, false); 2632562756dSMasaki Ota } 2642562756dSMasaki Ota #endif /* CONFIG_PM */ 2652562756dSMasaki Ota 2665d8c720dSMasaki Ota static int u1_init(struct hid_device *hdev, struct u1_dev *pri_data) 2675d8c720dSMasaki Ota { 2685d8c720dSMasaki Ota int ret; 2695d8c720dSMasaki Ota 2705d8c720dSMasaki Ota /* Device initialization */ 2715d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2725d8c720dSMasaki Ota &pri_data->dev_ctrl, 0, true); 2735d8c720dSMasaki Ota if (ret < 0) { 2745d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEV_CTRL_1 (%d)\n", ret); 2755d8c720dSMasaki Ota goto exit; 2765d8c720dSMasaki Ota } 2775d8c720dSMasaki Ota 2785d8c720dSMasaki Ota pri_data->dev_ctrl &= ~U1_DISABLE_DEV; 2795d8c720dSMasaki Ota pri_data->dev_ctrl |= U1_TP_ABS_MODE; 2805d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2815d8c720dSMasaki Ota NULL, pri_data->dev_ctrl, false); 2825d8c720dSMasaki Ota if (ret < 0) { 2835d8c720dSMasaki Ota dev_err(&hdev->dev, "failed to change TP mode (%d)\n", ret); 2845d8c720dSMasaki Ota goto exit; 2855d8c720dSMasaki Ota } 2865d8c720dSMasaki Ota 2875d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_X, 2885d8c720dSMasaki Ota &pri_data->sen_line_num_x, 0, true); 2895d8c720dSMasaki Ota if (ret < 0) { 2905d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_X (%d)\n", ret); 2915d8c720dSMasaki Ota goto exit; 2925d8c720dSMasaki Ota } 2935d8c720dSMasaki Ota 2945d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_Y, 2955d8c720dSMasaki Ota &pri_data->sen_line_num_y, 0, true); 2965d8c720dSMasaki Ota if (ret < 0) { 2975d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_Y (%d)\n", ret); 2985d8c720dSMasaki Ota goto exit; 2995d8c720dSMasaki Ota } 3005d8c720dSMasaki Ota 3015d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_X, 3025d8c720dSMasaki Ota &pri_data->pitch_x, 0, true); 3035d8c720dSMasaki Ota if (ret < 0) { 3045d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_X (%d)\n", ret); 3055d8c720dSMasaki Ota goto exit; 3065d8c720dSMasaki Ota } 3075d8c720dSMasaki Ota 3085d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_Y, 3095d8c720dSMasaki Ota &pri_data->pitch_y, 0, true); 3105d8c720dSMasaki Ota if (ret < 0) { 3115d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_Y (%d)\n", ret); 3125d8c720dSMasaki Ota goto exit; 3135d8c720dSMasaki Ota } 3145d8c720dSMasaki Ota 3155d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_RESO_DWN_ABS, 3165d8c720dSMasaki Ota &pri_data->resolution, 0, true); 3175d8c720dSMasaki Ota if (ret < 0) { 3185d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_RESO_DWN_ABS (%d)\n", ret); 3195d8c720dSMasaki Ota goto exit; 3205d8c720dSMasaki Ota } 3215d8c720dSMasaki Ota pri_data->x_active_len_mm = 3225d8c720dSMasaki Ota (pri_data->pitch_x * (pri_data->sen_line_num_x - 1)) / 10; 3235d8c720dSMasaki Ota pri_data->y_active_len_mm = 3245d8c720dSMasaki Ota (pri_data->pitch_y * (pri_data->sen_line_num_y - 1)) / 10; 3255d8c720dSMasaki Ota 3265d8c720dSMasaki Ota pri_data->x_max = 3275d8c720dSMasaki Ota (pri_data->resolution << 2) * (pri_data->sen_line_num_x - 1); 328*c7083d3fSMasaki Ota pri_data->x_min = 1; 3295d8c720dSMasaki Ota pri_data->y_max = 3305d8c720dSMasaki Ota (pri_data->resolution << 2) * (pri_data->sen_line_num_y - 1); 331*c7083d3fSMasaki Ota pri_data->y_min = 1; 3325d8c720dSMasaki Ota 3335d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PAD_BTN, 3345d8c720dSMasaki Ota &pri_data->btn_info, 0, true); 3355d8c720dSMasaki Ota if (ret < 0) { 3365d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_PAD_BTN (%d)\n", ret); 3375d8c720dSMasaki Ota goto exit; 3385d8c720dSMasaki Ota } 339*c7083d3fSMasaki Ota if ((pri_data->btn_info & 0x0F) == (pri_data->btn_info & 0xF0) >> 4) { 340*c7083d3fSMasaki Ota pri_data->btn_cnt = (pri_data->btn_info & 0x0F); 341*c7083d3fSMasaki Ota } else { 342*c7083d3fSMasaki Ota /* Button pad */ 343*c7083d3fSMasaki Ota pri_data->btn_cnt = 1; 344*c7083d3fSMasaki Ota } 3455d8c720dSMasaki Ota 3465d8c720dSMasaki Ota pri_data->has_sp = 0; 3475d8c720dSMasaki Ota /* Check StickPointer device */ 3485d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEVICE_TYP, 3495d8c720dSMasaki Ota &pri_data->dev_type, 0, true); 3505d8c720dSMasaki Ota if (ret < 0) { 3515d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEVICE_TYP (%d)\n", ret); 3525d8c720dSMasaki Ota goto exit; 3535d8c720dSMasaki Ota } 3545d8c720dSMasaki Ota 3555d8c720dSMasaki Ota if (pri_data->dev_type & U1_DEVTYPE_SP_SUPPORT) { 3565d8c720dSMasaki Ota pri_data->dev_ctrl |= U1_SP_ABS_MODE; 3575d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 3585d8c720dSMasaki Ota NULL, pri_data->dev_ctrl, false); 3595d8c720dSMasaki Ota if (ret < 0) { 3605d8c720dSMasaki Ota dev_err(&hdev->dev, "failed SP mode (%d)\n", ret); 3615d8c720dSMasaki Ota goto exit; 3625d8c720dSMasaki Ota } 3635d8c720dSMasaki Ota 3645d8c720dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_SP_BTN, 3655d8c720dSMasaki Ota &pri_data->sp_btn_info, 0, true); 3665d8c720dSMasaki Ota if (ret < 0) { 3675d8c720dSMasaki Ota dev_err(&hdev->dev, "failed U1_SP_BTN (%d)\n", ret); 3685d8c720dSMasaki Ota goto exit; 3695d8c720dSMasaki Ota } 3705d8c720dSMasaki Ota pri_data->has_sp = 1; 3715d8c720dSMasaki Ota } 372*c7083d3fSMasaki Ota pri_data->max_fingers = 5; 3735d8c720dSMasaki Ota exit: 3745d8c720dSMasaki Ota return ret; 3755d8c720dSMasaki Ota } 3765d8c720dSMasaki Ota 3772562756dSMasaki Ota static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi) 3782562756dSMasaki Ota { 3792562756dSMasaki Ota struct u1_dev *data = hid_get_drvdata(hdev); 3802562756dSMasaki Ota struct input_dev *input = hi->input, *input2; 3812562756dSMasaki Ota int ret; 3822562756dSMasaki Ota int res_x, res_y, i; 3832562756dSMasaki Ota 3842562756dSMasaki Ota data->input = input; 3852562756dSMasaki Ota 3862562756dSMasaki Ota hid_dbg(hdev, "Opening low level driver\n"); 3872562756dSMasaki Ota ret = hid_hw_open(hdev); 3882562756dSMasaki Ota if (ret) 3892562756dSMasaki Ota return ret; 3902562756dSMasaki Ota 3912562756dSMasaki Ota /* Allow incoming hid reports */ 3922562756dSMasaki Ota hid_device_io_start(hdev); 3932562756dSMasaki Ota 3945d8c720dSMasaki Ota ret = u1_init(hdev, data); 3955d8c720dSMasaki Ota 3965d8c720dSMasaki Ota if (ret) 3972562756dSMasaki Ota goto exit; 3982562756dSMasaki Ota 3992562756dSMasaki Ota __set_bit(EV_ABS, input->evbit); 400*c7083d3fSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_X, 401*c7083d3fSMasaki Ota data->x_min, data->x_max, 0, 0); 402*c7083d3fSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_Y, 403*c7083d3fSMasaki Ota data->y_min, data->y_max, 0, 0); 4042562756dSMasaki Ota 405ce6abcf8SMasaki Ota if (data->x_active_len_mm && data->y_active_len_mm) { 406ce6abcf8SMasaki Ota res_x = (data->x_max - 1) / data->x_active_len_mm; 407ce6abcf8SMasaki Ota res_y = (data->y_max - 1) / data->y_active_len_mm; 4082562756dSMasaki Ota 4092562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_X, res_x); 4102562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_Y, res_y); 4112562756dSMasaki Ota } 4122562756dSMasaki Ota 4132562756dSMasaki Ota input_set_abs_params(input, ABS_MT_PRESSURE, 0, 64, 0, 0); 4142562756dSMasaki Ota 415*c7083d3fSMasaki Ota input_mt_init_slots(input, data->max_fingers, INPUT_MT_POINTER); 4162562756dSMasaki Ota 4172562756dSMasaki Ota __set_bit(EV_KEY, input->evbit); 418*c7083d3fSMasaki Ota 419*c7083d3fSMasaki Ota if (data->btn_cnt == 1) 4202562756dSMasaki Ota __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 4212562756dSMasaki Ota 422ce6abcf8SMasaki Ota for (i = 0; i < data->btn_cnt; i++) 4232562756dSMasaki Ota __set_bit(BTN_LEFT + i, input->keybit); 4242562756dSMasaki Ota 4252562756dSMasaki Ota /* Stick device initialization */ 4265d8c720dSMasaki Ota if (data->has_sp) { 4272562756dSMasaki Ota input2 = input_allocate_device(); 4282562756dSMasaki Ota if (!input2) { 429*c7083d3fSMasaki Ota input_free_device(input2); 4302562756dSMasaki Ota goto exit; 4312562756dSMasaki Ota } 4322562756dSMasaki Ota 433819d64e5SMasaki Ota data->input2 = input2; 4342562756dSMasaki Ota input2->phys = input->phys; 4352562756dSMasaki Ota input2->name = "DualPoint Stick"; 4362562756dSMasaki Ota input2->id.bustype = BUS_I2C; 4372562756dSMasaki Ota input2->id.vendor = input->id.vendor; 4382562756dSMasaki Ota input2->id.product = input->id.product; 4392562756dSMasaki Ota input2->id.version = input->id.version; 4402562756dSMasaki Ota input2->dev.parent = input->dev.parent; 4412562756dSMasaki Ota 4422562756dSMasaki Ota __set_bit(EV_KEY, input2->evbit); 443ce6abcf8SMasaki Ota data->sp_btn_cnt = (data->sp_btn_info & 0x0F); 444ce6abcf8SMasaki Ota for (i = 0; i < data->sp_btn_cnt; i++) 4452562756dSMasaki Ota __set_bit(BTN_LEFT + i, input2->keybit); 4462562756dSMasaki Ota 4472562756dSMasaki Ota __set_bit(EV_REL, input2->evbit); 4482562756dSMasaki Ota __set_bit(REL_X, input2->relbit); 4492562756dSMasaki Ota __set_bit(REL_Y, input2->relbit); 4502562756dSMasaki Ota __set_bit(INPUT_PROP_POINTER, input2->propbit); 4512562756dSMasaki Ota __set_bit(INPUT_PROP_POINTING_STICK, input2->propbit); 4522562756dSMasaki Ota 453*c7083d3fSMasaki Ota if (input_register_device(data->input2)) { 4542562756dSMasaki Ota input_free_device(input2); 4552562756dSMasaki Ota goto exit; 4562562756dSMasaki Ota } 4572562756dSMasaki Ota } 4582562756dSMasaki Ota 4592562756dSMasaki Ota exit: 4602562756dSMasaki Ota hid_device_io_stop(hdev); 4612562756dSMasaki Ota hid_hw_close(hdev); 4622562756dSMasaki Ota return ret; 4632562756dSMasaki Ota } 4642562756dSMasaki Ota 4652562756dSMasaki Ota static int alps_input_mapping(struct hid_device *hdev, 4662562756dSMasaki Ota struct hid_input *hi, struct hid_field *field, 4672562756dSMasaki Ota struct hid_usage *usage, unsigned long **bit, int *max) 4682562756dSMasaki Ota { 4692562756dSMasaki Ota return -1; 4702562756dSMasaki Ota } 4712562756dSMasaki Ota 4722562756dSMasaki Ota static int alps_probe(struct hid_device *hdev, const struct hid_device_id *id) 4732562756dSMasaki Ota { 4742562756dSMasaki Ota struct u1_dev *data = NULL; 4752562756dSMasaki Ota int ret; 4762562756dSMasaki Ota 4772562756dSMasaki Ota data = devm_kzalloc(&hdev->dev, sizeof(struct u1_dev), GFP_KERNEL); 4782562756dSMasaki Ota if (!data) 4792562756dSMasaki Ota return -ENOMEM; 4802562756dSMasaki Ota 4812562756dSMasaki Ota data->hdev = hdev; 4822562756dSMasaki Ota hid_set_drvdata(hdev, data); 4832562756dSMasaki Ota 4842562756dSMasaki Ota hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; 4852562756dSMasaki Ota 4862562756dSMasaki Ota ret = hid_parse(hdev); 4872562756dSMasaki Ota if (ret) { 4882562756dSMasaki Ota hid_err(hdev, "parse failed\n"); 4892562756dSMasaki Ota return ret; 4902562756dSMasaki Ota } 4912562756dSMasaki Ota 4922562756dSMasaki Ota ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 4932562756dSMasaki Ota if (ret) { 4942562756dSMasaki Ota hid_err(hdev, "hw start failed\n"); 4952562756dSMasaki Ota return ret; 4962562756dSMasaki Ota } 4972562756dSMasaki Ota 4982562756dSMasaki Ota return 0; 4992562756dSMasaki Ota } 5002562756dSMasaki Ota 5012562756dSMasaki Ota static void alps_remove(struct hid_device *hdev) 5022562756dSMasaki Ota { 5032562756dSMasaki Ota hid_hw_stop(hdev); 5042562756dSMasaki Ota } 5052562756dSMasaki Ota 5062562756dSMasaki Ota static const struct hid_device_id alps_id[] = { 5072562756dSMasaki Ota { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, 508819d64e5SMasaki Ota USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1_DUAL) }, 5092562756dSMasaki Ota { } 5102562756dSMasaki Ota }; 5112562756dSMasaki Ota MODULE_DEVICE_TABLE(hid, alps_id); 5122562756dSMasaki Ota 5132562756dSMasaki Ota static struct hid_driver alps_driver = { 5142562756dSMasaki Ota .name = "hid-alps", 5152562756dSMasaki Ota .id_table = alps_id, 5162562756dSMasaki Ota .probe = alps_probe, 5172562756dSMasaki Ota .remove = alps_remove, 5182562756dSMasaki Ota .raw_event = alps_raw_event, 5192562756dSMasaki Ota .input_mapping = alps_input_mapping, 5202562756dSMasaki Ota .input_configured = alps_input_configured, 5212562756dSMasaki Ota #ifdef CONFIG_PM 5222562756dSMasaki Ota .resume = alps_post_resume, 5232562756dSMasaki Ota .reset_resume = alps_post_reset, 5242562756dSMasaki Ota #endif 5252562756dSMasaki Ota }; 5262562756dSMasaki Ota 5272562756dSMasaki Ota module_hid_driver(alps_driver); 5282562756dSMasaki Ota 5292562756dSMasaki Ota MODULE_AUTHOR("Masaki Ota <masaki.ota@jp.alps.com>"); 5302562756dSMasaki Ota MODULE_DESCRIPTION("ALPS HID driver"); 5312562756dSMasaki Ota MODULE_LICENSE("GPL"); 532