mirror of https://gitee.com/openkylin/linux.git
Merge branch 'for-linus' into for-next
Back-merge 5.7-devel branch for further development. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
commit
6d28484026
|
@ -61,6 +61,7 @@ struct snd_rawmidi_runtime {
|
|||
size_t avail_min; /* min avail for wakeup */
|
||||
size_t avail; /* max used buffer for wakeup */
|
||||
size_t xruns; /* over/underruns counter */
|
||||
int buffer_ref; /* buffer reference count */
|
||||
/* misc */
|
||||
spinlock_t lock;
|
||||
wait_queue_head_t sleep;
|
||||
|
|
|
@ -216,12 +216,12 @@ static int snd_hwdep_dsp_load(struct snd_hwdep *hw,
|
|||
if (info.index >= 32)
|
||||
return -EINVAL;
|
||||
/* check whether the dsp was already loaded */
|
||||
if (hw->dsp_loaded & (1 << info.index))
|
||||
if (hw->dsp_loaded & (1u << info.index))
|
||||
return -EBUSY;
|
||||
err = hw->ops.dsp_load(hw, &info);
|
||||
if (err < 0)
|
||||
return err;
|
||||
hw->dsp_loaded |= (1 << info.index);
|
||||
hw->dsp_loaded |= (1u << info.index);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -205,13 +205,14 @@ static snd_pcm_sframes_t calc_dst_frames(struct snd_pcm_substream *plug,
|
|||
plugin = snd_pcm_plug_first(plug);
|
||||
while (plugin && frames > 0) {
|
||||
plugin_next = plugin->next;
|
||||
if (check_size && plugin->buf_frames &&
|
||||
frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
if (plugin->dst_frames) {
|
||||
frames = plugin->dst_frames(plugin, frames);
|
||||
if (frames < 0)
|
||||
return frames;
|
||||
}
|
||||
if (check_size && frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
plugin = plugin_next;
|
||||
}
|
||||
return frames;
|
||||
|
@ -225,14 +226,15 @@ static snd_pcm_sframes_t calc_src_frames(struct snd_pcm_substream *plug,
|
|||
|
||||
plugin = snd_pcm_plug_last(plug);
|
||||
while (plugin && frames > 0) {
|
||||
if (check_size && frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
plugin_prev = plugin->prev;
|
||||
if (plugin->src_frames) {
|
||||
frames = plugin->src_frames(plugin, frames);
|
||||
if (frames < 0)
|
||||
return frames;
|
||||
}
|
||||
if (check_size && plugin->buf_frames &&
|
||||
frames > plugin->buf_frames)
|
||||
frames = plugin->buf_frames;
|
||||
plugin = plugin_prev;
|
||||
}
|
||||
return frames;
|
||||
|
|
|
@ -433,6 +433,7 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
|
|||
|
||||
no_delta_check:
|
||||
if (runtime->status->hw_ptr == new_hw_ptr) {
|
||||
runtime->hw_ptr_jiffies = curr_jiffies;
|
||||
update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -120,6 +120,17 @@ static void snd_rawmidi_input_event_work(struct work_struct *work)
|
|||
runtime->event(runtime->substream);
|
||||
}
|
||||
|
||||
/* buffer refcount management: call with runtime->lock held */
|
||||
static inline void snd_rawmidi_buffer_ref(struct snd_rawmidi_runtime *runtime)
|
||||
{
|
||||
runtime->buffer_ref++;
|
||||
}
|
||||
|
||||
static inline void snd_rawmidi_buffer_unref(struct snd_rawmidi_runtime *runtime)
|
||||
{
|
||||
runtime->buffer_ref--;
|
||||
}
|
||||
|
||||
static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream)
|
||||
{
|
||||
struct snd_rawmidi_runtime *runtime;
|
||||
|
@ -669,6 +680,11 @@ static int resize_runtime_buffer(struct snd_rawmidi_runtime *runtime,
|
|||
if (!newbuf)
|
||||
return -ENOMEM;
|
||||
spin_lock_irq(&runtime->lock);
|
||||
if (runtime->buffer_ref) {
|
||||
spin_unlock_irq(&runtime->lock);
|
||||
kvfree(newbuf);
|
||||
return -EBUSY;
|
||||
}
|
||||
oldbuf = runtime->buffer;
|
||||
runtime->buffer = newbuf;
|
||||
runtime->buffer_size = params->buffer_size;
|
||||
|
@ -1019,8 +1035,10 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream,
|
|||
long result = 0, count1;
|
||||
struct snd_rawmidi_runtime *runtime = substream->runtime;
|
||||
unsigned long appl_ptr;
|
||||
int err = 0;
|
||||
|
||||
spin_lock_irqsave(&runtime->lock, flags);
|
||||
snd_rawmidi_buffer_ref(runtime);
|
||||
while (count > 0 && runtime->avail) {
|
||||
count1 = runtime->buffer_size - runtime->appl_ptr;
|
||||
if (count1 > count)
|
||||
|
@ -1039,16 +1057,19 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream,
|
|||
if (userbuf) {
|
||||
spin_unlock_irqrestore(&runtime->lock, flags);
|
||||
if (copy_to_user(userbuf + result,
|
||||
runtime->buffer + appl_ptr, count1)) {
|
||||
return result > 0 ? result : -EFAULT;
|
||||
}
|
||||
runtime->buffer + appl_ptr, count1))
|
||||
err = -EFAULT;
|
||||
spin_lock_irqsave(&runtime->lock, flags);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
result += count1;
|
||||
count -= count1;
|
||||
}
|
||||
out:
|
||||
snd_rawmidi_buffer_unref(runtime);
|
||||
spin_unlock_irqrestore(&runtime->lock, flags);
|
||||
return result;
|
||||
return result > 0 ? result : err;
|
||||
}
|
||||
|
||||
long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
|
||||
|
@ -1342,6 +1363,7 @@ static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream,
|
|||
return -EAGAIN;
|
||||
}
|
||||
}
|
||||
snd_rawmidi_buffer_ref(runtime);
|
||||
while (count > 0 && runtime->avail > 0) {
|
||||
count1 = runtime->buffer_size - runtime->appl_ptr;
|
||||
if (count1 > count)
|
||||
|
@ -1373,6 +1395,7 @@ static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream,
|
|||
}
|
||||
__end:
|
||||
count1 = runtime->avail < runtime->buffer_size;
|
||||
snd_rawmidi_buffer_unref(runtime);
|
||||
spin_unlock_irqrestore(&runtime->lock, flags);
|
||||
if (count1)
|
||||
snd_rawmidi_output_trigger(substream, 1);
|
||||
|
|
|
@ -66,8 +66,7 @@ TRACE_EVENT(amdtp_packet,
|
|||
__entry->irq,
|
||||
__entry->index,
|
||||
__print_array(__get_dynamic_array(cip_header),
|
||||
__get_dynamic_array_len(cip_header),
|
||||
sizeof(u8)))
|
||||
__get_dynamic_array_len(cip_header), 1))
|
||||
);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -867,10 +867,13 @@ static void snd_miro_write(struct snd_miro *chip, unsigned char reg,
|
|||
spin_unlock_irqrestore(&chip->lock, flags);
|
||||
}
|
||||
|
||||
static inline void snd_miro_write_mask(struct snd_miro *chip,
|
||||
unsigned char reg, unsigned char value, unsigned char mask)
|
||||
{
|
||||
unsigned char oldval = snd_miro_read(chip, reg);
|
||||
|
||||
#define snd_miro_write_mask(chip, reg, value, mask) \
|
||||
snd_miro_write(chip, reg, \
|
||||
(snd_miro_read(chip, reg) & ~(mask)) | ((value) & (mask)))
|
||||
snd_miro_write(chip, reg, (oldval & ~mask) | (value & mask));
|
||||
}
|
||||
|
||||
/*
|
||||
* Proc Interface
|
||||
|
|
|
@ -317,10 +317,13 @@ static void snd_opti9xx_write(struct snd_opti9xx *chip, unsigned char reg,
|
|||
}
|
||||
|
||||
|
||||
#define snd_opti9xx_write_mask(chip, reg, value, mask) \
|
||||
snd_opti9xx_write(chip, reg, \
|
||||
(snd_opti9xx_read(chip, reg) & ~(mask)) | ((value) & (mask)))
|
||||
static inline void snd_opti9xx_write_mask(struct snd_opti9xx *chip,
|
||||
unsigned char reg, unsigned char value, unsigned char mask)
|
||||
{
|
||||
unsigned char oldval = snd_opti9xx_read(chip, reg);
|
||||
|
||||
snd_opti9xx_write(chip, reg, (oldval & ~mask) | (value & mask));
|
||||
}
|
||||
|
||||
static int snd_opti9xx_configure(struct snd_opti9xx *chip,
|
||||
long port,
|
||||
|
|
|
@ -1848,8 +1848,10 @@ static bool check_non_pcm_per_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)
|
|||
/* Add sanity check to pass klockwork check.
|
||||
* This should never happen.
|
||||
*/
|
||||
if (WARN_ON(spdif == NULL))
|
||||
if (WARN_ON(spdif == NULL)) {
|
||||
mutex_unlock(&codec->spdif_mutex);
|
||||
return true;
|
||||
}
|
||||
non_pcm = !!(spdif->status & IEC958_AES0_NONAUDIO);
|
||||
mutex_unlock(&codec->spdif_mutex);
|
||||
return non_pcm;
|
||||
|
@ -2198,7 +2200,9 @@ static int generic_hdmi_build_controls(struct hda_codec *codec)
|
|||
|
||||
for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
|
||||
struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
|
||||
struct hdmi_eld *pin_eld = &per_pin->sink_eld;
|
||||
|
||||
pin_eld->eld_valid = false;
|
||||
hdmi_present_sense(per_pin, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -386,6 +386,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|||
case 0x10ec0282:
|
||||
case 0x10ec0283:
|
||||
case 0x10ec0286:
|
||||
case 0x10ec0287:
|
||||
case 0x10ec0288:
|
||||
case 0x10ec0285:
|
||||
case 0x10ec0298:
|
||||
|
@ -2459,6 +2460,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
|
||||
SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
|
||||
|
@ -2474,6 +2476,9 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
|
||||
|
@ -5516,18 +5521,9 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,
|
|||
{ 0x19, 0x21a11010 }, /* dock mic */
|
||||
{ }
|
||||
};
|
||||
/* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
|
||||
* the speaker output becomes too low by some reason on Thinkpads with
|
||||
* ALC298 codec
|
||||
*/
|
||||
static const hda_nid_t preferred_pairs[] = {
|
||||
0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
|
||||
0
|
||||
};
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
||||
spec->gen.preferred_dacs = preferred_pairs;
|
||||
spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
|
||||
snd_hda_apply_pincfgs(codec, pincfgs);
|
||||
} else if (action == HDA_FIXUP_ACT_INIT) {
|
||||
|
@ -5540,6 +5536,23 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
|
||||
static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
/* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
|
||||
* the speaker output becomes too low by some reason on Thinkpads with
|
||||
* ALC298 codec
|
||||
*/
|
||||
static const hda_nid_t preferred_pairs[] = {
|
||||
0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
|
||||
0
|
||||
};
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
if (action == HDA_FIXUP_ACT_PRE_PROBE)
|
||||
spec->gen.preferred_dacs = preferred_pairs;
|
||||
}
|
||||
|
||||
static void alc_shutup_dell_xps13(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
@ -5893,6 +5906,15 @@ static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
|
|||
}
|
||||
}
|
||||
|
||||
static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
if (action != HDA_FIXUP_ACT_PRE_PROBE)
|
||||
return;
|
||||
|
||||
codec->power_save_node = 1;
|
||||
}
|
||||
|
||||
/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
|
||||
static void alc274_fixup_bind_dacs(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
|
@ -5997,6 +6019,7 @@ enum {
|
|||
ALC269_FIXUP_HP_LINE1_MIC1_LED,
|
||||
ALC269_FIXUP_INV_DMIC,
|
||||
ALC269_FIXUP_LENOVO_DOCK,
|
||||
ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
|
||||
ALC269_FIXUP_NO_SHUTUP,
|
||||
ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
|
||||
ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
|
||||
|
@ -6082,9 +6105,11 @@ enum {
|
|||
ALC233_FIXUP_ACER_HEADSET_MIC,
|
||||
ALC294_FIXUP_LENOVO_MIC_LOCATION,
|
||||
ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
|
||||
ALC225_FIXUP_S3_POP_NOISE,
|
||||
ALC700_FIXUP_INTEL_REFERENCE,
|
||||
ALC274_FIXUP_DELL_BIND_DACS,
|
||||
ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
|
||||
ALC298_FIXUP_TPT470_DOCK_FIX,
|
||||
ALC298_FIXUP_TPT470_DOCK,
|
||||
ALC255_FIXUP_DUMMY_LINEOUT_VERB,
|
||||
ALC255_FIXUP_DELL_HEADSET_MIC,
|
||||
|
@ -6117,9 +6142,12 @@ enum {
|
|||
ALC294_FIXUP_ASUS_DUAL_SPK,
|
||||
ALC285_FIXUP_THINKPAD_HEADSET_JACK,
|
||||
ALC294_FIXUP_ASUS_HPE,
|
||||
ALC294_FIXUP_ASUS_COEF_1B,
|
||||
ALC285_FIXUP_HP_GPIO_LED,
|
||||
ALC285_FIXUP_HP_MUTE_LED,
|
||||
ALC236_FIXUP_HP_MUTE_LED,
|
||||
ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
|
||||
ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
|
@ -6317,6 +6345,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
|
||||
},
|
||||
[ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_limit_int_mic_boost,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_LENOVO_DOCK,
|
||||
},
|
||||
[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
|
||||
|
@ -6969,6 +7003,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC225_FIXUP_S3_POP_NOISE
|
||||
},
|
||||
[ALC225_FIXUP_S3_POP_NOISE] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc225_fixup_s3_pop_noise,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
[ALC700_FIXUP_INTEL_REFERENCE] = {
|
||||
|
@ -7001,12 +7041,18 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC274_FIXUP_DELL_BIND_DACS
|
||||
},
|
||||
[ALC298_FIXUP_TPT470_DOCK] = {
|
||||
[ALC298_FIXUP_TPT470_DOCK_FIX] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_tpt470_dock,
|
||||
.chained = true,
|
||||
.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
|
||||
},
|
||||
[ALC298_FIXUP_TPT470_DOCK] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_tpt470_dacs,
|
||||
.chained = true,
|
||||
.chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
|
||||
},
|
||||
[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
|
@ -7241,6 +7287,17 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_COEF_1B] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
/* Set bit 10 to correct noisy output after reboot from
|
||||
* Windows 10 (due to pop noise reduction?)
|
||||
*/
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
|
||||
{ }
|
||||
},
|
||||
},
|
||||
[ALC285_FIXUP_HP_GPIO_LED] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_hp_gpio_led,
|
||||
|
@ -7253,6 +7310,22 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc236_fixup_hp_mute_led,
|
||||
},
|
||||
[ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
|
||||
{ }
|
||||
},
|
||||
},
|
||||
[ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
|
@ -7420,8 +7493,10 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
|
||||
SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
|
||||
SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
|
@ -7447,6 +7522,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
|
||||
SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
|
||||
SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
|
||||
SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
||||
SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
|
||||
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
|
||||
|
@ -7457,12 +7534,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
|
||||
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),
|
||||
SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
|
||||
|
@ -7601,6 +7679,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|||
{.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
|
||||
{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
|
||||
{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
|
||||
{.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
|
||||
{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
|
||||
{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
|
||||
{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
|
||||
|
@ -7612,6 +7691,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
|||
{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
|
||||
{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
|
||||
{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
|
||||
{.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
|
||||
{.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
|
||||
{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
|
||||
{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
|
||||
|
@ -8029,6 +8109,18 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
{0x12, 0x90a60130},
|
||||
{0x17, 0x90170110},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||
{0x12, 0x90a60120},
|
||||
{0x17, 0x90170110},
|
||||
{0x21, 0x04211030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||
{0x12, 0x90a60130},
|
||||
{0x17, 0x90170110},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
|
||||
{0x12, 0x90a60130},
|
||||
{0x17, 0x90170110},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
|
||||
{0x14, 0x90170110},
|
||||
{0x21, 0x04211020}),
|
||||
|
@ -8238,6 +8330,7 @@ static int patch_alc269(struct hda_codec *codec)
|
|||
case 0x10ec0215:
|
||||
case 0x10ec0245:
|
||||
case 0x10ec0285:
|
||||
case 0x10ec0287:
|
||||
case 0x10ec0289:
|
||||
spec->codec_variant = ALC269_TYPE_ALC215;
|
||||
spec->shutup = alc225_shutup;
|
||||
|
@ -8245,8 +8338,6 @@ static int patch_alc269(struct hda_codec *codec)
|
|||
spec->gen.mixer_nid = 0;
|
||||
break;
|
||||
case 0x10ec0225:
|
||||
codec->power_save_node = 1;
|
||||
/* fall through */
|
||||
case 0x10ec0295:
|
||||
case 0x10ec0299:
|
||||
spec->codec_variant = ALC269_TYPE_ALC225;
|
||||
|
@ -9518,6 +9609,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = {
|
|||
HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
|
||||
HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
|
||||
HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
|
||||
HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
|
||||
HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
|
||||
HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
|
||||
HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
|
||||
|
|
|
@ -2332,7 +2332,8 @@ static int snd_ice1712_chip_init(struct snd_ice1712 *ice)
|
|||
pci_write_config_byte(ice->pci, 0x61, ice->eeprom.data[ICE_EEP1_ACLINK]);
|
||||
pci_write_config_byte(ice->pci, 0x62, ice->eeprom.data[ICE_EEP1_I2SID]);
|
||||
pci_write_config_byte(ice->pci, 0x63, ice->eeprom.data[ICE_EEP1_SPDIF]);
|
||||
if (ice->eeprom.subvendor != ICE1712_SUBDEVICE_STDSP24) {
|
||||
if (ice->eeprom.subvendor != ICE1712_SUBDEVICE_STDSP24 &&
|
||||
ice->eeprom.subvendor != ICE1712_SUBDEVICE_STAUDIO_ADCIII) {
|
||||
ice->gpio.write_mask = ice->eeprom.gpiomask;
|
||||
ice->gpio.direction = ice->eeprom.gpiodir;
|
||||
snd_ice1712_write(ice, ICE1712_IREG_GPIO_WRITE_MASK,
|
||||
|
|
|
@ -21,8 +21,7 @@
|
|||
enum {
|
||||
LINE6_PODHD300,
|
||||
LINE6_PODHD400,
|
||||
LINE6_PODHD500_0,
|
||||
LINE6_PODHD500_1,
|
||||
LINE6_PODHD500,
|
||||
LINE6_PODX3,
|
||||
LINE6_PODX3LIVE,
|
||||
LINE6_PODHD500X,
|
||||
|
@ -318,8 +317,7 @@ static const struct usb_device_id podhd_id_table[] = {
|
|||
/* TODO: no need to alloc data interfaces when only audio is used */
|
||||
{ LINE6_DEVICE(0x5057), .driver_info = LINE6_PODHD300 },
|
||||
{ LINE6_DEVICE(0x5058), .driver_info = LINE6_PODHD400 },
|
||||
{ LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500_0 },
|
||||
{ LINE6_IF_NUM(0x414D, 1), .driver_info = LINE6_PODHD500_1 },
|
||||
{ LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500 },
|
||||
{ LINE6_IF_NUM(0x414A, 0), .driver_info = LINE6_PODX3 },
|
||||
{ LINE6_IF_NUM(0x414B, 0), .driver_info = LINE6_PODX3LIVE },
|
||||
{ LINE6_IF_NUM(0x4159, 0), .driver_info = LINE6_PODHD500X },
|
||||
|
@ -352,23 +350,13 @@ static const struct line6_properties podhd_properties_table[] = {
|
|||
.ep_audio_r = 0x82,
|
||||
.ep_audio_w = 0x01,
|
||||
},
|
||||
[LINE6_PODHD500_0] = {
|
||||
[LINE6_PODHD500] = {
|
||||
.id = "PODHD500",
|
||||
.name = "POD HD500",
|
||||
.capabilities = LINE6_CAP_PCM
|
||||
.capabilities = LINE6_CAP_PCM | LINE6_CAP_CONTROL
|
||||
| LINE6_CAP_HWMON,
|
||||
.altsetting = 1,
|
||||
.ep_ctrl_r = 0x81,
|
||||
.ep_ctrl_w = 0x01,
|
||||
.ep_audio_r = 0x86,
|
||||
.ep_audio_w = 0x02,
|
||||
},
|
||||
[LINE6_PODHD500_1] = {
|
||||
.id = "PODHD500",
|
||||
.name = "POD HD500",
|
||||
.capabilities = LINE6_CAP_PCM
|
||||
| LINE6_CAP_HWMON,
|
||||
.altsetting = 0,
|
||||
.ctrl_if = 1,
|
||||
.ep_ctrl_r = 0x81,
|
||||
.ep_ctrl_w = 0x01,
|
||||
.ep_audio_r = 0x86,
|
||||
|
|
|
@ -1182,6 +1182,14 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
|||
cval->res = 384;
|
||||
}
|
||||
break;
|
||||
case USB_ID(0x0495, 0x3042): /* ESS Technology Asus USB DAC */
|
||||
if ((strstr(kctl->id.name, "Playback Volume") != NULL) ||
|
||||
strstr(kctl->id.name, "Capture Volume") != NULL) {
|
||||
cval->min >>= 8;
|
||||
cval->max = 0;
|
||||
cval->res = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -397,6 +397,21 @@ static const struct usbmix_connector_map trx40_mobo_connector_map[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
/* Rear panel + front mic on Gigabyte TRX40 Aorus Master with ALC1220-VB */
|
||||
static const struct usbmix_name_map aorus_master_alc1220vb_map[] = {
|
||||
{ 17, NULL }, /* OT, IEC958?, disabled */
|
||||
{ 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */
|
||||
{ 16, "Line Out" }, /* OT */
|
||||
{ 22, "Line Out Playback" }, /* FU */
|
||||
{ 7, "Line" }, /* IT */
|
||||
{ 19, "Line Capture" }, /* FU */
|
||||
{ 8, "Mic" }, /* IT */
|
||||
{ 20, "Mic Capture" }, /* FU */
|
||||
{ 9, "Front Mic" }, /* IT */
|
||||
{ 21, "Front Mic Capture" }, /* FU */
|
||||
{}
|
||||
};
|
||||
|
||||
/*
|
||||
* Control map entries
|
||||
*/
|
||||
|
@ -526,6 +541,10 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|||
.id = USB_ID(0x1b1c, 0x0a42),
|
||||
.map = corsair_virtuoso_map,
|
||||
},
|
||||
{ /* Gigabyte TRX40 Aorus Master (rear panel + front mic) */
|
||||
.id = USB_ID(0x0414, 0xa001),
|
||||
.map = aorus_master_alc1220vb_map,
|
||||
},
|
||||
{ /* Gigabyte TRX40 Aorus Pro WiFi */
|
||||
.id = USB_ID(0x0414, 0xa002),
|
||||
.map = trx40_mobo_map,
|
||||
|
@ -549,6 +568,11 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|||
.map = trx40_mobo_map,
|
||||
.connector_map = trx40_mobo_connector_map,
|
||||
},
|
||||
{ /* Asrock TRX40 Creator */
|
||||
.id = USB_ID(0x26ce, 0x0a01),
|
||||
.map = trx40_mobo_map,
|
||||
.connector_map = trx40_mobo_connector_map,
|
||||
},
|
||||
{ 0 } /* terminator */
|
||||
};
|
||||
|
||||
|
|
|
@ -3563,6 +3563,32 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
|
|||
ALC1220_VB_DESKTOP(0x0414, 0xa002), /* Gigabyte TRX40 Aorus Pro WiFi */
|
||||
ALC1220_VB_DESKTOP(0x0db0, 0x0d64), /* MSI TRX40 Creator */
|
||||
ALC1220_VB_DESKTOP(0x0db0, 0x543d), /* MSI TRX40 */
|
||||
ALC1220_VB_DESKTOP(0x26ce, 0x0a01), /* Asrock TRX40 Creator */
|
||||
#undef ALC1220_VB_DESKTOP
|
||||
|
||||
/* Two entries for Gigabyte TRX40 Aorus Master:
|
||||
* TRX40 Aorus Master has two USB-audio devices, one for the front headphone
|
||||
* with ESS SABRE9218 DAC chip, while another for the rest I/O (the rear
|
||||
* panel and the front mic) with Realtek ALC1220-VB.
|
||||
* Here we provide two distinct names for making UCM profiles easier.
|
||||
*/
|
||||
{
|
||||
USB_DEVICE(0x0414, 0xa000),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "Gigabyte",
|
||||
.product_name = "Aorus Master Front Headphone",
|
||||
.profile_name = "Gigabyte-Aorus-Master-Front-Headphone",
|
||||
.ifnum = QUIRK_NO_INTERFACE
|
||||
}
|
||||
},
|
||||
{
|
||||
USB_DEVICE(0x0414, 0xa001),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "Gigabyte",
|
||||
.product_name = "Aorus Master Main Audio",
|
||||
.profile_name = "Gigabyte-Aorus-Master-Main-Audio",
|
||||
.ifnum = QUIRK_NO_INTERFACE
|
||||
}
|
||||
},
|
||||
|
||||
#undef USB_DEVICE_VENDOR_SPEC
|
||||
|
|
|
@ -1636,13 +1636,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
|
|||
&& (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
|
||||
msleep(20);
|
||||
|
||||
/* Zoom R16/24, Logitech H650e, Jabra 550a needs a tiny delay here,
|
||||
* otherwise requests like get/set frequency return as failed despite
|
||||
* actually succeeding.
|
||||
/* Zoom R16/24, Logitech H650e, Jabra 550a, Kingston HyperX needs a tiny
|
||||
* delay here, otherwise requests like get/set frequency return as
|
||||
* failed despite actually succeeding.
|
||||
*/
|
||||
if ((chip->usb_id == USB_ID(0x1686, 0x00dd) ||
|
||||
chip->usb_id == USB_ID(0x046d, 0x0a46) ||
|
||||
chip->usb_id == USB_ID(0x0b0e, 0x0349)) &&
|
||||
chip->usb_id == USB_ID(0x0b0e, 0x0349) ||
|
||||
chip->usb_id == USB_ID(0x0951, 0x16ad)) &&
|
||||
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
|
@ -1687,7 +1688,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
|||
|
||||
case USB_ID(0x0d8c, 0x0316): /* Hegel HD12 DSD */
|
||||
case USB_ID(0x10cb, 0x0103): /* The Bit Opus #3; with fp->dsd_raw */
|
||||
case USB_ID(0x16b0, 0x06b2): /* NuPrime DAC-10 */
|
||||
case USB_ID(0x16d0, 0x06b2): /* NuPrime DAC-10 */
|
||||
case USB_ID(0x16d0, 0x09dd): /* Encore mDSD */
|
||||
case USB_ID(0x16d0, 0x0733): /* Furutech ADL Stratos */
|
||||
case USB_ID(0x16d0, 0x09db): /* NuPrime Audio DAC-9 */
|
||||
|
|
Loading…
Reference in New Issue