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 109819d64e5SMasaki 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, 131819d64e5SMasaki Ota U1_FEATURE_REPORT_LEN, 132819d64e5SMasaki 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) { 140819d64e5SMasaki Ota readbuf = kzalloc(U1_FEATURE_REPORT_LEN, GFP_KERNEL); 141819d64e5SMasaki Ota if (!readbuf) { 142*7ee2eaa3SAxel Lin ret = -ENOMEM; 143*7ee2eaa3SAxel Lin goto exit; 144819d64e5SMasaki Ota } 145819d64e5SMasaki Ota 1462562756dSMasaki Ota ret = hid_hw_raw_request(hdev, U1_FEATURE_REPORT_ID, readbuf, 147819d64e5SMasaki 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); 152*7ee2eaa3SAxel Lin kfree(readbuf); 1532562756dSMasaki Ota goto exit; 1542562756dSMasaki Ota } 1552562756dSMasaki Ota 1562562756dSMasaki Ota *read_val = readbuf[6]; 157819d64e5SMasaki Ota 158819d64e5SMasaki Ota kfree(readbuf); 1592562756dSMasaki Ota } 1602562756dSMasaki Ota 161819d64e5SMasaki Ota ret = 0; 1622562756dSMasaki Ota 1632562756dSMasaki Ota exit: 1642562756dSMasaki Ota kfree(input); 1652562756dSMasaki Ota return ret; 1662562756dSMasaki Ota } 1672562756dSMasaki Ota 1682562756dSMasaki Ota static int alps_raw_event(struct hid_device *hdev, 1692562756dSMasaki Ota struct hid_report *report, u8 *data, int size) 1702562756dSMasaki Ota { 171819d64e5SMasaki Ota unsigned int x, y, z; 172819d64e5SMasaki Ota int i; 173819d64e5SMasaki Ota short sp_x, sp_y; 1742562756dSMasaki Ota struct u1_dev *hdata = hid_get_drvdata(hdev); 1752562756dSMasaki Ota 1762562756dSMasaki Ota switch (data[0]) { 1772562756dSMasaki Ota case U1_MOUSE_REPORT_ID: 1782562756dSMasaki Ota break; 1792562756dSMasaki Ota case U1_FEATURE_REPORT_ID: 1802562756dSMasaki Ota break; 1812562756dSMasaki Ota case U1_ABSOLUTE_REPORT_ID: 1822562756dSMasaki Ota for (i = 0; i < MAX_TOUCHES; i++) { 183819d64e5SMasaki Ota u8 *contact = &data[i * 5]; 184819d64e5SMasaki Ota 185819d64e5SMasaki Ota x = get_unaligned_le16(contact + 3); 186819d64e5SMasaki Ota y = get_unaligned_le16(contact + 5); 187819d64e5SMasaki Ota z = contact[7] & 0x7F; 1882562756dSMasaki Ota 1892562756dSMasaki Ota input_mt_slot(hdata->input, i); 1902562756dSMasaki Ota 191819d64e5SMasaki Ota if (z != 0) { 1922562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 1932562756dSMasaki Ota MT_TOOL_FINGER, 1); 1942562756dSMasaki Ota } else { 1952562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 1962562756dSMasaki Ota MT_TOOL_FINGER, 0); 1972562756dSMasaki Ota break; 1982562756dSMasaki Ota } 1992562756dSMasaki Ota 200819d64e5SMasaki Ota input_report_abs(hdata->input, ABS_MT_POSITION_X, x); 201819d64e5SMasaki Ota input_report_abs(hdata->input, ABS_MT_POSITION_Y, y); 202819d64e5SMasaki Ota input_report_abs(hdata->input, ABS_MT_PRESSURE, z); 203819d64e5SMasaki Ota 2042562756dSMasaki Ota } 2052562756dSMasaki Ota 2062562756dSMasaki Ota input_mt_sync_frame(hdata->input); 2072562756dSMasaki Ota 208819d64e5SMasaki Ota input_report_key(hdata->input, BTN_LEFT, 209819d64e5SMasaki Ota data[1] & 0x1); 210819d64e5SMasaki Ota input_report_key(hdata->input, BTN_RIGHT, 211819d64e5SMasaki Ota (data[1] & 0x2)); 212819d64e5SMasaki Ota input_report_key(hdata->input, BTN_MIDDLE, 213819d64e5SMasaki Ota (data[1] & 0x4)); 214819d64e5SMasaki Ota 215819d64e5SMasaki Ota input_sync(hdata->input); 2162562756dSMasaki Ota 2172562756dSMasaki Ota return 1; 2182562756dSMasaki Ota 2192562756dSMasaki Ota case U1_SP_ABSOLUTE_REPORT_ID: 220819d64e5SMasaki Ota sp_x = get_unaligned_le16(data+2); 221819d64e5SMasaki Ota sp_y = get_unaligned_le16(data+4); 2222562756dSMasaki Ota 2232562756dSMasaki Ota sp_x = sp_x / 8; 2242562756dSMasaki Ota sp_y = sp_y / 8; 2252562756dSMasaki Ota 226819d64e5SMasaki Ota input_report_rel(hdata->input2, REL_X, sp_x); 227819d64e5SMasaki Ota input_report_rel(hdata->input2, REL_Y, sp_y); 2282562756dSMasaki Ota 229819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_LEFT, 230819d64e5SMasaki Ota data[1] & 0x1); 231819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_RIGHT, 232819d64e5SMasaki Ota (data[1] & 0x2)); 233819d64e5SMasaki Ota input_report_key(hdata->input2, BTN_MIDDLE, 234819d64e5SMasaki Ota (data[1] & 0x4)); 2352562756dSMasaki Ota 236819d64e5SMasaki Ota input_sync(hdata->input2); 2372562756dSMasaki Ota 2382562756dSMasaki Ota return 1; 2392562756dSMasaki Ota } 2402562756dSMasaki Ota 2412562756dSMasaki Ota return 0; 2422562756dSMasaki Ota } 2432562756dSMasaki Ota 2442562756dSMasaki Ota #ifdef CONFIG_PM 2452562756dSMasaki Ota static int alps_post_reset(struct hid_device *hdev) 2462562756dSMasaki Ota { 2472562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2482562756dSMasaki Ota NULL, U1_TP_ABS_MODE, false); 2492562756dSMasaki Ota } 2502562756dSMasaki Ota 2512562756dSMasaki Ota static int alps_post_resume(struct hid_device *hdev) 2522562756dSMasaki Ota { 2532562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2542562756dSMasaki Ota NULL, U1_TP_ABS_MODE, false); 2552562756dSMasaki Ota } 2562562756dSMasaki Ota #endif /* CONFIG_PM */ 2572562756dSMasaki Ota 2582562756dSMasaki Ota static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi) 2592562756dSMasaki Ota { 2602562756dSMasaki Ota struct u1_dev *data = hid_get_drvdata(hdev); 2612562756dSMasaki Ota struct input_dev *input = hi->input, *input2; 2622562756dSMasaki Ota struct u1_dev devInfo; 2632562756dSMasaki Ota int ret; 2642562756dSMasaki Ota int res_x, res_y, i; 2652562756dSMasaki Ota 2662562756dSMasaki Ota data->input = input; 2672562756dSMasaki Ota 2682562756dSMasaki Ota hid_dbg(hdev, "Opening low level driver\n"); 2692562756dSMasaki Ota ret = hid_hw_open(hdev); 2702562756dSMasaki Ota if (ret) 2712562756dSMasaki Ota return ret; 2722562756dSMasaki Ota 2732562756dSMasaki Ota /* Allow incoming hid reports */ 2742562756dSMasaki Ota hid_device_io_start(hdev); 2752562756dSMasaki Ota 2762562756dSMasaki Ota /* Device initialization */ 2772562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2782562756dSMasaki Ota &devInfo.dev_ctrl, 0, true); 2792562756dSMasaki Ota if (ret < 0) { 2802562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEV_CTRL_1 (%d)\n", ret); 2812562756dSMasaki Ota goto exit; 2822562756dSMasaki Ota } 2832562756dSMasaki Ota 2842562756dSMasaki Ota devInfo.dev_ctrl &= ~U1_DISABLE_DEV; 2852562756dSMasaki Ota devInfo.dev_ctrl |= U1_TP_ABS_MODE; 2862562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 2872562756dSMasaki Ota NULL, devInfo.dev_ctrl, false); 2882562756dSMasaki Ota if (ret < 0) { 2892562756dSMasaki Ota dev_err(&hdev->dev, "failed to change TP mode (%d)\n", ret); 2902562756dSMasaki Ota goto exit; 2912562756dSMasaki Ota } 2922562756dSMasaki Ota 2932562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_X, 2942562756dSMasaki Ota &devInfo.sen_line_num_x, 0, true); 2952562756dSMasaki Ota if (ret < 0) { 2962562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_X (%d)\n", ret); 2972562756dSMasaki Ota goto exit; 2982562756dSMasaki Ota } 2992562756dSMasaki Ota 3002562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_Y, 3012562756dSMasaki Ota &devInfo.sen_line_num_y, 0, true); 3022562756dSMasaki Ota if (ret < 0) { 3032562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_Y (%d)\n", ret); 3042562756dSMasaki Ota goto exit; 3052562756dSMasaki Ota } 3062562756dSMasaki Ota 3072562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_X, 3082562756dSMasaki Ota &devInfo.pitch_x, 0, true); 3092562756dSMasaki Ota if (ret < 0) { 3102562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_X (%d)\n", ret); 3112562756dSMasaki Ota goto exit; 3122562756dSMasaki Ota } 3132562756dSMasaki Ota 3142562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_Y, 3152562756dSMasaki Ota &devInfo.pitch_y, 0, true); 3162562756dSMasaki Ota if (ret < 0) { 3172562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_Y (%d)\n", ret); 3182562756dSMasaki Ota goto exit; 3192562756dSMasaki Ota } 3202562756dSMasaki Ota 3212562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_RESO_DWN_ABS, 3222562756dSMasaki Ota &devInfo.resolution, 0, true); 3232562756dSMasaki Ota if (ret < 0) { 3242562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_RESO_DWN_ABS (%d)\n", ret); 3252562756dSMasaki Ota goto exit; 3262562756dSMasaki Ota } 3272562756dSMasaki Ota 3282562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PAD_BTN, 3292562756dSMasaki Ota &devInfo.btn_info, 0, true); 3302562756dSMasaki Ota if (ret < 0) { 3312562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PAD_BTN (%d)\n", ret); 3322562756dSMasaki Ota goto exit; 3332562756dSMasaki Ota } 3342562756dSMasaki Ota 3352562756dSMasaki Ota /* Check StickPointer device */ 3362562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEVICE_TYP, 3372562756dSMasaki Ota &devInfo.dev_type, 0, true); 3382562756dSMasaki Ota if (ret < 0) { 3392562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEVICE_TYP (%d)\n", ret); 3402562756dSMasaki Ota goto exit; 3412562756dSMasaki Ota } 3422562756dSMasaki Ota 3432562756dSMasaki Ota devInfo.x_active_len_mm = 3442562756dSMasaki Ota (devInfo.pitch_x * (devInfo.sen_line_num_x - 1)) / 10; 3452562756dSMasaki Ota devInfo.y_active_len_mm = 3462562756dSMasaki Ota (devInfo.pitch_y * (devInfo.sen_line_num_y - 1)) / 10; 3472562756dSMasaki Ota 3482562756dSMasaki Ota devInfo.x_max = 3492562756dSMasaki Ota (devInfo.resolution << 2) * (devInfo.sen_line_num_x - 1); 3502562756dSMasaki Ota devInfo.y_max = 3512562756dSMasaki Ota (devInfo.resolution << 2) * (devInfo.sen_line_num_y - 1); 3522562756dSMasaki Ota 3532562756dSMasaki Ota __set_bit(EV_ABS, input->evbit); 3542562756dSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_X, 1, devInfo.x_max, 0, 0); 3552562756dSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_Y, 1, devInfo.y_max, 0, 0); 3562562756dSMasaki Ota 3572562756dSMasaki Ota if (devInfo.x_active_len_mm && devInfo.y_active_len_mm) { 3582562756dSMasaki Ota res_x = (devInfo.x_max - 1) / devInfo.x_active_len_mm; 3592562756dSMasaki Ota res_y = (devInfo.y_max - 1) / devInfo.y_active_len_mm; 3602562756dSMasaki Ota 3612562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_X, res_x); 3622562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_Y, res_y); 3632562756dSMasaki Ota } 3642562756dSMasaki Ota 3652562756dSMasaki Ota input_set_abs_params(input, ABS_MT_PRESSURE, 0, 64, 0, 0); 3662562756dSMasaki Ota 3672562756dSMasaki Ota input_mt_init_slots(input, MAX_TOUCHES, INPUT_MT_POINTER); 3682562756dSMasaki Ota 3692562756dSMasaki Ota __set_bit(EV_KEY, input->evbit); 3702562756dSMasaki Ota if ((devInfo.btn_info & 0x0F) == (devInfo.btn_info & 0xF0) >> 4) { 3712562756dSMasaki Ota devInfo.btn_cnt = (devInfo.btn_info & 0x0F); 3722562756dSMasaki Ota } else { 3732562756dSMasaki Ota /* Button pad */ 3742562756dSMasaki Ota devInfo.btn_cnt = 1; 3752562756dSMasaki Ota __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 3762562756dSMasaki Ota } 3772562756dSMasaki Ota 3782562756dSMasaki Ota for (i = 0; i < devInfo.btn_cnt; i++) 3792562756dSMasaki Ota __set_bit(BTN_LEFT + i, input->keybit); 3802562756dSMasaki Ota 3812562756dSMasaki Ota 3822562756dSMasaki Ota /* Stick device initialization */ 3832562756dSMasaki Ota if (devInfo.dev_type & U1_DEVTYPE_SP_SUPPORT) { 3842562756dSMasaki Ota 3852562756dSMasaki Ota input2 = input_allocate_device(); 3862562756dSMasaki Ota if (!input2) { 3872562756dSMasaki Ota input_free_device(input2); 3882562756dSMasaki Ota goto exit; 3892562756dSMasaki Ota } 3902562756dSMasaki Ota 391819d64e5SMasaki Ota data->input2 = input2; 3922562756dSMasaki Ota 3932562756dSMasaki Ota devInfo.dev_ctrl |= U1_SP_ABS_MODE; 3942562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 3952562756dSMasaki Ota NULL, devInfo.dev_ctrl, false); 3962562756dSMasaki Ota if (ret < 0) { 3972562756dSMasaki Ota dev_err(&hdev->dev, "failed SP mode (%d)\n", ret); 3982562756dSMasaki Ota input_free_device(input2); 3992562756dSMasaki Ota goto exit; 4002562756dSMasaki Ota } 4012562756dSMasaki Ota 4022562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_SP_BTN, 4032562756dSMasaki Ota &devInfo.sp_btn_info, 0, true); 4042562756dSMasaki Ota if (ret < 0) { 4052562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_SP_BTN (%d)\n", ret); 4062562756dSMasaki Ota input_free_device(input2); 4072562756dSMasaki Ota goto exit; 4082562756dSMasaki Ota } 4092562756dSMasaki Ota 4102562756dSMasaki Ota input2->phys = input->phys; 4112562756dSMasaki Ota input2->name = "DualPoint Stick"; 4122562756dSMasaki Ota input2->id.bustype = BUS_I2C; 4132562756dSMasaki Ota input2->id.vendor = input->id.vendor; 4142562756dSMasaki Ota input2->id.product = input->id.product; 4152562756dSMasaki Ota input2->id.version = input->id.version; 4162562756dSMasaki Ota input2->dev.parent = input->dev.parent; 4172562756dSMasaki Ota 4182562756dSMasaki Ota __set_bit(EV_KEY, input2->evbit); 4192562756dSMasaki Ota devInfo.sp_btn_cnt = (devInfo.sp_btn_info & 0x0F); 4202562756dSMasaki Ota for (i = 0; i < devInfo.sp_btn_cnt; i++) 4212562756dSMasaki Ota __set_bit(BTN_LEFT + i, input2->keybit); 4222562756dSMasaki Ota 4232562756dSMasaki Ota __set_bit(EV_REL, input2->evbit); 4242562756dSMasaki Ota __set_bit(REL_X, input2->relbit); 4252562756dSMasaki Ota __set_bit(REL_Y, input2->relbit); 4262562756dSMasaki Ota __set_bit(INPUT_PROP_POINTER, input2->propbit); 4272562756dSMasaki Ota __set_bit(INPUT_PROP_POINTING_STICK, input2->propbit); 4282562756dSMasaki Ota 429819d64e5SMasaki Ota if (input_register_device(data->input2)) { 4302562756dSMasaki Ota input_free_device(input2); 4312562756dSMasaki Ota goto exit; 4322562756dSMasaki Ota } 4332562756dSMasaki Ota } 4342562756dSMasaki Ota 4352562756dSMasaki Ota exit: 4362562756dSMasaki Ota hid_device_io_stop(hdev); 4372562756dSMasaki Ota hid_hw_close(hdev); 4382562756dSMasaki Ota return ret; 4392562756dSMasaki Ota } 4402562756dSMasaki Ota 4412562756dSMasaki Ota static int alps_input_mapping(struct hid_device *hdev, 4422562756dSMasaki Ota struct hid_input *hi, struct hid_field *field, 4432562756dSMasaki Ota struct hid_usage *usage, unsigned long **bit, int *max) 4442562756dSMasaki Ota { 4452562756dSMasaki Ota return -1; 4462562756dSMasaki Ota } 4472562756dSMasaki Ota 4482562756dSMasaki Ota static int alps_probe(struct hid_device *hdev, const struct hid_device_id *id) 4492562756dSMasaki Ota { 4502562756dSMasaki Ota struct u1_dev *data = NULL; 4512562756dSMasaki Ota int ret; 4522562756dSMasaki Ota 4532562756dSMasaki Ota data = devm_kzalloc(&hdev->dev, sizeof(struct u1_dev), GFP_KERNEL); 4542562756dSMasaki Ota if (!data) 4552562756dSMasaki Ota return -ENOMEM; 4562562756dSMasaki Ota 4572562756dSMasaki Ota data->hdev = hdev; 4582562756dSMasaki Ota hid_set_drvdata(hdev, data); 4592562756dSMasaki Ota 4602562756dSMasaki Ota hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; 4612562756dSMasaki Ota 4622562756dSMasaki Ota ret = hid_parse(hdev); 4632562756dSMasaki Ota if (ret) { 4642562756dSMasaki Ota hid_err(hdev, "parse failed\n"); 4652562756dSMasaki Ota return ret; 4662562756dSMasaki Ota } 4672562756dSMasaki Ota 4682562756dSMasaki Ota ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 4692562756dSMasaki Ota if (ret) { 4702562756dSMasaki Ota hid_err(hdev, "hw start failed\n"); 4712562756dSMasaki Ota return ret; 4722562756dSMasaki Ota } 4732562756dSMasaki Ota 4742562756dSMasaki Ota return 0; 4752562756dSMasaki Ota } 4762562756dSMasaki Ota 4772562756dSMasaki Ota static void alps_remove(struct hid_device *hdev) 4782562756dSMasaki Ota { 4792562756dSMasaki Ota hid_hw_stop(hdev); 4802562756dSMasaki Ota } 4812562756dSMasaki Ota 4822562756dSMasaki Ota static const struct hid_device_id alps_id[] = { 4832562756dSMasaki Ota { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, 484819d64e5SMasaki Ota USB_VENDOR_ID_ALPS_JP, HID_DEVICE_ID_ALPS_U1_DUAL) }, 4852562756dSMasaki Ota { } 4862562756dSMasaki Ota }; 4872562756dSMasaki Ota MODULE_DEVICE_TABLE(hid, alps_id); 4882562756dSMasaki Ota 4892562756dSMasaki Ota static struct hid_driver alps_driver = { 4902562756dSMasaki Ota .name = "hid-alps", 4912562756dSMasaki Ota .id_table = alps_id, 4922562756dSMasaki Ota .probe = alps_probe, 4932562756dSMasaki Ota .remove = alps_remove, 4942562756dSMasaki Ota .raw_event = alps_raw_event, 4952562756dSMasaki Ota .input_mapping = alps_input_mapping, 4962562756dSMasaki Ota .input_configured = alps_input_configured, 4972562756dSMasaki Ota #ifdef CONFIG_PM 4982562756dSMasaki Ota .resume = alps_post_resume, 4992562756dSMasaki Ota .reset_resume = alps_post_reset, 5002562756dSMasaki Ota #endif 5012562756dSMasaki Ota }; 5022562756dSMasaki Ota 5032562756dSMasaki Ota module_hid_driver(alps_driver); 5042562756dSMasaki Ota 5052562756dSMasaki Ota MODULE_AUTHOR("Masaki Ota <masaki.ota@jp.alps.com>"); 5062562756dSMasaki Ota MODULE_DESCRIPTION("ALPS HID driver"); 5072562756dSMasaki Ota MODULE_LICENSE("GPL"); 508