Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Intel La Jolla Cove Adapter USB driver
  4 *
  5 * Copyright (c) 2023, Intel Corporation.
  6 */
  7
  8#include <linux/acpi.h>
  9#include <linux/auxiliary_bus.h>
 10#include <linux/dev_printk.h>
 11#include <linux/kernel.h>
 12#include <linux/mod_devicetable.h>
 13#include <linux/module.h>
 14#include <linux/mutex.h>
 15#include <linux/slab.h>
 16#include <linux/spinlock.h>
 17#include <linux/types.h>
 18#include <linux/usb.h>
 19#include <linux/usb/ljca.h>
 20
 21#include <asm/unaligned.h>
 22
 23/* command flags */
 24#define LJCA_ACK_FLAG			BIT(0)
 25#define LJCA_RESP_FLAG			BIT(1)
 26#define LJCA_CMPL_FLAG			BIT(2)
 27
 28#define LJCA_MAX_PACKET_SIZE		64u
 29#define LJCA_MAX_PAYLOAD_SIZE		\
 30		(LJCA_MAX_PACKET_SIZE - sizeof(struct ljca_msg))
 31
 32#define LJCA_WRITE_TIMEOUT_MS		200
 33#define LJCA_WRITE_ACK_TIMEOUT_MS	500
 34#define LJCA_ENUM_CLIENT_TIMEOUT_MS	20
 35
 36/* ljca client type */
 37enum ljca_client_type {
 38	LJCA_CLIENT_MNG = 1,
 39	LJCA_CLIENT_GPIO = 3,
 40	LJCA_CLIENT_I2C = 4,
 41	LJCA_CLIENT_SPI = 5,
 42};
 43
 44/* MNG client commands */
 45enum ljca_mng_cmd {
 46	LJCA_MNG_RESET = 2,
 47	LJCA_MNG_ENUM_GPIO = 4,
 48	LJCA_MNG_ENUM_I2C = 5,
 49	LJCA_MNG_ENUM_SPI = 8,
 50};
 51
 52/* ljca client acpi _ADR */
 53enum ljca_client_acpi_adr {
 54	LJCA_GPIO_ACPI_ADR,
 55	LJCA_I2C1_ACPI_ADR,
 56	LJCA_I2C2_ACPI_ADR,
 57	LJCA_SPI1_ACPI_ADR,
 58	LJCA_SPI2_ACPI_ADR,
 59	LJCA_CLIENT_ACPI_ADR_MAX,
 60};
 61
 62/* ljca cmd message structure */
 63struct ljca_msg {
 64	u8 type;
 65	u8 cmd;
 66	u8 flags;
 67	u8 len;
 68	u8 data[] __counted_by(len);
 69} __packed;
 70
 71struct ljca_i2c_ctr_info {
 72	u8 id;
 73	u8 capacity;
 74	u8 intr_pin;
 75} __packed;
 76
 77struct ljca_i2c_descriptor {
 78	u8 num;
 79	struct ljca_i2c_ctr_info info[] __counted_by(num);
 80} __packed;
 81
 82struct ljca_spi_ctr_info {
 83	u8 id;
 84	u8 capacity;
 85	u8 intr_pin;
 86} __packed;
 87
 88struct ljca_spi_descriptor {
 89	u8 num;
 90	struct ljca_spi_ctr_info info[] __counted_by(num);
 91} __packed;
 92
 93struct ljca_bank_descriptor {
 94	u8 bank_id;
 95	u8 pin_num;
 96
 97	/* 1 bit for each gpio, 1 means valid */
 98	__le32 valid_pins;
 99} __packed;
