xref: /kernel/linux/linux-5.10/drivers/mfd/dln2.c (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Driver for the Diolan DLN-2 USB adapter
4 *
5 * Copyright (c) 2014 Intel Corporation
6 *
7 * Derived from:
8 *  i2c-diolan-u2c.c
9 *  Copyright (c) 2010-2011 Ericsson AB
10 */
11
12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/types.h>
15#include <linux/slab.h>
16#include <linux/usb.h>
17#include <linux/i2c.h>
18#include <linux/mutex.h>
19#include <linux/platform_device.h>
20#include <linux/mfd/core.h>
21#include <linux/mfd/dln2.h>
22#include <linux/rculist.h>
23
24struct dln2_header {
25	__le16 size;
26	__le16 id;
27	__le16 echo;
28	__le16 handle;
29};
30
31struct dln2_response {
32	struct dln2_header hdr;
33	__le16 result;
34};
35
36#define DLN2_GENERIC_MODULE_ID		0x00
37#define DLN2_GENERIC_CMD(cmd)		DLN2_CMD(cmd, DLN2_GENERIC_MODULE_ID)
38#define CMD_GET_DEVICE_VER		DLN2_GENERIC_CMD(0x30)
39#define CMD_GET_DEVICE_SN		DLN2_GENERIC_CMD(0x31)
40
41#define DLN2_HW_ID			0x200
42#define DLN2_USB_TIMEOUT		200	/* in ms */
43#define DLN2_MAX_RX_SLOTS		16
44#define DLN2_MAX_URBS			16
45#define DLN2_RX_BUF_SIZE		512
46
47enum dln2_handle {
48	DLN2_HANDLE_EVENT = 0,		/* don't change, hardware defined */
49	DLN2_HANDLE_CTRL,
50	DLN2_HANDLE_GPIO,
51	DLN2_HANDLE_I2C,
52	DLN2_HANDLE_SPI,
53	DLN2_HANDLE_ADC,
54	DLN2_HANDLES
55};
56
57/*
58 * Receive context used between the receive demultiplexer and the transfer
59 * routine. While sending a request the transfer routine will look for a free
60 * receive context and use it to wait for a response and to receive the URB and
61 * thus the response data.
62 */
63struct dln2_rx_context {
64	/* completion used to wait for a response */
65	struct completion done;
66
67	/* if non-NULL the URB contains the response */
68	struct urb *urb;
69
70	/* if true then this context is used to wait for a response */
71	bool in_use;
72};
73
74/*
75 * Receive contexts for a particular DLN2 module (i2c, gpio, etc.). We use the
76 * handle header field to identify the module in dln2_dev.mod_rx_slots and then
77 * the echo header field to index the slots field and find the receive context
78 * for a particular request.
79 */
80struct dln2_mod_rx_slots {
81	/* RX slots bitmap */
82	DECLARE_BITMAP(bmap, DLN2_MAX_RX_SLOTS);
83
84	/* used to wait for a free RX slot */
85	wait_queue_head_t wq;
86
87	/* used to wait for an RX operation to complete */
88	struct dln2_rx_context slots[DLN2_MAX_RX_SLOTS];
89
90	/* avoid races between alloc/free_rx_slot and dln2_rx_transfer */
91	spinlock_t lock;
92};
93
94enum dln2_endpoint {
95	DLN2_EP_OUT	= 0,
96	DLN2_EP_IN	= 1,
97};
98
99struct dln2_dev {
100	struct usb_device *usb_dev;
101	struct usb_interface *interface;
102	u8 ep_in;
103	u8 ep_out;
104
105	struct urb *rx_urb[DLN2_MAX_URBS];
106	void *rx_buf[DLN2_MAX_URBS];
107
108	struct dln2_mod_rx_slots mod_rx_slots[DLN2_HANDLES];
109
110	struct list_head event_cb_list;
111	spinlock_t event_cb_lock;
112
113	bool disconnect;
114	int active_transfers;
115	wait_queue_head_t disconnect_wq;
116	spinlock_t disconnect_lock;
117};
118
119struct dln2_event_cb_entry {
120	struct list_head list;
121	u16 id;
122	struct platform_device *pdev;
123	dln2_event_cb_t callback;
124};
125
126int dln2_register_event_cb(struct platform_device *pdev, u16 id,
127			   dln2_event_cb_t event_cb)
128{
129	struct dln2_dev *dln2 = dev_get_drvdata(pdev->dev.parent);
130	struct dln2_event_cb_entry *i, *entry;
131	unsigned long flags;
132	int ret = 0;
133
134	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
135	if (!entry)
136		return -ENOMEM;
137
138	entry->id = id;
139	entry->callback = event_cb;
140	entry->pdev = pdev;
141
142	spin_lock_irqsave(&dln2->event_cb_lock, flags);
143
144	list_for_each_entry(i, &dln2->event_cb_list, list) {
145		if (i->id == id) {
146			ret = -EBUSY;
147			break;
148		}
149	}
150
151	if (!ret)
152		list_add_rcu(&entry->list, &dln2->event_cb_list);
153
154	spin_unlock_irqrestore(&dln2->event_cb_lock, flags);
155
156	if (ret)
157		kfree(entry);
158
159	return ret;
160}
161EXPORT_SYMBOL(dln2_register_event_cb);
162
163void dln2_unregister_event_cb(struct platform_device *pdev, u16 id)
164{
165	struct dln2_dev *dln2 = dev_get_drvdata(pdev->dev.parent);
166	struct dln2_event_cb_entry *i;
167	unsigned long flags;
168	bool found = false;
169
170	spin_lock_irqsave(&dln2->event_cb_lock, flags);
171
172	list_for_each_entry(i, &dln2->event_cb_list, list) {
173		if (i->id == id) {
174			list_del_rcu(&i->list);
175			found = true;
176			break;
177		}
178	}
179
180	spin_unlock_irqrestore(&dln2->event_cb_lock, flags);
181
182	if (found) {
183		synchronize_rcu();
184		kfree(i);
185	}
186}
187EXPORT_SYMBOL(dln2_unregister_event_cb);
188
189/*
190 * Returns true if a valid transfer slot is found. In this case the URB must not
191 * be resubmitted immediately in dln2_rx as we need the data when dln2_transfer
192 * is woke up. It will be resubmitted there.
193 */
194static bool dln2_transfer_complete(struct dln2_dev *dln2, struct urb *urb,
195				   u16 handle, u16 rx_slot)
196{
197	struct device *dev = &dln2->interface->dev;
198	struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[handle];
199	struct dln2_rx_context *rxc;
200	unsigned long flags;
201	bool valid_slot = false;
202
203	if (rx_slot >= DLN2_MAX_RX_SLOTS)
204		goto out;
205
206	rxc = &rxs->slots[rx_slot];
207
208	spin_lock_irqsave(&rxs->lock, flags);
209	if (rxc->in_use && !rxc->urb) {
210		rxc->urb = urb;
211		complete(&rxc->done);
212		valid_slot = true;
213	}
214	spin_unlock_irqrestore(&rxs->lock, flags);
215
216out:
217	if (!valid_slot)
218		dev_warn(dev, "bad/late response %d/%d\n", handle, rx_slot);
219
220	return valid_slot;
221}
222
223static void dln2_run_event_callbacks(struct dln2_dev *dln2, u16 id, u16 echo,
224				     void *data, int len)
225{
226	struct dln2_event_cb_entry *i;
227
228	rcu_read_lock();
229
230	list_for_each_entry_rcu(i, &dln2->event_cb_list, list) {
231		if (i->id == id) {
232			i->callback(i->pdev, echo, data, len);
233			break;
234		}
235	}
236
237	rcu_read_unlock();
238}
239
240static void dln2_rx(struct urb *urb)
241{
242	struct dln2_dev *dln2 = urb->context;
243	struct dln2_header *hdr = urb->transfer_buffer;
244	struct device *dev = &dln2->interface->dev;
245	u16 id, echo, handle, size;
246	u8 *data;
247	int len;
248	int err;
249
250	switch (urb->status) {
251	case 0:
252		/* success */
253		break;
254	case -ECONNRESET:
255	case -ENOENT:
256	case -ESHUTDOWN:
257	case -EPIPE:
258		/* this urb is terminated, clean up */
259		dev_dbg(dev, "urb shutting down with status %d\n", urb->status);
260		return;
261	default:
262		dev_dbg(dev, "nonzero urb status received %d\n", urb->status);
263		goto out;
264	}
265
266	if (urb->actual_length < sizeof(struct dln2_header)) {
267		dev_err(dev, "short response: %d\n", urb->actual_length);
268		goto out;
269	}
270
271	handle = le16_to_cpu(hdr->handle);
272	id = le16_to_cpu(hdr->id);
273	echo = le16_to_cpu(hdr->echo);
274	size = le16_to_cpu(hdr->size);
275
276	if (size != urb->actual_length) {
277		dev_err(dev, "size mismatch: handle %x cmd %x echo %x size %d actual %d\n",
278			handle, id, echo, size, urb->actual_length);
279		goto out;
280	}
281
282	if (handle >= DLN2_HANDLES) {
283		dev_warn(dev, "invalid handle %d\n", handle);
284		goto out;
285	}
286
287	data = urb->transfer_buffer + sizeof(struct dln2_header);
288	len = urb->actual_length - sizeof(struct dln2_header);
289
290	if (handle == DLN2_HANDLE_EVENT) {
291		unsigned long flags;
292
293		spin_lock_irqsave(&dln2->event_cb_lock, flags);
294		dln2_run_event_callbacks(dln2, id, echo, data, len);
295		spin_unlock_irqrestore(&dln2->event_cb_lock, flags);
296	} else {
297		/* URB will be re-submitted in _dln2_transfer (free_rx_slot) */
298		if (dln2_transfer_complete(dln2, urb, handle, echo))
299			return;
300	}
301
302out:
303	err = usb_submit_urb(urb, GFP_ATOMIC);
304	if (err < 0)
305		dev_err(dev, "failed to resubmit RX URB: %d\n", err);
306}
307
308static void *dln2_prep_buf(u16 handle, u16 cmd, u16 echo, const void *obuf,
309			   int *obuf_len, gfp_t gfp)
310{
311	int len;
312	void *buf;
313	struct dln2_header *hdr;
314
315	len = *obuf_len + sizeof(*hdr);
316	buf = kmalloc(len, gfp);
317	if (!buf)
318		return NULL;
319
320	hdr = (struct dln2_header *)buf;
321	hdr->id = cpu_to_le16(cmd);
322	hdr->size = cpu_to_le16(len);
323	hdr->echo = cpu_to_le16(echo);
324	hdr->handle = cpu_to_le16(handle);
325
326	memcpy(buf + sizeof(*hdr), obuf, *obuf_len);
327
328	*obuf_len = len;
329
330	return buf;
331}
332
333static int dln2_send_wait(struct dln2_dev *dln2, u16 handle, u16 cmd, u16 echo,
334			  const void *obuf, int obuf_len)
335{
336	int ret = 0;
337	int len = obuf_len;
338	void *buf;
339	int actual;
340
341	buf = dln2_prep_buf(handle, cmd, echo, obuf, &len, GFP_KERNEL);
342	if (!buf)
343		return -ENOMEM;
344
345	ret = usb_bulk_msg(dln2->usb_dev,
346			   usb_sndbulkpipe(dln2->usb_dev, dln2->ep_out),
347			   buf, len, &actual, DLN2_USB_TIMEOUT);
348
349	kfree(buf);
350
351	return ret;
352}
353
354static bool find_free_slot(struct dln2_dev *dln2, u16 handle, int *slot)
355{
356	struct dln2_mod_rx_slots *rxs;
357	unsigned long flags;
358
359	if (dln2->disconnect) {
360		*slot = -ENODEV;
361		return true;
362	}
363
364	rxs = &dln2->mod_rx_slots[handle];
365
366	spin_lock_irqsave(&rxs->lock, flags);
367
368	*slot = find_first_zero_bit(rxs->bmap, DLN2_MAX_RX_SLOTS);
369
370	if (*slot < DLN2_MAX_RX_SLOTS) {
371		struct dln2_rx_context *rxc = &rxs->slots[*slot];
372
373		set_bit(*slot, rxs->bmap);
374		rxc->in_use = true;
375	}
376
377	spin_unlock_irqrestore(&rxs->lock, flags);
378
379	return *slot < DLN2_MAX_RX_SLOTS;
380}
381
382static int alloc_rx_slot(struct dln2_dev *dln2, u16 handle)
383{
384	int ret;
385	int slot;
386
387	/*
388	 * No need to timeout here, the wait is bounded by the timeout in
389	 * _dln2_transfer.
390	 */
391	ret = wait_event_interruptible(dln2->mod_rx_slots[handle].wq,
392				       find_free_slot(dln2, handle, &slot));
393	if (ret < 0)
394		return ret;
395
396	return slot;
397}
398
399static void free_rx_slot(struct dln2_dev *dln2, u16 handle, int slot)
400{
401	struct dln2_mod_rx_slots *rxs;
402	struct urb *urb = NULL;
403	unsigned long flags;
404	struct dln2_rx_context *rxc;
405
406	rxs = &dln2->mod_rx_slots[handle];
407
408	spin_lock_irqsave(&rxs->lock, flags);
409
410	clear_bit(slot, rxs->bmap);
411
412	rxc = &rxs->slots[slot];
413	rxc->in_use = false;
414	urb = rxc->urb;
415	rxc->urb = NULL;
416	reinit_completion(&rxc->done);
417
418	spin_unlock_irqrestore(&rxs->lock, flags);
419
420	if (urb) {
421		int err;
422		struct device *dev = &dln2->interface->dev;
423
424		err = usb_submit_urb(urb, GFP_KERNEL);
425		if (err < 0)
426			dev_err(dev, "failed to resubmit RX URB: %d\n", err);
427	}
428
429	wake_up_interruptible(&rxs->wq);
430}
431
432static int _dln2_transfer(struct dln2_dev *dln2, u16 handle, u16 cmd,
433			  const void *obuf, unsigned obuf_len,
434			  void *ibuf, unsigned *ibuf_len)
435{
436	int ret = 0;
437	int rx_slot;
438	struct dln2_response *rsp;
439	struct dln2_rx_context *rxc;
440	struct device *dev = &dln2->interface->dev;
441	const unsigned long timeout = msecs_to_jiffies(DLN2_USB_TIMEOUT);
442	struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[handle];
443	int size;
444
445	spin_lock(&dln2->disconnect_lock);
446	if (!dln2->disconnect)
447		dln2->active_transfers++;
448	else
449		ret = -ENODEV;
450	spin_unlock(&dln2->disconnect_lock);
451
452	if (ret)
453		return ret;
454
455	rx_slot = alloc_rx_slot(dln2, handle);
456	if (rx_slot < 0) {
457		ret = rx_slot;
458		goto out_decr;
459	}
460
461	ret = dln2_send_wait(dln2, handle, cmd, rx_slot, obuf, obuf_len);
462	if (ret < 0) {
463		dev_err(dev, "USB write failed: %d\n", ret);
464		goto out_free_rx_slot;
465	}
466
467	rxc = &rxs->slots[rx_slot];
468
469	ret = wait_for_completion_interruptible_timeout(&rxc->done, timeout);
470	if (ret <= 0) {
471		if (!ret)
472			ret = -ETIMEDOUT;
473		goto out_free_rx_slot;
474	} else {
475		ret = 0;
476	}
477
478	if (dln2->disconnect) {
479		ret = -ENODEV;
480		goto out_free_rx_slot;
481	}
482
483	/* if we got here we know that the response header has been checked */
484	rsp = rxc->urb->transfer_buffer;
485	size = le16_to_cpu(rsp->hdr.size);
486
487	if (size < sizeof(*rsp)) {
488		ret = -EPROTO;
489		goto out_free_rx_slot;
490	}
491
492	if (le16_to_cpu(rsp->result) > 0x80) {
493		dev_dbg(dev, "%d received response with error %d\n",
494			handle, le16_to_cpu(rsp->result));
495		ret = -EREMOTEIO;
496		goto out_free_rx_slot;
497	}
498
499	if (!ibuf)
500		goto out_free_rx_slot;
501
502	if (*ibuf_len > size - sizeof(*rsp))
503		*ibuf_len = size - sizeof(*rsp);
504
505	memcpy(ibuf, rsp + 1, *ibuf_len);
506
507out_free_rx_slot:
508	free_rx_slot(dln2, handle, rx_slot);
509out_decr:
510	spin_lock(&dln2->disconnect_lock);
511	dln2->active_transfers--;
512	spin_unlock(&dln2->disconnect_lock);
513	if (dln2->disconnect)
514		wake_up(&dln2->disconnect_wq);
515
516	return ret;
517}
518
519int dln2_transfer(struct platform_device *pdev, u16 cmd,
520		  const void *obuf, unsigned obuf_len,
521		  void *ibuf, unsigned *ibuf_len)
522{
523	struct dln2_platform_data *dln2_pdata;
524	struct dln2_dev *dln2;
525	u16 handle;
526
527	dln2 = dev_get_drvdata(pdev->dev.parent);
528	dln2_pdata = dev_get_platdata(&pdev->dev);
529	handle = dln2_pdata->handle;
530
531	return _dln2_transfer(dln2, handle, cmd, obuf, obuf_len, ibuf,
532			      ibuf_len);
533}
534EXPORT_SYMBOL(dln2_transfer);
535
536static int dln2_check_hw(struct dln2_dev *dln2)
537{
538	int ret;
539	__le32 hw_type;
540	int len = sizeof(hw_type);
541
542	ret = _dln2_transfer(dln2, DLN2_HANDLE_CTRL, CMD_GET_DEVICE_VER,
543			     NULL, 0, &hw_type, &len);
544	if (ret < 0)
545		return ret;
546	if (len < sizeof(hw_type))
547		return -EREMOTEIO;
548
549	if (le32_to_cpu(hw_type) != DLN2_HW_ID) {
550		dev_err(&dln2->interface->dev, "Device ID 0x%x not supported\n",
551			le32_to_cpu(hw_type));
552		return -ENODEV;
553	}
554
555	return 0;
556}
557
558static int dln2_print_serialno(struct dln2_dev *dln2)
559{
560	int ret;
561	__le32 serial_no;
562	int len = sizeof(serial_no);
563	struct device *dev = &dln2->interface->dev;
564
565	ret = _dln2_transfer(dln2, DLN2_HANDLE_CTRL, CMD_GET_DEVICE_SN, NULL, 0,
566			     &serial_no, &len);
567	if (ret < 0)
568		return ret;
569	if (len < sizeof(serial_no))
570		return -EREMOTEIO;
571
572	dev_info(dev, "Diolan DLN2 serial %u\n", le32_to_cpu(serial_no));
573
574	return 0;
575}
576
577static int dln2_hw_init(struct dln2_dev *dln2)
578{
579	int ret;
580
581	ret = dln2_check_hw(dln2);
582	if (ret < 0)
583		return ret;
584
585	return dln2_print_serialno(dln2);
586}
587
588static void dln2_free_rx_urbs(struct dln2_dev *dln2)
589{
590	int i;
591
592	for (i = 0; i < DLN2_MAX_URBS; i++) {
593		usb_free_urb(dln2->rx_urb[i]);
594		kfree(dln2->rx_buf[i]);
595	}
596}
597
598static void dln2_stop_rx_urbs(struct dln2_dev *dln2)
599{
600	int i;
601
602	for (i = 0; i < DLN2_MAX_URBS; i++)
603		usb_kill_urb(dln2->rx_urb[i]);
604}
605
606static void dln2_free(struct dln2_dev *dln2)
607{
608	dln2_free_rx_urbs(dln2);
609	usb_put_dev(dln2->usb_dev);
610	kfree(dln2);
611}
612
613static int dln2_setup_rx_urbs(struct dln2_dev *dln2,
614			      struct usb_host_interface *hostif)
615{
616	int i;
617	const int rx_max_size = DLN2_RX_BUF_SIZE;
618
619	for (i = 0; i < DLN2_MAX_URBS; i++) {
620		dln2->rx_buf[i] = kmalloc(rx_max_size, GFP_KERNEL);
621		if (!dln2->rx_buf[i])
622			return -ENOMEM;
623
624		dln2->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
625		if (!dln2->rx_urb[i])
626			return -ENOMEM;
627
628		usb_fill_bulk_urb(dln2->rx_urb[i], dln2->usb_dev,
629				  usb_rcvbulkpipe(dln2->usb_dev, dln2->ep_in),
630				  dln2->rx_buf[i], rx_max_size, dln2_rx, dln2);
631	}
632
633	return 0;
634}
635
636static int dln2_start_rx_urbs(struct dln2_dev *dln2, gfp_t gfp)
637{
638	struct device *dev = &dln2->interface->dev;
639	int ret;
640	int i;
641
642	for (i = 0; i < DLN2_MAX_URBS; i++) {
643		ret = usb_submit_urb(dln2->rx_urb[i], gfp);
644		if (ret < 0) {
645			dev_err(dev, "failed to submit RX URB: %d\n", ret);
646			return ret;
647		}
648	}
649
650	return 0;
651}
652
653enum {
654	DLN2_ACPI_MATCH_GPIO	= 0,
655	DLN2_ACPI_MATCH_I2C	= 1,
656	DLN2_ACPI_MATCH_SPI	= 2,
657	DLN2_ACPI_MATCH_ADC	= 3,
658};
659
660static struct dln2_platform_data dln2_pdata_gpio = {
661	.handle = DLN2_HANDLE_GPIO,
662};
663
664static struct mfd_cell_acpi_match dln2_acpi_match_gpio = {
665	.adr = DLN2_ACPI_MATCH_GPIO,
666};
667
668/* Only one I2C port seems to be supported on current hardware */
669static struct dln2_platform_data dln2_pdata_i2c = {
670	.handle = DLN2_HANDLE_I2C,
671	.port = 0,
672};
673
674static struct mfd_cell_acpi_match dln2_acpi_match_i2c = {
675	.adr = DLN2_ACPI_MATCH_I2C,
676};
677
678/* Only one SPI port supported */
679static struct dln2_platform_data dln2_pdata_spi = {
680	.handle = DLN2_HANDLE_SPI,
681	.port = 0,
682};
683
684static struct mfd_cell_acpi_match dln2_acpi_match_spi = {
685	.adr = DLN2_ACPI_MATCH_SPI,
686};
687
688/* Only one ADC port supported */
689static struct dln2_platform_data dln2_pdata_adc = {
690	.handle = DLN2_HANDLE_ADC,
691	.port = 0,
692};
693
694static struct mfd_cell_acpi_match dln2_acpi_match_adc = {
695	.adr = DLN2_ACPI_MATCH_ADC,
696};
697
698static const struct mfd_cell dln2_devs[] = {
699	{
700		.name = "dln2-gpio",
701		.acpi_match = &dln2_acpi_match_gpio,
702		.platform_data = &dln2_pdata_gpio,
703		.pdata_size = sizeof(struct dln2_platform_data),
704	},
705	{
706		.name = "dln2-i2c",
707		.acpi_match = &dln2_acpi_match_i2c,
708		.platform_data = &dln2_pdata_i2c,
709		.pdata_size = sizeof(struct dln2_platform_data),
710	},
711	{
712		.name = "dln2-spi",
713		.acpi_match = &dln2_acpi_match_spi,
714		.platform_data = &dln2_pdata_spi,
715		.pdata_size = sizeof(struct dln2_platform_data),
716	},
717	{
718		.name = "dln2-adc",
719		.acpi_match = &dln2_acpi_match_adc,
720		.platform_data = &dln2_pdata_adc,
721		.pdata_size = sizeof(struct dln2_platform_data),
722	},
723};
724
725static void dln2_stop(struct dln2_dev *dln2)
726{
727	int i, j;
728
729	/* don't allow starting new transfers */
730	spin_lock(&dln2->disconnect_lock);
731	dln2->disconnect = true;
732	spin_unlock(&dln2->disconnect_lock);
733
734	/* cancel in progress transfers */
735	for (i = 0; i < DLN2_HANDLES; i++) {
736		struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[i];
737		unsigned long flags;
738
739		spin_lock_irqsave(&rxs->lock, flags);
740
741		/* cancel all response waiters */
742		for (j = 0; j < DLN2_MAX_RX_SLOTS; j++) {
743			struct dln2_rx_context *rxc = &rxs->slots[j];
744
745			if (rxc->in_use)
746				complete(&rxc->done);
747		}
748
749		spin_unlock_irqrestore(&rxs->lock, flags);
750	}
751
752	/* wait for transfers to end */
753	wait_event(dln2->disconnect_wq, !dln2->active_transfers);
754
755	dln2_stop_rx_urbs(dln2);
756}
757
758static void dln2_disconnect(struct usb_interface *interface)
759{
760	struct dln2_dev *dln2 = usb_get_intfdata(interface);
761
762	dln2_stop(dln2);
763
764	mfd_remove_devices(&interface->dev);
765
766	dln2_free(dln2);
767}
768
769static int dln2_probe(struct usb_interface *interface,
770		      const struct usb_device_id *usb_id)
771{
772	struct usb_host_interface *hostif = interface->cur_altsetting;
773	struct usb_endpoint_descriptor *epin;
774	struct usb_endpoint_descriptor *epout;
775	struct device *dev = &interface->dev;
776	struct dln2_dev *dln2;
777	int ret;
778	int i, j;
779
780	if (hostif->desc.bInterfaceNumber != 0 ||
781	    hostif->desc.bNumEndpoints < 2)
782		return -ENODEV;
783
784	epout = &hostif->endpoint[DLN2_EP_OUT].desc;
785	if (!usb_endpoint_is_bulk_out(epout))
786		return -ENODEV;
787	epin = &hostif->endpoint[DLN2_EP_IN].desc;
788	if (!usb_endpoint_is_bulk_in(epin))
789		return -ENODEV;
790
791	dln2 = kzalloc(sizeof(*dln2), GFP_KERNEL);
792	if (!dln2)
793		return -ENOMEM;
794
795	dln2->ep_out = epout->bEndpointAddress;
796	dln2->ep_in = epin->bEndpointAddress;
797	dln2->usb_dev = usb_get_dev(interface_to_usbdev(interface));
798	dln2->interface = interface;
799	usb_set_intfdata(interface, dln2);
800	init_waitqueue_head(&dln2->disconnect_wq);
801
802	for (i = 0; i < DLN2_HANDLES; i++) {
803		init_waitqueue_head(&dln2->mod_rx_slots[i].wq);
804		spin_lock_init(&dln2->mod_rx_slots[i].lock);
805		for (j = 0; j < DLN2_MAX_RX_SLOTS; j++)
806			init_completion(&dln2->mod_rx_slots[i].slots[j].done);
807	}
808
809	spin_lock_init(&dln2->event_cb_lock);
810	spin_lock_init(&dln2->disconnect_lock);
811	INIT_LIST_HEAD(&dln2->event_cb_list);
812
813	ret = dln2_setup_rx_urbs(dln2, hostif);
814	if (ret)
815		goto out_free;
816
817	ret = dln2_start_rx_urbs(dln2, GFP_KERNEL);
818	if (ret)
819		goto out_stop_rx;
820
821	ret = dln2_hw_init(dln2);
822	if (ret < 0) {
823		dev_err(dev, "failed to initialize hardware\n");
824		goto out_stop_rx;
825	}
826
827	ret = mfd_add_hotplug_devices(dev, dln2_devs, ARRAY_SIZE(dln2_devs));
828	if (ret != 0) {
829		dev_err(dev, "failed to add mfd devices to core\n");
830		goto out_stop_rx;
831	}
832
833	return 0;
834
835out_stop_rx:
836	dln2_stop_rx_urbs(dln2);
837
838out_free:
839	dln2_free(dln2);
840
841	return ret;
842}
843
844static int dln2_suspend(struct usb_interface *iface, pm_message_t message)
845{
846	struct dln2_dev *dln2 = usb_get_intfdata(iface);
847
848	dln2_stop(dln2);
849
850	return 0;
851}
852
853static int dln2_resume(struct usb_interface *iface)
854{
855	struct dln2_dev *dln2 = usb_get_intfdata(iface);
856
857	dln2->disconnect = false;
858
859	return dln2_start_rx_urbs(dln2, GFP_NOIO);
860}
861
862static const struct usb_device_id dln2_table[] = {
863	{ USB_DEVICE(0xa257, 0x2013) },
864	{ }
865};
866
867MODULE_DEVICE_TABLE(usb, dln2_table);
868
869static struct usb_driver dln2_driver = {
870	.name = "dln2",
871	.probe = dln2_probe,
872	.disconnect = dln2_disconnect,
873	.id_table = dln2_table,
874	.suspend = dln2_suspend,
875	.resume = dln2_resume,
876};
877
878module_usb_driver(dln2_driver);
879
880MODULE_AUTHOR("Octavian Purdila <octavian.purdila@intel.com>");
881MODULE_DESCRIPTION("Core driver for the Diolan DLN2 interface adapter");
882MODULE_LICENSE("GPL v2");
883