Update Linux kernel release to v7.2.8-2 for base and BORE kernels
Signed-off-by: Krzysztof Wilczyński <kwilczynski@omarchy.org>
This commit is contained in:
524 files changed
+147294
-88760
No files matched your search
@@ -0,0 +1,432 @@
|
||||
diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
|
||||
--- a/sound/hda/codecs/realtek/alc269.c
|
||||
+++ b/sound/hda/codecs/realtek/alc269.c
|
||||
@@ -7465,6 +7465,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x887c, "HP Laptop 14s-fq1xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
|
||||
SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
|
||||
SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
+ SND_PCI_QUIRK(0x103c, 0x8890, "HP Elite Dragonfly Max G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
|
||||
@@ -7580,6 +7581,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
|
||||
+ SND_PCI_QUIRK(0x103c, 0x8ba9, "HP Omen 16-wd0xxx", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x103c, 0x8bb6, "HP Laptop 15-fd0039nt", ALC236_FIXUP_HP_15_FD0XXX),
|
||||
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c
|
||||
--- a/sound/pci/rme9652/hdspm.c
|
||||
+++ b/sound/pci/rme9652/hdspm.c
|
||||
@@ -1071,14 +1071,8 @@ struct hdspm {
|
||||
|
||||
|
||||
static const struct pci_device_id snd_hdspm_ids[] = {
|
||||
- {
|
||||
- .vendor = PCI_VENDOR_ID_XILINX,
|
||||
- .device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI,
|
||||
- .subvendor = PCI_ANY_ID,
|
||||
- .subdevice = PCI_ANY_ID,
|
||||
- .class = 0,
|
||||
- .class_mask = 0,
|
||||
- .driver_data = 0},
|
||||
+ { PCI_DEVICE(PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP_MADI) },
|
||||
+ { PCI_DEVICE(0x1d18, 0x3fc6) }, /* RME HDSPe AIO PCI express audio */
|
||||
{0,}
|
||||
};
|
||||
|
||||
diff --git a/sound/usb/hiface/pcm.c b/sound/usb/hiface/pcm.c
|
||||
--- a/sound/usb/hiface/pcm.c
|
||||
+++ b/sound/usb/hiface/pcm.c
|
||||
@@ -24,7 +24,7 @@
|
||||
struct pcm_urb {
|
||||
struct hiface_chip *chip;
|
||||
|
||||
- struct urb instance;
|
||||
+ struct urb *instance;
|
||||
struct usb_anchor submitted;
|
||||
u8 *buffer;
|
||||
};
|
||||
@@ -193,7 +193,7 @@ static void hiface_pcm_stream_stop(struct pcm_runtime *rt)
|
||||
if (!time)
|
||||
usb_kill_anchored_urbs(
|
||||
&rt->out_urbs[i].submitted);
|
||||
- usb_kill_urb(&rt->out_urbs[i].instance);
|
||||
+ usb_kill_urb(rt->out_urbs[i].instance);
|
||||
}
|
||||
|
||||
rt->stream_state = STREAM_DISABLED;
|
||||
@@ -215,9 +215,9 @@ static int hiface_pcm_stream_start(struct pcm_runtime *rt)
|
||||
rt->stream_state = STREAM_STARTING;
|
||||
for (i = 0; i < PCM_N_URBS; i++) {
|
||||
memset(rt->out_urbs[i].buffer, 0, PCM_PACKET_SIZE);
|
||||
- usb_anchor_urb(&rt->out_urbs[i].instance,
|
||||
+ usb_anchor_urb(rt->out_urbs[i].instance,
|
||||
&rt->out_urbs[i].submitted);
|
||||
- ret = usb_submit_urb(&rt->out_urbs[i].instance,
|
||||
+ ret = usb_submit_urb(rt->out_urbs[i].instance,
|
||||
GFP_ATOMIC);
|
||||
if (ret) {
|
||||
hiface_pcm_stream_stop(rt);
|
||||
@@ -334,7 +334,7 @@ static void hiface_pcm_out_urb_handler(struct urb *usb_urb)
|
||||
if (do_period_elapsed)
|
||||
snd_pcm_period_elapsed(sub->instance);
|
||||
|
||||
- ret = usb_submit_urb(&out_urb->instance, GFP_ATOMIC);
|
||||
+ ret = usb_submit_urb(out_urb->instance, GFP_ATOMIC);
|
||||
if (ret < 0)
|
||||
goto out_fail;
|
||||
|
||||
@@ -492,16 +492,18 @@ static int hiface_pcm_init_urb(struct pcm_urb *urb,
|
||||
void (*handler)(struct urb *))
|
||||
{
|
||||
urb->chip = chip;
|
||||
- usb_init_urb(&urb->instance);
|
||||
+ urb->instance = usb_alloc_urb(0, GFP_KERNEL);
|
||||
+ if (!urb->instance)
|
||||
+ return -ENOMEM;
|
||||
|
||||
urb->buffer = kzalloc(PCM_PACKET_SIZE, GFP_KERNEL);
|
||||
if (!urb->buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
- usb_fill_bulk_urb(&urb->instance, chip->dev,
|
||||
+ usb_fill_bulk_urb(urb->instance, chip->dev,
|
||||
usb_sndbulkpipe(chip->dev, ep), (void *)urb->buffer,
|
||||
PCM_PACKET_SIZE, handler, urb);
|
||||
- if (usb_urb_ep_type_check(&urb->instance))
|
||||
+ if (usb_urb_ep_type_check(urb->instance))
|
||||
return -EINVAL;
|
||||
init_usb_anchor(&urb->submitted);
|
||||
|
||||
@@ -520,24 +522,26 @@ void hiface_pcm_abort(struct hiface_chip *chip)
|
||||
}
|
||||
}
|
||||
|
||||
-static void hiface_pcm_destroy(struct hiface_chip *chip)
|
||||
+static void hiface_pcm_destroy(struct pcm_runtime *rt)
|
||||
{
|
||||
- struct pcm_runtime *rt = chip->pcm;
|
||||
int i;
|
||||
|
||||
- for (i = 0; i < PCM_N_URBS; i++)
|
||||
- kfree(rt->out_urbs[i].buffer);
|
||||
+ if (!rt)
|
||||
+ return;
|
||||
|
||||
- kfree(chip->pcm);
|
||||
- chip->pcm = NULL;
|
||||
+ if (rt->chip)
|
||||
+ rt->chip->pcm = NULL;
|
||||
+
|
||||
+ for (i = 0; i < PCM_N_URBS; i++) {
|
||||
+ usb_free_urb(rt->out_urbs[i].instance);
|
||||
+ kfree(rt->out_urbs[i].buffer);
|
||||
+ }
|
||||
+ kfree(rt);
|
||||
}
|
||||
|
||||
static void hiface_pcm_free(struct snd_pcm *pcm)
|
||||
{
|
||||
- struct pcm_runtime *rt = pcm->private_data;
|
||||
-
|
||||
- if (rt)
|
||||
- hiface_pcm_destroy(rt->chip);
|
||||
+ hiface_pcm_destroy(pcm->private_data);
|
||||
}
|
||||
|
||||
int hiface_pcm_init(struct hiface_chip *chip, u8 extra_freq)
|
||||
@@ -587,8 +591,6 @@ int hiface_pcm_init(struct hiface_chip *chip, u8 extra_freq)
|
||||
return 0;
|
||||
|
||||
error:
|
||||
- for (i = 0; i < PCM_N_URBS; i++)
|
||||
- kfree(rt->out_urbs[i].buffer);
|
||||
- kfree(rt);
|
||||
+ hiface_pcm_destroy(rt);
|
||||
return ret;
|
||||
}
|
||||
diff --git a/sound/usb/misc/ua101.c b/sound/usb/misc/ua101.c
|
||||
--- a/sound/usb/misc/ua101.c
|
||||
+++ b/sound/usb/misc/ua101.c
|
||||
@@ -109,10 +109,10 @@ struct ua101 {
|
||||
unsigned int buffer_pos;
|
||||
unsigned int queue_length;
|
||||
struct ua101_urb {
|
||||
- struct urb urb;
|
||||
- struct usb_iso_packet_descriptor iso_frame_desc[1];
|
||||
+ struct urb *urb;
|
||||
struct list_head ready_list;
|
||||
- } *urbs[MAX_QUEUE_LENGTH];
|
||||
+ struct ua101 *ua;
|
||||
+ } urbs[MAX_QUEUE_LENGTH];
|
||||
struct {
|
||||
unsigned int size;
|
||||
void *addr;
|
||||
@@ -167,15 +167,15 @@ static void abort_usb_playback(struct ua101 *ua)
|
||||
wake_up(&ua->alsa_playback_wait);
|
||||
}
|
||||
|
||||
-static void playback_urb_complete(struct urb *usb_urb)
|
||||
+static void playback_urb_complete(struct urb *urb)
|
||||
{
|
||||
- struct ua101_urb *urb = (struct ua101_urb *)usb_urb;
|
||||
- struct ua101 *ua = urb->urb.context;
|
||||
+ struct ua101_urb *ua_urb = urb->context;
|
||||
+ struct ua101 *ua = ua_urb->ua;
|
||||
|
||||
- if (unlikely(urb->urb.status == -ENOENT || /* unlinked */
|
||||
- urb->urb.status == -ENODEV || /* device removed */
|
||||
- urb->urb.status == -ECONNRESET || /* unlinked */
|
||||
- urb->urb.status == -ESHUTDOWN)) { /* device disabled */
|
||||
+ if (unlikely(urb->status == -ENOENT || /* unlinked */
|
||||
+ urb->status == -ENODEV || /* device removed */
|
||||
+ urb->status == -ECONNRESET || /* unlinked */
|
||||
+ urb->status == -ESHUTDOWN)) { /* device disabled */
|
||||
abort_usb_playback(ua);
|
||||
abort_alsa_playback(ua);
|
||||
return;
|
||||
@@ -184,18 +184,19 @@ static void playback_urb_complete(struct urb *usb_urb)
|
||||
if (test_bit(USB_PLAYBACK_RUNNING, &ua->states)) {
|
||||
/* append URB to FIFO */
|
||||
guard(spinlock_irqsave)(&ua->lock);
|
||||
- list_add_tail(&urb->ready_list, &ua->ready_playback_urbs);
|
||||
+ list_add_tail(&ua_urb->ready_list, &ua->ready_playback_urbs);
|
||||
if (ua->rate_feedback_count > 0)
|
||||
queue_work(system_highpri_wq, &ua->playback_work);
|
||||
ua->playback.substream->runtime->delay -=
|
||||
- urb->urb.iso_frame_desc[0].length /
|
||||
+ urb->iso_frame_desc[0].length /
|
||||
ua->playback.frame_bytes;
|
||||
}
|
||||
}
|
||||
|
||||
static void first_playback_urb_complete(struct urb *urb)
|
||||
{
|
||||
- struct ua101 *ua = urb->context;
|
||||
+ struct ua101_urb *ua_urb = urb->context;
|
||||
+ struct ua101 *ua = ua_urb->ua;
|
||||
|
||||
urb->complete = playback_urb_complete;
|
||||
playback_urb_complete(urb);
|
||||
@@ -248,7 +249,8 @@ static void playback_work(struct work_struct *work)
|
||||
{
|
||||
struct ua101 *ua = container_of(work, struct ua101, playback_work);
|
||||
unsigned int frames;
|
||||
- struct ua101_urb *urb;
|
||||
+ struct ua101_urb *ua_urb;
|
||||
+ struct urb *urb;
|
||||
bool do_period_elapsed = false;
|
||||
int err;
|
||||
|
||||
@@ -275,23 +277,24 @@ static void playback_work(struct work_struct *work)
|
||||
ua->rate_feedback_count--;
|
||||
|
||||
/* take URB out of FIFO */
|
||||
- urb = list_first_entry(&ua->ready_playback_urbs,
|
||||
- struct ua101_urb, ready_list);
|
||||
- list_del(&urb->ready_list);
|
||||
+ ua_urb = list_first_entry(&ua->ready_playback_urbs,
|
||||
+ struct ua101_urb, ready_list);
|
||||
+ list_del(&ua_urb->ready_list);
|
||||
+ urb = ua_urb->urb;
|
||||
|
||||
/* fill packet with data or silence */
|
||||
- urb->urb.iso_frame_desc[0].length =
|
||||
+ urb->iso_frame_desc[0].length =
|
||||
frames * ua->playback.frame_bytes;
|
||||
if (test_bit(ALSA_PLAYBACK_RUNNING, &ua->states))
|
||||
do_period_elapsed |= copy_playback_data(&ua->playback,
|
||||
- &urb->urb,
|
||||
+ urb,
|
||||
frames);
|
||||
else
|
||||
- memset(urb->urb.transfer_buffer, 0,
|
||||
- urb->urb.iso_frame_desc[0].length);
|
||||
+ memset(urb->transfer_buffer, 0,
|
||||
+ urb->iso_frame_desc[0].length);
|
||||
|
||||
/* and off you go ... */
|
||||
- err = usb_submit_urb(&urb->urb, GFP_ATOMIC);
|
||||
+ err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (unlikely(err < 0)) {
|
||||
abort_usb_playback(ua);
|
||||
abort_alsa_playback(ua);
|
||||
@@ -342,7 +345,8 @@ static bool copy_capture_data(struct ua101_stream *stream, struct urb *urb,
|
||||
|
||||
static void capture_urb_complete(struct urb *urb)
|
||||
{
|
||||
- struct ua101 *ua = urb->context;
|
||||
+ struct ua101_urb *ua_urb = urb->context;
|
||||
+ struct ua101 *ua = ua_urb->ua;
|
||||
struct ua101_stream *stream = &ua->capture;
|
||||
unsigned int frames, write_ptr;
|
||||
bool do_period_elapsed;
|
||||
@@ -413,7 +417,8 @@ static void capture_urb_complete(struct urb *urb)
|
||||
|
||||
static void first_capture_urb_complete(struct urb *urb)
|
||||
{
|
||||
- struct ua101 *ua = urb->context;
|
||||
+ struct ua101_urb *ua_urb = urb->context;
|
||||
+ struct ua101 *ua = ua_urb->ua;
|
||||
|
||||
urb->complete = capture_urb_complete;
|
||||
capture_urb_complete(urb);
|
||||
@@ -427,7 +432,7 @@ static int submit_stream_urbs(struct ua101 *ua, struct ua101_stream *stream)
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < stream->queue_length; ++i) {
|
||||
- int err = usb_submit_urb(&stream->urbs[i]->urb, GFP_KERNEL);
|
||||
+ int err = usb_submit_urb(stream->urbs[i].urb, GFP_KERNEL);
|
||||
if (err < 0) {
|
||||
dev_err(&ua->dev->dev, "USB request error %d: %s\n",
|
||||
err, usb_error_string(err));
|
||||
@@ -442,8 +447,8 @@ static void kill_stream_urbs(struct ua101_stream *stream)
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < stream->queue_length; ++i)
|
||||
- if (stream->urbs[i])
|
||||
- usb_kill_urb(&stream->urbs[i]->urb);
|
||||
+ if (stream->urbs[i].urb)
|
||||
+ usb_kill_urb(stream->urbs[i].urb);
|
||||
}
|
||||
|
||||
static int enable_iso_interface(struct ua101 *ua, unsigned int intf_index)
|
||||
@@ -508,7 +513,7 @@ static int start_usb_capture(struct ua101 *ua)
|
||||
return err;
|
||||
|
||||
clear_bit(CAPTURE_URB_COMPLETED, &ua->states);
|
||||
- ua->capture.urbs[0]->urb.complete = first_capture_urb_complete;
|
||||
+ ua->capture.urbs[0].urb->complete = first_capture_urb_complete;
|
||||
ua->rate_feedback_start = 0;
|
||||
ua->rate_feedback_count = 0;
|
||||
|
||||
@@ -550,7 +555,7 @@ static int start_usb_playback(struct ua101 *ua)
|
||||
return err;
|
||||
|
||||
clear_bit(PLAYBACK_URB_COMPLETED, &ua->states);
|
||||
- ua->playback.urbs[0]->urb.complete =
|
||||
+ ua->playback.urbs[0].urb->complete =
|
||||
first_playback_urb_complete;
|
||||
scoped_guard(spinlock_irq, &ua->lock) {
|
||||
INIT_LIST_HEAD(&ua->ready_playback_urbs);
|
||||
@@ -580,7 +585,7 @@ static int start_usb_playback(struct ua101 *ua)
|
||||
add_with_wraparound(ua, &ua->rate_feedback_start, 1);
|
||||
ua->rate_feedback_count--;
|
||||
}
|
||||
- urb = &ua->playback.urbs[i]->urb;
|
||||
+ urb = ua->playback.urbs[i].urb;
|
||||
urb->iso_frame_desc[0].length =
|
||||
frames * ua->playback.frame_bytes;
|
||||
memset(urb->transfer_buffer, 0,
|
||||
@@ -1059,7 +1064,7 @@ static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream,
|
||||
void (*urb_complete)(struct urb *))
|
||||
{
|
||||
unsigned max_packet_size = stream->max_packet_bytes;
|
||||
- struct ua101_urb *urb;
|
||||
+ struct urb *urb;
|
||||
unsigned int b, u = 0;
|
||||
|
||||
for (b = 0; b < ARRAY_SIZE(stream->buffers); ++b) {
|
||||
@@ -1070,23 +1075,24 @@ static int alloc_stream_urbs(struct ua101 *ua, struct ua101_stream *stream,
|
||||
while (size >= max_packet_size) {
|
||||
if (u >= stream->queue_length)
|
||||
goto bufsize_error;
|
||||
- urb = kmalloc_obj(*urb);
|
||||
+ urb = usb_alloc_urb(1, GFP_KERNEL);
|
||||
if (!urb)
|
||||
return -ENOMEM;
|
||||
- usb_init_urb(&urb->urb);
|
||||
- urb->urb.dev = ua->dev;
|
||||
- urb->urb.pipe = stream->usb_pipe;
|
||||
- urb->urb.transfer_flags = URB_NO_TRANSFER_DMA_MAP;
|
||||
- urb->urb.transfer_buffer = addr;
|
||||
- urb->urb.transfer_dma = dma;
|
||||
- urb->urb.transfer_buffer_length = max_packet_size;
|
||||
- urb->urb.number_of_packets = 1;
|
||||
- urb->urb.interval = 1;
|
||||
- urb->urb.context = ua;
|
||||
- urb->urb.complete = urb_complete;
|
||||
- urb->urb.iso_frame_desc[0].offset = 0;
|
||||
- urb->urb.iso_frame_desc[0].length = max_packet_size;
|
||||
- stream->urbs[u++] = urb;
|
||||
+ urb->dev = ua->dev;
|
||||
+ urb->pipe = stream->usb_pipe;
|
||||
+ urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
|
||||
+ urb->transfer_buffer = addr;
|
||||
+ urb->transfer_dma = dma;
|
||||
+ urb->transfer_buffer_length = max_packet_size;
|
||||
+ urb->number_of_packets = 1;
|
||||
+ urb->interval = 1;
|
||||
+ urb->context = &stream->urbs[u];
|
||||
+ urb->complete = urb_complete;
|
||||
+ urb->iso_frame_desc[0].offset = 0;
|
||||
+ urb->iso_frame_desc[0].length = max_packet_size;
|
||||
+ stream->urbs[u].ua = ua;
|
||||
+ stream->urbs[u].urb = urb;
|
||||
+ u++;
|
||||
size -= max_packet_size;
|
||||
addr += max_packet_size;
|
||||
dma += max_packet_size;
|
||||
@@ -1104,8 +1110,8 @@ static void free_stream_urbs(struct ua101_stream *stream)
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < stream->queue_length; ++i) {
|
||||
- kfree(stream->urbs[i]);
|
||||
- stream->urbs[i] = NULL;
|
||||
+ usb_free_urb(stream->urbs[i].urb);
|
||||
+ stream->urbs[i].urb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
|
||||
--- a/sound/usb/quirks.c
|
||||
+++ b/sound/usb/quirks.c
|
||||
@@ -849,6 +849,27 @@ static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * A post configuration device descriptor read is needed to make the CM1A
|
||||
+ * operational after reenumeration.
|
||||
+ */
|
||||
+static int snd_usb_cm1a_boot_quirk(struct usb_device *dev)
|
||||
+{
|
||||
+ struct usb_device_descriptor *desc __free(kfree) = kmalloc_obj(*desc);
|
||||
+ int err;
|
||||
+
|
||||
+ if (!desc)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, sizeof(*desc));
|
||||
+ if (err < 0) {
|
||||
+ dev_err(&dev->dev, "failed to read device descriptor: %d\n", err);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Some sound cards from Native Instruments are in fact compliant to the USB
|
||||
* audio standard of version 2 and other approved USB standards, even though
|
||||
@@ -1681,6 +1702,8 @@ int snd_usb_apply_boot_quirk_once(struct usb_device *dev,
|
||||
switch (id) {
|
||||
case USB_ID(0x07fd, 0x0008): /* MOTU M Series, 1st hardware version */
|
||||
return snd_usb_motu_m_series_boot_quirk(dev);
|
||||
+ case USB_ID(0x1397, 0x1234): /* Behringer CM1A */
|
||||
+ return snd_usb_cm1a_boot_quirk(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -2390,6 +2413,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
|
||||
QUIRK_FLAG_PLAYBACK_FIRST | QUIRK_FLAG_GENERIC_IMPLICIT_FB),
|
||||
DEVICE_FLG(0x1397, 0x050c, /* Behringer Flow 8 */
|
||||
QUIRK_FLAG_IFB_SILENCE_ON_EMPTY),
|
||||
+ DEVICE_FLG(0x1397, 0x0510, /* Behringer UV1 */
|
||||
+ QUIRK_FLAG_PLAYBACK_FIRST | QUIRK_FLAG_GENERIC_IMPLICIT_FB),
|
||||
DEVICE_FLG(0x13e5, 0x0001, /* Serato Phono */
|
||||
QUIRK_FLAG_IGNORE_CTL_ERROR),
|
||||
DEVICE_FLG(0x152a, 0x85dd, /* SMSL USB DAC */
|
||||
Reference in new issue
Block a user