xref: /openbmc/linux/drivers/hid/hid-mcp2221.c (revision 55fd7e02)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * MCP2221A - Microchip USB to I2C Host Protocol Bridge
4  *
5  * Copyright (c) 2020, Rishi Gupta <gupt21@gmail.com>
6  *
7  * Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/20005565B.pdf
8  */
9 
10 #include <linux/module.h>
11 #include <linux/err.h>
12 #include <linux/mutex.h>
13 #include <linux/completion.h>
14 #include <linux/delay.h>
15 #include <linux/hid.h>
16 #include <linux/hidraw.h>
17 #include <linux/i2c.h>
18 #include <linux/gpio/driver.h>
19 #include "hid-ids.h"
20 
21 /* Commands codes in a raw output report */
22 enum {
23 	MCP2221_I2C_WR_DATA = 0x90,
24 	MCP2221_I2C_WR_NO_STOP = 0x94,
25 	MCP2221_I2C_RD_DATA = 0x91,
26 	MCP2221_I2C_RD_RPT_START = 0x93,
27 	MCP2221_I2C_GET_DATA = 0x40,
28 	MCP2221_I2C_PARAM_OR_STATUS	= 0x10,
29 	MCP2221_I2C_SET_SPEED = 0x20,
30 	MCP2221_I2C_CANCEL = 0x10,
31 	MCP2221_GPIO_SET = 0x50,
32 	MCP2221_GPIO_GET = 0x51,
33 };
34 
35 /* Response codes in a raw input report */
36 enum {
37 	MCP2221_SUCCESS = 0x00,
38 	MCP2221_I2C_ENG_BUSY = 0x01,
39 	MCP2221_I2C_START_TOUT = 0x12,
40 	MCP2221_I2C_STOP_TOUT = 0x62,
41 	MCP2221_I2C_WRADDRL_TOUT = 0x23,
42 	MCP2221_I2C_WRDATA_TOUT = 0x44,
43 	MCP2221_I2C_WRADDRL_NACK = 0x25,
44 	MCP2221_I2C_MASK_ADDR_NACK = 0x40,
45 	MCP2221_I2C_WRADDRL_SEND = 0x21,
46 	MCP2221_I2C_ADDR_NACK = 0x25,
47 	MCP2221_I2C_READ_COMPL = 0x55,
48 	MCP2221_ALT_F_NOT_GPIOV = 0xEE,
49 	MCP2221_ALT_F_NOT_GPIOD = 0xEF,
50 };
51 
52 /*
53  * There is no way to distinguish responses. Therefore next command
54  * is sent only after response to previous has been received. Mutex
55  * lock is used for this purpose mainly.
56  */
57 struct mcp2221 {
58 	struct hid_device *hdev;
59 	struct i2c_adapter adapter;
60 	struct mutex lock;
61 	struct completion wait_in_report;
62 	u8 *rxbuf;
63 	u8 txbuf[64];
64 	int rxbuf_idx;
65 	int status;
66 	u8 cur_i2c_clk_div;
67 	struct gpio_chip *gc;
68 	u8 gp_idx;
69 	u8 gpio_dir;
70 };
71 
72 /*
73  * Default i2c bus clock frequency 400 kHz. Modify this if you
74  * want to set some other frequency (min 50 kHz - max 400 kHz).
75  */
76 static uint i2c_clk_freq = 400;
77 
78 /* Synchronously send output report to the device */
79 static int mcp_send_report(struct mcp2221 *mcp,
80 					u8 *out_report, size_t len)
81 {
82 	u8 *buf;
83 	int ret;
84 
85 	buf = kmemdup(out_report, len, GFP_KERNEL);
86 	if (!buf)
87 		return -ENOMEM;
88 
89 	/* mcp2221 uses interrupt endpoint for out reports */
90 	ret = hid_hw_output_report(mcp->hdev, buf, len);
91 	kfree(buf);
92 
93 	if (ret < 0)
94 		return ret;
95 	return 0;
96 }
97 
98 /*
99  * Send o/p report to the device and wait for i/p report to be
100  * received from the device. If the device does not respond,
101  * we timeout.
102  */
103 static int mcp_send_data_req_status(struct mcp2221 *mcp,
104 			u8 *out_report, int len)
105 {
106 	int ret;
107 	unsigned long t;
108 
109 	reinit_completion(&mcp->wait_in_report);
110 
111 	ret = mcp_send_report(mcp, out_report, len);
112 	if (ret)
113 		return ret;
114 
115 	t = wait_for_completion_timeout(&mcp->wait_in_report,
116 							msecs_to_jiffies(4000));
117 	if (!t)
118 		return -ETIMEDOUT;
119 
120 	return mcp->status;
121 }
122 
123 /* Check pass/fail for actual communication with i2c slave */
124 static int mcp_chk_last_cmd_status(struct mcp2221 *mcp)
125 {
126 	memset(mcp->txbuf, 0, 8);
127 	mcp->txbuf[0] = MCP2221_I2C_PARAM_OR_STATUS;
128 
129 	return mcp_send_data_req_status(mcp, mcp->txbuf, 8);
130 }
131 
132 /* Cancels last command releasing i2c bus just in case occupied */
133 static int mcp_cancel_last_cmd(struct mcp2221 *mcp)
134 {
135 	memset(mcp->txbuf, 0, 8);
136 	mcp->txbuf[0] = MCP2221_I2C_PARAM_OR_STATUS;
137 	mcp->txbuf[2] = MCP2221_I2C_CANCEL;
138 
139 	return mcp_send_data_req_status(mcp, mcp->txbuf, 8);
140 }
141 
142 static int mcp_set_i2c_speed(struct mcp2221 *mcp)
143 {
144 	int ret;
145 
146 	memset(mcp->txbuf, 0, 8);
147 	mcp->txbuf[0] = MCP2221_I2C_PARAM_OR_STATUS;
148 	mcp->txbuf[3] = MCP2221_I2C_SET_SPEED;
149 	mcp->txbuf[4] = mcp->cur_i2c_clk_div;
150 
151 	ret = mcp_send_data_req_status(mcp, mcp->txbuf, 8);
152 	if (ret) {
153 		/* Small delay is needed here */
154 		usleep_range(980, 1000);
155 		mcp_cancel_last_cmd(mcp);
156 	}
157 
158 	return 0;
159 }
160 
161 /*
162  * An output report can contain minimum 1 and maximum 60 user data
163  * bytes. If the number of data bytes is more then 60, we send it
164  * in chunks of 60 bytes. Last chunk may contain exactly 60 or less
165  * bytes. Total number of bytes is informed in very first report to
166  * mcp2221, from that point onwards it first collect all the data
167  * from host and then send to i2c slave device.
168  */
169 static int mcp_i2c_write(struct mcp2221 *mcp,
170 				struct i2c_msg *msg, int type, u8 last_status)
171 {
172 	int ret, len, idx, sent;
173 
174 	idx = 0;
175 	sent  = 0;
176 	if (msg->len < 60)
177 		len = msg->len;
178 	else
179 		len = 60;
180 
181 	do {
182 		mcp->txbuf[0] = type;
183 		mcp->txbuf[1] = msg->len & 0xff;
184 		mcp->txbuf[2] = msg->len >> 8;
185 		mcp->txbuf[3] = (u8)(msg->addr << 1);
186 
187 		memcpy(&mcp->txbuf[4], &msg->buf[idx], len);
188 
189 		ret = mcp_send_data_req_status(mcp, mcp->txbuf, len + 4);
190 		if (ret)
191 			return ret;
192 
193 		usleep_range(980, 1000);
194 
195 		if (last_status) {
196 			ret = mcp_chk_last_cmd_status(mcp);
197 			if (ret)
198 				return ret;
199 		}
200 
201 		sent = sent + len;
202 		if (sent >= msg->len)
203 			break;
204 
205 		idx = idx + len;
206 		if ((msg->len - sent) < 60)
207 			len = msg->len - sent;
208 		else
209 			len = 60;
210 
211 		/*
212 		 * Testing shows delay is needed between successive writes
213 		 * otherwise next write fails on first-try from i2c core.
214 		 * This value is obtained through automated stress testing.
215 		 */
216 		usleep_range(980, 1000);
217 	} while (len > 0);
218 
219 	return ret;
220 }
221 
222 /*
223  * Device reads all data (0 - 65535 bytes) from i2c slave device and
224  * stores it in device itself. This data is read back from device to
225  * host in multiples of 60 bytes using input reports.
226  */
227 static int mcp_i2c_smbus_read(struct mcp2221 *mcp,
228 				struct i2c_msg *msg, int type, u16 smbus_addr,
229 				u8 smbus_len, u8 *smbus_buf)
230 {
231 	int ret;
232 	u16 total_len;
233 
234 	mcp->txbuf[0] = type;
235 	if (msg) {
236 		mcp->txbuf[1] = msg->len & 0xff;
237 		mcp->txbuf[2] = msg->len >> 8;
238 		mcp->txbuf[3] = (u8)(msg->addr << 1);
239 		total_len = msg->len;
240 		mcp->rxbuf = msg->buf;
241 	} else {
242 		mcp->txbuf[1] = smbus_len;
243 		mcp->txbuf[2] = 0;
244 		mcp->txbuf[3] = (u8)(smbus_addr << 1);
245 		total_len = smbus_len;
246 		mcp->rxbuf = smbus_buf;
247 	}
248 
249 	ret = mcp_send_data_req_status(mcp, mcp->txbuf, 4);
250 	if (ret)
251 		return ret;
252 
253 	mcp->rxbuf_idx = 0;
254 
255 	do {
256 		memset(mcp->txbuf, 0, 4);
257 		mcp->txbuf[0] = MCP2221_I2C_GET_DATA;
258 
259 		ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
260 		if (ret)
261 			return ret;
262 
263 		ret = mcp_chk_last_cmd_status(mcp);
264 		if (ret)
265 			return ret;
266 
267 		usleep_range(980, 1000);
268 	} while (mcp->rxbuf_idx < total_len);
269 
270 	return ret;
271 }
272 
273 static int mcp_i2c_xfer(struct i2c_adapter *adapter,
274 				struct i2c_msg msgs[], int num)
275 {
276 	int ret;
277 	struct mcp2221 *mcp = i2c_get_adapdata(adapter);
278 
279 	hid_hw_power(mcp->hdev, PM_HINT_FULLON);
280 
281 	mutex_lock(&mcp->lock);
282 
283 	/* Setting speed before every transaction is required for mcp2221 */
284 	ret = mcp_set_i2c_speed(mcp);
285 	if (ret)
286 		goto exit;
287 
288 	if (num == 1) {
289 		if (msgs->flags & I2C_M_RD) {
290 			ret = mcp_i2c_smbus_read(mcp, msgs, MCP2221_I2C_RD_DATA,
291 							0, 0, NULL);
292 		} else {
293 			ret = mcp_i2c_write(mcp, msgs, MCP2221_I2C_WR_DATA, 1);
294 		}
295 		if (ret)
296 			goto exit;
297 		ret = num;
298 	} else if (num == 2) {
299 		/* Ex transaction; send reg address and read its contents */
300 		if (msgs[0].addr == msgs[1].addr &&
301 			!(msgs[0].flags & I2C_M_RD) &&
302 			 (msgs[1].flags & I2C_M_RD)) {
303 
304 			ret = mcp_i2c_write(mcp, &msgs[0],
305 						MCP2221_I2C_WR_NO_STOP, 0);
306 			if (ret)
307 				goto exit;
308 
309 			ret = mcp_i2c_smbus_read(mcp, &msgs[1],
310 						MCP2221_I2C_RD_RPT_START,
311 						0, 0, NULL);
312 			if (ret)
313 				goto exit;
314 			ret = num;
315 		} else {
316 			dev_err(&adapter->dev,
317 				"unsupported multi-msg i2c transaction\n");
318 			ret = -EOPNOTSUPP;
319 		}
320 	} else {
321 		dev_err(&adapter->dev,
322 			"unsupported multi-msg i2c transaction\n");
323 		ret = -EOPNOTSUPP;
324 	}
325 
326 exit:
327 	hid_hw_power(mcp->hdev, PM_HINT_NORMAL);
328 	mutex_unlock(&mcp->lock);
329 	return ret;
330 }
331 
332 static int mcp_smbus_write(struct mcp2221 *mcp, u16 addr,
333 				u8 command, u8 *buf, u8 len, int type,
334 				u8 last_status)
335 {
336 	int data_len, ret;
337 
338 	mcp->txbuf[0] = type;
339 	mcp->txbuf[1] = len + 1; /* 1 is due to command byte itself */
340 	mcp->txbuf[2] = 0;
341 	mcp->txbuf[3] = (u8)(addr << 1);
342 	mcp->txbuf[4] = command;
343 
344 	switch (len) {
345 	case 0:
346 		data_len = 5;
347 		break;
348 	case 1:
349 		mcp->txbuf[5] = buf[0];
350 		data_len = 6;
351 		break;
352 	case 2:
353 		mcp->txbuf[5] = buf[0];
354 		mcp->txbuf[6] = buf[1];
355 		data_len = 7;
356 		break;
357 	default:
358 		memcpy(&mcp->txbuf[5], buf, len);
359 		data_len = len + 5;
360 	}
361 
362 	ret = mcp_send_data_req_status(mcp, mcp->txbuf, data_len);
363 	if (ret)
364 		return ret;
365 
366 	if (last_status) {
367 		usleep_range(980, 1000);
368 
369 		ret = mcp_chk_last_cmd_status(mcp);
370 		if (ret)
371 			return ret;
372 	}
373 
374 	return ret;
375 }
376 
377 static int mcp_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
378 				unsigned short flags, char read_write,
379 				u8 command, int size,
380 				union i2c_smbus_data *data)
381 {
382 	int ret;
383 	struct mcp2221 *mcp = i2c_get_adapdata(adapter);
384 
385 	hid_hw_power(mcp->hdev, PM_HINT_FULLON);
386 
387 	mutex_lock(&mcp->lock);
388 
389 	ret = mcp_set_i2c_speed(mcp);
390 	if (ret)
391 		goto exit;
392 
393 	switch (size) {
394 
395 	case I2C_SMBUS_QUICK:
396 		if (read_write == I2C_SMBUS_READ)
397 			ret = mcp_i2c_smbus_read(mcp, NULL, MCP2221_I2C_RD_DATA,
398 						addr, 0, &data->byte);
399 		else
400 			ret = mcp_smbus_write(mcp, addr, command, NULL,
401 						0, MCP2221_I2C_WR_DATA, 1);
402 		break;
403 	case I2C_SMBUS_BYTE:
404 		if (read_write == I2C_SMBUS_READ)
405 			ret = mcp_i2c_smbus_read(mcp, NULL, MCP2221_I2C_RD_DATA,
406 						addr, 1, &data->byte);
407 		else
408 			ret = mcp_smbus_write(mcp, addr, command, NULL,
409 						0, MCP2221_I2C_WR_DATA, 1);
410 		break;
411 	case I2C_SMBUS_BYTE_DATA:
412 		if (read_write == I2C_SMBUS_READ) {
413 			ret = mcp_smbus_write(mcp, addr, command, NULL,
414 						0, MCP2221_I2C_WR_NO_STOP, 0);
415 			if (ret)
416 				goto exit;
417 
418 			ret = mcp_i2c_smbus_read(mcp, NULL,
419 						MCP2221_I2C_RD_RPT_START,
420 						addr, 1, &data->byte);
421 		} else {
422 			ret = mcp_smbus_write(mcp, addr, command, &data->byte,
423 						1, MCP2221_I2C_WR_DATA, 1);
424 		}
425 		break;
426 	case I2C_SMBUS_WORD_DATA:
427 		if (read_write == I2C_SMBUS_READ) {
428 			ret = mcp_smbus_write(mcp, addr, command, NULL,
429 						0, MCP2221_I2C_WR_NO_STOP, 0);
430 			if (ret)
431 				goto exit;
432 
433 			ret = mcp_i2c_smbus_read(mcp, NULL,
434 						MCP2221_I2C_RD_RPT_START,
435 						addr, 2, (u8 *)&data->word);
436 		} else {
437 			ret = mcp_smbus_write(mcp, addr, command,
438 						(u8 *)&data->word, 2,
439 						MCP2221_I2C_WR_DATA, 1);
440 		}
441 		break;
442 	case I2C_SMBUS_BLOCK_DATA:
443 		if (read_write == I2C_SMBUS_READ) {
444 			ret = mcp_smbus_write(mcp, addr, command, NULL,
445 						0, MCP2221_I2C_WR_NO_STOP, 1);
446 			if (ret)
447 				goto exit;
448 
449 			mcp->rxbuf_idx = 0;
450 			mcp->rxbuf = data->block;
451 			mcp->txbuf[0] = MCP2221_I2C_GET_DATA;
452 			ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
453 			if (ret)
454 				goto exit;
455 		} else {
456 			if (!data->block[0]) {
457 				ret = -EINVAL;
458 				goto exit;
459 			}
460 			ret = mcp_smbus_write(mcp, addr, command, data->block,
461 						data->block[0] + 1,
462 						MCP2221_I2C_WR_DATA, 1);
463 		}
464 		break;
465 	case I2C_SMBUS_I2C_BLOCK_DATA:
466 		if (read_write == I2C_SMBUS_READ) {
467 			ret = mcp_smbus_write(mcp, addr, command, NULL,
468 						0, MCP2221_I2C_WR_NO_STOP, 1);
469 			if (ret)
470 				goto exit;
471 
472 			mcp->rxbuf_idx = 0;
473 			mcp->rxbuf = data->block;
474 			mcp->txbuf[0] = MCP2221_I2C_GET_DATA;
475 			ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
476 			if (ret)
477 				goto exit;
478 		} else {
479 			if (!data->block[0]) {
480 				ret = -EINVAL;
481 				goto exit;
482 			}
483 			ret = mcp_smbus_write(mcp, addr, command,
484 						&data->block[1], data->block[0],
485 						MCP2221_I2C_WR_DATA, 1);
486 		}
487 		break;
488 	case I2C_SMBUS_PROC_CALL:
489 		ret = mcp_smbus_write(mcp, addr, command,
490 						(u8 *)&data->word,
491 						2, MCP2221_I2C_WR_NO_STOP, 0);
492 		if (ret)
493 			goto exit;
494 
495 		ret = mcp_i2c_smbus_read(mcp, NULL,
496 						MCP2221_I2C_RD_RPT_START,
497 						addr, 2, (u8 *)&data->word);
498 		break;
499 	case I2C_SMBUS_BLOCK_PROC_CALL:
500 		ret = mcp_smbus_write(mcp, addr, command, data->block,
501 						data->block[0] + 1,
502 						MCP2221_I2C_WR_NO_STOP, 0);
503 		if (ret)
504 			goto exit;
505 
506 		ret = mcp_i2c_smbus_read(mcp, NULL,
507 						MCP2221_I2C_RD_RPT_START,
508 						addr, I2C_SMBUS_BLOCK_MAX,
509 						data->block);
510 		break;
511 	default:
512 		dev_err(&mcp->adapter.dev,
513 			"unsupported smbus transaction size:%d\n", size);
514 		ret = -EOPNOTSUPP;
515 	}
516 
517 exit:
518 	hid_hw_power(mcp->hdev, PM_HINT_NORMAL);
519 	mutex_unlock(&mcp->lock);
520 	return ret;
521 }
522 
523 static u32 mcp_i2c_func(struct i2c_adapter *adapter)
524 {
525 	return I2C_FUNC_I2C |
526 			I2C_FUNC_SMBUS_READ_BLOCK_DATA |
527 			I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
528 			(I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_PEC);
529 }
530 
531 static const struct i2c_algorithm mcp_i2c_algo = {
532 	.master_xfer = mcp_i2c_xfer,
533 	.smbus_xfer = mcp_smbus_xfer,
534 	.functionality = mcp_i2c_func,
535 };
536 
537 static int mcp_gpio_get(struct gpio_chip *gc,
538 				unsigned int offset)
539 {
540 	int ret;
541 	struct mcp2221 *mcp = gpiochip_get_data(gc);
542 
543 	mcp->txbuf[0] = MCP2221_GPIO_GET;
544 
545 	mcp->gp_idx = (offset + 1) * 2;
546 
547 	mutex_lock(&mcp->lock);
548 	ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
549 	mutex_unlock(&mcp->lock);
550 
551 	return ret;
552 }
553 
554 static void mcp_gpio_set(struct gpio_chip *gc,
555 				unsigned int offset, int value)
556 {
557 	struct mcp2221 *mcp = gpiochip_get_data(gc);
558 
559 	memset(mcp->txbuf, 0, 18);
560 	mcp->txbuf[0] = MCP2221_GPIO_SET;
561 
562 	mcp->gp_idx = ((offset + 1) * 4) - 1;
563 
564 	mcp->txbuf[mcp->gp_idx - 1] = 1;
565 	mcp->txbuf[mcp->gp_idx] = !!value;
566 
567 	mutex_lock(&mcp->lock);
568 	mcp_send_data_req_status(mcp, mcp->txbuf, 18);
569 	mutex_unlock(&mcp->lock);
570 }
571 
572 static int mcp_gpio_dir_set(struct mcp2221 *mcp,
573 				unsigned int offset, u8 val)
574 {
575 	memset(mcp->txbuf, 0, 18);
576 	mcp->txbuf[0] = MCP2221_GPIO_SET;
577 
578 	mcp->gp_idx = (offset + 1) * 5;
579 
580 	mcp->txbuf[mcp->gp_idx - 1] = 1;
581 	mcp->txbuf[mcp->gp_idx] = val;
582 
583 	return mcp_send_data_req_status(mcp, mcp->txbuf, 18);
584 }
585 
586 static int mcp_gpio_direction_input(struct gpio_chip *gc,
587 				unsigned int offset)
588 {
589 	int ret;
590 	struct mcp2221 *mcp = gpiochip_get_data(gc);
591 
592 	mutex_lock(&mcp->lock);
593 	ret = mcp_gpio_dir_set(mcp, offset, 0);
594 	mutex_unlock(&mcp->lock);
595 
596 	return ret;
597 }
598 
599 static int mcp_gpio_direction_output(struct gpio_chip *gc,
600 				unsigned int offset, int value)
601 {
602 	int ret;
603 	struct mcp2221 *mcp = gpiochip_get_data(gc);
604 
605 	mutex_lock(&mcp->lock);
606 	ret = mcp_gpio_dir_set(mcp, offset, 1);
607 	mutex_unlock(&mcp->lock);
608 
609 	/* Can't configure as output, bailout early */
610 	if (ret)
611 		return ret;
612 
613 	mcp_gpio_set(gc, offset, value);
614 
615 	return 0;
616 }
617 
618 static int mcp_gpio_get_direction(struct gpio_chip *gc,
619 				unsigned int offset)
620 {
621 	int ret;
622 	struct mcp2221 *mcp = gpiochip_get_data(gc);
623 
624 	mcp->txbuf[0] = MCP2221_GPIO_GET;
625 
626 	mcp->gp_idx = (offset + 1) * 2;
627 
628 	mutex_lock(&mcp->lock);
629 	ret = mcp_send_data_req_status(mcp, mcp->txbuf, 1);
630 	mutex_unlock(&mcp->lock);
631 
632 	if (ret)
633 		return ret;
634 
635 	if (mcp->gpio_dir)
636 		return GPIO_LINE_DIRECTION_IN;
637 
638 	return GPIO_LINE_DIRECTION_OUT;
639 }
640 
641 /* Gives current state of i2c engine inside mcp2221 */
642 static int mcp_get_i2c_eng_state(struct mcp2221 *mcp,
643 				u8 *data, u8 idx)
644 {
645 	int ret;
646 
647 	switch (data[idx]) {
648 	case MCP2221_I2C_WRADDRL_NACK:
649 	case MCP2221_I2C_WRADDRL_SEND:
650 		ret = -ENXIO;
651 		break;
652 	case MCP2221_I2C_START_TOUT:
653 	case MCP2221_I2C_STOP_TOUT:
654 	case MCP2221_I2C_WRADDRL_TOUT:
655 	case MCP2221_I2C_WRDATA_TOUT:
656 		ret = -ETIMEDOUT;
657 		break;
658 	case MCP2221_I2C_ENG_BUSY:
659 		ret = -EAGAIN;
660 		break;
661 	case MCP2221_SUCCESS:
662 		ret = 0x00;
663 		break;
664 	default:
665 		ret = -EIO;
666 	}
667 
668 	return ret;
669 }
670 
671 /*
672  * MCP2221 uses interrupt endpoint for input reports. This function
673  * is called by HID layer when it receives i/p report from mcp2221,
674  * which is actually a response to the previously sent command.
675  *
676  * MCP2221A firmware specific return codes are parsed and 0 or
677  * appropriate negative error code is returned. Delayed response
678  * results in timeout error and stray reponses results in -EIO.
679  */
680 static int mcp2221_raw_event(struct hid_device *hdev,
681 				struct hid_report *report, u8 *data, int size)
682 {
683 	u8 *buf;
684 	struct mcp2221 *mcp = hid_get_drvdata(hdev);
685 
686 	switch (data[0]) {
687 
688 	case MCP2221_I2C_WR_DATA:
689 	case MCP2221_I2C_WR_NO_STOP:
690 	case MCP2221_I2C_RD_DATA:
691 	case MCP2221_I2C_RD_RPT_START:
692 		switch (data[1]) {
693 		case MCP2221_SUCCESS:
694 			mcp->status = 0;
695 			break;
696 		default:
697 			mcp->status = mcp_get_i2c_eng_state(mcp, data, 2);
698 		}
699 		complete(&mcp->wait_in_report);
700 		break;
701 
702 	case MCP2221_I2C_PARAM_OR_STATUS:
703 		switch (data[1]) {
704 		case MCP2221_SUCCESS:
705 			if ((mcp->txbuf[3] == MCP2221_I2C_SET_SPEED) &&
706 				(data[3] != MCP2221_I2C_SET_SPEED)) {
707 				mcp->status = -EAGAIN;
708 				break;
709 			}
710 			if (data[20] & MCP2221_I2C_MASK_ADDR_NACK) {
711 				mcp->status = -ENXIO;
712 				break;
713 			}
714 			mcp->status = mcp_get_i2c_eng_state(mcp, data, 8);
715 			break;
716 		default:
717 			mcp->status = -EIO;
718 		}
719 		complete(&mcp->wait_in_report);
720 		break;
721 
722 	case MCP2221_I2C_GET_DATA:
723 		switch (data[1]) {
724 		case MCP2221_SUCCESS:
725 			if (data[2] == MCP2221_I2C_ADDR_NACK) {
726 				mcp->status = -ENXIO;
727 				break;
728 			}
729 			if (!mcp_get_i2c_eng_state(mcp, data, 2)
730 				&& (data[3] == 0)) {
731 				mcp->status = 0;
732 				break;
733 			}
734 			if (data[3] == 127) {
735 				mcp->status = -EIO;
736 				break;
737 			}
738 			if (data[2] == MCP2221_I2C_READ_COMPL) {
739 				buf = mcp->rxbuf;
740 				memcpy(&buf[mcp->rxbuf_idx], &data[4], data[3]);
741 				mcp->rxbuf_idx = mcp->rxbuf_idx + data[3];
742 				mcp->status = 0;
743 				break;
744 			}
745 			mcp->status = -EIO;
746 			break;
747 		default:
748 			mcp->status = -EIO;
749 		}
750 		complete(&mcp->wait_in_report);
751 		break;
752 
753 	case MCP2221_GPIO_GET:
754 		switch (data[1]) {
755 		case MCP2221_SUCCESS:
756 			if ((data[mcp->gp_idx] == MCP2221_ALT_F_NOT_GPIOV) ||
757 				(data[mcp->gp_idx + 1] == MCP2221_ALT_F_NOT_GPIOD)) {
758 				mcp->status = -ENOENT;
759 			} else {
760 				mcp->status = !!data[mcp->gp_idx];
761 				mcp->gpio_dir = !!data[mcp->gp_idx + 1];
762 			}
763 			break;
764 		default:
765 			mcp->status = -EAGAIN;
766 		}
767 		complete(&mcp->wait_in_report);
768 		break;
769 
770 	case MCP2221_GPIO_SET:
771 		switch (data[1]) {
772 		case MCP2221_SUCCESS:
773 			if ((data[mcp->gp_idx] == MCP2221_ALT_F_NOT_GPIOV) ||
774 				(data[mcp->gp_idx - 1] == MCP2221_ALT_F_NOT_GPIOV)) {
775 				mcp->status = -ENOENT;
776 			} else {
777 				mcp->status = 0;
778 			}
779 			break;
780 		default:
781 			mcp->status = -EAGAIN;
782 		}
783 		complete(&mcp->wait_in_report);
784 		break;
785 
786 	default:
787 		mcp->status = -EIO;
788 		complete(&mcp->wait_in_report);
789 	}
790 
791 	return 1;
792 }
793 
794 static int mcp2221_probe(struct hid_device *hdev,
795 					const struct hid_device_id *id)
796 {
797 	int ret;
798 	struct mcp2221 *mcp;
799 
800 	mcp = devm_kzalloc(&hdev->dev, sizeof(*mcp), GFP_KERNEL);
801 	if (!mcp)
802 		return -ENOMEM;
803 
804 	ret = hid_parse(hdev);
805 	if (ret) {
806 		hid_err(hdev, "can't parse reports\n");
807 		return ret;
808 	}
809 
810 	ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
811 	if (ret) {
812 		hid_err(hdev, "can't start hardware\n");
813 		return ret;
814 	}
815 
816 	ret = hid_hw_open(hdev);
817 	if (ret) {
818 		hid_err(hdev, "can't open device\n");
819 		goto err_hstop;
820 	}
821 
822 	mutex_init(&mcp->lock);
823 	init_completion(&mcp->wait_in_report);
824 	hid_set_drvdata(hdev, mcp);
825 	mcp->hdev = hdev;
826 
827 	/* Set I2C bus clock diviser */
828 	if (i2c_clk_freq > 400)
829 		i2c_clk_freq = 400;
830 	if (i2c_clk_freq < 50)
831 		i2c_clk_freq = 50;
832 	mcp->cur_i2c_clk_div = (12000000 / (i2c_clk_freq * 1000)) - 3;
833 
834 	mcp->adapter.owner = THIS_MODULE;
835 	mcp->adapter.class = I2C_CLASS_HWMON;
836 	mcp->adapter.algo = &mcp_i2c_algo;
837 	mcp->adapter.retries = 1;
838 	mcp->adapter.dev.parent = &hdev->dev;
839 	snprintf(mcp->adapter.name, sizeof(mcp->adapter.name),
840 			"MCP2221 usb-i2c bridge on hidraw%d",
841 			((struct hidraw *)hdev->hidraw)->minor);
842 
843 	ret = i2c_add_adapter(&mcp->adapter);
844 	if (ret) {
845 		hid_err(hdev, "can't add usb-i2c adapter: %d\n", ret);
846 		goto err_i2c;
847 	}
848 	i2c_set_adapdata(&mcp->adapter, mcp);
849 
850 	/* Setup GPIO chip */
851 	mcp->gc = devm_kzalloc(&hdev->dev, sizeof(*mcp->gc), GFP_KERNEL);
852 	if (!mcp->gc) {
853 		ret = -ENOMEM;
854 		goto err_gc;
855 	}
856 
857 	mcp->gc->label = "mcp2221_gpio";
858 	mcp->gc->direction_input = mcp_gpio_direction_input;
859 	mcp->gc->direction_output = mcp_gpio_direction_output;
860 	mcp->gc->get_direction = mcp_gpio_get_direction;
861 	mcp->gc->set = mcp_gpio_set;
862 	mcp->gc->get = mcp_gpio_get;
863 	mcp->gc->ngpio = 4;
864 	mcp->gc->base = -1;
865 	mcp->gc->can_sleep = 1;
866 	mcp->gc->parent = &hdev->dev;
867 
868 	ret = devm_gpiochip_add_data(&hdev->dev, mcp->gc, mcp);
869 	if (ret)
870 		goto err_gc;
871 
872 	return 0;
873 
874 err_gc:
875 	i2c_del_adapter(&mcp->adapter);
876 err_i2c:
877 	hid_hw_close(mcp->hdev);
878 err_hstop:
879 	hid_hw_stop(mcp->hdev);
880 	return ret;
881 }
882 
883 static void mcp2221_remove(struct hid_device *hdev)
884 {
885 	struct mcp2221 *mcp = hid_get_drvdata(hdev);
886 
887 	i2c_del_adapter(&mcp->adapter);
888 	hid_hw_close(mcp->hdev);
889 	hid_hw_stop(mcp->hdev);
890 }
891 
892 static const struct hid_device_id mcp2221_devices[] = {
893 	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_MCP2221) },
894 	{ }
895 };
896 MODULE_DEVICE_TABLE(hid, mcp2221_devices);
897 
898 static struct hid_driver mcp2221_driver = {
899 	.name		= "mcp2221",
900 	.id_table	= mcp2221_devices,
901 	.probe		= mcp2221_probe,
902 	.remove		= mcp2221_remove,
903 	.raw_event	= mcp2221_raw_event,
904 };
905 
906 /* Register with HID core */
907 module_hid_driver(mcp2221_driver);
908 
909 MODULE_AUTHOR("Rishi Gupta <gupt21@gmail.com>");
910 MODULE_DESCRIPTION("MCP2221 Microchip HID USB to I2C master bridge");
911 MODULE_LICENSE("GPL v2");
912