xref: /openbmc/linux/drivers/hid/hid-alps.c (revision 2562756dde550901c224e3805102bdfc17e7d13a)
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