Merge branch 'fix/hda' into topic/hda
The fix for bitmap-overflow in Realtek codec driver is needed for the further development of the auto-parser with badness evaluation.
This commit is contained in:
commit
00bc0ce913
|
@ -80,6 +80,8 @@ enum {
|
|||
ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */
|
||||
};
|
||||
|
||||
#define MAX_VOL_NIDS 0x40
|
||||
|
||||
struct alc_spec {
|
||||
/* codec parameterization */
|
||||
const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
|
||||
|
@ -118,8 +120,8 @@ struct alc_spec {
|
|||
const hda_nid_t *capsrc_nids;
|
||||
hda_nid_t dig_in_nid; /* digital-in NID; optional */
|
||||
hda_nid_t mixer_nid; /* analog-mixer NID */
|
||||
DECLARE_BITMAP(vol_ctls, 0x20 << 1);
|
||||
DECLARE_BITMAP(sw_ctls, 0x20 << 1);
|
||||
DECLARE_BITMAP(vol_ctls, MAX_VOL_NIDS << 1);
|
||||
DECLARE_BITMAP(sw_ctls, MAX_VOL_NIDS << 1);
|
||||
|
||||
/* capture setup for dynamic dual-adc switch */
|
||||
hda_nid_t cur_adc;
|
||||
|
@ -3125,7 +3127,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)
|
|||
static inline unsigned int get_ctl_pos(unsigned int data)
|
||||
{
|
||||
hda_nid_t nid = get_amp_nid_(data);
|
||||
unsigned int dir = get_amp_direction_(data);
|
||||
unsigned int dir;
|
||||
if (snd_BUG_ON(nid >= MAX_VOL_NIDS))
|
||||
return 0;
|
||||
dir = get_amp_direction_(data);
|
||||
return (nid << 1) | dir;
|
||||
}
|
||||
|
||||
|
@ -4399,6 +4404,7 @@ enum {
|
|||
ALC882_FIXUP_ACER_ASPIRE_8930G,
|
||||
ALC882_FIXUP_ASPIRE_8930G_VERBS,
|
||||
ALC885_FIXUP_MACPRO_GPIO,
|
||||
ALC889_FIXUP_DAC_ROUTE,
|
||||
};
|
||||
|
||||
static void alc889_fixup_coef(struct hda_codec *codec,
|
||||
|
@ -4452,6 +4458,23 @@ static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
|
|||
alc882_gpio_mute(codec, 1, 0);
|
||||
}
|
||||
|
||||
/* Fix the connection of some pins for ALC889:
|
||||
* At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
|
||||
* work correctly (bko#42740)
|
||||
*/
|
||||
static void alc889_fixup_dac_route(struct hda_codec *codec,
|
||||
const struct alc_fixup *fix, int action)
|
||||
{
|
||||
if (action == ALC_FIXUP_ACT_PRE_PROBE) {
|
||||
hda_nid_t conn1[2] = { 0x0c, 0x0d };
|
||||
hda_nid_t conn2[2] = { 0x0e, 0x0f };
|
||||
snd_hda_override_conn_list(codec, 0x14, 2, conn1);
|
||||
snd_hda_override_conn_list(codec, 0x15, 2, conn1);
|
||||
snd_hda_override_conn_list(codec, 0x18, 2, conn2);
|
||||
snd_hda_override_conn_list(codec, 0x1a, 2, conn2);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct alc_fixup alc882_fixups[] = {
|
||||
[ALC882_FIXUP_ABIT_AW9D_MAX] = {
|
||||
.type = ALC_FIXUP_PINS,
|
||||
|
@ -4599,6 +4622,10 @@ static const struct alc_fixup alc882_fixups[] = {
|
|||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc885_fixup_macpro_gpio,
|
||||
},
|
||||
[ALC889_FIXUP_DAC_ROUTE] = {
|
||||
.type = ALC_FIXUP_FUNC,
|
||||
.v.func = alc889_fixup_dac_route,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
|
@ -4623,6 +4650,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
|
||||
ALC882_FIXUP_ACER_ASPIRE_4930G),
|
||||
SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
|
||||
SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
|
||||
SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
|
||||
SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
|
||||
|
|
|
@ -666,6 +666,9 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
|
|||
/* init input-src */
|
||||
for (i = 0; i < spec->num_adc_nids; i++) {
|
||||
int adc_idx = spec->inputs[spec->cur_mux[i]].adc_idx;
|
||||
/* secondary ADCs must have the unique MUX */
|
||||
if (i > 0 && !spec->mux_nids[i])
|
||||
break;
|
||||
if (spec->mux_nids[adc_idx]) {
|
||||
int mux_idx = spec->inputs[spec->cur_mux[i]].mux_idx;
|
||||
snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0,
|
||||
|
|
|
@ -2100,6 +2100,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
|
|||
.name = "MSI P4 ATX 645 Ultra",
|
||||
.type = AC97_TUNE_HP_ONLY
|
||||
},
|
||||
{
|
||||
.subvendor = 0x161f,
|
||||
.subdevice = 0x202f,
|
||||
.name = "Gateway M520",
|
||||
.type = AC97_TUNE_INV_EAPD
|
||||
},
|
||||
{
|
||||
.subvendor = 0x161f,
|
||||
.subdevice = 0x203a,
|
||||
|
|
|
@ -1152,12 +1152,8 @@ static snd_pcm_uframes_t fsi_pointer(struct snd_pcm_substream *substream)
|
|||
{
|
||||
struct fsi_priv *fsi = fsi_get_priv(substream);
|
||||
struct fsi_stream *io = fsi_get_stream(fsi, fsi_is_play(substream));
|
||||
int samples_pos = io->buff_sample_pos - 1;
|
||||
|
||||
if (samples_pos < 0)
|
||||
samples_pos = 0;
|
||||
|
||||
return fsi_sample2frame(fsi, samples_pos);
|
||||
return fsi_sample2frame(fsi, io->buff_sample_pos);
|
||||
}
|
||||
|
||||
static struct snd_pcm_ops fsi_pcm_ops = {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#ifndef __USBAUDIO_CARD_H
|
||||
#define __USBAUDIO_CARD_H
|
||||
|
||||
#define MAX_NR_RATES 1024
|
||||
#define MAX_PACKS 20
|
||||
#define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */
|
||||
#define MAX_URBS 8
|
||||
|
|
|
@ -209,8 +209,6 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define MAX_UAC2_NR_RATES 1024
|
||||
|
||||
/*
|
||||
* Helper function to walk the array of sample rate triplets reported by
|
||||
* the device. The problem is that we need to parse whole array first to
|
||||
|
@ -255,7 +253,7 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets,
|
|||
fp->rates |= snd_pcm_rate_to_rate_bit(rate);
|
||||
|
||||
nr_rates++;
|
||||
if (nr_rates >= MAX_UAC2_NR_RATES) {
|
||||
if (nr_rates >= MAX_NR_RATES) {
|
||||
snd_printk(KERN_ERR "invalid uac2 rates\n");
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -132,10 +132,14 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
|
|||
unsigned *rate_table = NULL;
|
||||
|
||||
fp = kmemdup(quirk->data, sizeof(*fp), GFP_KERNEL);
|
||||
if (! fp) {
|
||||
if (!fp) {
|
||||
snd_printk(KERN_ERR "cannot memdup\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (fp->nr_rates > MAX_NR_RATES) {
|
||||
kfree(fp);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (fp->nr_rates > 0) {
|
||||
rate_table = kmemdup(fp->rate_table,
|
||||
sizeof(int) * fp->nr_rates, GFP_KERNEL);
|
||||
|
|
Loading…
Reference in New Issue