1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Clock domain and sample rate management functions
6 #include <linux/bitops.h>
7 #include <linux/init.h>
8 #include <linux/string.h>
10 #include <linux/usb/audio.h>
11 #include <linux/usb/audio-v2.h>
12 #include <linux/usb/audio-v3.h>
14 #include <sound/core.h>
15 #include <sound/info.h>
16 #include <sound/pcm.h>
24 union uac23_clock_source_desc
{
25 struct uac_clock_source_descriptor v2
;
26 struct uac3_clock_source_descriptor v3
;
29 union uac23_clock_selector_desc
{
30 struct uac_clock_selector_descriptor v2
;
31 struct uac3_clock_selector_descriptor v3
;
34 union uac23_clock_multiplier_desc
{
35 struct uac_clock_multiplier_descriptor v2
;
36 struct uac_clock_multiplier_descriptor v3
;
39 /* check whether the descriptor bLength has the minimal length */
40 #define DESC_LENGTH_CHECK(p, proto) \
41 ((proto) == UAC_VERSION_3 ? \
42 ((p)->v3.bLength >= sizeof((p)->v3)) : \
43 ((p)->v2.bLength >= sizeof((p)->v2)))
45 #define GET_VAL(p, proto, field) \
46 ((proto) == UAC_VERSION_3 ? (p)->v3.field : (p)->v2.field)
48 static void *find_uac_clock_desc(struct usb_host_interface
*iface
, int id
,
49 bool (*validator
)(void *, int, int),
54 while ((cs
= snd_usb_find_csint_desc(iface
->extra
, iface
->extralen
,
56 if (validator(cs
, id
, proto
))
63 static bool validate_clock_source(void *p
, int id
, int proto
)
65 union uac23_clock_source_desc
*cs
= p
;
67 if (!DESC_LENGTH_CHECK(cs
, proto
))
69 return GET_VAL(cs
, proto
, bClockID
) == id
;
72 static bool validate_clock_selector(void *p
, int id
, int proto
)
74 union uac23_clock_selector_desc
*cs
= p
;
76 if (!DESC_LENGTH_CHECK(cs
, proto
))
78 if (GET_VAL(cs
, proto
, bClockID
) != id
)
80 /* additional length check for baCSourceID array (in bNrInPins size)
81 * and two more fields (which sizes depend on the protocol)
83 if (proto
== UAC_VERSION_3
)
84 return cs
->v3
.bLength
>= sizeof(cs
->v3
) + cs
->v3
.bNrInPins
+
85 4 /* bmControls */ + 2 /* wCSelectorDescrStr */;
87 return cs
->v2
.bLength
>= sizeof(cs
->v2
) + cs
->v2
.bNrInPins
+
88 1 /* bmControls */ + 1 /* iClockSelector */;
91 static bool validate_clock_multiplier(void *p
, int id
, int proto
)
93 union uac23_clock_multiplier_desc
*cs
= p
;
95 if (!DESC_LENGTH_CHECK(cs
, proto
))
97 return GET_VAL(cs
, proto
, bClockID
) == id
;
100 #define DEFINE_FIND_HELPER(name, obj, validator, type2, type3) \
101 static obj *name(struct snd_usb_audio *chip, int id, \
102 const struct audioformat *fmt) \
104 struct usb_host_interface *ctrl_intf = \
105 snd_usb_find_ctrl_interface(chip, fmt->iface); \
106 return find_uac_clock_desc(ctrl_intf, id, validator, \
107 fmt->protocol == UAC_VERSION_3 ? (type3) : (type2), \
111 DEFINE_FIND_HELPER(snd_usb_find_clock_source
,
112 union uac23_clock_source_desc
, validate_clock_source
,
113 UAC2_CLOCK_SOURCE
, UAC3_CLOCK_SOURCE
);
114 DEFINE_FIND_HELPER(snd_usb_find_clock_selector
,
115 union uac23_clock_selector_desc
, validate_clock_selector
,
116 UAC2_CLOCK_SELECTOR
, UAC3_CLOCK_SELECTOR
);
117 DEFINE_FIND_HELPER(snd_usb_find_clock_multiplier
,
118 union uac23_clock_multiplier_desc
, validate_clock_multiplier
,
119 UAC2_CLOCK_MULTIPLIER
, UAC3_CLOCK_MULTIPLIER
);
121 static int uac_clock_selector_get_val(struct snd_usb_audio
*chip
,
122 int selector_id
, int iface_no
)
124 struct usb_host_interface
*ctrl_intf
;
128 ctrl_intf
= snd_usb_find_ctrl_interface(chip
, iface_no
);
129 ret
= snd_usb_ctl_msg(chip
->dev
, usb_rcvctrlpipe(chip
->dev
, 0),
131 USB_RECIP_INTERFACE
| USB_TYPE_CLASS
| USB_DIR_IN
,
132 UAC2_CX_CLOCK_SELECTOR
<< 8,
133 snd_usb_ctrl_intf(ctrl_intf
) | (selector_id
<< 8),
142 static int uac_clock_selector_set_val(struct snd_usb_audio
*chip
,
143 int selector_id
, unsigned char pin
, int iface_no
)
145 struct usb_host_interface
*ctrl_intf
;
148 ctrl_intf
= snd_usb_find_ctrl_interface(chip
, iface_no
);
149 ret
= snd_usb_ctl_msg(chip
->dev
, usb_sndctrlpipe(chip
->dev
, 0),
151 USB_RECIP_INTERFACE
| USB_TYPE_CLASS
| USB_DIR_OUT
,
152 UAC2_CX_CLOCK_SELECTOR
<< 8,
153 snd_usb_ctrl_intf(ctrl_intf
) | (selector_id
<< 8),
158 if (ret
!= sizeof(pin
)) {
160 "setting selector (id %d) unexpected length %d\n",
165 ret
= uac_clock_selector_get_val(chip
, selector_id
, iface_no
);
171 "setting selector (id %d) to %x failed (current: %d)\n",
172 selector_id
, pin
, ret
);
179 static bool uac_clock_source_is_valid_quirk(struct snd_usb_audio
*chip
,
180 const struct audioformat
*fmt
,
186 struct usb_device
*dev
= chip
->dev
;
187 union uac23_clock_source_desc
*cs_desc
;
188 struct usb_host_interface
*ctrl_intf
;
190 ctrl_intf
= snd_usb_find_ctrl_interface(chip
, fmt
->iface
);
191 cs_desc
= snd_usb_find_clock_source(chip
, source_id
, fmt
);
195 if (fmt
->protocol
== UAC_VERSION_2
) {
197 * Assume the clock is valid if clock source supports only one
198 * single sample rate, the terminal is connected directly to it
199 * (there is no clock selector) and clock type is internal.
200 * This is to deal with some Denon DJ controllers that always
201 * reports that clock is invalid.
203 if (fmt
->nr_rates
== 1 &&
204 (fmt
->clock
& 0xff) == cs_desc
->v2
.bClockID
&&
205 (cs_desc
->v2
.bmAttributes
& 0x3) !=
206 UAC_CLOCK_SOURCE_TYPE_EXT
)
212 * Sample rate changes takes more than 2 seconds for this device. Clock
213 * validity request returns false during that period.
215 if (chip
->usb_id
== USB_ID(0x07fd, 0x0004)) {
218 while ((!ret
) && (count
< 50)) {
223 err
= snd_usb_ctl_msg(dev
, usb_rcvctrlpipe(dev
, 0), UAC2_CS_CUR
,
224 USB_TYPE_CLASS
| USB_RECIP_INTERFACE
| USB_DIR_IN
,
225 UAC2_CS_CONTROL_CLOCK_VALID
<< 8,
226 snd_usb_ctrl_intf(ctrl_intf
) | (source_id
<< 8),
227 &data
, sizeof(data
));
230 "%s(): cannot get clock validity for id %d\n",
231 __func__
, source_id
);
243 static bool uac_clock_source_is_valid(struct snd_usb_audio
*chip
,
244 const struct audioformat
*fmt
,
249 struct usb_device
*dev
= chip
->dev
;
251 union uac23_clock_source_desc
*cs_desc
;
252 struct usb_host_interface
*ctrl_intf
;
254 ctrl_intf
= snd_usb_find_ctrl_interface(chip
, fmt
->iface
);
255 cs_desc
= snd_usb_find_clock_source(chip
, source_id
, fmt
);
259 if (fmt
->protocol
== UAC_VERSION_3
)
260 bmControls
= le32_to_cpu(cs_desc
->v3
.bmControls
);
262 bmControls
= cs_desc
->v2
.bmControls
;
264 /* If a clock source can't tell us whether it's valid, we assume it is */
265 if (!uac_v2v3_control_is_readable(bmControls
,
266 UAC2_CS_CONTROL_CLOCK_VALID
))
269 err
= snd_usb_ctl_msg(dev
, usb_rcvctrlpipe(dev
, 0), UAC2_CS_CUR
,
270 USB_TYPE_CLASS
| USB_RECIP_INTERFACE
| USB_DIR_IN
,
271 UAC2_CS_CONTROL_CLOCK_VALID
<< 8,
272 snd_usb_ctrl_intf(ctrl_intf
) | (source_id
<< 8),
273 &data
, sizeof(data
));
277 "%s(): cannot get clock validity for id %d\n",
278 __func__
, source_id
);
285 return uac_clock_source_is_valid_quirk(chip
, fmt
, source_id
);
288 static int __uac_clock_find_source(struct snd_usb_audio
*chip
,
289 const struct audioformat
*fmt
, int entity_id
,
290 unsigned long *visited
, bool validate
)
292 union uac23_clock_source_desc
*source
;
293 union uac23_clock_selector_desc
*selector
;
294 union uac23_clock_multiplier_desc
*multiplier
;
295 int ret
, i
, cur
, err
, pins
, clock_id
;
297 int proto
= fmt
->protocol
;
298 bool readable
, writeable
;
303 if (test_and_set_bit(entity_id
, visited
)) {
305 "%s(): recursive clock topology detected, id %d.\n",
306 __func__
, entity_id
);
310 /* first, see if the ID we're looking at is a clock source already */
311 source
= snd_usb_find_clock_source(chip
, entity_id
, fmt
);
313 entity_id
= GET_VAL(source
, proto
, bClockID
);
314 if (validate
&& !uac_clock_source_is_valid(chip
, fmt
,
317 "clock source %d is not valid, cannot use\n",
324 selector
= snd_usb_find_clock_selector(chip
, entity_id
, fmt
);
326 pins
= GET_VAL(selector
, proto
, bNrInPins
);
327 clock_id
= GET_VAL(selector
, proto
, bClockID
);
328 sources
= GET_VAL(selector
, proto
, baCSourceID
);
331 if (proto
== UAC_VERSION_3
)
332 bmControls
= le32_to_cpu(*(__le32
*)(&selector
->v3
.baCSourceID
[0] + pins
));
334 bmControls
= *(__u8
*)(&selector
->v2
.baCSourceID
[0] + pins
);
336 readable
= uac_v2v3_control_is_readable(bmControls
,
337 UAC2_CX_CLOCK_SELECTOR
);
338 writeable
= uac_v2v3_control_is_writeable(bmControls
,
339 UAC2_CX_CLOCK_SELECTOR
);
346 /* for now just warn about buggy device */
349 "%s(): clock selector control is not readable, id %d\n",
352 /* the entity ID we are looking at is a selector.
353 * find out what it currently selects */
354 ret
= uac_clock_selector_get_val(chip
, clock_id
, fmt
->iface
);
356 if (!chip
->autoclock
)
361 /* Selector values are one-based */
363 if (ret
> pins
|| ret
< 1) {
365 "%s(): selector reported illegal value, id %d, ret %d\n",
366 __func__
, clock_id
, ret
);
368 if (!chip
->autoclock
)
375 ret
= __uac_clock_find_source(chip
, fmt
,
379 /* Skip setting clock selector again for some devices */
380 if (chip
->quirk_flags
& QUIRK_FLAG_SKIP_CLOCK_SELECTOR
||
383 err
= uac_clock_selector_set_val(chip
, entity_id
, cur
, fmt
->iface
);
387 "%s(): selector returned an error, "
388 "assuming a firmware bug, id %d, ret %d\n",
389 __func__
, clock_id
, err
);
396 if (!validate
|| ret
> 0 || !chip
->autoclock
)
403 /* The current clock source is invalid, try others. */
404 for (i
= 1; i
<= pins
; i
++) {
408 ret
= __uac_clock_find_source(chip
, fmt
,
414 err
= uac_clock_selector_set_val(chip
, entity_id
, i
, fmt
->iface
);
419 "found and selected valid clock source %d\n",
427 /* FIXME: multipliers only act as pass-thru element for now */
428 multiplier
= snd_usb_find_clock_multiplier(chip
, entity_id
, fmt
);
430 return __uac_clock_find_source(chip
, fmt
,
431 GET_VAL(multiplier
, proto
, bCSourceID
),
438 * For all kinds of sample rate settings and other device queries,
439 * the clock source (end-leaf) must be used. However, clock selectors,
440 * clock multipliers and sample rate converters may be specified as
441 * clock source input to terminal. This functions walks the clock path
442 * to its end and tries to find the source.
444 * The 'visited' bitfield is used internally to detect recursive loops.
446 * Returns the clock source UnitID (>=0) on success, or an error.
448 int snd_usb_clock_find_source(struct snd_usb_audio
*chip
,
449 const struct audioformat
*fmt
, bool validate
)
451 DECLARE_BITMAP(visited
, 256);
452 memset(visited
, 0, sizeof(visited
));
454 switch (fmt
->protocol
) {
457 return __uac_clock_find_source(chip
, fmt
, fmt
->clock
, visited
,
464 static int set_sample_rate_v1(struct snd_usb_audio
*chip
,
465 const struct audioformat
*fmt
, int rate
)
467 struct usb_device
*dev
= chip
->dev
;
468 unsigned char data
[3];
471 /* if endpoint doesn't have sampling rate control, bail out */
472 if (!(fmt
->attributes
& UAC_EP_CS_ATTR_SAMPLE_RATE
))
477 data
[2] = rate
>> 16;
478 err
= snd_usb_ctl_msg(dev
, usb_sndctrlpipe(dev
, 0), UAC_SET_CUR
,
479 USB_TYPE_CLASS
| USB_RECIP_ENDPOINT
| USB_DIR_OUT
,
480 UAC_EP_CS_ATTR_SAMPLE_RATE
<< 8,
481 fmt
->endpoint
, data
, sizeof(data
));
483 dev_err(&dev
->dev
, "%d:%d: cannot set freq %d to ep %#x\n",
484 fmt
->iface
, fmt
->altsetting
, rate
, fmt
->endpoint
);
488 /* Don't check the sample rate for devices which we know don't
490 if (chip
->quirk_flags
& QUIRK_FLAG_GET_SAMPLE_RATE
)
492 /* the firmware is likely buggy, don't repeat to fail too many times */
493 if (chip
->sample_rate_read_error
> 2)
496 err
= snd_usb_ctl_msg(dev
, usb_rcvctrlpipe(dev
, 0), UAC_GET_CUR
,
497 USB_TYPE_CLASS
| USB_RECIP_ENDPOINT
| USB_DIR_IN
,
498 UAC_EP_CS_ATTR_SAMPLE_RATE
<< 8,
499 fmt
->endpoint
, data
, sizeof(data
));
501 dev_err(&dev
->dev
, "%d:%d: cannot get freq at ep %#x\n",
502 fmt
->iface
, fmt
->altsetting
, fmt
->endpoint
);
503 chip
->sample_rate_read_error
++;
504 return 0; /* some devices don't support reading */
507 crate
= data
[0] | (data
[1] << 8) | (data
[2] << 16);
509 dev_info(&dev
->dev
, "failed to read current rate; disabling the check\n");
510 chip
->sample_rate_read_error
= 3; /* three strikes, see above */
515 dev_warn(&dev
->dev
, "current rate %d is different from the runtime rate %d\n", crate
, rate
);
516 // runtime->rate = crate;
522 static int get_sample_rate_v2v3(struct snd_usb_audio
*chip
, int iface
,
523 int altsetting
, int clock
)
525 struct usb_device
*dev
= chip
->dev
;
528 struct usb_host_interface
*ctrl_intf
;
530 ctrl_intf
= snd_usb_find_ctrl_interface(chip
, iface
);
531 err
= snd_usb_ctl_msg(dev
, usb_rcvctrlpipe(dev
, 0), UAC2_CS_CUR
,
532 USB_TYPE_CLASS
| USB_RECIP_INTERFACE
| USB_DIR_IN
,
533 UAC2_CS_CONTROL_SAM_FREQ
<< 8,
534 snd_usb_ctrl_intf(ctrl_intf
) | (clock
<< 8),
535 &data
, sizeof(data
));
537 dev_warn(&dev
->dev
, "%d:%d: cannot get freq (v2/v3): err %d\n",
538 iface
, altsetting
, err
);
542 return le32_to_cpu(data
);
546 * Try to set the given sample rate:
548 * Return 0 if the clock source is read-only, the actual rate on success,
549 * or a negative error code.
551 * This function gets called from format.c to validate each sample rate, too.
552 * Hence no message is shown upon error
554 int snd_usb_set_sample_rate_v2v3(struct snd_usb_audio
*chip
,
555 const struct audioformat
*fmt
,
562 union uac23_clock_source_desc
*cs_desc
;
563 struct usb_host_interface
*ctrl_intf
;
565 ctrl_intf
= snd_usb_find_ctrl_interface(chip
, fmt
->iface
);
566 cs_desc
= snd_usb_find_clock_source(chip
, clock
, fmt
);
571 if (fmt
->protocol
== UAC_VERSION_3
)
572 bmControls
= le32_to_cpu(cs_desc
->v3
.bmControls
);
574 bmControls
= cs_desc
->v2
.bmControls
;
576 writeable
= uac_v2v3_control_is_writeable(bmControls
,
577 UAC2_CS_CONTROL_SAM_FREQ
);
581 data
= cpu_to_le32(rate
);
582 err
= snd_usb_ctl_msg(chip
->dev
, usb_sndctrlpipe(chip
->dev
, 0), UAC2_CS_CUR
,
583 USB_TYPE_CLASS
| USB_RECIP_INTERFACE
| USB_DIR_OUT
,
584 UAC2_CS_CONTROL_SAM_FREQ
<< 8,
585 snd_usb_ctrl_intf(ctrl_intf
) | (clock
<< 8),
586 &data
, sizeof(data
));
590 return get_sample_rate_v2v3(chip
, fmt
->iface
, fmt
->altsetting
, clock
);
593 static int set_sample_rate_v2v3(struct snd_usb_audio
*chip
,
594 const struct audioformat
*fmt
, int rate
)
596 int cur_rate
, prev_rate
;
599 /* First, try to find a valid clock. This may trigger
600 * automatic clock selection if the current clock is not
603 clock
= snd_usb_clock_find_source(chip
, fmt
, true);
605 /* We did not find a valid clock, but that might be
606 * because the current sample rate does not match an
607 * external clock source. Try again without validation
608 * and we will do another validation after setting the
611 clock
= snd_usb_clock_find_source(chip
, fmt
, false);
613 /* Hardcoded sample rates */
614 if (chip
->quirk_flags
& QUIRK_FLAG_IGNORE_CLOCK_SOURCE
)
621 prev_rate
= get_sample_rate_v2v3(chip
, fmt
->iface
, fmt
->altsetting
, clock
);
622 if (prev_rate
== rate
)
625 cur_rate
= snd_usb_set_sample_rate_v2v3(chip
, fmt
, clock
, rate
);
628 "%d:%d: cannot set freq %d (v2/v3): err %d\n",
629 fmt
->iface
, fmt
->altsetting
, rate
, cur_rate
);
634 cur_rate
= prev_rate
;
636 if (cur_rate
!= rate
) {
638 "%d:%d: freq mismatch: req %d, clock runs @%d\n",
639 fmt
->iface
, fmt
->altsetting
, rate
, cur_rate
);
640 /* continue processing */
643 /* FIXME - TEAC devices require the immediate interface setup */
644 if (USB_ID_VENDOR(chip
->usb_id
) == 0x0644) {
645 bool cur_base_48k
= (rate
% 48000 == 0);
646 bool prev_base_48k
= (prev_rate
% 48000 == 0);
647 if (cur_base_48k
!= prev_base_48k
) {
648 usb_set_interface(chip
->dev
, fmt
->iface
, fmt
->altsetting
);
649 if (chip
->quirk_flags
& QUIRK_FLAG_IFACE_DELAY
)
655 /* validate clock after rate change */
656 if (!uac_clock_source_is_valid(chip
, fmt
, clock
))
661 int snd_usb_init_sample_rate(struct snd_usb_audio
*chip
,
662 const struct audioformat
*fmt
, int rate
)
664 usb_audio_dbg(chip
, "%d:%d Set sample rate %d, clock %d\n",
665 fmt
->iface
, fmt
->altsetting
, rate
, fmt
->clock
);
667 switch (fmt
->protocol
) {
670 return set_sample_rate_v1(chip
, fmt
, rate
);
673 if (chip
->badd_profile
>= UAC3_FUNCTION_SUBCLASS_GENERIC_IO
) {
674 if (rate
!= UAC3_BADD_SAMPLING_RATE
)
681 return set_sample_rate_v2v3(chip
, fmt
, rate
);