xref: /linux/drivers/input/misc/ims-pcu.c (revision 3e51108c72e8adbcf3180ed40527a2a9d2d0123b)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Driver for IMS Passenger Control Unit Devices
4  *
5  * Copyright (C) 2013 The IMS Company
6  */
7 
8 #include <linux/completion.h>
9 #include <linux/device.h>
10 #include <linux/firmware.h>
11 #include <linux/ihex.h>
12 #include <linux/input.h>
13 #include <linux/kernel.h>
14 #include <linux/leds.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <linux/types.h>
18 #include <linux/usb/input.h>
19 #include <linux/usb/cdc.h>
20 #include <linux/unaligned.h>
21 
22 #define IMS_PCU_KEYMAP_LEN		32
23 
24 struct ims_pcu_buttons {
25 	struct input_dev *input;
26 	char name[32];
27 	char phys[32];
28 	unsigned short keymap[IMS_PCU_KEYMAP_LEN];
29 };
30 
31 struct ims_pcu_gamepad {
32 	struct input_dev *input;
33 	char name[32];
34 	char phys[32];
35 };
36 
37 struct ims_pcu_backlight {
38 	struct led_classdev cdev;
39 	char name[32];
40 };
41 
42 #define IMS_PCU_PART_NUMBER_LEN		15
43 #define IMS_PCU_SERIAL_NUMBER_LEN	8
44 #define IMS_PCU_DOM_LEN			8
45 #define IMS_PCU_FW_VERSION_LEN		16
46 #define IMS_PCU_BL_VERSION_LEN		16
47 #define IMS_PCU_BL_RESET_REASON_LEN	(2 + 1)
48 
49 #define IMS_PCU_PCU_B_DEVICE_ID		5
50 
51 #define IMS_PCU_BUF_SIZE		128
52 
53 struct ims_pcu {
54 	struct usb_device *udev;
55 	struct device *dev; /* control interface's device, used for logging */
56 
57 	unsigned int device_no;
58 
59 	bool bootloader_mode;
60 
61 	char part_number[IMS_PCU_PART_NUMBER_LEN];
62 	char serial_number[IMS_PCU_SERIAL_NUMBER_LEN];
63 	char date_of_manufacturing[IMS_PCU_DOM_LEN];
64 	char fw_version[IMS_PCU_FW_VERSION_LEN];
65 	char bl_version[IMS_PCU_BL_VERSION_LEN];
66 	char reset_reason[IMS_PCU_BL_RESET_REASON_LEN];
67 	int update_firmware_status;
68 	u8 device_id;
69 
70 	u8 ofn_reg_addr;
71 
72 	struct usb_interface *ctrl_intf;
73 
74 	struct usb_endpoint_descriptor *ep_ctrl;
75 	struct urb *urb_ctrl;
76 	u8 *urb_ctrl_buf;
77 	dma_addr_t ctrl_dma;
78 	size_t max_ctrl_size;
79 
80 	struct usb_interface *data_intf;
81 
82 	struct usb_endpoint_descriptor *ep_in;
83 	struct urb *urb_in;
84 	u8 *urb_in_buf;
85 	dma_addr_t read_dma;
86 	size_t max_in_size;
87 
88 	struct usb_endpoint_descriptor *ep_out;
89 	u8 *urb_out_buf;
90 	size_t max_out_size;
91 
92 	u8 read_buf[IMS_PCU_BUF_SIZE];
93 	u8 read_pos;
94 	u8 check_sum;
95 	bool have_stx;
96 	bool have_dle;
97 
98 	u8 cmd_buf[IMS_PCU_BUF_SIZE];
99 	u8 ack_id;
100 	u8 expected_response;
101 	u8 cmd_buf_len;
102 	struct completion cmd_done;
103 	struct mutex cmd_mutex;
104 
105 	u32 fw_start_addr;
106 	u32 fw_end_addr;
107 	struct completion async_firmware_done;
108 
109 	struct ims_pcu_buttons buttons;
110 	struct ims_pcu_gamepad *gamepad;
111 	struct ims_pcu_backlight backlight;
112 
113 	bool setup_complete; /* Input and LED devices have been created */
114 };
115 
116 
117 /*********************************************************************
118  *             Buttons Input device support                          *
119  *********************************************************************/
120 
121 static const unsigned short ims_pcu_keymap_1[] = {
122 	[1] = KEY_ATTENDANT_OFF,
123 	[2] = KEY_ATTENDANT_ON,
124 	[3] = KEY_LIGHTS_TOGGLE,
125 	[4] = KEY_VOLUMEUP,
126 	[5] = KEY_VOLUMEDOWN,
127 	[6] = KEY_INFO,
128 };
129 
130 static const unsigned short ims_pcu_keymap_2[] = {
131 	[4] = KEY_VOLUMEUP,
132 	[5] = KEY_VOLUMEDOWN,
133 	[6] = KEY_INFO,
134 };
135 
136 static const unsigned short ims_pcu_keymap_3[] = {
137 	[1] = KEY_HOMEPAGE,
138 	[2] = KEY_ATTENDANT_TOGGLE,
139 	[3] = KEY_LIGHTS_TOGGLE,
140 	[4] = KEY_VOLUMEUP,
141 	[5] = KEY_VOLUMEDOWN,
142 	[6] = KEY_DISPLAYTOGGLE,
143 	[18] = KEY_PLAYPAUSE,
144 };
145 
146 static const unsigned short ims_pcu_keymap_4[] = {
147 	[1] = KEY_ATTENDANT_OFF,
148 	[2] = KEY_ATTENDANT_ON,
149 	[3] = KEY_LIGHTS_TOGGLE,
150 	[4] = KEY_VOLUMEUP,
151 	[5] = KEY_VOLUMEDOWN,
152 	[6] = KEY_INFO,
153 	[18] = KEY_PLAYPAUSE,
154 };
155 
156 static const unsigned short ims_pcu_keymap_5[] = {
157 	[1] = KEY_ATTENDANT_OFF,
158 	[2] = KEY_ATTENDANT_ON,
159 	[3] = KEY_LIGHTS_TOGGLE,
160 };
161 
162 struct ims_pcu_device_info {
163 	const unsigned short *keymap;
164 	size_t keymap_len;
165 	bool has_gamepad;
166 };
167 
168 #define IMS_PCU_DEVINFO(_n, _gamepad)				\
169 	[_n] = {						\
170 		.keymap = ims_pcu_keymap_##_n,			\
171 		.keymap_len = ARRAY_SIZE(ims_pcu_keymap_##_n),	\
172 		.has_gamepad = _gamepad,			\
173 	}
174 
175 static const struct ims_pcu_device_info ims_pcu_device_info[] = {
176 	IMS_PCU_DEVINFO(1, true),
177 	IMS_PCU_DEVINFO(2, true),
178 	IMS_PCU_DEVINFO(3, true),
179 	IMS_PCU_DEVINFO(4, true),
180 	IMS_PCU_DEVINFO(5, false),
181 };
182 
ims_pcu_buttons_report(struct ims_pcu * pcu,u32 data)183 static void ims_pcu_buttons_report(struct ims_pcu *pcu, u32 data)
184 {
185 	struct ims_pcu_buttons *buttons = &pcu->buttons;
186 	struct input_dev *input = buttons->input;
187 	int i;
188 
189 	for (i = 0; i < 32; i++) {
190 		unsigned short keycode = buttons->keymap[i];
191 
192 		if (keycode != KEY_RESERVED)
193 			input_report_key(input, keycode, data & (1UL << i));
194 	}
195 
196 	input_sync(input);
197 }
198 
ims_pcu_setup_buttons(struct ims_pcu * pcu,const unsigned short * keymap,size_t keymap_len)199 static int ims_pcu_setup_buttons(struct ims_pcu *pcu,
200 				 const unsigned short *keymap,
201 				 size_t keymap_len)
202 {
203 	struct ims_pcu_buttons *buttons = &pcu->buttons;
204 	struct input_dev *input;
205 	int i;
206 	int error;
207 
208 	input = input_allocate_device();
209 	if (!input) {
210 		dev_err(pcu->dev, "Not enough memory for input device\n");
211 		return -ENOMEM;
212 	}
213 
214 	snprintf(buttons->name, sizeof(buttons->name),
215 		 "IMS PCU#%d Button Interface", pcu->device_no);
216 
217 	usb_make_path(pcu->udev, buttons->phys, sizeof(buttons->phys));
218 	strlcat(buttons->phys, "/input0", sizeof(buttons->phys));
219 
220 	memcpy(buttons->keymap, keymap, sizeof(*keymap) * keymap_len);
221 
222 	input->name = buttons->name;
223 	input->phys = buttons->phys;
224 	usb_to_input_id(pcu->udev, &input->id);
225 	input->dev.parent = &pcu->ctrl_intf->dev;
226 
227 	input->keycode = buttons->keymap;
228 	input->keycodemax = ARRAY_SIZE(buttons->keymap);
229 	input->keycodesize = sizeof(buttons->keymap[0]);
230 
231 	__set_bit(EV_KEY, input->evbit);
232 	for (i = 0; i < IMS_PCU_KEYMAP_LEN; i++)
233 		__set_bit(buttons->keymap[i], input->keybit);
234 	__clear_bit(KEY_RESERVED, input->keybit);
235 
236 	error = input_register_device(input);
237 	if (error) {
238 		dev_err(pcu->dev,
239 			"Failed to register buttons input device: %d\n",
240 			error);
241 		input_free_device(input);
242 		return error;
243 	}
244 
245 	buttons->input = input;
246 	return 0;
247 }
248 
ims_pcu_destroy_buttons(struct ims_pcu * pcu)249 static void ims_pcu_destroy_buttons(struct ims_pcu *pcu)
250 {
251 	struct ims_pcu_buttons *buttons = &pcu->buttons;
252 
253 	input_unregister_device(buttons->input);
254 }
255 
256 
257 /*********************************************************************
258  *             Gamepad Input device support                          *
259  *********************************************************************/
260 
ims_pcu_gamepad_report(struct ims_pcu * pcu,u32 data)261 static void ims_pcu_gamepad_report(struct ims_pcu *pcu, u32 data)
262 {
263 	struct ims_pcu_gamepad *gamepad = pcu->gamepad;
264 	struct input_dev *input = gamepad->input;
265 	int x, y;
266 
267 	x = !!(data & (1 << 14)) - !!(data & (1 << 13));
268 	y = !!(data & (1 << 12)) - !!(data & (1 << 11));
269 
270 	input_report_abs(input, ABS_X, x);
271 	input_report_abs(input, ABS_Y, y);
272 
273 	input_report_key(input, BTN_A, data & (1 << 7));
274 	input_report_key(input, BTN_B, data & (1 << 8));
275 	input_report_key(input, BTN_X, data & (1 << 9));
276 	input_report_key(input, BTN_Y, data & (1 << 10));
277 	input_report_key(input, BTN_START, data & (1 << 15));
278 	input_report_key(input, BTN_SELECT, data & (1 << 16));
279 
280 	input_sync(input);
281 }
282 
ims_pcu_setup_gamepad(struct ims_pcu * pcu)283 static int ims_pcu_setup_gamepad(struct ims_pcu *pcu)
284 {
285 	struct ims_pcu_gamepad *gamepad;
286 	struct input_dev *input;
287 	int error;
288 
289 	gamepad = kzalloc(sizeof(*gamepad), GFP_KERNEL);
290 	input = input_allocate_device();
291 	if (!gamepad || !input) {
292 		dev_err(pcu->dev,
293 			"Not enough memory for gamepad device\n");
294 		error = -ENOMEM;
295 		goto err_free_mem;
296 	}
297 
298 	gamepad->input = input;
299 
300 	snprintf(gamepad->name, sizeof(gamepad->name),
301 		 "IMS PCU#%d Gamepad Interface", pcu->device_no);
302 
303 	usb_make_path(pcu->udev, gamepad->phys, sizeof(gamepad->phys));
304 	strlcat(gamepad->phys, "/input1", sizeof(gamepad->phys));
305 
306 	input->name = gamepad->name;
307 	input->phys = gamepad->phys;
308 	usb_to_input_id(pcu->udev, &input->id);
309 	input->dev.parent = &pcu->ctrl_intf->dev;
310 
311 	__set_bit(EV_KEY, input->evbit);
312 	__set_bit(BTN_A, input->keybit);
313 	__set_bit(BTN_B, input->keybit);
314 	__set_bit(BTN_X, input->keybit);
315 	__set_bit(BTN_Y, input->keybit);
316 	__set_bit(BTN_START, input->keybit);
317 	__set_bit(BTN_SELECT, input->keybit);
318 
319 	__set_bit(EV_ABS, input->evbit);
320 	input_set_abs_params(input, ABS_X, -1, 1, 0, 0);
321 	input_set_abs_params(input, ABS_Y, -1, 1, 0, 0);
322 
323 	error = input_register_device(input);
324 	if (error) {
325 		dev_err(pcu->dev,
326 			"Failed to register gamepad input device: %d\n",
327 			error);
328 		goto err_free_mem;
329 	}
330 
331 	pcu->gamepad = gamepad;
332 	return 0;
333 
334 err_free_mem:
335 	input_free_device(input);
336 	kfree(gamepad);
337 	return error;
338 }
339 
ims_pcu_destroy_gamepad(struct ims_pcu * pcu)340 static void ims_pcu_destroy_gamepad(struct ims_pcu *pcu)
341 {
342 	struct ims_pcu_gamepad *gamepad = pcu->gamepad;
343 
344 	input_unregister_device(gamepad->input);
345 	kfree(gamepad);
346 }
347 
348 
349 /*********************************************************************
350  *             PCU Communication protocol handling                   *
351  *********************************************************************/
352 
353 #define IMS_PCU_PROTOCOL_STX		0x02
354 #define IMS_PCU_PROTOCOL_ETX		0x03
355 #define IMS_PCU_PROTOCOL_DLE		0x10
356 
357 /* PCU commands */
358 #define IMS_PCU_CMD_STATUS		0xa0
359 #define IMS_PCU_CMD_PCU_RESET		0xa1
360 #define IMS_PCU_CMD_RESET_REASON	0xa2
361 #define IMS_PCU_CMD_SEND_BUTTONS	0xa3
362 #define IMS_PCU_CMD_JUMP_TO_BTLDR	0xa4
363 #define IMS_PCU_CMD_GET_INFO		0xa5
364 #define IMS_PCU_CMD_SET_BRIGHTNESS	0xa6
365 #define IMS_PCU_CMD_EEPROM		0xa7
366 #define IMS_PCU_CMD_GET_FW_VERSION	0xa8
367 #define IMS_PCU_CMD_GET_BL_VERSION	0xa9
368 #define IMS_PCU_CMD_SET_INFO		0xab
369 #define IMS_PCU_CMD_GET_BRIGHTNESS	0xac
370 #define IMS_PCU_CMD_GET_DEVICE_ID	0xae
371 #define IMS_PCU_CMD_SPECIAL_INFO	0xb0
372 #define IMS_PCU_CMD_BOOTLOADER		0xb1	/* Pass data to bootloader */
373 #define IMS_PCU_CMD_OFN_SET_CONFIG	0xb3
374 #define IMS_PCU_CMD_OFN_GET_CONFIG	0xb4
375 
376 /* PCU responses */
377 #define IMS_PCU_RSP_STATUS		0xc0
378 #define IMS_PCU_RSP_PCU_RESET		0	/* Originally 0xc1 */
379 #define IMS_PCU_RSP_RESET_REASON	0xc2
380 #define IMS_PCU_RSP_SEND_BUTTONS	0xc3
381 #define IMS_PCU_RSP_JUMP_TO_BTLDR	0	/* Originally 0xc4 */
382 #define IMS_PCU_RSP_GET_INFO		0xc5
383 #define IMS_PCU_RSP_SET_BRIGHTNESS	0xc6
384 #define IMS_PCU_RSP_EEPROM		0xc7
385 #define IMS_PCU_RSP_GET_FW_VERSION	0xc8
386 #define IMS_PCU_RSP_GET_BL_VERSION	0xc9
387 #define IMS_PCU_RSP_SET_INFO		0xcb
388 #define IMS_PCU_RSP_GET_BRIGHTNESS	0xcc
389 #define IMS_PCU_RSP_CMD_INVALID		0xcd
390 #define IMS_PCU_RSP_GET_DEVICE_ID	0xce
391 #define IMS_PCU_RSP_SPECIAL_INFO	0xd0
392 #define IMS_PCU_RSP_BOOTLOADER		0xd1	/* Bootloader response */
393 #define IMS_PCU_RSP_OFN_SET_CONFIG	0xd2
394 #define IMS_PCU_RSP_OFN_GET_CONFIG	0xd3
395 
396 
397 #define IMS_PCU_RSP_EVNT_BUTTONS	0xe0	/* Unsolicited, button state */
398 #define IMS_PCU_GAMEPAD_MASK		0x0001ff80UL	/* Bits 7 through 16 */
399 
400 
401 #define IMS_PCU_MIN_PACKET_LEN		3
402 #define IMS_PCU_DATA_OFFSET		2
403 
404 #define IMS_PCU_CMD_WRITE_TIMEOUT	100 /* msec */
405 #define IMS_PCU_CMD_RESPONSE_TIMEOUT	500 /* msec */
406 
ims_pcu_report_events(struct ims_pcu * pcu)407 static void ims_pcu_report_events(struct ims_pcu *pcu)
408 {
409 	u32 data = get_unaligned_be32(&pcu->read_buf[3]);
410 
411 	ims_pcu_buttons_report(pcu, data & ~IMS_PCU_GAMEPAD_MASK);
412 	if (pcu->gamepad)
413 		ims_pcu_gamepad_report(pcu, data);
414 }
415 
ims_pcu_handle_response(struct ims_pcu * pcu)416 static void ims_pcu_handle_response(struct ims_pcu *pcu)
417 {
418 	switch (pcu->read_buf[0]) {
419 	case IMS_PCU_RSP_EVNT_BUTTONS:
420 		if (likely(pcu->setup_complete))
421 			ims_pcu_report_events(pcu);
422 		break;
423 
424 	default:
425 		/*
426 		 * See if we got command completion.
427 		 * If both the sequence and response code match save
428 		 * the data and signal completion.
429 		 */
430 		if (pcu->read_buf[0] == pcu->expected_response &&
431 		    pcu->read_buf[1] == pcu->ack_id - 1) {
432 
433 			memcpy(pcu->cmd_buf, pcu->read_buf, pcu->read_pos);
434 			pcu->cmd_buf_len = pcu->read_pos;
435 			complete(&pcu->cmd_done);
436 		}
437 		break;
438 	}
439 }
440 
ims_pcu_process_data(struct ims_pcu * pcu,struct urb * urb)441 static void ims_pcu_process_data(struct ims_pcu *pcu, struct urb *urb)
442 {
443 	int i;
444 
445 	for (i = 0; i < urb->actual_length; i++) {
446 		u8 data = pcu->urb_in_buf[i];
447 
448 		/* Skip everything until we get Start Xmit */
449 		if (!pcu->have_stx && data != IMS_PCU_PROTOCOL_STX)
450 			continue;
451 
452 		if (pcu->have_dle) {
453 			pcu->have_dle = false;
454 			pcu->read_buf[pcu->read_pos++] = data;
455 			pcu->check_sum += data;
456 			continue;
457 		}
458 
459 		switch (data) {
460 		case IMS_PCU_PROTOCOL_STX:
461 			if (pcu->have_stx)
462 				dev_warn(pcu->dev,
463 					 "Unexpected STX at byte %d, discarding old data\n",
464 					 pcu->read_pos);
465 			pcu->have_stx = true;
466 			pcu->have_dle = false;
467 			pcu->read_pos = 0;
468 			pcu->check_sum = 0;
469 			break;
470 
471 		case IMS_PCU_PROTOCOL_DLE:
472 			pcu->have_dle = true;
473 			break;
474 
475 		case IMS_PCU_PROTOCOL_ETX:
476 			if (pcu->read_pos < IMS_PCU_MIN_PACKET_LEN) {
477 				dev_warn(pcu->dev,
478 					 "Short packet received (%d bytes), ignoring\n",
479 					 pcu->read_pos);
480 			} else if (pcu->check_sum != 0) {
481 				dev_warn(pcu->dev,
482 					 "Invalid checksum in packet (%d bytes), ignoring\n",
483 					 pcu->read_pos);
484 			} else {
485 				ims_pcu_handle_response(pcu);
486 			}
487 
488 			pcu->have_stx = false;
489 			pcu->have_dle = false;
490 			pcu->read_pos = 0;
491 			break;
492 
493 		default:
494 			pcu->read_buf[pcu->read_pos++] = data;
495 			pcu->check_sum += data;
496 			break;
497 		}
498 	}
499 }
500 
ims_pcu_byte_needs_escape(u8 byte)501 static bool ims_pcu_byte_needs_escape(u8 byte)
502 {
503 	return byte == IMS_PCU_PROTOCOL_STX ||
504 	       byte == IMS_PCU_PROTOCOL_ETX ||
505 	       byte == IMS_PCU_PROTOCOL_DLE;
506 }
507 
ims_pcu_send_cmd_chunk(struct ims_pcu * pcu,u8 command,int chunk,int len)508 static int ims_pcu_send_cmd_chunk(struct ims_pcu *pcu,
509 				  u8 command, int chunk, int len)
510 {
511 	int error;
512 
513 	error = usb_bulk_msg(pcu->udev,
514 			     usb_sndbulkpipe(pcu->udev,
515 					     pcu->ep_out->bEndpointAddress),
516 			     pcu->urb_out_buf, len,
517 			     NULL, IMS_PCU_CMD_WRITE_TIMEOUT);
518 	if (error < 0) {
519 		dev_dbg(pcu->dev,
520 			"Sending 0x%02x command failed at chunk %d: %d\n",
521 			command, chunk, error);
522 		return error;
523 	}
524 
525 	return 0;
526 }
527 
ims_pcu_send_command(struct ims_pcu * pcu,u8 command,const u8 * data,int len)528 static int ims_pcu_send_command(struct ims_pcu *pcu,
529 				u8 command, const u8 *data, int len)
530 {
531 	int count = 0;
532 	int chunk = 0;
533 	int delta;
534 	int i;
535 	int error;
536 	u8 csum = 0;
537 	u8 ack_id;
538 
539 	pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_STX;
540 
541 	/* We know the command need not be escaped */
542 	pcu->urb_out_buf[count++] = command;
543 	csum += command;
544 
545 	ack_id = pcu->ack_id++;
546 	if (ack_id == 0xff)
547 		ack_id = pcu->ack_id++;
548 
549 	if (ims_pcu_byte_needs_escape(ack_id))
550 		pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE;
551 
552 	pcu->urb_out_buf[count++] = ack_id;
553 	csum += ack_id;
554 
555 	for (i = 0; i < len; i++) {
556 
557 		delta = ims_pcu_byte_needs_escape(data[i]) ? 2 : 1;
558 		if (count + delta >= pcu->max_out_size) {
559 			error = ims_pcu_send_cmd_chunk(pcu, command,
560 						       ++chunk, count);
561 			if (error)
562 				return error;
563 
564 			count = 0;
565 		}
566 
567 		if (delta == 2)
568 			pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE;
569 
570 		pcu->urb_out_buf[count++] = data[i];
571 		csum += data[i];
572 	}
573 
574 	csum = 1 + ~csum;
575 
576 	delta = ims_pcu_byte_needs_escape(csum) ? 3 : 2;
577 	if (count + delta >= pcu->max_out_size) {
578 		error = ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count);
579 		if (error)
580 			return error;
581 
582 		count = 0;
583 	}
584 
585 	if (delta == 3)
586 		pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE;
587 
588 	pcu->urb_out_buf[count++] = csum;
589 	pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_ETX;
590 
591 	return ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count);
592 }
593 
__ims_pcu_execute_command(struct ims_pcu * pcu,u8 command,const void * data,size_t len,u8 expected_response,int response_time)594 static int __ims_pcu_execute_command(struct ims_pcu *pcu,
595 				     u8 command, const void *data, size_t len,
596 				     u8 expected_response, int response_time)
597 {
598 	int error;
599 
600 	pcu->expected_response = expected_response;
601 	init_completion(&pcu->cmd_done);
602 
603 	error = ims_pcu_send_command(pcu, command, data, len);
604 	if (error)
605 		return error;
606 
607 	if (expected_response &&
608 	    !wait_for_completion_timeout(&pcu->cmd_done,
609 					 msecs_to_jiffies(response_time))) {
610 		dev_dbg(pcu->dev, "Command 0x%02x timed out\n", command);
611 		return -ETIMEDOUT;
612 	}
613 
614 	return 0;
615 }
616 
617 #define ims_pcu_execute_command(pcu, code, data, len)			\
618 	__ims_pcu_execute_command(pcu,					\
619 				  IMS_PCU_CMD_##code, data, len,	\
620 				  IMS_PCU_RSP_##code,			\
621 				  IMS_PCU_CMD_RESPONSE_TIMEOUT)
622 
623 #define ims_pcu_execute_query(pcu, code)				\
624 	ims_pcu_execute_command(pcu, code, NULL, 0)
625 
626 /* Bootloader commands */
627 #define IMS_PCU_BL_CMD_QUERY_DEVICE	0xa1
628 #define IMS_PCU_BL_CMD_UNLOCK_CONFIG	0xa2
629 #define IMS_PCU_BL_CMD_ERASE_APP	0xa3
630 #define IMS_PCU_BL_CMD_PROGRAM_DEVICE	0xa4
631 #define IMS_PCU_BL_CMD_PROGRAM_COMPLETE	0xa5
632 #define IMS_PCU_BL_CMD_READ_APP		0xa6
633 #define IMS_PCU_BL_CMD_RESET_DEVICE	0xa7
634 #define IMS_PCU_BL_CMD_LAUNCH_APP	0xa8
635 
636 /* Bootloader commands */
637 #define IMS_PCU_BL_RSP_QUERY_DEVICE	0xc1
638 #define IMS_PCU_BL_RSP_UNLOCK_CONFIG	0xc2
639 #define IMS_PCU_BL_RSP_ERASE_APP	0xc3
640 #define IMS_PCU_BL_RSP_PROGRAM_DEVICE	0xc4
641 #define IMS_PCU_BL_RSP_PROGRAM_COMPLETE	0xc5
642 #define IMS_PCU_BL_RSP_READ_APP		0xc6
643 #define IMS_PCU_BL_RSP_RESET_DEVICE	0	/* originally 0xa7 */
644 #define IMS_PCU_BL_RSP_LAUNCH_APP	0	/* originally 0xa8 */
645 
646 #define IMS_PCU_BL_DATA_OFFSET		3
647 
__ims_pcu_execute_bl_command(struct ims_pcu * pcu,u8 command,const void * data,size_t len,u8 expected_response,int response_time)648 static int __ims_pcu_execute_bl_command(struct ims_pcu *pcu,
649 					u8 command, const void *data, size_t len,
650 					u8 expected_response, int response_time)
651 {
652 	int error;
653 
654 	pcu->cmd_buf[0] = command;
655 	if (data)
656 		memcpy(&pcu->cmd_buf[1], data, len);
657 
658 	error = __ims_pcu_execute_command(pcu,
659 				IMS_PCU_CMD_BOOTLOADER, pcu->cmd_buf, len + 1,
660 				expected_response ? IMS_PCU_RSP_BOOTLOADER : 0,
661 				response_time);
662 	if (error) {
663 		dev_err(pcu->dev,
664 			"Failure when sending 0x%02x command to bootloader, error: %d\n",
665 			pcu->cmd_buf[0], error);
666 		return error;
667 	}
668 
669 	if (expected_response && pcu->cmd_buf[2] != expected_response) {
670 		dev_err(pcu->dev,
671 			"Unexpected response from bootloader: 0x%02x, wanted 0x%02x\n",
672 			pcu->cmd_buf[2], expected_response);
673 		return -EINVAL;
674 	}
675 
676 	return 0;
677 }
678 
679 #define ims_pcu_execute_bl_command(pcu, code, data, len, timeout)	\
680 	__ims_pcu_execute_bl_command(pcu,				\
681 				     IMS_PCU_BL_CMD_##code, data, len,	\
682 				     IMS_PCU_BL_RSP_##code, timeout)	\
683 
684 #define IMS_PCU_INFO_PART_OFFSET	2
685 #define IMS_PCU_INFO_DOM_OFFSET		17
686 #define IMS_PCU_INFO_SERIAL_OFFSET	25
687 
688 #define IMS_PCU_SET_INFO_SIZE		31
689 
ims_pcu_get_info(struct ims_pcu * pcu)690 static int ims_pcu_get_info(struct ims_pcu *pcu)
691 {
692 	int error;
693 
694 	error = ims_pcu_execute_query(pcu, GET_INFO);
695 	if (error) {
696 		dev_err(pcu->dev,
697 			"GET_INFO command failed, error: %d\n", error);
698 		return error;
699 	}
700 
701 	memcpy(pcu->part_number,
702 	       &pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET],
703 	       sizeof(pcu->part_number));
704 	memcpy(pcu->date_of_manufacturing,
705 	       &pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET],
706 	       sizeof(pcu->date_of_manufacturing));
707 	memcpy(pcu->serial_number,
708 	       &pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET],
709 	       sizeof(pcu->serial_number));
710 
711 	return 0;
712 }
713 
ims_pcu_set_info(struct ims_pcu * pcu)714 static int ims_pcu_set_info(struct ims_pcu *pcu)
715 {
716 	int error;
717 
718 	memcpy(&pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET],
719 	       pcu->part_number, sizeof(pcu->part_number));
720 	memcpy(&pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET],
721 	       pcu->date_of_manufacturing, sizeof(pcu->date_of_manufacturing));
722 	memcpy(&pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET],
723 	       pcu->serial_number, sizeof(pcu->serial_number));
724 
725 	error = ims_pcu_execute_command(pcu, SET_INFO,
726 					&pcu->cmd_buf[IMS_PCU_DATA_OFFSET],
727 					IMS_PCU_SET_INFO_SIZE);
728 	if (error) {
729 		dev_err(pcu->dev,
730 			"Failed to update device information, error: %d\n",
731 			error);
732 		return error;
733 	}
734 
735 	return 0;
736 }
737 
ims_pcu_switch_to_bootloader(struct ims_pcu * pcu)738 static int ims_pcu_switch_to_bootloader(struct ims_pcu *pcu)
739 {
740 	int error;
741 
742 	/* Execute jump to the bootloader */
743 	error = ims_pcu_execute_command(pcu, JUMP_TO_BTLDR, NULL, 0);
744 	if (error) {
745 		dev_err(pcu->dev,
746 			"Failure when sending JUMP TO BOOTLOADER command, error: %d\n",
747 			error);
748 		return error;
749 	}
750 
751 	return 0;
752 }
753 
754 /*********************************************************************
755  *             Firmware Update handling                              *
756  *********************************************************************/
757 
758 #define IMS_PCU_FIRMWARE_NAME	"imspcu.fw"
759 
760 struct ims_pcu_flash_fmt {
761 	__le32 addr;
762 	u8 len;
763 	u8 data[] __counted_by(len);
764 };
765 
ims_pcu_count_fw_records(const struct firmware * fw)766 static unsigned int ims_pcu_count_fw_records(const struct firmware *fw)
767 {
768 	const struct ihex_binrec *rec = (const struct ihex_binrec *)fw->data;
769 	unsigned int count = 0;
770 
771 	while (rec) {
772 		count++;
773 		rec = ihex_next_binrec(rec);
774 	}
775 
776 	return count;
777 }
778 
ims_pcu_verify_block(struct ims_pcu * pcu,u32 addr,u8 len,const u8 * data)779 static int ims_pcu_verify_block(struct ims_pcu *pcu,
780 				u32 addr, u8 len, const u8 *data)
781 {
782 	struct ims_pcu_flash_fmt *fragment;
783 	int error;
784 
785 	fragment = (void *)&pcu->cmd_buf[1];
786 	put_unaligned_le32(addr, &fragment->addr);
787 	fragment->len = len;
788 
789 	error = ims_pcu_execute_bl_command(pcu, READ_APP, NULL, 5,
790 					IMS_PCU_CMD_RESPONSE_TIMEOUT);
791 	if (error) {
792 		dev_err(pcu->dev,
793 			"Failed to retrieve block at 0x%08x, len %d, error: %d\n",
794 			addr, len, error);
795 		return error;
796 	}
797 
798 	fragment = (void *)&pcu->cmd_buf[IMS_PCU_BL_DATA_OFFSET];
799 	if (get_unaligned_le32(&fragment->addr) != addr ||
800 	    fragment->len != len) {
801 		dev_err(pcu->dev,
802 			"Wrong block when retrieving 0x%08x (0x%08x), len %d (%d)\n",
803 			addr, get_unaligned_le32(&fragment->addr),
804 			len, fragment->len);
805 		return -EINVAL;
806 	}
807 
808 	if (memcmp(fragment->data, data, len)) {
809 		dev_err(pcu->dev,
810 			"Mismatch in block at 0x%08x, len %d\n",
811 			addr, len);
812 		return -EINVAL;
813 	}
814 
815 	return 0;
816 }
817 
ims_pcu_flash_firmware(struct ims_pcu * pcu,const struct firmware * fw,unsigned int n_fw_records)818 static int ims_pcu_flash_firmware(struct ims_pcu *pcu,
819 				  const struct firmware *fw,
820 				  unsigned int n_fw_records)
821 {
822 	const struct ihex_binrec *rec = (const struct ihex_binrec *)fw->data;
823 	struct ims_pcu_flash_fmt *fragment;
824 	unsigned int count = 0;
825 	u32 addr;
826 	u8 len;
827 	int error;
828 
829 	error = ims_pcu_execute_bl_command(pcu, ERASE_APP, NULL, 0, 2000);
830 	if (error) {
831 		dev_err(pcu->dev,
832 			"Failed to erase application image, error: %d\n",
833 			error);
834 		return error;
835 	}
836 
837 	while (rec) {
838 		/*
839 		 * The firmware format is messed up for some reason.
840 		 * The address twice that of what is needed for some
841 		 * reason and we end up overwriting half of the data
842 		 * with the next record.
843 		 */
844 		addr = be32_to_cpu(rec->addr) / 2;
845 		len = be16_to_cpu(rec->len);
846 
847 		fragment = (void *)&pcu->cmd_buf[1];
848 		put_unaligned_le32(addr, &fragment->addr);
849 		fragment->len = len;
850 		memcpy(fragment->data, rec->data, len);
851 
852 		error = ims_pcu_execute_bl_command(pcu, PROGRAM_DEVICE,
853 						NULL, len + 5,
854 						IMS_PCU_CMD_RESPONSE_TIMEOUT);
855 		if (error) {
856 			dev_err(pcu->dev,
857 				"Failed to write block at 0x%08x, len %d, error: %d\n",
858 				addr, len, error);
859 			return error;
860 		}
861 
862 		if (addr >= pcu->fw_start_addr && addr < pcu->fw_end_addr) {
863 			error = ims_pcu_verify_block(pcu, addr, len, rec->data);
864 			if (error)
865 				return error;
866 		}
867 
868 		count++;
869 		pcu->update_firmware_status = (count * 100) / n_fw_records;
870 
871 		rec = ihex_next_binrec(rec);
872 	}
873 
874 	error = ims_pcu_execute_bl_command(pcu, PROGRAM_COMPLETE,
875 					    NULL, 0, 2000);
876 	if (error)
877 		dev_err(pcu->dev,
878 			"Failed to send PROGRAM_COMPLETE, error: %d\n",
879 			error);
880 
881 	return 0;
882 }
883 
ims_pcu_handle_firmware_update(struct ims_pcu * pcu,const struct firmware * fw)884 static int ims_pcu_handle_firmware_update(struct ims_pcu *pcu,
885 					  const struct firmware *fw)
886 {
887 	unsigned int n_fw_records;
888 	int retval;
889 
890 	dev_info(pcu->dev, "Updating firmware %s, size: %zu\n",
891 		 IMS_PCU_FIRMWARE_NAME, fw->size);
892 
893 	n_fw_records = ims_pcu_count_fw_records(fw);
894 
895 	retval = ims_pcu_flash_firmware(pcu, fw, n_fw_records);
896 	if (retval)
897 		goto out;
898 
899 	retval = ims_pcu_execute_bl_command(pcu, LAUNCH_APP, NULL, 0, 0);
900 	if (retval)
901 		dev_err(pcu->dev,
902 			"Failed to start application image, error: %d\n",
903 			retval);
904 
905 out:
906 	pcu->update_firmware_status = retval;
907 	sysfs_notify(&pcu->dev->kobj, NULL, "update_firmware_status");
908 	return retval;
909 }
910 
ims_pcu_process_async_firmware(const struct firmware * fw,void * context)911 static void ims_pcu_process_async_firmware(const struct firmware *fw,
912 					   void *context)
913 {
914 	struct ims_pcu *pcu = context;
915 	int error;
916 
917 	if (!fw) {
918 		dev_err(pcu->dev, "Failed to get firmware %s\n",
919 			IMS_PCU_FIRMWARE_NAME);
920 		goto out;
921 	}
922 
923 	error = ihex_validate_fw(fw);
924 	if (error) {
925 		dev_err(pcu->dev, "Firmware %s is invalid\n",
926 			IMS_PCU_FIRMWARE_NAME);
927 		goto out;
928 	}
929 
930 	scoped_guard(mutex, &pcu->cmd_mutex)
931 		ims_pcu_handle_firmware_update(pcu, fw);
932 
933 	release_firmware(fw);
934 
935 out:
936 	complete(&pcu->async_firmware_done);
937 }
938 
939 /*********************************************************************
940  *             Backlight LED device support                          *
941  *********************************************************************/
942 
943 #define IMS_PCU_MAX_BRIGHTNESS		31998
944 
ims_pcu_backlight_set_brightness(struct led_classdev * cdev,enum led_brightness value)945 static int ims_pcu_backlight_set_brightness(struct led_classdev *cdev,
946 					    enum led_brightness value)
947 {
948 	struct ims_pcu_backlight *backlight =
949 			container_of(cdev, struct ims_pcu_backlight, cdev);
950 	struct ims_pcu *pcu =
951 			container_of(backlight, struct ims_pcu, backlight);
952 	__le16 br_val = cpu_to_le16(value);
953 	int error;
954 
955 	guard(mutex)(&pcu->cmd_mutex);
956 
957 	error = ims_pcu_execute_command(pcu, SET_BRIGHTNESS,
958 					&br_val, sizeof(br_val));
959 	if (error && error != -ENODEV)
960 		dev_warn(pcu->dev,
961 			 "Failed to set desired brightness %u, error: %d\n",
962 			 value, error);
963 
964 	return error;
965 }
966 
967 static enum led_brightness
ims_pcu_backlight_get_brightness(struct led_classdev * cdev)968 ims_pcu_backlight_get_brightness(struct led_classdev *cdev)
969 {
970 	struct ims_pcu_backlight *backlight =
971 			container_of(cdev, struct ims_pcu_backlight, cdev);
972 	struct ims_pcu *pcu =
973 			container_of(backlight, struct ims_pcu, backlight);
974 	int brightness;
975 	int error;
976 
977 	guard(mutex)(&pcu->cmd_mutex);
978 
979 	error = ims_pcu_execute_query(pcu, GET_BRIGHTNESS);
980 	if (error) {
981 		dev_warn(pcu->dev,
982 			 "Failed to get current brightness, error: %d\n",
983 			 error);
984 		/* Assume the LED is OFF */
985 		brightness = LED_OFF;
986 	} else {
987 		brightness =
988 			get_unaligned_le16(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET]);
989 	}
990 
991 	return brightness;
992 }
993 
ims_pcu_setup_backlight(struct ims_pcu * pcu)994 static int ims_pcu_setup_backlight(struct ims_pcu *pcu)
995 {
996 	struct ims_pcu_backlight *backlight = &pcu->backlight;
997 	int error;
998 
999 	snprintf(backlight->name, sizeof(backlight->name),
1000 		 "pcu%d::kbd_backlight", pcu->device_no);
1001 
1002 	backlight->cdev.name = backlight->name;
1003 	backlight->cdev.max_brightness = IMS_PCU_MAX_BRIGHTNESS;
1004 	backlight->cdev.brightness_get = ims_pcu_backlight_get_brightness;
1005 	backlight->cdev.brightness_set_blocking =
1006 					 ims_pcu_backlight_set_brightness;
1007 
1008 	error = led_classdev_register(pcu->dev, &backlight->cdev);
1009 	if (error) {
1010 		dev_err(pcu->dev,
1011 			"Failed to register backlight LED device, error: %d\n",
1012 			error);
1013 		return error;
1014 	}
1015 
1016 	return 0;
1017 }
1018 
ims_pcu_destroy_backlight(struct ims_pcu * pcu)1019 static void ims_pcu_destroy_backlight(struct ims_pcu *pcu)
1020 {
1021 	struct ims_pcu_backlight *backlight = &pcu->backlight;
1022 
1023 	led_classdev_unregister(&backlight->cdev);
1024 }
1025 
1026 
1027 /*********************************************************************
1028  *             Sysfs attributes handling                             *
1029  *********************************************************************/
1030 
1031 struct ims_pcu_attribute {
1032 	struct device_attribute dattr;
1033 	size_t field_offset;
1034 	int field_length;
1035 };
1036 
ims_pcu_attribute_show(struct device * dev,struct device_attribute * dattr,char * buf)1037 static ssize_t ims_pcu_attribute_show(struct device *dev,
1038 				      struct device_attribute *dattr,
1039 				      char *buf)
1040 {
1041 	struct usb_interface *intf = to_usb_interface(dev);
1042 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1043 	struct ims_pcu_attribute *attr =
1044 			container_of(dattr, struct ims_pcu_attribute, dattr);
1045 	char *field = (char *)pcu + attr->field_offset;
1046 
1047 	return sysfs_emit(buf, "%.*s\n", attr->field_length, field);
1048 }
1049 
ims_pcu_attribute_store(struct device * dev,struct device_attribute * dattr,const char * buf,size_t count)1050 static ssize_t ims_pcu_attribute_store(struct device *dev,
1051 				       struct device_attribute *dattr,
1052 				       const char *buf, size_t count)
1053 {
1054 
1055 	struct usb_interface *intf = to_usb_interface(dev);
1056 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1057 	struct ims_pcu_attribute *attr =
1058 			container_of(dattr, struct ims_pcu_attribute, dattr);
1059 	char *field = (char *)pcu + attr->field_offset;
1060 	size_t data_len;
1061 	int error;
1062 
1063 	if (count > attr->field_length)
1064 		return -EINVAL;
1065 
1066 	data_len = strnlen(buf, attr->field_length);
1067 	if (data_len > attr->field_length)
1068 		return -EINVAL;
1069 
1070 	scoped_cond_guard(mutex_intr, return -EINTR, &pcu->cmd_mutex) {
1071 		memset(field, 0, attr->field_length);
1072 		memcpy(field, buf, data_len);
1073 
1074 		error = ims_pcu_set_info(pcu);
1075 
1076 		/*
1077 		 * Even if update failed, let's fetch the info again as we just
1078 		 * clobbered one of the fields.
1079 		 */
1080 		ims_pcu_get_info(pcu);
1081 
1082 		if (error)
1083 			return error;
1084 	}
1085 
1086 	return count;
1087 }
1088 
1089 #define IMS_PCU_ATTR(_field, _mode)					\
1090 struct ims_pcu_attribute ims_pcu_attr_##_field = {			\
1091 	.dattr = __ATTR(_field, _mode,					\
1092 			ims_pcu_attribute_show,				\
1093 			ims_pcu_attribute_store),			\
1094 	.field_offset = offsetof(struct ims_pcu, _field),		\
1095 	.field_length = sizeof(((struct ims_pcu *)NULL)->_field),	\
1096 }
1097 
1098 #define IMS_PCU_RO_ATTR(_field)						\
1099 		IMS_PCU_ATTR(_field, S_IRUGO)
1100 #define IMS_PCU_RW_ATTR(_field)						\
1101 		IMS_PCU_ATTR(_field, S_IRUGO | S_IWUSR)
1102 
1103 static IMS_PCU_RW_ATTR(part_number);
1104 static IMS_PCU_RW_ATTR(serial_number);
1105 static IMS_PCU_RW_ATTR(date_of_manufacturing);
1106 
1107 static IMS_PCU_RO_ATTR(fw_version);
1108 static IMS_PCU_RO_ATTR(bl_version);
1109 static IMS_PCU_RO_ATTR(reset_reason);
1110 
ims_pcu_reset_device(struct device * dev,struct device_attribute * dattr,const char * buf,size_t count)1111 static ssize_t ims_pcu_reset_device(struct device *dev,
1112 				    struct device_attribute *dattr,
1113 				    const char *buf, size_t count)
1114 {
1115 	static const u8 reset_byte = 1;
1116 	struct usb_interface *intf = to_usb_interface(dev);
1117 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1118 	int value;
1119 	int error;
1120 
1121 	error = kstrtoint(buf, 0, &value);
1122 	if (error)
1123 		return error;
1124 
1125 	if (value != 1)
1126 		return -EINVAL;
1127 
1128 	dev_info(pcu->dev, "Attempting to reset device\n");
1129 
1130 	error = ims_pcu_execute_command(pcu, PCU_RESET, &reset_byte, 1);
1131 	if (error) {
1132 		dev_info(pcu->dev,
1133 			 "Failed to reset device, error: %d\n",
1134 			 error);
1135 		return error;
1136 	}
1137 
1138 	return count;
1139 }
1140 
1141 static DEVICE_ATTR(reset_device, S_IWUSR, NULL, ims_pcu_reset_device);
1142 
ims_pcu_update_firmware_store(struct device * dev,struct device_attribute * dattr,const char * buf,size_t count)1143 static ssize_t ims_pcu_update_firmware_store(struct device *dev,
1144 					     struct device_attribute *dattr,
1145 					     const char *buf, size_t count)
1146 {
1147 	struct usb_interface *intf = to_usb_interface(dev);
1148 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1149 	int value;
1150 	int error;
1151 
1152 	error = kstrtoint(buf, 0, &value);
1153 	if (error)
1154 		return error;
1155 
1156 	if (value != 1)
1157 		return -EINVAL;
1158 
1159 	const struct firmware *fw __free(firmware) = NULL;
1160 	error = request_ihex_firmware(&fw, IMS_PCU_FIRMWARE_NAME, pcu->dev);
1161 	if (error) {
1162 		dev_err(pcu->dev, "Failed to request firmware %s, error: %d\n",
1163 			IMS_PCU_FIRMWARE_NAME, error);
1164 		return error;
1165 	}
1166 
1167 	scoped_cond_guard(mutex_intr, return -EINTR, &pcu->cmd_mutex) {
1168 		/*
1169 		 * If we are already in bootloader mode we can proceed with
1170 		 * flashing the firmware.
1171 		 *
1172 		 * If we are in application mode, then we need to switch into
1173 		 * bootloader mode, which will cause the device to disconnect
1174 		 * and reconnect as different device.
1175 		 */
1176 		if (pcu->bootloader_mode)
1177 			error = ims_pcu_handle_firmware_update(pcu, fw);
1178 		else
1179 			error = ims_pcu_switch_to_bootloader(pcu);
1180 
1181 		if (error)
1182 			return error;
1183 	}
1184 
1185 	return count;
1186 }
1187 
1188 static DEVICE_ATTR(update_firmware, S_IWUSR,
1189 		   NULL, ims_pcu_update_firmware_store);
1190 
1191 static ssize_t
ims_pcu_update_firmware_status_show(struct device * dev,struct device_attribute * dattr,char * buf)1192 ims_pcu_update_firmware_status_show(struct device *dev,
1193 				    struct device_attribute *dattr,
1194 				    char *buf)
1195 {
1196 	struct usb_interface *intf = to_usb_interface(dev);
1197 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1198 
1199 	return sysfs_emit(buf, "%d\n", pcu->update_firmware_status);
1200 }
1201 
1202 static DEVICE_ATTR(update_firmware_status, S_IRUGO,
1203 		   ims_pcu_update_firmware_status_show, NULL);
1204 
1205 static struct attribute *ims_pcu_attrs[] = {
1206 	&ims_pcu_attr_part_number.dattr.attr,
1207 	&ims_pcu_attr_serial_number.dattr.attr,
1208 	&ims_pcu_attr_date_of_manufacturing.dattr.attr,
1209 	&ims_pcu_attr_fw_version.dattr.attr,
1210 	&ims_pcu_attr_bl_version.dattr.attr,
1211 	&ims_pcu_attr_reset_reason.dattr.attr,
1212 	&dev_attr_reset_device.attr,
1213 	&dev_attr_update_firmware.attr,
1214 	&dev_attr_update_firmware_status.attr,
1215 	NULL
1216 };
1217 
ims_pcu_is_attr_visible(struct kobject * kobj,struct attribute * attr,int n)1218 static umode_t ims_pcu_is_attr_visible(struct kobject *kobj,
1219 				       struct attribute *attr, int n)
1220 {
1221 	struct device *dev = kobj_to_dev(kobj);
1222 	struct usb_interface *intf = to_usb_interface(dev);
1223 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1224 	umode_t mode = attr->mode;
1225 
1226 	if (pcu->bootloader_mode) {
1227 		if (attr != &dev_attr_update_firmware_status.attr &&
1228 		    attr != &dev_attr_update_firmware.attr &&
1229 		    attr != &dev_attr_reset_device.attr) {
1230 			mode = 0;
1231 		}
1232 	} else {
1233 		if (attr == &dev_attr_update_firmware_status.attr)
1234 			mode = 0;
1235 	}
1236 
1237 	return mode;
1238 }
1239 
1240 static const struct attribute_group ims_pcu_attr_group = {
1241 	.is_visible	= ims_pcu_is_attr_visible,
1242 	.attrs		= ims_pcu_attrs,
1243 };
1244 
1245 /* Support for a separate OFN attribute group */
1246 
1247 #define OFN_REG_RESULT_OFFSET	2
1248 
ims_pcu_read_ofn_config(struct ims_pcu * pcu,u8 addr,u8 * data)1249 static int ims_pcu_read_ofn_config(struct ims_pcu *pcu, u8 addr, u8 *data)
1250 {
1251 	int error;
1252 	s16 result;
1253 
1254 	error = ims_pcu_execute_command(pcu, OFN_GET_CONFIG,
1255 					&addr, sizeof(addr));
1256 	if (error)
1257 		return error;
1258 
1259 	result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET);
1260 	if (result < 0)
1261 		return -EIO;
1262 
1263 	/* We only need LSB */
1264 	*data = pcu->cmd_buf[OFN_REG_RESULT_OFFSET];
1265 	return 0;
1266 }
1267 
ims_pcu_write_ofn_config(struct ims_pcu * pcu,u8 addr,u8 data)1268 static int ims_pcu_write_ofn_config(struct ims_pcu *pcu, u8 addr, u8 data)
1269 {
1270 	u8 buffer[] = { addr, data };
1271 	int error;
1272 	s16 result;
1273 
1274 	error = ims_pcu_execute_command(pcu, OFN_SET_CONFIG,
1275 					&buffer, sizeof(buffer));
1276 	if (error)
1277 		return error;
1278 
1279 	result = (s16)get_unaligned_le16(pcu->cmd_buf + OFN_REG_RESULT_OFFSET);
1280 	if (result < 0)
1281 		return -EIO;
1282 
1283 	return 0;
1284 }
1285 
ims_pcu_ofn_reg_data_show(struct device * dev,struct device_attribute * dattr,char * buf)1286 static ssize_t ims_pcu_ofn_reg_data_show(struct device *dev,
1287 					 struct device_attribute *dattr,
1288 					 char *buf)
1289 {
1290 	struct usb_interface *intf = to_usb_interface(dev);
1291 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1292 	int error;
1293 	u8 data;
1294 
1295 	scoped_guard(mutex, &pcu->cmd_mutex) {
1296 		error = ims_pcu_read_ofn_config(pcu, pcu->ofn_reg_addr, &data);
1297 		if (error)
1298 			return error;
1299 	}
1300 
1301 	return sysfs_emit(buf, "%x\n", data);
1302 }
1303 
ims_pcu_ofn_reg_data_store(struct device * dev,struct device_attribute * dattr,const char * buf,size_t count)1304 static ssize_t ims_pcu_ofn_reg_data_store(struct device *dev,
1305 					  struct device_attribute *dattr,
1306 					  const char *buf, size_t count)
1307 {
1308 	struct usb_interface *intf = to_usb_interface(dev);
1309 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1310 	int error;
1311 	u8 value;
1312 
1313 	error = kstrtou8(buf, 0, &value);
1314 	if (error)
1315 		return error;
1316 
1317 	guard(mutex)(&pcu->cmd_mutex);
1318 
1319 	error = ims_pcu_write_ofn_config(pcu, pcu->ofn_reg_addr, value);
1320 	if (error)
1321 		return error;
1322 
1323 	return count;
1324 }
1325 
1326 static DEVICE_ATTR(reg_data, S_IRUGO | S_IWUSR,
1327 		   ims_pcu_ofn_reg_data_show, ims_pcu_ofn_reg_data_store);
1328 
ims_pcu_ofn_reg_addr_show(struct device * dev,struct device_attribute * dattr,char * buf)1329 static ssize_t ims_pcu_ofn_reg_addr_show(struct device *dev,
1330 					 struct device_attribute *dattr,
1331 					 char *buf)
1332 {
1333 	struct usb_interface *intf = to_usb_interface(dev);
1334 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1335 
1336 	guard(mutex)(&pcu->cmd_mutex);
1337 
1338 	return sysfs_emit(buf, "%x\n", pcu->ofn_reg_addr);
1339 }
1340 
ims_pcu_ofn_reg_addr_store(struct device * dev,struct device_attribute * dattr,const char * buf,size_t count)1341 static ssize_t ims_pcu_ofn_reg_addr_store(struct device *dev,
1342 					  struct device_attribute *dattr,
1343 					  const char *buf, size_t count)
1344 {
1345 	struct usb_interface *intf = to_usb_interface(dev);
1346 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1347 	int error;
1348 	u8 value;
1349 
1350 	error = kstrtou8(buf, 0, &value);
1351 	if (error)
1352 		return error;
1353 
1354 	guard(mutex)(&pcu->cmd_mutex);
1355 
1356 	pcu->ofn_reg_addr = value;
1357 
1358 	return count;
1359 }
1360 
1361 static DEVICE_ATTR(reg_addr, S_IRUGO | S_IWUSR,
1362 		   ims_pcu_ofn_reg_addr_show, ims_pcu_ofn_reg_addr_store);
1363 
1364 struct ims_pcu_ofn_bit_attribute {
1365 	struct device_attribute dattr;
1366 	u8 addr;
1367 	u8 nr;
1368 };
1369 
ims_pcu_ofn_bit_show(struct device * dev,struct device_attribute * dattr,char * buf)1370 static ssize_t ims_pcu_ofn_bit_show(struct device *dev,
1371 				    struct device_attribute *dattr,
1372 				    char *buf)
1373 {
1374 	struct usb_interface *intf = to_usb_interface(dev);
1375 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1376 	struct ims_pcu_ofn_bit_attribute *attr =
1377 		container_of(dattr, struct ims_pcu_ofn_bit_attribute, dattr);
1378 	int error;
1379 	u8 data;
1380 
1381 	scoped_guard(mutex, &pcu->cmd_mutex) {
1382 		error = ims_pcu_read_ofn_config(pcu, attr->addr, &data);
1383 		if (error)
1384 			return error;
1385 	}
1386 
1387 	return sysfs_emit(buf, "%d\n", !!(data & (1 << attr->nr)));
1388 }
1389 
ims_pcu_ofn_bit_store(struct device * dev,struct device_attribute * dattr,const char * buf,size_t count)1390 static ssize_t ims_pcu_ofn_bit_store(struct device *dev,
1391 				     struct device_attribute *dattr,
1392 				     const char *buf, size_t count)
1393 {
1394 	struct usb_interface *intf = to_usb_interface(dev);
1395 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1396 	struct ims_pcu_ofn_bit_attribute *attr =
1397 		container_of(dattr, struct ims_pcu_ofn_bit_attribute, dattr);
1398 	int error;
1399 	int value;
1400 	u8 data;
1401 
1402 	error = kstrtoint(buf, 0, &value);
1403 	if (error)
1404 		return error;
1405 
1406 	if (value > 1)
1407 		return -EINVAL;
1408 
1409 	scoped_guard(mutex, &pcu->cmd_mutex) {
1410 		error = ims_pcu_read_ofn_config(pcu, attr->addr, &data);
1411 		if (error)
1412 			return error;
1413 
1414 		if (value)
1415 			data |= 1U << attr->nr;
1416 		else
1417 			data &= ~(1U << attr->nr);
1418 
1419 		error = ims_pcu_write_ofn_config(pcu, attr->addr, data);
1420 		if (error)
1421 			return error;
1422 	}
1423 
1424 	return count;
1425 }
1426 
1427 #define IMS_PCU_OFN_BIT_ATTR(_field, _addr, _nr)			\
1428 struct ims_pcu_ofn_bit_attribute ims_pcu_ofn_attr_##_field = {		\
1429 	.dattr = __ATTR(_field, S_IWUSR | S_IRUGO,			\
1430 			ims_pcu_ofn_bit_show, ims_pcu_ofn_bit_store),	\
1431 	.addr = _addr,							\
1432 	.nr = _nr,							\
1433 }
1434 
1435 static IMS_PCU_OFN_BIT_ATTR(engine_enable,   0x60, 7);
1436 static IMS_PCU_OFN_BIT_ATTR(speed_enable,    0x60, 6);
1437 static IMS_PCU_OFN_BIT_ATTR(assert_enable,   0x60, 5);
1438 static IMS_PCU_OFN_BIT_ATTR(xyquant_enable,  0x60, 4);
1439 static IMS_PCU_OFN_BIT_ATTR(xyscale_enable,  0x60, 1);
1440 
1441 static IMS_PCU_OFN_BIT_ATTR(scale_x2,        0x63, 6);
1442 static IMS_PCU_OFN_BIT_ATTR(scale_y2,        0x63, 7);
1443 
1444 static struct attribute *ims_pcu_ofn_attrs[] = {
1445 	&dev_attr_reg_data.attr,
1446 	&dev_attr_reg_addr.attr,
1447 	&ims_pcu_ofn_attr_engine_enable.dattr.attr,
1448 	&ims_pcu_ofn_attr_speed_enable.dattr.attr,
1449 	&ims_pcu_ofn_attr_assert_enable.dattr.attr,
1450 	&ims_pcu_ofn_attr_xyquant_enable.dattr.attr,
1451 	&ims_pcu_ofn_attr_xyscale_enable.dattr.attr,
1452 	&ims_pcu_ofn_attr_scale_x2.dattr.attr,
1453 	&ims_pcu_ofn_attr_scale_y2.dattr.attr,
1454 	NULL
1455 };
1456 
ims_pcu_ofn_is_attr_visible(struct kobject * kobj,struct attribute * attr,int n)1457 static umode_t ims_pcu_ofn_is_attr_visible(struct kobject *kobj,
1458 					   struct attribute *attr, int n)
1459 {
1460 	struct device *dev = kobj_to_dev(kobj);
1461 	struct usb_interface *intf = to_usb_interface(dev);
1462 	struct ims_pcu *pcu = usb_get_intfdata(intf);
1463 	umode_t mode = attr->mode;
1464 
1465 	/*
1466 	 * PCU-B devices, both GEN_1 and GEN_2 do not have OFN sensor.
1467 	 */
1468 	if (pcu->bootloader_mode || pcu->device_id == IMS_PCU_PCU_B_DEVICE_ID)
1469 		mode = 0;
1470 
1471 	return mode;
1472 }
1473 
1474 static const struct attribute_group ims_pcu_ofn_attr_group = {
1475 	.name		= "ofn",
1476 	.is_visible	= ims_pcu_ofn_is_attr_visible,
1477 	.attrs		= ims_pcu_ofn_attrs,
1478 };
1479 
ims_pcu_irq(struct urb * urb)1480 static void ims_pcu_irq(struct urb *urb)
1481 {
1482 	struct ims_pcu *pcu = urb->context;
1483 	int retval, status;
1484 
1485 	status = urb->status;
1486 
1487 	switch (status) {
1488 	case 0:
1489 		/* success */
1490 		break;
1491 	case -ECONNRESET:
1492 	case -ENOENT:
1493 	case -ESHUTDOWN:
1494 		/* this urb is terminated, clean up */
1495 		dev_dbg(pcu->dev, "%s - urb shutting down with status: %d\n",
1496 			__func__, status);
1497 		return;
1498 	default:
1499 		dev_dbg(pcu->dev, "%s - nonzero urb status received: %d\n",
1500 			__func__, status);
1501 		goto exit;
1502 	}
1503 
1504 	dev_dbg(pcu->dev, "%s: received %d: %*ph\n", __func__,
1505 		urb->actual_length, urb->actual_length, pcu->urb_in_buf);
1506 
1507 	if (urb == pcu->urb_in)
1508 		ims_pcu_process_data(pcu, urb);
1509 
1510 exit:
1511 	retval = usb_submit_urb(urb, GFP_ATOMIC);
1512 	if (retval && retval != -ENODEV)
1513 		dev_err(pcu->dev, "%s - usb_submit_urb failed with result %d\n",
1514 			__func__, retval);
1515 }
1516 
ims_pcu_buffers_alloc(struct ims_pcu * pcu)1517 static int ims_pcu_buffers_alloc(struct ims_pcu *pcu)
1518 {
1519 	int error;
1520 
1521 	pcu->urb_in_buf = usb_alloc_coherent(pcu->udev, pcu->max_in_size,
1522 					     GFP_KERNEL, &pcu->read_dma);
1523 	if (!pcu->urb_in_buf) {
1524 		dev_err(pcu->dev,
1525 			"Failed to allocate memory for read buffer\n");
1526 		return -ENOMEM;
1527 	}
1528 
1529 	pcu->urb_in = usb_alloc_urb(0, GFP_KERNEL);
1530 	if (!pcu->urb_in) {
1531 		dev_err(pcu->dev, "Failed to allocate input URB\n");
1532 		error = -ENOMEM;
1533 		goto err_free_urb_in_buf;
1534 	}
1535 
1536 	pcu->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1537 	pcu->urb_in->transfer_dma = pcu->read_dma;
1538 
1539 	usb_fill_bulk_urb(pcu->urb_in, pcu->udev,
1540 			  usb_rcvbulkpipe(pcu->udev,
1541 					  pcu->ep_in->bEndpointAddress),
1542 			  pcu->urb_in_buf, pcu->max_in_size,
1543 			  ims_pcu_irq, pcu);
1544 
1545 	/*
1546 	 * We are using usb_bulk_msg() for sending so there is no point
1547 	 * in allocating memory with usb_alloc_coherent().
1548 	 */
1549 	pcu->urb_out_buf = kmalloc(pcu->max_out_size, GFP_KERNEL);
1550 	if (!pcu->urb_out_buf) {
1551 		dev_err(pcu->dev, "Failed to allocate memory for write buffer\n");
1552 		error = -ENOMEM;
1553 		goto err_free_in_urb;
1554 	}
1555 
1556 	pcu->urb_ctrl_buf = usb_alloc_coherent(pcu->udev, pcu->max_ctrl_size,
1557 					       GFP_KERNEL, &pcu->ctrl_dma);
1558 	if (!pcu->urb_ctrl_buf) {
1559 		dev_err(pcu->dev,
1560 			"Failed to allocate memory for read buffer\n");
1561 		error = -ENOMEM;
1562 		goto err_free_urb_out_buf;
1563 	}
1564 
1565 	pcu->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL);
1566 	if (!pcu->urb_ctrl) {
1567 		dev_err(pcu->dev, "Failed to allocate input URB\n");
1568 		error = -ENOMEM;
1569 		goto err_free_urb_ctrl_buf;
1570 	}
1571 
1572 	pcu->urb_ctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1573 	pcu->urb_ctrl->transfer_dma = pcu->ctrl_dma;
1574 
1575 	usb_fill_int_urb(pcu->urb_ctrl, pcu->udev,
1576 			  usb_rcvintpipe(pcu->udev,
1577 					 pcu->ep_ctrl->bEndpointAddress),
1578 			  pcu->urb_ctrl_buf, pcu->max_ctrl_size,
1579 			  ims_pcu_irq, pcu, pcu->ep_ctrl->bInterval);
1580 
1581 	return 0;
1582 
1583 err_free_urb_ctrl_buf:
1584 	usb_free_coherent(pcu->udev, pcu->max_ctrl_size,
1585 			  pcu->urb_ctrl_buf, pcu->ctrl_dma);
1586 err_free_urb_out_buf:
1587 	kfree(pcu->urb_out_buf);
1588 err_free_in_urb:
1589 	usb_free_urb(pcu->urb_in);
1590 err_free_urb_in_buf:
1591 	usb_free_coherent(pcu->udev, pcu->max_in_size,
1592 			  pcu->urb_in_buf, pcu->read_dma);
1593 	return error;
1594 }
1595 
ims_pcu_buffers_free(struct ims_pcu * pcu)1596 static void ims_pcu_buffers_free(struct ims_pcu *pcu)
1597 {
1598 	usb_kill_urb(pcu->urb_in);
1599 	usb_free_urb(pcu->urb_in);
1600 
1601 	usb_free_coherent(pcu->udev, pcu->max_out_size,
1602 			  pcu->urb_in_buf, pcu->read_dma);
1603 
1604 	kfree(pcu->urb_out_buf);
1605 
1606 	usb_kill_urb(pcu->urb_ctrl);
1607 	usb_free_urb(pcu->urb_ctrl);
1608 
1609 	usb_free_coherent(pcu->udev, pcu->max_ctrl_size,
1610 			  pcu->urb_ctrl_buf, pcu->ctrl_dma);
1611 }
1612 
1613 static const struct usb_cdc_union_desc *
ims_pcu_get_cdc_union_desc(struct usb_interface * intf)1614 ims_pcu_get_cdc_union_desc(struct usb_interface *intf)
1615 {
1616 	const void *buf = intf->altsetting->extra;
1617 	size_t buflen = intf->altsetting->extralen;
1618 	struct usb_cdc_union_desc *union_desc;
1619 
1620 	if (!buf) {
1621 		dev_err(&intf->dev, "Missing descriptor data\n");
1622 		return NULL;
1623 	}
1624 
1625 	if (!buflen) {
1626 		dev_err(&intf->dev, "Zero length descriptor\n");
1627 		return NULL;
1628 	}
1629 
1630 	while (buflen >= sizeof(*union_desc)) {
1631 		union_desc = (struct usb_cdc_union_desc *)buf;
1632 
1633 		if (union_desc->bLength > buflen) {
1634 			dev_err(&intf->dev, "Too large descriptor\n");
1635 			return NULL;
1636 		}
1637 
1638 		if (union_desc->bDescriptorType == USB_DT_CS_INTERFACE &&
1639 		    union_desc->bDescriptorSubType == USB_CDC_UNION_TYPE) {
1640 			dev_dbg(&intf->dev, "Found union header\n");
1641 
1642 			if (union_desc->bLength >= sizeof(*union_desc))
1643 				return union_desc;
1644 
1645 			dev_err(&intf->dev,
1646 				"Union descriptor too short (%d vs %zd)\n",
1647 				union_desc->bLength, sizeof(*union_desc));
1648 			return NULL;
1649 		}
1650 
1651 		buflen -= union_desc->bLength;
1652 		buf += union_desc->bLength;
1653 	}
1654 
1655 	dev_err(&intf->dev, "Missing CDC union descriptor\n");
1656 	return NULL;
1657 }
1658 
ims_pcu_parse_cdc_data(struct usb_interface * intf,struct ims_pcu * pcu)1659 static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pcu)
1660 {
1661 	const struct usb_cdc_union_desc *union_desc;
1662 	struct usb_host_interface *alt;
1663 
1664 	union_desc = ims_pcu_get_cdc_union_desc(intf);
1665 	if (!union_desc)
1666 		return -EINVAL;
1667 
1668 	pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev,
1669 					 union_desc->bMasterInterface0);
1670 	if (!pcu->ctrl_intf)
1671 		return -EINVAL;
1672 
1673 	alt = pcu->ctrl_intf->cur_altsetting;
1674 
1675 	if (alt->desc.bNumEndpoints < 1)
1676 		return -ENODEV;
1677 
1678 	pcu->ep_ctrl = &alt->endpoint[0].desc;
1679 	pcu->max_ctrl_size = usb_endpoint_maxp(pcu->ep_ctrl);
1680 
1681 	pcu->data_intf = usb_ifnum_to_if(pcu->udev,
1682 					 union_desc->bSlaveInterface0);
1683 	if (!pcu->data_intf)
1684 		return -EINVAL;
1685 
1686 	alt = pcu->data_intf->cur_altsetting;
1687 	if (alt->desc.bNumEndpoints != 2) {
1688 		dev_err(pcu->dev,
1689 			"Incorrect number of endpoints on data interface (%d)\n",
1690 			alt->desc.bNumEndpoints);
1691 		return -EINVAL;
1692 	}
1693 
1694 	pcu->ep_out = &alt->endpoint[0].desc;
1695 	if (!usb_endpoint_is_bulk_out(pcu->ep_out)) {
1696 		dev_err(pcu->dev,
1697 			"First endpoint on data interface is not BULK OUT\n");
1698 		return -EINVAL;
1699 	}
1700 
1701 	pcu->max_out_size = usb_endpoint_maxp(pcu->ep_out);
1702 	if (pcu->max_out_size < 8) {
1703 		dev_err(pcu->dev,
1704 			"Max OUT packet size is too small (%zd)\n",
1705 			pcu->max_out_size);
1706 		return -EINVAL;
1707 	}
1708 
1709 	pcu->ep_in = &alt->endpoint[1].desc;
1710 	if (!usb_endpoint_is_bulk_in(pcu->ep_in)) {
1711 		dev_err(pcu->dev,
1712 			"Second endpoint on data interface is not BULK IN\n");
1713 		return -EINVAL;
1714 	}
1715 
1716 	pcu->max_in_size = usb_endpoint_maxp(pcu->ep_in);
1717 	if (pcu->max_in_size < 8) {
1718 		dev_err(pcu->dev,
1719 			"Max IN packet size is too small (%zd)\n",
1720 			pcu->max_in_size);
1721 		return -EINVAL;
1722 	}
1723 
1724 	return 0;
1725 }
1726 
ims_pcu_start_io(struct ims_pcu * pcu)1727 static int ims_pcu_start_io(struct ims_pcu *pcu)
1728 {
1729 	int error;
1730 
1731 	error = usb_submit_urb(pcu->urb_ctrl, GFP_KERNEL);
1732 	if (error) {
1733 		dev_err(pcu->dev,
1734 			"Failed to start control IO - usb_submit_urb failed with result: %d\n",
1735 			error);
1736 		return -EIO;
1737 	}
1738 
1739 	error = usb_submit_urb(pcu->urb_in, GFP_KERNEL);
1740 	if (error) {
1741 		dev_err(pcu->dev,
1742 			"Failed to start IO - usb_submit_urb failed with result: %d\n",
1743 			error);
1744 		usb_kill_urb(pcu->urb_ctrl);
1745 		return -EIO;
1746 	}
1747 
1748 	return 0;
1749 }
1750 
ims_pcu_stop_io(struct ims_pcu * pcu)1751 static void ims_pcu_stop_io(struct ims_pcu *pcu)
1752 {
1753 	usb_kill_urb(pcu->urb_in);
1754 	usb_kill_urb(pcu->urb_ctrl);
1755 }
1756 
ims_pcu_line_setup(struct ims_pcu * pcu)1757 static int ims_pcu_line_setup(struct ims_pcu *pcu)
1758 {
1759 	struct usb_host_interface *interface = pcu->ctrl_intf->cur_altsetting;
1760 	struct usb_cdc_line_coding *line = (void *)pcu->cmd_buf;
1761 	int error;
1762 
1763 	memset(line, 0, sizeof(*line));
1764 	line->dwDTERate = cpu_to_le32(57600);
1765 	line->bDataBits = 8;
1766 
1767 	error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0),
1768 				USB_CDC_REQ_SET_LINE_CODING,
1769 				USB_TYPE_CLASS | USB_RECIP_INTERFACE,
1770 				0, interface->desc.bInterfaceNumber,
1771 				line, sizeof(struct usb_cdc_line_coding),
1772 				5000);
1773 	if (error < 0) {
1774 		dev_err(pcu->dev, "Failed to set line coding, error: %d\n",
1775 			error);
1776 		return error;
1777 	}
1778 
1779 	error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0),
1780 				USB_CDC_REQ_SET_CONTROL_LINE_STATE,
1781 				USB_TYPE_CLASS | USB_RECIP_INTERFACE,
1782 				0x03, interface->desc.bInterfaceNumber,
1783 				NULL, 0, 5000);
1784 	if (error < 0) {
1785 		dev_err(pcu->dev, "Failed to set line state, error: %d\n",
1786 			error);
1787 		return error;
1788 	}
1789 
1790 	return 0;
1791 }
1792 
ims_pcu_get_device_info(struct ims_pcu * pcu)1793 static int ims_pcu_get_device_info(struct ims_pcu *pcu)
1794 {
1795 	int error;
1796 
1797 	error = ims_pcu_get_info(pcu);
1798 	if (error)
1799 		return error;
1800 
1801 	error = ims_pcu_execute_query(pcu, GET_FW_VERSION);
1802 	if (error) {
1803 		dev_err(pcu->dev,
1804 			"GET_FW_VERSION command failed, error: %d\n", error);
1805 		return error;
1806 	}
1807 
1808 	snprintf(pcu->fw_version, sizeof(pcu->fw_version),
1809 		 "%02d%02d%02d%02d.%c%c",
1810 		 pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5],
1811 		 pcu->cmd_buf[6], pcu->cmd_buf[7]);
1812 
1813 	error = ims_pcu_execute_query(pcu, GET_BL_VERSION);
1814 	if (error) {
1815 		dev_err(pcu->dev,
1816 			"GET_BL_VERSION command failed, error: %d\n", error);
1817 		return error;
1818 	}
1819 
1820 	snprintf(pcu->bl_version, sizeof(pcu->bl_version),
1821 		 "%02d%02d%02d%02d.%c%c",
1822 		 pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5],
1823 		 pcu->cmd_buf[6], pcu->cmd_buf[7]);
1824 
1825 	error = ims_pcu_execute_query(pcu, RESET_REASON);
1826 	if (error) {
1827 		dev_err(pcu->dev,
1828 			"RESET_REASON command failed, error: %d\n", error);
1829 		return error;
1830 	}
1831 
1832 	snprintf(pcu->reset_reason, sizeof(pcu->reset_reason),
1833 		 "%02x", pcu->cmd_buf[IMS_PCU_DATA_OFFSET]);
1834 
1835 	dev_dbg(pcu->dev,
1836 		"P/N: %s, MD: %s, S/N: %s, FW: %s, BL: %s, RR: %s\n",
1837 		pcu->part_number,
1838 		pcu->date_of_manufacturing,
1839 		pcu->serial_number,
1840 		pcu->fw_version,
1841 		pcu->bl_version,
1842 		pcu->reset_reason);
1843 
1844 	return 0;
1845 }
1846 
ims_pcu_identify_type(struct ims_pcu * pcu,u8 * device_id)1847 static int ims_pcu_identify_type(struct ims_pcu *pcu, u8 *device_id)
1848 {
1849 	int error;
1850 
1851 	error = ims_pcu_execute_query(pcu, GET_DEVICE_ID);
1852 	if (error) {
1853 		dev_err(pcu->dev,
1854 			"GET_DEVICE_ID command failed, error: %d\n", error);
1855 		return error;
1856 	}
1857 
1858 	*device_id = pcu->cmd_buf[IMS_PCU_DATA_OFFSET];
1859 	dev_dbg(pcu->dev, "Detected device ID: %d\n", *device_id);
1860 
1861 	return 0;
1862 }
1863 
ims_pcu_init_application_mode(struct ims_pcu * pcu)1864 static int ims_pcu_init_application_mode(struct ims_pcu *pcu)
1865 {
1866 	static atomic_t device_no = ATOMIC_INIT(-1);
1867 
1868 	const struct ims_pcu_device_info *info;
1869 	int error;
1870 
1871 	error = ims_pcu_get_device_info(pcu);
1872 	if (error) {
1873 		/* Device does not respond to basic queries, hopeless */
1874 		return error;
1875 	}
1876 
1877 	error = ims_pcu_identify_type(pcu, &pcu->device_id);
1878 	if (error) {
1879 		dev_err(pcu->dev,
1880 			"Failed to identify device, error: %d\n", error);
1881 		/*
1882 		 * Do not signal error, but do not create input nor
1883 		 * backlight devices either, let userspace figure this
1884 		 * out (flash a new firmware?).
1885 		 */
1886 		return 0;
1887 	}
1888 
1889 	if (pcu->device_id >= ARRAY_SIZE(ims_pcu_device_info) ||
1890 	    !ims_pcu_device_info[pcu->device_id].keymap) {
1891 		dev_err(pcu->dev, "Device ID %d is not valid\n", pcu->device_id);
1892 		/* Same as above, punt to userspace */
1893 		return 0;
1894 	}
1895 
1896 	/* Device appears to be operable, complete initialization */
1897 	pcu->device_no = atomic_inc_return(&device_no);
1898 
1899 	error = ims_pcu_setup_backlight(pcu);
1900 	if (error)
1901 		return error;
1902 
1903 	info = &ims_pcu_device_info[pcu->device_id];
1904 	error = ims_pcu_setup_buttons(pcu, info->keymap, info->keymap_len);
1905 	if (error)
1906 		goto err_destroy_backlight;
1907 
1908 	if (info->has_gamepad) {
1909 		error = ims_pcu_setup_gamepad(pcu);
1910 		if (error)
1911 			goto err_destroy_buttons;
1912 	}
1913 
1914 	pcu->setup_complete = true;
1915 
1916 	return 0;
1917 
1918 err_destroy_buttons:
1919 	ims_pcu_destroy_buttons(pcu);
1920 err_destroy_backlight:
1921 	ims_pcu_destroy_backlight(pcu);
1922 	return error;
1923 }
1924 
ims_pcu_destroy_application_mode(struct ims_pcu * pcu)1925 static void ims_pcu_destroy_application_mode(struct ims_pcu *pcu)
1926 {
1927 	if (pcu->setup_complete) {
1928 		pcu->setup_complete = false;
1929 		mb(); /* make sure flag setting is not reordered */
1930 
1931 		if (pcu->gamepad)
1932 			ims_pcu_destroy_gamepad(pcu);
1933 		ims_pcu_destroy_buttons(pcu);
1934 		ims_pcu_destroy_backlight(pcu);
1935 	}
1936 }
1937 
ims_pcu_init_bootloader_mode(struct ims_pcu * pcu)1938 static int ims_pcu_init_bootloader_mode(struct ims_pcu *pcu)
1939 {
1940 	int error;
1941 
1942 	error = ims_pcu_execute_bl_command(pcu, QUERY_DEVICE, NULL, 0,
1943 					   IMS_PCU_CMD_RESPONSE_TIMEOUT);
1944 	if (error) {
1945 		dev_err(pcu->dev, "Bootloader does not respond, aborting\n");
1946 		return error;
1947 	}
1948 
1949 	pcu->fw_start_addr =
1950 		get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 11]);
1951 	pcu->fw_end_addr =
1952 		get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 15]);
1953 
1954 	dev_info(pcu->dev,
1955 		 "Device is in bootloader mode (addr 0x%08x-0x%08x), requesting firmware\n",
1956 		 pcu->fw_start_addr, pcu->fw_end_addr);
1957 
1958 	error = request_firmware_nowait(THIS_MODULE, true,
1959 					IMS_PCU_FIRMWARE_NAME,
1960 					pcu->dev, GFP_KERNEL, pcu,
1961 					ims_pcu_process_async_firmware);
1962 	if (error) {
1963 		/* This error is not fatal, let userspace have another chance */
1964 		complete(&pcu->async_firmware_done);
1965 	}
1966 
1967 	return 0;
1968 }
1969 
ims_pcu_destroy_bootloader_mode(struct ims_pcu * pcu)1970 static void ims_pcu_destroy_bootloader_mode(struct ims_pcu *pcu)
1971 {
1972 	/* Make sure our initial firmware request has completed */
1973 	wait_for_completion(&pcu->async_firmware_done);
1974 }
1975 
1976 #define IMS_PCU_APPLICATION_MODE	0
1977 #define IMS_PCU_BOOTLOADER_MODE		1
1978 
1979 static struct usb_driver ims_pcu_driver;
1980 
ims_pcu_probe(struct usb_interface * intf,const struct usb_device_id * id)1981 static int ims_pcu_probe(struct usb_interface *intf,
1982 			 const struct usb_device_id *id)
1983 {
1984 	struct usb_device *udev = interface_to_usbdev(intf);
1985 	struct ims_pcu *pcu;
1986 	int error;
1987 
1988 	pcu = kzalloc(sizeof(*pcu), GFP_KERNEL);
1989 	if (!pcu)
1990 		return -ENOMEM;
1991 
1992 	pcu->dev = &intf->dev;
1993 	pcu->udev = udev;
1994 	pcu->bootloader_mode = id->driver_info == IMS_PCU_BOOTLOADER_MODE;
1995 	mutex_init(&pcu->cmd_mutex);
1996 	init_completion(&pcu->cmd_done);
1997 	init_completion(&pcu->async_firmware_done);
1998 
1999 	error = ims_pcu_parse_cdc_data(intf, pcu);
2000 	if (error)
2001 		goto err_free_mem;
2002 
2003 	error = usb_driver_claim_interface(&ims_pcu_driver,
2004 					   pcu->data_intf, pcu);
2005 	if (error) {
2006 		dev_err(&intf->dev,
2007 			"Unable to claim corresponding data interface: %d\n",
2008 			error);
2009 		goto err_free_mem;
2010 	}
2011 
2012 	usb_set_intfdata(pcu->ctrl_intf, pcu);
2013 
2014 	error = ims_pcu_buffers_alloc(pcu);
2015 	if (error)
2016 		goto err_unclaim_intf;
2017 
2018 	error = ims_pcu_start_io(pcu);
2019 	if (error)
2020 		goto err_free_buffers;
2021 
2022 	error = ims_pcu_line_setup(pcu);
2023 	if (error)
2024 		goto err_stop_io;
2025 
2026 	error = pcu->bootloader_mode ?
2027 			ims_pcu_init_bootloader_mode(pcu) :
2028 			ims_pcu_init_application_mode(pcu);
2029 	if (error)
2030 		goto err_stop_io;
2031 
2032 	return 0;
2033 
2034 err_stop_io:
2035 	ims_pcu_stop_io(pcu);
2036 err_free_buffers:
2037 	ims_pcu_buffers_free(pcu);
2038 err_unclaim_intf:
2039 	usb_driver_release_interface(&ims_pcu_driver, pcu->data_intf);
2040 err_free_mem:
2041 	kfree(pcu);
2042 	return error;
2043 }
2044 
ims_pcu_disconnect(struct usb_interface * intf)2045 static void ims_pcu_disconnect(struct usb_interface *intf)
2046 {
2047 	struct ims_pcu *pcu = usb_get_intfdata(intf);
2048 	struct usb_host_interface *alt = intf->cur_altsetting;
2049 
2050 	usb_set_intfdata(intf, NULL);
2051 
2052 	/*
2053 	 * See if we are dealing with control or data interface. The cleanup
2054 	 * happens when we unbind primary (control) interface.
2055 	 */
2056 	if (alt->desc.bInterfaceClass != USB_CLASS_COMM)
2057 		return;
2058 
2059 	ims_pcu_stop_io(pcu);
2060 
2061 	if (pcu->bootloader_mode)
2062 		ims_pcu_destroy_bootloader_mode(pcu);
2063 	else
2064 		ims_pcu_destroy_application_mode(pcu);
2065 
2066 	ims_pcu_buffers_free(pcu);
2067 	kfree(pcu);
2068 }
2069 
2070 #ifdef CONFIG_PM
ims_pcu_suspend(struct usb_interface * intf,pm_message_t message)2071 static int ims_pcu_suspend(struct usb_interface *intf,
2072 			   pm_message_t message)
2073 {
2074 	struct ims_pcu *pcu = usb_get_intfdata(intf);
2075 	struct usb_host_interface *alt = intf->cur_altsetting;
2076 
2077 	if (alt->desc.bInterfaceClass == USB_CLASS_COMM)
2078 		ims_pcu_stop_io(pcu);
2079 
2080 	return 0;
2081 }
2082 
ims_pcu_resume(struct usb_interface * intf)2083 static int ims_pcu_resume(struct usb_interface *intf)
2084 {
2085 	struct ims_pcu *pcu = usb_get_intfdata(intf);
2086 	struct usb_host_interface *alt = intf->cur_altsetting;
2087 	int retval = 0;
2088 
2089 	if (alt->desc.bInterfaceClass == USB_CLASS_COMM) {
2090 		retval = ims_pcu_start_io(pcu);
2091 		if (retval == 0)
2092 			retval = ims_pcu_line_setup(pcu);
2093 	}
2094 
2095 	return retval;
2096 }
2097 #endif
2098 
2099 static const struct usb_device_id ims_pcu_id_table[] = {
2100 	{
2101 		USB_DEVICE_AND_INTERFACE_INFO(0x04d8, 0x0082,
2102 					USB_CLASS_COMM,
2103 					USB_CDC_SUBCLASS_ACM,
2104 					USB_CDC_ACM_PROTO_AT_V25TER),
2105 		.driver_info = IMS_PCU_APPLICATION_MODE,
2106 	},
2107 	{
2108 		USB_DEVICE_AND_INTERFACE_INFO(0x04d8, 0x0083,
2109 					USB_CLASS_COMM,
2110 					USB_CDC_SUBCLASS_ACM,
2111 					USB_CDC_ACM_PROTO_AT_V25TER),
2112 		.driver_info = IMS_PCU_BOOTLOADER_MODE,
2113 	},
2114 	{ }
2115 };
2116 
2117 static const struct attribute_group *ims_pcu_sysfs_groups[] = {
2118 	&ims_pcu_attr_group,
2119 	&ims_pcu_ofn_attr_group,
2120 	NULL
2121 };
2122 
2123 static struct usb_driver ims_pcu_driver = {
2124 	.name			= "ims_pcu",
2125 	.id_table		= ims_pcu_id_table,
2126 	.dev_groups		= ims_pcu_sysfs_groups,
2127 	.probe			= ims_pcu_probe,
2128 	.disconnect		= ims_pcu_disconnect,
2129 #ifdef CONFIG_PM
2130 	.suspend		= ims_pcu_suspend,
2131 	.resume			= ims_pcu_resume,
2132 	.reset_resume		= ims_pcu_resume,
2133 #endif
2134 };
2135 
2136 module_usb_driver(ims_pcu_driver);
2137 
2138 MODULE_DESCRIPTION("IMS Passenger Control Unit driver");
2139 MODULE_AUTHOR("Dmitry Torokhov <dmitry.torokhov@gmail.com>");
2140 MODULE_LICENSE("GPL");
2141