1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun */
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include <linux/init.h>
6*4882a593Smuzhiyun #include <linux/slab.h>
7*4882a593Smuzhiyun #include <linux/bitrev.h>
8*4882a593Smuzhiyun #include <linux/ratelimit.h>
9*4882a593Smuzhiyun #include <linux/usb.h>
10*4882a593Smuzhiyun #include <linux/usb/audio.h>
11*4882a593Smuzhiyun #include <linux/usb/audio-v2.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <sound/core.h>
14*4882a593Smuzhiyun #include <sound/pcm.h>
15*4882a593Smuzhiyun #include <sound/pcm_params.h>
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #include <trace/hooks/sound.h>
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include "usbaudio.h"
20*4882a593Smuzhiyun #include "card.h"
21*4882a593Smuzhiyun #include "quirks.h"
22*4882a593Smuzhiyun #include "debug.h"
23*4882a593Smuzhiyun #include "endpoint.h"
24*4882a593Smuzhiyun #include "helper.h"
25*4882a593Smuzhiyun #include "pcm.h"
26*4882a593Smuzhiyun #include "clock.h"
27*4882a593Smuzhiyun #include "power.h"
28*4882a593Smuzhiyun #include "media.h"
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun #define SUBSTREAM_FLAG_DATA_EP_STARTED 0
31*4882a593Smuzhiyun #define SUBSTREAM_FLAG_SYNC_EP_STARTED 1
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /* return the estimated delay based on USB frame counters */
snd_usb_pcm_delay(struct snd_usb_substream * subs,unsigned int rate)34*4882a593Smuzhiyun snd_pcm_uframes_t snd_usb_pcm_delay(struct snd_usb_substream *subs,
35*4882a593Smuzhiyun unsigned int rate)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun int current_frame_number;
38*4882a593Smuzhiyun int frame_diff;
39*4882a593Smuzhiyun int est_delay;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun if (!subs->last_delay)
42*4882a593Smuzhiyun return 0; /* short path */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun current_frame_number = usb_get_current_frame_number(subs->dev);
45*4882a593Smuzhiyun /*
46*4882a593Smuzhiyun * HCD implementations use different widths, use lower 8 bits.
47*4882a593Smuzhiyun * The delay will be managed up to 256ms, which is more than
48*4882a593Smuzhiyun * enough
49*4882a593Smuzhiyun */
50*4882a593Smuzhiyun frame_diff = (current_frame_number - subs->last_frame_number) & 0xff;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /* Approximation based on number of samples per USB frame (ms),
53*4882a593Smuzhiyun some truncation for 44.1 but the estimate is good enough */
54*4882a593Smuzhiyun est_delay = frame_diff * rate / 1000;
55*4882a593Smuzhiyun if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK)
56*4882a593Smuzhiyun est_delay = subs->last_delay - est_delay;
57*4882a593Smuzhiyun else
58*4882a593Smuzhiyun est_delay = subs->last_delay + est_delay;
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun if (est_delay < 0)
61*4882a593Smuzhiyun est_delay = 0;
62*4882a593Smuzhiyun return est_delay;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun /*
66*4882a593Smuzhiyun * return the current pcm pointer. just based on the hwptr_done value.
67*4882a593Smuzhiyun */
snd_usb_pcm_pointer(struct snd_pcm_substream * substream)68*4882a593Smuzhiyun static snd_pcm_uframes_t snd_usb_pcm_pointer(struct snd_pcm_substream *substream)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun struct snd_usb_substream *subs = substream->runtime->private_data;
71*4882a593Smuzhiyun unsigned int hwptr_done;
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun if (atomic_read(&subs->stream->chip->shutdown))
74*4882a593Smuzhiyun return SNDRV_PCM_POS_XRUN;
75*4882a593Smuzhiyun spin_lock(&subs->lock);
76*4882a593Smuzhiyun hwptr_done = subs->hwptr_done;
77*4882a593Smuzhiyun substream->runtime->delay = snd_usb_pcm_delay(subs,
78*4882a593Smuzhiyun substream->runtime->rate);
79*4882a593Smuzhiyun spin_unlock(&subs->lock);
80*4882a593Smuzhiyun return hwptr_done / (substream->runtime->frame_bits >> 3);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun /*
84*4882a593Smuzhiyun * find a matching audio format
85*4882a593Smuzhiyun */
find_format(struct snd_usb_substream * subs)86*4882a593Smuzhiyun static struct audioformat *find_format(struct snd_usb_substream *subs)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun struct audioformat *fp;
89*4882a593Smuzhiyun struct audioformat *found = NULL;
90*4882a593Smuzhiyun int cur_attr = 0, attr;
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
93*4882a593Smuzhiyun if (!(fp->formats & pcm_format_to_bits(subs->pcm_format)))
94*4882a593Smuzhiyun continue;
95*4882a593Smuzhiyun if (fp->channels != subs->channels)
96*4882a593Smuzhiyun continue;
97*4882a593Smuzhiyun if (subs->cur_rate < fp->rate_min ||
98*4882a593Smuzhiyun subs->cur_rate > fp->rate_max)
99*4882a593Smuzhiyun continue;
100*4882a593Smuzhiyun if (! (fp->rates & SNDRV_PCM_RATE_CONTINUOUS)) {
101*4882a593Smuzhiyun unsigned int i;
102*4882a593Smuzhiyun for (i = 0; i < fp->nr_rates; i++)
103*4882a593Smuzhiyun if (fp->rate_table[i] == subs->cur_rate)
104*4882a593Smuzhiyun break;
105*4882a593Smuzhiyun if (i >= fp->nr_rates)
106*4882a593Smuzhiyun continue;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun attr = fp->ep_attr & USB_ENDPOINT_SYNCTYPE;
109*4882a593Smuzhiyun if (! found) {
110*4882a593Smuzhiyun found = fp;
111*4882a593Smuzhiyun cur_attr = attr;
112*4882a593Smuzhiyun continue;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun /* avoid async out and adaptive in if the other method
115*4882a593Smuzhiyun * supports the same format.
116*4882a593Smuzhiyun * this is a workaround for the case like
117*4882a593Smuzhiyun * M-audio audiophile USB.
118*4882a593Smuzhiyun */
119*4882a593Smuzhiyun if (attr != cur_attr) {
120*4882a593Smuzhiyun if ((attr == USB_ENDPOINT_SYNC_ASYNC &&
121*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_PLAYBACK) ||
122*4882a593Smuzhiyun (attr == USB_ENDPOINT_SYNC_ADAPTIVE &&
123*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_CAPTURE))
124*4882a593Smuzhiyun continue;
125*4882a593Smuzhiyun if ((cur_attr == USB_ENDPOINT_SYNC_ASYNC &&
126*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_PLAYBACK) ||
127*4882a593Smuzhiyun (cur_attr == USB_ENDPOINT_SYNC_ADAPTIVE &&
128*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_CAPTURE)) {
129*4882a593Smuzhiyun found = fp;
130*4882a593Smuzhiyun cur_attr = attr;
131*4882a593Smuzhiyun continue;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun /* find the format with the largest max. packet size */
135*4882a593Smuzhiyun if (fp->maxpacksize > found->maxpacksize) {
136*4882a593Smuzhiyun found = fp;
137*4882a593Smuzhiyun cur_attr = attr;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun snd_vendor_set_pcm_binterval(fp, found, &cur_attr, &attr);
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun return found;
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /*
146*4882a593Smuzhiyun * find a matching audio format as well as non-zero service interval
147*4882a593Smuzhiyun */
find_format_and_si(struct snd_usb_substream * subs,unsigned int datainterval)148*4882a593Smuzhiyun static struct audioformat *find_format_and_si(struct snd_usb_substream *subs,
149*4882a593Smuzhiyun unsigned int datainterval)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun unsigned int i;
152*4882a593Smuzhiyun struct audioformat *fp;
153*4882a593Smuzhiyun struct audioformat *found = NULL;
154*4882a593Smuzhiyun int cur_attr = 0, attr;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
157*4882a593Smuzhiyun if (datainterval != fp->datainterval)
158*4882a593Smuzhiyun continue;
159*4882a593Smuzhiyun if (!(fp->formats & pcm_format_to_bits(subs->pcm_format)))
160*4882a593Smuzhiyun continue;
161*4882a593Smuzhiyun if (fp->channels != subs->channels)
162*4882a593Smuzhiyun continue;
163*4882a593Smuzhiyun if (subs->cur_rate < fp->rate_min ||
164*4882a593Smuzhiyun subs->cur_rate > fp->rate_max)
165*4882a593Smuzhiyun continue;
166*4882a593Smuzhiyun if (!(fp->rates & SNDRV_PCM_RATE_CONTINUOUS)) {
167*4882a593Smuzhiyun for (i = 0; i < fp->nr_rates; i++)
168*4882a593Smuzhiyun if (fp->rate_table[i] == subs->cur_rate)
169*4882a593Smuzhiyun break;
170*4882a593Smuzhiyun if (i >= fp->nr_rates)
171*4882a593Smuzhiyun continue;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun attr = fp->ep_attr & USB_ENDPOINT_SYNCTYPE;
174*4882a593Smuzhiyun if (!found) {
175*4882a593Smuzhiyun found = fp;
176*4882a593Smuzhiyun cur_attr = attr;
177*4882a593Smuzhiyun continue;
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun /* avoid async out and adaptive in if the other method
180*4882a593Smuzhiyun * supports the same format.
181*4882a593Smuzhiyun * this is a workaround for the case like
182*4882a593Smuzhiyun * M-audio audiophile USB.
183*4882a593Smuzhiyun */
184*4882a593Smuzhiyun if (attr != cur_attr) {
185*4882a593Smuzhiyun if ((attr == USB_ENDPOINT_SYNC_ASYNC &&
186*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_PLAYBACK) ||
187*4882a593Smuzhiyun (attr == USB_ENDPOINT_SYNC_ADAPTIVE &&
188*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_CAPTURE))
189*4882a593Smuzhiyun continue;
190*4882a593Smuzhiyun if ((cur_attr == USB_ENDPOINT_SYNC_ASYNC &&
191*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_PLAYBACK) ||
192*4882a593Smuzhiyun (cur_attr == USB_ENDPOINT_SYNC_ADAPTIVE &&
193*4882a593Smuzhiyun subs->direction == SNDRV_PCM_STREAM_CAPTURE)) {
194*4882a593Smuzhiyun found = fp;
195*4882a593Smuzhiyun cur_attr = attr;
196*4882a593Smuzhiyun continue;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun /* find the format with the largest max. packet size */
200*4882a593Smuzhiyun if (fp->maxpacksize > found->maxpacksize) {
201*4882a593Smuzhiyun found = fp;
202*4882a593Smuzhiyun cur_attr = attr;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun return found;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
init_pitch_v1(struct snd_usb_audio * chip,int iface,struct usb_host_interface * alts,struct audioformat * fmt)208*4882a593Smuzhiyun static int init_pitch_v1(struct snd_usb_audio *chip, int iface,
209*4882a593Smuzhiyun struct usb_host_interface *alts,
210*4882a593Smuzhiyun struct audioformat *fmt)
211*4882a593Smuzhiyun {
212*4882a593Smuzhiyun struct usb_device *dev = chip->dev;
213*4882a593Smuzhiyun unsigned int ep;
214*4882a593Smuzhiyun unsigned char data[1];
215*4882a593Smuzhiyun int err;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun if (get_iface_desc(alts)->bNumEndpoints < 1)
218*4882a593Smuzhiyun return -EINVAL;
219*4882a593Smuzhiyun ep = get_endpoint(alts, 0)->bEndpointAddress;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun data[0] = 1;
222*4882a593Smuzhiyun err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
223*4882a593Smuzhiyun USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
224*4882a593Smuzhiyun UAC_EP_CS_ATTR_PITCH_CONTROL << 8, ep,
225*4882a593Smuzhiyun data, sizeof(data));
226*4882a593Smuzhiyun if (err < 0) {
227*4882a593Smuzhiyun usb_audio_err(chip, "%d:%d: cannot set enable PITCH\n",
228*4882a593Smuzhiyun iface, ep);
229*4882a593Smuzhiyun return err;
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun return 0;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
init_pitch_v2(struct snd_usb_audio * chip,int iface,struct usb_host_interface * alts,struct audioformat * fmt)235*4882a593Smuzhiyun static int init_pitch_v2(struct snd_usb_audio *chip, int iface,
236*4882a593Smuzhiyun struct usb_host_interface *alts,
237*4882a593Smuzhiyun struct audioformat *fmt)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun struct usb_device *dev = chip->dev;
240*4882a593Smuzhiyun unsigned char data[1];
241*4882a593Smuzhiyun int err;
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun data[0] = 1;
244*4882a593Smuzhiyun err = snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC2_CS_CUR,
245*4882a593Smuzhiyun USB_TYPE_CLASS | USB_RECIP_ENDPOINT | USB_DIR_OUT,
246*4882a593Smuzhiyun UAC2_EP_CS_PITCH << 8, 0,
247*4882a593Smuzhiyun data, sizeof(data));
248*4882a593Smuzhiyun if (err < 0) {
249*4882a593Smuzhiyun usb_audio_err(chip, "%d:%d: cannot set enable PITCH (v2)\n",
250*4882a593Smuzhiyun iface, fmt->altsetting);
251*4882a593Smuzhiyun return err;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun return 0;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun /*
258*4882a593Smuzhiyun * initialize the pitch control and sample rate
259*4882a593Smuzhiyun */
snd_usb_init_pitch(struct snd_usb_audio * chip,int iface,struct usb_host_interface * alts,struct audioformat * fmt)260*4882a593Smuzhiyun int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface,
261*4882a593Smuzhiyun struct usb_host_interface *alts,
262*4882a593Smuzhiyun struct audioformat *fmt)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun /* if endpoint doesn't have pitch control, bail out */
265*4882a593Smuzhiyun if (!(fmt->attributes & UAC_EP_CS_ATTR_PITCH_CONTROL))
266*4882a593Smuzhiyun return 0;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun switch (fmt->protocol) {
269*4882a593Smuzhiyun case UAC_VERSION_1:
270*4882a593Smuzhiyun default:
271*4882a593Smuzhiyun return init_pitch_v1(chip, iface, alts, fmt);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun case UAC_VERSION_2:
274*4882a593Smuzhiyun return init_pitch_v2(chip, iface, alts, fmt);
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun
start_endpoints(struct snd_usb_substream * subs)278*4882a593Smuzhiyun static int start_endpoints(struct snd_usb_substream *subs)
279*4882a593Smuzhiyun {
280*4882a593Smuzhiyun int err;
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun if (!subs->data_endpoint)
283*4882a593Smuzhiyun return -EINVAL;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun if (!test_and_set_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) {
286*4882a593Smuzhiyun struct snd_usb_endpoint *ep = subs->data_endpoint;
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun dev_dbg(&subs->dev->dev, "Starting data EP @%p\n", ep);
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun ep->data_subs = subs;
291*4882a593Smuzhiyun err = snd_usb_endpoint_start(ep);
292*4882a593Smuzhiyun if (err < 0) {
293*4882a593Smuzhiyun clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags);
294*4882a593Smuzhiyun return err;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun }
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun if (subs->sync_endpoint &&
299*4882a593Smuzhiyun !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) {
300*4882a593Smuzhiyun struct snd_usb_endpoint *ep = subs->sync_endpoint;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun if (subs->data_endpoint->iface != subs->sync_endpoint->iface ||
303*4882a593Smuzhiyun subs->data_endpoint->altsetting != subs->sync_endpoint->altsetting) {
304*4882a593Smuzhiyun err = usb_set_interface(subs->dev,
305*4882a593Smuzhiyun subs->sync_endpoint->iface,
306*4882a593Smuzhiyun subs->sync_endpoint->altsetting);
307*4882a593Smuzhiyun if (err < 0) {
308*4882a593Smuzhiyun clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags);
309*4882a593Smuzhiyun dev_err(&subs->dev->dev,
310*4882a593Smuzhiyun "%d:%d: cannot set interface (%d)\n",
311*4882a593Smuzhiyun subs->sync_endpoint->iface,
312*4882a593Smuzhiyun subs->sync_endpoint->altsetting, err);
313*4882a593Smuzhiyun return -EIO;
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun dev_dbg(&subs->dev->dev, "Starting sync EP @%p\n", ep);
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun ep->sync_slave = subs->data_endpoint;
320*4882a593Smuzhiyun err = snd_usb_endpoint_start(ep);
321*4882a593Smuzhiyun if (err < 0) {
322*4882a593Smuzhiyun clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags);
323*4882a593Smuzhiyun return err;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun return 0;
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun
sync_pending_stops(struct snd_usb_substream * subs)330*4882a593Smuzhiyun static void sync_pending_stops(struct snd_usb_substream *subs)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint);
333*4882a593Smuzhiyun snd_usb_endpoint_sync_pending_stop(subs->data_endpoint);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
stop_endpoints(struct snd_usb_substream * subs)336*4882a593Smuzhiyun static void stop_endpoints(struct snd_usb_substream *subs)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun if (test_and_clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags))
339*4882a593Smuzhiyun snd_usb_endpoint_stop(subs->sync_endpoint);
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun if (test_and_clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags))
342*4882a593Smuzhiyun snd_usb_endpoint_stop(subs->data_endpoint);
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun /* PCM sync_stop callback */
snd_usb_pcm_sync_stop(struct snd_pcm_substream * substream)346*4882a593Smuzhiyun static int snd_usb_pcm_sync_stop(struct snd_pcm_substream *substream)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun struct snd_usb_substream *subs = substream->runtime->private_data;
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun sync_pending_stops(subs);
351*4882a593Smuzhiyun return 0;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun
search_roland_implicit_fb(struct usb_device * dev,int ifnum,unsigned int altsetting,struct usb_host_interface ** alts,unsigned int * ep)354*4882a593Smuzhiyun static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
355*4882a593Smuzhiyun unsigned int altsetting,
356*4882a593Smuzhiyun struct usb_host_interface **alts,
357*4882a593Smuzhiyun unsigned int *ep)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun struct usb_interface *iface;
360*4882a593Smuzhiyun struct usb_interface_descriptor *altsd;
361*4882a593Smuzhiyun struct usb_endpoint_descriptor *epd;
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun iface = usb_ifnum_to_if(dev, ifnum);
364*4882a593Smuzhiyun if (!iface || iface->num_altsetting < altsetting + 1)
365*4882a593Smuzhiyun return -ENOENT;
366*4882a593Smuzhiyun *alts = &iface->altsetting[altsetting];
367*4882a593Smuzhiyun altsd = get_iface_desc(*alts);
368*4882a593Smuzhiyun if (altsd->bAlternateSetting != altsetting ||
369*4882a593Smuzhiyun altsd->bInterfaceClass != USB_CLASS_VENDOR_SPEC ||
370*4882a593Smuzhiyun (altsd->bInterfaceSubClass != 2 &&
371*4882a593Smuzhiyun altsd->bInterfaceProtocol != 2 ) ||
372*4882a593Smuzhiyun altsd->bNumEndpoints < 1)
373*4882a593Smuzhiyun return -ENOENT;
374*4882a593Smuzhiyun epd = get_endpoint(*alts, 0);
375*4882a593Smuzhiyun if (!usb_endpoint_is_isoc_in(epd) ||
376*4882a593Smuzhiyun (epd->bmAttributes & USB_ENDPOINT_USAGE_MASK) !=
377*4882a593Smuzhiyun USB_ENDPOINT_USAGE_IMPLICIT_FB)
378*4882a593Smuzhiyun return -ENOENT;
379*4882a593Smuzhiyun *ep = epd->bEndpointAddress;
380*4882a593Smuzhiyun return 0;
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun /* Setup an implicit feedback endpoint from a quirk. Returns 0 if no quirk
384*4882a593Smuzhiyun * applies. Returns 1 if a quirk was found.
385*4882a593Smuzhiyun */
set_sync_ep_implicit_fb_quirk(struct snd_usb_substream * subs,struct usb_device * dev,struct usb_interface_descriptor * altsd,unsigned int attr)386*4882a593Smuzhiyun static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
387*4882a593Smuzhiyun struct usb_device *dev,
388*4882a593Smuzhiyun struct usb_interface_descriptor *altsd,
389*4882a593Smuzhiyun unsigned int attr)
390*4882a593Smuzhiyun {
391*4882a593Smuzhiyun struct usb_host_interface *alts;
392*4882a593Smuzhiyun struct usb_interface *iface;
393*4882a593Smuzhiyun unsigned int ep;
394*4882a593Smuzhiyun unsigned int ifnum;
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun /* Implicit feedback sync EPs consumers are always playback EPs */
397*4882a593Smuzhiyun if (subs->direction != SNDRV_PCM_STREAM_PLAYBACK)
398*4882a593Smuzhiyun return 0;
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun switch (subs->stream->chip->usb_id) {
401*4882a593Smuzhiyun case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
402*4882a593Smuzhiyun case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
403*4882a593Smuzhiyun case USB_ID(0x22f0, 0x0006): /* Allen&Heath Qu-16 */
404*4882a593Smuzhiyun ep = 0x81;
405*4882a593Smuzhiyun ifnum = 3;
406*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
407*4882a593Smuzhiyun case USB_ID(0x0763, 0x2080): /* M-Audio FastTrack Ultra */
408*4882a593Smuzhiyun case USB_ID(0x0763, 0x2081):
409*4882a593Smuzhiyun ep = 0x81;
410*4882a593Smuzhiyun ifnum = 2;
411*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
412*4882a593Smuzhiyun case USB_ID(0x2466, 0x8003): /* Fractal Audio Axe-Fx II */
413*4882a593Smuzhiyun case USB_ID(0x0499, 0x172a): /* Yamaha MODX */
414*4882a593Smuzhiyun ep = 0x86;
415*4882a593Smuzhiyun ifnum = 2;
416*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
417*4882a593Smuzhiyun case USB_ID(0x2466, 0x8010): /* Fractal Audio Axe-Fx III */
418*4882a593Smuzhiyun ep = 0x81;
419*4882a593Smuzhiyun ifnum = 2;
420*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
421*4882a593Smuzhiyun case USB_ID(0x1686, 0xf029): /* Zoom UAC-2 */
422*4882a593Smuzhiyun ep = 0x82;
423*4882a593Smuzhiyun ifnum = 2;
424*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
425*4882a593Smuzhiyun case USB_ID(0x1397, 0x0001): /* Behringer UFX1604 */
426*4882a593Smuzhiyun case USB_ID(0x1397, 0x0002): /* Behringer UFX1204 */
427*4882a593Smuzhiyun ep = 0x81;
428*4882a593Smuzhiyun ifnum = 1;
429*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
430*4882a593Smuzhiyun case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook II/IIc */
431*4882a593Smuzhiyun /* MicroBook IIc */
432*4882a593Smuzhiyun if (altsd->bInterfaceClass == USB_CLASS_AUDIO)
433*4882a593Smuzhiyun return 0;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun /* MicroBook II */
436*4882a593Smuzhiyun ep = 0x84;
437*4882a593Smuzhiyun ifnum = 0;
438*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
439*4882a593Smuzhiyun case USB_ID(0x07fd, 0x0008): /* MOTU M Series */
440*4882a593Smuzhiyun case USB_ID(0x31e9, 0x0001): /* Solid State Logic SSL2 */
441*4882a593Smuzhiyun case USB_ID(0x31e9, 0x0002): /* Solid State Logic SSL2+ */
442*4882a593Smuzhiyun case USB_ID(0x0499, 0x172f): /* Steinberg UR22C */
443*4882a593Smuzhiyun case USB_ID(0x0d9a, 0x00df): /* RTX6001 */
444*4882a593Smuzhiyun ep = 0x81;
445*4882a593Smuzhiyun ifnum = 2;
446*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
447*4882a593Smuzhiyun case USB_ID(0x2b73, 0x000a): /* Pioneer DJ DJM-900NXS2 */
448*4882a593Smuzhiyun case USB_ID(0x2b73, 0x0017): /* Pioneer DJ DJM-250MK2 */
449*4882a593Smuzhiyun ep = 0x82;
450*4882a593Smuzhiyun ifnum = 0;
451*4882a593Smuzhiyun goto add_sync_ep_from_ifnum;
452*4882a593Smuzhiyun case USB_ID(0x0582, 0x01d8): /* BOSS Katana */
453*4882a593Smuzhiyun /* BOSS Katana amplifiers do not need quirks */
454*4882a593Smuzhiyun return 0;
455*4882a593Smuzhiyun }
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun if (attr == USB_ENDPOINT_SYNC_ASYNC &&
458*4882a593Smuzhiyun altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
459*4882a593Smuzhiyun altsd->bInterfaceProtocol == 2 &&
460*4882a593Smuzhiyun altsd->bNumEndpoints == 1 &&
461*4882a593Smuzhiyun USB_ID_VENDOR(subs->stream->chip->usb_id) == 0x0582 /* Roland */ &&
462*4882a593Smuzhiyun search_roland_implicit_fb(dev, altsd->bInterfaceNumber + 1,
463*4882a593Smuzhiyun altsd->bAlternateSetting,
464*4882a593Smuzhiyun &alts, &ep) >= 0) {
465*4882a593Smuzhiyun goto add_sync_ep;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun /* No quirk */
469*4882a593Smuzhiyun return 0;
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun add_sync_ep_from_ifnum:
472*4882a593Smuzhiyun iface = usb_ifnum_to_if(dev, ifnum);
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun if (!iface || iface->num_altsetting < 2)
475*4882a593Smuzhiyun return -EINVAL;
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun alts = &iface->altsetting[1];
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun add_sync_ep:
480*4882a593Smuzhiyun subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip,
481*4882a593Smuzhiyun alts, ep, !subs->direction,
482*4882a593Smuzhiyun SND_USB_ENDPOINT_TYPE_DATA);
483*4882a593Smuzhiyun if (!subs->sync_endpoint)
484*4882a593Smuzhiyun return -EINVAL;
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun subs->sync_endpoint->is_implicit_feedback = 1;
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun subs->data_endpoint->sync_master = subs->sync_endpoint;
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun return 1;
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun
set_sync_endpoint(struct snd_usb_substream * subs,struct audioformat * fmt,struct usb_device * dev,struct usb_host_interface * alts,struct usb_interface_descriptor * altsd)493*4882a593Smuzhiyun static int set_sync_endpoint(struct snd_usb_substream *subs,
494*4882a593Smuzhiyun struct audioformat *fmt,
495*4882a593Smuzhiyun struct usb_device *dev,
496*4882a593Smuzhiyun struct usb_host_interface *alts,
497*4882a593Smuzhiyun struct usb_interface_descriptor *altsd)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
500*4882a593Smuzhiyun unsigned int ep, attr;
501*4882a593Smuzhiyun bool implicit_fb;
502*4882a593Smuzhiyun int err;
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun /* we need a sync pipe in async OUT or adaptive IN mode */
505*4882a593Smuzhiyun /* check the number of EP, since some devices have broken
506*4882a593Smuzhiyun * descriptors which fool us. if it has only one EP,
507*4882a593Smuzhiyun * assume it as adaptive-out or sync-in.
508*4882a593Smuzhiyun */
509*4882a593Smuzhiyun attr = fmt->ep_attr & USB_ENDPOINT_SYNCTYPE;
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun if ((is_playback && (attr != USB_ENDPOINT_SYNC_ASYNC)) ||
512*4882a593Smuzhiyun (!is_playback && (attr != USB_ENDPOINT_SYNC_ADAPTIVE))) {
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun /*
515*4882a593Smuzhiyun * In these modes the notion of sync_endpoint is irrelevant.
516*4882a593Smuzhiyun * Reset pointers to avoid using stale data from previously
517*4882a593Smuzhiyun * used settings, e.g. when configuration and endpoints were
518*4882a593Smuzhiyun * changed
519*4882a593Smuzhiyun */
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun subs->sync_endpoint = NULL;
522*4882a593Smuzhiyun subs->data_endpoint->sync_master = NULL;
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun err = set_sync_ep_implicit_fb_quirk(subs, dev, altsd, attr);
526*4882a593Smuzhiyun if (err < 0)
527*4882a593Smuzhiyun return err;
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun /* endpoint set by quirk */
530*4882a593Smuzhiyun if (err > 0)
531*4882a593Smuzhiyun return 0;
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun if (altsd->bNumEndpoints < 2)
534*4882a593Smuzhiyun return 0;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun if ((is_playback && (attr == USB_ENDPOINT_SYNC_SYNC ||
537*4882a593Smuzhiyun attr == USB_ENDPOINT_SYNC_ADAPTIVE)) ||
538*4882a593Smuzhiyun (!is_playback && attr != USB_ENDPOINT_SYNC_ADAPTIVE))
539*4882a593Smuzhiyun return 0;
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun /*
542*4882a593Smuzhiyun * In case of illegal SYNC_NONE for OUT endpoint, we keep going to see
543*4882a593Smuzhiyun * if we don't find a sync endpoint, as on M-Audio Transit. In case of
544*4882a593Smuzhiyun * error fall back to SYNC mode and don't create sync endpoint
545*4882a593Smuzhiyun */
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun /* check sync-pipe endpoint */
548*4882a593Smuzhiyun /* ... and check descriptor size before accessing bSynchAddress
549*4882a593Smuzhiyun because there is a version of the SB Audigy 2 NX firmware lacking
550*4882a593Smuzhiyun the audio fields in the endpoint descriptors */
551*4882a593Smuzhiyun if ((get_endpoint(alts, 1)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_ISOC ||
552*4882a593Smuzhiyun (get_endpoint(alts, 1)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
553*4882a593Smuzhiyun get_endpoint(alts, 1)->bSynchAddress != 0)) {
554*4882a593Smuzhiyun dev_err(&dev->dev,
555*4882a593Smuzhiyun "%d:%d : invalid sync pipe. bmAttributes %02x, bLength %d, bSynchAddress %02x\n",
556*4882a593Smuzhiyun fmt->iface, fmt->altsetting,
557*4882a593Smuzhiyun get_endpoint(alts, 1)->bmAttributes,
558*4882a593Smuzhiyun get_endpoint(alts, 1)->bLength,
559*4882a593Smuzhiyun get_endpoint(alts, 1)->bSynchAddress);
560*4882a593Smuzhiyun if (is_playback && attr == USB_ENDPOINT_SYNC_NONE)
561*4882a593Smuzhiyun return 0;
562*4882a593Smuzhiyun return -EINVAL;
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun ep = get_endpoint(alts, 1)->bEndpointAddress;
565*4882a593Smuzhiyun if (get_endpoint(alts, 0)->bLength >= USB_DT_ENDPOINT_AUDIO_SIZE &&
566*4882a593Smuzhiyun get_endpoint(alts, 0)->bSynchAddress != 0 &&
567*4882a593Smuzhiyun ((is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress | USB_DIR_IN)) ||
568*4882a593Smuzhiyun (!is_playback && ep != (unsigned int)(get_endpoint(alts, 0)->bSynchAddress & ~USB_DIR_IN)))) {
569*4882a593Smuzhiyun dev_err(&dev->dev,
570*4882a593Smuzhiyun "%d:%d : invalid sync pipe. is_playback %d, ep %02x, bSynchAddress %02x\n",
571*4882a593Smuzhiyun fmt->iface, fmt->altsetting,
572*4882a593Smuzhiyun is_playback, ep, get_endpoint(alts, 0)->bSynchAddress);
573*4882a593Smuzhiyun if (is_playback && attr == USB_ENDPOINT_SYNC_NONE)
574*4882a593Smuzhiyun return 0;
575*4882a593Smuzhiyun return -EINVAL;
576*4882a593Smuzhiyun }
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun implicit_fb = (get_endpoint(alts, 1)->bmAttributes & USB_ENDPOINT_USAGE_MASK)
579*4882a593Smuzhiyun == USB_ENDPOINT_USAGE_IMPLICIT_FB;
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip,
582*4882a593Smuzhiyun alts, ep, !subs->direction,
583*4882a593Smuzhiyun implicit_fb ?
584*4882a593Smuzhiyun SND_USB_ENDPOINT_TYPE_DATA :
585*4882a593Smuzhiyun SND_USB_ENDPOINT_TYPE_SYNC);
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun if (!subs->sync_endpoint) {
588*4882a593Smuzhiyun if (is_playback && attr == USB_ENDPOINT_SYNC_NONE)
589*4882a593Smuzhiyun return 0;
590*4882a593Smuzhiyun return -EINVAL;
591*4882a593Smuzhiyun }
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun subs->sync_endpoint->is_implicit_feedback = implicit_fb;
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun subs->data_endpoint->sync_master = subs->sync_endpoint;
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun return 0;
598*4882a593Smuzhiyun }
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun /*
601*4882a593Smuzhiyun * find a matching format and set up the interface
602*4882a593Smuzhiyun */
set_format(struct snd_usb_substream * subs,struct audioformat * fmt)603*4882a593Smuzhiyun static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
604*4882a593Smuzhiyun {
605*4882a593Smuzhiyun struct usb_device *dev = subs->dev;
606*4882a593Smuzhiyun struct usb_host_interface *alts;
607*4882a593Smuzhiyun struct usb_interface_descriptor *altsd;
608*4882a593Smuzhiyun struct usb_interface *iface;
609*4882a593Smuzhiyun int err;
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun iface = usb_ifnum_to_if(dev, fmt->iface);
612*4882a593Smuzhiyun if (WARN_ON(!iface))
613*4882a593Smuzhiyun return -EINVAL;
614*4882a593Smuzhiyun alts = usb_altnum_to_altsetting(iface, fmt->altsetting);
615*4882a593Smuzhiyun if (WARN_ON(!alts))
616*4882a593Smuzhiyun return -EINVAL;
617*4882a593Smuzhiyun altsd = get_iface_desc(alts);
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun if (fmt == subs->cur_audiofmt && !subs->need_setup_fmt)
620*4882a593Smuzhiyun return 0;
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun /* close the old interface */
623*4882a593Smuzhiyun if (subs->interface >= 0 && (subs->interface != fmt->iface || subs->need_setup_fmt)) {
624*4882a593Smuzhiyun if (!subs->stream->chip->keep_iface) {
625*4882a593Smuzhiyun err = usb_set_interface(subs->dev, subs->interface, 0);
626*4882a593Smuzhiyun if (err < 0) {
627*4882a593Smuzhiyun dev_err(&dev->dev,
628*4882a593Smuzhiyun "%d:%d: return to setting 0 failed (%d)\n",
629*4882a593Smuzhiyun fmt->iface, fmt->altsetting, err);
630*4882a593Smuzhiyun return -EIO;
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun }
633*4882a593Smuzhiyun subs->interface = -1;
634*4882a593Smuzhiyun subs->altset_idx = 0;
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun if (subs->need_setup_fmt)
638*4882a593Smuzhiyun subs->need_setup_fmt = false;
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun /* set interface */
641*4882a593Smuzhiyun if (iface->cur_altsetting != alts) {
642*4882a593Smuzhiyun err = snd_usb_select_mode_quirk(subs, fmt);
643*4882a593Smuzhiyun if (err < 0)
644*4882a593Smuzhiyun return -EIO;
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun err = usb_set_interface(dev, fmt->iface, fmt->altsetting);
647*4882a593Smuzhiyun if (err < 0) {
648*4882a593Smuzhiyun dev_err(&dev->dev,
649*4882a593Smuzhiyun "%d:%d: usb_set_interface failed (%d)\n",
650*4882a593Smuzhiyun fmt->iface, fmt->altsetting, err);
651*4882a593Smuzhiyun return -EIO;
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun dev_dbg(&dev->dev, "setting usb interface %d:%d\n",
654*4882a593Smuzhiyun fmt->iface, fmt->altsetting);
655*4882a593Smuzhiyun err = snd_vendor_set_pcm_intf(iface, fmt->iface,
656*4882a593Smuzhiyun fmt->altsetting, subs->direction);
657*4882a593Smuzhiyun if (err)
658*4882a593Smuzhiyun return err;
659*4882a593Smuzhiyun snd_usb_set_interface_quirk(dev);
660*4882a593Smuzhiyun }
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun subs->interface = fmt->iface;
663*4882a593Smuzhiyun subs->altset_idx = fmt->altset_idx;
664*4882a593Smuzhiyun subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip,
665*4882a593Smuzhiyun alts, fmt->endpoint, subs->direction,
666*4882a593Smuzhiyun SND_USB_ENDPOINT_TYPE_DATA);
667*4882a593Smuzhiyun
668*4882a593Smuzhiyun if (!subs->data_endpoint)
669*4882a593Smuzhiyun return -EINVAL;
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun err = set_sync_endpoint(subs, fmt, dev, alts, altsd);
672*4882a593Smuzhiyun if (err < 0)
673*4882a593Smuzhiyun return err;
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt);
676*4882a593Smuzhiyun if (err < 0)
677*4882a593Smuzhiyun return err;
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun subs->cur_audiofmt = fmt;
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun snd_usb_set_format_quirk(subs, fmt);
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun return 0;
684*4882a593Smuzhiyun }
685*4882a593Smuzhiyun
686*4882a593Smuzhiyun static int snd_usb_pcm_change_state(struct snd_usb_substream *subs, int state);
687*4882a593Smuzhiyun
snd_usb_enable_audio_stream(struct snd_usb_substream * subs,int datainterval,bool enable)688*4882a593Smuzhiyun int snd_usb_enable_audio_stream(struct snd_usb_substream *subs,
689*4882a593Smuzhiyun int datainterval, bool enable)
690*4882a593Smuzhiyun {
691*4882a593Smuzhiyun struct audioformat *fmt;
692*4882a593Smuzhiyun struct usb_host_interface *alts;
693*4882a593Smuzhiyun struct usb_interface *iface;
694*4882a593Smuzhiyun int ret;
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun if (!enable) {
697*4882a593Smuzhiyun if (subs->interface >= 0) {
698*4882a593Smuzhiyun usb_set_interface(subs->dev, subs->interface, 0);
699*4882a593Smuzhiyun subs->altset_idx = 0;
700*4882a593Smuzhiyun subs->interface = -1;
701*4882a593Smuzhiyun subs->cur_audiofmt = NULL;
702*4882a593Smuzhiyun }
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun snd_usb_autosuspend(subs->stream->chip);
705*4882a593Smuzhiyun return 0;
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun snd_usb_autoresume(subs->stream->chip);
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0);
711*4882a593Smuzhiyun if (ret < 0)
712*4882a593Smuzhiyun return ret;
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun if (datainterval != -EINVAL)
715*4882a593Smuzhiyun fmt = find_format_and_si(subs, datainterval);
716*4882a593Smuzhiyun else
717*4882a593Smuzhiyun fmt = find_format(subs);
718*4882a593Smuzhiyun if (!fmt) {
719*4882a593Smuzhiyun dev_err(&subs->dev->dev,
720*4882a593Smuzhiyun "cannot set format: format = %#x, rate = %d, channels = %d\n",
721*4882a593Smuzhiyun subs->pcm_format, subs->cur_rate, subs->channels);
722*4882a593Smuzhiyun return -EINVAL;
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun subs->altset_idx = 0;
726*4882a593Smuzhiyun subs->interface = -1;
727*4882a593Smuzhiyun if (atomic_read(&subs->stream->chip->shutdown)) {
728*4882a593Smuzhiyun ret = -ENODEV;
729*4882a593Smuzhiyun } else {
730*4882a593Smuzhiyun ret = set_format(subs, fmt);
731*4882a593Smuzhiyun if (ret < 0)
732*4882a593Smuzhiyun return ret;
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface);
735*4882a593Smuzhiyun if (!iface) {
736*4882a593Smuzhiyun dev_err(&subs->dev->dev, "Could not get iface %d\n",
737*4882a593Smuzhiyun subs->cur_audiofmt->iface);
738*4882a593Smuzhiyun return -ENODEV;
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun alts = &iface->altsetting[subs->cur_audiofmt->altset_idx];
742*4882a593Smuzhiyun ret = snd_usb_init_sample_rate(subs->stream->chip,
743*4882a593Smuzhiyun subs->cur_audiofmt->iface,
744*4882a593Smuzhiyun alts,
745*4882a593Smuzhiyun subs->cur_audiofmt,
746*4882a593Smuzhiyun subs->cur_rate);
747*4882a593Smuzhiyun if (ret < 0) {
748*4882a593Smuzhiyun dev_err(&subs->dev->dev, "failed to set rate %d\n",
749*4882a593Smuzhiyun subs->cur_rate);
750*4882a593Smuzhiyun return ret;
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun }
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun subs->interface = fmt->iface;
755*4882a593Smuzhiyun subs->altset_idx = fmt->altset_idx;
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun return 0;
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(snd_usb_enable_audio_stream);
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun /*
762*4882a593Smuzhiyun * Return the score of matching two audioformats.
763*4882a593Smuzhiyun * Veto the audioformat if:
764*4882a593Smuzhiyun * - It has no channels for some reason.
765*4882a593Smuzhiyun * - Requested PCM format is not supported.
766*4882a593Smuzhiyun * - Requested sample rate is not supported.
767*4882a593Smuzhiyun */
match_endpoint_audioformats(struct snd_usb_substream * subs,struct audioformat * fp,struct audioformat * match,int rate,snd_pcm_format_t pcm_format)768*4882a593Smuzhiyun static int match_endpoint_audioformats(struct snd_usb_substream *subs,
769*4882a593Smuzhiyun struct audioformat *fp,
770*4882a593Smuzhiyun struct audioformat *match, int rate,
771*4882a593Smuzhiyun snd_pcm_format_t pcm_format)
772*4882a593Smuzhiyun {
773*4882a593Smuzhiyun int i;
774*4882a593Smuzhiyun int score = 0;
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun if (fp->channels < 1) {
777*4882a593Smuzhiyun dev_dbg(&subs->dev->dev,
778*4882a593Smuzhiyun "%s: (fmt @%p) no channels\n", __func__, fp);
779*4882a593Smuzhiyun return 0;
780*4882a593Smuzhiyun }
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun if (!(fp->formats & pcm_format_to_bits(pcm_format))) {
783*4882a593Smuzhiyun dev_dbg(&subs->dev->dev,
784*4882a593Smuzhiyun "%s: (fmt @%p) no match for format %d\n", __func__,
785*4882a593Smuzhiyun fp, pcm_format);
786*4882a593Smuzhiyun return 0;
787*4882a593Smuzhiyun }
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun for (i = 0; i < fp->nr_rates; i++) {
790*4882a593Smuzhiyun if (fp->rate_table[i] == rate) {
791*4882a593Smuzhiyun score++;
792*4882a593Smuzhiyun break;
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun }
795*4882a593Smuzhiyun if (!score) {
796*4882a593Smuzhiyun dev_dbg(&subs->dev->dev,
797*4882a593Smuzhiyun "%s: (fmt @%p) no match for rate %d\n", __func__,
798*4882a593Smuzhiyun fp, rate);
799*4882a593Smuzhiyun return 0;
800*4882a593Smuzhiyun }
801*4882a593Smuzhiyun
802*4882a593Smuzhiyun if (fp->channels == match->channels)
803*4882a593Smuzhiyun score++;
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun dev_dbg(&subs->dev->dev,
806*4882a593Smuzhiyun "%s: (fmt @%p) score %d\n", __func__, fp, score);
807*4882a593Smuzhiyun
808*4882a593Smuzhiyun return score;
809*4882a593Smuzhiyun }
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun /*
812*4882a593Smuzhiyun * Configure the sync ep using the rate and pcm format of the data ep.
813*4882a593Smuzhiyun */
configure_sync_endpoint(struct snd_usb_substream * subs)814*4882a593Smuzhiyun static int configure_sync_endpoint(struct snd_usb_substream *subs)
815*4882a593Smuzhiyun {
816*4882a593Smuzhiyun int ret;
817*4882a593Smuzhiyun struct audioformat *fp;
818*4882a593Smuzhiyun struct audioformat *sync_fp = NULL;
819*4882a593Smuzhiyun int cur_score = 0;
820*4882a593Smuzhiyun int sync_period_bytes = subs->period_bytes;
821*4882a593Smuzhiyun struct snd_usb_substream *sync_subs =
822*4882a593Smuzhiyun &subs->stream->substream[subs->direction ^ 1];
823*4882a593Smuzhiyun
824*4882a593Smuzhiyun if (subs->sync_endpoint->type != SND_USB_ENDPOINT_TYPE_DATA ||
825*4882a593Smuzhiyun !subs->stream)
826*4882a593Smuzhiyun return snd_usb_endpoint_set_params(subs->sync_endpoint,
827*4882a593Smuzhiyun subs->pcm_format,
828*4882a593Smuzhiyun subs->channels,
829*4882a593Smuzhiyun subs->period_bytes,
830*4882a593Smuzhiyun 0, 0,
831*4882a593Smuzhiyun subs->cur_rate,
832*4882a593Smuzhiyun subs->cur_audiofmt,
833*4882a593Smuzhiyun NULL);
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun /* Try to find the best matching audioformat. */
836*4882a593Smuzhiyun list_for_each_entry(fp, &sync_subs->fmt_list, list) {
837*4882a593Smuzhiyun int score = match_endpoint_audioformats(subs,
838*4882a593Smuzhiyun fp, subs->cur_audiofmt,
839*4882a593Smuzhiyun subs->cur_rate, subs->pcm_format);
840*4882a593Smuzhiyun
841*4882a593Smuzhiyun if (score > cur_score) {
842*4882a593Smuzhiyun sync_fp = fp;
843*4882a593Smuzhiyun cur_score = score;
844*4882a593Smuzhiyun }
845*4882a593Smuzhiyun }
846*4882a593Smuzhiyun
847*4882a593Smuzhiyun if (unlikely(sync_fp == NULL)) {
848*4882a593Smuzhiyun dev_err(&subs->dev->dev,
849*4882a593Smuzhiyun "%s: no valid audioformat for sync ep %x found\n",
850*4882a593Smuzhiyun __func__, sync_subs->ep_num);
851*4882a593Smuzhiyun return -EINVAL;
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun
854*4882a593Smuzhiyun /*
855*4882a593Smuzhiyun * Recalculate the period bytes if channel number differ between
856*4882a593Smuzhiyun * data and sync ep audioformat.
857*4882a593Smuzhiyun */
858*4882a593Smuzhiyun if (sync_fp->channels != subs->channels) {
859*4882a593Smuzhiyun sync_period_bytes = (subs->period_bytes / subs->channels) *
860*4882a593Smuzhiyun sync_fp->channels;
861*4882a593Smuzhiyun dev_dbg(&subs->dev->dev,
862*4882a593Smuzhiyun "%s: adjusted sync ep period bytes (%d -> %d)\n",
863*4882a593Smuzhiyun __func__, subs->period_bytes, sync_period_bytes);
864*4882a593Smuzhiyun }
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun ret = snd_usb_endpoint_set_params(subs->sync_endpoint,
867*4882a593Smuzhiyun subs->pcm_format,
868*4882a593Smuzhiyun sync_fp->channels,
869*4882a593Smuzhiyun sync_period_bytes,
870*4882a593Smuzhiyun 0, 0,
871*4882a593Smuzhiyun subs->cur_rate,
872*4882a593Smuzhiyun sync_fp,
873*4882a593Smuzhiyun NULL);
874*4882a593Smuzhiyun
875*4882a593Smuzhiyun return ret;
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun /*
879*4882a593Smuzhiyun * configure endpoint params
880*4882a593Smuzhiyun *
881*4882a593Smuzhiyun * called during initial setup and upon resume
882*4882a593Smuzhiyun */
configure_endpoint(struct snd_usb_substream * subs)883*4882a593Smuzhiyun static int configure_endpoint(struct snd_usb_substream *subs)
884*4882a593Smuzhiyun {
885*4882a593Smuzhiyun int ret;
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun /* format changed */
888*4882a593Smuzhiyun stop_endpoints(subs);
889*4882a593Smuzhiyun sync_pending_stops(subs);
890*4882a593Smuzhiyun ret = snd_usb_endpoint_set_params(subs->data_endpoint,
891*4882a593Smuzhiyun subs->pcm_format,
892*4882a593Smuzhiyun subs->channels,
893*4882a593Smuzhiyun subs->period_bytes,
894*4882a593Smuzhiyun subs->period_frames,
895*4882a593Smuzhiyun subs->buffer_periods,
896*4882a593Smuzhiyun subs->cur_rate,
897*4882a593Smuzhiyun subs->cur_audiofmt,
898*4882a593Smuzhiyun subs->sync_endpoint);
899*4882a593Smuzhiyun if (ret < 0)
900*4882a593Smuzhiyun return ret;
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun if (subs->sync_endpoint)
903*4882a593Smuzhiyun ret = configure_sync_endpoint(subs);
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun return ret;
906*4882a593Smuzhiyun }
907*4882a593Smuzhiyun
snd_usb_pcm_change_state(struct snd_usb_substream * subs,int state)908*4882a593Smuzhiyun static int snd_usb_pcm_change_state(struct snd_usb_substream *subs, int state)
909*4882a593Smuzhiyun {
910*4882a593Smuzhiyun int ret;
911*4882a593Smuzhiyun
912*4882a593Smuzhiyun if (!subs->str_pd)
913*4882a593Smuzhiyun return 0;
914*4882a593Smuzhiyun
915*4882a593Smuzhiyun ret = snd_usb_power_domain_set(subs->stream->chip, subs->str_pd, state);
916*4882a593Smuzhiyun if (ret < 0) {
917*4882a593Smuzhiyun dev_err(&subs->dev->dev,
918*4882a593Smuzhiyun "Cannot change Power Domain ID: %d to state: %d. Err: %d\n",
919*4882a593Smuzhiyun subs->str_pd->pd_id, state, ret);
920*4882a593Smuzhiyun return ret;
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun return 0;
924*4882a593Smuzhiyun }
925*4882a593Smuzhiyun
snd_usb_pcm_suspend(struct snd_usb_stream * as)926*4882a593Smuzhiyun int snd_usb_pcm_suspend(struct snd_usb_stream *as)
927*4882a593Smuzhiyun {
928*4882a593Smuzhiyun int ret;
929*4882a593Smuzhiyun
930*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(&as->substream[0], UAC3_PD_STATE_D2);
931*4882a593Smuzhiyun if (ret < 0)
932*4882a593Smuzhiyun return ret;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(&as->substream[1], UAC3_PD_STATE_D2);
935*4882a593Smuzhiyun if (ret < 0)
936*4882a593Smuzhiyun return ret;
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun return 0;
939*4882a593Smuzhiyun }
940*4882a593Smuzhiyun
snd_usb_pcm_resume(struct snd_usb_stream * as)941*4882a593Smuzhiyun int snd_usb_pcm_resume(struct snd_usb_stream *as)
942*4882a593Smuzhiyun {
943*4882a593Smuzhiyun int ret;
944*4882a593Smuzhiyun
945*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(&as->substream[0], UAC3_PD_STATE_D1);
946*4882a593Smuzhiyun if (ret < 0)
947*4882a593Smuzhiyun return ret;
948*4882a593Smuzhiyun
949*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(&as->substream[1], UAC3_PD_STATE_D1);
950*4882a593Smuzhiyun if (ret < 0)
951*4882a593Smuzhiyun return ret;
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun return 0;
954*4882a593Smuzhiyun }
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun /*
957*4882a593Smuzhiyun * hw_params callback
958*4882a593Smuzhiyun *
959*4882a593Smuzhiyun * allocate a buffer and set the given audio format.
960*4882a593Smuzhiyun *
961*4882a593Smuzhiyun * so far we use a physically linear buffer although packetize transfer
962*4882a593Smuzhiyun * doesn't need a continuous area.
963*4882a593Smuzhiyun * if sg buffer is supported on the later version of alsa, we'll follow
964*4882a593Smuzhiyun * that.
965*4882a593Smuzhiyun */
snd_usb_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * hw_params)966*4882a593Smuzhiyun static int snd_usb_hw_params(struct snd_pcm_substream *substream,
967*4882a593Smuzhiyun struct snd_pcm_hw_params *hw_params)
968*4882a593Smuzhiyun {
969*4882a593Smuzhiyun struct snd_usb_substream *subs = substream->runtime->private_data;
970*4882a593Smuzhiyun struct audioformat *fmt;
971*4882a593Smuzhiyun int ret;
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun ret = snd_media_start_pipeline(subs);
974*4882a593Smuzhiyun if (ret)
975*4882a593Smuzhiyun return ret;
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun subs->pcm_format = params_format(hw_params);
978*4882a593Smuzhiyun subs->period_bytes = params_period_bytes(hw_params);
979*4882a593Smuzhiyun subs->period_frames = params_period_size(hw_params);
980*4882a593Smuzhiyun subs->buffer_periods = params_periods(hw_params);
981*4882a593Smuzhiyun subs->channels = params_channels(hw_params);
982*4882a593Smuzhiyun subs->cur_rate = params_rate(hw_params);
983*4882a593Smuzhiyun
984*4882a593Smuzhiyun fmt = find_format(subs);
985*4882a593Smuzhiyun if (!fmt) {
986*4882a593Smuzhiyun dev_dbg(&subs->dev->dev,
987*4882a593Smuzhiyun "cannot set format: format = %#x, rate = %d, channels = %d\n",
988*4882a593Smuzhiyun subs->pcm_format, subs->cur_rate, subs->channels);
989*4882a593Smuzhiyun ret = -EINVAL;
990*4882a593Smuzhiyun goto stop_pipeline;
991*4882a593Smuzhiyun }
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun ret = snd_usb_lock_shutdown(subs->stream->chip);
994*4882a593Smuzhiyun if (ret < 0)
995*4882a593Smuzhiyun goto stop_pipeline;
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0);
998*4882a593Smuzhiyun if (ret < 0)
999*4882a593Smuzhiyun goto unlock;
1000*4882a593Smuzhiyun
1001*4882a593Smuzhiyun ret = set_format(subs, fmt);
1002*4882a593Smuzhiyun if (ret < 0)
1003*4882a593Smuzhiyun goto unlock;
1004*4882a593Smuzhiyun
1005*4882a593Smuzhiyun subs->interface = fmt->iface;
1006*4882a593Smuzhiyun subs->altset_idx = fmt->altset_idx;
1007*4882a593Smuzhiyun subs->need_setup_ep = true;
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun unlock:
1010*4882a593Smuzhiyun snd_usb_unlock_shutdown(subs->stream->chip);
1011*4882a593Smuzhiyun if (ret < 0)
1012*4882a593Smuzhiyun goto stop_pipeline;
1013*4882a593Smuzhiyun return ret;
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun stop_pipeline:
1016*4882a593Smuzhiyun snd_media_stop_pipeline(subs);
1017*4882a593Smuzhiyun return ret;
1018*4882a593Smuzhiyun }
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun /*
1021*4882a593Smuzhiyun * hw_free callback
1022*4882a593Smuzhiyun *
1023*4882a593Smuzhiyun * reset the audio format and release the buffer
1024*4882a593Smuzhiyun */
snd_usb_hw_free(struct snd_pcm_substream * substream)1025*4882a593Smuzhiyun static int snd_usb_hw_free(struct snd_pcm_substream *substream)
1026*4882a593Smuzhiyun {
1027*4882a593Smuzhiyun struct snd_usb_substream *subs = substream->runtime->private_data;
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun snd_media_stop_pipeline(subs);
1030*4882a593Smuzhiyun subs->cur_audiofmt = NULL;
1031*4882a593Smuzhiyun subs->cur_rate = 0;
1032*4882a593Smuzhiyun subs->period_bytes = 0;
1033*4882a593Smuzhiyun if (!snd_usb_lock_shutdown(subs->stream->chip)) {
1034*4882a593Smuzhiyun stop_endpoints(subs);
1035*4882a593Smuzhiyun sync_pending_stops(subs);
1036*4882a593Smuzhiyun snd_usb_endpoint_deactivate(subs->sync_endpoint);
1037*4882a593Smuzhiyun snd_usb_endpoint_deactivate(subs->data_endpoint);
1038*4882a593Smuzhiyun snd_usb_unlock_shutdown(subs->stream->chip);
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun return 0;
1042*4882a593Smuzhiyun }
1043*4882a593Smuzhiyun
1044*4882a593Smuzhiyun /*
1045*4882a593Smuzhiyun * prepare callback
1046*4882a593Smuzhiyun *
1047*4882a593Smuzhiyun * only a few subtle things...
1048*4882a593Smuzhiyun */
snd_usb_pcm_prepare(struct snd_pcm_substream * substream)1049*4882a593Smuzhiyun static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
1050*4882a593Smuzhiyun {
1051*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
1052*4882a593Smuzhiyun struct snd_usb_substream *subs = runtime->private_data;
1053*4882a593Smuzhiyun struct usb_host_interface *alts;
1054*4882a593Smuzhiyun struct usb_interface *iface;
1055*4882a593Smuzhiyun int ret;
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun ret = snd_vendor_set_pcm_buf(subs->dev, subs->cur_audiofmt->iface);
1058*4882a593Smuzhiyun if (ret)
1059*4882a593Smuzhiyun return ret;
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun if (! subs->cur_audiofmt) {
1062*4882a593Smuzhiyun dev_err(&subs->dev->dev, "no format is specified!\n");
1063*4882a593Smuzhiyun return -ENXIO;
1064*4882a593Smuzhiyun }
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun ret = snd_usb_lock_shutdown(subs->stream->chip);
1067*4882a593Smuzhiyun if (ret < 0)
1068*4882a593Smuzhiyun return ret;
1069*4882a593Smuzhiyun if (snd_BUG_ON(!subs->data_endpoint)) {
1070*4882a593Smuzhiyun ret = -EIO;
1071*4882a593Smuzhiyun goto unlock;
1072*4882a593Smuzhiyun }
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D0);
1075*4882a593Smuzhiyun if (ret < 0)
1076*4882a593Smuzhiyun goto unlock;
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun ret = set_format(subs, subs->cur_audiofmt);
1079*4882a593Smuzhiyun if (ret < 0)
1080*4882a593Smuzhiyun goto unlock;
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun if (subs->need_setup_ep) {
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface);
1085*4882a593Smuzhiyun alts = &iface->altsetting[subs->cur_audiofmt->altset_idx];
1086*4882a593Smuzhiyun ret = snd_usb_init_sample_rate(subs->stream->chip,
1087*4882a593Smuzhiyun subs->cur_audiofmt->iface,
1088*4882a593Smuzhiyun alts,
1089*4882a593Smuzhiyun subs->cur_audiofmt,
1090*4882a593Smuzhiyun subs->cur_rate);
1091*4882a593Smuzhiyun if (ret < 0)
1092*4882a593Smuzhiyun goto unlock;
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun if (snd_vendor_get_ops()) {
1095*4882a593Smuzhiyun ret = snd_vendor_set_rate(iface,
1096*4882a593Smuzhiyun subs->cur_audiofmt->iface,
1097*4882a593Smuzhiyun subs->cur_rate,
1098*4882a593Smuzhiyun subs->cur_audiofmt->altsetting);
1099*4882a593Smuzhiyun if (!ret) {
1100*4882a593Smuzhiyun subs->need_setup_ep = false;
1101*4882a593Smuzhiyun goto unlock;
1102*4882a593Smuzhiyun }
1103*4882a593Smuzhiyun }
1104*4882a593Smuzhiyun
1105*4882a593Smuzhiyun ret = configure_endpoint(subs);
1106*4882a593Smuzhiyun if (ret < 0)
1107*4882a593Smuzhiyun goto unlock;
1108*4882a593Smuzhiyun subs->need_setup_ep = false;
1109*4882a593Smuzhiyun }
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun /* some unit conversions in runtime */
1112*4882a593Smuzhiyun subs->data_endpoint->maxframesize =
1113*4882a593Smuzhiyun bytes_to_frames(runtime, subs->data_endpoint->maxpacksize);
1114*4882a593Smuzhiyun subs->data_endpoint->curframesize =
1115*4882a593Smuzhiyun bytes_to_frames(runtime, subs->data_endpoint->curpacksize);
1116*4882a593Smuzhiyun
1117*4882a593Smuzhiyun /* reset the pointer */
1118*4882a593Smuzhiyun subs->hwptr_done = 0;
1119*4882a593Smuzhiyun subs->transfer_done = 0;
1120*4882a593Smuzhiyun subs->last_delay = 0;
1121*4882a593Smuzhiyun subs->last_frame_number = 0;
1122*4882a593Smuzhiyun runtime->delay = 0;
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun /* for playback, submit the URBs now; otherwise, the first hwptr_done
1125*4882a593Smuzhiyun * updates for all URBs would happen at the same time when starting */
1126*4882a593Smuzhiyun if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK)
1127*4882a593Smuzhiyun ret = start_endpoints(subs);
1128*4882a593Smuzhiyun
1129*4882a593Smuzhiyun unlock:
1130*4882a593Smuzhiyun snd_usb_unlock_shutdown(subs->stream->chip);
1131*4882a593Smuzhiyun return ret;
1132*4882a593Smuzhiyun }
1133*4882a593Smuzhiyun
1134*4882a593Smuzhiyun static const struct snd_pcm_hardware snd_usb_hardware =
1135*4882a593Smuzhiyun {
1136*4882a593Smuzhiyun .info = SNDRV_PCM_INFO_MMAP |
1137*4882a593Smuzhiyun SNDRV_PCM_INFO_MMAP_VALID |
1138*4882a593Smuzhiyun SNDRV_PCM_INFO_BATCH |
1139*4882a593Smuzhiyun SNDRV_PCM_INFO_INTERLEAVED |
1140*4882a593Smuzhiyun SNDRV_PCM_INFO_BLOCK_TRANSFER |
1141*4882a593Smuzhiyun SNDRV_PCM_INFO_PAUSE,
1142*4882a593Smuzhiyun .buffer_bytes_max = 1024 * 1024,
1143*4882a593Smuzhiyun .period_bytes_min = 64,
1144*4882a593Smuzhiyun .period_bytes_max = 512 * 1024,
1145*4882a593Smuzhiyun .periods_min = 2,
1146*4882a593Smuzhiyun .periods_max = 1024,
1147*4882a593Smuzhiyun };
1148*4882a593Smuzhiyun
hw_check_valid_format(struct snd_usb_substream * subs,struct snd_pcm_hw_params * params,struct audioformat * fp)1149*4882a593Smuzhiyun static int hw_check_valid_format(struct snd_usb_substream *subs,
1150*4882a593Smuzhiyun struct snd_pcm_hw_params *params,
1151*4882a593Smuzhiyun struct audioformat *fp)
1152*4882a593Smuzhiyun {
1153*4882a593Smuzhiyun struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
1154*4882a593Smuzhiyun struct snd_interval *ct = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
1155*4882a593Smuzhiyun struct snd_mask *fmts = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
1156*4882a593Smuzhiyun struct snd_interval *pt = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
1157*4882a593Smuzhiyun struct snd_mask check_fmts;
1158*4882a593Smuzhiyun unsigned int ptime;
1159*4882a593Smuzhiyun
1160*4882a593Smuzhiyun /* check the format */
1161*4882a593Smuzhiyun snd_mask_none(&check_fmts);
1162*4882a593Smuzhiyun check_fmts.bits[0] = (u32)fp->formats;
1163*4882a593Smuzhiyun check_fmts.bits[1] = (u32)(fp->formats >> 32);
1164*4882a593Smuzhiyun snd_mask_intersect(&check_fmts, fmts);
1165*4882a593Smuzhiyun if (snd_mask_empty(&check_fmts)) {
1166*4882a593Smuzhiyun hwc_debug(" > check: no supported format %d\n", fp->format);
1167*4882a593Smuzhiyun return 0;
1168*4882a593Smuzhiyun }
1169*4882a593Smuzhiyun /* check the channels */
1170*4882a593Smuzhiyun if (fp->channels < ct->min || fp->channels > ct->max) {
1171*4882a593Smuzhiyun hwc_debug(" > check: no valid channels %d (%d/%d)\n", fp->channels, ct->min, ct->max);
1172*4882a593Smuzhiyun return 0;
1173*4882a593Smuzhiyun }
1174*4882a593Smuzhiyun /* check the rate is within the range */
1175*4882a593Smuzhiyun if (fp->rate_min > it->max || (fp->rate_min == it->max && it->openmax)) {
1176*4882a593Smuzhiyun hwc_debug(" > check: rate_min %d > max %d\n", fp->rate_min, it->max);
1177*4882a593Smuzhiyun return 0;
1178*4882a593Smuzhiyun }
1179*4882a593Smuzhiyun if (fp->rate_max < it->min || (fp->rate_max == it->min && it->openmin)) {
1180*4882a593Smuzhiyun hwc_debug(" > check: rate_max %d < min %d\n", fp->rate_max, it->min);
1181*4882a593Smuzhiyun return 0;
1182*4882a593Smuzhiyun }
1183*4882a593Smuzhiyun /* check whether the period time is >= the data packet interval */
1184*4882a593Smuzhiyun if (subs->speed != USB_SPEED_FULL) {
1185*4882a593Smuzhiyun ptime = 125 * (1 << fp->datainterval);
1186*4882a593Smuzhiyun if (ptime > pt->max || (ptime == pt->max && pt->openmax)) {
1187*4882a593Smuzhiyun hwc_debug(" > check: ptime %u > max %u\n", ptime, pt->max);
1188*4882a593Smuzhiyun return 0;
1189*4882a593Smuzhiyun }
1190*4882a593Smuzhiyun }
1191*4882a593Smuzhiyun return 1;
1192*4882a593Smuzhiyun }
1193*4882a593Smuzhiyun
hw_rule_rate(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1194*4882a593Smuzhiyun static int hw_rule_rate(struct snd_pcm_hw_params *params,
1195*4882a593Smuzhiyun struct snd_pcm_hw_rule *rule)
1196*4882a593Smuzhiyun {
1197*4882a593Smuzhiyun struct snd_usb_substream *subs = rule->private;
1198*4882a593Smuzhiyun struct audioformat *fp;
1199*4882a593Smuzhiyun struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
1200*4882a593Smuzhiyun unsigned int rmin, rmax;
1201*4882a593Smuzhiyun int changed;
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun hwc_debug("hw_rule_rate: (%d,%d)\n", it->min, it->max);
1204*4882a593Smuzhiyun changed = 0;
1205*4882a593Smuzhiyun rmin = rmax = 0;
1206*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
1207*4882a593Smuzhiyun if (!hw_check_valid_format(subs, params, fp))
1208*4882a593Smuzhiyun continue;
1209*4882a593Smuzhiyun if (changed++) {
1210*4882a593Smuzhiyun if (rmin > fp->rate_min)
1211*4882a593Smuzhiyun rmin = fp->rate_min;
1212*4882a593Smuzhiyun if (rmax < fp->rate_max)
1213*4882a593Smuzhiyun rmax = fp->rate_max;
1214*4882a593Smuzhiyun } else {
1215*4882a593Smuzhiyun rmin = fp->rate_min;
1216*4882a593Smuzhiyun rmax = fp->rate_max;
1217*4882a593Smuzhiyun }
1218*4882a593Smuzhiyun }
1219*4882a593Smuzhiyun
1220*4882a593Smuzhiyun if (!changed) {
1221*4882a593Smuzhiyun hwc_debug(" --> get empty\n");
1222*4882a593Smuzhiyun it->empty = 1;
1223*4882a593Smuzhiyun return -EINVAL;
1224*4882a593Smuzhiyun }
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun changed = 0;
1227*4882a593Smuzhiyun if (it->min < rmin) {
1228*4882a593Smuzhiyun it->min = rmin;
1229*4882a593Smuzhiyun it->openmin = 0;
1230*4882a593Smuzhiyun changed = 1;
1231*4882a593Smuzhiyun }
1232*4882a593Smuzhiyun if (it->max > rmax) {
1233*4882a593Smuzhiyun it->max = rmax;
1234*4882a593Smuzhiyun it->openmax = 0;
1235*4882a593Smuzhiyun changed = 1;
1236*4882a593Smuzhiyun }
1237*4882a593Smuzhiyun if (snd_interval_checkempty(it)) {
1238*4882a593Smuzhiyun it->empty = 1;
1239*4882a593Smuzhiyun return -EINVAL;
1240*4882a593Smuzhiyun }
1241*4882a593Smuzhiyun hwc_debug(" --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
1242*4882a593Smuzhiyun return changed;
1243*4882a593Smuzhiyun }
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun
hw_rule_channels(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1246*4882a593Smuzhiyun static int hw_rule_channels(struct snd_pcm_hw_params *params,
1247*4882a593Smuzhiyun struct snd_pcm_hw_rule *rule)
1248*4882a593Smuzhiyun {
1249*4882a593Smuzhiyun struct snd_usb_substream *subs = rule->private;
1250*4882a593Smuzhiyun struct audioformat *fp;
1251*4882a593Smuzhiyun struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
1252*4882a593Smuzhiyun unsigned int rmin, rmax;
1253*4882a593Smuzhiyun int changed;
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun hwc_debug("hw_rule_channels: (%d,%d)\n", it->min, it->max);
1256*4882a593Smuzhiyun changed = 0;
1257*4882a593Smuzhiyun rmin = rmax = 0;
1258*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
1259*4882a593Smuzhiyun if (!hw_check_valid_format(subs, params, fp))
1260*4882a593Smuzhiyun continue;
1261*4882a593Smuzhiyun if (changed++) {
1262*4882a593Smuzhiyun if (rmin > fp->channels)
1263*4882a593Smuzhiyun rmin = fp->channels;
1264*4882a593Smuzhiyun if (rmax < fp->channels)
1265*4882a593Smuzhiyun rmax = fp->channels;
1266*4882a593Smuzhiyun } else {
1267*4882a593Smuzhiyun rmin = fp->channels;
1268*4882a593Smuzhiyun rmax = fp->channels;
1269*4882a593Smuzhiyun }
1270*4882a593Smuzhiyun }
1271*4882a593Smuzhiyun
1272*4882a593Smuzhiyun if (!changed) {
1273*4882a593Smuzhiyun hwc_debug(" --> get empty\n");
1274*4882a593Smuzhiyun it->empty = 1;
1275*4882a593Smuzhiyun return -EINVAL;
1276*4882a593Smuzhiyun }
1277*4882a593Smuzhiyun
1278*4882a593Smuzhiyun changed = 0;
1279*4882a593Smuzhiyun if (it->min < rmin) {
1280*4882a593Smuzhiyun it->min = rmin;
1281*4882a593Smuzhiyun it->openmin = 0;
1282*4882a593Smuzhiyun changed = 1;
1283*4882a593Smuzhiyun }
1284*4882a593Smuzhiyun if (it->max > rmax) {
1285*4882a593Smuzhiyun it->max = rmax;
1286*4882a593Smuzhiyun it->openmax = 0;
1287*4882a593Smuzhiyun changed = 1;
1288*4882a593Smuzhiyun }
1289*4882a593Smuzhiyun if (snd_interval_checkempty(it)) {
1290*4882a593Smuzhiyun it->empty = 1;
1291*4882a593Smuzhiyun return -EINVAL;
1292*4882a593Smuzhiyun }
1293*4882a593Smuzhiyun hwc_debug(" --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
1294*4882a593Smuzhiyun return changed;
1295*4882a593Smuzhiyun }
1296*4882a593Smuzhiyun
hw_rule_format(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1297*4882a593Smuzhiyun static int hw_rule_format(struct snd_pcm_hw_params *params,
1298*4882a593Smuzhiyun struct snd_pcm_hw_rule *rule)
1299*4882a593Smuzhiyun {
1300*4882a593Smuzhiyun struct snd_usb_substream *subs = rule->private;
1301*4882a593Smuzhiyun struct audioformat *fp;
1302*4882a593Smuzhiyun struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
1303*4882a593Smuzhiyun u64 fbits;
1304*4882a593Smuzhiyun u32 oldbits[2];
1305*4882a593Smuzhiyun int changed;
1306*4882a593Smuzhiyun
1307*4882a593Smuzhiyun hwc_debug("hw_rule_format: %x:%x\n", fmt->bits[0], fmt->bits[1]);
1308*4882a593Smuzhiyun fbits = 0;
1309*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
1310*4882a593Smuzhiyun if (!hw_check_valid_format(subs, params, fp))
1311*4882a593Smuzhiyun continue;
1312*4882a593Smuzhiyun fbits |= fp->formats;
1313*4882a593Smuzhiyun }
1314*4882a593Smuzhiyun
1315*4882a593Smuzhiyun oldbits[0] = fmt->bits[0];
1316*4882a593Smuzhiyun oldbits[1] = fmt->bits[1];
1317*4882a593Smuzhiyun fmt->bits[0] &= (u32)fbits;
1318*4882a593Smuzhiyun fmt->bits[1] &= (u32)(fbits >> 32);
1319*4882a593Smuzhiyun if (!fmt->bits[0] && !fmt->bits[1]) {
1320*4882a593Smuzhiyun hwc_debug(" --> get empty\n");
1321*4882a593Smuzhiyun return -EINVAL;
1322*4882a593Smuzhiyun }
1323*4882a593Smuzhiyun changed = (oldbits[0] != fmt->bits[0] || oldbits[1] != fmt->bits[1]);
1324*4882a593Smuzhiyun hwc_debug(" --> %x:%x (changed = %d)\n", fmt->bits[0], fmt->bits[1], changed);
1325*4882a593Smuzhiyun return changed;
1326*4882a593Smuzhiyun }
1327*4882a593Smuzhiyun
hw_rule_period_time(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1328*4882a593Smuzhiyun static int hw_rule_period_time(struct snd_pcm_hw_params *params,
1329*4882a593Smuzhiyun struct snd_pcm_hw_rule *rule)
1330*4882a593Smuzhiyun {
1331*4882a593Smuzhiyun struct snd_usb_substream *subs = rule->private;
1332*4882a593Smuzhiyun struct audioformat *fp;
1333*4882a593Smuzhiyun struct snd_interval *it;
1334*4882a593Smuzhiyun unsigned char min_datainterval;
1335*4882a593Smuzhiyun unsigned int pmin;
1336*4882a593Smuzhiyun int changed;
1337*4882a593Smuzhiyun
1338*4882a593Smuzhiyun it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
1339*4882a593Smuzhiyun hwc_debug("hw_rule_period_time: (%u,%u)\n", it->min, it->max);
1340*4882a593Smuzhiyun min_datainterval = 0xff;
1341*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
1342*4882a593Smuzhiyun if (!hw_check_valid_format(subs, params, fp))
1343*4882a593Smuzhiyun continue;
1344*4882a593Smuzhiyun min_datainterval = min(min_datainterval, fp->datainterval);
1345*4882a593Smuzhiyun }
1346*4882a593Smuzhiyun if (min_datainterval == 0xff) {
1347*4882a593Smuzhiyun hwc_debug(" --> get empty\n");
1348*4882a593Smuzhiyun it->empty = 1;
1349*4882a593Smuzhiyun return -EINVAL;
1350*4882a593Smuzhiyun }
1351*4882a593Smuzhiyun pmin = 125 * (1 << min_datainterval);
1352*4882a593Smuzhiyun changed = 0;
1353*4882a593Smuzhiyun if (it->min < pmin) {
1354*4882a593Smuzhiyun it->min = pmin;
1355*4882a593Smuzhiyun it->openmin = 0;
1356*4882a593Smuzhiyun changed = 1;
1357*4882a593Smuzhiyun }
1358*4882a593Smuzhiyun if (snd_interval_checkempty(it)) {
1359*4882a593Smuzhiyun it->empty = 1;
1360*4882a593Smuzhiyun return -EINVAL;
1361*4882a593Smuzhiyun }
1362*4882a593Smuzhiyun hwc_debug(" --> (%u,%u) (changed = %d)\n", it->min, it->max, changed);
1363*4882a593Smuzhiyun return changed;
1364*4882a593Smuzhiyun }
1365*4882a593Smuzhiyun
1366*4882a593Smuzhiyun /*
1367*4882a593Smuzhiyun * If the device supports unusual bit rates, does the request meet these?
1368*4882a593Smuzhiyun */
snd_usb_pcm_check_knot(struct snd_pcm_runtime * runtime,struct snd_usb_substream * subs)1369*4882a593Smuzhiyun static int snd_usb_pcm_check_knot(struct snd_pcm_runtime *runtime,
1370*4882a593Smuzhiyun struct snd_usb_substream *subs)
1371*4882a593Smuzhiyun {
1372*4882a593Smuzhiyun struct audioformat *fp;
1373*4882a593Smuzhiyun int *rate_list;
1374*4882a593Smuzhiyun int count = 0, needs_knot = 0;
1375*4882a593Smuzhiyun int err;
1376*4882a593Smuzhiyun
1377*4882a593Smuzhiyun kfree(subs->rate_list.list);
1378*4882a593Smuzhiyun subs->rate_list.list = NULL;
1379*4882a593Smuzhiyun
1380*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
1381*4882a593Smuzhiyun if (fp->rates & SNDRV_PCM_RATE_CONTINUOUS)
1382*4882a593Smuzhiyun return 0;
1383*4882a593Smuzhiyun count += fp->nr_rates;
1384*4882a593Smuzhiyun if (fp->rates & SNDRV_PCM_RATE_KNOT)
1385*4882a593Smuzhiyun needs_knot = 1;
1386*4882a593Smuzhiyun }
1387*4882a593Smuzhiyun if (!needs_knot)
1388*4882a593Smuzhiyun return 0;
1389*4882a593Smuzhiyun
1390*4882a593Smuzhiyun subs->rate_list.list = rate_list =
1391*4882a593Smuzhiyun kmalloc_array(count, sizeof(int), GFP_KERNEL);
1392*4882a593Smuzhiyun if (!subs->rate_list.list)
1393*4882a593Smuzhiyun return -ENOMEM;
1394*4882a593Smuzhiyun subs->rate_list.count = count;
1395*4882a593Smuzhiyun subs->rate_list.mask = 0;
1396*4882a593Smuzhiyun count = 0;
1397*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
1398*4882a593Smuzhiyun int i;
1399*4882a593Smuzhiyun for (i = 0; i < fp->nr_rates; i++)
1400*4882a593Smuzhiyun rate_list[count++] = fp->rate_table[i];
1401*4882a593Smuzhiyun }
1402*4882a593Smuzhiyun err = snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
1403*4882a593Smuzhiyun &subs->rate_list);
1404*4882a593Smuzhiyun if (err < 0)
1405*4882a593Smuzhiyun return err;
1406*4882a593Smuzhiyun
1407*4882a593Smuzhiyun return 0;
1408*4882a593Smuzhiyun }
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun
1411*4882a593Smuzhiyun /*
1412*4882a593Smuzhiyun * set up the runtime hardware information.
1413*4882a593Smuzhiyun */
1414*4882a593Smuzhiyun
setup_hw_info(struct snd_pcm_runtime * runtime,struct snd_usb_substream * subs)1415*4882a593Smuzhiyun static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substream *subs)
1416*4882a593Smuzhiyun {
1417*4882a593Smuzhiyun struct audioformat *fp;
1418*4882a593Smuzhiyun unsigned int pt, ptmin;
1419*4882a593Smuzhiyun int param_period_time_if_needed;
1420*4882a593Smuzhiyun int err;
1421*4882a593Smuzhiyun
1422*4882a593Smuzhiyun runtime->hw.formats = subs->formats;
1423*4882a593Smuzhiyun
1424*4882a593Smuzhiyun runtime->hw.rate_min = 0x7fffffff;
1425*4882a593Smuzhiyun runtime->hw.rate_max = 0;
1426*4882a593Smuzhiyun runtime->hw.channels_min = 256;
1427*4882a593Smuzhiyun runtime->hw.channels_max = 0;
1428*4882a593Smuzhiyun runtime->hw.rates = 0;
1429*4882a593Smuzhiyun ptmin = UINT_MAX;
1430*4882a593Smuzhiyun /* check min/max rates and channels */
1431*4882a593Smuzhiyun list_for_each_entry(fp, &subs->fmt_list, list) {
1432*4882a593Smuzhiyun runtime->hw.rates |= fp->rates;
1433*4882a593Smuzhiyun if (runtime->hw.rate_min > fp->rate_min)
1434*4882a593Smuzhiyun runtime->hw.rate_min = fp->rate_min;
1435*4882a593Smuzhiyun if (runtime->hw.rate_max < fp->rate_max)
1436*4882a593Smuzhiyun runtime->hw.rate_max = fp->rate_max;
1437*4882a593Smuzhiyun if (runtime->hw.channels_min > fp->channels)
1438*4882a593Smuzhiyun runtime->hw.channels_min = fp->channels;
1439*4882a593Smuzhiyun if (runtime->hw.channels_max < fp->channels)
1440*4882a593Smuzhiyun runtime->hw.channels_max = fp->channels;
1441*4882a593Smuzhiyun if (fp->fmt_type == UAC_FORMAT_TYPE_II && fp->frame_size > 0) {
1442*4882a593Smuzhiyun /* FIXME: there might be more than one audio formats... */
1443*4882a593Smuzhiyun runtime->hw.period_bytes_min = runtime->hw.period_bytes_max =
1444*4882a593Smuzhiyun fp->frame_size;
1445*4882a593Smuzhiyun }
1446*4882a593Smuzhiyun pt = 125 * (1 << fp->datainterval);
1447*4882a593Smuzhiyun ptmin = min(ptmin, pt);
1448*4882a593Smuzhiyun }
1449*4882a593Smuzhiyun
1450*4882a593Smuzhiyun param_period_time_if_needed = SNDRV_PCM_HW_PARAM_PERIOD_TIME;
1451*4882a593Smuzhiyun if (subs->speed == USB_SPEED_FULL)
1452*4882a593Smuzhiyun /* full speed devices have fixed data packet interval */
1453*4882a593Smuzhiyun ptmin = 1000;
1454*4882a593Smuzhiyun if (ptmin == 1000)
1455*4882a593Smuzhiyun /* if period time doesn't go below 1 ms, no rules needed */
1456*4882a593Smuzhiyun param_period_time_if_needed = -1;
1457*4882a593Smuzhiyun
1458*4882a593Smuzhiyun err = snd_pcm_hw_constraint_minmax(runtime,
1459*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_PERIOD_TIME,
1460*4882a593Smuzhiyun ptmin, UINT_MAX);
1461*4882a593Smuzhiyun if (err < 0)
1462*4882a593Smuzhiyun return err;
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
1465*4882a593Smuzhiyun hw_rule_rate, subs,
1466*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_FORMAT,
1467*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_CHANNELS,
1468*4882a593Smuzhiyun param_period_time_if_needed,
1469*4882a593Smuzhiyun -1);
1470*4882a593Smuzhiyun if (err < 0)
1471*4882a593Smuzhiyun return err;
1472*4882a593Smuzhiyun err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
1473*4882a593Smuzhiyun hw_rule_channels, subs,
1474*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_FORMAT,
1475*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_RATE,
1476*4882a593Smuzhiyun param_period_time_if_needed,
1477*4882a593Smuzhiyun -1);
1478*4882a593Smuzhiyun if (err < 0)
1479*4882a593Smuzhiyun return err;
1480*4882a593Smuzhiyun err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT,
1481*4882a593Smuzhiyun hw_rule_format, subs,
1482*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_RATE,
1483*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_CHANNELS,
1484*4882a593Smuzhiyun param_period_time_if_needed,
1485*4882a593Smuzhiyun -1);
1486*4882a593Smuzhiyun if (err < 0)
1487*4882a593Smuzhiyun return err;
1488*4882a593Smuzhiyun if (param_period_time_if_needed >= 0) {
1489*4882a593Smuzhiyun err = snd_pcm_hw_rule_add(runtime, 0,
1490*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_PERIOD_TIME,
1491*4882a593Smuzhiyun hw_rule_period_time, subs,
1492*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_FORMAT,
1493*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_CHANNELS,
1494*4882a593Smuzhiyun SNDRV_PCM_HW_PARAM_RATE,
1495*4882a593Smuzhiyun -1);
1496*4882a593Smuzhiyun if (err < 0)
1497*4882a593Smuzhiyun return err;
1498*4882a593Smuzhiyun }
1499*4882a593Smuzhiyun err = snd_usb_pcm_check_knot(runtime, subs);
1500*4882a593Smuzhiyun if (err < 0)
1501*4882a593Smuzhiyun return err;
1502*4882a593Smuzhiyun
1503*4882a593Smuzhiyun return snd_usb_autoresume(subs->stream->chip);
1504*4882a593Smuzhiyun }
1505*4882a593Smuzhiyun
snd_usb_pcm_open(struct snd_pcm_substream * substream)1506*4882a593Smuzhiyun static int snd_usb_pcm_open(struct snd_pcm_substream *substream)
1507*4882a593Smuzhiyun {
1508*4882a593Smuzhiyun int direction = substream->stream;
1509*4882a593Smuzhiyun struct snd_usb_stream *as = snd_pcm_substream_chip(substream);
1510*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = substream->runtime;
1511*4882a593Smuzhiyun struct snd_usb_substream *subs = &as->substream[direction];
1512*4882a593Smuzhiyun int ret;
1513*4882a593Smuzhiyun bool is_support = false;
1514*4882a593Smuzhiyun
1515*4882a593Smuzhiyun ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_OPEN,
1516*4882a593Smuzhiyun direction);
1517*4882a593Smuzhiyun if (ret)
1518*4882a593Smuzhiyun return ret;
1519*4882a593Smuzhiyun
1520*4882a593Smuzhiyun subs->interface = -1;
1521*4882a593Smuzhiyun subs->altset_idx = 0;
1522*4882a593Smuzhiyun runtime->hw = snd_usb_hardware;
1523*4882a593Smuzhiyun runtime->private_data = subs;
1524*4882a593Smuzhiyun subs->pcm_substream = substream;
1525*4882a593Smuzhiyun /* runtime PM is also done there */
1526*4882a593Smuzhiyun
1527*4882a593Smuzhiyun /* initialize DSD/DOP context */
1528*4882a593Smuzhiyun subs->dsd_dop.byte_idx = 0;
1529*4882a593Smuzhiyun subs->dsd_dop.channel = 0;
1530*4882a593Smuzhiyun subs->dsd_dop.marker = 1;
1531*4882a593Smuzhiyun
1532*4882a593Smuzhiyun ret = setup_hw_info(runtime, subs);
1533*4882a593Smuzhiyun if (ret == 0) {
1534*4882a593Smuzhiyun ret = snd_media_stream_init(subs, as->pcm, direction);
1535*4882a593Smuzhiyun if (ret)
1536*4882a593Smuzhiyun snd_usb_autosuspend(subs->stream->chip);
1537*4882a593Smuzhiyun }
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support);
1540*4882a593Smuzhiyun if (!ret && is_support)
1541*4882a593Smuzhiyun snd_usb_autosuspend(subs->stream->chip);
1542*4882a593Smuzhiyun
1543*4882a593Smuzhiyun return ret;
1544*4882a593Smuzhiyun }
1545*4882a593Smuzhiyun
snd_usb_pcm_close(struct snd_pcm_substream * substream)1546*4882a593Smuzhiyun static int snd_usb_pcm_close(struct snd_pcm_substream *substream)
1547*4882a593Smuzhiyun {
1548*4882a593Smuzhiyun int direction = substream->stream;
1549*4882a593Smuzhiyun struct snd_usb_stream *as = snd_pcm_substream_chip(substream);
1550*4882a593Smuzhiyun struct snd_usb_substream *subs = &as->substream[direction];
1551*4882a593Smuzhiyun int ret;
1552*4882a593Smuzhiyun bool is_support = false;
1553*4882a593Smuzhiyun
1554*4882a593Smuzhiyun ret = snd_vendor_set_pcm_connection(subs->dev, SOUND_PCM_CLOSE,
1555*4882a593Smuzhiyun direction);
1556*4882a593Smuzhiyun if (ret)
1557*4882a593Smuzhiyun return ret;
1558*4882a593Smuzhiyun
1559*4882a593Smuzhiyun trace_android_vh_sound_usb_support_cpu_suspend(subs->dev, direction, &is_support);
1560*4882a593Smuzhiyun if (!ret && is_support)
1561*4882a593Smuzhiyun snd_usb_autoresume(subs->stream->chip);
1562*4882a593Smuzhiyun
1563*4882a593Smuzhiyun snd_media_stop_pipeline(subs);
1564*4882a593Smuzhiyun
1565*4882a593Smuzhiyun if (!as->chip->keep_iface &&
1566*4882a593Smuzhiyun subs->interface >= 0 &&
1567*4882a593Smuzhiyun !snd_usb_lock_shutdown(subs->stream->chip)) {
1568*4882a593Smuzhiyun usb_set_interface(subs->dev, subs->interface, 0);
1569*4882a593Smuzhiyun ret = snd_vendor_set_pcm_intf(usb_ifnum_to_if(subs->dev,
1570*4882a593Smuzhiyun subs->interface),
1571*4882a593Smuzhiyun subs->interface, 0,
1572*4882a593Smuzhiyun direction);
1573*4882a593Smuzhiyun if (ret)
1574*4882a593Smuzhiyun return ret;
1575*4882a593Smuzhiyun subs->interface = -1;
1576*4882a593Smuzhiyun ret = snd_usb_pcm_change_state(subs, UAC3_PD_STATE_D1);
1577*4882a593Smuzhiyun snd_usb_unlock_shutdown(subs->stream->chip);
1578*4882a593Smuzhiyun if (ret < 0)
1579*4882a593Smuzhiyun return ret;
1580*4882a593Smuzhiyun }
1581*4882a593Smuzhiyun
1582*4882a593Smuzhiyun subs->pcm_substream = NULL;
1583*4882a593Smuzhiyun snd_usb_autosuspend(subs->stream->chip);
1584*4882a593Smuzhiyun
1585*4882a593Smuzhiyun return 0;
1586*4882a593Smuzhiyun }
1587*4882a593Smuzhiyun
1588*4882a593Smuzhiyun /* Since a URB can handle only a single linear buffer, we must use double
1589*4882a593Smuzhiyun * buffering when the data to be transferred overflows the buffer boundary.
1590*4882a593Smuzhiyun * To avoid inconsistencies when updating hwptr_done, we use double buffering
1591*4882a593Smuzhiyun * for all URBs.
1592*4882a593Smuzhiyun */
retire_capture_urb(struct snd_usb_substream * subs,struct urb * urb)1593*4882a593Smuzhiyun static void retire_capture_urb(struct snd_usb_substream *subs,
1594*4882a593Smuzhiyun struct urb *urb)
1595*4882a593Smuzhiyun {
1596*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
1597*4882a593Smuzhiyun unsigned int stride, frames, bytes, oldptr;
1598*4882a593Smuzhiyun int i, period_elapsed = 0;
1599*4882a593Smuzhiyun unsigned long flags;
1600*4882a593Smuzhiyun unsigned char *cp;
1601*4882a593Smuzhiyun int current_frame_number;
1602*4882a593Smuzhiyun
1603*4882a593Smuzhiyun /* read frame number here, update pointer in critical section */
1604*4882a593Smuzhiyun current_frame_number = usb_get_current_frame_number(subs->dev);
1605*4882a593Smuzhiyun
1606*4882a593Smuzhiyun stride = runtime->frame_bits >> 3;
1607*4882a593Smuzhiyun
1608*4882a593Smuzhiyun for (i = 0; i < urb->number_of_packets; i++) {
1609*4882a593Smuzhiyun cp = (unsigned char *)urb->transfer_buffer + urb->iso_frame_desc[i].offset + subs->pkt_offset_adj;
1610*4882a593Smuzhiyun if (urb->iso_frame_desc[i].status && printk_ratelimit()) {
1611*4882a593Smuzhiyun dev_dbg(&subs->dev->dev, "frame %d active: %d\n",
1612*4882a593Smuzhiyun i, urb->iso_frame_desc[i].status);
1613*4882a593Smuzhiyun // continue;
1614*4882a593Smuzhiyun }
1615*4882a593Smuzhiyun bytes = urb->iso_frame_desc[i].actual_length;
1616*4882a593Smuzhiyun if (subs->stream_offset_adj > 0) {
1617*4882a593Smuzhiyun unsigned int adj = min(subs->stream_offset_adj, bytes);
1618*4882a593Smuzhiyun cp += adj;
1619*4882a593Smuzhiyun bytes -= adj;
1620*4882a593Smuzhiyun subs->stream_offset_adj -= adj;
1621*4882a593Smuzhiyun }
1622*4882a593Smuzhiyun frames = bytes / stride;
1623*4882a593Smuzhiyun if (!subs->txfr_quirk)
1624*4882a593Smuzhiyun bytes = frames * stride;
1625*4882a593Smuzhiyun if (bytes % (runtime->sample_bits >> 3) != 0) {
1626*4882a593Smuzhiyun int oldbytes = bytes;
1627*4882a593Smuzhiyun bytes = frames * stride;
1628*4882a593Smuzhiyun dev_warn_ratelimited(&subs->dev->dev,
1629*4882a593Smuzhiyun "Corrected urb data len. %d->%d\n",
1630*4882a593Smuzhiyun oldbytes, bytes);
1631*4882a593Smuzhiyun }
1632*4882a593Smuzhiyun /* update the current pointer */
1633*4882a593Smuzhiyun spin_lock_irqsave(&subs->lock, flags);
1634*4882a593Smuzhiyun oldptr = subs->hwptr_done;
1635*4882a593Smuzhiyun subs->hwptr_done += bytes;
1636*4882a593Smuzhiyun if (subs->hwptr_done >= runtime->buffer_size * stride)
1637*4882a593Smuzhiyun subs->hwptr_done -= runtime->buffer_size * stride;
1638*4882a593Smuzhiyun frames = (bytes + (oldptr % stride)) / stride;
1639*4882a593Smuzhiyun subs->transfer_done += frames;
1640*4882a593Smuzhiyun if (subs->transfer_done >= runtime->period_size) {
1641*4882a593Smuzhiyun subs->transfer_done -= runtime->period_size;
1642*4882a593Smuzhiyun period_elapsed = 1;
1643*4882a593Smuzhiyun }
1644*4882a593Smuzhiyun /* capture delay is by construction limited to one URB,
1645*4882a593Smuzhiyun * reset delays here
1646*4882a593Smuzhiyun */
1647*4882a593Smuzhiyun runtime->delay = subs->last_delay = 0;
1648*4882a593Smuzhiyun
1649*4882a593Smuzhiyun /* realign last_frame_number */
1650*4882a593Smuzhiyun subs->last_frame_number = current_frame_number;
1651*4882a593Smuzhiyun subs->last_frame_number &= 0xFF; /* keep 8 LSBs */
1652*4882a593Smuzhiyun
1653*4882a593Smuzhiyun spin_unlock_irqrestore(&subs->lock, flags);
1654*4882a593Smuzhiyun /* copy a data chunk */
1655*4882a593Smuzhiyun if (oldptr + bytes > runtime->buffer_size * stride) {
1656*4882a593Smuzhiyun unsigned int bytes1 =
1657*4882a593Smuzhiyun runtime->buffer_size * stride - oldptr;
1658*4882a593Smuzhiyun memcpy(runtime->dma_area + oldptr, cp, bytes1);
1659*4882a593Smuzhiyun memcpy(runtime->dma_area, cp + bytes1, bytes - bytes1);
1660*4882a593Smuzhiyun } else {
1661*4882a593Smuzhiyun memcpy(runtime->dma_area + oldptr, cp, bytes);
1662*4882a593Smuzhiyun }
1663*4882a593Smuzhiyun }
1664*4882a593Smuzhiyun
1665*4882a593Smuzhiyun if (period_elapsed)
1666*4882a593Smuzhiyun snd_pcm_period_elapsed(subs->pcm_substream);
1667*4882a593Smuzhiyun }
1668*4882a593Smuzhiyun
fill_playback_urb_dsd_dop(struct snd_usb_substream * subs,struct urb * urb,unsigned int bytes)1669*4882a593Smuzhiyun static inline void fill_playback_urb_dsd_dop(struct snd_usb_substream *subs,
1670*4882a593Smuzhiyun struct urb *urb, unsigned int bytes)
1671*4882a593Smuzhiyun {
1672*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
1673*4882a593Smuzhiyun unsigned int stride = runtime->frame_bits >> 3;
1674*4882a593Smuzhiyun unsigned int dst_idx = 0;
1675*4882a593Smuzhiyun unsigned int src_idx = subs->hwptr_done;
1676*4882a593Smuzhiyun unsigned int wrap = runtime->buffer_size * stride;
1677*4882a593Smuzhiyun u8 *dst = urb->transfer_buffer;
1678*4882a593Smuzhiyun u8 *src = runtime->dma_area;
1679*4882a593Smuzhiyun u8 marker[] = { 0x05, 0xfa };
1680*4882a593Smuzhiyun
1681*4882a593Smuzhiyun /*
1682*4882a593Smuzhiyun * The DSP DOP format defines a way to transport DSD samples over
1683*4882a593Smuzhiyun * normal PCM data endpoints. It requires stuffing of marker bytes
1684*4882a593Smuzhiyun * (0x05 and 0xfa, alternating per sample frame), and then expects
1685*4882a593Smuzhiyun * 2 additional bytes of actual payload. The whole frame is stored
1686*4882a593Smuzhiyun * LSB.
1687*4882a593Smuzhiyun *
1688*4882a593Smuzhiyun * Hence, for a stereo transport, the buffer layout looks like this,
1689*4882a593Smuzhiyun * where L refers to left channel samples and R to right.
1690*4882a593Smuzhiyun *
1691*4882a593Smuzhiyun * L1 L2 0x05 R1 R2 0x05 L3 L4 0xfa R3 R4 0xfa
1692*4882a593Smuzhiyun * L5 L6 0x05 R5 R6 0x05 L7 L8 0xfa R7 R8 0xfa
1693*4882a593Smuzhiyun * .....
1694*4882a593Smuzhiyun *
1695*4882a593Smuzhiyun */
1696*4882a593Smuzhiyun
1697*4882a593Smuzhiyun while (bytes--) {
1698*4882a593Smuzhiyun if (++subs->dsd_dop.byte_idx == 3) {
1699*4882a593Smuzhiyun /* frame boundary? */
1700*4882a593Smuzhiyun dst[dst_idx++] = marker[subs->dsd_dop.marker];
1701*4882a593Smuzhiyun src_idx += 2;
1702*4882a593Smuzhiyun subs->dsd_dop.byte_idx = 0;
1703*4882a593Smuzhiyun
1704*4882a593Smuzhiyun if (++subs->dsd_dop.channel % runtime->channels == 0) {
1705*4882a593Smuzhiyun /* alternate the marker */
1706*4882a593Smuzhiyun subs->dsd_dop.marker++;
1707*4882a593Smuzhiyun subs->dsd_dop.marker %= ARRAY_SIZE(marker);
1708*4882a593Smuzhiyun subs->dsd_dop.channel = 0;
1709*4882a593Smuzhiyun }
1710*4882a593Smuzhiyun } else {
1711*4882a593Smuzhiyun /* stuff the DSD payload */
1712*4882a593Smuzhiyun int idx = (src_idx + subs->dsd_dop.byte_idx - 1) % wrap;
1713*4882a593Smuzhiyun
1714*4882a593Smuzhiyun if (subs->cur_audiofmt->dsd_bitrev)
1715*4882a593Smuzhiyun dst[dst_idx++] = bitrev8(src[idx]);
1716*4882a593Smuzhiyun else
1717*4882a593Smuzhiyun dst[dst_idx++] = src[idx];
1718*4882a593Smuzhiyun
1719*4882a593Smuzhiyun subs->hwptr_done++;
1720*4882a593Smuzhiyun }
1721*4882a593Smuzhiyun }
1722*4882a593Smuzhiyun if (subs->hwptr_done >= runtime->buffer_size * stride)
1723*4882a593Smuzhiyun subs->hwptr_done -= runtime->buffer_size * stride;
1724*4882a593Smuzhiyun }
1725*4882a593Smuzhiyun
copy_to_urb(struct snd_usb_substream * subs,struct urb * urb,int offset,int stride,unsigned int bytes)1726*4882a593Smuzhiyun static void copy_to_urb(struct snd_usb_substream *subs, struct urb *urb,
1727*4882a593Smuzhiyun int offset, int stride, unsigned int bytes)
1728*4882a593Smuzhiyun {
1729*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
1730*4882a593Smuzhiyun
1731*4882a593Smuzhiyun if (subs->hwptr_done + bytes > runtime->buffer_size * stride) {
1732*4882a593Smuzhiyun /* err, the transferred area goes over buffer boundary. */
1733*4882a593Smuzhiyun unsigned int bytes1 =
1734*4882a593Smuzhiyun runtime->buffer_size * stride - subs->hwptr_done;
1735*4882a593Smuzhiyun memcpy(urb->transfer_buffer + offset,
1736*4882a593Smuzhiyun runtime->dma_area + subs->hwptr_done, bytes1);
1737*4882a593Smuzhiyun memcpy(urb->transfer_buffer + offset + bytes1,
1738*4882a593Smuzhiyun runtime->dma_area, bytes - bytes1);
1739*4882a593Smuzhiyun } else {
1740*4882a593Smuzhiyun memcpy(urb->transfer_buffer + offset,
1741*4882a593Smuzhiyun runtime->dma_area + subs->hwptr_done, bytes);
1742*4882a593Smuzhiyun }
1743*4882a593Smuzhiyun subs->hwptr_done += bytes;
1744*4882a593Smuzhiyun if (subs->hwptr_done >= runtime->buffer_size * stride)
1745*4882a593Smuzhiyun subs->hwptr_done -= runtime->buffer_size * stride;
1746*4882a593Smuzhiyun }
1747*4882a593Smuzhiyun
copy_to_urb_quirk(struct snd_usb_substream * subs,struct urb * urb,int stride,unsigned int bytes)1748*4882a593Smuzhiyun static unsigned int copy_to_urb_quirk(struct snd_usb_substream *subs,
1749*4882a593Smuzhiyun struct urb *urb, int stride,
1750*4882a593Smuzhiyun unsigned int bytes)
1751*4882a593Smuzhiyun {
1752*4882a593Smuzhiyun __le32 packet_length;
1753*4882a593Smuzhiyun int i;
1754*4882a593Smuzhiyun
1755*4882a593Smuzhiyun /* Put __le32 length descriptor at start of each packet. */
1756*4882a593Smuzhiyun for (i = 0; i < urb->number_of_packets; i++) {
1757*4882a593Smuzhiyun unsigned int length = urb->iso_frame_desc[i].length;
1758*4882a593Smuzhiyun unsigned int offset = urb->iso_frame_desc[i].offset;
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun packet_length = cpu_to_le32(length);
1761*4882a593Smuzhiyun offset += i * sizeof(packet_length);
1762*4882a593Smuzhiyun urb->iso_frame_desc[i].offset = offset;
1763*4882a593Smuzhiyun urb->iso_frame_desc[i].length += sizeof(packet_length);
1764*4882a593Smuzhiyun memcpy(urb->transfer_buffer + offset,
1765*4882a593Smuzhiyun &packet_length, sizeof(packet_length));
1766*4882a593Smuzhiyun copy_to_urb(subs, urb, offset + sizeof(packet_length),
1767*4882a593Smuzhiyun stride, length);
1768*4882a593Smuzhiyun }
1769*4882a593Smuzhiyun /* Adjust transfer size accordingly. */
1770*4882a593Smuzhiyun bytes += urb->number_of_packets * sizeof(packet_length);
1771*4882a593Smuzhiyun return bytes;
1772*4882a593Smuzhiyun }
1773*4882a593Smuzhiyun
prepare_playback_urb(struct snd_usb_substream * subs,struct urb * urb)1774*4882a593Smuzhiyun static void prepare_playback_urb(struct snd_usb_substream *subs,
1775*4882a593Smuzhiyun struct urb *urb)
1776*4882a593Smuzhiyun {
1777*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
1778*4882a593Smuzhiyun struct snd_usb_endpoint *ep = subs->data_endpoint;
1779*4882a593Smuzhiyun struct snd_urb_ctx *ctx = urb->context;
1780*4882a593Smuzhiyun unsigned int counts, frames, bytes;
1781*4882a593Smuzhiyun int i, stride, period_elapsed = 0;
1782*4882a593Smuzhiyun unsigned long flags;
1783*4882a593Smuzhiyun
1784*4882a593Smuzhiyun stride = runtime->frame_bits >> 3;
1785*4882a593Smuzhiyun
1786*4882a593Smuzhiyun frames = 0;
1787*4882a593Smuzhiyun urb->number_of_packets = 0;
1788*4882a593Smuzhiyun spin_lock_irqsave(&subs->lock, flags);
1789*4882a593Smuzhiyun subs->frame_limit += ep->max_urb_frames;
1790*4882a593Smuzhiyun for (i = 0; i < ctx->packets; i++) {
1791*4882a593Smuzhiyun if (ctx->packet_size[i])
1792*4882a593Smuzhiyun counts = ctx->packet_size[i];
1793*4882a593Smuzhiyun else if (ep->sync_master)
1794*4882a593Smuzhiyun counts = snd_usb_endpoint_slave_next_packet_size(ep);
1795*4882a593Smuzhiyun else
1796*4882a593Smuzhiyun counts = snd_usb_endpoint_next_packet_size(ep);
1797*4882a593Smuzhiyun
1798*4882a593Smuzhiyun /* set up descriptor */
1799*4882a593Smuzhiyun urb->iso_frame_desc[i].offset = frames * ep->stride;
1800*4882a593Smuzhiyun urb->iso_frame_desc[i].length = counts * ep->stride;
1801*4882a593Smuzhiyun frames += counts;
1802*4882a593Smuzhiyun urb->number_of_packets++;
1803*4882a593Smuzhiyun subs->transfer_done += counts;
1804*4882a593Smuzhiyun if (subs->transfer_done >= runtime->period_size) {
1805*4882a593Smuzhiyun subs->transfer_done -= runtime->period_size;
1806*4882a593Smuzhiyun subs->frame_limit = 0;
1807*4882a593Smuzhiyun period_elapsed = 1;
1808*4882a593Smuzhiyun if (subs->fmt_type == UAC_FORMAT_TYPE_II) {
1809*4882a593Smuzhiyun if (subs->transfer_done > 0) {
1810*4882a593Smuzhiyun /* FIXME: fill-max mode is not
1811*4882a593Smuzhiyun * supported yet */
1812*4882a593Smuzhiyun frames -= subs->transfer_done;
1813*4882a593Smuzhiyun counts -= subs->transfer_done;
1814*4882a593Smuzhiyun urb->iso_frame_desc[i].length =
1815*4882a593Smuzhiyun counts * ep->stride;
1816*4882a593Smuzhiyun subs->transfer_done = 0;
1817*4882a593Smuzhiyun }
1818*4882a593Smuzhiyun i++;
1819*4882a593Smuzhiyun if (i < ctx->packets) {
1820*4882a593Smuzhiyun /* add a transfer delimiter */
1821*4882a593Smuzhiyun urb->iso_frame_desc[i].offset =
1822*4882a593Smuzhiyun frames * ep->stride;
1823*4882a593Smuzhiyun urb->iso_frame_desc[i].length = 0;
1824*4882a593Smuzhiyun urb->number_of_packets++;
1825*4882a593Smuzhiyun }
1826*4882a593Smuzhiyun break;
1827*4882a593Smuzhiyun }
1828*4882a593Smuzhiyun }
1829*4882a593Smuzhiyun /* finish at the period boundary or after enough frames */
1830*4882a593Smuzhiyun if ((period_elapsed ||
1831*4882a593Smuzhiyun subs->transfer_done >= subs->frame_limit) &&
1832*4882a593Smuzhiyun !snd_usb_endpoint_implicit_feedback_sink(ep))
1833*4882a593Smuzhiyun break;
1834*4882a593Smuzhiyun }
1835*4882a593Smuzhiyun bytes = frames * ep->stride;
1836*4882a593Smuzhiyun
1837*4882a593Smuzhiyun if (unlikely(subs->pcm_format == SNDRV_PCM_FORMAT_DSD_U16_LE &&
1838*4882a593Smuzhiyun subs->cur_audiofmt->dsd_dop)) {
1839*4882a593Smuzhiyun fill_playback_urb_dsd_dop(subs, urb, bytes);
1840*4882a593Smuzhiyun } else if (unlikely(subs->pcm_format == SNDRV_PCM_FORMAT_DSD_U8 &&
1841*4882a593Smuzhiyun subs->cur_audiofmt->dsd_bitrev)) {
1842*4882a593Smuzhiyun /* bit-reverse the bytes */
1843*4882a593Smuzhiyun u8 *buf = urb->transfer_buffer;
1844*4882a593Smuzhiyun for (i = 0; i < bytes; i++) {
1845*4882a593Smuzhiyun int idx = (subs->hwptr_done + i)
1846*4882a593Smuzhiyun % (runtime->buffer_size * stride);
1847*4882a593Smuzhiyun buf[i] = bitrev8(runtime->dma_area[idx]);
1848*4882a593Smuzhiyun }
1849*4882a593Smuzhiyun
1850*4882a593Smuzhiyun subs->hwptr_done += bytes;
1851*4882a593Smuzhiyun if (subs->hwptr_done >= runtime->buffer_size * stride)
1852*4882a593Smuzhiyun subs->hwptr_done -= runtime->buffer_size * stride;
1853*4882a593Smuzhiyun } else {
1854*4882a593Smuzhiyun /* usual PCM */
1855*4882a593Smuzhiyun if (!subs->tx_length_quirk)
1856*4882a593Smuzhiyun copy_to_urb(subs, urb, 0, stride, bytes);
1857*4882a593Smuzhiyun else
1858*4882a593Smuzhiyun bytes = copy_to_urb_quirk(subs, urb, stride, bytes);
1859*4882a593Smuzhiyun /* bytes is now amount of outgoing data */
1860*4882a593Smuzhiyun }
1861*4882a593Smuzhiyun
1862*4882a593Smuzhiyun /* update delay with exact number of samples queued */
1863*4882a593Smuzhiyun runtime->delay = subs->last_delay;
1864*4882a593Smuzhiyun runtime->delay += frames;
1865*4882a593Smuzhiyun subs->last_delay = runtime->delay;
1866*4882a593Smuzhiyun
1867*4882a593Smuzhiyun /* realign last_frame_number */
1868*4882a593Smuzhiyun subs->last_frame_number = usb_get_current_frame_number(subs->dev);
1869*4882a593Smuzhiyun subs->last_frame_number &= 0xFF; /* keep 8 LSBs */
1870*4882a593Smuzhiyun
1871*4882a593Smuzhiyun if (subs->trigger_tstamp_pending_update) {
1872*4882a593Smuzhiyun /* this is the first actual URB submitted,
1873*4882a593Smuzhiyun * update trigger timestamp to reflect actual start time
1874*4882a593Smuzhiyun */
1875*4882a593Smuzhiyun snd_pcm_gettime(runtime, &runtime->trigger_tstamp);
1876*4882a593Smuzhiyun subs->trigger_tstamp_pending_update = false;
1877*4882a593Smuzhiyun }
1878*4882a593Smuzhiyun
1879*4882a593Smuzhiyun spin_unlock_irqrestore(&subs->lock, flags);
1880*4882a593Smuzhiyun urb->transfer_buffer_length = bytes;
1881*4882a593Smuzhiyun if (period_elapsed)
1882*4882a593Smuzhiyun snd_pcm_period_elapsed(subs->pcm_substream);
1883*4882a593Smuzhiyun }
1884*4882a593Smuzhiyun
1885*4882a593Smuzhiyun /*
1886*4882a593Smuzhiyun * process after playback data complete
1887*4882a593Smuzhiyun * - decrease the delay count again
1888*4882a593Smuzhiyun */
retire_playback_urb(struct snd_usb_substream * subs,struct urb * urb)1889*4882a593Smuzhiyun static void retire_playback_urb(struct snd_usb_substream *subs,
1890*4882a593Smuzhiyun struct urb *urb)
1891*4882a593Smuzhiyun {
1892*4882a593Smuzhiyun unsigned long flags;
1893*4882a593Smuzhiyun struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
1894*4882a593Smuzhiyun struct snd_usb_endpoint *ep = subs->data_endpoint;
1895*4882a593Smuzhiyun int processed = urb->transfer_buffer_length / ep->stride;
1896*4882a593Smuzhiyun int est_delay;
1897*4882a593Smuzhiyun
1898*4882a593Smuzhiyun /* ignore the delay accounting when processed=0 is given, i.e.
1899*4882a593Smuzhiyun * silent payloads are processed before handling the actual data
1900*4882a593Smuzhiyun */
1901*4882a593Smuzhiyun if (!processed)
1902*4882a593Smuzhiyun return;
1903*4882a593Smuzhiyun
1904*4882a593Smuzhiyun spin_lock_irqsave(&subs->lock, flags);
1905*4882a593Smuzhiyun if (!subs->last_delay)
1906*4882a593Smuzhiyun goto out; /* short path */
1907*4882a593Smuzhiyun
1908*4882a593Smuzhiyun est_delay = snd_usb_pcm_delay(subs, runtime->rate);
1909*4882a593Smuzhiyun /* update delay with exact number of samples played */
1910*4882a593Smuzhiyun if (processed > subs->last_delay)
1911*4882a593Smuzhiyun subs->last_delay = 0;
1912*4882a593Smuzhiyun else
1913*4882a593Smuzhiyun subs->last_delay -= processed;
1914*4882a593Smuzhiyun runtime->delay = subs->last_delay;
1915*4882a593Smuzhiyun
1916*4882a593Smuzhiyun /*
1917*4882a593Smuzhiyun * Report when delay estimate is off by more than 2ms.
1918*4882a593Smuzhiyun * The error should be lower than 2ms since the estimate relies
1919*4882a593Smuzhiyun * on two reads of a counter updated every ms.
1920*4882a593Smuzhiyun */
1921*4882a593Smuzhiyun if (abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2)
1922*4882a593Smuzhiyun dev_dbg_ratelimited(&subs->dev->dev,
1923*4882a593Smuzhiyun "delay: estimated %d, actual %d\n",
1924*4882a593Smuzhiyun est_delay, subs->last_delay);
1925*4882a593Smuzhiyun
1926*4882a593Smuzhiyun if (!subs->running) {
1927*4882a593Smuzhiyun /* update last_frame_number for delay counting here since
1928*4882a593Smuzhiyun * prepare_playback_urb won't be called during pause
1929*4882a593Smuzhiyun */
1930*4882a593Smuzhiyun subs->last_frame_number =
1931*4882a593Smuzhiyun usb_get_current_frame_number(subs->dev) & 0xff;
1932*4882a593Smuzhiyun }
1933*4882a593Smuzhiyun
1934*4882a593Smuzhiyun out:
1935*4882a593Smuzhiyun spin_unlock_irqrestore(&subs->lock, flags);
1936*4882a593Smuzhiyun }
1937*4882a593Smuzhiyun
snd_usb_substream_playback_trigger(struct snd_pcm_substream * substream,int cmd)1938*4882a593Smuzhiyun static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substream,
1939*4882a593Smuzhiyun int cmd)
1940*4882a593Smuzhiyun {
1941*4882a593Smuzhiyun struct snd_usb_substream *subs = substream->runtime->private_data;
1942*4882a593Smuzhiyun
1943*4882a593Smuzhiyun switch (cmd) {
1944*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_START:
1945*4882a593Smuzhiyun subs->trigger_tstamp_pending_update = true;
1946*4882a593Smuzhiyun fallthrough;
1947*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1948*4882a593Smuzhiyun subs->data_endpoint->prepare_data_urb = prepare_playback_urb;
1949*4882a593Smuzhiyun subs->data_endpoint->retire_data_urb = retire_playback_urb;
1950*4882a593Smuzhiyun subs->running = 1;
1951*4882a593Smuzhiyun return 0;
1952*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_STOP:
1953*4882a593Smuzhiyun stop_endpoints(subs);
1954*4882a593Smuzhiyun subs->running = 0;
1955*4882a593Smuzhiyun return 0;
1956*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1957*4882a593Smuzhiyun subs->data_endpoint->prepare_data_urb = NULL;
1958*4882a593Smuzhiyun /* keep retire_data_urb for delay calculation */
1959*4882a593Smuzhiyun subs->data_endpoint->retire_data_urb = retire_playback_urb;
1960*4882a593Smuzhiyun subs->running = 0;
1961*4882a593Smuzhiyun return 0;
1962*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_SUSPEND:
1963*4882a593Smuzhiyun if (subs->stream->chip->setup_fmt_after_resume_quirk) {
1964*4882a593Smuzhiyun stop_endpoints(subs);
1965*4882a593Smuzhiyun subs->need_setup_fmt = true;
1966*4882a593Smuzhiyun return 0;
1967*4882a593Smuzhiyun }
1968*4882a593Smuzhiyun break;
1969*4882a593Smuzhiyun }
1970*4882a593Smuzhiyun
1971*4882a593Smuzhiyun return -EINVAL;
1972*4882a593Smuzhiyun }
1973*4882a593Smuzhiyun
snd_usb_substream_capture_trigger(struct snd_pcm_substream * substream,int cmd)1974*4882a593Smuzhiyun static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream,
1975*4882a593Smuzhiyun int cmd)
1976*4882a593Smuzhiyun {
1977*4882a593Smuzhiyun int err;
1978*4882a593Smuzhiyun struct snd_usb_substream *subs = substream->runtime->private_data;
1979*4882a593Smuzhiyun
1980*4882a593Smuzhiyun switch (cmd) {
1981*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_START:
1982*4882a593Smuzhiyun err = start_endpoints(subs);
1983*4882a593Smuzhiyun if (err < 0)
1984*4882a593Smuzhiyun return err;
1985*4882a593Smuzhiyun
1986*4882a593Smuzhiyun subs->data_endpoint->retire_data_urb = retire_capture_urb;
1987*4882a593Smuzhiyun subs->running = 1;
1988*4882a593Smuzhiyun return 0;
1989*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_STOP:
1990*4882a593Smuzhiyun stop_endpoints(subs);
1991*4882a593Smuzhiyun subs->data_endpoint->retire_data_urb = NULL;
1992*4882a593Smuzhiyun subs->running = 0;
1993*4882a593Smuzhiyun return 0;
1994*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1995*4882a593Smuzhiyun subs->data_endpoint->retire_data_urb = NULL;
1996*4882a593Smuzhiyun subs->running = 0;
1997*4882a593Smuzhiyun return 0;
1998*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1999*4882a593Smuzhiyun subs->data_endpoint->retire_data_urb = retire_capture_urb;
2000*4882a593Smuzhiyun subs->running = 1;
2001*4882a593Smuzhiyun return 0;
2002*4882a593Smuzhiyun case SNDRV_PCM_TRIGGER_SUSPEND:
2003*4882a593Smuzhiyun if (subs->stream->chip->setup_fmt_after_resume_quirk) {
2004*4882a593Smuzhiyun stop_endpoints(subs);
2005*4882a593Smuzhiyun subs->need_setup_fmt = true;
2006*4882a593Smuzhiyun return 0;
2007*4882a593Smuzhiyun }
2008*4882a593Smuzhiyun break;
2009*4882a593Smuzhiyun }
2010*4882a593Smuzhiyun
2011*4882a593Smuzhiyun return -EINVAL;
2012*4882a593Smuzhiyun }
2013*4882a593Smuzhiyun
2014*4882a593Smuzhiyun static const struct snd_pcm_ops snd_usb_playback_ops = {
2015*4882a593Smuzhiyun .open = snd_usb_pcm_open,
2016*4882a593Smuzhiyun .close = snd_usb_pcm_close,
2017*4882a593Smuzhiyun .hw_params = snd_usb_hw_params,
2018*4882a593Smuzhiyun .hw_free = snd_usb_hw_free,
2019*4882a593Smuzhiyun .prepare = snd_usb_pcm_prepare,
2020*4882a593Smuzhiyun .trigger = snd_usb_substream_playback_trigger,
2021*4882a593Smuzhiyun .sync_stop = snd_usb_pcm_sync_stop,
2022*4882a593Smuzhiyun .pointer = snd_usb_pcm_pointer,
2023*4882a593Smuzhiyun };
2024*4882a593Smuzhiyun
2025*4882a593Smuzhiyun static const struct snd_pcm_ops snd_usb_capture_ops = {
2026*4882a593Smuzhiyun .open = snd_usb_pcm_open,
2027*4882a593Smuzhiyun .close = snd_usb_pcm_close,
2028*4882a593Smuzhiyun .hw_params = snd_usb_hw_params,
2029*4882a593Smuzhiyun .hw_free = snd_usb_hw_free,
2030*4882a593Smuzhiyun .prepare = snd_usb_pcm_prepare,
2031*4882a593Smuzhiyun .trigger = snd_usb_substream_capture_trigger,
2032*4882a593Smuzhiyun .sync_stop = snd_usb_pcm_sync_stop,
2033*4882a593Smuzhiyun .pointer = snd_usb_pcm_pointer,
2034*4882a593Smuzhiyun };
2035*4882a593Smuzhiyun
snd_usb_set_pcm_ops(struct snd_pcm * pcm,int stream)2036*4882a593Smuzhiyun void snd_usb_set_pcm_ops(struct snd_pcm *pcm, int stream)
2037*4882a593Smuzhiyun {
2038*4882a593Smuzhiyun const struct snd_pcm_ops *ops;
2039*4882a593Smuzhiyun
2040*4882a593Smuzhiyun ops = stream == SNDRV_PCM_STREAM_PLAYBACK ?
2041*4882a593Smuzhiyun &snd_usb_playback_ops : &snd_usb_capture_ops;
2042*4882a593Smuzhiyun snd_pcm_set_ops(pcm, stream, ops);
2043*4882a593Smuzhiyun }
2044*4882a593Smuzhiyun
snd_usb_preallocate_buffer(struct snd_usb_substream * subs)2045*4882a593Smuzhiyun void snd_usb_preallocate_buffer(struct snd_usb_substream *subs)
2046*4882a593Smuzhiyun {
2047*4882a593Smuzhiyun struct snd_pcm *pcm = subs->stream->pcm;
2048*4882a593Smuzhiyun struct snd_pcm_substream *s = pcm->streams[subs->direction].substream;
2049*4882a593Smuzhiyun struct device *dev = subs->dev->bus->sysdev;
2050*4882a593Smuzhiyun
2051*4882a593Smuzhiyun if (snd_usb_use_vmalloc)
2052*4882a593Smuzhiyun snd_pcm_set_managed_buffer(s, SNDRV_DMA_TYPE_VMALLOC,
2053*4882a593Smuzhiyun NULL, 0, 0);
2054*4882a593Smuzhiyun else
2055*4882a593Smuzhiyun snd_pcm_set_managed_buffer(s, SNDRV_DMA_TYPE_DEV_SG,
2056*4882a593Smuzhiyun dev, 64*1024, 512*1024);
2057*4882a593Smuzhiyun }
2058