Merge branch 'fix/hda' into topic/hda
This commit is contained in:
@@ -337,6 +337,7 @@ STAC92HD83*
|
|||||||
ref Reference board
|
ref Reference board
|
||||||
mic-ref Reference board with power management for ports
|
mic-ref Reference board with power management for ports
|
||||||
dell-s14 Dell laptop
|
dell-s14 Dell laptop
|
||||||
|
dell-vostro-3500 Dell Vostro 3500 laptop
|
||||||
hp HP laptops with (inverted) mute-LED
|
hp HP laptops with (inverted) mute-LED
|
||||||
hp-dv7-4000 HP dv-7 4000
|
hp-dv7-4000 HP dv-7 4000
|
||||||
auto BIOS setup (default)
|
auto BIOS setup (default)
|
||||||
|
|||||||
@@ -3062,7 +3062,6 @@ static const struct snd_pci_quirk cxt5066_cfg_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1043, 0x1993, "Asus U50F", CXT5066_ASUS),
|
SND_PCI_QUIRK(0x1043, 0x1993, "Asus U50F", CXT5066_ASUS),
|
||||||
SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD),
|
SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD),
|
||||||
SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
|
SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
|
||||||
SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5),
|
|
||||||
SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board",
|
SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board",
|
||||||
CXT5066_LAPTOP),
|
CXT5066_LAPTOP),
|
||||||
SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
|
SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ enum {
|
|||||||
STAC_92HD83XXX_REF,
|
STAC_92HD83XXX_REF,
|
||||||
STAC_92HD83XXX_PWR_REF,
|
STAC_92HD83XXX_PWR_REF,
|
||||||
STAC_DELL_S14,
|
STAC_DELL_S14,
|
||||||
|
STAC_DELL_VOSTRO_3500,
|
||||||
STAC_92HD83XXX_HP,
|
STAC_92HD83XXX_HP,
|
||||||
STAC_92HD83XXX_HP_cNB11_INTQUAD,
|
STAC_92HD83XXX_HP_cNB11_INTQUAD,
|
||||||
STAC_HP_DV7_4000,
|
STAC_HP_DV7_4000,
|
||||||
@@ -1659,6 +1660,12 @@ static const unsigned int dell_s14_pin_configs[10] = {
|
|||||||
0x40f000f0, 0x40f000f0,
|
0x40f000f0, 0x40f000f0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const unsigned int dell_vostro_3500_pin_configs[10] = {
|
||||||
|
0x02a11020, 0x0221101f, 0x400000f0, 0x90170110,
|
||||||
|
0x400000f1, 0x400000f2, 0x400000f3, 0x90a60160,
|
||||||
|
0x400000f4, 0x400000f5,
|
||||||
|
};
|
||||||
|
|
||||||
static const unsigned int hp_dv7_4000_pin_configs[10] = {
|
static const unsigned int hp_dv7_4000_pin_configs[10] = {
|
||||||
0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110,
|
0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110,
|
||||||
0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140,
|
0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140,
|
||||||
@@ -1675,6 +1682,7 @@ static const unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
|
|||||||
[STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
|
[STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
|
||||||
[STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
|
[STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
|
||||||
[STAC_DELL_S14] = dell_s14_pin_configs,
|
[STAC_DELL_S14] = dell_s14_pin_configs,
|
||||||
|
[STAC_DELL_VOSTRO_3500] = dell_vostro_3500_pin_configs,
|
||||||
[STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs,
|
[STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs,
|
||||||
[STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs,
|
[STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs,
|
||||||
};
|
};
|
||||||
@@ -1684,6 +1692,7 @@ static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
|
|||||||
[STAC_92HD83XXX_REF] = "ref",
|
[STAC_92HD83XXX_REF] = "ref",
|
||||||
[STAC_92HD83XXX_PWR_REF] = "mic-ref",
|
[STAC_92HD83XXX_PWR_REF] = "mic-ref",
|
||||||
[STAC_DELL_S14] = "dell-s14",
|
[STAC_DELL_S14] = "dell-s14",
|
||||||
|
[STAC_DELL_VOSTRO_3500] = "dell-vostro-3500",
|
||||||
[STAC_92HD83XXX_HP] = "hp",
|
[STAC_92HD83XXX_HP] = "hp",
|
||||||
[STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad",
|
[STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad",
|
||||||
[STAC_HP_DV7_4000] = "hp-dv7-4000",
|
[STAC_HP_DV7_4000] = "hp-dv7-4000",
|
||||||
@@ -1697,6 +1706,8 @@ static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
|
|||||||
"DFI LanParty", STAC_92HD83XXX_REF),
|
"DFI LanParty", STAC_92HD83XXX_REF),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
|
||||||
"unknown Dell", STAC_DELL_S14),
|
"unknown Dell", STAC_DELL_S14),
|
||||||
|
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028,
|
||||||
|
"Dell Vostro 3500", STAC_DELL_VOSTRO_3500),
|
||||||
SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600,
|
SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600,
|
||||||
"HP", STAC_92HD83XXX_HP),
|
"HP", STAC_92HD83XXX_HP),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656,
|
SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656,
|
||||||
|
|||||||
+59
-50
@@ -765,10 +765,60 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
|
|||||||
* interface to ALSA control for feature/mixer units
|
* interface to ALSA control for feature/mixer units
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* volume control quirks */
|
||||||
|
static void volume_control_quirks(struct usb_mixer_elem_info *cval,
|
||||||
|
struct snd_kcontrol *kctl)
|
||||||
|
{
|
||||||
|
switch (cval->mixer->chip->usb_id) {
|
||||||
|
case USB_ID(0x0471, 0x0101):
|
||||||
|
case USB_ID(0x0471, 0x0104):
|
||||||
|
case USB_ID(0x0471, 0x0105):
|
||||||
|
case USB_ID(0x0672, 0x1041):
|
||||||
|
/* quirk for UDA1321/N101.
|
||||||
|
* note that detection between firmware 2.1.1.7 (N101)
|
||||||
|
* and later 2.1.1.21 is not very clear from datasheets.
|
||||||
|
* I hope that the min value is -15360 for newer firmware --jk
|
||||||
|
*/
|
||||||
|
if (!strcmp(kctl->id.name, "PCM Playback Volume") &&
|
||||||
|
cval->min == -15616) {
|
||||||
|
snd_printk(KERN_INFO
|
||||||
|
"set volume quirk for UDA1321/N101 chip\n");
|
||||||
|
cval->max = -256;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_ID(0x046d, 0x09a4):
|
||||||
|
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
|
||||||
|
snd_printk(KERN_INFO
|
||||||
|
"set volume quirk for QuickCam E3500\n");
|
||||||
|
cval->min = 6080;
|
||||||
|
cval->max = 8768;
|
||||||
|
cval->res = 192;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case USB_ID(0x046d, 0x0808):
|
||||||
|
case USB_ID(0x046d, 0x0809):
|
||||||
|
case USB_ID(0x046d, 0x0991):
|
||||||
|
/* Most audio usb devices lie about volume resolution.
|
||||||
|
* Most Logitech webcams have res = 384.
|
||||||
|
* Proboly there is some logitech magic behind this number --fishor
|
||||||
|
*/
|
||||||
|
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
|
||||||
|
snd_printk(KERN_INFO
|
||||||
|
"set resolution quirk: cval->res = 384\n");
|
||||||
|
cval->res = 384;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* retrieve the minimum and maximum values for the specified control
|
* retrieve the minimum and maximum values for the specified control
|
||||||
*/
|
*/
|
||||||
static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
|
static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,
|
||||||
|
int default_min, struct snd_kcontrol *kctl)
|
||||||
{
|
{
|
||||||
/* for failsafe */
|
/* for failsafe */
|
||||||
cval->min = default_min;
|
cval->min = default_min;
|
||||||
@@ -844,6 +894,9 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
|
|||||||
cval->initialized = 1;
|
cval->initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kctl)
|
||||||
|
volume_control_quirks(cval, kctl);
|
||||||
|
|
||||||
/* USB descriptions contain the dB scale in 1/256 dB unit
|
/* USB descriptions contain the dB scale in 1/256 dB unit
|
||||||
* while ALSA TLV contains in 1/100 dB unit
|
* while ALSA TLV contains in 1/100 dB unit
|
||||||
*/
|
*/
|
||||||
@@ -864,6 +917,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define get_min_max(cval, def) get_min_max_with_quirks(cval, def, NULL)
|
||||||
|
|
||||||
/* get a feature/mixer unit info */
|
/* get a feature/mixer unit info */
|
||||||
static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
|
static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
|
||||||
@@ -882,7 +936,7 @@ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_
|
|||||||
uinfo->value.integer.max = 1;
|
uinfo->value.integer.max = 1;
|
||||||
} else {
|
} else {
|
||||||
if (!cval->initialized) {
|
if (!cval->initialized) {
|
||||||
get_min_max(cval, 0);
|
get_min_max_with_quirks(cval, 0, kcontrol);
|
||||||
if (cval->initialized && cval->dBmin >= cval->dBmax) {
|
if (cval->initialized && cval->dBmin >= cval->dBmax) {
|
||||||
kcontrol->vd[0].access &=
|
kcontrol->vd[0].access &=
|
||||||
~(SNDRV_CTL_ELEM_ACCESS_TLV_READ |
|
~(SNDRV_CTL_ELEM_ACCESS_TLV_READ |
|
||||||
@@ -1045,9 +1099,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
|
|||||||
cval->ch_readonly = readonly_mask;
|
cval->ch_readonly = readonly_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get min/max values */
|
|
||||||
get_min_max(cval, 0);
|
|
||||||
|
|
||||||
/* if all channels in the mask are marked read-only, make the control
|
/* if all channels in the mask are marked read-only, make the control
|
||||||
* read-only. set_cur_mix_value() will check the mask again and won't
|
* read-only. set_cur_mix_value() will check the mask again and won't
|
||||||
* issue write commands to read-only channels. */
|
* issue write commands to read-only channels. */
|
||||||
@@ -1069,6 +1120,9 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
|
|||||||
len = snd_usb_copy_string_desc(state, nameid,
|
len = snd_usb_copy_string_desc(state, nameid,
|
||||||
kctl->id.name, sizeof(kctl->id.name));
|
kctl->id.name, sizeof(kctl->id.name));
|
||||||
|
|
||||||
|
/* get min/max values */
|
||||||
|
get_min_max_with_quirks(cval, 0, kctl);
|
||||||
|
|
||||||
switch (control) {
|
switch (control) {
|
||||||
case UAC_FU_MUTE:
|
case UAC_FU_MUTE:
|
||||||
case UAC_FU_VOLUME:
|
case UAC_FU_VOLUME:
|
||||||
@@ -1118,51 +1172,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* volume control quirks */
|
|
||||||
switch (state->chip->usb_id) {
|
|
||||||
case USB_ID(0x0471, 0x0101):
|
|
||||||
case USB_ID(0x0471, 0x0104):
|
|
||||||
case USB_ID(0x0471, 0x0105):
|
|
||||||
case USB_ID(0x0672, 0x1041):
|
|
||||||
/* quirk for UDA1321/N101.
|
|
||||||
* note that detection between firmware 2.1.1.7 (N101)
|
|
||||||
* and later 2.1.1.21 is not very clear from datasheets.
|
|
||||||
* I hope that the min value is -15360 for newer firmware --jk
|
|
||||||
*/
|
|
||||||
if (!strcmp(kctl->id.name, "PCM Playback Volume") &&
|
|
||||||
cval->min == -15616) {
|
|
||||||
snd_printk(KERN_INFO
|
|
||||||
"set volume quirk for UDA1321/N101 chip\n");
|
|
||||||
cval->max = -256;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_ID(0x046d, 0x09a4):
|
|
||||||
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
|
|
||||||
snd_printk(KERN_INFO
|
|
||||||
"set volume quirk for QuickCam E3500\n");
|
|
||||||
cval->min = 6080;
|
|
||||||
cval->max = 8768;
|
|
||||||
cval->res = 192;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case USB_ID(0x046d, 0x0808):
|
|
||||||
case USB_ID(0x046d, 0x0809):
|
|
||||||
case USB_ID(0x046d, 0x0991):
|
|
||||||
/* Most audio usb devices lie about volume resolution.
|
|
||||||
* Most Logitech webcams have res = 384.
|
|
||||||
* Proboly there is some logitech magic behind this number --fishor
|
|
||||||
*/
|
|
||||||
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
|
|
||||||
snd_printk(KERN_INFO
|
|
||||||
"set resolution quirk: cval->res = 384\n");
|
|
||||||
cval->res = 384;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
range = (cval->max - cval->min) / cval->res;
|
range = (cval->max - cval->min) / cval->res;
|
||||||
/* Are there devices with volume range more than 255? I use a bit more
|
/* Are there devices with volume range more than 255? I use a bit more
|
||||||
* to be sure. 384 is a resolution magic number found on Logitech
|
* to be sure. 384 is a resolution magic number found on Logitech
|
||||||
|
|||||||
Reference in New Issue
Block a user