Merge remote-tracking branch 'common/android-4.9' into hikey-4.9
Change-Id: Ie0f65aaf95887a04321609659e5cae63066b41ca
This commit is contained in:
+12
-3
@@ -579,15 +579,14 @@ static int snd_rawmidi_info_user(struct snd_rawmidi_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info)
|
||||
static int __snd_rawmidi_info_select(struct snd_card *card,
|
||||
struct snd_rawmidi_info *info)
|
||||
{
|
||||
struct snd_rawmidi *rmidi;
|
||||
struct snd_rawmidi_str *pstr;
|
||||
struct snd_rawmidi_substream *substream;
|
||||
|
||||
mutex_lock(®ister_mutex);
|
||||
rmidi = snd_rawmidi_search(card, info->device);
|
||||
mutex_unlock(®ister_mutex);
|
||||
if (!rmidi)
|
||||
return -ENXIO;
|
||||
if (info->stream < 0 || info->stream > 1)
|
||||
@@ -603,6 +602,16 @@ int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info
|
||||
}
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(®ister_mutex);
|
||||
ret = __snd_rawmidi_info_select(card, info);
|
||||
mutex_unlock(®ister_mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_rawmidi_info_select);
|
||||
|
||||
static int snd_rawmidi_info_select_user(struct snd_card *card,
|
||||
|
||||
@@ -261,6 +261,7 @@ enum {
|
||||
CXT_FIXUP_HP_530,
|
||||
CXT_FIXUP_CAP_MIX_AMP_5047,
|
||||
CXT_FIXUP_MUTE_LED_EAPD,
|
||||
CXT_FIXUP_HP_DOCK,
|
||||
CXT_FIXUP_HP_SPECTRE,
|
||||
CXT_FIXUP_HP_GATE_MIC,
|
||||
};
|
||||
@@ -778,6 +779,14 @@ static const struct hda_fixup cxt_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = cxt_fixup_mute_led_eapd,
|
||||
},
|
||||
[CXT_FIXUP_HP_DOCK] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x16, 0x21011020 }, /* line-out */
|
||||
{ 0x18, 0x2181103f }, /* line-in */
|
||||
{ }
|
||||
}
|
||||
},
|
||||
[CXT_FIXUP_HP_SPECTRE] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
@@ -839,6 +848,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
|
||||
SND_PCI_QUIRK(0x1025, 0x0543, "Acer Aspire One 522", CXT_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", CXT_FIXUP_ASPIRE_DMIC),
|
||||
SND_PCI_QUIRK(0x1025, 0x054f, "Acer Aspire 4830T", CXT_FIXUP_ASPIRE_DMIC),
|
||||
SND_PCI_QUIRK(0x103c, 0x8079, "HP EliteBook 840 G3", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
|
||||
SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
|
||||
@@ -872,6 +882,7 @@ static const struct hda_model_fixup cxt5066_fixup_models[] = {
|
||||
{ .id = CXT_PINCFG_LEMOTE_A1205, .name = "lemote-a1205" },
|
||||
{ .id = CXT_FIXUP_OLPC_XO, .name = "olpc-xo" },
|
||||
{ .id = CXT_FIXUP_MUTE_LED_EAPD, .name = "mute-led-eapd" },
|
||||
{ .id = CXT_FIXUP_HP_DOCK, .name = "hp-dock" },
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -4854,6 +4854,7 @@ enum {
|
||||
ALC286_FIXUP_HP_GPIO_LED,
|
||||
ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
|
||||
ALC280_FIXUP_HP_DOCK_PINS,
|
||||
ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
|
||||
ALC280_FIXUP_HP_9480M,
|
||||
ALC288_FIXUP_DELL_HEADSET_MODE,
|
||||
ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
@@ -5394,6 +5395,16 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC280_FIXUP_HP_GPIO4
|
||||
},
|
||||
[ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x1b, 0x21011020 }, /* line-out */
|
||||
{ 0x18, 0x2181103f }, /* line-in */
|
||||
{ },
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
|
||||
},
|
||||
[ALC280_FIXUP_HP_9480M] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc280_fixup_hp_9480m,
|
||||
@@ -5646,7 +5657,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
|
||||
@@ -5812,6 +5823,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||
{.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_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"},
|
||||
{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
|
||||
{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
|
||||
|
||||
@@ -166,9 +166,11 @@ static int img_prl_out_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(prl->dev);
|
||||
reg = img_prl_out_readl(prl, IMG_PRL_OUT_CTL);
|
||||
reg = (reg & ~IMG_PRL_OUT_CTL_EDGE_MASK) | control_set;
|
||||
img_prl_out_writel(prl, reg, IMG_PRL_OUT_CTL);
|
||||
pm_runtime_put(prl->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -364,6 +364,8 @@ static int uni_reader_startup(struct snd_pcm_substream *substream,
|
||||
struct uniperif *reader = priv->dai_data.uni;
|
||||
int ret;
|
||||
|
||||
reader->substream = substream;
|
||||
|
||||
if (!UNIPERIF_TYPE_IS_TDM(reader))
|
||||
return 0;
|
||||
|
||||
@@ -393,6 +395,7 @@ static void uni_reader_shutdown(struct snd_pcm_substream *substream,
|
||||
/* Stop the reader */
|
||||
uni_reader_stop(reader);
|
||||
}
|
||||
reader->substream = NULL;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dai_ops uni_reader_dai_ops = {
|
||||
|
||||
+16
-11
@@ -2167,20 +2167,25 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid,
|
||||
kctl->private_value = (unsigned long)namelist;
|
||||
kctl->private_free = usb_mixer_selector_elem_free;
|
||||
|
||||
nameid = uac_selector_unit_iSelector(desc);
|
||||
/* check the static mapping table at first */
|
||||
len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
|
||||
if (len)
|
||||
;
|
||||
else if (nameid)
|
||||
len = snd_usb_copy_string_desc(state, nameid, kctl->id.name,
|
||||
sizeof(kctl->id.name));
|
||||
else
|
||||
len = get_term_name(state, &state->oterm,
|
||||
kctl->id.name, sizeof(kctl->id.name), 0);
|
||||
|
||||
if (!len) {
|
||||
strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name));
|
||||
/* no mapping ? */
|
||||
/* if iSelector is given, use it */
|
||||
nameid = uac_selector_unit_iSelector(desc);
|
||||
if (nameid)
|
||||
len = snd_usb_copy_string_desc(state, nameid,
|
||||
kctl->id.name,
|
||||
sizeof(kctl->id.name));
|
||||
/* ... or pick up the terminal name at next */
|
||||
if (!len)
|
||||
len = get_term_name(state, &state->oterm,
|
||||
kctl->id.name, sizeof(kctl->id.name), 0);
|
||||
/* ... or use the fixed string "USB" as the last resort */
|
||||
if (!len)
|
||||
strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name));
|
||||
|
||||
/* and add the proper suffix */
|
||||
if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR)
|
||||
append_ctl_name(kctl, " Clock Source");
|
||||
else if ((state->oterm.type & 0xff00) == 0x0100)
|
||||
|
||||
+4
-3
@@ -1170,10 +1170,11 @@ static bool is_marantz_denon_dac(unsigned int id)
|
||||
/* TEAC UD-501/UD-503/NT-503 USB DACs need a vendor cmd to switch
|
||||
* between PCM/DOP and native DSD mode
|
||||
*/
|
||||
static bool is_teac_50X_dac(unsigned int id)
|
||||
static bool is_teac_dsd_dac(unsigned int id)
|
||||
{
|
||||
switch (id) {
|
||||
case USB_ID(0x0644, 0x8043): /* TEAC UD-501/UD-503/NT-503 */
|
||||
case USB_ID(0x0644, 0x8044): /* Esoteric D-05X */
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -1206,7 +1207,7 @@ int snd_usb_select_mode_quirk(struct snd_usb_substream *subs,
|
||||
break;
|
||||
}
|
||||
mdelay(20);
|
||||
} else if (is_teac_50X_dac(subs->stream->chip->usb_id)) {
|
||||
} else if (is_teac_dsd_dac(subs->stream->chip->usb_id)) {
|
||||
/* Vendor mode switch cmd is required. */
|
||||
switch (fmt->altsetting) {
|
||||
case 3: /* DSD mode (DSD_U32) requested */
|
||||
@@ -1376,7 +1377,7 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
|
||||
}
|
||||
|
||||
/* TEAC devices with USB DAC functionality */
|
||||
if (is_teac_50X_dac(chip->usb_id)) {
|
||||
if (is_teac_dsd_dac(chip->usb_id)) {
|
||||
if (fp->altsetting == 3)
|
||||
return SNDRV_PCM_FMTBIT_DSD_U32_BE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user