]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blob - drivers/hid/hid-mcp2221.c
Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
[mirror_ubuntu-hirsute-kernel.git] / drivers / hid / hid-mcp2221.c
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: https://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");