1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * hid-cp2112.c - Silicon Labs HID USB to SMBus master bridge
4 * Copyright (c) 2013,2014 Uplogix, Inc.
5 * David Barksdale <dbarksdale@uplogix.com>
6 */
7
8/*
9 * The Silicon Labs CP2112 chip is a USB HID device which provides an
10 * SMBus controller for talking to slave devices and 8 GPIO pins. The
11 * host communicates with the CP2112 via raw HID reports.
12 *
13 * Data Sheet:
14 *   https://www.silabs.com/Support%20Documents/TechnicalDocs/CP2112.pdf
15 * Programming Interface Specification:
16 *   https://www.silabs.com/documents/public/application-notes/an495-cp2112-interface-specification.pdf
17 */
18
19#include <linux/bitops.h>
20#include <linux/gpio/driver.h>
21#include <linux/hid.h>
22#include <linux/hidraw.h>
23#include <linux/i2c.h>
24#include <linux/module.h>
25#include <linux/nls.h>
26#include <linux/string_choices.h>
27#include <linux/usb/ch9.h>
28#include "hid-ids.h"
29
30#define CP2112_REPORT_MAX_LENGTH		64
31#define CP2112_GPIO_CONFIG_LENGTH		5
32#define CP2112_GPIO_GET_LENGTH			2
33#define CP2112_GPIO_SET_LENGTH			3
34#define CP2112_GPIO_MAX_GPIO			8
35#define CP2112_GPIO_ALL_GPIO_MASK		GENMASK(7, 0)
36
37enum {
38	CP2112_GPIO_CONFIG		= 0x02,
39	CP2112_GPIO_GET			= 0x03,
40	CP2112_GPIO_SET			= 0x04,
41	CP2112_GET_VERSION_INFO		= 0x05,
42	CP2112_SMBUS_CONFIG		= 0x06,
43	CP2112_DATA_READ_REQUEST	= 0x10,
44	CP2112_DATA_WRITE_READ_REQUEST	= 0x11,
45	CP2112_DATA_READ_FORCE_SEND	= 0x12,
46	CP2112_DATA_READ_RESPONSE	= 0x13,
47	CP2112_DATA_WRITE_REQUEST	= 0x14,
48	CP2112_TRANSFER_STATUS_REQUEST	= 0x15,
49	CP2112_TRANSFER_STATUS_RESPONSE	= 0x16,
50	CP2112_CANCEL_TRANSFER		= 0x17,
51	CP2112_LOCK_BYTE		= 0x20,
52	CP2112_USB_CONFIG		= 0x21,
53	CP2112_MANUFACTURER_STRING	= 0x22,
54	CP2112_PRODUCT_STRING		= 0x23,
55	CP2112_SERIAL_STRING		= 0x24,
56};
57
58enum {
59	STATUS0_IDLE		= 0x00,
60	STATUS0_BUSY		= 0x01,
61	STATUS0_COMPLETE	= 0x02,
62	STATUS0_ERROR		= 0x03,
63};
64
65enum {
66	STATUS1_TIMEOUT_NACK		= 0x00,
67	STATUS1_TIMEOUT_BUS		= 0x01,
68	STATUS1_ARBITRATION_LOST	= 0x02,
69	STATUS1_READ_INCOMPLETE		= 0x03,
70	STATUS1_WRITE_INCOMPLETE	= 0x04,
71	STATUS1_SUCCESS			= 0x05,
72};
73
74struct cp2112_smbus_config_report {
75	u8 report;		/* CP2112_SMBUS_CONFIG */
76	__be32 clock_speed;	/* Hz */
77	u8 device_address;	/* Stored in the upper 7 bits */
78	u8 auto_send_read;	/* 1 = enabled, 0 = disabled */
79	__be16 write_timeout;	/* ms, 0 = no timeout */
80	__be16 read_timeout;	/* ms, 0 = no timeout */
81	u8 scl_low_timeout;	/* 1 = enabled, 0 = disabled */
82	__be16 retry_time;	/* # of retries, 0 = no limit */
83} __packed;
84
85struct cp2112_usb_config_report {
86	u8 report;	/* CP2112_USB_CONFIG */
87	__le16 vid;	/* Vendor ID */
88	__le16 pid;	/* Product ID */
89	u8 max_power;	/* Power requested in 2mA units */
90	u8 power_mode;	/* 0x00 = bus powered
91			   0x01 = self powered & regulator off
92			   0x02 = self powered & regulator on */
93	u8 release_major;
94	u8 release_minor;
95	u8 mask;	/* What fields to program */
96} __packed;
97
98struct cp2112_read_req_report {
99	u8 report;	/* CP2112_DATA_READ_REQUEST */
100	u8 slave_address;
101	__be16 length;
102} __packed;
103
104struct cp2112_write_read_req_report {
105	u8 report;	/* CP2112_DATA_WRITE_READ_REQUEST */
106	u8 slave_address;
107	__be16 length;
108	u8 target_address_length;
109	u8 target_address[16];
110} __packed;
111
112struct cp2112_write_req_report {
113	u8 report;	/* CP2112_DATA_WRITE_REQUEST */
114	u8 slave_address;
115	u8 length;
116	u8 data[61];
117} __packed;
118
119struct cp2112_force_read_report {
120	u8 report;	/* CP2112_DATA_READ_FORCE_SEND */
121	__be16 length;
122} __packed;
123
124struct cp2112_xfer_status_report {
125	u8 report;	/* CP2112_TRANSFER_STATUS_RESPONSE */
126	u8 status0;	/* STATUS0_* */
127	u8 status1;	/* STATUS1_* */
128	__be16 retries;
129	__be16 length;
130} __packed;
131
132struct cp2112_string_report {
133	u8 dummy;		/* force .string to be aligned */
134	struct_group_attr(contents, __packed,
135		u8 report;		/* CP2112_*_STRING */
136		u8 length;		/* length in bytes of everything after .report */
137		u8 type;		/* USB_DT_STRING */
138		wchar_t string[30];	/* UTF16_LITTLE_ENDIAN string */
139	);
140} __packed;
141
142/* Number of times to request transfer status before giving up waiting for a
143   transfer to complete. This may need to be changed if SMBUS clock, retries,
144   or read/write/scl_low timeout settings are changed. */
145static const int XFER_STATUS_RETRIES = 10;
146
147/* Time in ms to wait for a CP2112_DATA_READ_RESPONSE or
148   CP2112_TRANSFER_STATUS_RESPONSE. */
149static const int RESPONSE_TIMEOUT = 50;
150
151static const struct hid_device_id cp2112_devices[] = {
152	{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) },
153	{ }
154};
155MODULE_DEVICE_TABLE(hid, cp2112_devices);
156
157struct cp2112_device {
158	struct i2c_adapter adap;
159	struct hid_device *hdev;
160	wait_queue_head_t wait;
161	u8 read_data[61];
162	u8 read_length;
163	u8 hwversion;
164	int xfer_status;
165	atomic_t read_avail;
166	atomic_t xfer_avail;
167	struct gpio_chip gc;
168	u8 *in_out_buffer;
169	struct mutex lock;
170
171	bool gpio_poll;
172	struct delayed_work gpio_poll_worker;
173	unsigned long irq_mask;
174	u8 gpio_prev_state;
175};
176
177static int gpio_push_pull = CP2112_GPIO_ALL_GPIO_MASK;
178module_param(gpio_push_pull, int, 0644);
179MODULE_PARM_DESC(gpio_push_pull, "GPIO push-pull configuration bitmask");
180
181static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
182{
183	struct cp2112_device *dev = gpiochip_get_data(chip);
184	struct hid_device *hdev = dev->hdev;
185	u8 *buf = dev->in_out_buffer;
186	int ret;
187
188	mutex_lock(&dev->lock);
189
190	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
191				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
192				 HID_REQ_GET_REPORT);
193	if (ret != CP2112_GPIO_CONFIG_LENGTH) {
194		hid_err(hdev, "error requesting GPIO config: %d\n", ret);
195		if (ret >= 0)
196			ret = -EIO;
197		goto exit;
198	}
199
200	buf[1] &= ~BIT(offset);
201	buf[2] = gpio_push_pull;
202
203	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
204				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
205				 HID_REQ_SET_REPORT);
206	if (ret != CP2112_GPIO_CONFIG_LENGTH) {
207		hid_err(hdev, "error setting GPIO config: %d\n", ret);
208		if (ret >= 0)
209			ret = -EIO;
210		goto exit;
211	}
212
213	ret = 0;
214
215exit:
216	mutex_unlock(&dev->lock);
217	return ret;
218}
219
220static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
221{
222	struct cp2112_device *dev = gpiochip_get_data(chip);
223	struct hid_device *hdev = dev->hdev;
224	u8 *buf = dev->in_out_buffer;
225	int ret;
226
227	mutex_lock(&dev->lock);
228
229	buf[0] = CP2112_GPIO_SET;
230	buf[1] = value ? CP2112_GPIO_ALL_GPIO_MASK : 0;
231	buf[2] = BIT(offset);
232
233	ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf,
234				 CP2112_GPIO_SET_LENGTH, HID_FEATURE_REPORT,
235				 HID_REQ_SET_REPORT);
236	if (ret < 0)
237		hid_err(hdev, "error setting GPIO values: %d\n", ret);
238
239	mutex_unlock(&dev->lock);
240}
241
242static int cp2112_gpio_get_all(struct gpio_chip *chip)
243{
244	struct cp2112_device *dev = gpiochip_get_data(chip);
245	struct hid_device *hdev = dev->hdev;
246	u8 *buf = dev->in_out_buffer;
247	int ret;
248
249	mutex_lock(&dev->lock);
250
251	ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf,
252				 CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT,
253				 HID_REQ_GET_REPORT);
254	if (ret != CP2112_GPIO_GET_LENGTH) {
255		hid_err(hdev, "error requesting GPIO values: %d\n", ret);
256		ret = ret < 0 ? ret : -EIO;
257		goto exit;
258	}
259
260	ret = buf[1];
261
262exit:
263	mutex_unlock(&dev->lock);
264
265	return ret;
266}
267
268static int cp2112_gpio_get(struct gpio_chip *chip, unsigned int offset)
269{
270	int ret;
271
272	ret = cp2112_gpio_get_all(chip);
273	if (ret < 0)
274		return ret;
275
276	return (ret >> offset) & 1;
277}
278
279static int cp2112_gpio_direction_output(struct gpio_chip *chip,
280					unsigned offset, int value)
281{
282	struct cp2112_device *dev = gpiochip_get_data(chip);
283	struct hid_device *hdev = dev->hdev;
284	u8 *buf = dev->in_out_buffer;
285	int ret;
286
287	mutex_lock(&dev->lock);
288
289	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
290				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
291				 HID_REQ_GET_REPORT);
292	if (ret != CP2112_GPIO_CONFIG_LENGTH) {
293		hid_err(hdev, "error requesting GPIO config: %d\n", ret);
294		goto fail;
295	}
296
297	buf[1] |= 1 << offset;
298	buf[2] = gpio_push_pull;
299
300	ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
301				 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
302				 HID_REQ_SET_REPORT);
303	if (ret < 0) {
304		hid_err(hdev, "error setting GPIO config: %d\n", ret);
305		goto fail;
306	}
307
308	mutex_unlock(&dev->lock);
309
310	/*
311	 * Set gpio value when output direction is already set,
312	 * as specified in AN495, Rev. 0.2, cpt. 4.4
313	 */
314	cp2112_gpio_set(chip, offset, value);
315
316	return 0;
317
318fail:
319	mutex_unlock(&dev->lock);
320	return ret < 0 ? ret : -EIO;
321}
322
323static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
324			  u8 *data, size_t count, unsigned char report_type)
325{
326	u8 *buf;
327	int ret;
328
329	buf = kmalloc(count, GFP_KERNEL);
330	if (!buf)
331		return -ENOMEM;
332
333	ret = hid_hw_raw_request(hdev, report_number, buf, count,
334				       report_type, HID_REQ_GET_REPORT);
335	memcpy(data, buf, count);
336	kfree(buf);
337	return ret;
338}
339
340static int cp2112_hid_output(struct hid_device *hdev, u8 *data, size_t count,
341			     unsigned char report_type)
342{
343	u8 *buf;
344	int ret;
345
346	buf = kmemdup(data, count, GFP_KERNEL);
347	if (!buf)
348		return -ENOMEM;
349
350	if (report_type == HID_OUTPUT_REPORT)
351		ret = hid_hw_output_report(hdev, buf, count);
352	else
353		ret = hid_hw_raw_request(hdev, buf[0], buf, count, report_type,
354				HID_REQ_SET_REPORT);
355
356	kfree(buf);
357	return ret;
358}
359
360static int cp2112_wait(struct cp2112_device *dev, atomic_t *avail)
361{
362	int ret = 0;
363
364	/* We have sent either a CP2112_TRANSFER_STATUS_REQUEST or a
365	 * CP2112_DATA_READ_FORCE_SEND and we are waiting for the response to
366	 * come in cp2112_raw_event or timeout. There will only be one of these
367	 * in flight at any one time. The timeout is extremely large and is a
368	 * last resort if the CP2112 has died. If we do timeout we don't expect
369	 * to receive the response which would cause data races, it's not like
370	 * we can do anything about it anyway.
371	 */
372	ret = wait_event_interruptible_timeout(dev->wait,
373		atomic_read(avail), msecs_to_jiffies(RESPONSE_TIMEOUT));
374	if (-ERESTARTSYS == ret)
375		return ret;
376	if (!ret)
377		return -ETIMEDOUT;
378
379	atomic_set(avail, 0);
380	return 0;
381}
382
383static int cp2112_xfer_status(struct cp2112_device *dev)
384{
385	struct hid_device *hdev = dev->hdev;
386	u8 buf[2];
387	int ret;
388
389	buf[0] = CP2112_TRANSFER_STATUS_REQUEST;
390	buf[1] = 0x01;
391	atomic_set(&dev->xfer_avail, 0);
392
393	ret = cp2112_hid_output(hdev, buf, 2, HID_OUTPUT_REPORT);
394	if (ret < 0) {
395		hid_warn(hdev, "Error requesting status: %d\n", ret);
396		return ret;
397	}
398
399	ret = cp2112_wait(dev, &dev->xfer_avail);
400	if (ret)
401		return ret;
402
403	return dev->xfer_status;
404}
405
406static int cp2112_read(struct cp2112_device *dev, u8 *data, size_t size)
407{
408	struct hid_device *hdev = dev->hdev;
409	struct cp2112_force_read_report report;
410	int ret;
411
412	if (size > sizeof(dev->read_data))
413		size = sizeof(dev->read_data);
414	report.report = CP2112_DATA_READ_FORCE_SEND;
415	report.length = cpu_to_be16(size);
416
417	atomic_set(&dev->read_avail, 0);
418
419	ret = cp2112_hid_output(hdev, &report.report, sizeof(report),
420				HID_OUTPUT_REPORT);
421	if (ret < 0) {
422		hid_warn(hdev, "Error requesting data: %d\n", ret);
423		return ret;
424	}
425
426	ret = cp2112_wait(dev, &dev->read_avail);
427	if (ret)
428		return ret;
429
430	hid_dbg(hdev, "read %d of %zd bytes requested\n",
431		dev->read_length, size);
432
433	if (size > dev->read_length)
434		size = dev->read_length;
435
436	memcpy(data, dev->read_data, size);
437	return dev->read_length;
438}
439
440static int cp2112_read_req(void *buf, u8 slave_address, u16 length)
441{
442	struct cp2112_read_req_report *report = buf;
443
444	if (length < 1 || length > 512)
445		return -EINVAL;
446
447	report->report = CP2112_DATA_READ_REQUEST;
448	report->slave_address = slave_address << 1;
449	report->length = cpu_to_be16(length);
450	return sizeof(*report);
451}
452
453static int cp2112_write_read_req(void *buf, u8 slave_address, u16 length,
454				 u8 command, u8 *data, u8 data_length)
455{
456	struct cp2112_write_read_req_report *report = buf;
457
458	if (length < 1 || length > 512
459	    || data_length > sizeof(report->target_address) - 1)
460		return -EINVAL;
461
462	report->report = CP2112_DATA_WRITE_READ_REQUEST;
463	report->slave_address = slave_address << 1;
464	report->length = cpu_to_be16(length);
465	report->target_address_length = data_length + 1;
466	report->target_address[0] = command;
467	memcpy(&report->target_address[1], data, data_length);
468	return data_length + 6;
469}
470
471static int cp2112_write_req(void *buf, u8 slave_address, u8 command, u8 *data,
472			    u8 data_length)
473{
474	struct cp2112_write_req_report *report = buf;
475
476	if (data_length > sizeof(report->data) - 1)
477		return -EINVAL;
478
479	report->report = CP2112_DATA_WRITE_REQUEST;
480	report->slave_address = slave_address << 1;
481	report->length = data_length + 1;
482	report->data[0] = command;
483	memcpy(&report->data[1], data, data_length);
484	return data_length + 4;
485}
486
487static int cp2112_i2c_write_req(void *buf, u8 slave_address, u8 *data,
488				u8 data_length)
489{
490	struct cp2112_write_req_report *report = buf;
491
492	if (data_length > sizeof(report->data))
493		return -EINVAL;
494
495	report->report = CP2112_DATA_WRITE_REQUEST;
496	report->slave_address = slave_address << 1;
497	report->length = data_length;
498	memcpy(report->data, data, data_length);
499	return data_length + 3;
500}
501
502static int cp2112_i2c_write_read_req(void *buf, u8 slave_address,
503				     u8 *addr, int addr_length,
504				     int read_length)
505{
506	struct cp2112_write_read_req_report *report = buf;
507
508	if (read_length < 1 || read_length > 512 ||
509	    addr_length > sizeof(report->target_address))
510		return -EINVAL;
511
512	report->report = CP2112_DATA_WRITE_READ_REQUEST;
513	report->slave_address = slave_address << 1;
514	report->length = cpu_to_be16(read_length);
515	report->target_address_length = addr_length;
516	memcpy(report->target_address, addr, addr_length);
517	return addr_length + 5;
518}
519
520static int cp2112_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
521			   int num)
522{
523	struct cp2112_device *dev = (struct cp2112_device *)adap->algo_data;
524	struct hid_device *hdev = dev->hdev;
525	u8 buf[64];
526	ssize_t count;
527	ssize_t read_length = 0;
528	u8 *read_buf = NULL;
529	unsigned int retries;
530	int ret;
531
532	hid_dbg(hdev, "I2C %d messages\n", num);
533
534	if (num == 1) {
535		hid_dbg(hdev, "I2C %s %#04x len %d\n",
536			str_read_write(msgs->flags & I2C_M_RD), msgs->addr, msgs->len);
537		if (msgs->flags & I2C_M_RD) {
538			read_length = msgs->len;
539			read_buf = msgs->buf;
540			count = cp2112_read_req(buf, msgs->addr, msgs->len);
541		} else {
542			count = cp2112_i2c_write_req(buf, msgs->addr,
543						     msgs->buf, msgs->len);
544		}
545		if (count < 0)
546			return count;
547	} else if (dev->hwversion > 1 &&  /* no repeated start in rev 1 */
548		   num == 2 &&
549		   msgs[0].addr == msgs[1].addr &&
550		   !(msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD)) {
551		hid_dbg(hdev, "I2C write-read %#04x wlen %d rlen %d\n",
552			msgs[0].addr, msgs[0].len, msgs[1].len);
553		read_length = msgs[1].len;
554		read_buf = msgs[1].buf;
555		count = cp2112_i2c_write_read_req(buf, msgs[0].addr,
556				msgs[0].buf, msgs[0].len, msgs[1].len);
557		if (count < 0)
558			return count;
559	} else {
560		hid_err(hdev,
561			"Multi-message I2C transactions not supported\n");
562		return -EOPNOTSUPP;
563	}
564
565	ret = hid_hw_power(hdev, PM_HINT_FULLON);
566	if (ret < 0) {
567		hid_err(hdev, "power management error: %d\n", ret);
568		return ret;
569	}
570
571	ret = cp2112_hid_output(hdev, buf, count, HID_OUTPUT_REPORT);
572	if (ret < 0) {
573		hid_warn(hdev, "Error starting transaction: %d\n", ret);
574		goto power_normal;
575	}
576
577	for (retries = 0; retries < XFER_STATUS_RETRIES; ++retries) {
578		ret = cp2112_xfer_status(dev);
579		if (-EBUSY == ret)
580			continue;
581		if (ret < 0)
582			goto power_normal;
583		break;
584	}
585
586	if (XFER_STATUS_RETRIES <= retries) {
587		hid_warn(hdev, "Transfer timed out, cancelling.\n");
588		buf[0] = CP2112_CANCEL_TRANSFER;
589		buf[1] = 0x01;
590
591		ret = cp2112_hid_output(hdev, buf, 2, HID_OUTPUT_REPORT);
592		if (ret < 0)
593			hid_warn(hdev, "Error cancelling transaction: %d\n",
594				 ret);
595
596		ret = -ETIMEDOUT;
597		goto power_normal;
598	}
599
600	for (count = 0; count < read_length;) {
601		ret = cp2112_read(dev, read_buf + count, read_length - count);
602		if (ret < 0)
603			goto power_normal;
604		if (ret == 0) {
605			hid_err(hdev, "read returned 0\n");
606			ret = -EIO;
607			goto power_normal;
608		}
609		count += ret;
610		if (count > read_length) {
611			/*
612			 * The hardware returned too much data.
613			 * This is mostly harmless because cp2112_read()
614			 * has a limit check so didn't overrun our
615			 * buffer.  Nevertheless, we return an error
616			 * because something is seriously wrong and
617			 * it shouldn't go unnoticed.
618			 */
619			hid_err(hdev, "long read: %d > %zd\n",
620				ret, read_length - count + ret);
621			ret = -EIO;
622			goto power_normal;
623		}
624	}
625
626	/* return the number of transferred messages */
627	ret = num;
628
629power_normal:
630	hid_hw_power(hdev, PM_HINT_NORMAL);
631	hid_dbg(hdev, "I2C transfer finished: %d\n", ret);
632	return ret;
633}
634
635static int cp2112_xfer(struct i2c_adapter *adap, u16 addr,
636		       unsigned short flags, char read_write, u8 command,
637		       int size, union i2c_smbus_data *data)
638{
639	struct cp2112_device *dev = (struct cp2112_device *)adap->algo_data;
640	struct hid_device *hdev = dev->hdev;
641	u8 buf[64];
642	__le16 word;
643	ssize_t count;
644	size_t read_length = 0;
645	unsigned int retries;
646	int ret;
647
648	hid_dbg(hdev, "%s addr 0x%x flags 0x%x cmd 0x%x size %d\n",
649		str_write_read(read_write == I2C_SMBUS_WRITE),
650		addr, flags, command, size);
651
652	switch (size) {
653	case I2C_SMBUS_BYTE:
654		read_length = 1;
655
656		if (I2C_SMBUS_READ == read_write)
657			count = cp2112_read_req(buf, addr, read_length);
658		else
659			count = cp2112_write_req(buf, addr, command, NULL,
660						 0);
661		break;
662	case I2C_SMBUS_BYTE_DATA:
663		read_length = 1;
664
665		if (I2C_SMBUS_READ == read_write)
666			count = cp2112_write_read_req(buf, addr, read_length,
667						      command, NULL, 0);
668		else
669			count = cp2112_write_req(buf, addr, command,
670						 &data->byte, 1);
671		break;
672	case I2C_SMBUS_WORD_DATA:
673		read_length = 2;
674		word = cpu_to_le16(data->word);
675
676		if (I2C_SMBUS_READ == read_write)
677			count = cp2112_write_read_req(buf, addr, read_length,
678						      command, NULL, 0);
679		else
680			count = cp2112_write_req(buf, addr, command,
681						 (u8 *)&word, 2);
682		break;
683	case I2C_SMBUS_PROC_CALL:
684		size = I2C_SMBUS_WORD_DATA;
685		read_write = I2C_SMBUS_READ;
686		read_length = 2;
687		word = cpu_to_le16(data->word);
688
689		count = cp2112_write_read_req(buf, addr, read_length, command,
690					      (u8 *)&word, 2);
691		break;
692	case I2C_SMBUS_I2C_BLOCK_DATA:
693		if (read_write == I2C_SMBUS_READ) {
694			read_length = data->block[0];
695			count = cp2112_write_read_req(buf, addr, read_length,
696						      command, NULL, 0);
697		} else {
698			count = cp2112_write_req(buf, addr, command,
699						 data->block + 1,
700						 data->block[0]);
701		}
702		break;
703	case I2C_SMBUS_BLOCK_DATA:
704		if (I2C_SMBUS_READ == read_write) {
705			count = cp2112_write_read_req(buf, addr,
706						      I2C_SMBUS_BLOCK_MAX,
707						      command, NULL, 0);
708		} else {
709			count = cp2112_write_req(buf, addr, command,
710						 data->block,
711						 data->block[0] + 1);
712		}
713		break;
714	case I2C_SMBUS_BLOCK_PROC_CALL:
715		size = I2C_SMBUS_BLOCK_DATA;
716		read_write = I2C_SMBUS_READ;
717
718		count = cp2112_write_read_req(buf, addr, I2C_SMBUS_BLOCK_MAX,
719					      command, data->block,
720					      data->block[0] + 1);
721		break;
722	default:
723		hid_warn(hdev, "Unsupported transaction %d\n", size);
724		return -EOPNOTSUPP;
725	}
726
727	if (count < 0)
728		return count;
729
730	ret = hid_hw_power(hdev, PM_HINT_FULLON);
731	if (ret < 0) {
732		hid_err(hdev, "power management error: %d\n", ret);
733		return ret;
734	}
735
736	ret = cp2112_hid_output(hdev, buf, count, HID_OUTPUT_REPORT);
737	if (ret < 0) {
738		hid_warn(hdev, "Error starting transaction: %d\n", ret);
739		goto power_normal;
740	}
741
742	for (retries = 0; retries < XFER_STATUS_RETRIES; ++retries) {
743		ret = cp2112_xfer_status(dev);
744		if (-EBUSY == ret)
745			continue;
746		if (ret < 0)
747			goto power_normal;
748		break;
749	}
750
751	if (XFER_STATUS_RETRIES <= retries) {
752		hid_warn(hdev, "Transfer timed out, cancelling.\n");
753		buf[0] = CP2112_CANCEL_TRANSFER;
754		buf[1] = 0x01;
755
756		ret = cp2112_hid_output(hdev, buf, 2, HID_OUTPUT_REPORT);
757		if (ret < 0)
758			hid_warn(hdev, "Error cancelling transaction: %d\n",
759				 ret);
760
761		ret = -ETIMEDOUT;
762		goto power_normal;
763	}
764
765	if (I2C_SMBUS_WRITE == read_write) {
766		ret = 0;
767		goto power_normal;
768	}
769
770	if (I2C_SMBUS_BLOCK_DATA == size)
771		read_length = ret;
772
773	ret = cp2112_read(dev, buf, read_length);
774	if (ret < 0)
775		goto power_normal;
776	if (ret != read_length) {
777		hid_warn(hdev, "short read: %d < %zd\n", ret, read_length);
778		ret = -EIO;
779		goto power_normal;
780	}
781
782	switch (size) {
783	case I2C_SMBUS_BYTE:
784	case I2C_SMBUS_BYTE_DATA:
785		data->byte = buf[0];
786		break;
787	case I2C_SMBUS_WORD_DATA:
788		data->word = le16_to_cpup((__le16 *)buf);
789		break;
790	case I2C_SMBUS_I2C_BLOCK_DATA:
791		if (read_length > I2C_SMBUS_BLOCK_MAX) {
792			ret = -EINVAL;
793			goto power_normal;
794		}
795
796		memcpy(data->block + 1, buf, read_length);
797		break;
798	case I2C_SMBUS_BLOCK_DATA:
799		if (read_length > I2C_SMBUS_BLOCK_MAX) {
800			ret = -EPROTO;
801			goto power_normal;
802		}
803
804		memcpy(data->block, buf, read_length);
805		break;
806	}
807
808	ret = 0;
809power_normal:
810	hid_hw_power(hdev, PM_HINT_NORMAL);
811	hid_dbg(hdev, "transfer finished: %d\n", ret);
812	return ret;
813}
814
815static u32 cp2112_functionality(struct i2c_adapter *adap)
816{
817	return I2C_FUNC_I2C |
818		I2C_FUNC_SMBUS_BYTE |
819		I2C_FUNC_SMBUS_BYTE_DATA |
820		I2C_FUNC_SMBUS_WORD_DATA |
821		I2C_FUNC_SMBUS_BLOCK_DATA |
822		I2C_FUNC_SMBUS_I2C_BLOCK |
823		I2C_FUNC_SMBUS_PROC_CALL |
824		I2C_FUNC_SMBUS_BLOCK_PROC_CALL;
825}
826
827static const struct i2c_algorithm smbus_algorithm = {
828	.master_xfer	= cp2112_i2c_xfer,
829	.smbus_xfer	= cp2112_xfer,
830	.functionality	= cp2112_functionality,
831};
832
833static int cp2112_get_usb_config(struct hid_device *hdev,
834				 struct cp2112_usb_config_report *cfg)
835{
836	int ret;
837
838	ret = cp2112_hid_get(hdev, CP2112_USB_CONFIG, (u8 *)cfg, sizeof(*cfg),
839			     HID_FEATURE_REPORT);
840	if (ret != sizeof(*cfg)) {
841		hid_err(hdev, "error reading usb config: %d\n", ret);
842		if (ret < 0)
843			return ret;
844		return -EIO;
845	}
846
847	return 0;
848}
849
850static int cp2112_set_usb_config(struct hid_device *hdev,
851				 struct cp2112_usb_config_report *cfg)
852{
853	int ret;
854
855	BUG_ON(cfg->report != CP2112_USB_CONFIG);
856
857	ret = cp2112_hid_output(hdev, (u8 *)cfg, sizeof(*cfg),
858				HID_FEATURE_REPORT);
859	if (ret != sizeof(*cfg)) {
860		hid_err(hdev, "error writing usb config: %d\n", ret);
861		if (ret < 0)
862			return ret;
863		return -EIO;
864	}
865
866	return 0;
867}
868
869static void chmod_sysfs_attrs(struct hid_device *hdev);
870
871#define CP2112_CONFIG_ATTR(name, store, format, ...) \
872static ssize_t name##_store(struct device *kdev, \
873			    struct device_attribute *attr, const char *buf, \
874			    size_t count) \
875{ \
876	struct hid_device *hdev = to_hid_device(kdev); \
877	struct cp2112_usb_config_report cfg; \
878	int ret = cp2112_get_usb_config(hdev, &cfg); \
879	if (ret) \
880		return ret; \
881	store; \
882	ret = cp2112_set_usb_config(hdev, &cfg); \
883	if (ret) \
884		return ret; \
885	chmod_sysfs_attrs(hdev); \
886	return count; \
887} \
888static ssize_t name##_show(struct device *kdev, \
889			   struct device_attribute *attr, char *buf) \
890{ \
891	struct hid_device *hdev = to_hid_device(kdev); \
892	struct cp2112_usb_config_report cfg; \
893	int ret = cp2112_get_usb_config(hdev, &cfg); \
894	if (ret) \
895		return ret; \
896	return sysfs_emit(buf, format, ##__VA_ARGS__); \
897} \
898static DEVICE_ATTR_RW(name);
899
900CP2112_CONFIG_ATTR(vendor_id, ({
901	u16 vid;
902
903	if (sscanf(buf, "%hi", &vid) != 1)
904		return -EINVAL;
905
906	cfg.vid = cpu_to_le16(vid);
907	cfg.mask = 0x01;
908}), "0x%04x\n", le16_to_cpu(cfg.vid));
909
910CP2112_CONFIG_ATTR(product_id, ({
911	u16 pid;
912
913	if (sscanf(buf, "%hi", &pid) != 1)
914		return -EINVAL;
915
916	cfg.pid = cpu_to_le16(pid);
917	cfg.mask = 0x02;
918}), "0x%04x\n", le16_to_cpu(cfg.pid));
919
920CP2112_CONFIG_ATTR(max_power, ({
921	int mA;
922
923	if (sscanf(buf, "%i", &mA) != 1)
924		return -EINVAL;
925
926	cfg.max_power = (mA + 1) / 2;
927	cfg.mask = 0x04;
928}), "%u mA\n", cfg.max_power * 2);
929
930CP2112_CONFIG_ATTR(power_mode, ({
931	if (sscanf(buf, "%hhi", &cfg.power_mode) != 1)
932		return -EINVAL;
933
934	cfg.mask = 0x08;
935}), "%u\n", cfg.power_mode);
936
937CP2112_CONFIG_ATTR(release_version, ({
938	if (sscanf(buf, "%hhi.%hhi", &cfg.release_major, &cfg.release_minor)
939	    != 2)
940		return -EINVAL;
941
942	cfg.mask = 0x10;
943}), "%u.%u\n", cfg.release_major, cfg.release_minor);
944
945#undef CP2112_CONFIG_ATTR
946
947static ssize_t pstr_store(struct device *kdev, struct device_attribute *kattr,
948			  const char *buf, size_t count, int number)
949{
950	struct hid_device *hdev = to_hid_device(kdev);
951	struct cp2112_string_report report;
952	int ret;
953
954	memset(&report, 0, sizeof(report));
955
956	ret = utf8s_to_utf16s(buf, count, UTF16_LITTLE_ENDIAN,
957			      report.string, ARRAY_SIZE(report.string));
958	report.report = number;
959	report.length = ret * sizeof(report.string[0]) + 2;
960	report.type = USB_DT_STRING;
961
962	ret = cp2112_hid_output(hdev, &report.report, report.length + 1,
963				HID_FEATURE_REPORT);
964	if (ret != report.length + 1) {
965		hid_err(hdev, "error writing %s string: %d\n", kattr->attr.name,
966			ret);
967		if (ret < 0)
968			return ret;
969		return -EIO;
970	}
971
972	chmod_sysfs_attrs(hdev);
973	return count;
974}
975
976static ssize_t pstr_show(struct device *kdev, struct device_attribute *kattr,
977			 char *buf, int number)
978{
979	struct hid_device *hdev = to_hid_device(kdev);
980	struct cp2112_string_report report;
981	u8 length;
982	int ret;
983
984	ret = cp2112_hid_get(hdev, number, (u8 *)&report.contents,
985			     sizeof(report.contents), HID_FEATURE_REPORT);
986	if (ret < 3) {
987		hid_err(hdev, "error reading %s string: %d\n", kattr->attr.name,
988			ret);
989		if (ret < 0)
990			return ret;
991		return -EIO;
992	}
993
994	if (report.length < 2) {
995		hid_err(hdev, "invalid %s string length: %d\n",
996			kattr->attr.name, report.length);
997		return -EIO;
998	}
999
1000	length = report.length > ret - 1 ? ret - 1 : report.length;
1001	length = (length - 2) / sizeof(report.string[0]);
1002	ret = utf16s_to_utf8s(report.string, length, UTF16_LITTLE_ENDIAN, buf,
1003			      PAGE_SIZE - 1);
1004	buf[ret++] = '\n';
1005	return ret;
1006}
1007
1008#define CP2112_PSTR_ATTR(name, _report) \
1009static ssize_t name##_store(struct device *kdev, struct device_attribute *kattr, \
1010			    const char *buf, size_t count) \
1011{ \
1012	return pstr_store(kdev, kattr, buf, count, _report); \
1013} \
1014static ssize_t name##_show(struct device *kdev, struct device_attribute *kattr, char *buf) \
1015{ \
1016	return pstr_show(kdev, kattr, buf, _report); \
1017} \
1018static DEVICE_ATTR_RW(name);
1019
1020CP2112_PSTR_ATTR(manufacturer,	CP2112_MANUFACTURER_STRING);
1021CP2112_PSTR_ATTR(product,	CP2112_PRODUCT_STRING);
1022CP2112_PSTR_ATTR(serial,	CP2112_SERIAL_STRING);
1023
1024#undef CP2112_PSTR_ATTR
1025
1026static const struct attribute_group cp2112_attr_group = {
1027	.attrs = (struct attribute *[]){
1028		&dev_attr_vendor_id.attr,
1029		&dev_attr_product_id.attr,
1030		&dev_attr_max_power.attr,
1031		&dev_attr_power_mode.attr,
1032		&dev_attr_release_version.attr,
1033		&dev_attr_manufacturer.attr,
1034		&dev_attr_product.attr,
1035		&dev_attr_serial.attr,
1036		NULL
1037	}
1038};
1039
1040/* Chmoding our sysfs attributes is simply a way to expose which fields in the
1041 * PROM have already been programmed. We do not depend on this preventing
1042 * writing to these attributes since the CP2112 will simply ignore writes to
1043 * already-programmed fields. This is why there is no sense in fixing this
1044 * racy behaviour.
1045 */
1046static void chmod_sysfs_attrs(struct hid_device *hdev)
1047{
1048	struct attribute **attr;
1049	u8 buf[2];
1050	int ret;
1051
1052	ret = cp2112_hid_get(hdev, CP2112_LOCK_BYTE, buf, sizeof(buf),
1053			     HID_FEATURE_REPORT);
1054	if (ret != sizeof(buf)) {
1055		hid_err(hdev, "error reading lock byte: %d\n", ret);
1056		return;
1057	}
1058
1059	for (attr = cp2112_attr_group.attrs; *attr; ++attr) {
1060		umode_t mode = (buf[1] & 1) ? 0644 : 0444;
1061		ret = sysfs_chmod_file(&hdev->dev.kobj, *attr, mode);
1062		if (ret < 0)
1063			hid_err(hdev, "error chmoding sysfs file %s\n",
1064				(*attr)->name);
1065		buf[1] >>= 1;
1066	}
1067}
1068
1069static void cp2112_gpio_irq_ack(struct irq_data *d)
1070{
1071}
1072
1073static void cp2112_gpio_irq_mask(struct irq_data *d)
1074{
1075	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1076	struct cp2112_device *dev = gpiochip_get_data(gc);
1077	irq_hw_number_t hwirq = irqd_to_hwirq(d);
1078
1079	__clear_bit(hwirq, &dev->irq_mask);
1080	gpiochip_disable_irq(gc, hwirq);
1081}
1082
1083static void cp2112_gpio_irq_unmask(struct irq_data *d)
1084{
1085	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1086	struct cp2112_device *dev = gpiochip_get_data(gc);
1087	irq_hw_number_t hwirq = irqd_to_hwirq(d);
1088
1089	gpiochip_enable_irq(gc, hwirq);
1090	__set_bit(hwirq, &dev->irq_mask);
1091}
1092
1093static void cp2112_gpio_poll_callback(struct work_struct *work)
1094{
1095	struct cp2112_device *dev = container_of(work, struct cp2112_device,
1096						 gpio_poll_worker.work);
1097	struct irq_data *d;
1098	u8 gpio_mask;
1099	u32 irq_type;
1100	int irq, virq, ret;
1101
1102	ret = cp2112_gpio_get_all(&dev->gc);
1103	if (ret == -ENODEV) /* the hardware has been disconnected */
1104		return;
1105	if (ret < 0)
1106		goto exit;
1107
1108	gpio_mask = ret;
1109	for_each_set_bit(virq, &dev->irq_mask, CP2112_GPIO_MAX_GPIO) {
1110		irq = irq_find_mapping(dev->gc.irq.domain, virq);
1111		if (!irq)
1112			continue;
1113
1114		d = irq_get_irq_data(irq);
1115		if (!d)
1116			continue;
1117
1118		irq_type = irqd_get_trigger_type(d);
1119
1120		if (gpio_mask & BIT(virq)) {
1121			/* Level High */
1122
1123			if (irq_type & IRQ_TYPE_LEVEL_HIGH)
1124				handle_nested_irq(irq);
1125
1126			if ((irq_type & IRQ_TYPE_EDGE_RISING) &&
1127			    !(dev->gpio_prev_state & BIT(virq)))
1128				handle_nested_irq(irq);
1129		} else {
1130			/* Level Low */
1131
1132			if (irq_type & IRQ_TYPE_LEVEL_LOW)
1133				handle_nested_irq(irq);
1134
1135			if ((irq_type & IRQ_TYPE_EDGE_FALLING) &&
1136			    (dev->gpio_prev_state & BIT(virq)))
1137				handle_nested_irq(irq);
1138		}
1139	}
1140
1141	dev->gpio_prev_state = gpio_mask;
1142
1143exit:
1144	if (dev->gpio_poll)
1145		schedule_delayed_work(&dev->gpio_poll_worker, 10);
1146}
1147
1148
1149static unsigned int cp2112_gpio_irq_startup(struct irq_data *d)
1150{
1151	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1152	struct cp2112_device *dev = gpiochip_get_data(gc);
1153
1154	if (!dev->gpio_poll) {
1155		dev->gpio_poll = true;
1156		schedule_delayed_work(&dev->gpio_poll_worker, 0);
1157	}
1158
1159	cp2112_gpio_irq_unmask(d);
1160	return 0;
1161}
1162
1163static void cp2112_gpio_irq_shutdown(struct irq_data *d)
1164{
1165	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
1166	struct cp2112_device *dev = gpiochip_get_data(gc);
1167
1168	cp2112_gpio_irq_mask(d);
1169
1170	if (!dev->irq_mask) {
1171		dev->gpio_poll = false;
1172		cancel_delayed_work_sync(&dev->gpio_poll_worker);
1173	}
1174}
1175
1176static int cp2112_gpio_irq_type(struct irq_data *d, unsigned int type)
1177{
1178	return 0;
1179}
1180
1181static const struct irq_chip cp2112_gpio_irqchip = {
1182	.name = "cp2112-gpio",
1183	.irq_startup = cp2112_gpio_irq_startup,
1184	.irq_shutdown = cp2112_gpio_irq_shutdown,
1185	.irq_ack = cp2112_gpio_irq_ack,
1186	.irq_mask = cp2112_gpio_irq_mask,
1187	.irq_unmask = cp2112_gpio_irq_unmask,
1188	.irq_set_type = cp2112_gpio_irq_type,
1189	.flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_IMMUTABLE,
1190	GPIOCHIP_IRQ_RESOURCE_HELPERS,
1191};
1192
1193static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
1194{
1195	struct cp2112_device *dev;
1196	u8 buf[3];
1197	struct cp2112_smbus_config_report config;
1198	struct gpio_irq_chip *girq;
1199	int ret;
1200
1201	dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
1202	if (!dev)
1203		return -ENOMEM;
1204
1205	dev->in_out_buffer = devm_kzalloc(&hdev->dev, CP2112_REPORT_MAX_LENGTH,
1206					  GFP_KERNEL);
1207	if (!dev->in_out_buffer)
1208		return -ENOMEM;
1209
1210	mutex_init(&dev->lock);
1211
1212	ret = hid_parse(hdev);
1213	if (ret) {
1214		hid_err(hdev, "parse failed\n");
1215		return ret;
1216	}
1217
1218	ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
1219	if (ret) {
1220		hid_err(hdev, "hw start failed\n");
1221		return ret;
1222	}
1223
1224	ret = hid_hw_open(hdev);
1225	if (ret) {
1226		hid_err(hdev, "hw open failed\n");
1227		goto err_hid_stop;
1228	}
1229
1230	ret = hid_hw_power(hdev, PM_HINT_FULLON);
1231	if (ret < 0) {
1232		hid_err(hdev, "power management error: %d\n", ret);
1233		goto err_hid_close;
1234	}
1235
1236	ret = cp2112_hid_get(hdev, CP2112_GET_VERSION_INFO, buf, sizeof(buf),
1237			     HID_FEATURE_REPORT);
1238	if (ret != sizeof(buf)) {
1239		hid_err(hdev, "error requesting version\n");
1240		if (ret >= 0)
1241			ret = -EIO;
1242		goto err_power_normal;
1243	}
1244
1245	hid_info(hdev, "Part Number: 0x%02X Device Version: 0x%02X\n",
1246		 buf[1], buf[2]);
1247
1248	ret = cp2112_hid_get(hdev, CP2112_SMBUS_CONFIG, (u8 *)&config,
1249			     sizeof(config), HID_FEATURE_REPORT);
1250	if (ret != sizeof(config)) {
1251		hid_err(hdev, "error requesting SMBus config\n");
1252		if (ret >= 0)
1253			ret = -EIO;
1254		goto err_power_normal;
1255	}
1256
1257	config.retry_time = cpu_to_be16(1);
1258
1259	ret = cp2112_hid_output(hdev, (u8 *)&config, sizeof(config),
1260				HID_FEATURE_REPORT);
1261	if (ret != sizeof(config)) {
1262		hid_err(hdev, "error setting SMBus config\n");
1263		if (ret >= 0)
1264			ret = -EIO;
1265		goto err_power_normal;
1266	}
1267
1268	hid_set_drvdata(hdev, (void *)dev);
1269	dev->hdev		= hdev;
1270	dev->adap.owner		= THIS_MODULE;
1271	dev->adap.class		= I2C_CLASS_HWMON;
1272	dev->adap.algo		= &smbus_algorithm;
1273	dev->adap.algo_data	= dev;
1274	dev->adap.dev.parent	= &hdev->dev;
1275	snprintf(dev->adap.name, sizeof(dev->adap.name),
1276		 "CP2112 SMBus Bridge on hidraw%d",
1277		 ((struct hidraw *)hdev->hidraw)->minor);
1278	dev->hwversion = buf[2];
1279	init_waitqueue_head(&dev->wait);
1280
1281	hid_device_io_start(hdev);
1282	ret = i2c_add_adapter(&dev->adap);
1283	hid_device_io_stop(hdev);
1284
1285	if (ret) {
1286		hid_err(hdev, "error registering i2c adapter\n");
1287		goto err_power_normal;
1288	}
1289
1290	hid_dbg(hdev, "adapter registered\n");
1291
1292	dev->gc.label			= "cp2112_gpio";
1293	dev->gc.direction_input		= cp2112_gpio_direction_input;
1294	dev->gc.direction_output	= cp2112_gpio_direction_output;
1295	dev->gc.set			= cp2112_gpio_set;
1296	dev->gc.get			= cp2112_gpio_get;
1297	dev->gc.base			= -1;
1298	dev->gc.ngpio			= CP2112_GPIO_MAX_GPIO;
1299	dev->gc.can_sleep		= 1;
1300	dev->gc.parent			= &hdev->dev;
1301
1302	girq = &dev->gc.irq;
1303	gpio_irq_chip_set_chip(girq, &cp2112_gpio_irqchip);
1304	/* The event comes from the outside so no parent handler */
1305	girq->parent_handler = NULL;
1306	girq->num_parents = 0;
1307	girq->parents = NULL;
1308	girq->default_type = IRQ_TYPE_NONE;
1309	girq->handler = handle_simple_irq;
1310	girq->threaded = true;
1311
1312	INIT_DELAYED_WORK(&dev->gpio_poll_worker, cp2112_gpio_poll_callback);
1313
1314	ret = gpiochip_add_data(&dev->gc, dev);
1315	if (ret < 0) {
1316		hid_err(hdev, "error registering gpio chip\n");
1317		goto err_free_i2c;
1318	}
1319
1320	ret = sysfs_create_group(&hdev->dev.kobj, &cp2112_attr_group);
1321	if (ret < 0) {
1322		hid_err(hdev, "error creating sysfs attrs\n");
1323		goto err_gpiochip_remove;
1324	}
1325
1326	chmod_sysfs_attrs(hdev);
1327	hid_hw_power(hdev, PM_HINT_NORMAL);
1328
1329	return ret;
1330
1331err_gpiochip_remove:
1332	gpiochip_remove(&dev->gc);
1333err_free_i2c:
1334	i2c_del_adapter(&dev->adap);
1335err_power_normal:
1336	hid_hw_power(hdev, PM_HINT_NORMAL);
1337err_hid_close:
1338	hid_hw_close(hdev);
1339err_hid_stop:
1340	hid_hw_stop(hdev);
1341	return ret;
1342}
1343
1344static void cp2112_remove(struct hid_device *hdev)
1345{
1346	struct cp2112_device *dev = hid_get_drvdata(hdev);
1347
1348	sysfs_remove_group(&hdev->dev.kobj, &cp2112_attr_group);
1349	i2c_del_adapter(&dev->adap);
1350
1351	if (dev->gpio_poll) {
1352		dev->gpio_poll = false;
1353		cancel_delayed_work_sync(&dev->gpio_poll_worker);
1354	}
1355
1356	gpiochip_remove(&dev->gc);
1357	/* i2c_del_adapter has finished removing all i2c devices from our
1358	 * adapter. Well behaved devices should no longer call our cp2112_xfer
1359	 * and should have waited for any pending calls to finish. It has also
1360	 * waited for device_unregister(&adap->dev) to complete. Therefore we
1361	 * can safely free our struct cp2112_device.
1362	 */
1363	hid_hw_close(hdev);
1364	hid_hw_stop(hdev);
1365}
1366
1367static int cp2112_raw_event(struct hid_device *hdev, struct hid_report *report,
1368			    u8 *data, int size)
1369{
1370	struct cp2112_device *dev = hid_get_drvdata(hdev);
1371	struct cp2112_xfer_status_report *xfer = (void *)data;
1372
1373	switch (data[0]) {
1374	case CP2112_TRANSFER_STATUS_RESPONSE:
1375		hid_dbg(hdev, "xfer status: %02x %02x %04x %04x\n",
1376			xfer->status0, xfer->status1,
1377			be16_to_cpu(xfer->retries), be16_to_cpu(xfer->length));
1378
1379		switch (xfer->status0) {
1380		case STATUS0_IDLE:
1381			dev->xfer_status = -EAGAIN;
1382			break;
1383		case STATUS0_BUSY:
1384			dev->xfer_status = -EBUSY;
1385			break;
1386		case STATUS0_COMPLETE:
1387			dev->xfer_status = be16_to_cpu(xfer->length);
1388			break;
1389		case STATUS0_ERROR:
1390			switch (xfer->status1) {
1391			case STATUS1_TIMEOUT_NACK:
1392			case STATUS1_TIMEOUT_BUS:
1393				dev->xfer_status = -ETIMEDOUT;
1394				break;
1395			default:
1396				dev->xfer_status = -EIO;
1397				break;
1398			}
1399			break;
1400		default:
1401			dev->xfer_status = -EINVAL;
1402			break;
1403		}
1404
1405		atomic_set(&dev->xfer_avail, 1);
1406		break;
1407	case CP2112_DATA_READ_RESPONSE:
1408		hid_dbg(hdev, "read response: %02x %02x\n", data[1], data[2]);
1409
1410		dev->read_length = data[2];
1411		if (dev->read_length > sizeof(dev->read_data))
1412			dev->read_length = sizeof(dev->read_data);
1413
1414		memcpy(dev->read_data, &data[3], dev->read_length);
1415		atomic_set(&dev->read_avail, 1);
1416		break;
1417	default:
1418		hid_err(hdev, "unknown report\n");
1419
1420		return 0;
1421	}
1422
1423	wake_up_interruptible(&dev->wait);
1424	return 1;
1425}
1426
1427static struct hid_driver cp2112_driver = {
1428	.name		= "cp2112",
1429	.id_table	= cp2112_devices,
1430	.probe		= cp2112_probe,
1431	.remove		= cp2112_remove,
1432	.raw_event	= cp2112_raw_event,
1433};
1434
1435module_hid_driver(cp2112_driver);
1436MODULE_DESCRIPTION("Silicon Labs HID USB to SMBus master bridge");
1437MODULE_AUTHOR("David Barksdale <dbarksdale@uplogix.com>");
1438MODULE_LICENSE("GPL");
1439
1440