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 762562756dSMasaki Ota * @btn_cnt: number of buttons 772562756dSMasaki Ota * @sp_btn_cnt: number of stick buttons 782562756dSMasaki Ota */ 792562756dSMasaki Ota struct u1_dev { 802562756dSMasaki Ota struct input_dev *input; 812562756dSMasaki Ota struct input_dev *input2; 822562756dSMasaki Ota struct hid_device *hdev; 832562756dSMasaki Ota 842562756dSMasaki Ota u8 dev_ctrl; 852562756dSMasaki Ota u8 dev_type; 862562756dSMasaki Ota u8 sen_line_num_x; 872562756dSMasaki Ota u8 sen_line_num_y; 882562756dSMasaki Ota u8 pitch_x; 892562756dSMasaki Ota u8 pitch_y; 902562756dSMasaki Ota u8 resolution; 912562756dSMasaki Ota u8 btn_info; 922562756dSMasaki Ota u8 sp_btn_info; 932562756dSMasaki Ota u32 x_active_len_mm; 942562756dSMasaki Ota u32 y_active_len_mm; 952562756dSMasaki Ota u32 x_max; 962562756dSMasaki Ota u32 y_max; 972562756dSMasaki Ota u32 btn_cnt; 982562756dSMasaki Ota u32 sp_btn_cnt; 992562756dSMasaki Ota }; 1002562756dSMasaki Ota 1012562756dSMasaki Ota static int u1_read_write_register(struct hid_device *hdev, u32 address, 1022562756dSMasaki Ota u8 *read_val, u8 write_val, bool read_flag) 1032562756dSMasaki Ota { 1042562756dSMasaki Ota int ret, i; 1052562756dSMasaki Ota u8 check_sum; 1062562756dSMasaki Ota u8 *input; 1072562756dSMasaki Ota u8 *readbuf; 1082562756dSMasaki Ota 109*819d64e5SMasaki Ota input = kzalloc(U1_FEATURE_REPORT_LEN, GFP_KERNEL); 1102562756dSMasaki Ota if (!input) 1112562756dSMasaki Ota return -ENOMEM; 1122562756dSMasaki Ota 1132562756dSMasaki Ota input[0] = U1_FEATURE_REPORT_ID; 1142562756dSMasaki Ota if (read_flag) { 1152562756dSMasaki Ota input[1] = U1_CMD_REGISTER_READ; 1162562756dSMasaki Ota input[6] = 0x00; 1172562756dSMasaki Ota } else { 1182562756dSMasaki Ota input[1] = U1_CMD_REGISTER_WRITE; 1192562756dSMasaki Ota input[6] = write_val; 1202562756dSMasaki Ota } 1212562756dSMasaki Ota 1222562756dSMasaki Ota put_unaligned_le32(address, input + 2); 1232562756dSMasaki Ota 1242562756dSMasaki Ota /* Calculate the checksum */ 1252562756dSMasaki Ota check_sum = U1_FEATURE_REPORT_LEN_ALL; 1262562756dSMasaki Ota for (i = 0; i < U1_FEATURE_REPORT_LEN - 1; i++) 1272562756dSMasaki Ota check_sum += input[i]; 1282562756dSMasaki Ota 1292562756dSMasaki Ota input[7] = check_sum; 1302562756dSMasaki Ota ret = hid_hw_raw_request(hdev, U1_FEATURE_REPORT_ID, input, 131*819d64e5SMasaki Ota U1_FEATURE_REPORT_LEN, 132*819d64e5SMasaki Ota HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 1332562756dSMasaki Ota 1342562756dSMasaki Ota if (ret < 0) { 1352562756dSMasaki Ota dev_err(&hdev->dev, "failed to read command (%d)\n", ret); 1362562756dSMasaki Ota goto exit; 1372562756dSMasaki Ota } 1382562756dSMasaki Ota 1392562756dSMasaki Ota if (read_flag) { 140*819d64e5SMasaki Ota readbuf = kzalloc(U1_FEATURE_REPORT_LEN, GFP_KERNEL); 141*819d64e5SMasaki Ota if (!readbuf) { 142*819d64e5SMasaki Ota kfree(input); 143*819d64e5SMasaki Ota return -ENOMEM; 144*819d64e5SMasaki Ota } 145*819d64e5SMasaki Ota 1462562756dSMasaki Ota ret = hid_hw_raw_request(hdev, U1_FEATURE_REPORT_ID, readbuf, 147*819d64e5SMasaki Ota U1_FEATURE_REPORT_LEN, 14863b3a7d0SJiri Kosina HID_FEATURE_REPORT, HID_REQ_GET_REPORT); 1492562756dSMasaki Ota 1502562756dSMasaki Ota if (ret < 0) { 1512562756dSMasaki Ota dev_err(&hdev->dev, "failed read register (%d)\n", ret); 1522562756dSMasaki Ota goto exit; 1532562756dSMasaki Ota } 1542562756dSMasaki Ota 1552562756dSMasaki Ota *read_val = readbuf[6]; 156*819d64e5SMasaki Ota 157*819d64e5SMasaki Ota kfree(readbuf); 1582562756dSMasaki Ota } 1592562756dSMasaki Ota 160*819d64e5SMasaki Ota ret = 0; 1612562756dSMasaki Ota 1622562756dSMasaki Ota exit: 1632562756dSMasaki Ota kfree(input); 1642562756dSMasaki Ota return ret; 1652562756dSMasaki Ota } 1662562756dSMasaki Ota 1672562756dSMasaki Ota static int alps_raw_event(struct hid_device *hdev, 1682562756dSMasaki Ota struct hid_report *report, u8 *data, int size) 1692562756dSMasaki Ota { 170*819d64e5SMasaki Ota unsigned int x, y, z; 171*819d64e5SMasaki Ota int i; 172*819d64e5SMasaki Ota short sp_x, sp_y; 1732562756dSMasaki Ota struct u1_dev *hdata = hid_get_drvdata(hdev); 1742562756dSMasaki Ota 1752562756dSMasaki Ota switch (data[0]) { 1762562756dSMasaki Ota case U1_MOUSE_REPORT_ID: 1772562756dSMasaki Ota break; 1782562756dSMasaki Ota case U1_FEATURE_REPORT_ID: 1792562756dSMasaki Ota break; 1802562756dSMasaki Ota case U1_ABSOLUTE_REPORT_ID: 1812562756dSMasaki Ota for (i = 0; i < MAX_TOUCHES; i++) { 182*819d64e5SMasaki Ota u8 *contact = &data[i * 5]; 183*819d64e5SMasaki Ota 184*819d64e5SMasaki Ota x = get_unaligned_le16(contact + 3); 185*819d64e5SMasaki Ota y = get_unaligned_le16(contact + 5); 186*819d64e5SMasaki Ota z = contact[7] & 0x7F; 1872562756dSMasaki Ota 1882562756dSMasaki Ota input_mt_slot(hdata->input, i); 1892562756dSMasaki Ota 190*819d64e5SMasaki Ota if (z != 0) { 1912562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 1922562756dSMasaki Ota MT_TOOL_FINGER, 1); 1932562756dSMasaki Ota } else { 1942562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 1952562756dSMasaki Ota MT_TOOL_FINGER, 0); 1962562756dSMasaki Ota break; 1972562756dSMasaki Ota } 1982562756dSMasaki Ota 199*819d64e5SMasaki Ota input_report_abs(hdata->input, ABS_MT_POSITION_X, x); 200*819d64e5SMasaki Ota input_report_abs(hdata->input, ABS_MT_POSITION_Y, y); 201*819d64e5SMasaki Ota input_report_abs(hdata->input, ABS_MT_PRESSURE, z); 202*819d64e5SMasaki Ota 2032562756dSMasaki Ota } 2042562756dSMasaki Ota 2052562756dSMasaki Ota input_mt_sync_frame(hdata->input); 2062562756dSMasaki Ota 207*819d64e5SMasaki Ota input_report_key(hdata->input, BTN_LEFT, 208*819d64e5SMasaki Ota data[1] & 0x1); 209*819d64e5SMasaki Ota input_report_key(hdata->input, BTN_RIGHT, 210*819d64e5SMasaki Ota (data[1] & 0x2)); 211*819d64e5SMasaki Ota input_report_key(hdata->input, BTN_MIDDLE, 212*819d64e5SMasaki Ota (data[1] & 0x4)); 213*819d64e5SMasaki Ota 214*819d64e5SMasaki Ota input_sync(hdata->input); 2152562756dSMasaki Ota 2162562756dSMasaki Ota return 1; 2172562756dSMasaki Ota 2182562756dSMasaki Ota case U1_SP_ABSOLUTE_REPORT_ID: 219*819d64e5SMasaki Ota sp_x = get_unaligned_le16(data+2); 220*819d64e5SMasaki Ota sp_y = get_unaligned_le16(data+4); 2212562756dSMasaki Ota 2222562756dSMasaki Ota sp_x = sp_x / 8; 2232562756dSMasaki Ota sp_y = sp_y / 8; 2242562756dSMasaki Ota 225*819d64e5SMasaki Ota input_report_rel(hdata->input2, REL_X, sp_x); 226*819d64e5SMasaki Ota input_report_rel(hdata->input2, REL_Y, sp_y); 2272562756dSMasaki Ota 228*819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_LEFT, 229*819d64e5SMasaki Ota data[1] & 0x1); 230*819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_RIGHT, 231*819d64e5SMasaki Ota (data[1] & 0x2)); 232*819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_MIDDLE, 233*819d64e5SMasaki Ota (data[1] & 0x4)); 2342562756dSMasaki Ota 235*819d64e5SMasaki Ota input_sync(hdata->input2); 2362562756dSMasaki Ota 2372562756dSMasaki Ota return 1; 2382562756dSMasaki Ota } 2392562756dSMasaki Ota 2402562756dSMasaki Ota return 0; 2412562756dSMasaki Ota } 2422562756dSMasaki Ota 2432562756dSMasaki Ota #ifdef CONFIG_PM 2442562756dSMasaki Ota static int alps_post_reset(struct hid_device *hdev) 2452562756dSMasaki Ota { 2462562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2472562756dSMasaki Ota NULL, U1_TP_ABS_MODE, false); 2482562756dSMasaki Ota } 2492562756dSMasaki Ota 2502562756dSMasaki Ota static int alps_post_resume(struct hid_device *hdev) 2512562756dSMasaki Ota { 2522562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2532562756dSMasaki Ota NULL, U1_TP_ABS_MODE, false); 2542562756dSMasaki Ota } 2552562756dSMasaki Ota #endif /* CONFIG_PM */ 2562562756dSMasaki Ota 2572562756dSMasaki Ota static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi) 2582562756dSMasaki Ota { 2592562756dSMasaki Ota struct u1_dev *data = hid_get_drvdata(hdev); 2602562756dSMasaki Ota struct input_dev *input = hi->input, *input2; 2612562756dSMasaki Ota struct u1_dev devInfo; 2622562756dSMasaki Ota int ret; 2632562756dSMasaki Ota int res_x, res_y, i; 2642562756dSMasaki Ota 2652562756dSMasaki Ota data->input = input; 2662562756dSMasaki Ota 2672562756dSMasaki Ota hid_dbg(hdev, "Opening low level driver\n"); 2682562756dSMasaki Ota ret = hid_hw_open(hdev); 2692562756dSMasaki Ota if (ret) 2702562756dSMasaki Ota return ret; 2712562756dSMasaki Ota 2722562756dSMasaki Ota /* Allow incoming hid reports */ 2732562756dSMasaki Ota hid_device_io_start(hdev); 2742562756dSMasaki Ota 2752562756dSMasaki Ota /* Device initialization */ 2762562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2772562756dSMasaki Ota &devInfo.dev_ctrl, 0, true); 2782562756dSMasaki Ota if (ret < 0) { 2792562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEV_CTRL_1 (%d)\n", ret); 2802562756dSMasaki Ota goto exit; 2812562756dSMasaki Ota } 2822562756dSMasaki Ota 2832562756dSMasaki Ota devInfo.dev_ctrl &= ~U1_DISABLE_DEV; 2842562756dSMasaki Ota devInfo.dev_ctrl |= U1_TP_ABS_MODE; 2852562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2862562756dSMasaki Ota NULL, devInfo.dev_ctrl, false); 2872562756dSMasaki Ota if (ret < 0) { 2882562756dSMasaki Ota dev_err(&hdev->dev, "failed to change TP mode (%d)\n", ret); 2892562756dSMasaki Ota goto exit; 2902562756dSMasaki Ota } 2912562756dSMasaki Ota 2922562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_X, 2932562756dSMasaki Ota &devInfo.sen_line_num_x, 0, true); 2942562756dSMasaki Ota if (ret < 0) { 2952562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_X (%d)\n", ret); 2962562756dSMasaki Ota goto exit; 2972562756dSMasaki Ota } 2982562756dSMasaki Ota 2992562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_Y, 3002562756dSMasaki Ota &devInfo.sen_line_num_y, 0, true); 3012562756dSMasaki Ota if (ret < 0) { 3022562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_Y (%d)\n", ret); 3032562756dSMasaki Ota goto exit; 3042562756dSMasaki Ota } 3052562756dSMasaki Ota 3062562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_X, 3072562756dSMasaki Ota &devInfo.pitch_x, 0, true); 3082562756dSMasaki Ota if (ret < 0) { 3092562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_X (%d)\n", ret); 3102562756dSMasaki Ota goto exit; 3112562756dSMasaki Ota } 3122562756dSMasaki Ota 3132562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_Y, 3142562756dSMasaki Ota &devInfo.pitch_y, 0, true); 3152562756dSMasaki Ota if (ret < 0) { 3162562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_Y (%d)\n", ret); 3172562756dSMasaki Ota goto exit; 3182562756dSMasaki Ota } 3192562756dSMasaki Ota 3202562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_RESO_DWN_ABS, 3212562756dSMasaki Ota &devInfo.resolution, 0, true); 3222562756dSMasaki Ota if (ret < 0) { 3232562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_RESO_DWN_ABS (%d)\n", ret); 3242562756dSMasaki Ota goto exit; 3252562756dSMasaki Ota } 3262562756dSMasaki Ota 3272562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PAD_BTN, 3282562756dSMasaki Ota &devInfo.btn_info, 0, true); 3292562756dSMasaki Ota if (ret < 0) { 3302562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PAD_BTN (%d)\n", ret); 3312562756dSMasaki Ota goto exit; 3322562756dSMasaki Ota } 3332562756dSMasaki Ota 3342562756dSMasaki Ota /* Check StickPointer device */ 3352562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEVICE_TYP, 3362562756dSMasaki Ota &devInfo.dev_type, 0, true); 3372562756dSMasaki Ota if (ret < 0) { 3382562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEVICE_TYP (%d)\n", ret); 3392562756dSMasaki Ota goto exit; 3402562756dSMasaki Ota } 3412562756dSMasaki Ota 3422562756dSMasaki Ota devInfo.x_active_len_mm = 3432562756dSMasaki Ota (devInfo.pitch_x * (devInfo.sen_line_num_x - 1)) / 10; 3442562756dSMasaki Ota devInfo.y_active_len_mm = 3452562756dSMasaki Ota (devInfo.pitch_y * (devInfo.sen_line_num_y - 1)) / 10; 3462562756dSMasaki Ota 3472562756dSMasaki Ota devInfo.x_max = 3482562756dSMasaki Ota (devInfo.resolution << 2) * (devInfo.sen_line_num_x - 1); 3492562756dSMasaki Ota devInfo.y_max = 3502562756dSMasaki Ota (devInfo.resolution << 2) * (devInfo.sen_line_num_y - 1); 3512562756dSMasaki Ota 3522562756dSMasaki Ota __set_bit(EV_ABS, input->evbit); 3532562756dSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_X, 1, devInfo.x_max, 0, 0); 3542562756dSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_Y, 1, devInfo.y_max, 0, 0); 3552562756dSMasaki Ota 3562562756dSMasaki Ota if (devInfo.x_active_len_mm && devInfo.y_active_len_mm) { 3572562756dSMasaki Ota res_x = (devInfo.x_max - 1) / devInfo.x_active_len_mm; 3582562756dSMasaki Ota res_y = (devInfo.y_max - 1) / devInfo.y_active_len_mm; 3592562756dSMasaki Ota 3602562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_X, res_x); 3612562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_Y, res_y); 3622562756dSMasaki Ota } 3632562756dSMasaki Ota 3642562756dSMasaki Ota input_set_abs_params(input, ABS_MT_PRESSURE, 0, 64, 0, 0); 3652562756dSMasaki Ota 3662562756dSMasaki Ota input_mt_init_slots(input, MAX_TOUCHES, INPUT_MT_POINTER); 3672562756dSMasaki Ota 3682562756dSMasaki Ota __set_bit(EV_KEY, input->evbit); 3692562756dSMasaki Ota if ((devInfo.btn_info & 0x0F) == (devInfo.btn_info & 0xF0) >> 4) { 3702562756dSMasaki Ota devInfo.btn_cnt = (devInfo.btn_info & 0x0F); 3712562756dSMasaki Ota } else { 3722562756dSMasaki Ota /* Button pad */ 3732562756dSMasaki Ota devInfo.btn_cnt = 1; 3742562756dSMasaki Ota __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 3752562756dSMasaki Ota } 3762562756dSMasaki Ota 3772562756dSMasaki Ota for (i = 0; i < devInfo.btn_cnt; i++) 3782562756dSMasaki Ota __set_bit(BTN_LEFT + i, input->keybit); 3792562756dSMasaki Ota 3802562756dSMasaki Ota 3812562756dSMasaki Ota /* Stick device initialization */ 3822562756dSMasaki Ota if (devInfo.dev_type & U1_DEVTYPE_SP_SUPPORT) { 3832562756dSMasaki Ota 3842562756dSMasaki Ota input2 = input_allocate_device(); 3852562756dSMasaki Ota if (!input2) { 3862562756dSMasaki Ota input_free_device(input2); 3872562756dSMasaki Ota goto exit; 3882562756dSMasaki Ota } 3892562756dSMasaki Ota 390*819d64e5SMasaki Ota data->input2 = input2; 3912562756dSMasaki Ota 3922562756dSMasaki Ota devInfo.dev_ctrl |= U1_SP_ABS_MODE; 3932562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 3942562756dSMasaki Ota NULL, devInfo.dev_ctrl, false); 3952562756dSMasaki Ota if (ret < 0) { 3962562756dSMasaki Ota dev_err(&hdev->dev, "failed SP mode (%d)\n", ret); 3972562756dSMasaki Ota input_free_device(input2); 3982562756dSMasaki Ota goto exit; 3992562756dSMasaki Ota } 4002562756dSMasaki Ota 4012562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_SP_BTN, 4022562756dSMasaki Ota &devInfo.sp_btn_info, 0, true); 4032562756dSMasaki Ota if (ret < 0) { 4042562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_SP_BTN (%d)\n", ret); 4052562756dSMasaki Ota input_free_device(input2); 4062562756dSMasaki Ota goto exit; 4072562756dSMasaki Ota } 4082562756dSMasaki Ota 4092562756dSMasaki Ota input2->phys = input->phys; 4102562756dSMasaki Ota input2->name = "DualPoint Stick"; 4112562756dSMasaki Ota input2->id.bustype = BUS_I2C; 4122562756dSMasaki Ota input2->id.vendor = input->id.vendor; 4132562756dSMasaki Ota input2->id.product = input->id.product; 4142562756dSMasaki Ota input2->id.version = input->id.version; 4152562756dSMasaki Ota input2->dev.parent = input->dev.parent; 4162562756dSMasaki Ota 4172562756dSMasaki Ota __set_bit(EV_KEY, input2->evbit); 4182562756dSMasaki Ota devInfo.sp_btn_cnt = (devInfo.sp_btn_info & 0x0F); 4192562756dSMasaki Ota for (i = 0; i < devInfo.sp_btn_cnt; i++) 4202562756dSMasaki Ota __set_bit(BTN_LEFT + i, input2->keybit); 4212562756dSMasaki Ota 4222562756dSMasaki Ota __set_bit(EV_REL, input2->evbit); 4232562756dSMasaki Ota __set_bit(REL_X, input2->relbit); 4242562756dSMasaki Ota __set_bit(REL_Y, input2->relbit); 4252562756dSMasaki Ota __set_bit(INPUT_PROP_POINTER, input2->propbit); 4262562756dSMasaki Ota __set_bit(INPUT_PROP_POINTING_STICK, input2->propbit); 4272562756dSMasaki Ota 428*819d64e5SMasaki Ota if (input_register_device(data->input2)) { 4292562756dSMasaki Ota input_free_device(input2); 4302562756dSMasaki Ota goto exit; 4312562756dSMasaki Ota } 4322562756dSMasaki Ota } 4332562756dSMasaki Ota 4342562756dSMasaki Ota exit: 4352562756dSMasaki Ota hid_device_io_stop(hdev); 4362562756dSMasaki Ota hid_hw_close(hdev); 4372562756dSMasaki Ota return ret; 4382562756dSMasaki Ota } 4392562756dSMasaki Ota 4402562756dSMasaki Ota static int alps_input_mapping(struct hid_device *hdev, 4412562756dSMasaki Ota struct hid_input *hi, struct hid_field *field, 4422562756dSMasaki Ota struct hid_usage *usage, unsigned long **bit, int *max) 4432562756dSMasaki Ota { 4442562756dSMasaki Ota return -1; 4452562756dSMasaki Ota } 4462562756dSMasaki Ota 4472562756dSMasaki Ota static int alps_probe(struct hid_device *hdev, const struct hid_device_id *id) 4482562756dSMasaki Ota { 4492562756dSMasaki Ota struct u1_dev *data = NULL; 4502562756dSMasaki Ota int ret; 4512562756dSMasaki Ota 4522562756dSMasaki Ota data = devm_kzalloc(&hdev->dev, sizeof(struct u1_dev), GFP_KERNEL); 4532562756dSMasaki Ota if (!data) 4542562756dSMasaki Ota return -ENOMEM; 4552562756dSMasaki Ota 4562562756dSMasaki Ota data->hdev = hdev; 4572562756dSMasaki Ota hid_set_drvdata(hdev, data); 4582562756dSMasaki Ota 4592562756dSMasaki Ota hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; 4602562756dSMasaki Ota 4612562756dSMasaki Ota ret = hid_parse(hdev); 4622562756dSMasaki Ota if (ret) { 4632562756dSMasaki Ota hid_err(hdev, "parse failed\n"); 4642562756dSMasaki Ota return ret; 4652562756dSMasaki Ota } 4662562756dSMasaki Ota 4672562756dSMasaki Ota ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 4682562756dSMasaki Ota if (ret) { 4692562756dSMasaki Ota hid_err(hdev, "hw start failed\n"); 4702562756dSMasaki Ota return ret; 4712562756dSMasaki Ota } 4722562756dSMasaki Ota 4732562756dSMasaki Ota return 0; 4742562756dSMasaki Ota } 4752562756dSMasaki Ota 4762562756dSMasaki Ota static void alps_remove(struct hid_device *hdev) 4772562756dSMasaki Ota { 4782562756dSMasaki Ota hid_hw_stop(hdev); 4792562756dSMasaki Ota } 4802562756dSMasaki Ota 4812562756dSMasaki Ota static const struct hid_device_id alps_id[] = { 4822562756dSMasaki Ota { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, 483*819d64e5SMasaki Ota USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1_DUAL) }, 4842562756dSMasaki Ota { } 4852562756dSMasaki Ota }; 4862562756dSMasaki Ota MODULE_DEVICE_TABLE(hid, alps_id); 4872562756dSMasaki Ota 4882562756dSMasaki Ota static struct hid_driver alps_driver = { 4892562756dSMasaki Ota .name = "hid-alps", 4902562756dSMasaki Ota .id_table = alps_id, 4912562756dSMasaki Ota .probe = alps_probe, 4922562756dSMasaki Ota .remove = alps_remove, 4932562756dSMasaki Ota .raw_event = alps_raw_event, 4942562756dSMasaki Ota .input_mapping = alps_input_mapping, 4952562756dSMasaki Ota .input_configured = alps_input_configured, 4962562756dSMasaki Ota #ifdef CONFIG_PM 4972562756dSMasaki Ota .resume = alps_post_resume, 4982562756dSMasaki Ota .reset_resume = alps_post_reset, 4992562756dSMasaki Ota #endif 5002562756dSMasaki Ota }; 5012562756dSMasaki Ota 5022562756dSMasaki Ota module_hid_driver(alps_driver); 5032562756dSMasaki Ota 5042562756dSMasaki Ota MODULE_AUTHOR("Masaki Ota <masaki.ota@jp.alps.com>"); 5052562756dSMasaki Ota MODULE_DESCRIPTION("ALPS HID driver"); 5062562756dSMasaki Ota MODULE_LICENSE("GPL"); 507