Merge tag 'sound-fix-4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai: "Here is a collection of small fixes on top of the previous update. All small and obvious fixes. Mostly for usual suspects, USB-audio and HD-audio, but a few trivial error handling fixes for misc drivers as well" * tag 'sound-fix-4.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: usb-audio: Always create the interrupt pipe for the mixer ALSA: usb-audio: Add insertion control for UAC3 BADD ALSA: usb-audio: Change in connectors control creation interface ALSA: usb-audio: Add bi-directional terminal types ALSA: lx6464es: add error handling for pci_ioremap_bar ALSA: sonicvibes: add error handling for snd_ctl_add ALSA: usb-audio: Remove explicitly listed Mytek devices ALSA: usb-audio: Generic DSD detection for XMOS-based implementations ALSA: usb-audio: Add native DSD support for Mytek DACs ALSA: hda/realtek - Add shutup hint ALSA: usb-audio: Disable the quirk for Nura headset ALSA: hda: add dock and led support for HP ProBook 640 G4 ALSA: hda: add dock and led support for HP EliteBook 830 G5 ALSA: emu10k1: add error handling for snd_ctl_add ALSA: fm801: add error handling for snd_ctl_add
此提交包含在:
@@ -32,6 +32,7 @@ struct audioformat {
|
||||
struct snd_pcm_chmap_elem *chmap; /* (optional) channel map */
|
||||
bool dsd_dop; /* add DOP headers in case of DSD samples */
|
||||
bool dsd_bitrev; /* reverse the bits of each DSD sample */
|
||||
bool dsd_raw; /* altsetting is raw DSD */
|
||||
};
|
||||
|
||||
struct snd_usb_substream;
|
||||
|
@@ -64,8 +64,11 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
|
||||
sample_width = fmt->bBitResolution;
|
||||
sample_bytes = fmt->bSubslotSize;
|
||||
|
||||
if (format & UAC2_FORMAT_TYPE_I_RAW_DATA)
|
||||
if (format & UAC2_FORMAT_TYPE_I_RAW_DATA) {
|
||||
pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
|
||||
/* flag potentially raw DSD capable altsettings */
|
||||
fp->dsd_raw = true;
|
||||
}
|
||||
|
||||
format <<= 1;
|
||||
break;
|
||||
|
@@ -1653,11 +1653,11 @@ static void build_feature_ctl_badd(struct usb_mixer_interface *mixer,
|
||||
NULL, NULL, unitid, 0, 0);
|
||||
}
|
||||
|
||||
static void get_connector_control_name(struct mixer_build *state,
|
||||
static void get_connector_control_name(struct usb_mixer_interface *mixer,
|
||||
struct usb_audio_term *term,
|
||||
bool is_input, char *name, int name_size)
|
||||
{
|
||||
int name_len = get_term_name(state->chip, term, name, name_size, 0);
|
||||
int name_len = get_term_name(mixer->chip, term, name, name_size, 0);
|
||||
|
||||
if (name_len == 0)
|
||||
strlcpy(name, "Unknown", name_size);
|
||||
@@ -1674,7 +1674,7 @@ static void get_connector_control_name(struct mixer_build *state,
|
||||
}
|
||||
|
||||
/* Build a mixer control for a UAC connector control (jack-detect) */
|
||||
static void build_connector_control(struct mixer_build *state,
|
||||
static void build_connector_control(struct usb_mixer_interface *mixer,
|
||||
struct usb_audio_term *term, bool is_input)
|
||||
{
|
||||
struct snd_kcontrol *kctl;
|
||||
@@ -1683,7 +1683,7 @@ static void build_connector_control(struct mixer_build *state,
|
||||
cval = kzalloc(sizeof(*cval), GFP_KERNEL);
|
||||
if (!cval)
|
||||
return;
|
||||
snd_usb_mixer_elem_init_std(&cval->head, state->mixer, term->id);
|
||||
snd_usb_mixer_elem_init_std(&cval->head, mixer, term->id);
|
||||
/*
|
||||
* UAC2: The first byte from reading the UAC2_TE_CONNECTOR control returns the
|
||||
* number of channels connected.
|
||||
@@ -1694,7 +1694,7 @@ static void build_connector_control(struct mixer_build *state,
|
||||
* This boolean ctl will simply report if any channels are connected
|
||||
* or not.
|
||||
*/
|
||||
if (state->mixer->protocol == UAC_VERSION_2)
|
||||
if (mixer->protocol == UAC_VERSION_2)
|
||||
cval->control = UAC2_TE_CONNECTOR;
|
||||
else /* UAC_VERSION_3 */
|
||||
cval->control = UAC3_TE_INSERTION;
|
||||
@@ -1705,11 +1705,11 @@ static void build_connector_control(struct mixer_build *state,
|
||||
cval->max = 1;
|
||||
kctl = snd_ctl_new1(&usb_connector_ctl_ro, cval);
|
||||
if (!kctl) {
|
||||
usb_audio_err(state->chip, "cannot malloc kcontrol\n");
|
||||
usb_audio_err(mixer->chip, "cannot malloc kcontrol\n");
|
||||
kfree(cval);
|
||||
return;
|
||||
}
|
||||
get_connector_control_name(state, term, is_input, kctl->id.name,
|
||||
get_connector_control_name(mixer, term, is_input, kctl->id.name,
|
||||
sizeof(kctl->id.name));
|
||||
kctl->private_free = snd_usb_mixer_elem_free;
|
||||
snd_usb_mixer_add_control(&cval->head, kctl);
|
||||
@@ -2042,7 +2042,7 @@ static int parse_audio_input_terminal(struct mixer_build *state, int unitid,
|
||||
|
||||
/* Check for jack detection. */
|
||||
if (uac_v2v3_control_is_readable(bmctls, control))
|
||||
build_connector_control(state, &iterm, true);
|
||||
build_connector_control(state->mixer, &iterm, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2918,6 +2918,23 @@ static int snd_usb_mixer_controls_badd(struct usb_mixer_interface *mixer,
|
||||
UAC3_BADD_FU_ID7, map->map);
|
||||
}
|
||||
|
||||
/* Insertion Control */
|
||||
if (f->subclass == UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER) {
|
||||
struct usb_audio_term iterm, oterm;
|
||||
|
||||
/* Input Term - Insertion control */
|
||||
memset(&iterm, 0, sizeof(iterm));
|
||||
iterm.id = UAC3_BADD_IT_ID4;
|
||||
iterm.type = UAC_BIDIR_TERMINAL_HEADSET;
|
||||
build_connector_control(mixer, &iterm, true);
|
||||
|
||||
/* Output Term - Insertion control */
|
||||
memset(&oterm, 0, sizeof(oterm));
|
||||
oterm.id = UAC3_BADD_OT_ID3;
|
||||
oterm.type = UAC_BIDIR_TERMINAL_HEADSET;
|
||||
build_connector_control(mixer, &oterm, false);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2990,7 +3007,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
|
||||
|
||||
if (uac_v2v3_control_is_readable(le16_to_cpu(desc->bmControls),
|
||||
UAC2_TE_CONNECTOR)) {
|
||||
build_connector_control(&state, &state.oterm,
|
||||
build_connector_control(state.mixer, &state.oterm,
|
||||
false);
|
||||
}
|
||||
} else { /* UAC_VERSION_3 */
|
||||
@@ -3017,7 +3034,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
|
||||
|
||||
if (uac_v2v3_control_is_readable(le32_to_cpu(desc->bmControls),
|
||||
UAC3_TE_INSERTION)) {
|
||||
build_connector_control(&state, &state.oterm,
|
||||
build_connector_control(state.mixer, &state.oterm,
|
||||
false);
|
||||
}
|
||||
}
|
||||
@@ -3321,10 +3338,12 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
|
||||
err = snd_usb_mixer_controls(mixer);
|
||||
if (err < 0)
|
||||
goto _error;
|
||||
err = snd_usb_mixer_status_create(mixer);
|
||||
if (err < 0)
|
||||
goto _error;
|
||||
}
|
||||
|
||||
err = snd_usb_mixer_status_create(mixer);
|
||||
if (err < 0)
|
||||
goto _error;
|
||||
|
||||
err = create_keep_iface_ctl(mixer);
|
||||
if (err < 0)
|
||||
goto _error;
|
||||
|
@@ -3277,6 +3277,10 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
|
||||
}
|
||||
},
|
||||
|
||||
/* disabled due to regression for other devices;
|
||||
* see https://bugzilla.kernel.org/show_bug.cgi?id=199905
|
||||
*/
|
||||
#if 0
|
||||
{
|
||||
/*
|
||||
* Nura's first gen headphones use Cambridge Silicon Radio's vendor
|
||||
@@ -3324,6 +3328,7 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"),
|
||||
}
|
||||
}
|
||||
},
|
||||
#endif /* disabled */
|
||||
|
||||
{
|
||||
/*
|
||||
|
@@ -1362,16 +1362,12 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
||||
case USB_ID(0x1511, 0x0037): /* AURALiC VEGA */
|
||||
case USB_ID(0x20b1, 0x0002): /* Wyred 4 Sound DAC-2 DSD */
|
||||
case USB_ID(0x20b1, 0x2004): /* Matrix Audio X-SPDIF 2 */
|
||||
case USB_ID(0x20b1, 0x3008): /* iFi Audio micro/nano iDSD */
|
||||
case USB_ID(0x20b1, 0x2008): /* Matrix Audio X-Sabre */
|
||||
case USB_ID(0x20b1, 0x300a): /* Matrix Audio Mini-i Pro */
|
||||
case USB_ID(0x22d9, 0x0416): /* OPPO HA-1 */
|
||||
case USB_ID(0x22d9, 0x0436): /* OPPO Sonica */
|
||||
case USB_ID(0x22d9, 0x0461): /* OPPO UDP-205 */
|
||||
case USB_ID(0x2522, 0x0012): /* LH Labs VI DAC Infinity */
|
||||
case USB_ID(0x25ce, 0x001f): /* Mytek Brooklyn DAC */
|
||||
case USB_ID(0x25ce, 0x0021): /* Mytek Manhattan DAC */
|
||||
case USB_ID(0x25ce, 0x8025): /* Mytek Brooklyn DAC+ */
|
||||
case USB_ID(0x2772, 0x0230): /* Pro-Ject Pre Box S2 Digital */
|
||||
if (fp->altsetting == 2)
|
||||
return SNDRV_PCM_FMTBIT_DSD_U32_BE;
|
||||
@@ -1389,7 +1385,6 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
||||
case USB_ID(0x20b1, 0x3021): /* Eastern El. MiniMax Tube DAC Supreme */
|
||||
case USB_ID(0x20b1, 0x3023): /* Aune X1S 32BIT/384 DSD DAC */
|
||||
case USB_ID(0x20b1, 0x302d): /* Unison Research Unico CD Due */
|
||||
case USB_ID(0x20b1, 0x3036): /* Holo Springs Level 3 R2R DAC */
|
||||
case USB_ID(0x20b1, 0x307b): /* CH Precision C1 DAC */
|
||||
case USB_ID(0x20b1, 0x3086): /* Singxer F-1 converter board */
|
||||
case USB_ID(0x22d9, 0x0426): /* OPPO HA-2 */
|
||||
@@ -1443,6 +1438,20 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
||||
return SNDRV_PCM_FMTBIT_DSD_U32_BE;
|
||||
}
|
||||
|
||||
/* Mostly generic method to detect many DSD-capable implementations -
|
||||
* from XMOS/Thesycon
|
||||
*/
|
||||
switch (USB_ID_VENDOR(chip->usb_id)) {
|
||||
case 0x20b1: /* XMOS based devices */
|
||||
case 0x25ce: /* Mytek devices */
|
||||
if (fp->dsd_raw)
|
||||
return SNDRV_PCM_FMTBIT_DSD_U32_BE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
新增問題並參考
封鎖使用者