xref: /openbmc/linux/sound/usb/misc/ua101.c (revision 424f0750)
1bc700ab1SDaniel Mack /*
2bc700ab1SDaniel Mack  * Edirol UA-101/UA-1000 driver
3bc700ab1SDaniel Mack  * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
4bc700ab1SDaniel Mack  *
5bc700ab1SDaniel Mack  * This driver is free software: you can redistribute it and/or modify
6bc700ab1SDaniel Mack  * it under the terms of the GNU General Public License, version 2.
7bc700ab1SDaniel Mack  *
8bc700ab1SDaniel Mack  * This driver is distributed in the hope that it will be useful,
9bc700ab1SDaniel Mack  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10bc700ab1SDaniel Mack  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11bc700ab1SDaniel Mack  * GNU General Public License for more details.
12bc700ab1SDaniel Mack  *
13bc700ab1SDaniel Mack  * You should have received a copy of the GNU General Public License
14bc700ab1SDaniel Mack  * along with this driver.  If not, see <http://www.gnu.org/licenses/>.
15bc700ab1SDaniel Mack  */
16bc700ab1SDaniel Mack 
17bc700ab1SDaniel Mack #include <linux/init.h>
18bc700ab1SDaniel Mack #include <linux/module.h>
19bc700ab1SDaniel Mack #include <linux/slab.h>
20bc700ab1SDaniel Mack #include <linux/usb.h>
21bc700ab1SDaniel Mack #include <linux/usb/audio.h>
22bc700ab1SDaniel Mack #include <sound/core.h>
23bc700ab1SDaniel Mack #include <sound/initval.h>
24bc700ab1SDaniel Mack #include <sound/pcm.h>
25bc700ab1SDaniel Mack #include <sound/pcm_params.h>
26bc700ab1SDaniel Mack #include "../usbaudio.h"
27e5779998SDaniel Mack #include "../midi.h"
28bc700ab1SDaniel Mack 
29bc700ab1SDaniel Mack MODULE_DESCRIPTION("Edirol UA-101/1000 driver");
30bc700ab1SDaniel Mack MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
31bc700ab1SDaniel Mack MODULE_LICENSE("GPL v2");
32bc700ab1SDaniel Mack MODULE_SUPPORTED_DEVICE("{{Edirol,UA-101},{Edirol,UA-1000}}");
33bc700ab1SDaniel Mack 
34bc700ab1SDaniel Mack /*
35bc700ab1SDaniel Mack  * Should not be lower than the minimum scheduling delay of the host
36bc700ab1SDaniel Mack  * controller.  Some Intel controllers need more than one frame; as long as
37bc700ab1SDaniel Mack  * that driver doesn't tell us about this, use 1.5 frames just to be sure.
38bc700ab1SDaniel Mack  */
39bc700ab1SDaniel Mack #define MIN_QUEUE_LENGTH	12
40bc700ab1SDaniel Mack /* Somewhat random. */
41bc700ab1SDaniel Mack #define MAX_QUEUE_LENGTH	30
42bc700ab1SDaniel Mack /*
43bc700ab1SDaniel Mack  * This magic value optimizes memory usage efficiency for the UA-101's packet
44bc700ab1SDaniel Mack  * sizes at all sample rates, taking into account the stupid cache pool sizes
457a9b1492SLinus Torvalds  * that usb_alloc_coherent() uses.
46bc700ab1SDaniel Mack  */
47bc700ab1SDaniel Mack #define DEFAULT_QUEUE_LENGTH	21
48bc700ab1SDaniel Mack 
49bc700ab1SDaniel Mack #define MAX_PACKET_SIZE		672 /* hardware specific */
50bc700ab1SDaniel Mack #define MAX_MEMORY_BUFFERS	DIV_ROUND_UP(MAX_QUEUE_LENGTH, \
51bc700ab1SDaniel Mack 					     PAGE_SIZE / MAX_PACKET_SIZE)
52bc700ab1SDaniel Mack 
53bc700ab1SDaniel Mack static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
54bc700ab1SDaniel Mack static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
55bc700ab1SDaniel Mack static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
56bc700ab1SDaniel Mack static unsigned int queue_length = 21;
57bc700ab1SDaniel Mack 
58bc700ab1SDaniel Mack module_param_array(index, int, NULL, 0444);
59bc700ab1SDaniel Mack MODULE_PARM_DESC(index, "card index");
60bc700ab1SDaniel Mack module_param_array(id, charp, NULL, 0444);
61bc700ab1SDaniel Mack MODULE_PARM_DESC(id, "ID string");
62bc700ab1SDaniel Mack module_param_array(enable, bool, NULL, 0444);
63bc700ab1SDaniel Mack MODULE_PARM_DESC(enable, "enable card");
64bc700ab1SDaniel Mack module_param(queue_length, uint, 0644);
65bc700ab1SDaniel Mack MODULE_PARM_DESC(queue_length, "USB queue length in microframes, "
66bc700ab1SDaniel Mack 		 __stringify(MIN_QUEUE_LENGTH)"-"__stringify(MAX_QUEUE_LENGTH));
67bc700ab1SDaniel Mack 
68bc700ab1SDaniel Mack enum {
69bc700ab1SDaniel Mack 	INTF_PLAYBACK,
70bc700ab1SDaniel Mack 	INTF_CAPTURE,
71bc700ab1SDaniel Mack 	INTF_MIDI,
72bc700ab1SDaniel Mack 
73bc700ab1SDaniel Mack 	INTF_COUNT
74bc700ab1SDaniel Mack };
75bc700ab1SDaniel Mack 
76bc700ab1SDaniel Mack /* bits in struct ua101::states */
77bc700ab1SDaniel Mack enum {
78bc700ab1SDaniel Mack 	USB_CAPTURE_RUNNING,
79bc700ab1SDaniel Mack 	USB_PLAYBACK_RUNNING,
80bc700ab1SDaniel Mack 	ALSA_CAPTURE_OPEN,
81bc700ab1SDaniel Mack 	ALSA_PLAYBACK_OPEN,
82bc700ab1SDaniel Mack 	ALSA_CAPTURE_RUNNING,
83bc700ab1SDaniel Mack 	ALSA_PLAYBACK_RUNNING,
84bc700ab1SDaniel Mack 	CAPTURE_URB_COMPLETED,
85bc700ab1SDaniel Mack 	PLAYBACK_URB_COMPLETED,
86bc700ab1SDaniel Mack 	DISCONNECTED,
87bc700ab1SDaniel Mack };
88bc700ab1SDaniel Mack 
89bc700ab1SDaniel Mack struct ua101 {
90bc700ab1SDaniel Mack 	struct usb_device *dev;
91bc700ab1SDaniel Mack 	struct snd_card *card;
92bc700ab1SDaniel Mack 	struct usb_interface *intf[INTF_COUNT];
93bc700ab1SDaniel Mack 	int card_index;
94bc700ab1SDaniel Mack 	struct snd_pcm *pcm;
95bc700ab1SDaniel Mack 	struct list_head midi_list;
96bc700ab1SDaniel Mack 	u64 format_bit;
97bc700ab1SDaniel Mack 	unsigned int rate;
98bc700ab1SDaniel Mack 	unsigned int packets_per_second;
99bc700ab1SDaniel Mack 	spinlock_t lock;
100bc700ab1SDaniel Mack 	struct mutex mutex;
101bc700ab1SDaniel Mack 	unsigned long states;
102bc700ab1SDaniel Mack 
103bc700ab1SDaniel Mack 	/* FIFO to synchronize playback rate to capture rate */
104bc700ab1SDaniel Mack 	unsigned int rate_feedback_start;
105bc700ab1SDaniel Mack 	unsigned int rate_feedback_count;
106bc700ab1SDaniel Mack 	u8 rate_feedback[MAX_QUEUE_LENGTH];
107bc700ab1SDaniel Mack 
108bc700ab1SDaniel Mack 	struct list_head ready_playback_urbs;
109bc700ab1SDaniel Mack 	struct tasklet_struct playback_tasklet;
110bc700ab1SDaniel Mack 	wait_queue_head_t alsa_capture_wait;
111bc700ab1SDaniel Mack 	wait_queue_head_t rate_feedback_wait;
112bc700ab1SDaniel Mack 	wait_queue_head_t alsa_playback_wait;
113bc700ab1SDaniel Mack 	struct ua101_stream {
114bc700ab1SDaniel Mack 		struct snd_pcm_substream *substream;
115bc700ab1SDaniel Mack 		unsigned int usb_pipe;
116bc700ab1SDaniel Mack 		unsigned int channels;
117bc700ab1SDaniel Mack 		unsigned int frame_bytes;
118bc700ab1SDaniel Mack 		unsigned int max_packet_bytes;
119bc700ab1SDaniel Mack 		unsigned int period_pos;
120bc700ab1SDaniel Mack 		unsigned int buffer_pos;
121bc700ab1SDaniel Mack 		unsigned int queue_length;
122bc700ab1SDaniel Mack 		struct ua101_urb {
123bc700ab1SDaniel Mack 			struct urb urb;
124bc700ab1SDaniel Mack 			struct usb_iso_packet_descriptor iso_frame_desc[1];
125bc700ab1SDaniel Mack 			struct list_head ready_list;
126bc700ab1SDaniel Mack 		} *urbs[MAX_QUEUE_LENGTH];
127bc700ab1SDaniel Mack 		struct {
128bc700ab1SDaniel Mack 			unsigned int size;
129bc700ab1SDaniel Mack 			void *addr;
130bc700ab1SDaniel Mack 			dma_addr_t dma;
131bc700ab1SDaniel Mack 		} buffers[MAX_MEMORY_BUFFERS];
132bc700ab1SDaniel Mack 	} capture, playback;
133bc700ab1SDaniel Mack };
134bc700ab1SDaniel Mack 
135bc700ab1SDaniel Mack static DEFINE_MUTEX(devices_mutex);
136bc700ab1SDaniel Mack static unsigned int devices_used;
137bc700ab1SDaniel Mack static struct usb_driver ua101_driver;
138bc700ab1SDaniel Mack 
139bc700ab1SDaniel Mack static void abort_alsa_playback(struct ua101 *ua);
140bc700ab1SDaniel Mack static void abort_alsa_capture(struct ua101 *ua);
141bc700ab1SDaniel Mack 
142bc700ab1SDaniel Mack static const char *usb_error_string(int err)
143bc700ab1SDaniel Mack {
144bc700ab1SDaniel Mack 	switch (err) {
145bc700ab1SDaniel Mack 	case -ENODEV:
146bc700ab1SDaniel Mack 		return "no device";
147bc700ab1SDaniel Mack 	case -ENOENT:
148bc700ab1SDaniel Mack 		return "endpoint not enabled";
149bc700ab1SDaniel Mack 	case -EPIPE:
150bc700ab1SDaniel Mack 		return "endpoint stalled";
151bc700ab1SDaniel Mack 	case -ENOSPC:
152bc700ab1SDaniel Mack 		return "not enough bandwidth";
153bc700ab1SDaniel Mack 	case -ESHUTDOWN:
154bc700ab1SDaniel Mack 		return "device disabled";
155bc700ab1SDaniel Mack 	case -EHOSTUNREACH:
156bc700ab1SDaniel Mack 		return "device suspended";
157bc700ab1SDaniel Mack 	case -EINVAL:
158bc700ab1SDaniel Mack 	case -EAGAIN:
159bc700ab1SDaniel Mack 	case -EFBIG:
160bc700ab1SDaniel Mack 	case -EMSGSIZE:
161bc700ab1SDaniel Mack 		return "internal error";
162bc700ab1SDaniel Mack 	default:
163bc700ab1SDaniel Mack 		return "unknown error";
164bc700ab1SDaniel Mack 	}
165bc700ab1SDaniel Mack }
166bc700ab1SDaniel Mack 
167bc700ab1SDaniel Mack static void abort_usb_capture(struct ua101 *ua)
168bc700ab1SDaniel Mack {
169bc700ab1SDaniel Mack 	if (test_and_clear_bit(USB_CAPTURE_RUNNING, &ua->states)) {
170bc700ab1SDaniel Mack 		wake_up(&ua->alsa_capture_wait);
171bc700ab1SDaniel Mack 		wake_up(&ua->rate_feedback_wait);
172bc700ab1SDaniel Mack 	}
173bc700ab1SDaniel Mack }
174bc700ab1SDaniel Mack 
175bc700ab1SDaniel Mack static void abort_usb_playback(struct ua101 *ua)
176bc700ab1SDaniel Mack {
177bc700ab1SDaniel Mack 	if (test_and_clear_bit(USB_PLAYBACK_RUNNING, &ua->states))
178bc700ab1SDaniel Mack 		wake_up(&ua->alsa_playback_wait);
179bc700ab1SDaniel Mack }
180bc700ab1SDaniel Mack 
181bc700ab1SDaniel Mack static void playback_urb_complete(struct urb *usb_urb)
182bc700ab1SDaniel Mack {
183bc700ab1SDaniel Mack 	struct ua101_urb *urb = (struct ua101_urb *)usb_urb;
184bc700ab1SDaniel Mack 	struct ua101 *ua = urb->urb.context;
185bc700ab1SDaniel Mack 	unsigned long flags;
186bc700ab1SDaniel Mack 
187bc700ab1SDaniel Mack 	if (unlikely(urb->urb.status == -ENOENT ||	/* unlinked */
188bc700ab1SDaniel Mack 		     urb->urb.status == -ENODEV ||	/* device removed */
189bc700ab1SDaniel Mack 		     urb->urb.status == -ECONNRESET ||	/* unlinked */
190bc700ab1SDaniel Mack 		     urb->urb.status == -ESHUTDOWN)) {	/* device disabled */
191bc700ab1SDaniel Mack 		abort_usb_playback(ua);
192bc700ab1SDaniel Mack 		abort_alsa_playback(ua);
193bc700ab1SDaniel Mack 		return;
194bc700ab1SDaniel Mack 	}
195bc700ab1SDaniel Mack 
196bc700ab1SDaniel Mack 	if (test_bit(USB_PLAYBACK_RUNNING, &ua->states)) {
197bc700ab1SDaniel Mack 		/* append URB to FIFO */
198bc700ab1SDaniel Mack 		spin_lock_irqsave(&ua->lock, flags);
199bc700ab1SDaniel Mack 		list_add_tail(&urb->ready_list, &ua->ready_playback_urbs);
200bc700ab1SDaniel Mack 		if (ua->rate_feedback_count > 0)
201bc700ab1SDaniel Mack 			tasklet_schedule(&ua->playback_tasklet);
202bc700ab1SDaniel Mack 		ua->playback.substream->runtime->delay -=
203bc700ab1SDaniel Mack 				urb->urb.iso_frame_desc[0].length /
204bc700ab1SDaniel Mack 						ua->playback.frame_bytes;
205bc700ab1SDaniel Mack 		spin_unlock_irqrestore(&ua->lock, flags);
206bc700ab1SDaniel Mack 	}
207bc700ab1SDaniel Mack }
208bc700ab1SDaniel Mack 
209bc700ab1SDaniel Mack static void first_playback_urb_complete(struct urb *urb)
210bc700ab1SDaniel Mack {
211bc700ab1SDaniel Mack 	struct ua101 *ua = urb->context;
212bc700ab1SDaniel Mack 
213bc700ab1SDaniel Mack 	urb->complete = playback_urb_complete;
214bc700ab1SDaniel Mack 	playback_urb_complete(urb);
215bc700ab1SDaniel Mack 
216bc700ab1SDaniel Mack 	set_bit(PLAYBACK_URB_COMPLETED, &ua->states);
217bc700ab1SDaniel Mack 	wake_up(&ua->alsa_playback_wait);
218bc700ab1SDaniel Mack }
219bc700ab1SDaniel Mack 
220bc700ab1SDaniel Mack /* copy data from the ALSA ring buffer into the URB buffer */
221bc700ab1SDaniel Mack static bool copy_playback_data(struct ua101_stream *stream, struct urb *urb,
222bc700ab1SDaniel Mack 			       unsigned int frames)
223bc700ab1SDaniel Mack {
224bc700ab1SDaniel Mack 	struct snd_pcm_runtime *runtime;
225bc700ab1SDaniel Mack 	unsigned int frame_bytes, frames1;
226bc700ab1SDaniel Mack 	const u8 *source;
227bc700ab1SDaniel Mack 
228bc700ab1SDaniel Mack 	runtime = stream->substream->runtime;
229bc700ab1SDaniel Mack 	frame_bytes = stream->frame_bytes;
230bc700ab1SDaniel Mack 	source = runtime->dma_area + stream->buffer_pos * frame_bytes;
231bc700ab1SDaniel Mack 	if (stream->buffer_pos + frames <= runtime->buffer_size) {
232bc700ab1SDaniel Mack 		memcpy(urb->transfer_buffer, source, frames * frame_bytes);
233bc700ab1SDaniel Mack 	} else {
234bc700ab1SDaniel Mack 		/* wrap around at end of ring buffer */
235bc700ab1SDaniel Mack 		frames1 = runtime->buffer_size - stream->buffer_pos;
236bc700ab1SDaniel Mack 		memcpy(urb->transfer_buffer, source, frames1 * frame_bytes);
237bc700ab1SDaniel Mack 		memcpy(urb->transfer_buffer + frames1 * frame_bytes,
238bc700ab1SDaniel Mack 		       runtime->dma_area, (frames - frames1) * frame_bytes);
239bc700ab1SDaniel Mack 	}
240bc700ab1SDaniel Mack 
241bc700ab1SDaniel Mack 	stream->buffer_pos += frames;
242bc700ab1SDaniel Mack 	if (stream->buffer_pos >= runtime->buffer_size)
243bc700ab1SDaniel Mack 		stream->buffer_pos -= runtime->buffer_size;
244bc700ab1SDaniel Mack 	stream->period_pos += frames;
245bc700ab1SDaniel Mack 	if (stream->period_pos >= runtime->period_size) {
246bc700ab1SDaniel Mack 		stream->period_pos -= runtime->period_size;
247bc700ab1SDaniel Mack 		return true;
248bc700ab1SDaniel Mack 	}
249bc700ab1SDaniel Mack 	return false;
250bc700ab1SDaniel Mack }
251bc700ab1SDaniel Mack 
252bc700ab1SDaniel Mack static inline void add_with_wraparound(struct ua101 *ua,
253bc700ab1SDaniel Mack 				       unsigned int *value, unsigned int add)
254bc700ab1SDaniel Mack {
255bc700ab1SDaniel Mack 	*value += add;
256bc700ab1SDaniel Mack 	if (*value >= ua->playback.queue_length)
257bc700ab1SDaniel Mack 		*value -= ua->playback.queue_length;
258bc700ab1SDaniel Mack }
259bc700ab1SDaniel Mack 
260bc700ab1SDaniel Mack static void playback_tasklet(unsigned long data)
261bc700ab1SDaniel Mack {
262bc700ab1SDaniel Mack 	struct ua101 *ua = (void *)data;
263bc700ab1SDaniel Mack 	unsigned long flags;
264bc700ab1SDaniel Mack 	unsigned int frames;
265bc700ab1SDaniel Mack 	struct ua101_urb *urb;
266bc700ab1SDaniel Mack 	bool do_period_elapsed = false;
267bc700ab1SDaniel Mack 	int err;
268bc700ab1SDaniel Mack 
269bc700ab1SDaniel Mack 	if (unlikely(!test_bit(USB_PLAYBACK_RUNNING, &ua->states)))
270bc700ab1SDaniel Mack 		return;
271bc700ab1SDaniel Mack 
272bc700ab1SDaniel Mack 	/*
273bc700ab1SDaniel Mack 	 * Synchronizing the playback rate to the capture rate is done by using
274bc700ab1SDaniel Mack 	 * the same sequence of packet sizes for both streams.
275bc700ab1SDaniel Mack 	 * Submitting a playback URB therefore requires both a ready URB and
276bc700ab1SDaniel Mack 	 * the size of the corresponding capture packet, i.e., both playback
277bc700ab1SDaniel Mack 	 * and capture URBs must have been completed.  Since the USB core does
278bc700ab1SDaniel Mack 	 * not guarantee that playback and capture complete callbacks are
279bc700ab1SDaniel Mack 	 * called alternately, we use two FIFOs for packet sizes and read URBs;
280bc700ab1SDaniel Mack 	 * submitting playback URBs is possible as long as both FIFOs are
281bc700ab1SDaniel Mack 	 * nonempty.
282bc700ab1SDaniel Mack 	 */
283bc700ab1SDaniel Mack 	spin_lock_irqsave(&ua->lock, flags);
284bc700ab1SDaniel Mack 	while (ua->rate_feedback_count > 0 &&
285bc700ab1SDaniel Mack 	       !list_empty(&ua->ready_playback_urbs)) {
286bc700ab1SDaniel Mack 		/* take packet size out of FIFO */
287bc700ab1SDaniel Mack 		frames = ua->rate_feedback[ua->rate_feedback_start];
288bc700ab1SDaniel Mack 		add_with_wraparound(ua, &ua->rate_feedback_start, 1);
289bc700ab1SDaniel Mack 		ua->rate_feedback_count--;
290bc700ab1SDaniel Mack 
291bc700ab1SDaniel Mack 		/* take URB out of FIFO */
292bc700ab1SDaniel Mack 		urb = list_first_entry(&ua->ready_playback_urbs,
293bc700ab1SDaniel Mack 				       struct ua101_urb, ready_list);
294bc700ab1SDaniel Mack 		list_del(&urb->ready_list);
295bc700ab1SDaniel Mack 
296bc700ab1SDaniel Mack 		/* fill packet with data or silence */
297bc700ab1SDaniel Mack 		urb->urb.iso_frame_desc[0].length =
298bc700ab1SDaniel Mack 			frames * ua->playback.frame_bytes;
299bc700ab1SDaniel Mack 		if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states))
300bc700ab1SDaniel Mack 			do_period_elapsed |= copy_playback_data(&ua->playback,
301bc700ab1SDaniel Mack 								&urb->urb,
302bc700ab1SDaniel Mack 								frames);
303bc700ab1SDaniel Mack 		else
304bc700ab1SDaniel Mack 			memset(urb->urb.transfer_buffer, 0,
305bc700ab1SDaniel Mack 			       urb->urb.iso_frame_desc[0].length);
306bc700ab1SDaniel Mack 
307bc700ab1SDaniel Mack 		/* and off you go ... */
308bc700ab1SDaniel Mack 		err = usb_submit_urb(&urb->urb, GFP_ATOMIC);
309bc700ab1SDaniel Mack 		if (unlikely(err < 0)) {
310bc700ab1SDaniel Mack 			spin_unlock_irqrestore(&ua->lock, flags);
311bc700ab1SDaniel Mack 			abort_usb_playback(ua);
312bc700ab1SDaniel Mack 			abort_alsa_playback(ua);
313bc700ab1SDaniel Mack 			dev_err(&ua->dev->dev, "USB request error %d: %s\n",
314bc700ab1SDaniel Mack 				err, usb_error_string(err));
315bc700ab1SDaniel Mack 			return;
316bc700ab1SDaniel Mack 		}
317bc700ab1SDaniel Mack 		ua->playback.substream->runtime->delay += frames;
318bc700ab1SDaniel Mack 	}
319bc700ab1SDaniel Mack 	spin_unlock_irqrestore(&ua->lock, flags);
320bc700ab1SDaniel Mack 	if (do_period_elapsed)
321bc700ab1SDaniel Mack 		snd_pcm_period_elapsed(ua->playback.substream);
322bc700ab1SDaniel Mack }
323bc700ab1SDaniel Mack 
324bc700ab1SDaniel Mack /* copy data from the URB buffer into the ALSA ring buffer */
325bc700ab1SDaniel Mack static bool copy_capture_data(struct ua101_stream *stream, struct urb *urb,
326bc700ab1SDaniel Mack 			      unsigned int frames)
327bc700ab1SDaniel Mack {
328bc700ab1SDaniel Mack 	struct snd_pcm_runtime *runtime;
329bc700ab1SDaniel Mack 	unsigned int frame_bytes, frames1;
330bc700ab1SDaniel Mack 	u8 *dest;
331bc700ab1SDaniel Mack 
332bc700ab1SDaniel Mack 	runtime = stream->substream->runtime;
333bc700ab1SDaniel Mack 	frame_bytes = stream->frame_bytes;
334bc700ab1SDaniel Mack 	dest = runtime->dma_area + stream->buffer_pos * frame_bytes;
335bc700ab1SDaniel Mack 	if (stream->buffer_pos + frames <= runtime->buffer_size) {
336bc700ab1SDaniel Mack 		memcpy(dest, urb->transfer_buffer, frames * frame_bytes);
337bc700ab1SDaniel Mack 	} else {
338bc700ab1SDaniel Mack 		/* wrap around at end of ring buffer */
339bc700ab1SDaniel Mack 		frames1 = runtime->buffer_size - stream->buffer_pos;
340bc700ab1SDaniel Mack 		memcpy(dest, urb->transfer_buffer, frames1 * frame_bytes);
341bc700ab1SDaniel Mack 		memcpy(runtime->dma_area,
342bc700ab1SDaniel Mack 		       urb->transfer_buffer + frames1 * frame_bytes,
343bc700ab1SDaniel Mack 		       (frames - frames1) * frame_bytes);
344bc700ab1SDaniel Mack 	}
345bc700ab1SDaniel Mack 
346bc700ab1SDaniel Mack 	stream->buffer_pos += frames;
347bc700ab1SDaniel Mack 	if (stream->buffer_pos >= runtime->buffer_size)
348bc700ab1SDaniel Mack 		stream->buffer_pos -= runtime->buffer_size;
349bc700ab1SDaniel Mack 	stream->period_pos += frames;
350bc700ab1SDaniel Mack 	if (stream->period_pos >= runtime->period_size) {
351bc700ab1SDaniel Mack 		stream->period_pos -= runtime->period_size;
352bc700ab1SDaniel Mack 		return true;
353bc700ab1SDaniel Mack 	}
354bc700ab1SDaniel Mack 	return false;
355bc700ab1SDaniel Mack }
356bc700ab1SDaniel Mack 
357bc700ab1SDaniel Mack static void capture_urb_complete(struct urb *urb)
358bc700ab1SDaniel Mack {
359bc700ab1SDaniel Mack 	struct ua101 *ua = urb->context;
360bc700ab1SDaniel Mack 	struct ua101_stream *stream = &ua->capture;
361bc700ab1SDaniel Mack 	unsigned long flags;
362bc700ab1SDaniel Mack 	unsigned int frames, write_ptr;
363bc700ab1SDaniel Mack 	bool do_period_elapsed;
364bc700ab1SDaniel Mack 	int err;
365bc700ab1SDaniel Mack 
366bc700ab1SDaniel Mack 	if (unlikely(urb->status == -ENOENT ||		/* unlinked */
367bc700ab1SDaniel Mack 		     urb->status == -ENODEV ||		/* device removed */
368bc700ab1SDaniel Mack 		     urb->status == -ECONNRESET ||	/* unlinked */
369bc700ab1SDaniel Mack 		     urb->status == -ESHUTDOWN))	/* device disabled */
370bc700ab1SDaniel Mack 		goto stream_stopped;
371bc700ab1SDaniel Mack 
372bc700ab1SDaniel Mack 	if (urb->status >= 0 && urb->iso_frame_desc[0].status >= 0)
373bc700ab1SDaniel Mack 		frames = urb->iso_frame_desc[0].actual_length /
374bc700ab1SDaniel Mack 			stream->frame_bytes;
375bc700ab1SDaniel Mack 	else
376bc700ab1SDaniel Mack 		frames = 0;
377bc700ab1SDaniel Mack 
378bc700ab1SDaniel Mack 	spin_lock_irqsave(&ua->lock, flags);
379bc700ab1SDaniel Mack 
380bc700ab1SDaniel Mack 	if (frames > 0 && test_bit(ALSA_CAPTURE_RUNNING, &ua->states))
381bc700ab1SDaniel Mack 		do_period_elapsed = copy_capture_data(stream, urb, frames);
382bc700ab1SDaniel Mack 	else
383bc700ab1SDaniel Mack 		do_period_elapsed = false;
384bc700ab1SDaniel Mack 
385bc700ab1SDaniel Mack 	if (test_bit(USB_CAPTURE_RUNNING, &ua->states)) {
386bc700ab1SDaniel Mack 		err = usb_submit_urb(urb, GFP_ATOMIC);
387bc700ab1SDaniel Mack 		if (unlikely(err < 0)) {
388bc700ab1SDaniel Mack 			spin_unlock_irqrestore(&ua->lock, flags);
389bc700ab1SDaniel Mack 			dev_err(&ua->dev->dev, "USB request error %d: %s\n",
390bc700ab1SDaniel Mack 				err, usb_error_string(err));
391bc700ab1SDaniel Mack 			goto stream_stopped;
392bc700ab1SDaniel Mack 		}
393bc700ab1SDaniel Mack 
394bc700ab1SDaniel Mack 		/* append packet size to FIFO */
395bc700ab1SDaniel Mack 		write_ptr = ua->rate_feedback_start;
396bc700ab1SDaniel Mack 		add_with_wraparound(ua, &write_ptr, ua->rate_feedback_count);
397bc700ab1SDaniel Mack 		ua->rate_feedback[write_ptr] = frames;
398bc700ab1SDaniel Mack 		if (ua->rate_feedback_count < ua->playback.queue_length) {
399bc700ab1SDaniel Mack 			ua->rate_feedback_count++;
400bc700ab1SDaniel Mack 			if (ua->rate_feedback_count ==
401bc700ab1SDaniel Mack 						ua->playback.queue_length)
402bc700ab1SDaniel Mack 				wake_up(&ua->rate_feedback_wait);
403bc700ab1SDaniel Mack 		} else {
404bc700ab1SDaniel Mack 			/*
405bc700ab1SDaniel Mack 			 * Ring buffer overflow; this happens when the playback
406bc700ab1SDaniel Mack 			 * stream is not running.  Throw away the oldest entry,
407bc700ab1SDaniel Mack 			 * so that the playback stream, when it starts, sees
408bc700ab1SDaniel Mack 			 * the most recent packet sizes.
409bc700ab1SDaniel Mack 			 */
410bc700ab1SDaniel Mack 			add_with_wraparound(ua, &ua->rate_feedback_start, 1);
411bc700ab1SDaniel Mack 		}
412bc700ab1SDaniel Mack 		if (test_bit(USB_PLAYBACK_RUNNING, &ua->states) &&
413bc700ab1SDaniel Mack 		    !list_empty(&ua->ready_playback_urbs))
414bc700ab1SDaniel Mack 			tasklet_schedule(&ua->playback_tasklet);
415bc700ab1SDaniel Mack 	}
416bc700ab1SDaniel Mack 
417bc700ab1SDaniel Mack 	spin_unlock_irqrestore(&ua->lock, flags);
418bc700ab1SDaniel Mack 
419bc700ab1SDaniel Mack 	if (do_period_elapsed)
420bc700ab1SDaniel Mack 		snd_pcm_period_elapsed(stream->substream);
421bc700ab1SDaniel Mack 
422bc700ab1SDaniel Mack 	return;
423bc700ab1SDaniel Mack 
424bc700ab1SDaniel Mack stream_stopped:
425bc700ab1SDaniel Mack 	abort_usb_playback(ua);
426bc700ab1SDaniel Mack 	abort_usb_capture(ua);
427bc700ab1SDaniel Mack 	abort_alsa_playback(ua);
428bc700ab1SDaniel Mack 	abort_alsa_capture(ua);
429bc700ab1SDaniel Mack }
430bc700ab1SDaniel Mack 
431bc700ab1SDaniel Mack static void first_capture_urb_complete(struct urb *urb)
432bc700ab1SDaniel Mack {
433bc700ab1SDaniel Mack 	struct ua101 *ua = urb->context;
434bc700ab1SDaniel Mack 
435bc700ab1SDaniel Mack 	urb->complete = capture_urb_complete;
436bc700ab1SDaniel Mack 	capture_urb_complete(urb);
437bc700ab1SDaniel Mack 
438bc700ab1SDaniel Mack 	set_bit(CAPTURE_URB_COMPLETED, &ua->states);
439bc700ab1SDaniel Mack 	wake_up(&ua->alsa_capture_wait);
440bc700ab1SDaniel Mack }
441bc700ab1SDaniel Mack 
442bc700ab1SDaniel Mack static int submit_stream_urbs(struct ua101 *ua, struct ua101_stream *stream)
443bc700ab1SDaniel Mack {
444bc700ab1SDaniel Mack 	unsigned int i;
445bc700ab1SDaniel Mack 
446bc700ab1SDaniel Mack 	for (i = 0; i < stream->queue_length; ++i) {
447bc700ab1SDaniel Mack 		int err = usb_submit_urb(&stream->urbs[i]->urb, GFP_KERNEL);
448bc700ab1SDaniel Mack 		if (err < 0) {
449bc700ab1SDaniel Mack 			dev_err(&ua->dev->dev, "USB request error %d: %s\n",
450bc700ab1SDaniel Mack 				err, usb_error_string(err));
451bc700ab1SDaniel Mack 			return err;
452bc700ab1SDaniel Mack 		}
453bc700ab1SDaniel Mack 	}
454bc700ab1SDaniel Mack 	return 0;
455bc700ab1SDaniel Mack }
456bc700ab1SDaniel Mack 
457bc700ab1SDaniel Mack static void kill_stream_urbs(struct ua101_stream *stream)
458bc700ab1SDaniel Mack {
459bc700ab1SDaniel Mack 	unsigned int i;
460bc700ab1SDaniel Mack 
461bc700ab1SDaniel Mack 	for (i = 0; i < stream->queue_length; ++i)
462862a6244SClemens Ladisch 		if (stream->urbs[i])
463bc700ab1SDaniel Mack 			usb_kill_urb(&stream->urbs[i]->urb);
464bc700ab1SDaniel Mack }
465bc700ab1SDaniel Mack 
466bc700ab1SDaniel Mack static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index)
467bc700ab1SDaniel Mack {
468bc700ab1SDaniel Mack 	struct usb_host_interface *alts;
469bc700ab1SDaniel Mack 
470bc700ab1SDaniel Mack 	alts = ua->intf[intf_index]->cur_altsetting;
471bc700ab1SDaniel Mack 	if (alts->desc.bAlternateSetting != 1) {
472bc700ab1SDaniel Mack 		int err = usb_set_interface(ua->dev,
473bc700ab1SDaniel Mack 					    alts->desc.bInterfaceNumber, 1);
474bc700ab1SDaniel Mack 		if (err < 0) {
475bc700ab1SDaniel Mack 			dev_err(&ua->dev->dev,
476bc700ab1SDaniel Mack 				"cannot initialize interface; error %d: %s\n",
477bc700ab1SDaniel Mack 				err, usb_error_string(err));
478bc700ab1SDaniel Mack 			return err;
479bc700ab1SDaniel Mack 		}
480bc700ab1SDaniel Mack 	}
481bc700ab1SDaniel Mack 	return 0;
482bc700ab1SDaniel Mack }
483bc700ab1SDaniel Mack 
484bc700ab1SDaniel Mack static void disable_iso_interface(struct ua101 *ua, unsigned int intf_index)
485bc700ab1SDaniel Mack {
486bc700ab1SDaniel Mack 	struct usb_host_interface *alts;
487bc700ab1SDaniel Mack 
488862a6244SClemens Ladisch 	if (!ua->intf[intf_index])
489862a6244SClemens Ladisch 		return;
490862a6244SClemens Ladisch 
491bc700ab1SDaniel Mack 	alts = ua->intf[intf_index]->cur_altsetting;
492bc700ab1SDaniel Mack 	if (alts->desc.bAlternateSetting != 0) {
493bc700ab1SDaniel Mack 		int err = usb_set_interface(ua->dev,
494bc700ab1SDaniel Mack 					    alts->desc.bInterfaceNumber, 0);
495bc700ab1SDaniel Mack 		if (err < 0 && !test_bit(DISCONNECTED, &ua->states))
496bc700ab1SDaniel Mack 			dev_warn(&ua->dev->dev,
497bc700ab1SDaniel Mack 				 "interface reset failed; error %d: %s\n",
498bc700ab1SDaniel Mack 				 err, usb_error_string(err));
499bc700ab1SDaniel Mack 	}
500bc700ab1SDaniel Mack }
501bc700ab1SDaniel Mack 
502bc700ab1SDaniel Mack static void stop_usb_capture(struct ua101 *ua)
503bc700ab1SDaniel Mack {
504bc700ab1SDaniel Mack 	clear_bit(USB_CAPTURE_RUNNING, &ua->states);
505bc700ab1SDaniel Mack 
506bc700ab1SDaniel Mack 	kill_stream_urbs(&ua->capture);
507bc700ab1SDaniel Mack 
508bc700ab1SDaniel Mack 	disable_iso_interface(ua, INTF_CAPTURE);
509bc700ab1SDaniel Mack }
510bc700ab1SDaniel Mack 
511bc700ab1SDaniel Mack static int start_usb_capture(struct ua101 *ua)
512bc700ab1SDaniel Mack {
513bc700ab1SDaniel Mack 	int err;
514bc700ab1SDaniel Mack 
515bc700ab1SDaniel Mack 	if (test_bit(DISCONNECTED, &ua->states))
516bc700ab1SDaniel Mack 		return -ENODEV;
517bc700ab1SDaniel Mack 
518bc700ab1SDaniel Mack 	if (test_bit(USB_CAPTURE_RUNNING, &ua->states))
519bc700ab1SDaniel Mack 		return 0;
520bc700ab1SDaniel Mack 
521bc700ab1SDaniel Mack 	kill_stream_urbs(&ua->capture);
522bc700ab1SDaniel Mack 
523bc700ab1SDaniel Mack 	err = enable_iso_interface(ua, INTF_CAPTURE);
524bc700ab1SDaniel Mack 	if (err < 0)
525bc700ab1SDaniel Mack 		return err;
526bc700ab1SDaniel Mack 
527bc700ab1SDaniel Mack 	clear_bit(CAPTURE_URB_COMPLETED, &ua->states);
528bc700ab1SDaniel Mack 	ua->capture.urbs[0]->urb.complete = first_capture_urb_complete;
529bc700ab1SDaniel Mack 	ua->rate_feedback_start = 0;
530bc700ab1SDaniel Mack 	ua->rate_feedback_count = 0;
531bc700ab1SDaniel Mack 
532bc700ab1SDaniel Mack 	set_bit(USB_CAPTURE_RUNNING, &ua->states);
533bc700ab1SDaniel Mack 	err = submit_stream_urbs(ua, &ua->capture);
534bc700ab1SDaniel Mack 	if (err < 0)
535bc700ab1SDaniel Mack 		stop_usb_capture(ua);
536bc700ab1SDaniel Mack 	return err;
537bc700ab1SDaniel Mack }
538bc700ab1SDaniel Mack 
539bc700ab1SDaniel Mack static void stop_usb_playback(struct ua101 *ua)
540bc700ab1SDaniel Mack {
541bc700ab1SDaniel Mack 	clear_bit(USB_PLAYBACK_RUNNING, &ua->states);
542bc700ab1SDaniel Mack 
543bc700ab1SDaniel Mack 	kill_stream_urbs(&ua->playback);
544bc700ab1SDaniel Mack 
545bc700ab1SDaniel Mack 	tasklet_kill(&ua->playback_tasklet);
546bc700ab1SDaniel Mack 
547bc700ab1SDaniel Mack 	disable_iso_interface(ua, INTF_PLAYBACK);
548bc700ab1SDaniel Mack }
549bc700ab1SDaniel Mack 
550bc700ab1SDaniel Mack static int start_usb_playback(struct ua101 *ua)
551bc700ab1SDaniel Mack {
552bc700ab1SDaniel Mack 	unsigned int i, frames;
553bc700ab1SDaniel Mack 	struct urb *urb;
554bc700ab1SDaniel Mack 	int err = 0;
555bc700ab1SDaniel Mack 
556bc700ab1SDaniel Mack 	if (test_bit(DISCONNECTED, &ua->states))
557bc700ab1SDaniel Mack 		return -ENODEV;
558bc700ab1SDaniel Mack 
559bc700ab1SDaniel Mack 	if (test_bit(USB_PLAYBACK_RUNNING, &ua->states))
560bc700ab1SDaniel Mack 		return 0;
561bc700ab1SDaniel Mack 
562bc700ab1SDaniel Mack 	kill_stream_urbs(&ua->playback);
563bc700ab1SDaniel Mack 	tasklet_kill(&ua->playback_tasklet);
564bc700ab1SDaniel Mack 
565bc700ab1SDaniel Mack 	err = enable_iso_interface(ua, INTF_PLAYBACK);
566bc700ab1SDaniel Mack 	if (err < 0)
567bc700ab1SDaniel Mack 		return err;
568bc700ab1SDaniel Mack 
569bc700ab1SDaniel Mack 	clear_bit(PLAYBACK_URB_COMPLETED, &ua->states);
570bc700ab1SDaniel Mack 	ua->playback.urbs[0]->urb.complete =
571bc700ab1SDaniel Mack 		first_playback_urb_complete;
572bc700ab1SDaniel Mack 	spin_lock_irq(&ua->lock);
573bc700ab1SDaniel Mack 	INIT_LIST_HEAD(&ua->ready_playback_urbs);
574bc700ab1SDaniel Mack 	spin_unlock_irq(&ua->lock);
575bc700ab1SDaniel Mack 
576bc700ab1SDaniel Mack 	/*
577bc700ab1SDaniel Mack 	 * We submit the initial URBs all at once, so we have to wait for the
578bc700ab1SDaniel Mack 	 * packet size FIFO to be full.
579bc700ab1SDaniel Mack 	 */
580bc700ab1SDaniel Mack 	wait_event(ua->rate_feedback_wait,
581bc700ab1SDaniel Mack 		   ua->rate_feedback_count >= ua->playback.queue_length ||
582bc700ab1SDaniel Mack 		   !test_bit(USB_CAPTURE_RUNNING, &ua->states) ||
583bc700ab1SDaniel Mack 		   test_bit(DISCONNECTED, &ua->states));
584bc700ab1SDaniel Mack 	if (test_bit(DISCONNECTED, &ua->states)) {
585bc700ab1SDaniel Mack 		stop_usb_playback(ua);
586bc700ab1SDaniel Mack 		return -ENODEV;
587bc700ab1SDaniel Mack 	}
588bc700ab1SDaniel Mack 	if (!test_bit(USB_CAPTURE_RUNNING, &ua->states)) {
589bc700ab1SDaniel Mack 		stop_usb_playback(ua);
590bc700ab1SDaniel Mack 		return -EIO;
591bc700ab1SDaniel Mack 	}
592bc700ab1SDaniel Mack 
593bc700ab1SDaniel Mack 	for (i = 0; i < ua->playback.queue_length; ++i) {
594bc700ab1SDaniel Mack 		/* all initial URBs contain silence */
595bc700ab1SDaniel Mack 		spin_lock_irq(&ua->lock);
596bc700ab1SDaniel Mack 		frames = ua->rate_feedback[ua->rate_feedback_start];
597bc700ab1SDaniel Mack 		add_with_wraparound(ua, &ua->rate_feedback_start, 1);
598bc700ab1SDaniel Mack 		ua->rate_feedback_count--;
599bc700ab1SDaniel Mack 		spin_unlock_irq(&ua->lock);
600bc700ab1SDaniel Mack 		urb = &ua->playback.urbs[i]->urb;
601bc700ab1SDaniel Mack 		urb->iso_frame_desc[0].length =
602bc700ab1SDaniel Mack 			frames * ua->playback.frame_bytes;
603bc700ab1SDaniel Mack 		memset(urb->transfer_buffer, 0,
604bc700ab1SDaniel Mack 		       urb->iso_frame_desc[0].length);
605bc700ab1SDaniel Mack 	}
606bc700ab1SDaniel Mack 
607bc700ab1SDaniel Mack 	set_bit(USB_PLAYBACK_RUNNING, &ua->states);
608bc700ab1SDaniel Mack 	err = submit_stream_urbs(ua, &ua->playback);
609bc700ab1SDaniel Mack 	if (err < 0)
610bc700ab1SDaniel Mack 		stop_usb_playback(ua);
611bc700ab1SDaniel Mack 	return err;
612bc700ab1SDaniel Mack }
613bc700ab1SDaniel Mack 
614bc700ab1SDaniel Mack static void abort_alsa_capture(struct ua101 *ua)
615bc700ab1SDaniel Mack {
616bc700ab1SDaniel Mack 	if (test_bit(ALSA_CAPTURE_RUNNING, &ua->states))
617bc700ab1SDaniel Mack 		snd_pcm_stop(ua->capture.substream, SNDRV_PCM_STATE_XRUN);
618bc700ab1SDaniel Mack }
619bc700ab1SDaniel Mack 
620bc700ab1SDaniel Mack static void abort_alsa_playback(struct ua101 *ua)
621bc700ab1SDaniel Mack {
622bc700ab1SDaniel Mack 	if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states))
623bc700ab1SDaniel Mack 		snd_pcm_stop(ua->playback.substream, SNDRV_PCM_STATE_XRUN);
624bc700ab1SDaniel Mack }
625bc700ab1SDaniel Mack 
626bc700ab1SDaniel Mack static int set_stream_hw(struct ua101 *ua, struct snd_pcm_substream *substream,
627bc700ab1SDaniel Mack 			 unsigned int channels)
628bc700ab1SDaniel Mack {
629bc700ab1SDaniel Mack 	int err;
630bc700ab1SDaniel Mack 
631bc700ab1SDaniel Mack 	substream->runtime->hw.info =
632bc700ab1SDaniel Mack 		SNDRV_PCM_INFO_MMAP |
633bc700ab1SDaniel Mack 		SNDRV_PCM_INFO_MMAP_VALID |
634bc700ab1SDaniel Mack 		SNDRV_PCM_INFO_BATCH |
635bc700ab1SDaniel Mack 		SNDRV_PCM_INFO_INTERLEAVED |
636bc700ab1SDaniel Mack 		SNDRV_PCM_INFO_BLOCK_TRANSFER |
637bc700ab1SDaniel Mack 		SNDRV_PCM_INFO_FIFO_IN_FRAMES;
638bc700ab1SDaniel Mack 	substream->runtime->hw.formats = ua->format_bit;
639bc700ab1SDaniel Mack 	substream->runtime->hw.rates = snd_pcm_rate_to_rate_bit(ua->rate);
640bc700ab1SDaniel Mack 	substream->runtime->hw.rate_min = ua->rate;
641bc700ab1SDaniel Mack 	substream->runtime->hw.rate_max = ua->rate;
642bc700ab1SDaniel Mack 	substream->runtime->hw.channels_min = channels;
643bc700ab1SDaniel Mack 	substream->runtime->hw.channels_max = channels;
644bc700ab1SDaniel Mack 	substream->runtime->hw.buffer_bytes_max = 45000 * 1024;
645bc700ab1SDaniel Mack 	substream->runtime->hw.period_bytes_min = 1;
646bc700ab1SDaniel Mack 	substream->runtime->hw.period_bytes_max = UINT_MAX;
647bc700ab1SDaniel Mack 	substream->runtime->hw.periods_min = 2;
648bc700ab1SDaniel Mack 	substream->runtime->hw.periods_max = UINT_MAX;
649bc700ab1SDaniel Mack 	err = snd_pcm_hw_constraint_minmax(substream->runtime,
650bc700ab1SDaniel Mack 					   SNDRV_PCM_HW_PARAM_PERIOD_TIME,
651bc700ab1SDaniel Mack 					   1500000 / ua->packets_per_second,
652f4b1e98aSClemens Ladisch 					   UINT_MAX);
653bc700ab1SDaniel Mack 	if (err < 0)
654bc700ab1SDaniel Mack 		return err;
655bc700ab1SDaniel Mack 	err = snd_pcm_hw_constraint_msbits(substream->runtime, 0, 32, 24);
656bc700ab1SDaniel Mack 	return err;
657bc700ab1SDaniel Mack }
658bc700ab1SDaniel Mack 
659bc700ab1SDaniel Mack static int capture_pcm_open(struct snd_pcm_substream *substream)
660bc700ab1SDaniel Mack {
661bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
662bc700ab1SDaniel Mack 	int err;
663bc700ab1SDaniel Mack 
664bc700ab1SDaniel Mack 	ua->capture.substream = substream;
665bc700ab1SDaniel Mack 	err = set_stream_hw(ua, substream, ua->capture.channels);
666bc700ab1SDaniel Mack 	if (err < 0)
667bc700ab1SDaniel Mack 		return err;
668bc700ab1SDaniel Mack 	substream->runtime->hw.fifo_size =
669bc700ab1SDaniel Mack 		DIV_ROUND_CLOSEST(ua->rate, ua->packets_per_second);
670bc700ab1SDaniel Mack 	substream->runtime->delay = substream->runtime->hw.fifo_size;
671bc700ab1SDaniel Mack 
672bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
673bc700ab1SDaniel Mack 	err = start_usb_capture(ua);
674bc700ab1SDaniel Mack 	if (err >= 0)
675bc700ab1SDaniel Mack 		set_bit(ALSA_CAPTURE_OPEN, &ua->states);
676bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
677bc700ab1SDaniel Mack 	return err;
678bc700ab1SDaniel Mack }
679bc700ab1SDaniel Mack 
680bc700ab1SDaniel Mack static int playback_pcm_open(struct snd_pcm_substream *substream)
681bc700ab1SDaniel Mack {
682bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
683bc700ab1SDaniel Mack 	int err;
684bc700ab1SDaniel Mack 
685bc700ab1SDaniel Mack 	ua->playback.substream = substream;
686bc700ab1SDaniel Mack 	err = set_stream_hw(ua, substream, ua->playback.channels);
687bc700ab1SDaniel Mack 	if (err < 0)
688bc700ab1SDaniel Mack 		return err;
689bc700ab1SDaniel Mack 	substream->runtime->hw.fifo_size =
690bc700ab1SDaniel Mack 		DIV_ROUND_CLOSEST(ua->rate * ua->playback.queue_length,
691bc700ab1SDaniel Mack 				  ua->packets_per_second);
692bc700ab1SDaniel Mack 
693bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
694bc700ab1SDaniel Mack 	err = start_usb_capture(ua);
695bc700ab1SDaniel Mack 	if (err < 0)
696bc700ab1SDaniel Mack 		goto error;
697bc700ab1SDaniel Mack 	err = start_usb_playback(ua);
698bc700ab1SDaniel Mack 	if (err < 0) {
699bc700ab1SDaniel Mack 		if (!test_bit(ALSA_CAPTURE_OPEN, &ua->states))
700bc700ab1SDaniel Mack 			stop_usb_capture(ua);
701bc700ab1SDaniel Mack 		goto error;
702bc700ab1SDaniel Mack 	}
703bc700ab1SDaniel Mack 	set_bit(ALSA_PLAYBACK_OPEN, &ua->states);
704bc700ab1SDaniel Mack error:
705bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
706bc700ab1SDaniel Mack 	return err;
707bc700ab1SDaniel Mack }
708bc700ab1SDaniel Mack 
709bc700ab1SDaniel Mack static int capture_pcm_close(struct snd_pcm_substream *substream)
710bc700ab1SDaniel Mack {
711bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
712bc700ab1SDaniel Mack 
713bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
714bc700ab1SDaniel Mack 	clear_bit(ALSA_CAPTURE_OPEN, &ua->states);
715bc700ab1SDaniel Mack 	if (!test_bit(ALSA_PLAYBACK_OPEN, &ua->states))
716bc700ab1SDaniel Mack 		stop_usb_capture(ua);
717bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
718bc700ab1SDaniel Mack 	return 0;
719bc700ab1SDaniel Mack }
720bc700ab1SDaniel Mack 
721bc700ab1SDaniel Mack static int playback_pcm_close(struct snd_pcm_substream *substream)
722bc700ab1SDaniel Mack {
723bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
724bc700ab1SDaniel Mack 
725bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
726bc700ab1SDaniel Mack 	stop_usb_playback(ua);
727bc700ab1SDaniel Mack 	clear_bit(ALSA_PLAYBACK_OPEN, &ua->states);
728bc700ab1SDaniel Mack 	if (!test_bit(ALSA_CAPTURE_OPEN, &ua->states))
729bc700ab1SDaniel Mack 		stop_usb_capture(ua);
730bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
731bc700ab1SDaniel Mack 	return 0;
732bc700ab1SDaniel Mack }
733bc700ab1SDaniel Mack 
734bc700ab1SDaniel Mack static int capture_pcm_hw_params(struct snd_pcm_substream *substream,
735bc700ab1SDaniel Mack 				 struct snd_pcm_hw_params *hw_params)
736bc700ab1SDaniel Mack {
737bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
738bc700ab1SDaniel Mack 	int err;
739bc700ab1SDaniel Mack 
740bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
741bc700ab1SDaniel Mack 	err = start_usb_capture(ua);
742bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
743bc700ab1SDaniel Mack 	if (err < 0)
744bc700ab1SDaniel Mack 		return err;
745bc700ab1SDaniel Mack 
746bc700ab1SDaniel Mack 	return snd_pcm_lib_alloc_vmalloc_buffer(substream,
747bc700ab1SDaniel Mack 						params_buffer_bytes(hw_params));
748bc700ab1SDaniel Mack }
749bc700ab1SDaniel Mack 
750bc700ab1SDaniel Mack static int playback_pcm_hw_params(struct snd_pcm_substream *substream,
751bc700ab1SDaniel Mack 				  struct snd_pcm_hw_params *hw_params)
752bc700ab1SDaniel Mack {
753bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
754bc700ab1SDaniel Mack 	int err;
755bc700ab1SDaniel Mack 
756bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
757bc700ab1SDaniel Mack 	err = start_usb_capture(ua);
758bc700ab1SDaniel Mack 	if (err >= 0)
759bc700ab1SDaniel Mack 		err = start_usb_playback(ua);
760bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
761bc700ab1SDaniel Mack 	if (err < 0)
762bc700ab1SDaniel Mack 		return err;
763bc700ab1SDaniel Mack 
764bc700ab1SDaniel Mack 	return snd_pcm_lib_alloc_vmalloc_buffer(substream,
765bc700ab1SDaniel Mack 						params_buffer_bytes(hw_params));
766bc700ab1SDaniel Mack }
767bc700ab1SDaniel Mack 
768bc700ab1SDaniel Mack static int ua101_pcm_hw_free(struct snd_pcm_substream *substream)
769bc700ab1SDaniel Mack {
770bc700ab1SDaniel Mack 	return snd_pcm_lib_free_vmalloc_buffer(substream);
771bc700ab1SDaniel Mack }
772bc700ab1SDaniel Mack 
773bc700ab1SDaniel Mack static int capture_pcm_prepare(struct snd_pcm_substream *substream)
774bc700ab1SDaniel Mack {
775bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
776bc700ab1SDaniel Mack 	int err;
777bc700ab1SDaniel Mack 
778bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
779bc700ab1SDaniel Mack 	err = start_usb_capture(ua);
780bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
781bc700ab1SDaniel Mack 	if (err < 0)
782bc700ab1SDaniel Mack 		return err;
783bc700ab1SDaniel Mack 
784bc700ab1SDaniel Mack 	/*
785bc700ab1SDaniel Mack 	 * The EHCI driver schedules the first packet of an iso stream at 10 ms
786bc700ab1SDaniel Mack 	 * in the future, i.e., no data is actually captured for that long.
787bc700ab1SDaniel Mack 	 * Take the wait here so that the stream is known to be actually
788bc700ab1SDaniel Mack 	 * running when the start trigger has been called.
789bc700ab1SDaniel Mack 	 */
790bc700ab1SDaniel Mack 	wait_event(ua->alsa_capture_wait,
791bc700ab1SDaniel Mack 		   test_bit(CAPTURE_URB_COMPLETED, &ua->states) ||
792bc700ab1SDaniel Mack 		   !test_bit(USB_CAPTURE_RUNNING, &ua->states));
793bc700ab1SDaniel Mack 	if (test_bit(DISCONNECTED, &ua->states))
794bc700ab1SDaniel Mack 		return -ENODEV;
795bc700ab1SDaniel Mack 	if (!test_bit(USB_CAPTURE_RUNNING, &ua->states))
796bc700ab1SDaniel Mack 		return -EIO;
797bc700ab1SDaniel Mack 
798bc700ab1SDaniel Mack 	ua->capture.period_pos = 0;
799bc700ab1SDaniel Mack 	ua->capture.buffer_pos = 0;
800bc700ab1SDaniel Mack 	return 0;
801bc700ab1SDaniel Mack }
802bc700ab1SDaniel Mack 
803bc700ab1SDaniel Mack static int playback_pcm_prepare(struct snd_pcm_substream *substream)
804bc700ab1SDaniel Mack {
805bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
806bc700ab1SDaniel Mack 	int err;
807bc700ab1SDaniel Mack 
808bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
809bc700ab1SDaniel Mack 	err = start_usb_capture(ua);
810bc700ab1SDaniel Mack 	if (err >= 0)
811bc700ab1SDaniel Mack 		err = start_usb_playback(ua);
812bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
813bc700ab1SDaniel Mack 	if (err < 0)
814bc700ab1SDaniel Mack 		return err;
815bc700ab1SDaniel Mack 
816bc700ab1SDaniel Mack 	/* see the comment in capture_pcm_prepare() */
817bc700ab1SDaniel Mack 	wait_event(ua->alsa_playback_wait,
818bc700ab1SDaniel Mack 		   test_bit(PLAYBACK_URB_COMPLETED, &ua->states) ||
819bc700ab1SDaniel Mack 		   !test_bit(USB_PLAYBACK_RUNNING, &ua->states));
820bc700ab1SDaniel Mack 	if (test_bit(DISCONNECTED, &ua->states))
821bc700ab1SDaniel Mack 		return -ENODEV;
822bc700ab1SDaniel Mack 	if (!test_bit(USB_PLAYBACK_RUNNING, &ua->states))
823bc700ab1SDaniel Mack 		return -EIO;
824bc700ab1SDaniel Mack 
825bc700ab1SDaniel Mack 	substream->runtime->delay = 0;
826bc700ab1SDaniel Mack 	ua->playback.period_pos = 0;
827bc700ab1SDaniel Mack 	ua->playback.buffer_pos = 0;
828bc700ab1SDaniel Mack 	return 0;
829bc700ab1SDaniel Mack }
830bc700ab1SDaniel Mack 
831bc700ab1SDaniel Mack static int capture_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
832bc700ab1SDaniel Mack {
833bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
834bc700ab1SDaniel Mack 
835bc700ab1SDaniel Mack 	switch (cmd) {
836bc700ab1SDaniel Mack 	case SNDRV_PCM_TRIGGER_START:
837bc700ab1SDaniel Mack 		if (!test_bit(USB_CAPTURE_RUNNING, &ua->states))
838bc700ab1SDaniel Mack 			return -EIO;
839bc700ab1SDaniel Mack 		set_bit(ALSA_CAPTURE_RUNNING, &ua->states);
840bc700ab1SDaniel Mack 		return 0;
841bc700ab1SDaniel Mack 	case SNDRV_PCM_TRIGGER_STOP:
842bc700ab1SDaniel Mack 		clear_bit(ALSA_CAPTURE_RUNNING, &ua->states);
843bc700ab1SDaniel Mack 		return 0;
844bc700ab1SDaniel Mack 	default:
845bc700ab1SDaniel Mack 		return -EINVAL;
846bc700ab1SDaniel Mack 	}
847bc700ab1SDaniel Mack }
848bc700ab1SDaniel Mack 
849bc700ab1SDaniel Mack static int playback_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
850bc700ab1SDaniel Mack {
851bc700ab1SDaniel Mack 	struct ua101 *ua = substream->private_data;
852bc700ab1SDaniel Mack 
853bc700ab1SDaniel Mack 	switch (cmd) {
854bc700ab1SDaniel Mack 	case SNDRV_PCM_TRIGGER_START:
855bc700ab1SDaniel Mack 		if (!test_bit(USB_PLAYBACK_RUNNING, &ua->states))
856bc700ab1SDaniel Mack 			return -EIO;
857bc700ab1SDaniel Mack 		set_bit(ALSA_PLAYBACK_RUNNING, &ua->states);
858bc700ab1SDaniel Mack 		return 0;
859bc700ab1SDaniel Mack 	case SNDRV_PCM_TRIGGER_STOP:
860bc700ab1SDaniel Mack 		clear_bit(ALSA_PLAYBACK_RUNNING, &ua->states);
861bc700ab1SDaniel Mack 		return 0;
862bc700ab1SDaniel Mack 	default:
863bc700ab1SDaniel Mack 		return -EINVAL;
864bc700ab1SDaniel Mack 	}
865bc700ab1SDaniel Mack }
866bc700ab1SDaniel Mack 
867bc700ab1SDaniel Mack static inline snd_pcm_uframes_t ua101_pcm_pointer(struct ua101 *ua,
868bc700ab1SDaniel Mack 						  struct ua101_stream *stream)
869bc700ab1SDaniel Mack {
870bc700ab1SDaniel Mack 	unsigned long flags;
871bc700ab1SDaniel Mack 	unsigned int pos;
872bc700ab1SDaniel Mack 
873bc700ab1SDaniel Mack 	spin_lock_irqsave(&ua->lock, flags);
874bc700ab1SDaniel Mack 	pos = stream->buffer_pos;
875bc700ab1SDaniel Mack 	spin_unlock_irqrestore(&ua->lock, flags);
876bc700ab1SDaniel Mack 	return pos;
877bc700ab1SDaniel Mack }
878bc700ab1SDaniel Mack 
879bc700ab1SDaniel Mack static snd_pcm_uframes_t capture_pcm_pointer(struct snd_pcm_substream *subs)
880bc700ab1SDaniel Mack {
881bc700ab1SDaniel Mack 	struct ua101 *ua = subs->private_data;
882bc700ab1SDaniel Mack 
883bc700ab1SDaniel Mack 	return ua101_pcm_pointer(ua, &ua->capture);
884bc700ab1SDaniel Mack }
885bc700ab1SDaniel Mack 
886bc700ab1SDaniel Mack static snd_pcm_uframes_t playback_pcm_pointer(struct snd_pcm_substream *subs)
887bc700ab1SDaniel Mack {
888bc700ab1SDaniel Mack 	struct ua101 *ua = subs->private_data;
889bc700ab1SDaniel Mack 
890bc700ab1SDaniel Mack 	return ua101_pcm_pointer(ua, &ua->playback);
891bc700ab1SDaniel Mack }
892bc700ab1SDaniel Mack 
893bc700ab1SDaniel Mack static struct snd_pcm_ops capture_pcm_ops = {
894bc700ab1SDaniel Mack 	.open = capture_pcm_open,
895bc700ab1SDaniel Mack 	.close = capture_pcm_close,
896bc700ab1SDaniel Mack 	.ioctl = snd_pcm_lib_ioctl,
897bc700ab1SDaniel Mack 	.hw_params = capture_pcm_hw_params,
898bc700ab1SDaniel Mack 	.hw_free = ua101_pcm_hw_free,
899bc700ab1SDaniel Mack 	.prepare = capture_pcm_prepare,
900bc700ab1SDaniel Mack 	.trigger = capture_pcm_trigger,
901bc700ab1SDaniel Mack 	.pointer = capture_pcm_pointer,
902bc700ab1SDaniel Mack 	.page = snd_pcm_lib_get_vmalloc_page,
903bc700ab1SDaniel Mack 	.mmap = snd_pcm_lib_mmap_vmalloc,
904bc700ab1SDaniel Mack };
905bc700ab1SDaniel Mack 
906bc700ab1SDaniel Mack static struct snd_pcm_ops playback_pcm_ops = {
907bc700ab1SDaniel Mack 	.open = playback_pcm_open,
908bc700ab1SDaniel Mack 	.close = playback_pcm_close,
909bc700ab1SDaniel Mack 	.ioctl = snd_pcm_lib_ioctl,
910bc700ab1SDaniel Mack 	.hw_params = playback_pcm_hw_params,
911bc700ab1SDaniel Mack 	.hw_free = ua101_pcm_hw_free,
912bc700ab1SDaniel Mack 	.prepare = playback_pcm_prepare,
913bc700ab1SDaniel Mack 	.trigger = playback_pcm_trigger,
914bc700ab1SDaniel Mack 	.pointer = playback_pcm_pointer,
915bc700ab1SDaniel Mack 	.page = snd_pcm_lib_get_vmalloc_page,
916bc700ab1SDaniel Mack 	.mmap = snd_pcm_lib_mmap_vmalloc,
917bc700ab1SDaniel Mack };
918bc700ab1SDaniel Mack 
919bc700ab1SDaniel Mack static const struct uac_format_type_i_discrete_descriptor *
920bc700ab1SDaniel Mack find_format_descriptor(struct usb_interface *interface)
921bc700ab1SDaniel Mack {
922bc700ab1SDaniel Mack 	struct usb_host_interface *alt;
923bc700ab1SDaniel Mack 	u8 *extra;
924bc700ab1SDaniel Mack 	int extralen;
925bc700ab1SDaniel Mack 
926bc700ab1SDaniel Mack 	if (interface->num_altsetting != 2) {
927bc700ab1SDaniel Mack 		dev_err(&interface->dev, "invalid num_altsetting\n");
928bc700ab1SDaniel Mack 		return NULL;
929bc700ab1SDaniel Mack 	}
930bc700ab1SDaniel Mack 
931bc700ab1SDaniel Mack 	alt = &interface->altsetting[0];
932bc700ab1SDaniel Mack 	if (alt->desc.bNumEndpoints != 0) {
933bc700ab1SDaniel Mack 		dev_err(&interface->dev, "invalid bNumEndpoints\n");
934bc700ab1SDaniel Mack 		return NULL;
935bc700ab1SDaniel Mack 	}
936bc700ab1SDaniel Mack 
937bc700ab1SDaniel Mack 	alt = &interface->altsetting[1];
938bc700ab1SDaniel Mack 	if (alt->desc.bNumEndpoints != 1) {
939bc700ab1SDaniel Mack 		dev_err(&interface->dev, "invalid bNumEndpoints\n");
940bc700ab1SDaniel Mack 		return NULL;
941bc700ab1SDaniel Mack 	}
942bc700ab1SDaniel Mack 
943bc700ab1SDaniel Mack 	extra = alt->extra;
944bc700ab1SDaniel Mack 	extralen = alt->extralen;
945bc700ab1SDaniel Mack 	while (extralen >= sizeof(struct usb_descriptor_header)) {
946bc700ab1SDaniel Mack 		struct uac_format_type_i_discrete_descriptor *desc;
947bc700ab1SDaniel Mack 
948bc700ab1SDaniel Mack 		desc = (struct uac_format_type_i_discrete_descriptor *)extra;
949bc700ab1SDaniel Mack 		if (desc->bLength > extralen) {
950bc700ab1SDaniel Mack 			dev_err(&interface->dev, "descriptor overflow\n");
951bc700ab1SDaniel Mack 			return NULL;
952bc700ab1SDaniel Mack 		}
953bc700ab1SDaniel Mack 		if (desc->bLength == UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1) &&
954bc700ab1SDaniel Mack 		    desc->bDescriptorType == USB_DT_CS_INTERFACE &&
955bc700ab1SDaniel Mack 		    desc->bDescriptorSubtype == UAC_FORMAT_TYPE) {
956bc700ab1SDaniel Mack 			if (desc->bFormatType != UAC_FORMAT_TYPE_I_PCM ||
957bc700ab1SDaniel Mack 			    desc->bSamFreqType != 1) {
958bc700ab1SDaniel Mack 				dev_err(&interface->dev,
959bc700ab1SDaniel Mack 					"invalid format type\n");
960bc700ab1SDaniel Mack 				return NULL;
961bc700ab1SDaniel Mack 			}
962bc700ab1SDaniel Mack 			return desc;
963bc700ab1SDaniel Mack 		}
964bc700ab1SDaniel Mack 		extralen -= desc->bLength;
965bc700ab1SDaniel Mack 		extra += desc->bLength;
966bc700ab1SDaniel Mack 	}
967bc700ab1SDaniel Mack 	dev_err(&interface->dev, "sample format descriptor not found\n");
968bc700ab1SDaniel Mack 	return NULL;
969bc700ab1SDaniel Mack }
970bc700ab1SDaniel Mack 
971bc700ab1SDaniel Mack static int detect_usb_format(struct ua101 *ua)
972bc700ab1SDaniel Mack {
973bc700ab1SDaniel Mack 	const struct uac_format_type_i_discrete_descriptor *fmt_capture;
974bc700ab1SDaniel Mack 	const struct uac_format_type_i_discrete_descriptor *fmt_playback;
975bc700ab1SDaniel Mack 	const struct usb_endpoint_descriptor *epd;
976bc700ab1SDaniel Mack 	unsigned int rate2;
977bc700ab1SDaniel Mack 
978bc700ab1SDaniel Mack 	fmt_capture = find_format_descriptor(ua->intf[INTF_CAPTURE]);
979bc700ab1SDaniel Mack 	fmt_playback = find_format_descriptor(ua->intf[INTF_PLAYBACK]);
980bc700ab1SDaniel Mack 	if (!fmt_capture || !fmt_playback)
981bc700ab1SDaniel Mack 		return -ENXIO;
982bc700ab1SDaniel Mack 
983bc700ab1SDaniel Mack 	switch (fmt_capture->bSubframeSize) {
984bc700ab1SDaniel Mack 	case 3:
985bc700ab1SDaniel Mack 		ua->format_bit = SNDRV_PCM_FMTBIT_S24_3LE;
986bc700ab1SDaniel Mack 		break;
987bc700ab1SDaniel Mack 	case 4:
988bc700ab1SDaniel Mack 		ua->format_bit = SNDRV_PCM_FMTBIT_S32_LE;
989bc700ab1SDaniel Mack 		break;
990bc700ab1SDaniel Mack 	default:
991bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev, "sample width is not 24 or 32 bits\n");
992bc700ab1SDaniel Mack 		return -ENXIO;
993bc700ab1SDaniel Mack 	}
994bc700ab1SDaniel Mack 	if (fmt_capture->bSubframeSize != fmt_playback->bSubframeSize) {
995bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev,
996bc700ab1SDaniel Mack 			"playback/capture sample widths do not match\n");
997bc700ab1SDaniel Mack 		return -ENXIO;
998bc700ab1SDaniel Mack 	}
999bc700ab1SDaniel Mack 
1000bc700ab1SDaniel Mack 	if (fmt_capture->bBitResolution != 24 ||
1001bc700ab1SDaniel Mack 	    fmt_playback->bBitResolution != 24) {
1002bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev, "sample width is not 24 bits\n");
1003bc700ab1SDaniel Mack 		return -ENXIO;
1004bc700ab1SDaniel Mack 	}
1005bc700ab1SDaniel Mack 
1006bc700ab1SDaniel Mack 	ua->rate = combine_triple(fmt_capture->tSamFreq[0]);
1007bc700ab1SDaniel Mack 	rate2 = combine_triple(fmt_playback->tSamFreq[0]);
1008bc700ab1SDaniel Mack 	if (ua->rate != rate2) {
1009bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev,
1010bc700ab1SDaniel Mack 			"playback/capture rates do not match: %u/%u\n",
1011bc700ab1SDaniel Mack 			rate2, ua->rate);
1012bc700ab1SDaniel Mack 		return -ENXIO;
1013bc700ab1SDaniel Mack 	}
1014bc700ab1SDaniel Mack 
1015bc700ab1SDaniel Mack 	switch (ua->dev->speed) {
1016bc700ab1SDaniel Mack 	case USB_SPEED_FULL:
1017bc700ab1SDaniel Mack 		ua->packets_per_second = 1000;
1018bc700ab1SDaniel Mack 		break;
1019bc700ab1SDaniel Mack 	case USB_SPEED_HIGH:
1020bc700ab1SDaniel Mack 		ua->packets_per_second = 8000;
1021bc700ab1SDaniel Mack 		break;
1022bc700ab1SDaniel Mack 	default:
1023bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev, "unknown device speed\n");
1024bc700ab1SDaniel Mack 		return -ENXIO;
1025bc700ab1SDaniel Mack 	}
1026bc700ab1SDaniel Mack 
1027bc700ab1SDaniel Mack 	ua->capture.channels = fmt_capture->bNrChannels;
1028bc700ab1SDaniel Mack 	ua->playback.channels = fmt_playback->bNrChannels;
1029bc700ab1SDaniel Mack 	ua->capture.frame_bytes =
1030bc700ab1SDaniel Mack 		fmt_capture->bSubframeSize * ua->capture.channels;
1031bc700ab1SDaniel Mack 	ua->playback.frame_bytes =
1032bc700ab1SDaniel Mack 		fmt_playback->bSubframeSize * ua->playback.channels;
1033bc700ab1SDaniel Mack 
1034bc700ab1SDaniel Mack 	epd = &ua->intf[INTF_CAPTURE]->altsetting[1].endpoint[0].desc;
1035bc700ab1SDaniel Mack 	if (!usb_endpoint_is_isoc_in(epd)) {
1036bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev, "invalid capture endpoint\n");
1037bc700ab1SDaniel Mack 		return -ENXIO;
1038bc700ab1SDaniel Mack 	}
1039bc700ab1SDaniel Mack 	ua->capture.usb_pipe = usb_rcvisocpipe(ua->dev, usb_endpoint_num(epd));
1040bc700ab1SDaniel Mack 	ua->capture.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize);
1041bc700ab1SDaniel Mack 
1042bc700ab1SDaniel Mack 	epd = &ua->intf[INTF_PLAYBACK]->altsetting[1].endpoint[0].desc;
1043bc700ab1SDaniel Mack 	if (!usb_endpoint_is_isoc_out(epd)) {
1044bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev, "invalid playback endpoint\n");
1045bc700ab1SDaniel Mack 		return -ENXIO;
1046bc700ab1SDaniel Mack 	}
1047bc700ab1SDaniel Mack 	ua->playback.usb_pipe = usb_sndisocpipe(ua->dev, usb_endpoint_num(epd));
1048bc700ab1SDaniel Mack 	ua->playback.max_packet_bytes = le16_to_cpu(epd->wMaxPacketSize);
1049bc700ab1SDaniel Mack 	return 0;
1050bc700ab1SDaniel Mack }
1051bc700ab1SDaniel Mack 
1052bc700ab1SDaniel Mack static int alloc_stream_buffers(struct ua101 *ua, struct ua101_stream *stream)
1053bc700ab1SDaniel Mack {
1054bc700ab1SDaniel Mack 	unsigned int remaining_packets, packets, packets_per_page, i;
1055bc700ab1SDaniel Mack 	size_t size;
1056bc700ab1SDaniel Mack 
1057bc700ab1SDaniel Mack 	stream->queue_length = queue_length;
1058bc700ab1SDaniel Mack 	stream->queue_length = max(stream->queue_length,
1059bc700ab1SDaniel Mack 				   (unsigned int)MIN_QUEUE_LENGTH);
1060bc700ab1SDaniel Mack 	stream->queue_length = min(stream->queue_length,
1061bc700ab1SDaniel Mack 				   (unsigned int)MAX_QUEUE_LENGTH);
1062bc700ab1SDaniel Mack 
1063bc700ab1SDaniel Mack 	/*
10647a9b1492SLinus Torvalds 	 * The cache pool sizes used by usb_alloc_coherent() (128, 512, 2048) are
1065bc700ab1SDaniel Mack 	 * quite bad when used with the packet sizes of this device (e.g. 280,
1066bc700ab1SDaniel Mack 	 * 520, 624).  Therefore, we allocate and subdivide entire pages, using
1067bc700ab1SDaniel Mack 	 * a smaller buffer only for the last chunk.
1068bc700ab1SDaniel Mack 	 */
1069bc700ab1SDaniel Mack 	remaining_packets = stream->queue_length;
1070bc700ab1SDaniel Mack 	packets_per_page = PAGE_SIZE / stream->max_packet_bytes;
1071bc700ab1SDaniel Mack 	for (i = 0; i < ARRAY_SIZE(stream->buffers); ++i) {
1072bc700ab1SDaniel Mack 		packets = min(remaining_packets, packets_per_page);
1073bc700ab1SDaniel Mack 		size = packets * stream->max_packet_bytes;
1074bc700ab1SDaniel Mack 		stream->buffers[i].addr =
10757a9b1492SLinus Torvalds 			usb_alloc_coherent(ua->dev, size, GFP_KERNEL,
1076bc700ab1SDaniel Mack 					   &stream->buffers[i].dma);
1077bc700ab1SDaniel Mack 		if (!stream->buffers[i].addr)
1078bc700ab1SDaniel Mack 			return -ENOMEM;
1079bc700ab1SDaniel Mack 		stream->buffers[i].size = size;
1080bc700ab1SDaniel Mack 		remaining_packets -= packets;
1081bc700ab1SDaniel Mack 		if (!remaining_packets)
1082bc700ab1SDaniel Mack 			break;
1083bc700ab1SDaniel Mack 	}
1084bc700ab1SDaniel Mack 	if (remaining_packets) {
1085bc700ab1SDaniel Mack 		dev_err(&ua->dev->dev, "too many packets\n");
1086bc700ab1SDaniel Mack 		return -ENXIO;
1087bc700ab1SDaniel Mack 	}
1088bc700ab1SDaniel Mack 	return 0;
1089bc700ab1SDaniel Mack }
1090bc700ab1SDaniel Mack 
1091bc700ab1SDaniel Mack static void free_stream_buffers(struct ua101 *ua, struct ua101_stream *stream)
1092bc700ab1SDaniel Mack {
1093bc700ab1SDaniel Mack 	unsigned int i;
1094bc700ab1SDaniel Mack 
1095bc700ab1SDaniel Mack 	for (i = 0; i < ARRAY_SIZE(stream->buffers); ++i)
10967a9b1492SLinus Torvalds 		usb_free_coherent(ua->dev,
1097bc700ab1SDaniel Mack 				  stream->buffers[i].size,
1098bc700ab1SDaniel Mack 				  stream->buffers[i].addr,
1099bc700ab1SDaniel Mack 				  stream->buffers[i].dma);
1100bc700ab1SDaniel Mack }
1101bc700ab1SDaniel Mack 
1102bc700ab1SDaniel Mack static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream,
1103bc700ab1SDaniel Mack 			     void (*urb_complete)(struct urb *))
1104bc700ab1SDaniel Mack {
1105bc700ab1SDaniel Mack 	unsigned max_packet_size = stream->max_packet_bytes;
1106bc700ab1SDaniel Mack 	struct ua101_urb *urb;
1107bc700ab1SDaniel Mack 	unsigned int b, u = 0;
1108bc700ab1SDaniel Mack 
1109bc700ab1SDaniel Mack 	for (b = 0; b < ARRAY_SIZE(stream->buffers); ++b) {
1110bc700ab1SDaniel Mack 		unsigned int size = stream->buffers[b].size;
1111bc700ab1SDaniel Mack 		u8 *addr = stream->buffers[b].addr;
1112bc700ab1SDaniel Mack 		dma_addr_t dma = stream->buffers[b].dma;
1113bc700ab1SDaniel Mack 
1114bc700ab1SDaniel Mack 		while (size >= max_packet_size) {
1115bc700ab1SDaniel Mack 			if (u >= stream->queue_length)
1116bc700ab1SDaniel Mack 				goto bufsize_error;
1117bc700ab1SDaniel Mack 			urb = kmalloc(sizeof(*urb), GFP_KERNEL);
1118bc700ab1SDaniel Mack 			if (!urb)
1119bc700ab1SDaniel Mack 				return -ENOMEM;
1120bc700ab1SDaniel Mack 			usb_init_urb(&urb->urb);
1121bc700ab1SDaniel Mack 			urb->urb.dev = ua->dev;
1122bc700ab1SDaniel Mack 			urb->urb.pipe = stream->usb_pipe;
1123bc700ab1SDaniel Mack 			urb->urb.transfer_flags = URB_ISO_ASAP |
1124bc700ab1SDaniel Mack 					URB_NO_TRANSFER_DMA_MAP;
1125bc700ab1SDaniel Mack 			urb->urb.transfer_buffer = addr;
1126bc700ab1SDaniel Mack 			urb->urb.transfer_dma = dma;
1127bc700ab1SDaniel Mack 			urb->urb.transfer_buffer_length = max_packet_size;
1128bc700ab1SDaniel Mack 			urb->urb.number_of_packets = 1;
1129bc700ab1SDaniel Mack 			urb->urb.interval = 1;
1130bc700ab1SDaniel Mack 			urb->urb.context = ua;
1131bc700ab1SDaniel Mack 			urb->urb.complete = urb_complete;
1132bc700ab1SDaniel Mack 			urb->urb.iso_frame_desc[0].offset = 0;
1133bc700ab1SDaniel Mack 			urb->urb.iso_frame_desc[0].length = max_packet_size;
1134bc700ab1SDaniel Mack 			stream->urbs[u++] = urb;
1135bc700ab1SDaniel Mack 			size -= max_packet_size;
1136bc700ab1SDaniel Mack 			addr += max_packet_size;
1137bc700ab1SDaniel Mack 			dma += max_packet_size;
1138bc700ab1SDaniel Mack 		}
1139bc700ab1SDaniel Mack 	}
1140bc700ab1SDaniel Mack 	if (u == stream->queue_length)
1141bc700ab1SDaniel Mack 		return 0;
1142bc700ab1SDaniel Mack bufsize_error:
1143bc700ab1SDaniel Mack 	dev_err(&ua->dev->dev, "internal buffer size error\n");
1144bc700ab1SDaniel Mack 	return -ENXIO;
1145bc700ab1SDaniel Mack }
1146bc700ab1SDaniel Mack 
1147bc700ab1SDaniel Mack static void free_stream_urbs(struct ua101_stream *stream)
1148bc700ab1SDaniel Mack {
1149bc700ab1SDaniel Mack 	unsigned int i;
1150bc700ab1SDaniel Mack 
1151862a6244SClemens Ladisch 	for (i = 0; i < stream->queue_length; ++i) {
1152bc700ab1SDaniel Mack 		kfree(stream->urbs[i]);
1153862a6244SClemens Ladisch 		stream->urbs[i] = NULL;
1154862a6244SClemens Ladisch 	}
1155bc700ab1SDaniel Mack }
1156bc700ab1SDaniel Mack 
1157bc700ab1SDaniel Mack static void free_usb_related_resources(struct ua101 *ua,
1158bc700ab1SDaniel Mack 				       struct usb_interface *interface)
1159bc700ab1SDaniel Mack {
1160bc700ab1SDaniel Mack 	unsigned int i;
1161862a6244SClemens Ladisch 	struct usb_interface *intf;
1162bc700ab1SDaniel Mack 
1163862a6244SClemens Ladisch 	mutex_lock(&ua->mutex);
1164bc700ab1SDaniel Mack 	free_stream_urbs(&ua->capture);
1165bc700ab1SDaniel Mack 	free_stream_urbs(&ua->playback);
1166862a6244SClemens Ladisch 	mutex_unlock(&ua->mutex);
1167bc700ab1SDaniel Mack 	free_stream_buffers(ua, &ua->capture);
1168bc700ab1SDaniel Mack 	free_stream_buffers(ua, &ua->playback);
1169bc700ab1SDaniel Mack 
1170862a6244SClemens Ladisch 	for (i = 0; i < ARRAY_SIZE(ua->intf); ++i) {
1171862a6244SClemens Ladisch 		mutex_lock(&ua->mutex);
1172862a6244SClemens Ladisch 		intf = ua->intf[i];
1173862a6244SClemens Ladisch 		ua->intf[i] = NULL;
1174862a6244SClemens Ladisch 		mutex_unlock(&ua->mutex);
1175862a6244SClemens Ladisch 		if (intf) {
1176862a6244SClemens Ladisch 			usb_set_intfdata(intf, NULL);
1177862a6244SClemens Ladisch 			if (intf != interface)
1178bc700ab1SDaniel Mack 				usb_driver_release_interface(&ua101_driver,
1179862a6244SClemens Ladisch 							     intf);
1180862a6244SClemens Ladisch 		}
1181bc700ab1SDaniel Mack 	}
1182bc700ab1SDaniel Mack }
1183bc700ab1SDaniel Mack 
1184bc700ab1SDaniel Mack static void ua101_card_free(struct snd_card *card)
1185bc700ab1SDaniel Mack {
1186bc700ab1SDaniel Mack 	struct ua101 *ua = card->private_data;
1187bc700ab1SDaniel Mack 
1188bc700ab1SDaniel Mack 	mutex_destroy(&ua->mutex);
1189bc700ab1SDaniel Mack }
1190bc700ab1SDaniel Mack 
1191bc700ab1SDaniel Mack static int ua101_probe(struct usb_interface *interface,
1192bc700ab1SDaniel Mack 		       const struct usb_device_id *usb_id)
1193bc700ab1SDaniel Mack {
1194bc700ab1SDaniel Mack 	static const struct snd_usb_midi_endpoint_info midi_ep = {
1195bc700ab1SDaniel Mack 		.out_cables = 0x0001,
1196bc700ab1SDaniel Mack 		.in_cables = 0x0001
1197bc700ab1SDaniel Mack 	};
1198bc700ab1SDaniel Mack 	static const struct snd_usb_audio_quirk midi_quirk = {
1199bc700ab1SDaniel Mack 		.type = QUIRK_MIDI_FIXED_ENDPOINT,
1200bc700ab1SDaniel Mack 		.data = &midi_ep
1201bc700ab1SDaniel Mack 	};
1202bc700ab1SDaniel Mack 	static const int intf_numbers[2][3] = {
1203bc700ab1SDaniel Mack 		{	/* UA-101 */
1204bc700ab1SDaniel Mack 			[INTF_PLAYBACK] = 0,
1205bc700ab1SDaniel Mack 			[INTF_CAPTURE] = 1,
1206bc700ab1SDaniel Mack 			[INTF_MIDI] = 2,
1207bc700ab1SDaniel Mack 		},
1208bc700ab1SDaniel Mack 		{	/* UA-1000 */
1209bc700ab1SDaniel Mack 			[INTF_CAPTURE] = 1,
1210bc700ab1SDaniel Mack 			[INTF_PLAYBACK] = 2,
1211bc700ab1SDaniel Mack 			[INTF_MIDI] = 3,
1212bc700ab1SDaniel Mack 		},
1213bc700ab1SDaniel Mack 	};
1214bc700ab1SDaniel Mack 	struct snd_card *card;
1215bc700ab1SDaniel Mack 	struct ua101 *ua;
1216bc700ab1SDaniel Mack 	unsigned int card_index, i;
1217bc700ab1SDaniel Mack 	int is_ua1000;
1218bc700ab1SDaniel Mack 	const char *name;
1219bc700ab1SDaniel Mack 	char usb_path[32];
1220bc700ab1SDaniel Mack 	int err;
1221bc700ab1SDaniel Mack 
1222bc700ab1SDaniel Mack 	is_ua1000 = usb_id->idProduct == 0x0044;
1223bc700ab1SDaniel Mack 
1224bc700ab1SDaniel Mack 	if (interface->altsetting->desc.bInterfaceNumber !=
1225bc700ab1SDaniel Mack 	    intf_numbers[is_ua1000][0])
1226bc700ab1SDaniel Mack 		return -ENODEV;
1227bc700ab1SDaniel Mack 
1228bc700ab1SDaniel Mack 	mutex_lock(&devices_mutex);
1229bc700ab1SDaniel Mack 
1230bc700ab1SDaniel Mack 	for (card_index = 0; card_index < SNDRV_CARDS; ++card_index)
1231bc700ab1SDaniel Mack 		if (enable[card_index] && !(devices_used & (1 << card_index)))
1232bc700ab1SDaniel Mack 			break;
1233bc700ab1SDaniel Mack 	if (card_index >= SNDRV_CARDS) {
1234bc700ab1SDaniel Mack 		mutex_unlock(&devices_mutex);
1235bc700ab1SDaniel Mack 		return -ENOENT;
1236bc700ab1SDaniel Mack 	}
1237bc700ab1SDaniel Mack 	err = snd_card_create(index[card_index], id[card_index], THIS_MODULE,
1238bc700ab1SDaniel Mack 			      sizeof(*ua), &card);
1239bc700ab1SDaniel Mack 	if (err < 0) {
1240bc700ab1SDaniel Mack 		mutex_unlock(&devices_mutex);
1241bc700ab1SDaniel Mack 		return err;
1242bc700ab1SDaniel Mack 	}
1243bc700ab1SDaniel Mack 	card->private_free = ua101_card_free;
1244bc700ab1SDaniel Mack 	ua = card->private_data;
1245bc700ab1SDaniel Mack 	ua->dev = interface_to_usbdev(interface);
1246bc700ab1SDaniel Mack 	ua->card = card;
1247bc700ab1SDaniel Mack 	ua->card_index = card_index;
1248bc700ab1SDaniel Mack 	INIT_LIST_HEAD(&ua->midi_list);
1249bc700ab1SDaniel Mack 	spin_lock_init(&ua->lock);
1250bc700ab1SDaniel Mack 	mutex_init(&ua->mutex);
1251bc700ab1SDaniel Mack 	INIT_LIST_HEAD(&ua->ready_playback_urbs);
1252bc700ab1SDaniel Mack 	tasklet_init(&ua->playback_tasklet,
1253bc700ab1SDaniel Mack 		     playback_tasklet, (unsigned long)ua);
1254bc700ab1SDaniel Mack 	init_waitqueue_head(&ua->alsa_capture_wait);
1255bc700ab1SDaniel Mack 	init_waitqueue_head(&ua->rate_feedback_wait);
1256bc700ab1SDaniel Mack 	init_waitqueue_head(&ua->alsa_playback_wait);
1257bc700ab1SDaniel Mack 
1258bc700ab1SDaniel Mack 	ua->intf[0] = interface;
1259bc700ab1SDaniel Mack 	for (i = 1; i < ARRAY_SIZE(ua->intf); ++i) {
1260bc700ab1SDaniel Mack 		ua->intf[i] = usb_ifnum_to_if(ua->dev,
1261bc700ab1SDaniel Mack 					      intf_numbers[is_ua1000][i]);
1262bc700ab1SDaniel Mack 		if (!ua->intf[i]) {
1263bc700ab1SDaniel Mack 			dev_err(&ua->dev->dev, "interface %u not found\n",
1264bc700ab1SDaniel Mack 				intf_numbers[is_ua1000][i]);
1265bc700ab1SDaniel Mack 			err = -ENXIO;
1266bc700ab1SDaniel Mack 			goto probe_error;
1267bc700ab1SDaniel Mack 		}
1268bc700ab1SDaniel Mack 		err = usb_driver_claim_interface(&ua101_driver,
1269bc700ab1SDaniel Mack 						 ua->intf[i], ua);
1270bc700ab1SDaniel Mack 		if (err < 0) {
1271bc700ab1SDaniel Mack 			ua->intf[i] = NULL;
1272bc700ab1SDaniel Mack 			err = -EBUSY;
1273bc700ab1SDaniel Mack 			goto probe_error;
1274bc700ab1SDaniel Mack 		}
1275bc700ab1SDaniel Mack 	}
1276bc700ab1SDaniel Mack 
1277bc700ab1SDaniel Mack 	snd_card_set_dev(card, &interface->dev);
1278bc700ab1SDaniel Mack 
1279bc700ab1SDaniel Mack 	err = detect_usb_format(ua);
1280bc700ab1SDaniel Mack 	if (err < 0)
1281bc700ab1SDaniel Mack 		goto probe_error;
1282bc700ab1SDaniel Mack 
1283bc700ab1SDaniel Mack 	name = usb_id->idProduct == 0x0044 ? "UA-1000" : "UA-101";
1284bc700ab1SDaniel Mack 	strcpy(card->driver, "UA-101");
1285bc700ab1SDaniel Mack 	strcpy(card->shortname, name);
1286bc700ab1SDaniel Mack 	usb_make_path(ua->dev, usb_path, sizeof(usb_path));
1287bc700ab1SDaniel Mack 	snprintf(ua->card->longname, sizeof(ua->card->longname),
1288bc700ab1SDaniel Mack 		 "EDIROL %s (serial %s), %u Hz at %s, %s speed", name,
1289bc700ab1SDaniel Mack 		 ua->dev->serial ? ua->dev->serial : "?", ua->rate, usb_path,
1290bc700ab1SDaniel Mack 		 ua->dev->speed == USB_SPEED_HIGH ? "high" : "full");
1291bc700ab1SDaniel Mack 
1292bc700ab1SDaniel Mack 	err = alloc_stream_buffers(ua, &ua->capture);
1293bc700ab1SDaniel Mack 	if (err < 0)
1294bc700ab1SDaniel Mack 		goto probe_error;
1295bc700ab1SDaniel Mack 	err = alloc_stream_buffers(ua, &ua->playback);
1296bc700ab1SDaniel Mack 	if (err < 0)
1297bc700ab1SDaniel Mack 		goto probe_error;
1298bc700ab1SDaniel Mack 
1299bc700ab1SDaniel Mack 	err = alloc_stream_urbs(ua, &ua->capture, capture_urb_complete);
1300bc700ab1SDaniel Mack 	if (err < 0)
1301bc700ab1SDaniel Mack 		goto probe_error;
1302bc700ab1SDaniel Mack 	err = alloc_stream_urbs(ua, &ua->playback, playback_urb_complete);
1303bc700ab1SDaniel Mack 	if (err < 0)
1304bc700ab1SDaniel Mack 		goto probe_error;
1305bc700ab1SDaniel Mack 
1306bc700ab1SDaniel Mack 	err = snd_pcm_new(card, name, 0, 1, 1, &ua->pcm);
1307bc700ab1SDaniel Mack 	if (err < 0)
1308bc700ab1SDaniel Mack 		goto probe_error;
1309bc700ab1SDaniel Mack 	ua->pcm->private_data = ua;
1310bc700ab1SDaniel Mack 	strcpy(ua->pcm->name, name);
1311bc700ab1SDaniel Mack 	snd_pcm_set_ops(ua->pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_pcm_ops);
1312bc700ab1SDaniel Mack 	snd_pcm_set_ops(ua->pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_pcm_ops);
1313bc700ab1SDaniel Mack 
1314bc700ab1SDaniel Mack 	err = snd_usbmidi_create(card, ua->intf[INTF_MIDI],
1315bc700ab1SDaniel Mack 				 &ua->midi_list, &midi_quirk);
1316bc700ab1SDaniel Mack 	if (err < 0)
1317bc700ab1SDaniel Mack 		goto probe_error;
1318bc700ab1SDaniel Mack 
1319bc700ab1SDaniel Mack 	err = snd_card_register(card);
1320bc700ab1SDaniel Mack 	if (err < 0)
1321bc700ab1SDaniel Mack 		goto probe_error;
1322bc700ab1SDaniel Mack 
1323bc700ab1SDaniel Mack 	usb_set_intfdata(interface, ua);
1324bc700ab1SDaniel Mack 	devices_used |= 1 << card_index;
1325bc700ab1SDaniel Mack 
1326bc700ab1SDaniel Mack 	mutex_unlock(&devices_mutex);
1327bc700ab1SDaniel Mack 	return 0;
1328bc700ab1SDaniel Mack 
1329bc700ab1SDaniel Mack probe_error:
1330bc700ab1SDaniel Mack 	free_usb_related_resources(ua, interface);
1331bc700ab1SDaniel Mack 	snd_card_free(card);
1332bc700ab1SDaniel Mack 	mutex_unlock(&devices_mutex);
1333bc700ab1SDaniel Mack 	return err;
1334bc700ab1SDaniel Mack }
1335bc700ab1SDaniel Mack 
1336bc700ab1SDaniel Mack static void ua101_disconnect(struct usb_interface *interface)
1337bc700ab1SDaniel Mack {
1338bc700ab1SDaniel Mack 	struct ua101 *ua = usb_get_intfdata(interface);
1339bc700ab1SDaniel Mack 	struct list_head *midi;
1340bc700ab1SDaniel Mack 
1341bc700ab1SDaniel Mack 	if (!ua)
1342bc700ab1SDaniel Mack 		return;
1343bc700ab1SDaniel Mack 
1344bc700ab1SDaniel Mack 	mutex_lock(&devices_mutex);
1345bc700ab1SDaniel Mack 
1346bc700ab1SDaniel Mack 	set_bit(DISCONNECTED, &ua->states);
1347bc700ab1SDaniel Mack 	wake_up(&ua->rate_feedback_wait);
1348bc700ab1SDaniel Mack 
1349bc700ab1SDaniel Mack 	/* make sure that userspace cannot create new requests */
1350bc700ab1SDaniel Mack 	snd_card_disconnect(ua->card);
1351bc700ab1SDaniel Mack 
1352bc700ab1SDaniel Mack 	/* make sure that there are no pending USB requests */
1353bc700ab1SDaniel Mack 	__list_for_each(midi, &ua->midi_list)
1354bc700ab1SDaniel Mack 		snd_usbmidi_disconnect(midi);
1355bc700ab1SDaniel Mack 	abort_alsa_playback(ua);
1356bc700ab1SDaniel Mack 	abort_alsa_capture(ua);
1357bc700ab1SDaniel Mack 	mutex_lock(&ua->mutex);
1358bc700ab1SDaniel Mack 	stop_usb_playback(ua);
1359bc700ab1SDaniel Mack 	stop_usb_capture(ua);
1360bc700ab1SDaniel Mack 	mutex_unlock(&ua->mutex);
1361bc700ab1SDaniel Mack 
1362bc700ab1SDaniel Mack 	free_usb_related_resources(ua, interface);
1363bc700ab1SDaniel Mack 
1364bc700ab1SDaniel Mack 	devices_used &= ~(1 << ua->card_index);
1365bc700ab1SDaniel Mack 
1366bc700ab1SDaniel Mack 	snd_card_free_when_closed(ua->card);
1367bc700ab1SDaniel Mack 
1368bc700ab1SDaniel Mack 	mutex_unlock(&devices_mutex);
1369bc700ab1SDaniel Mack }
1370bc700ab1SDaniel Mack 
1371bc700ab1SDaniel Mack static struct usb_device_id ua101_ids[] = {
1372bc700ab1SDaniel Mack 	{ USB_DEVICE(0x0582, 0x0044) }, /* UA-1000 high speed */
1373bc700ab1SDaniel Mack 	{ USB_DEVICE(0x0582, 0x007d) }, /* UA-101 high speed */
1374bc700ab1SDaniel Mack 	{ USB_DEVICE(0x0582, 0x008d) }, /* UA-101 full speed */
1375bc700ab1SDaniel Mack 	{ }
1376bc700ab1SDaniel Mack };
1377bc700ab1SDaniel Mack MODULE_DEVICE_TABLE(usb, ua101_ids);
1378bc700ab1SDaniel Mack 
1379bc700ab1SDaniel Mack static struct usb_driver ua101_driver = {
1380bc700ab1SDaniel Mack 	.name = "snd-ua101",
1381bc700ab1SDaniel Mack 	.id_table = ua101_ids,
1382bc700ab1SDaniel Mack 	.probe = ua101_probe,
1383bc700ab1SDaniel Mack 	.disconnect = ua101_disconnect,
1384bc700ab1SDaniel Mack #if 0
1385bc700ab1SDaniel Mack 	.suspend = ua101_suspend,
1386bc700ab1SDaniel Mack 	.resume = ua101_resume,
1387bc700ab1SDaniel Mack #endif
1388bc700ab1SDaniel Mack };
1389bc700ab1SDaniel Mack 
1390424f0750SGreg Kroah-Hartman module_usb_driver(ua101_driver);
1391