100
101struct ljca_gpio_descriptor {
102	u8 pins_per_bank;
103	u8 bank_num;
104	struct ljca_bank_descriptor bank_desc[] __counted_by(bank_num);
105} __packed;
106
107/**
108 * struct ljca_adapter - represent a ljca adapter
109 *
110 * @intf: the usb interface for this ljca adapter
111 * @usb_dev: the usb device for this ljca adapter
112 * @dev: the specific device info of the usb interface
113 * @rx_pipe: bulk in pipe for receive data from firmware
114 * @tx_pipe: bulk out pipe for send data to firmware
115 * @rx_urb: urb used for the bulk in pipe
116 * @rx_buf: buffer used to receive command response and event
117 * @rx_len: length of rx buffer
118 * @ex_buf: external buffer to save command response
119 * @ex_buf_len: length of external buffer
120 * @actual_length: actual length of data copied to external buffer
121 * @tx_buf: buffer used to download command to firmware
122 * @tx_buf_len: length of tx buffer
123 * @lock: spinlock to protect tx_buf and ex_buf
124 * @cmd_completion: completion object as the command receives ack
125 * @mutex: mutex to avoid command download concurrently
126 * @client_list: client device list
127 * @disconnect: usb disconnect ongoing or not
128 * @reset_id: used to reset firmware
129 */
130struct ljca_adapter {
131	struct usb_interface *intf;
132	struct usb_device *usb_dev;
133	struct device *dev;
134
135	unsigned int rx_pipe;
136	unsigned int tx_pipe;
137
138	struct urb *rx_urb;
139	void *rx_buf;
140	unsigned int rx_len;
141
142	u8 *ex_buf;
143	u8 ex_buf_len;
144	u8 actual_length;
145
146	void *tx_buf;
147	u8 tx_buf_len;
148
149	spinlock_t lock;
150
151	struct completion cmd_completion;
152	struct mutex mutex;
153
154	struct list_head client_list;
155
156	bool disconnect;
157
158	u32 reset_id;
159};
160
161struct ljca_match_ids_walk_data {
162	const struct acpi_device_id *ids;
163	const char *uid;
164	struct acpi_device *adev;
165};
166
167static const struct acpi_device_id ljca_gpio_hids[] = {
168	{ "INTC1074" },
169	{ "INTC1096" },
170	{ "INTC100B" },
171	{ "INTC10D1" },
172	{},
173};
174
175static const struct acpi_device_id ljca_i2c_hids[] = {
176	{ "INTC1075" },
177	{ "INTC1097" },
178	{ "INTC100C" },
179	{ "INTC10D2" },
180	{},
181};
182
183static const struct acpi_device_id ljca_spi_hids[] = {
184	{ "INTC1091" },
185	{ "INTC1098" },
186	{ "INTC100D" },
187	{ "INTC10D3" },
188	{},
189};
190
191static void ljca_handle_event(struct ljca_adapter *adap,
192			      struct ljca_msg *header)
193{
194	struct ljca_client *client;
195
196	list_for_each_entry(client, &adap->client_list, link) {
197		/*
198		 * Currently only GPIO register event callback, but
199		 * firmware message structure should include id when
200		 * multiple same type clients register event callback.
201		 */
202		if (client->type == header->type) {
203			unsigned long flags;
204
205			spin_lock_irqsave(&client->event_cb_lock, flags);
206			client->event_cb(client->context, header->cmd,
207					 header->data, header->len);
208			spin_unlock_irqrestore(&client->event_cb_lock, flags);
209
210			break;
211		}
212	}
213}
214
215/* process command ack and received data if available */
216static void ljca_handle_cmd_ack(struct ljca_adapter *adap, struct ljca_msg *header)
217{
218	struct ljca_msg *tx_header = adap->tx_buf;
219	u8 ibuf_len, actual_len = 0;
220	unsigned long flags;
221	u8 *ibuf;
222
223	spin_lock_irqsave(&adap->lock, flags);
224
225	if (tx_header->type != header->type || tx_header->cmd != header->cmd) {
226		spin_unlock_irqrestore(&adap->lock, flags);
227		dev_err(adap->dev, "cmd ack mismatch error\n");
228		return;
229	}
230
231	ibuf_len = adap->ex_buf_len;
232	ibuf = adap->ex_buf;
233
234	if (ibuf && ibuf_len) {
235		actual_len = min(header->len, ibuf_len);
236
237		/* copy received data to external buffer */
238		memcpy(ibuf, header->data, actual_len);
239	}
240	/* update copied data length */
241	adap->actual_length = actual_len;
242
243	spin_unlock_irqrestore(&adap->lock, flags);
244
245	complete(&adap->cmd_completion);
246}
247
248static void ljca_recv(struct urb *urb)
249{
250	struct ljca_msg *header = urb->transfer_buffer;
251	struct ljca_adapter *adap = urb->context;
252	int ret;
253
254	switch (urb->status) {
255	case 0:
256		/* success */
257		break;
258	case -ENOENT:
259		/*
260		 * directly complete the possible ongoing transfer
261		 * during disconnect
262		 */
263		if (adap->disconnect)
264			complete(&adap->cmd_completion);
265		return;
266	case -ECONNRESET:
267	case -ESHUTDOWN:
268	case -EPIPE:
269		/* rx urb is terminated */
270		dev_dbg(adap->dev, "rx urb terminated with status: %d\n",
271			urb->status);
272		return;
273	default:
274		dev_dbg(adap->dev, "rx urb error: %d\n", urb->status);
275		goto resubmit;
276	}
277
278	if (header->len + sizeof(*header) != urb->actual_length)
279		goto resubmit;
280
281	if (header->flags & LJCA_ACK_FLAG)
282		ljca_handle_cmd_ack(adap, header);
283	else
284		ljca_handle_event(adap, header);
285
286resubmit:
287	ret = usb_submit_urb(urb, GFP_ATOMIC);
288	if (ret && ret != -EPERM)
289		dev_err(adap->dev, "resubmit rx urb error %d\n", ret);
290}
291
292static int ljca_send(struct ljca_adapter *adap, u8 type, u8 cmd,
293		     const u8 *obuf, u8 obuf_len, u8 *ibuf, u8 ibuf_len,
294		     bool ack, unsigned long timeout)
295{
296	unsigned int msg_len = sizeof(struct ljca_msg) + obuf_len;
297	struct ljca_msg *header = adap->tx_buf;
298	unsigned int transferred;
299	unsigned long flags;
300	int ret;
301
302	if (adap->disconnect)
303		return -ENODEV;
304
305	if (msg_len > adap->tx_buf_len)
306		return -EINVAL;
307
308	mutex_lock(&adap->mutex);
309
310	spin_lock_irqsave(&adap->lock, flags);
311
312	header->type = type;
313	header->cmd = cmd;
314	header->len = obuf_len;
315	if (obuf)
316		memcpy(header->data, obuf, obuf_len);
317
318	header->flags = LJCA_CMPL_FLAG | (ack ? LJCA_ACK_FLAG : 0);
319
320	adap->ex_buf = ibuf;
321	adap->ex_buf_len = ibuf_len;
322	adap->actual_length = 0;
323
324	spin_unlock_irqrestore(&adap->lock, flags);
325
326	reinit_completion(&adap->cmd_completion);
327
328	ret = usb_autopm_get_interface(adap->intf);
329	if (ret < 0)
330		goto out;
331
332	ret = usb_bulk_msg(adap->usb_dev, adap->tx_pipe, header,
333			   msg_len, &transferred, LJCA_WRITE_TIMEOUT_MS);
334
335	usb_autopm_put_interface(adap->intf);
336
337	if (ret < 0)
338		goto out;
339	if (transferred != msg_len) {
340		ret = -EIO;
341		goto out;
342	}
343
344	if (ack) {
345		ret = wait_for_completion_timeout(&adap->cmd_completion,
346						  timeout);
347		if (!ret) {
348			ret = -ETIMEDOUT;
349			goto out;
350		}
351	}
352	ret = adap->actual_length;
353
354out:
355	spin_lock_irqsave(&adap->lock, flags);
356	adap->ex_buf = NULL;
357	adap->ex_buf_len = 0;
358
359	memset(header, 0, sizeof(*header));
360	spin_unlock_irqrestore(&adap->lock, flags);
361
362	mutex_unlock(&adap->mutex);
363
364	return ret;
365}
366
367int ljca_transfer(struct ljca_client *client, u8 cmd, const u8 *obuf,
368		  u8 obuf_len, u8 *ibuf, u8 ibuf_len)
369{
370	return ljca_send(client->adapter, client->type, cmd,
371			 obuf, obuf_len, ibuf, ibuf_len, true,
372			 LJCA_WRITE_ACK_TIMEOUT_MS);
373}
374EXPORT_SYMBOL_NS_GPL(ljca_transfer, LJCA);
375
376int ljca_transfer_noack(struct ljca_client *client, u8 cmd, const u8 *obuf,
377			u8 obuf_len)
378{
379	return ljca_send(client->adapter, client->type, cmd, obuf,
380			 obuf_len, NULL, 0, false, LJCA_WRITE_ACK_TIMEOUT_MS);
381}
382EXPORT_SYMBOL_NS_GPL(ljca_transfer_noack, LJCA);
383
384int ljca_register_event_cb(struct ljca_client *client, ljca_event_cb_t event_cb,
385			   void *context)
386{
387	unsigned long flags;
388
389	if (!event_cb)
390		return -EINVAL;
391
392	spin_lock_irqsave(&client->event_cb_lock, flags);
393
394	if (client->event_cb) {
395		spin_unlock_irqrestore(&client->event_cb_lock, flags);
396		return -EALREADY;
397	}
398
399	client->event_cb = event_cb;
400	client->context = context;
401
402	spin_unlock_irqrestore(&client->event_cb_lock, flags);
403
404	return 0;
405}
406EXPORT_SYMBOL_NS_GPL(ljca_register_event_cb, LJCA);
407
408void ljca_unregister_event_cb(struct ljca_client *client)
409{
410	unsigned long flags;
411
412	spin_lock_irqsave(&client->event_cb_lock, flags);
413
414	client->event_cb = NULL;
415	client->context = NULL;
416
417	spin_unlock_irqrestore(&client->event_cb_lock, flags);
418}
419EXPORT_SYMBOL_NS_GPL(ljca_unregister_event_cb, LJCA);
420
421static int ljca_match_device_ids(struct acpi_device *adev, void *data)
422{
423	struct ljca_match_ids_walk_data *wd = data;
424	const char *uid = acpi_device_uid(adev);
425
426	if (acpi_match_device_ids(adev, wd->ids))
427		return 0;
428
429	if (!wd->uid)
430		goto match;
431
432	if (!uid)
433		/*
434		 * Some DSDTs have only one ACPI companion for the two I2C
435		 * controllers and they don't set a UID at all (e.g. Dell
436		 * Latitude 9420). On these platforms only the first I2C
437		 * controller is used, so if a HID match has no UID we use
438		 * "0" as the UID and assign ACPI companion to the first
439		 * I2C controller.
440		 */
441		uid = "0";
442	else
443		uid = strchr(uid, wd->uid[0]);
444
445	if (!uid || strcmp(uid, wd->uid))
446		return 0;
447
448match:
449	wd->adev = adev;
450
451	return 1;
452}
453
454/* bind auxiliary device to acpi device */
455static void ljca_auxdev_acpi_bind(struct ljca_adapter *adap,
456				  struct auxiliary_device *auxdev,
457				  u64 adr, u8 id)
458{
459	struct ljca_match_ids_walk_data wd = { 0 };
460	struct device *dev = adap->dev;
461	struct acpi_device *parent;
462	char uid[4];
463
464	parent = ACPI_COMPANION(dev);
465	if (!parent)
466		return;
467
468	/*
469	 * Currently LJCA hw doesn't use _ADR instead the shipped
470	 * platforms use _HID to distinguish children devices.
471	 */
472	switch (adr) {
473	case LJCA_GPIO_ACPI_ADR:
474		wd.ids = ljca_gpio_hids;
475		break;
476	case LJCA_I2C1_ACPI_ADR:
477	case LJCA_I2C2_ACPI_ADR:
478		snprintf(uid, sizeof(uid), "%d", id);
479		wd.uid = uid;
480		wd.ids = ljca_i2c_hids;
481		break;
482	case LJCA_SPI1_ACPI_ADR:
483	case LJCA_SPI2_ACPI_ADR:
484		wd.ids = ljca_spi_hids;
485		break;
486	default:
487		dev_warn(dev, "unsupported _ADR\n");
488		return;
489	}
490
491	acpi_dev_for_each_child(parent, ljca_match_device_ids, &wd);
492	if (wd.adev) {
493		ACPI_COMPANION_SET(&auxdev->dev, wd.adev);
494		return;
495	}
496
497	parent = ACPI_COMPANION(dev->parent->parent);
498	if (!parent)
499		return;
500
501	acpi_dev_for_each_child(parent, ljca_match_device_ids, &wd);
502	if (wd.adev)
503		ACPI_COMPANION_SET(&auxdev->dev, wd.adev);
504}
505
506static void ljca_auxdev_release(struct device *dev)
507{
508	struct auxiliary_device *auxdev = to_auxiliary_dev(dev);
509
510	kfree(auxdev->dev.platform_data);
511}
512
513static int ljca_new_client_device(struct ljca_adapter *adap, u8 type, u8 id,
514				  char *name, void *data, u64 adr)
515{
516	struct auxiliary_device *auxdev;
517	struct ljca_client *client;
518	int ret;
519
520	client = kzalloc(sizeof *client, GFP_KERNEL);
521	if (!client)
522		return -ENOMEM;
523
524	client->type = type;
525	client->id = id;
526	client->adapter = adap;
527	spin_lock_init(&client->event_cb_lock);
528
529	auxdev = &client->auxdev;
530	auxdev->name = name;
531	auxdev->id = id;
532
533	auxdev->dev.parent = adap->dev;
534	auxdev->dev.platform_data = data;
535	auxdev->dev.release = ljca_auxdev_release;
536
537	ret = auxiliary_device_init(auxdev);
538	if (ret)
539		goto err_free;
540
541	ljca_auxdev_acpi_bind(adap, auxdev, adr, id);
542
543	ret = auxiliary_device_add(auxdev);
544	if (ret)
545		goto err_uninit;
546
547	list_add_tail(&client->link, &adap->client_list);
548
549	return 0;
550
551err_uninit:
552	auxiliary_device_uninit(auxdev);
553
554err_free:
555	kfree(client);
556
557	return ret;
558}
559
560static int ljca_enumerate_gpio(struct ljca_adapter *adap)
561{
562	u32 valid_pin[LJCA_MAX_GPIO_NUM / BITS_PER_TYPE(u32)];
563	struct ljca_gpio_descriptor *desc;
564	struct ljca_gpio_info *gpio_info;
565	u8 buf[LJCA_MAX_PAYLOAD_SIZE];
566	int ret, gpio_num;
567	unsigned int i;
568
569	ret = ljca_send(adap, LJCA_CLIENT_MNG, LJCA_MNG_ENUM_GPIO, NULL, 0, buf,
570			sizeof(buf), true, LJCA_ENUM_CLIENT_TIMEOUT_MS);
571	if (ret < 0)
572		return ret;
573
574	/* check firmware response */
575	desc = (struct ljca_gpio_descriptor *)buf;
576	if (ret != struct_size(desc, bank_desc, desc->bank_num))
577		return -EINVAL;
578
579	gpio_num = desc->pins_per_bank * desc->bank_num;
580	if (gpio_num > LJCA_MAX_GPIO_NUM)
581		return -EINVAL;
582
583	/* construct platform data */
584	gpio_info = kzalloc(sizeof *gpio_info, GFP_KERNEL);
585	if (!gpio_info)
586		return -ENOMEM;
587	gpio_info->num = gpio_num;
588
589	for (i = 0; i < desc->bank_num; i++)
590		valid_pin[i] = get_unaligned_le32(&desc->bank_desc[i].valid_pins);
591	bitmap_from_arr32(gpio_info->valid_pin_map, valid_pin, gpio_num);
592
593	ret = ljca_new_client_device(adap, LJCA_CLIENT_GPIO, 0, "ljca-gpio",
594				     gpio_info, LJCA_GPIO_ACPI_ADR);
595	if (ret)
596		kfree(gpio_info);
597
598	return ret;
599}
600
601static int ljca_enumerate_i2c(struct ljca_adapter *adap)
602{
603	struct ljca_i2c_descriptor *desc;
604	struct ljca_i2c_info *i2c_info;
605	u8 buf[LJCA_MAX_PAYLOAD_SIZE];
606	unsigned int i;
607	int ret;
608
609	ret = ljca_send(adap, LJCA_CLIENT_MNG, LJCA_MNG_ENUM_I2C, NULL, 0, buf,
610			sizeof(buf), true, LJCA_ENUM_CLIENT_TIMEOUT_MS);
611	if (ret < 0)
612		return ret;
613
614	/* check firmware response */
615	desc = (struct ljca_i2c_descriptor *)buf;
616	if (ret != struct_size(desc, info, desc->num))
617		return -EINVAL;
618
619	for (i = 0; i < desc->num; i++) {
620		/* construct platform data */
621		i2c_info = kzalloc(sizeof *i2c_info, GFP_KERNEL);
622		if (!i2c_info)
623			return -ENOMEM;
624
625		i2c_info->id = desc->info[i].id;
626		i2c_info->capacity = desc->info[i].capacity;
627		i2c_info->intr_pin = desc->info[i].intr_pin;
628
629		ret = ljca_new_client_device(adap, LJCA_CLIENT_I2C, i,
630					     "ljca-i2c", i2c_info,
631					     LJCA_I2C1_ACPI_ADR + i);
632		if (ret) {
633			kfree(i2c_info);
634			return ret;
635		}
636	}
637
638	return 0;
639}
640
641static int ljca_enumerate_spi(struct ljca_adapter *adap)
642{
643	struct ljca_spi_descriptor *desc;
644	struct ljca_spi_info *spi_info;
645	u8 buf[LJCA_MAX_PAYLOAD_SIZE];
646	unsigned int i;
647	int ret;
648
649	/* Not all LJCA chips implement SPI, a timeout reading the descriptors is normal */
650	ret = ljca_send(adap, LJCA_CLIENT_MNG, LJCA_MNG_ENUM_SPI, NULL, 0, buf,
651			sizeof(buf), true, LJCA_ENUM_CLIENT_TIMEOUT_MS);
652	if (ret < 0)
653		return (ret == -ETIMEDOUT) ? 0 : ret;
654
655	/* check firmware response */
656	desc = (struct ljca_spi_descriptor *)buf;
657	if (ret != struct_size(desc, info, desc->num))
658		return -EINVAL;
659
660	for (i = 0; i < desc->num; i++) {
661		/* construct platform data */
662		spi_info = kzalloc(sizeof *spi_info, GFP_KERNEL);
663		if (!spi_info)
664			return -ENOMEM;
665
666		spi_info->id = desc->info[i].id;
667		spi_info->capacity = desc->info[i].capacity;
668
669		ret = ljca_new_client_device(adap, LJCA_CLIENT_SPI, i,
670					     "ljca-spi", spi_info,
671					     LJCA_SPI1_ACPI_ADR + i);
672		if (ret) {
673			kfree(spi_info);
674			return ret;
675		}
676	}
677
678	return 0;
679}
680
681static int ljca_reset_handshake(struct ljca_adapter *adap)
682{
683	__le32 reset_id = cpu_to_le32(adap->reset_id);
684	__le32 reset_id_ret = 0;
685	int ret;
686
687	adap->reset_id++;
688
689	ret = ljca_send(adap, LJCA_CLIENT_MNG, LJCA_MNG_RESET, (u8 *)&reset_id,
690			sizeof(__le32), (u8 *)&reset_id_ret, sizeof(__le32),
691			true, LJCA_WRITE_ACK_TIMEOUT_MS);
692	if (ret < 0)
693		return ret;
694
695	if (reset_id_ret != reset_id)
696		return -EINVAL;
697
698	return 0;
699}
700
701static int ljca_enumerate_clients(struct ljca_adapter *adap)
702{
703	struct ljca_client *client, *next;
704	int ret;
705
706	ret = ljca_reset_handshake(adap);
707	if (ret)
708		goto err_kill;
709
710	ret = ljca_enumerate_gpio(adap);
711	if (ret) {
712		dev_err(adap->dev, "enumerate GPIO error\n");
713		goto err_kill;
714	}
715
716	ret = ljca_enumerate_i2c(adap);
717	if (ret) {
718		dev_err(adap->dev, "enumerate I2C error\n");
719		goto err_kill;
720	}
721
722	ret = ljca_enumerate_spi(adap);
723	if (ret) {
724		dev_err(adap->dev, "enumerate SPI error\n");
725		goto err_kill;
726	}
727
728	return 0;
729
730err_kill:
731	adap->disconnect = true;
732
733	usb_kill_urb(adap->rx_urb);
734
735	list_for_each_entry_safe_reverse(client, next, &adap->client_list, link) {
736		auxiliary_device_delete(&client->auxdev);
737		auxiliary_device_uninit(&client->auxdev);
738
739		list_del_init(&client->link);
740		kfree(client);
741	}
742
743	return ret;
744}
745
746static int ljca_probe(struct usb_interface *interface,
747		      const struct usb_device_id *id)
748{
749	struct usb_device *usb_dev = interface_to_usbdev(interface);
750	struct usb_host_interface *alt = interface->cur_altsetting;
751	struct usb_endpoint_descriptor *ep_in, *ep_out;
752	struct device *dev = &interface->dev;
753	struct ljca_adapter *adap;
754	int ret;
755
756	adap = devm_kzalloc(dev, sizeof(*adap), GFP_KERNEL);
757	if (!adap)
758		return -ENOMEM;
759
760	/* separate tx buffer allocation for alignment */
761	adap->tx_buf = devm_kzalloc(dev, LJCA_MAX_PACKET_SIZE, GFP_KERNEL);
762	if (!adap->tx_buf)
763		return -ENOMEM;
764	adap->tx_buf_len = LJCA_MAX_PACKET_SIZE;
765
766	mutex_init(&adap->mutex);
767	spin_lock_init(&adap->lock);
768	init_completion(&adap->cmd_completion);
769	INIT_LIST_HEAD(&adap->client_list);
770
771	adap->intf = usb_get_intf(interface);
772	adap->usb_dev = usb_dev;
773	adap->dev = dev;
774
775	/*
776	 * find the first bulk in and out endpoints.
777	 * ignore any others.
778	 */
779	ret = usb_find_common_endpoints(alt, &ep_in, &ep_out, NULL, NULL);
780	if (ret) {
781		dev_err(dev, "bulk endpoints not found\n");
782		goto err_put;
783	}
784	adap->rx_pipe = usb_rcvbulkpipe(usb_dev, usb_endpoint_num(ep_in));
785	adap->tx_pipe = usb_sndbulkpipe(usb_dev, usb_endpoint_num(ep_out));
786
787	/* setup rx buffer */
788	adap->rx_len = usb_endpoint_maxp(ep_in);
789	adap->rx_buf = devm_kzalloc(dev, adap->rx_len, GFP_KERNEL);
790	if (!adap->rx_buf) {
791		ret = -ENOMEM;
792		goto err_put;
793	}
794
795	/* alloc rx urb */
796	adap->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
797	if (!adap->rx_urb) {
798		ret = -ENOMEM;
799		goto err_put;
800	}
801	usb_fill_bulk_urb(adap->rx_urb, usb_dev, adap->rx_pipe,
802			  adap->rx_buf, adap->rx_len, ljca_recv, adap);
803
804	usb_set_intfdata(interface, adap);
805
806	/* submit rx urb before enumerate clients */
807	ret = usb_submit_urb(adap->rx_urb, GFP_KERNEL);
808	if (ret) {
809		dev_err(dev, "submit rx urb failed: %d\n", ret);
810		goto err_free;
811	}
812
813	ret = ljca_enumerate_clients(adap);
814	if (ret)
815		goto err_free;
816
817	usb_enable_autosuspend(usb_dev);
818
819	return 0;
820
821err_free:
822	usb_free_urb(adap->rx_urb);
823
824err_put:
825	usb_put_intf(adap->intf);
826
827	mutex_destroy(&adap->mutex);
828
829	return ret;
830}
831
832static void ljca_disconnect(struct usb_interface *interface)
833{
834	struct ljca_adapter *adap = usb_get_intfdata(interface);
835	struct ljca_client *client, *next;
836
837	adap->disconnect = true;
838
839	usb_kill_urb(adap->rx_urb);
840
841	list_for_each_entry_safe_reverse(client, next, &adap->client_list, link) {
842		auxiliary_device_delete(&client->auxdev);
843		auxiliary_device_uninit(&client->auxdev);
844
845		list_del_init(&client->link);
846		kfree(client);
847	}
848
849	usb_free_urb(adap->rx_urb);
850
851	usb_put_intf(adap->intf);
852
853	mutex_destroy(&adap->mutex);
854}
855
856static int ljca_suspend(struct usb_interface *interface, pm_message_t message)
857{
858	struct ljca_adapter *adap = usb_get_intfdata(interface);
859
860	usb_kill_urb(adap->rx_urb);
861
862	return 0;
863}
864
865static int ljca_resume(struct usb_interface *interface)
866{
867	struct ljca_adapter *adap = usb_get_intfdata(interface);
868
869	return usb_submit_urb(adap->rx_urb, GFP_KERNEL);
870}
871
872static const struct usb_device_id ljca_table[] = {
873	{ USB_DEVICE(0x8086, 0x0b63) },
874	{ /* sentinel */ }
875};
876MODULE_DEVICE_TABLE(usb, ljca_table);
877
878static struct usb_driver ljca_driver = {
879	.name = "ljca",
880	.id_table = ljca_table,
881	.probe = ljca_probe,
882	.disconnect = ljca_disconnect,
883	.suspend = ljca_suspend,
884	.resume = ljca_resume,
885	.supports_autosuspend = 1,
886};
887module_usb_driver(ljca_driver);
888
889MODULE_AUTHOR("Wentong Wu <wentong.wu@intel.com>");
890MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");
891MODULE_AUTHOR("Lixu Zhang <lixu.zhang@intel.com>");
892MODULE_DESCRIPTION("Intel La Jolla Cove Adapter USB driver");
893MODULE_LICENSE("GPL");