sound fixes for 5.13-rc3
All small device-specific fixes here: a series of FireWire audio fixes, UAF and other fixes in USB-audio and co spotted by fuzzer, and a few HD-audio quirks as usual. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmCmWVMOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9m2w//YxOAOvTyko8PF+bHFJ2na2biWmyBZKrFxBj4 w6eLLVJMFXHmJaljWaXRU4SLTAEZaI1Ow9sT02a43l+4vgqws4KL5byDxlQ0VR9K LTd6/Amxc15MQu6JkDZNB/LncWYmqj+0/snjuKNqre3oaRgPOWaXhjz6i9eZ6g+0 juFcBICx+GaT530Hr2lvyxzGWVMgAF2P568G0JWa2kulyeWDzGwhYGT8ru/40inK HcYAszWF9mWk02zqT1e08Em7PB0V8k2/AUiGa4Rtz9HBKeUa+dhq1gkLFVRwsPrk wR6b839f6NePv6jiVhej3lMnBDcIkVBPR3N2U6akhOrijv4Zt6dAhd23M3JG4/he 2EUGkjWBz+zT3G1Kf2raOwIDGoZXvRsav/z/Klw6Jjo+peLbEwzSshmBmO82rUKI bValqIML56to1BGRso0gkrUYRpSEq4o9GpKIQaH2hrMCSEAb+D9TqOMKpv1Mt95o jGSXpNOpbgCaQB9V8j04NztodJbGhCYUWClqXs4xPmc8Elenthbcpfsec0G//b9W I8xx1qu5OHvu/yFgSRL/HGoyDrJm+5xvRyTswXWUKdawsOdK3mybVI66nCUjrtiT G+YMFo1h9XaT6coIbdeIWJmVAjDIkfVB/4QLEQwPtmFC88Bkm4Y2auw0Bm2vJMx6 nx6JznM= =N3Xy -----END PGP SIGNATURE----- Merge tag 'sound-5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "All small device-specific fixes here: a series of FireWire audio fixes, UAF and other fixes in USB-audio and co spotted by fuzzer, and a few HD-audio quirks as usual" * tag 'sound-5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: line6: Fix racy initialization of LINE6 MIDI ALSA: dice: fix stream format for TC Electronic Konnekt Live at high sampling transfer frequency ALSA: dice: disable double_pcm_frames mode for M-Audio Profire 610, 2626 and Avid M-Box 3 Pro ALSA: intel8x0: Don't update period unless prepared ALSA: hda/realtek: Add some CLOVE SSIDs of ALC293 ALSA: firewire-lib: fix amdtp_packet tracepoints event for packet_index field ALSA: firewire-lib: fix calculation for size of IR context payload ALSA: firewire-lib: fix check for the size of isochronous packet payload ALSA: bebob/oxfw: fix Kconfig entry for Mackie d.2 Pro ALSA: dice: fix stream format at middle sampling rate for Alesis iO 26 ALSA: hda/realtek: Add fixup for HP Spectre x360 15-df0xxx ALSA: usb-audio: Fix potential out-of-bounce access in MIDI EP parser ALSA: usb-audio: Validate MS endpoint descriptors ALSA: hda: fixup headset for ASUS GU502 laptop ALSA: hda/realtek: reset eapd coeff to default value for alc287
This commit is contained in:
Коммит
6aa37a53ff
|
@ -38,7 +38,7 @@ config SND_OXFW
|
|||
* Mackie(Loud) Onyx 1640i (former model)
|
||||
* Mackie(Loud) Onyx Satellite
|
||||
* Mackie(Loud) Tapco Link.Firewire
|
||||
* Mackie(Loud) d.2 pro/d.4 pro
|
||||
* Mackie(Loud) d.4 pro
|
||||
* Mackie(Loud) U.420/U.420d
|
||||
* TASCAM FireOne
|
||||
* Stanton Controllers & Systems 1 Deck/Mixer
|
||||
|
@ -84,7 +84,7 @@ config SND_BEBOB
|
|||
* PreSonus FIREBOX/FIREPOD/FP10/Inspire1394
|
||||
* BridgeCo RDAudio1/Audio5
|
||||
* Mackie Onyx 1220/1620/1640 (FireWire I/O Card)
|
||||
* Mackie d.2 (FireWire Option)
|
||||
* Mackie d.2 (FireWire Option) and d.2 Pro
|
||||
* Stanton FinalScratch 2 (ScratchAmp)
|
||||
* Tascam IF-FW/DM
|
||||
* Behringer XENIX UFX 1204/1604
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
#include <linux/tracepoint.h>
|
||||
|
||||
TRACE_EVENT(amdtp_packet,
|
||||
TP_PROTO(const struct amdtp_stream *s, u32 cycles, const __be32 *cip_header, unsigned int payload_length, unsigned int data_blocks, unsigned int data_block_counter, unsigned int index),
|
||||
TP_ARGS(s, cycles, cip_header, payload_length, data_blocks, data_block_counter, index),
|
||||
TP_PROTO(const struct amdtp_stream *s, u32 cycles, const __be32 *cip_header, unsigned int payload_length, unsigned int data_blocks, unsigned int data_block_counter, unsigned int packet_index, unsigned int index),
|
||||
TP_ARGS(s, cycles, cip_header, payload_length, data_blocks, data_block_counter, packet_index, index),
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, second)
|
||||
__field(unsigned int, cycle)
|
||||
|
@ -48,7 +48,7 @@ TRACE_EVENT(amdtp_packet,
|
|||
__entry->payload_quadlets = payload_length / sizeof(__be32);
|
||||
__entry->data_blocks = data_blocks;
|
||||
__entry->data_block_counter = data_block_counter,
|
||||
__entry->packet_index = s->packet_index;
|
||||
__entry->packet_index = packet_index;
|
||||
__entry->irq = !!in_interrupt();
|
||||
__entry->index = index;
|
||||
),
|
||||
|
|
|
@ -526,7 +526,7 @@ static void build_it_pkt_header(struct amdtp_stream *s, unsigned int cycle,
|
|||
}
|
||||
|
||||
trace_amdtp_packet(s, cycle, cip_header, payload_length, data_blocks,
|
||||
data_block_counter, index);
|
||||
data_block_counter, s->packet_index, index);
|
||||
}
|
||||
|
||||
static int check_cip_header(struct amdtp_stream *s, const __be32 *buf,
|
||||
|
@ -630,21 +630,27 @@ static int parse_ir_ctx_header(struct amdtp_stream *s, unsigned int cycle,
|
|||
unsigned int *payload_length,
|
||||
unsigned int *data_blocks,
|
||||
unsigned int *data_block_counter,
|
||||
unsigned int *syt, unsigned int index)
|
||||
unsigned int *syt, unsigned int packet_index, unsigned int index)
|
||||
{
|
||||
const __be32 *cip_header;
|
||||
unsigned int cip_header_size;
|
||||
int err;
|
||||
|
||||
*payload_length = be32_to_cpu(ctx_header[0]) >> ISO_DATA_LENGTH_SHIFT;
|
||||
if (*payload_length > s->ctx_data.tx.ctx_header_size +
|
||||
s->ctx_data.tx.max_ctx_payload_length) {
|
||||
|
||||
if (!(s->flags & CIP_NO_HEADER))
|
||||
cip_header_size = 8;
|
||||
else
|
||||
cip_header_size = 0;
|
||||
|
||||
if (*payload_length > cip_header_size + s->ctx_data.tx.max_ctx_payload_length) {
|
||||
dev_err(&s->unit->device,
|
||||
"Detect jumbo payload: %04x %04x\n",
|
||||
*payload_length, s->ctx_data.tx.max_ctx_payload_length);
|
||||
*payload_length, cip_header_size + s->ctx_data.tx.max_ctx_payload_length);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (!(s->flags & CIP_NO_HEADER)) {
|
||||
if (cip_header_size > 0) {
|
||||
cip_header = ctx_header + 2;
|
||||
err = check_cip_header(s, cip_header, *payload_length,
|
||||
data_blocks, data_block_counter, syt);
|
||||
|
@ -662,7 +668,7 @@ static int parse_ir_ctx_header(struct amdtp_stream *s, unsigned int cycle,
|
|||
}
|
||||
|
||||
trace_amdtp_packet(s, cycle, cip_header, *payload_length, *data_blocks,
|
||||
*data_block_counter, index);
|
||||
*data_block_counter, packet_index, index);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -701,12 +707,13 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
|
|||
unsigned int packets)
|
||||
{
|
||||
unsigned int dbc = s->data_block_counter;
|
||||
unsigned int packet_index = s->packet_index;
|
||||
unsigned int queue_size = s->queue_size;
|
||||
int i;
|
||||
int err;
|
||||
|
||||
for (i = 0; i < packets; ++i) {
|
||||
struct pkt_desc *desc = descs + i;
|
||||
unsigned int index = (s->packet_index + i) % s->queue_size;
|
||||
unsigned int cycle;
|
||||
unsigned int payload_length;
|
||||
unsigned int data_blocks;
|
||||
|
@ -715,7 +722,7 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
|
|||
cycle = compute_cycle_count(ctx_header[1]);
|
||||
|
||||
err = parse_ir_ctx_header(s, cycle, ctx_header, &payload_length,
|
||||
&data_blocks, &dbc, &syt, i);
|
||||
&data_blocks, &dbc, &syt, packet_index, i);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
@ -723,13 +730,15 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
|
|||
desc->syt = syt;
|
||||
desc->data_blocks = data_blocks;
|
||||
desc->data_block_counter = dbc;
|
||||
desc->ctx_payload = s->buffer.packets[index].buffer;
|
||||
desc->ctx_payload = s->buffer.packets[packet_index].buffer;
|
||||
|
||||
if (!(s->flags & CIP_DBC_IS_END_EVENT))
|
||||
dbc = (dbc + desc->data_blocks) & 0xff;
|
||||
|
||||
ctx_header +=
|
||||
s->ctx_data.tx.ctx_header_size / sizeof(*ctx_header);
|
||||
|
||||
packet_index = (packet_index + 1) % queue_size;
|
||||
}
|
||||
|
||||
s->data_block_counter = dbc;
|
||||
|
@ -1065,23 +1074,22 @@ static int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed,
|
|||
s->data_block_counter = 0;
|
||||
}
|
||||
|
||||
/* initialize packet buffer */
|
||||
// initialize packet buffer.
|
||||
max_ctx_payload_size = amdtp_stream_get_max_payload(s);
|
||||
if (s->direction == AMDTP_IN_STREAM) {
|
||||
dir = DMA_FROM_DEVICE;
|
||||
type = FW_ISO_CONTEXT_RECEIVE;
|
||||
if (!(s->flags & CIP_NO_HEADER))
|
||||
if (!(s->flags & CIP_NO_HEADER)) {
|
||||
max_ctx_payload_size -= 8;
|
||||
ctx_header_size = IR_CTX_HEADER_SIZE_CIP;
|
||||
else
|
||||
} else {
|
||||
ctx_header_size = IR_CTX_HEADER_SIZE_NO_CIP;
|
||||
|
||||
max_ctx_payload_size = amdtp_stream_get_max_payload(s) -
|
||||
ctx_header_size;
|
||||
}
|
||||
} else {
|
||||
dir = DMA_TO_DEVICE;
|
||||
type = FW_ISO_CONTEXT_TRANSMIT;
|
||||
ctx_header_size = 0; // No effect for IT context.
|
||||
|
||||
max_ctx_payload_size = amdtp_stream_get_max_payload(s);
|
||||
if (!(s->flags & CIP_NO_HEADER))
|
||||
max_ctx_payload_size -= IT_PKT_HEADER_SIZE_CIP;
|
||||
}
|
||||
|
|
|
@ -387,7 +387,7 @@ static const struct ieee1394_device_id bebob_id_table[] = {
|
|||
SND_BEBOB_DEV_ENTRY(VEN_BRIDGECO, 0x00010049, &spec_normal),
|
||||
/* Mackie, Onyx 1220/1620/1640 (Firewire I/O Card) */
|
||||
SND_BEBOB_DEV_ENTRY(VEN_MACKIE2, 0x00010065, &spec_normal),
|
||||
/* Mackie, d.2 (Firewire Option) */
|
||||
// Mackie, d.2 (Firewire option card) and d.2 Pro (the card is built-in).
|
||||
SND_BEBOB_DEV_ENTRY(VEN_MACKIE1, 0x00010067, &spec_normal),
|
||||
/* Stanton, ScratchAmp */
|
||||
SND_BEBOB_DEV_ENTRY(VEN_STANTON, 0x00000001, &spec_normal),
|
||||
|
|
|
@ -16,7 +16,7 @@ alesis_io14_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
|
|||
static const unsigned int
|
||||
alesis_io26_tx_pcm_chs[MAX_STREAMS][SND_DICE_RATE_MODE_COUNT] = {
|
||||
{10, 10, 4}, /* Tx0 = Analog + S/PDIF. */
|
||||
{16, 8, 0}, /* Tx1 = ADAT1 + ADAT2. */
|
||||
{16, 4, 0}, /* Tx1 = ADAT1 + ADAT2 (available at low rate). */
|
||||
};
|
||||
|
||||
int snd_dice_detect_alesis_formats(struct snd_dice *dice)
|
||||
|
|
|
@ -218,7 +218,7 @@ static int pcm_open(struct snd_pcm_substream *substream)
|
|||
|
||||
if (frames_per_period > 0) {
|
||||
// For double_pcm_frame quirk.
|
||||
if (rate > 96000) {
|
||||
if (rate > 96000 && !dice->disable_double_pcm_frames) {
|
||||
frames_per_period *= 2;
|
||||
frames_per_buffer *= 2;
|
||||
}
|
||||
|
@ -273,7 +273,7 @@ static int pcm_hw_params(struct snd_pcm_substream *substream,
|
|||
|
||||
mutex_lock(&dice->mutex);
|
||||
// For double_pcm_frame quirk.
|
||||
if (rate > 96000) {
|
||||
if (rate > 96000 && !dice->disable_double_pcm_frames) {
|
||||
events_per_period /= 2;
|
||||
events_per_buffer /= 2;
|
||||
}
|
||||
|
|
|
@ -181,7 +181,7 @@ static int keep_resources(struct snd_dice *dice, struct amdtp_stream *stream,
|
|||
// as 'Dual Wire'.
|
||||
// For this quirk, blocking mode is required and PCM buffer size should
|
||||
// be aligned to SYT_INTERVAL.
|
||||
double_pcm_frames = rate > 96000;
|
||||
double_pcm_frames = (rate > 96000 && !dice->disable_double_pcm_frames);
|
||||
if (double_pcm_frames) {
|
||||
rate /= 2;
|
||||
pcm_chs *= 2;
|
||||
|
|
|
@ -38,8 +38,8 @@ static const struct dice_tc_spec konnekt_24d = {
|
|||
};
|
||||
|
||||
static const struct dice_tc_spec konnekt_live = {
|
||||
.tx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
|
||||
.rx_pcm_chs = {{16, 16, 16}, {0, 0, 0} },
|
||||
.tx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
|
||||
.rx_pcm_chs = {{16, 16, 6}, {0, 0, 0} },
|
||||
.has_midi = true,
|
||||
};
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ MODULE_LICENSE("GPL v2");
|
|||
#define OUI_SSL 0x0050c2 // Actually ID reserved by IEEE.
|
||||
#define OUI_PRESONUS 0x000a92
|
||||
#define OUI_HARMAN 0x000fd7
|
||||
#define OUI_AVID 0x00a07e
|
||||
|
||||
#define DICE_CATEGORY_ID 0x04
|
||||
#define WEISS_CATEGORY_ID 0x00
|
||||
|
@ -222,6 +223,14 @@ static int dice_probe(struct fw_unit *unit,
|
|||
(snd_dice_detect_formats_t)entry->driver_data;
|
||||
}
|
||||
|
||||
// Below models are compliant to IEC 61883-1/6 and have no quirk at high sampling transfer
|
||||
// frequency.
|
||||
// * Avid M-Box 3 Pro
|
||||
// * M-Audio Profire 610
|
||||
// * M-Audio Profire 2626
|
||||
if (entry->vendor_id == OUI_MAUDIO || entry->vendor_id == OUI_AVID)
|
||||
dice->disable_double_pcm_frames = true;
|
||||
|
||||
spin_lock_init(&dice->lock);
|
||||
mutex_init(&dice->mutex);
|
||||
init_completion(&dice->clock_accepted);
|
||||
|
@ -278,7 +287,22 @@ static void dice_bus_reset(struct fw_unit *unit)
|
|||
|
||||
#define DICE_INTERFACE 0x000001
|
||||
|
||||
#define DICE_DEV_ENTRY_TYPICAL(vendor, model, data) \
|
||||
{ \
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID | \
|
||||
IEEE1394_MATCH_MODEL_ID | \
|
||||
IEEE1394_MATCH_SPECIFIER_ID | \
|
||||
IEEE1394_MATCH_VERSION, \
|
||||
.vendor_id = (vendor), \
|
||||
.model_id = (model), \
|
||||
.specifier_id = (vendor), \
|
||||
.version = DICE_INTERFACE, \
|
||||
.driver_data = (kernel_ulong_t)(data), \
|
||||
}
|
||||
|
||||
static const struct ieee1394_device_id dice_id_table[] = {
|
||||
// Avid M-Box 3 Pro. To match in probe function.
|
||||
DICE_DEV_ENTRY_TYPICAL(OUI_AVID, 0x000004, snd_dice_detect_extension_formats),
|
||||
/* M-Audio Profire 2626 has a different value in version field. */
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
|
|
|
@ -109,7 +109,8 @@ struct snd_dice {
|
|||
struct fw_iso_resources rx_resources[MAX_STREAMS];
|
||||
struct amdtp_stream tx_stream[MAX_STREAMS];
|
||||
struct amdtp_stream rx_stream[MAX_STREAMS];
|
||||
bool global_enabled;
|
||||
bool global_enabled:1;
|
||||
bool disable_double_pcm_frames:1;
|
||||
struct completion clock_accepted;
|
||||
unsigned int substreams_counter;
|
||||
|
||||
|
|
|
@ -355,7 +355,6 @@ static const struct ieee1394_device_id oxfw_id_table[] = {
|
|||
* Onyx-i series (former models): 0x081216
|
||||
* Mackie Onyx Satellite: 0x00200f
|
||||
* Tapco LINK.firewire 4x6: 0x000460
|
||||
* d.2 pro: Unknown
|
||||
* d.4 pro: Unknown
|
||||
* U.420: Unknown
|
||||
* U.420d: Unknown
|
||||
|
|
|
@ -395,7 +395,6 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|||
case 0x10ec0282:
|
||||
case 0x10ec0283:
|
||||
case 0x10ec0286:
|
||||
case 0x10ec0287:
|
||||
case 0x10ec0288:
|
||||
case 0x10ec0285:
|
||||
case 0x10ec0298:
|
||||
|
@ -406,6 +405,10 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|||
case 0x10ec0275:
|
||||
alc_update_coef_idx(codec, 0xe, 0, 1<<0);
|
||||
break;
|
||||
case 0x10ec0287:
|
||||
alc_update_coef_idx(codec, 0x10, 1<<9, 0);
|
||||
alc_write_coef_idx(codec, 0x8, 0x4ab7);
|
||||
break;
|
||||
case 0x10ec0293:
|
||||
alc_update_coef_idx(codec, 0xa, 1<<13, 0);
|
||||
break;
|
||||
|
@ -6251,6 +6254,35 @@ static void alc294_fixup_gx502_hp(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
|
||||
static void alc294_gu502_toggle_output(struct hda_codec *codec,
|
||||
struct hda_jack_callback *cb)
|
||||
{
|
||||
/* Windows sets 0x10 to 0x8420 for Node 0x20 which is
|
||||
* responsible from changes between speakers and headphones
|
||||
*/
|
||||
if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
|
||||
alc_write_coef_idx(codec, 0x10, 0x8420);
|
||||
else
|
||||
alc_write_coef_idx(codec, 0x10, 0x0a20);
|
||||
}
|
||||
|
||||
static void alc294_fixup_gu502_hp(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
if (!is_jack_detectable(codec, 0x21))
|
||||
return;
|
||||
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
snd_hda_jack_detect_enable_callback(codec, 0x21,
|
||||
alc294_gu502_toggle_output);
|
||||
break;
|
||||
case HDA_FIXUP_ACT_INIT:
|
||||
alc294_gu502_toggle_output(codec, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
|
@ -6468,6 +6500,9 @@ enum {
|
|||
ALC294_FIXUP_ASUS_GX502_HP,
|
||||
ALC294_FIXUP_ASUS_GX502_PINS,
|
||||
ALC294_FIXUP_ASUS_GX502_VERBS,
|
||||
ALC294_FIXUP_ASUS_GU502_HP,
|
||||
ALC294_FIXUP_ASUS_GU502_PINS,
|
||||
ALC294_FIXUP_ASUS_GU502_VERBS,
|
||||
ALC285_FIXUP_HP_GPIO_LED,
|
||||
ALC285_FIXUP_HP_MUTE_LED,
|
||||
ALC236_FIXUP_HP_GPIO_LED,
|
||||
|
@ -6507,6 +6542,7 @@ enum {
|
|||
ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
|
||||
ALC295_FIXUP_ASUS_DACS,
|
||||
ALC295_FIXUP_HP_OMEN,
|
||||
ALC285_FIXUP_HP_SPECTRE_X360,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
|
@ -7709,6 +7745,35 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc294_fixup_gx502_hp,
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_GU502_PINS] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x01a11050 }, /* rear HP mic */
|
||||
{ 0x1a, 0x01a11830 }, /* rear external mic */
|
||||
{ 0x21, 0x012110f0 }, /* rear HP out */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_GU502_VERBS] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
/* set 0x15 to HP-OUT ctrl */
|
||||
{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
|
||||
/* unmute the 0x15 amp */
|
||||
{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
|
||||
/* set 0x1b to HP-OUT */
|
||||
{ 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_ASUS_GU502_HP
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_GU502_HP] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc294_fixup_gu502_hp,
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_COEF_1B] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
|
@ -8035,6 +8100,15 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
|
||||
},
|
||||
[ALC285_FIXUP_HP_SPECTRE_X360] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x14, 0x90170110 }, /* enable top speaker */
|
||||
{}
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC285_FIXUP_SPEAKER2_TO_DAC1,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
|
@ -8195,6 +8269,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
|
||||
SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
|
||||
SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
|
||||
SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
|
||||
SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
|
||||
|
@ -8253,6 +8328,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
|
||||
SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
|
||||
|
@ -8309,12 +8385,19 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
|
@ -8332,9 +8415,17 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL5XNU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
|
||||
|
@ -8600,6 +8691,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|||
{.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
|
||||
{.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
|
||||
{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
|
||||
{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
|
||||
{}
|
||||
};
|
||||
#define ALC225_STANDARD_PINS \
|
||||
|
|
|
@ -331,6 +331,7 @@ struct ichdev {
|
|||
unsigned int ali_slot; /* ALI DMA slot */
|
||||
struct ac97_pcm *pcm;
|
||||
int pcm_open_flag;
|
||||
unsigned int prepared:1;
|
||||
unsigned int suspended: 1;
|
||||
};
|
||||
|
||||
|
@ -691,6 +692,9 @@ static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ich
|
|||
int status, civ, i, step;
|
||||
int ack = 0;
|
||||
|
||||
if (!ichdev->prepared || ichdev->suspended)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&chip->reg_lock, flags);
|
||||
status = igetbyte(chip, port + ichdev->roff_sr);
|
||||
civ = igetbyte(chip, port + ICH_REG_OFF_CIV);
|
||||
|
@ -881,6 +885,7 @@ static int snd_intel8x0_hw_params(struct snd_pcm_substream *substream,
|
|||
if (ichdev->pcm_open_flag) {
|
||||
snd_ac97_pcm_close(ichdev->pcm);
|
||||
ichdev->pcm_open_flag = 0;
|
||||
ichdev->prepared = 0;
|
||||
}
|
||||
err = snd_ac97_pcm_open(ichdev->pcm, params_rate(hw_params),
|
||||
params_channels(hw_params),
|
||||
|
@ -902,6 +907,7 @@ static int snd_intel8x0_hw_free(struct snd_pcm_substream *substream)
|
|||
if (ichdev->pcm_open_flag) {
|
||||
snd_ac97_pcm_close(ichdev->pcm);
|
||||
ichdev->pcm_open_flag = 0;
|
||||
ichdev->prepared = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -976,6 +982,7 @@ static int snd_intel8x0_pcm_prepare(struct snd_pcm_substream *substream)
|
|||
ichdev->pos_shift = (runtime->sample_bits > 16) ? 2 : 1;
|
||||
}
|
||||
snd_intel8x0_setup_periods(chip, ichdev);
|
||||
ichdev->prepared = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -699,6 +699,10 @@ static int line6_init_cap_control(struct usb_line6 *line6)
|
|||
line6->buffer_message = kmalloc(LINE6_MIDI_MESSAGE_MAXLEN, GFP_KERNEL);
|
||||
if (!line6->buffer_message)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = line6_init_midi(line6);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else {
|
||||
ret = line6_hwdep_init(line6);
|
||||
if (ret < 0)
|
||||
|
|
|
@ -376,11 +376,6 @@ static int pod_init(struct usb_line6 *line6,
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* initialize MIDI subsystem: */
|
||||
err = line6_init_midi(line6);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* initialize PCM subsystem: */
|
||||
err = line6_init_pcm(line6, &pod_pcm_properties);
|
||||
if (err < 0)
|
||||
|
|
|
@ -159,7 +159,6 @@ static int variax_init(struct usb_line6 *line6,
|
|||
const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_line6_variax *variax = line6_to_variax(line6);
|
||||
int err;
|
||||
|
||||
line6->process_message = line6_variax_process_message;
|
||||
line6->disconnect = line6_variax_disconnect;
|
||||
|
@ -172,11 +171,6 @@ static int variax_init(struct usb_line6 *line6,
|
|||
if (variax->buffer_activate == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
/* initialize MIDI subsystem: */
|
||||
err = line6_init_midi(&variax->line6);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* initiate startup procedure: */
|
||||
schedule_delayed_work(&line6->startup_work,
|
||||
msecs_to_jiffies(VARIAX_STARTUP_DELAY1));
|
||||
|
|
|
@ -1750,7 +1750,7 @@ static struct usb_midi_in_jack_descriptor *find_usb_in_jack_descriptor(
|
|||
struct usb_midi_in_jack_descriptor *injd =
|
||||
(struct usb_midi_in_jack_descriptor *)extra;
|
||||
|
||||
if (injd->bLength > 4 &&
|
||||
if (injd->bLength >= sizeof(*injd) &&
|
||||
injd->bDescriptorType == USB_DT_CS_INTERFACE &&
|
||||
injd->bDescriptorSubtype == UAC_MIDI_IN_JACK &&
|
||||
injd->bJackID == jack_id)
|
||||
|
@ -1773,7 +1773,7 @@ static struct usb_midi_out_jack_descriptor *find_usb_out_jack_descriptor(
|
|||
struct usb_midi_out_jack_descriptor *outjd =
|
||||
(struct usb_midi_out_jack_descriptor *)extra;
|
||||
|
||||
if (outjd->bLength > 4 &&
|
||||
if (outjd->bLength >= sizeof(*outjd) &&
|
||||
outjd->bDescriptorType == USB_DT_CS_INTERFACE &&
|
||||
outjd->bDescriptorSubtype == UAC_MIDI_OUT_JACK &&
|
||||
outjd->bJackID == jack_id)
|
||||
|
@ -1820,7 +1820,8 @@ static void snd_usbmidi_init_substream(struct snd_usb_midi *umidi,
|
|||
outjd = find_usb_out_jack_descriptor(hostif, jack_id);
|
||||
if (outjd) {
|
||||
sz = USB_DT_MIDI_OUT_SIZE(outjd->bNrInputPins);
|
||||
iJack = *(((uint8_t *) outjd) + sz - sizeof(uint8_t));
|
||||
if (outjd->bLength >= sz)
|
||||
iJack = *(((uint8_t *) outjd) + sz - sizeof(uint8_t));
|
||||
}
|
||||
} else {
|
||||
/* and out jacks connect to ins */
|
||||
|
@ -1956,8 +1957,12 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi *umidi,
|
|||
ms_ep = find_usb_ms_endpoint_descriptor(hostep);
|
||||
if (!ms_ep)
|
||||
continue;
|
||||
if (ms_ep->bLength <= sizeof(*ms_ep))
|
||||
continue;
|
||||
if (ms_ep->bNumEmbMIDIJack > 0x10)
|
||||
continue;
|
||||
if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumEmbMIDIJack)
|
||||
continue;
|
||||
if (usb_endpoint_dir_out(ep)) {
|
||||
if (endpoints[epidx].out_ep) {
|
||||
if (++epidx >= MIDI_MAX_ENDPOINTS) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче