1*2562756dSMasaki Ota /* 2*2562756dSMasaki Ota * Copyright (c) 2016 Masaki Ota <masaki.ota@jp.alps.com> 3*2562756dSMasaki Ota * 4*2562756dSMasaki Ota * This program is free software; you can redistribute it and/or modify it 5*2562756dSMasaki Ota * under the terms of the GNU General Public License as published by the Free 6*2562756dSMasaki Ota * Software Foundation; either version 2 of the License, or (at your option) 7*2562756dSMasaki Ota * any later version. 8*2562756dSMasaki Ota */ 9*2562756dSMasaki Ota 10*2562756dSMasaki Ota #include <linux/kernel.h> 11*2562756dSMasaki Ota #include <linux/hid.h> 12*2562756dSMasaki Ota #include <linux/input.h> 13*2562756dSMasaki Ota #include <linux/input/mt.h> 14*2562756dSMasaki Ota #include <linux/module.h> 15*2562756dSMasaki Ota #include <asm/unaligned.h> 16*2562756dSMasaki Ota #include "hid-ids.h" 17*2562756dSMasaki Ota 18*2562756dSMasaki Ota /* ALPS Device Product ID */ 19*2562756dSMasaki Ota #define HID_PRODUCT_ID_T3_BTNLESS 0xD0C0 20*2562756dSMasaki Ota #define HID_PRODUCT_ID_COSMO 0x1202 21*2562756dSMasaki Ota #define HID_PRODUCT_ID_U1_PTP_1 0x1207 22*2562756dSMasaki Ota #define HID_PRODUCT_ID_U1 0x1209 23*2562756dSMasaki Ota #define HID_PRODUCT_ID_U1_PTP_2 0x120A 24*2562756dSMasaki Ota #define HID_PRODUCT_ID_U1_DUAL 0x120B 25*2562756dSMasaki Ota #define HID_PRODUCT_ID_T4_BTNLESS 0x120C 26*2562756dSMasaki Ota 27*2562756dSMasaki Ota #define DEV_SINGLEPOINT 0x01 28*2562756dSMasaki Ota #define DEV_DUALPOINT 0x02 29*2562756dSMasaki Ota 30*2562756dSMasaki Ota #define U1_MOUSE_REPORT_ID 0x01 /* Mouse data ReportID */ 31*2562756dSMasaki Ota #define U1_ABSOLUTE_REPORT_ID 0x03 /* Absolute data ReportID */ 32*2562756dSMasaki Ota #define U1_FEATURE_REPORT_ID 0x05 /* Feature ReportID */ 33*2562756dSMasaki Ota #define U1_SP_ABSOLUTE_REPORT_ID 0x06 /* Feature ReportID */ 34*2562756dSMasaki Ota 35*2562756dSMasaki Ota #define U1_FEATURE_REPORT_LEN 0x08 /* Feature Report Length */ 36*2562756dSMasaki Ota #define U1_FEATURE_REPORT_LEN_ALL 0x0A 37*2562756dSMasaki Ota #define U1_CMD_REGISTER_READ 0xD1 38*2562756dSMasaki Ota #define U1_CMD_REGISTER_WRITE 0xD2 39*2562756dSMasaki Ota 40*2562756dSMasaki Ota #define U1_DEVTYPE_SP_SUPPORT 0x10 /* SP Support */ 41*2562756dSMasaki Ota #define U1_DISABLE_DEV 0x01 42*2562756dSMasaki Ota #define U1_TP_ABS_MODE 0x02 43*2562756dSMasaki Ota #define U1_SP_ABS_MODE 0x80 44*2562756dSMasaki Ota 45*2562756dSMasaki Ota #define ADDRESS_U1_DEV_CTRL_1 0x00800040 46*2562756dSMasaki Ota #define ADDRESS_U1_DEVICE_TYP 0x00800043 47*2562756dSMasaki Ota #define ADDRESS_U1_NUM_SENS_X 0x00800047 48*2562756dSMasaki Ota #define ADDRESS_U1_NUM_SENS_Y 0x00800048 49*2562756dSMasaki Ota #define ADDRESS_U1_PITCH_SENS_X 0x00800049 50*2562756dSMasaki Ota #define ADDRESS_U1_PITCH_SENS_Y 0x0080004A 51*2562756dSMasaki Ota #define ADDRESS_U1_RESO_DWN_ABS 0x0080004E 52*2562756dSMasaki Ota #define ADDRESS_U1_PAD_BTN 0x00800052 53*2562756dSMasaki Ota #define ADDRESS_U1_SP_BTN 0x0080009F 54*2562756dSMasaki Ota 55*2562756dSMasaki Ota #define MAX_TOUCHES 5 56*2562756dSMasaki Ota 57*2562756dSMasaki Ota /** 58*2562756dSMasaki Ota * struct u1_data 59*2562756dSMasaki Ota * 60*2562756dSMasaki Ota * @input: pointer to the kernel input device 61*2562756dSMasaki Ota * @input2: pointer to the kernel input2 device 62*2562756dSMasaki Ota * @hdev: pointer to the struct hid_device 63*2562756dSMasaki Ota * 64*2562756dSMasaki Ota * @dev_ctrl: device control parameter 65*2562756dSMasaki Ota * @dev_type: device type 66*2562756dSMasaki Ota * @sen_line_num_x: number of sensor line of X 67*2562756dSMasaki Ota * @sen_line_num_y: number of sensor line of Y 68*2562756dSMasaki Ota * @pitch_x: sensor pitch of X 69*2562756dSMasaki Ota * @pitch_y: sensor pitch of Y 70*2562756dSMasaki Ota * @resolution: resolution 71*2562756dSMasaki Ota * @btn_info: button information 72*2562756dSMasaki Ota * @x_active_len_mm: active area length of X (mm) 73*2562756dSMasaki Ota * @y_active_len_mm: active area length of Y (mm) 74*2562756dSMasaki Ota * @x_max: maximum x coordinate value 75*2562756dSMasaki Ota * @y_max: maximum y coordinate value 76*2562756dSMasaki Ota * @btn_cnt: number of buttons 77*2562756dSMasaki Ota * @sp_btn_cnt: number of stick buttons 78*2562756dSMasaki Ota */ 79*2562756dSMasaki Ota struct u1_dev { 80*2562756dSMasaki Ota struct input_dev *input; 81*2562756dSMasaki Ota struct input_dev *input2; 82*2562756dSMasaki Ota struct hid_device *hdev; 83*2562756dSMasaki Ota 84*2562756dSMasaki Ota u8 dev_ctrl; 85*2562756dSMasaki Ota u8 dev_type; 86*2562756dSMasaki Ota u8 sen_line_num_x; 87*2562756dSMasaki Ota u8 sen_line_num_y; 88*2562756dSMasaki Ota u8 pitch_x; 89*2562756dSMasaki Ota u8 pitch_y; 90*2562756dSMasaki Ota u8 resolution; 91*2562756dSMasaki Ota u8 btn_info; 92*2562756dSMasaki Ota u8 sp_btn_info; 93*2562756dSMasaki Ota u32 x_active_len_mm; 94*2562756dSMasaki Ota u32 y_active_len_mm; 95*2562756dSMasaki Ota u32 x_max; 96*2562756dSMasaki Ota u32 y_max; 97*2562756dSMasaki Ota u32 btn_cnt; 98*2562756dSMasaki Ota u32 sp_btn_cnt; 99*2562756dSMasaki Ota }; 100*2562756dSMasaki Ota 101*2562756dSMasaki Ota struct u1_dev *priv; 102*2562756dSMasaki Ota 103*2562756dSMasaki Ota static int u1_read_write_register(struct hid_device *hdev, u32 address, 104*2562756dSMasaki Ota u8 *read_val, u8 write_val, bool read_flag) 105*2562756dSMasaki Ota { 106*2562756dSMasaki Ota int ret, i; 107*2562756dSMasaki Ota u8 check_sum; 108*2562756dSMasaki Ota u8 *input; 109*2562756dSMasaki Ota u8 *readbuf; 110*2562756dSMasaki Ota 111*2562756dSMasaki Ota input = kzalloc(sizeof(u8)*U1_FEATURE_REPORT_LEN, GFP_KERNEL); 112*2562756dSMasaki Ota if (!input) 113*2562756dSMasaki Ota return -ENOMEM; 114*2562756dSMasaki Ota 115*2562756dSMasaki Ota readbuf = kzalloc(sizeof(u8)*U1_FEATURE_REPORT_LEN, GFP_KERNEL); 116*2562756dSMasaki Ota if (!readbuf) { 117*2562756dSMasaki Ota kfree(input); 118*2562756dSMasaki Ota return -ENOMEM; 119*2562756dSMasaki Ota } 120*2562756dSMasaki Ota 121*2562756dSMasaki Ota input[0] = U1_FEATURE_REPORT_ID; 122*2562756dSMasaki Ota if (read_flag) { 123*2562756dSMasaki Ota input[1] = U1_CMD_REGISTER_READ; 124*2562756dSMasaki Ota input[6] = 0x00; 125*2562756dSMasaki Ota } else { 126*2562756dSMasaki Ota input[1] = U1_CMD_REGISTER_WRITE; 127*2562756dSMasaki Ota input[6] = write_val; 128*2562756dSMasaki Ota } 129*2562756dSMasaki Ota 130*2562756dSMasaki Ota put_unaligned_le32(address, input + 2); 131*2562756dSMasaki Ota 132*2562756dSMasaki Ota /* Calculate the checksum */ 133*2562756dSMasaki Ota check_sum = U1_FEATURE_REPORT_LEN_ALL; 134*2562756dSMasaki Ota for (i = 0; i < U1_FEATURE_REPORT_LEN - 1; i++) 135*2562756dSMasaki Ota check_sum += input[i]; 136*2562756dSMasaki Ota 137*2562756dSMasaki Ota input[7] = check_sum; 138*2562756dSMasaki Ota ret = hid_hw_raw_request(hdev, U1_FEATURE_REPORT_ID, input, 139*2562756dSMasaki Ota sizeof(input), HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 140*2562756dSMasaki Ota 141*2562756dSMasaki Ota if (ret < 0) { 142*2562756dSMasaki Ota dev_err(&hdev->dev, "failed to read command (%d)\n", ret); 143*2562756dSMasaki Ota goto exit; 144*2562756dSMasaki Ota } 145*2562756dSMasaki Ota 146*2562756dSMasaki Ota if (read_flag) { 147*2562756dSMasaki Ota ret = hid_hw_raw_request(hdev, U1_FEATURE_REPORT_ID, readbuf, 148*2562756dSMasaki Ota sizeof(readbuf), HID_FEATURE_REPORT, 149*2562756dSMasaki Ota HID_REQ_GET_REPORT); 150*2562756dSMasaki Ota 151*2562756dSMasaki Ota if (ret < 0) { 152*2562756dSMasaki Ota dev_err(&hdev->dev, "failed read register (%d)\n", ret); 153*2562756dSMasaki Ota goto exit; 154*2562756dSMasaki Ota } 155*2562756dSMasaki Ota 156*2562756dSMasaki Ota *read_val = readbuf[6]; 157*2562756dSMasaki Ota } 158*2562756dSMasaki Ota 159*2562756dSMasaki Ota kfree(input); 160*2562756dSMasaki Ota kfree(readbuf); 161*2562756dSMasaki Ota return 0; 162*2562756dSMasaki Ota 163*2562756dSMasaki Ota exit: 164*2562756dSMasaki Ota kfree(input); 165*2562756dSMasaki Ota kfree(readbuf); 166*2562756dSMasaki Ota return ret; 167*2562756dSMasaki Ota } 168*2562756dSMasaki Ota 169*2562756dSMasaki Ota static int alps_raw_event(struct hid_device *hdev, 170*2562756dSMasaki Ota struct hid_report *report, u8 *data, int size) 171*2562756dSMasaki Ota { 172*2562756dSMasaki Ota int x[MAX_TOUCHES], y[MAX_TOUCHES], z[MAX_TOUCHES]; 173*2562756dSMasaki Ota int i, left, right, middle; 174*2562756dSMasaki Ota short sp_x, sp_y, sp_z; 175*2562756dSMasaki Ota struct u1_dev *hdata = hid_get_drvdata(hdev); 176*2562756dSMasaki Ota 177*2562756dSMasaki Ota switch (data[0]) { 178*2562756dSMasaki Ota case U1_MOUSE_REPORT_ID: 179*2562756dSMasaki Ota break; 180*2562756dSMasaki Ota case U1_FEATURE_REPORT_ID: 181*2562756dSMasaki Ota break; 182*2562756dSMasaki Ota case U1_ABSOLUTE_REPORT_ID: 183*2562756dSMasaki Ota for (i = 0; i < MAX_TOUCHES; i++) { 184*2562756dSMasaki Ota x[i] = (data[3+(5*i)] | (data[4+(5*i)] << 8)); 185*2562756dSMasaki Ota y[i] = (data[5+(5*i)] | (data[6+(5*i)] << 8)); 186*2562756dSMasaki Ota z[i] = data[7+(5*i)] & 0x7F; 187*2562756dSMasaki Ota left = data[1] & 0x1; 188*2562756dSMasaki Ota right = (data[1] & 0x2) >> 1; 189*2562756dSMasaki Ota middle = (data[1] & 0x4) >> 2; 190*2562756dSMasaki Ota 191*2562756dSMasaki Ota input_mt_slot(hdata->input, i); 192*2562756dSMasaki Ota 193*2562756dSMasaki Ota if (z[i] != 0) { 194*2562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 195*2562756dSMasaki Ota MT_TOOL_FINGER, 1); 196*2562756dSMasaki Ota } else { 197*2562756dSMasaki Ota input_mt_report_slot_state(hdata->input, 198*2562756dSMasaki Ota MT_TOOL_FINGER, 0); 199*2562756dSMasaki Ota break; 200*2562756dSMasaki Ota } 201*2562756dSMasaki Ota 202*2562756dSMasaki Ota input_event(hdata->input, EV_ABS, 203*2562756dSMasaki Ota ABS_MT_POSITION_X, x[i]); 204*2562756dSMasaki Ota input_event(hdata->input, EV_ABS, 205*2562756dSMasaki Ota ABS_MT_POSITION_Y, y[i]); 206*2562756dSMasaki Ota input_event(hdata->input, EV_ABS, 207*2562756dSMasaki Ota ABS_MT_PRESSURE, z[i]); 208*2562756dSMasaki Ota } 209*2562756dSMasaki Ota 210*2562756dSMasaki Ota input_mt_sync_frame(hdata->input); 211*2562756dSMasaki Ota input_sync(hdata->input); 212*2562756dSMasaki Ota 213*2562756dSMasaki Ota input_event(hdata->input, EV_KEY, BTN_LEFT, left); 214*2562756dSMasaki Ota input_event(hdata->input, EV_KEY, BTN_RIGHT, right); 215*2562756dSMasaki Ota input_event(hdata->input, EV_KEY, BTN_MIDDLE, middle); 216*2562756dSMasaki Ota 217*2562756dSMasaki Ota return 1; 218*2562756dSMasaki Ota 219*2562756dSMasaki Ota case U1_SP_ABSOLUTE_REPORT_ID: 220*2562756dSMasaki Ota sp_x = (data[2] | (data[3] << 8)); 221*2562756dSMasaki Ota sp_y = (data[4] | (data[5] << 8)); 222*2562756dSMasaki Ota sp_z = (data[6] | data[7]) & 0x7FFF; 223*2562756dSMasaki Ota left = data[1] & 0x1; 224*2562756dSMasaki Ota right = (data[1] & 0x2) >> 1; 225*2562756dSMasaki Ota middle = (data[1] & 0x4) >> 2; 226*2562756dSMasaki Ota 227*2562756dSMasaki Ota sp_x = sp_x / 8; 228*2562756dSMasaki Ota sp_y = sp_y / 8; 229*2562756dSMasaki Ota 230*2562756dSMasaki Ota input_event(priv->input2, EV_REL, REL_X, sp_x); 231*2562756dSMasaki Ota input_event(priv->input2, EV_REL, REL_Y, sp_y); 232*2562756dSMasaki Ota 233*2562756dSMasaki Ota input_event(priv->input2, EV_KEY, BTN_LEFT, left); 234*2562756dSMasaki Ota input_event(priv->input2, EV_KEY, BTN_RIGHT, right); 235*2562756dSMasaki Ota input_event(priv->input2, EV_KEY, BTN_MIDDLE, middle); 236*2562756dSMasaki Ota 237*2562756dSMasaki Ota input_sync(priv->input2); 238*2562756dSMasaki Ota 239*2562756dSMasaki Ota return 1; 240*2562756dSMasaki Ota } 241*2562756dSMasaki Ota 242*2562756dSMasaki Ota return 0; 243*2562756dSMasaki Ota } 244*2562756dSMasaki Ota 245*2562756dSMasaki Ota #ifdef CONFIG_PM 246*2562756dSMasaki Ota static int alps_post_reset(struct hid_device *hdev) 247*2562756dSMasaki Ota { 248*2562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 249*2562756dSMasaki Ota NULL, U1_TP_ABS_MODE, false); 250*2562756dSMasaki Ota } 251*2562756dSMasaki Ota 252*2562756dSMasaki Ota static int alps_post_resume(struct hid_device *hdev) 253*2562756dSMasaki Ota { 254*2562756dSMasaki Ota return u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 255*2562756dSMasaki Ota NULL, U1_TP_ABS_MODE, false); 256*2562756dSMasaki Ota } 257*2562756dSMasaki Ota #endif /* CONFIG_PM */ 258*2562756dSMasaki Ota 259*2562756dSMasaki Ota static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi) 260*2562756dSMasaki Ota { 261*2562756dSMasaki Ota struct u1_dev *data = hid_get_drvdata(hdev); 262*2562756dSMasaki Ota struct input_dev *input = hi->input, *input2; 263*2562756dSMasaki Ota struct u1_dev devInfo; 264*2562756dSMasaki Ota int ret; 265*2562756dSMasaki Ota int res_x, res_y, i; 266*2562756dSMasaki Ota 267*2562756dSMasaki Ota /* Check device product ID */ 268*2562756dSMasaki Ota switch (hdev->product) { 269*2562756dSMasaki Ota case HID_PRODUCT_ID_U1: 270*2562756dSMasaki Ota case HID_PRODUCT_ID_U1_DUAL: 271*2562756dSMasaki Ota break; 272*2562756dSMasaki Ota default: 273*2562756dSMasaki Ota return 0; 274*2562756dSMasaki Ota } 275*2562756dSMasaki Ota 276*2562756dSMasaki Ota data->input = input; 277*2562756dSMasaki Ota 278*2562756dSMasaki Ota hid_dbg(hdev, "Opening low level driver\n"); 279*2562756dSMasaki Ota ret = hid_hw_open(hdev); 280*2562756dSMasaki Ota if (ret) 281*2562756dSMasaki Ota return ret; 282*2562756dSMasaki Ota 283*2562756dSMasaki Ota /* Allow incoming hid reports */ 284*2562756dSMasaki Ota hid_device_io_start(hdev); 285*2562756dSMasaki Ota 286*2562756dSMasaki Ota /* Device initialization */ 287*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 288*2562756dSMasaki Ota &devInfo.dev_ctrl, 0, true); 289*2562756dSMasaki Ota if (ret < 0) { 290*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEV_CTRL_1 (%d)\n", ret); 291*2562756dSMasaki Ota goto exit; 292*2562756dSMasaki Ota } 293*2562756dSMasaki Ota 294*2562756dSMasaki Ota devInfo.dev_ctrl &= ~U1_DISABLE_DEV; 295*2562756dSMasaki Ota devInfo.dev_ctrl |= U1_TP_ABS_MODE; 296*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 297*2562756dSMasaki Ota NULL, devInfo.dev_ctrl, false); 298*2562756dSMasaki Ota if (ret < 0) { 299*2562756dSMasaki Ota dev_err(&hdev->dev, "failed to change TP mode (%d)\n", ret); 300*2562756dSMasaki Ota goto exit; 301*2562756dSMasaki Ota } 302*2562756dSMasaki Ota 303*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_X, 304*2562756dSMasaki Ota &devInfo.sen_line_num_x, 0, true); 305*2562756dSMasaki Ota if (ret < 0) { 306*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_X (%d)\n", ret); 307*2562756dSMasaki Ota goto exit; 308*2562756dSMasaki Ota } 309*2562756dSMasaki Ota 310*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_NUM_SENS_Y, 311*2562756dSMasaki Ota &devInfo.sen_line_num_y, 0, true); 312*2562756dSMasaki Ota if (ret < 0) { 313*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_NUM_SENS_Y (%d)\n", ret); 314*2562756dSMasaki Ota goto exit; 315*2562756dSMasaki Ota } 316*2562756dSMasaki Ota 317*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_X, 318*2562756dSMasaki Ota &devInfo.pitch_x, 0, true); 319*2562756dSMasaki Ota if (ret < 0) { 320*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_X (%d)\n", ret); 321*2562756dSMasaki Ota goto exit; 322*2562756dSMasaki Ota } 323*2562756dSMasaki Ota 324*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PITCH_SENS_Y, 325*2562756dSMasaki Ota &devInfo.pitch_y, 0, true); 326*2562756dSMasaki Ota if (ret < 0) { 327*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PITCH_SENS_Y (%d)\n", ret); 328*2562756dSMasaki Ota goto exit; 329*2562756dSMasaki Ota } 330*2562756dSMasaki Ota 331*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_RESO_DWN_ABS, 332*2562756dSMasaki Ota &devInfo.resolution, 0, true); 333*2562756dSMasaki Ota if (ret < 0) { 334*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_RESO_DWN_ABS (%d)\n", ret); 335*2562756dSMasaki Ota goto exit; 336*2562756dSMasaki Ota } 337*2562756dSMasaki Ota 338*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_PAD_BTN, 339*2562756dSMasaki Ota &devInfo.btn_info, 0, true); 340*2562756dSMasaki Ota if (ret < 0) { 341*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_PAD_BTN (%d)\n", ret); 342*2562756dSMasaki Ota goto exit; 343*2562756dSMasaki Ota } 344*2562756dSMasaki Ota 345*2562756dSMasaki Ota /* Check StickPointer device */ 346*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEVICE_TYP, 347*2562756dSMasaki Ota &devInfo.dev_type, 0, true); 348*2562756dSMasaki Ota if (ret < 0) { 349*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_DEVICE_TYP (%d)\n", ret); 350*2562756dSMasaki Ota goto exit; 351*2562756dSMasaki Ota } 352*2562756dSMasaki Ota 353*2562756dSMasaki Ota devInfo.x_active_len_mm = 354*2562756dSMasaki Ota (devInfo.pitch_x * (devInfo.sen_line_num_x - 1)) / 10; 355*2562756dSMasaki Ota devInfo.y_active_len_mm = 356*2562756dSMasaki Ota (devInfo.pitch_y * (devInfo.sen_line_num_y - 1)) / 10; 357*2562756dSMasaki Ota 358*2562756dSMasaki Ota devInfo.x_max = 359*2562756dSMasaki Ota (devInfo.resolution << 2) * (devInfo.sen_line_num_x - 1); 360*2562756dSMasaki Ota devInfo.y_max = 361*2562756dSMasaki Ota (devInfo.resolution << 2) * (devInfo.sen_line_num_y - 1); 362*2562756dSMasaki Ota 363*2562756dSMasaki Ota __set_bit(EV_ABS, input->evbit); 364*2562756dSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_X, 1, devInfo.x_max, 0, 0); 365*2562756dSMasaki Ota input_set_abs_params(input, ABS_MT_POSITION_Y, 1, devInfo.y_max, 0, 0); 366*2562756dSMasaki Ota 367*2562756dSMasaki Ota if (devInfo.x_active_len_mm && devInfo.y_active_len_mm) { 368*2562756dSMasaki Ota res_x = (devInfo.x_max - 1) / devInfo.x_active_len_mm; 369*2562756dSMasaki Ota res_y = (devInfo.y_max - 1) / devInfo.y_active_len_mm; 370*2562756dSMasaki Ota 371*2562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_X, res_x); 372*2562756dSMasaki Ota input_abs_set_res(input, ABS_MT_POSITION_Y, res_y); 373*2562756dSMasaki Ota } 374*2562756dSMasaki Ota 375*2562756dSMasaki Ota input_set_abs_params(input, ABS_MT_PRESSURE, 0, 64, 0, 0); 376*2562756dSMasaki Ota 377*2562756dSMasaki Ota input_mt_init_slots(input, MAX_TOUCHES, INPUT_MT_POINTER); 378*2562756dSMasaki Ota 379*2562756dSMasaki Ota __set_bit(EV_KEY, input->evbit); 380*2562756dSMasaki Ota if ((devInfo.btn_info & 0x0F) == (devInfo.btn_info & 0xF0) >> 4) { 381*2562756dSMasaki Ota devInfo.btn_cnt = (devInfo.btn_info & 0x0F); 382*2562756dSMasaki Ota } else { 383*2562756dSMasaki Ota /* Button pad */ 384*2562756dSMasaki Ota devInfo.btn_cnt = 1; 385*2562756dSMasaki Ota __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); 386*2562756dSMasaki Ota } 387*2562756dSMasaki Ota 388*2562756dSMasaki Ota for (i = 0; i < devInfo.btn_cnt; i++) 389*2562756dSMasaki Ota __set_bit(BTN_LEFT + i, input->keybit); 390*2562756dSMasaki Ota 391*2562756dSMasaki Ota 392*2562756dSMasaki Ota /* Stick device initialization */ 393*2562756dSMasaki Ota if (devInfo.dev_type & U1_DEVTYPE_SP_SUPPORT) { 394*2562756dSMasaki Ota 395*2562756dSMasaki Ota priv = kzalloc(sizeof(struct u1_dev), GFP_KERNEL); 396*2562756dSMasaki Ota if (!priv) { 397*2562756dSMasaki Ota hid_device_io_stop(hdev); 398*2562756dSMasaki Ota hid_hw_close(hdev); 399*2562756dSMasaki Ota return -ENOMEM; 400*2562756dSMasaki Ota } 401*2562756dSMasaki Ota 402*2562756dSMasaki Ota input2 = input_allocate_device(); 403*2562756dSMasaki Ota if (!input2) { 404*2562756dSMasaki Ota input_free_device(input2); 405*2562756dSMasaki Ota goto exit; 406*2562756dSMasaki Ota } 407*2562756dSMasaki Ota 408*2562756dSMasaki Ota priv->input2 = input2; 409*2562756dSMasaki Ota 410*2562756dSMasaki Ota devInfo.dev_ctrl |= U1_SP_ABS_MODE; 411*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_DEV_CTRL_1, 412*2562756dSMasaki Ota NULL, devInfo.dev_ctrl, false); 413*2562756dSMasaki Ota if (ret < 0) { 414*2562756dSMasaki Ota dev_err(&hdev->dev, "failed SP mode (%d)\n", ret); 415*2562756dSMasaki Ota input_free_device(input2); 416*2562756dSMasaki Ota goto exit; 417*2562756dSMasaki Ota } 418*2562756dSMasaki Ota 419*2562756dSMasaki Ota ret = u1_read_write_register(hdev, ADDRESS_U1_SP_BTN, 420*2562756dSMasaki Ota &devInfo.sp_btn_info, 0, true); 421*2562756dSMasaki Ota if (ret < 0) { 422*2562756dSMasaki Ota dev_err(&hdev->dev, "failed U1_SP_BTN (%d)\n", ret); 423*2562756dSMasaki Ota input_free_device(input2); 424*2562756dSMasaki Ota goto exit; 425*2562756dSMasaki Ota } 426*2562756dSMasaki Ota 427*2562756dSMasaki Ota input2->phys = input->phys; 428*2562756dSMasaki Ota input2->name = "DualPoint Stick"; 429*2562756dSMasaki Ota input2->id.bustype = BUS_I2C; 430*2562756dSMasaki Ota input2->id.vendor = input->id.vendor; 431*2562756dSMasaki Ota input2->id.product = input->id.product; 432*2562756dSMasaki Ota input2->id.version = input->id.version; 433*2562756dSMasaki Ota input2->dev.parent = input->dev.parent; 434*2562756dSMasaki Ota 435*2562756dSMasaki Ota __set_bit(EV_KEY, input2->evbit); 436*2562756dSMasaki Ota devInfo.sp_btn_cnt = (devInfo.sp_btn_info & 0x0F); 437*2562756dSMasaki Ota for (i = 0; i < devInfo.sp_btn_cnt; i++) 438*2562756dSMasaki Ota __set_bit(BTN_LEFT + i, input2->keybit); 439*2562756dSMasaki Ota 440*2562756dSMasaki Ota __set_bit(EV_REL, input2->evbit); 441*2562756dSMasaki Ota __set_bit(REL_X, input2->relbit); 442*2562756dSMasaki Ota __set_bit(REL_Y, input2->relbit); 443*2562756dSMasaki Ota __set_bit(INPUT_PROP_POINTER, input2->propbit); 444*2562756dSMasaki Ota __set_bit(INPUT_PROP_POINTING_STICK, input2->propbit); 445*2562756dSMasaki Ota 446*2562756dSMasaki Ota if (input_register_device(priv->input2)) { 447*2562756dSMasaki Ota input_free_device(input2); 448*2562756dSMasaki Ota goto exit; 449*2562756dSMasaki Ota } 450*2562756dSMasaki Ota } 451*2562756dSMasaki Ota 452*2562756dSMasaki Ota exit: 453*2562756dSMasaki Ota hid_device_io_stop(hdev); 454*2562756dSMasaki Ota hid_hw_close(hdev); 455*2562756dSMasaki Ota return ret; 456*2562756dSMasaki Ota } 457*2562756dSMasaki Ota 458*2562756dSMasaki Ota static int alps_input_mapping(struct hid_device *hdev, 459*2562756dSMasaki Ota struct hid_input *hi, struct hid_field *field, 460*2562756dSMasaki Ota struct hid_usage *usage, unsigned long **bit, int *max) 461*2562756dSMasaki Ota { 462*2562756dSMasaki Ota return -1; 463*2562756dSMasaki Ota } 464*2562756dSMasaki Ota 465*2562756dSMasaki Ota static int alps_probe(struct hid_device *hdev, const struct hid_device_id *id) 466*2562756dSMasaki Ota { 467*2562756dSMasaki Ota struct u1_dev *data = NULL; 468*2562756dSMasaki Ota int ret; 469*2562756dSMasaki Ota 470*2562756dSMasaki Ota data = devm_kzalloc(&hdev->dev, sizeof(struct u1_dev), GFP_KERNEL); 471*2562756dSMasaki Ota if (!data) 472*2562756dSMasaki Ota return -ENOMEM; 473*2562756dSMasaki Ota 474*2562756dSMasaki Ota data->hdev = hdev; 475*2562756dSMasaki Ota hid_set_drvdata(hdev, data); 476*2562756dSMasaki Ota 477*2562756dSMasaki Ota hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; 478*2562756dSMasaki Ota 479*2562756dSMasaki Ota ret = hid_parse(hdev); 480*2562756dSMasaki Ota if (ret) { 481*2562756dSMasaki Ota hid_err(hdev, "parse failed\n"); 482*2562756dSMasaki Ota return ret; 483*2562756dSMasaki Ota } 484*2562756dSMasaki Ota 485*2562756dSMasaki Ota ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 486*2562756dSMasaki Ota if (ret) { 487*2562756dSMasaki Ota hid_err(hdev, "hw start failed\n"); 488*2562756dSMasaki Ota return ret; 489*2562756dSMasaki Ota } 490*2562756dSMasaki Ota 491*2562756dSMasaki Ota return 0; 492*2562756dSMasaki Ota } 493*2562756dSMasaki Ota 494*2562756dSMasaki Ota static void alps_remove(struct hid_device *hdev) 495*2562756dSMasaki Ota { 496*2562756dSMasaki Ota hid_hw_stop(hdev); 497*2562756dSMasaki Ota kfree(priv); 498*2562756dSMasaki Ota } 499*2562756dSMasaki Ota 500*2562756dSMasaki Ota static const struct hid_device_id alps_id[] = { 501*2562756dSMasaki Ota { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, 502*2562756dSMasaki Ota USB_VENDOR_ID_ALPS_JP, HID_ANY_ID) }, 503*2562756dSMasaki Ota { } 504*2562756dSMasaki Ota }; 505*2562756dSMasaki Ota MODULE_DEVICE_TABLE(hid, alps_id); 506*2562756dSMasaki Ota 507*2562756dSMasaki Ota static struct hid_driver alps_driver = { 508*2562756dSMasaki Ota .name = "hid-alps", 509*2562756dSMasaki Ota .id_table = alps_id, 510*2562756dSMasaki Ota .probe = alps_probe, 511*2562756dSMasaki Ota .remove = alps_remove, 512*2562756dSMasaki Ota .raw_event = alps_raw_event, 513*2562756dSMasaki Ota .input_mapping = alps_input_mapping, 514*2562756dSMasaki Ota .input_configured = alps_input_configured, 515*2562756dSMasaki Ota #ifdef CONFIG_PM 516*2562756dSMasaki Ota .resume = alps_post_resume, 517*2562756dSMasaki Ota .reset_resume = alps_post_reset, 518*2562756dSMasaki Ota #endif 519*2562756dSMasaki Ota }; 520*2562756dSMasaki Ota 521*2562756dSMasaki Ota module_hid_driver(alps_driver); 522*2562756dSMasaki Ota 523*2562756dSMasaki Ota MODULE_AUTHOR("Masaki Ota <masaki.ota@jp.alps.com>"); 524*2562756dSMasaki Ota MODULE_DESCRIPTION("ALPS HID driver"); 525*2562756dSMasaki Ota MODULE_LICENSE("GPL"); 526