diff options
| -rw-r--r-- | Documentation/sound/alsa/HD-Audio-Models.txt | 4 | ||||
| -rw-r--r-- | include/sound/core.h | 10 | ||||
| -rw-r--r-- | sound/core/vmaster.c | 1 | ||||
| -rw-r--r-- | sound/isa/sscape.c | 6 | ||||
| -rw-r--r-- | sound/last.c | 2 | ||||
| -rw-r--r-- | sound/oss/msnd_pinnacle.c | 8 | ||||
| -rw-r--r-- | sound/pci/asihpi/hpi_internal.h | 4 | ||||
| -rw-r--r-- | sound/pci/asihpi/hpios.c | 10 | ||||
| -rw-r--r-- | sound/pci/echoaudio/echoaudio_dsp.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 3 | ||||
| -rw-r--r-- | sound/pci/hda/hda_eld.c | 6 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 20 | ||||
| -rw-r--r-- | sound/pci/hda/hda_proc.c | 13 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 143 | ||||
| -rw-r--r-- | sound/pci/hda/patch_hdmi.c | 9 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 102 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 11 | ||||
| -rw-r--r-- | sound/pci/rme9652/hdsp.c | 1 | ||||
| -rw-r--r-- | sound/soc/omap/omap-pcm.c | 4 | 
20 files changed, 233 insertions, 130 deletions
diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt index d97d992ced1..03f7897c641 100644 --- a/Documentation/sound/alsa/HD-Audio-Models.txt +++ b/Documentation/sound/alsa/HD-Audio-Models.txt @@ -43,7 +43,9 @@ ALC680  ALC882/883/885/888/889  ====================== -  N/A +  acer-aspire-4930g	Acer Aspire 4930G/5930G/6530G/6930G/7730G +  acer-aspire-8930g	Acer Aspire 8330G/6935G +  acer-aspire		Acer Aspire others  ALC861/660  ========== diff --git a/include/sound/core.h b/include/sound/core.h index b6e0f57d451..bc056687f64 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -325,6 +325,13 @@ void release_and_free_resource(struct resource *res);  /* --- */ +/* sound printk debug levels */ +enum { +	SND_PR_ALWAYS, +	SND_PR_DEBUG, +	SND_PR_VERBOSE, +}; +  #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)  __printf(4, 5)  void __snd_printk(unsigned int level, const char *file, int line, @@ -354,6 +361,8 @@ void __snd_printk(unsigned int level, const char *file, int line,   */  #define snd_printd(fmt, args...) \  	__snd_printk(1, __FILE__, __LINE__, fmt, ##args) +#define _snd_printd(level, fmt, args...) \ +	__snd_printk(level, __FILE__, __LINE__, fmt, ##args)  /**   * snd_BUG - give a BUG warning message and stack trace @@ -383,6 +392,7 @@ void __snd_printk(unsigned int level, const char *file, int line,  #else /* !CONFIG_SND_DEBUG */  #define snd_printd(fmt, args...)	do { } while (0) +#define _snd_printd(level, fmt, args...) do { } while (0)  #define snd_BUG()			do { } while (0)  static inline int __snd_bug_on(int cond)  { diff --git a/sound/core/vmaster.c b/sound/core/vmaster.c index 14a286a7bf2..857586135d1 100644 --- a/sound/core/vmaster.c +++ b/sound/core/vmaster.c @@ -419,6 +419,7 @@ EXPORT_SYMBOL(snd_ctl_make_virtual_master);   * snd_ctl_add_vmaster_hook - Add a hook to a vmaster control   * @kcontrol: vmaster kctl element   * @hook: the hook function + * @private_data: the private_data pointer to be saved   *   * Adds the given hook to the vmaster control element so that it's called   * at each time when the value is changed. diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c index b4a6aa960f4..8490f59709b 100644 --- a/sound/isa/sscape.c +++ b/sound/isa/sscape.c @@ -1019,13 +1019,15 @@ static int __devinit create_sscape(int dev, struct snd_card *card)  	irq_cfg = get_irq_config(sscape->type, irq[dev]);  	if (irq_cfg == INVALID_IRQ) {  		snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", irq[dev]); -		return -ENXIO; +		err = -ENXIO; +		goto _release_dma;  	}  	mpu_irq_cfg = get_irq_config(sscape->type, mpu_irq[dev]);  	if (mpu_irq_cfg == INVALID_IRQ) {  		snd_printk(KERN_ERR "sscape: Invalid IRQ %d\n", mpu_irq[dev]); -		return -ENXIO; +		err = -ENXIO; +		goto _release_dma;  	}  	/* diff --git a/sound/last.c b/sound/last.c index bdd0857b887..7ffc182e084 100644 --- a/sound/last.c +++ b/sound/last.c @@ -38,4 +38,4 @@ static int __init alsa_sound_last_init(void)  	return 0;  } -__initcall(alsa_sound_last_init); +late_initcall_sync(alsa_sound_last_init); diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index 2c79d60a725..536c4c0514d 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -1294,6 +1294,8 @@ static int __init calibrate_adc(WORD srate)  static int upload_dsp_code(void)  { +	int ret = 0; +  	msnd_outb(HPBLKSEL_0, dev.io + HP_BLKS);  #ifndef HAVE_DSPCODEH  	INITCODESIZE = mod_firmware_load(INITCODEFILE, &INITCODE); @@ -1312,7 +1314,8 @@ static int upload_dsp_code(void)  	memcpy_toio(dev.base, PERMCODE, PERMCODESIZE);  	if (msnd_upload_host(&dev, INITCODE, INITCODESIZE) < 0) {  		printk(KERN_WARNING LOGNAME ": Error uploading to DSP\n"); -		return -ENODEV; +		ret = -ENODEV; +		goto out;  	}  #ifdef HAVE_DSPCODEH  	printk(KERN_INFO LOGNAME ": DSP firmware uploaded (resident)\n"); @@ -1320,12 +1323,13 @@ static int upload_dsp_code(void)  	printk(KERN_INFO LOGNAME ": DSP firmware uploaded\n");  #endif +out:  #ifndef HAVE_DSPCODEH  	vfree(INITCODE);  	vfree(PERMCODE);  #endif -	return 0; +	return ret;  }  #ifdef MSND_CLASSIC diff --git a/sound/pci/asihpi/hpi_internal.h b/sound/pci/asihpi/hpi_internal.h index 8c63200cf33..bc86cb726d7 100644 --- a/sound/pci/asihpi/hpi_internal.h +++ b/sound/pci/asihpi/hpi_internal.h @@ -1,7 +1,7 @@  /******************************************************************************      AudioScience HPI driver -    Copyright (C) 1997-2011  AudioScience Inc. <support@audioscience.com> +    Copyright (C) 1997-2012  AudioScience Inc. <support@audioscience.com>      This program is free software; you can redistribute it and/or modify      it under the terms of version 2 of the GNU General Public License as @@ -42,7 +42,7 @@ On error *pLockedMemHandle marked invalid, non-zero returned.  If this function succeeds, then HpiOs_LockedMem_GetVirtAddr() and  HpiOs_LockedMem_GetPyhsAddr() will always succed on the returned handle.  */ -int hpios_locked_mem_alloc(struct consistent_dma_area *p_locked_mem_handle, +u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_locked_mem_handle,  							   /**< memory handle */  	u32 size, /**< Size in bytes to allocate */  	struct pci_dev *p_os_reference diff --git a/sound/pci/asihpi/hpios.c b/sound/pci/asihpi/hpios.c index 87f4385fe8c..5ef4fe96436 100644 --- a/sound/pci/asihpi/hpios.c +++ b/sound/pci/asihpi/hpios.c @@ -1,7 +1,7 @@  /******************************************************************************      AudioScience HPI driver -    Copyright (C) 1997-2011  AudioScience Inc. <support@audioscience.com> +    Copyright (C) 1997-2012  AudioScience Inc. <support@audioscience.com>      This program is free software; you can redistribute it and/or modify      it under the terms of version 2 of the GNU General Public License as @@ -39,11 +39,11 @@ void hpios_delay_micro_seconds(u32 num_micro_sec)  } -/** Allocated an area of locked memory for bus master DMA operations. +/** Allocate an area of locked memory for bus master DMA operations. -On error, return -ENOMEM, and *pMemArea.size = 0 +If allocation fails, return 1, and *pMemArea.size = 0  */ -int hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size, +u16 hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size,  	struct pci_dev *pdev)  {  	/*?? any benefit in using managed dmam_alloc_coherent? */ @@ -62,7 +62,7 @@ int hpios_locked_mem_alloc(struct consistent_dma_area *p_mem_area, u32 size,  		HPI_DEBUG_LOG(WARNING,  			"failed to allocate %d bytes locked memory\n", size);  		p_mem_area->size = 0; -		return -ENOMEM; +		return 1;  	}  } diff --git a/sound/pci/echoaudio/echoaudio_dsp.c b/sound/pci/echoaudio/echoaudio_dsp.c index 64417a73322..d8c670c9d62 100644 --- a/sound/pci/echoaudio/echoaudio_dsp.c +++ b/sound/pci/echoaudio/echoaudio_dsp.c @@ -475,7 +475,7 @@ static int load_firmware(struct echoaudio *chip)  	const struct firmware *fw;  	int box_type, err; -	if (snd_BUG_ON(!chip->dsp_code_to_load || !chip->comm_page)) +	if (snd_BUG_ON(!chip->comm_page))  		return -EPERM;  	/* See if the ASIC is present and working - only if the DSP is already loaded */ diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 7a8fcc4c15f..841475cc13b 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -5444,10 +5444,6 @@ int snd_hda_suspend(struct hda_bus *bus)  	list_for_each_entry(codec, &bus->codec_list, list) {  		if (hda_codec_is_power_on(codec))  			hda_call_codec_suspend(codec); -		else /* forcibly change the power to D3 even if not used */ -			hda_set_power_state(codec, -					    codec->afg ? codec->afg : codec->mfg, -					    AC_PWRST_D3);  		if (codec->patch_ops.post_suspend)  			codec->patch_ops.post_suspend(codec);  	} diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 9a9f372e1be..56b4f74c0b1 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h @@ -851,6 +851,9 @@ struct hda_codec {  	unsigned int pin_amp_workaround:1; /* pin out-amp takes index  					    * (e.g. Conexant codecs)  					    */ +	unsigned int single_adc_amp:1; /* adc in-amp takes no index +					* (e.g. CX20549 codec) +					*/  	unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */  	unsigned int pins_shutup:1;	/* pins are shut up */  	unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */ diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index b58b4b1687f..4c054f4486b 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c @@ -418,7 +418,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a)  	else  		buf2[0] = '\0'; -	printk(KERN_INFO "HDMI: supports coding type %s:" +	_snd_printd(SND_PR_VERBOSE, "HDMI: supports coding type %s:"  			" channels = %d, rates =%s%s\n",  			cea_audio_coding_type_names[a->format],  			a->channels, @@ -442,14 +442,14 @@ void snd_hdmi_show_eld(struct hdmi_eld *e)  {  	int i; -	printk(KERN_INFO "HDMI: detected monitor %s at connection type %s\n", +	_snd_printd(SND_PR_VERBOSE, "HDMI: detected monitor %s at connection type %s\n",  			e->monitor_name,  			eld_connection_type_names[e->conn_type]);  	if (e->spk_alloc) {  		char buf[SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE];  		snd_print_channel_allocation(e->spk_alloc, buf, sizeof(buf)); -		printk(KERN_INFO "HDMI: available speakers:%s\n", buf); +		_snd_printd(SND_PR_VERBOSE, "HDMI: available speakers:%s\n", buf);  	}  	for (i = 0; i < e->sad_count; i++) diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index c19e71a94e1..1f350522bed 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -783,11 +783,13 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,  {  	struct azx *chip = bus->private_data;  	unsigned long timeout; +	unsigned long loopcounter;  	int do_poll = 0;   again:  	timeout = jiffies + msecs_to_jiffies(1000); -	for (;;) { + +	for (loopcounter = 0;; loopcounter++) {  		if (chip->polling_mode || do_poll) {  			spin_lock_irq(&chip->reg_lock);  			azx_update_rirb(chip); @@ -803,7 +805,7 @@ static unsigned int azx_rirb_get_response(struct hda_bus *bus,  		}  		if (time_after(jiffies, timeout))  			break; -		if (bus->needs_damn_long_delay) +		if (bus->needs_damn_long_delay || loopcounter > 3000)  			msleep(2); /* temporary workaround */  		else {  			udelay(10); @@ -2351,6 +2353,17 @@ static void azx_power_notify(struct hda_bus *bus)   * power management   */ +static int snd_hda_codecs_inuse(struct hda_bus *bus) +{ +	struct hda_codec *codec; + +	list_for_each_entry(codec, &bus->codec_list, list) { +		if (snd_hda_codec_needs_resume(codec)) +			return 1; +	} +	return 0; +} +  static int azx_suspend(struct pci_dev *pci, pm_message_t state)  {  	struct snd_card *card = pci_get_drvdata(pci); @@ -2397,7 +2410,8 @@ static int azx_resume(struct pci_dev *pci)  		return -EIO;  	azx_init_pci(chip); -	azx_init_chip(chip, 1); +	if (snd_hda_codecs_inuse(chip->bus)) +		azx_init_chip(chip, 1);  	snd_hda_resume(chip->bus);  	snd_power_change_state(card, SNDRV_CTL_POWER_D0); diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c index 254ab520460..e59e2f059b6 100644 --- a/sound/pci/hda/hda_proc.c +++ b/sound/pci/hda/hda_proc.c @@ -651,9 +651,16 @@ static void print_codec_info(struct snd_info_entry *entry,  			snd_iprintf(buffer, "  Amp-In caps: ");  			print_amp_caps(buffer, codec, nid, HDA_INPUT);  			snd_iprintf(buffer, "  Amp-In vals: "); -			print_amp_vals(buffer, codec, nid, HDA_INPUT, -				       wid_caps & AC_WCAP_STEREO, -				       wid_type == AC_WID_PIN ? 1 : conn_len); +			if (wid_type == AC_WID_PIN || +			    (codec->single_adc_amp && +			     wid_type == AC_WID_AUD_IN)) +				print_amp_vals(buffer, codec, nid, HDA_INPUT, +					       wid_caps & AC_WCAP_STEREO, +					       1); +			else +				print_amp_vals(buffer, codec, nid, HDA_INPUT, +					       wid_caps & AC_WCAP_STEREO, +					       conn_len);  		}  		if (wid_caps & AC_WCAP_OUT_AMP) {  			snd_iprintf(buffer, "  Amp-Out caps: "); diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 8c6523bbc79..d906c5b74cf 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -141,7 +141,6 @@ struct conexant_spec {  	unsigned int hp_laptop:1;  	unsigned int asus:1;  	unsigned int pin_eapd_ctrls:1; -	unsigned int single_adc_amp:1;  	unsigned int adc_switching:1; @@ -687,27 +686,26 @@ static const struct hda_channel_mode cxt5045_modes[1] = {  static const struct hda_input_mux cxt5045_capture_source = {  	.num_items = 2,  	.items = { -		{ "IntMic", 0x1 }, -		{ "ExtMic", 0x2 }, +		{ "Internal Mic", 0x1 }, +		{ "Mic",          0x2 },  	}  };  static const struct hda_input_mux cxt5045_capture_source_benq = { -	.num_items = 5, +	.num_items = 4,  	.items = { -		{ "IntMic", 0x1 }, -		{ "ExtMic", 0x2 }, -		{ "LineIn", 0x3 }, -		{ "CD",     0x4 }, -		{ "Mixer",  0x0 }, +		{ "Internal Mic", 0x1 }, +		{ "Mic",          0x2 }, +		{ "Line",         0x3 }, +		{ "Mixer",        0x0 },  	}  };  static const struct hda_input_mux cxt5045_capture_source_hp530 = {  	.num_items = 2,  	.items = { -		{ "ExtMic", 0x1 }, -		{ "IntMic", 0x2 }, +		{ "Mic",          0x1 }, +		{ "Internal Mic", 0x2 },  	}  }; @@ -798,10 +796,8 @@ static void cxt5045_hp_unsol_event(struct hda_codec *codec,  }  static const struct snd_kcontrol_new cxt5045_mixers[] = { -	HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), -	HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x01, HDA_INPUT), -	HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), -	HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x02, HDA_INPUT), +	HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x00, HDA_INPUT), +	HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT),  	HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT),  	HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT),  	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x1, HDA_INPUT), @@ -822,27 +818,15 @@ static const struct snd_kcontrol_new cxt5045_mixers[] = {  };  static const struct snd_kcontrol_new cxt5045_benq_mixers[] = { -	HDA_CODEC_VOLUME("CD Capture Volume", 0x1a, 0x04, HDA_INPUT), -	HDA_CODEC_MUTE("CD Capture Switch", 0x1a, 0x04, HDA_INPUT), -	HDA_CODEC_VOLUME("CD Playback Volume", 0x17, 0x4, HDA_INPUT), -	HDA_CODEC_MUTE("CD Playback Switch", 0x17, 0x4, HDA_INPUT), - -	HDA_CODEC_VOLUME("Line In Capture Volume", 0x1a, 0x03, HDA_INPUT), -	HDA_CODEC_MUTE("Line In Capture Switch", 0x1a, 0x03, HDA_INPUT), -	HDA_CODEC_VOLUME("Line In Playback Volume", 0x17, 0x3, HDA_INPUT), -	HDA_CODEC_MUTE("Line In Playback Switch", 0x17, 0x3, HDA_INPUT), - -	HDA_CODEC_VOLUME("Mixer Capture Volume", 0x1a, 0x0, HDA_INPUT), -	HDA_CODEC_MUTE("Mixer Capture Switch", 0x1a, 0x0, HDA_INPUT), +	HDA_CODEC_VOLUME("Line Playback Volume", 0x17, 0x3, HDA_INPUT), +	HDA_CODEC_MUTE("Line Playback Switch", 0x17, 0x3, HDA_INPUT),  	{}  };  static const struct snd_kcontrol_new cxt5045_mixers_hp530[] = { -	HDA_CODEC_VOLUME("Internal Mic Capture Volume", 0x1a, 0x02, HDA_INPUT), -	HDA_CODEC_MUTE("Internal Mic Capture Switch", 0x1a, 0x02, HDA_INPUT), -	HDA_CODEC_VOLUME("Mic Capture Volume", 0x1a, 0x01, HDA_INPUT), -	HDA_CODEC_MUTE("Mic Capture Switch", 0x1a, 0x01, HDA_INPUT), +	HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x00, HDA_INPUT), +	HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT),  	HDA_CODEC_VOLUME("PCM Playback Volume", 0x17, 0x0, HDA_INPUT),  	HDA_CODEC_MUTE("PCM Playback Switch", 0x17, 0x0, HDA_INPUT),  	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x2, HDA_INPUT), @@ -946,10 +930,10 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = {  	/* Output controls */  	HDA_CODEC_VOLUME("Speaker Playback Volume", 0x10, 0x0, HDA_OUTPUT),  	HDA_CODEC_MUTE("Speaker Playback Switch", 0x10, 0x0, HDA_OUTPUT), -	HDA_CODEC_VOLUME("Node 11 Playback Volume", 0x11, 0x0, HDA_OUTPUT), -	HDA_CODEC_MUTE("Node 11 Playback Switch", 0x11, 0x0, HDA_OUTPUT), -	HDA_CODEC_VOLUME("Node 12 Playback Volume", 0x12, 0x0, HDA_OUTPUT), -	HDA_CODEC_MUTE("Node 12 Playback Switch", 0x12, 0x0, HDA_OUTPUT), +	HDA_CODEC_VOLUME("HP-OUT Playback Volume", 0x11, 0x0, HDA_OUTPUT), +	HDA_CODEC_MUTE("HP-OUT Playback Switch", 0x11, 0x0, HDA_OUTPUT), +	HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x12, 0x0, HDA_OUTPUT), +	HDA_CODEC_MUTE("LINE1 Playback Switch", 0x12, 0x0, HDA_OUTPUT),  	/* Modes for retasking pin widgets */  	CXT_PIN_MODE("HP-OUT pin mode", 0x11, CXT_PIN_DIR_INOUT), @@ -960,16 +944,16 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = {  	/* Loopback mixer controls */ -	HDA_CODEC_VOLUME("Mixer-1 Volume", 0x17, 0x0, HDA_INPUT), -	HDA_CODEC_MUTE("Mixer-1 Switch", 0x17, 0x0, HDA_INPUT), -	HDA_CODEC_VOLUME("Mixer-2 Volume", 0x17, 0x1, HDA_INPUT), -	HDA_CODEC_MUTE("Mixer-2 Switch", 0x17, 0x1, HDA_INPUT), -	HDA_CODEC_VOLUME("Mixer-3 Volume", 0x17, 0x2, HDA_INPUT), -	HDA_CODEC_MUTE("Mixer-3 Switch", 0x17, 0x2, HDA_INPUT), -	HDA_CODEC_VOLUME("Mixer-4 Volume", 0x17, 0x3, HDA_INPUT), -	HDA_CODEC_MUTE("Mixer-4 Switch", 0x17, 0x3, HDA_INPUT), -	HDA_CODEC_VOLUME("Mixer-5 Volume", 0x17, 0x4, HDA_INPUT), -	HDA_CODEC_MUTE("Mixer-5 Switch", 0x17, 0x4, HDA_INPUT), +	HDA_CODEC_VOLUME("PCM Volume", 0x17, 0x0, HDA_INPUT), +	HDA_CODEC_MUTE("PCM Switch", 0x17, 0x0, HDA_INPUT), +	HDA_CODEC_VOLUME("MIC1 pin Volume", 0x17, 0x1, HDA_INPUT), +	HDA_CODEC_MUTE("MIC1 pin Switch", 0x17, 0x1, HDA_INPUT), +	HDA_CODEC_VOLUME("LINE1 pin Volume", 0x17, 0x2, HDA_INPUT), +	HDA_CODEC_MUTE("LINE1 pin Switch", 0x17, 0x2, HDA_INPUT), +	HDA_CODEC_VOLUME("HP-OUT pin Volume", 0x17, 0x3, HDA_INPUT), +	HDA_CODEC_MUTE("HP-OUT pin Switch", 0x17, 0x3, HDA_INPUT), +	HDA_CODEC_VOLUME("CD pin Volume", 0x17, 0x4, HDA_INPUT), +	HDA_CODEC_MUTE("CD pin Switch", 0x17, 0x4, HDA_INPUT),  	{  		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,  		.name = "Input Source", @@ -978,16 +962,8 @@ static const struct snd_kcontrol_new cxt5045_test_mixer[] = {  		.put = conexant_mux_enum_put,  	},  	/* Audio input controls */ -	HDA_CODEC_VOLUME("Input-1 Volume", 0x1a, 0x0, HDA_INPUT), -	HDA_CODEC_MUTE("Input-1 Switch", 0x1a, 0x0, HDA_INPUT), -	HDA_CODEC_VOLUME("Input-2 Volume", 0x1a, 0x1, HDA_INPUT), -	HDA_CODEC_MUTE("Input-2 Switch", 0x1a, 0x1, HDA_INPUT), -	HDA_CODEC_VOLUME("Input-3 Volume", 0x1a, 0x2, HDA_INPUT), -	HDA_CODEC_MUTE("Input-3 Switch", 0x1a, 0x2, HDA_INPUT), -	HDA_CODEC_VOLUME("Input-4 Volume", 0x1a, 0x3, HDA_INPUT), -	HDA_CODEC_MUTE("Input-4 Switch", 0x1a, 0x3, HDA_INPUT), -	HDA_CODEC_VOLUME("Input-5 Volume", 0x1a, 0x4, HDA_INPUT), -	HDA_CODEC_MUTE("Input-5 Switch", 0x1a, 0x4, HDA_INPUT), +	HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x0, HDA_INPUT), +	HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT),  	{ } /* end */  }; @@ -1009,10 +985,6 @@ static const struct hda_verb cxt5045_test_init_verbs[] = {  	{0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},  	{0x18, AC_VERB_SET_DIGI_CONVERT_1, 0}, -	/* Start with output sum widgets muted and their output gains at min */ -	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, -	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, -  	/* Unmute retasking pin widget output buffers since the default  	 * state appears to be output.  As the pin mode is changed by the  	 * user the pin mode control will take care of enabling the pin's @@ -1027,11 +999,11 @@ static const struct hda_verb cxt5045_test_init_verbs[] = {  	/* Set ADC connection select to match default mixer setting (mic1  	 * pin)  	 */ -	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, -	{0x17, AC_VERB_SET_CONNECT_SEL, 0x00}, +	{0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, +	{0x17, AC_VERB_SET_CONNECT_SEL, 0x01},  	/* Mute all inputs to mixer widget (even unconnected ones) */ -	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* Mixer pin */ +	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* Mixer */  	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* Mic1 pin */  	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* Line pin */  	{0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* HP pin */ @@ -1110,7 +1082,7 @@ static int patch_cxt5045(struct hda_codec *codec)  	if (!spec)  		return -ENOMEM;  	codec->spec = spec; -	codec->pin_amp_workaround = 1; +	codec->single_adc_amp = 1;  	spec->multiout.max_channels = 2;  	spec->multiout.num_dacs = ARRAY_SIZE(cxt5045_dac_nids); @@ -3999,9 +3971,14 @@ static void cx_auto_init_output(struct hda_codec *codec)  	int i;  	mute_outputs(codec, spec->multiout.num_dacs, spec->multiout.dac_nids); -	for (i = 0; i < cfg->hp_outs; i++) +	for (i = 0; i < cfg->hp_outs; i++) { +		unsigned int val = PIN_OUT; +		if (snd_hda_query_pin_caps(codec, cfg->hp_pins[i]) & +		    AC_PINCAP_HP_DRV) +			val |= AC_PINCTL_HP_EN;  		snd_hda_codec_write(codec, cfg->hp_pins[i], 0, -				    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP); +				    AC_VERB_SET_PIN_WIDGET_CONTROL, val); +	}  	mute_outputs(codec, cfg->hp_outs, cfg->hp_pins);  	mute_outputs(codec, cfg->line_outs, cfg->line_out_pins);  	mute_outputs(codec, cfg->speaker_outs, cfg->speaker_pins); @@ -4220,7 +4197,7 @@ static int cx_auto_add_capture_volume(struct hda_codec *codec, hda_nid_t nid,  		int idx = get_input_connection(codec, adc_nid, nid);  		if (idx < 0)  			continue; -		if (spec->single_adc_amp) +		if (codec->single_adc_amp)  			idx = 0;  		return cx_auto_add_volume_idx(codec, label, pfx,  					      cidx, adc_nid, HDA_INPUT, idx); @@ -4275,7 +4252,7 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)  		if (cidx < 0)  			continue;  		input_conn[i] = spec->imux_info[i].adc; -		if (!spec->single_adc_amp) +		if (!codec->single_adc_amp)  			input_conn[i] |= cidx << 8;  		if (i > 0 && input_conn[i] != input_conn[0])  			multi_connection = 1; @@ -4419,8 +4396,10 @@ static void apply_pin_fixup(struct hda_codec *codec,  enum {  	CXT_PINCFG_LENOVO_X200, +	CXT_PINCFG_LENOVO_TP410,  }; +/* ThinkPad X200 & co with cxt5051 */  static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = {  	{ 0x16, 0x042140ff }, /* HP (seq# overridden) */  	{ 0x17, 0x21a11000 }, /* dock-mic */ @@ -4429,15 +4408,33 @@ static const struct cxt_pincfg cxt_pincfg_lenovo_x200[] = {  	{}  }; +/* ThinkPad 410/420/510/520, X201 & co with cxt5066 */ +static const struct cxt_pincfg cxt_pincfg_lenovo_tp410[] = { +	{ 0x19, 0x042110ff }, /* HP (seq# overridden) */ +	{ 0x1a, 0x21a190f0 }, /* dock-mic */ +	{ 0x1c, 0x212140ff }, /* dock-HP */ +	{} +}; +  static const struct cxt_pincfg *cxt_pincfg_tbl[] = {  	[CXT_PINCFG_LENOVO_X200] = cxt_pincfg_lenovo_x200, +	[CXT_PINCFG_LENOVO_TP410] = cxt_pincfg_lenovo_tp410,  }; -static const struct snd_pci_quirk cxt_fixups[] = { +static const struct snd_pci_quirk cxt5051_fixups[] = {  	SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT_PINCFG_LENOVO_X200),  	{}  }; +static const struct snd_pci_quirk cxt5066_fixups[] = { +	SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400", CXT_PINCFG_LENOVO_TP410), +	SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo T410", CXT_PINCFG_LENOVO_TP410), +	SND_PCI_QUIRK(0x17aa, 0x215f, "Lenovo T510", CXT_PINCFG_LENOVO_TP410), +	SND_PCI_QUIRK(0x17aa, 0x21ce, "Lenovo T420", CXT_PINCFG_LENOVO_TP410), +	SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410), +	{} +}; +  /* add "fake" mute amp-caps to DACs on cx5051 so that mixer mute switches   * can be created (bko#42825)   */ @@ -4466,19 +4463,21 @@ static int patch_conexant_auto(struct hda_codec *codec)  	if (!spec)  		return -ENOMEM;  	codec->spec = spec; -	codec->pin_amp_workaround = 1;  	switch (codec->vendor_id) {  	case 0x14f15045: -		spec->single_adc_amp = 1; +		codec->single_adc_amp = 1;  		break;  	case 0x14f15051:  		add_cx5051_fake_mutes(codec); +		codec->pin_amp_workaround = 1; +		apply_pin_fixup(codec, cxt5051_fixups, cxt_pincfg_tbl);  		break; +	default: +		codec->pin_amp_workaround = 1; +		apply_pin_fixup(codec, cxt5066_fixups, cxt_pincfg_tbl);  	} -	apply_pin_fixup(codec, cxt_fixups, cxt_pincfg_tbl); -  	/* Show mute-led control only on HP laptops  	 * This is a sort of white-list: on HP laptops, EAPD corresponds  	 * only to the mute-LED without actualy amp function.  Meanwhile, diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 540cd13f7f1..83f345f3c96 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -757,8 +757,6 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)  	struct hdmi_spec *spec = codec->spec;  	int tag = res >> AC_UNSOL_RES_TAG_SHIFT;  	int pin_nid; -	int pd = !!(res & AC_UNSOL_RES_PD); -	int eldv = !!(res & AC_UNSOL_RES_ELDV);  	int pin_idx;  	struct hda_jack_tbl *jack; @@ -768,9 +766,10 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)  	pin_nid = jack->nid;  	jack->jack_dirty = 1; -	printk(KERN_INFO +	_snd_printd(SND_PR_VERBOSE,  		"HDMI hot plug event: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n", -		codec->addr, pin_nid, pd, eldv); +		codec->addr, pin_nid, +		!!(res & AC_UNSOL_RES_PD), !!(res & AC_UNSOL_RES_ELDV));  	pin_idx = pin_nid_to_pin_index(spec, pin_nid);  	if (pin_idx < 0) @@ -992,7 +991,7 @@ static void hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll)  	if (eld->monitor_present)  		eld_valid	= !!(present & AC_PINSENSE_ELDV); -	printk(KERN_INFO +	_snd_printd(SND_PR_VERBOSE,  		"HDMI status: Codec=%d Pin=%d Presence_Detect=%d ELD_Valid=%d\n",  		codec->addr, pin_nid, eld->monitor_present, eld_valid); diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9917e55d6f1..7810913d07a 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -1445,6 +1445,13 @@ enum {  	ALC_FIXUP_ACT_BUILD,  }; +static void alc_apply_pincfgs(struct hda_codec *codec, +			      const struct alc_pincfg *cfg) +{ +	for (; cfg->nid; cfg++) +		snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val); +} +  static void alc_apply_fixup(struct hda_codec *codec, int action)  {  	struct alc_spec *spec = codec->spec; @@ -1478,9 +1485,7 @@ static void alc_apply_fixup(struct hda_codec *codec, int action)  			snd_printdd(KERN_INFO "hda_codec: %s: "  				    "Apply pincfg for %s\n",  				    codec->chip_name, modelname); -			for (; cfg->nid; cfg++) -				snd_hda_codec_set_pincfg(codec, cfg->nid, -							 cfg->val); +			alc_apply_pincfgs(codec, cfg);  			break;  		case ALC_FIXUP_VERBS:  			if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs) @@ -3398,8 +3403,10 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)  	for (;;) {  		badness = fill_and_eval_dacs(codec, fill_hardwired,  					     fill_mio_first); -		if (badness < 0) +		if (badness < 0) { +			kfree(best_cfg);  			return badness; +		}  		debug_badness("==> lo_type=%d, wired=%d, mio=%d, badness=0x%x\n",  			      cfg->line_out_type, fill_hardwired, fill_mio_first,  			      badness); @@ -3434,7 +3441,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)  			cfg->line_out_type = AUTO_PIN_SPEAKER_OUT;  			fill_hardwired = true;  			continue; -		}  +		}  		if (cfg->hp_outs > 0 &&  		    cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {  			cfg->speaker_outs = cfg->line_outs; @@ -3448,7 +3455,7 @@ static int alc_auto_fill_dac_nids(struct hda_codec *codec)  			cfg->line_out_type = AUTO_PIN_HP_OUT;  			fill_hardwired = true;  			continue; -		}  +		}  		break;  	} @@ -4423,7 +4430,7 @@ static int alc_parse_auto_config(struct hda_codec *codec,  static int alc880_parse_auto_config(struct hda_codec *codec)  {  	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 }; -	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };  +	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };  	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);  } @@ -4859,6 +4866,7 @@ enum {  	ALC260_FIXUP_GPIO1_TOGGLE,  	ALC260_FIXUP_REPLACER,  	ALC260_FIXUP_HP_B1900, +	ALC260_FIXUP_KN1,  };  static void alc260_gpio1_automute(struct hda_codec *codec) @@ -4886,6 +4894,36 @@ static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,  	}  } +static void alc260_fixup_kn1(struct hda_codec *codec, +			     const struct alc_fixup *fix, int action) +{ +	struct alc_spec *spec = codec->spec; +	static const struct alc_pincfg pincfgs[] = { +		{ 0x0f, 0x02214000 }, /* HP/speaker */ +		{ 0x12, 0x90a60160 }, /* int mic */ +		{ 0x13, 0x02a19000 }, /* ext mic */ +		{ 0x18, 0x01446000 }, /* SPDIF out */ +		/* disable bogus I/O pins */ +		{ 0x10, 0x411111f0 }, +		{ 0x11, 0x411111f0 }, +		{ 0x14, 0x411111f0 }, +		{ 0x15, 0x411111f0 }, +		{ 0x16, 0x411111f0 }, +		{ 0x17, 0x411111f0 }, +		{ 0x19, 0x411111f0 }, +		{ } +	}; + +	switch (action) { +	case ALC_FIXUP_ACT_PRE_PROBE: +		alc_apply_pincfgs(codec, pincfgs); +		break; +	case ALC_FIXUP_ACT_PROBE: +		spec->init_amp = ALC_INIT_NONE; +		break; +	} +} +  static const struct alc_fixup alc260_fixups[] = {  	[ALC260_FIXUP_HP_DC5750] = {  		.type = ALC_FIXUP_PINS, @@ -4936,7 +4974,11 @@ static const struct alc_fixup alc260_fixups[] = {  		.v.func = alc260_fixup_gpio1_toggle,  		.chained = true,  		.chain_id = ALC260_FIXUP_COEF, -	} +	}, +	[ALC260_FIXUP_KN1] = { +		.type = ALC_FIXUP_FUNC, +		.v.func = alc260_fixup_kn1, +	},  };  static const struct snd_pci_quirk alc260_fixup_tbl[] = { @@ -4946,6 +4988,7 @@ static const struct snd_pci_quirk alc260_fixup_tbl[] = {  	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),  	SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),  	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1), +	SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),  	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),  	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),  	{} @@ -5269,7 +5312,9 @@ static const struct alc_fixup alc882_fixups[] = {  			{ 0x16, 0x99130111 }, /* CLFE speaker */  			{ 0x17, 0x99130112 }, /* surround speaker */  			{ } -		} +		}, +		.chained = true, +		.chain_id = ALC882_FIXUP_GPIO1,  	},  	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {  		.type = ALC_FIXUP_PINS, @@ -5312,7 +5357,9 @@ static const struct alc_fixup alc882_fixups[] = {  			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },  			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },  			{ } -		} +		}, +		.chained = true, +		.chain_id = ALC882_FIXUP_GPIO1,  	},  	[ALC885_FIXUP_MACPRO_GPIO] = {  		.type = ALC_FIXUP_FUNC, @@ -5358,7 +5405,10 @@ 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, 0x021e, "Acer Aspire 5739G", +		      ALC882_FIXUP_ACER_ASPIRE_4930G),  	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE), +	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),  	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), @@ -5384,11 +5434,13 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {  	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), +	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO),  	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),  	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), +	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),  	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),  	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3", ALC889_FIXUP_CD),  	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX), @@ -5399,6 +5451,13 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {  	{}  }; +static const struct alc_model_fixup alc882_fixup_models[] = { +	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"}, +	{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"}, +	{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"}, +	{} +}; +  /*   * BIOS auto configuration   */ @@ -5439,7 +5498,8 @@ static int patch_alc882(struct hda_codec *codec)  	if (err < 0)  		goto error; -	alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups); +	alc_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl, +		       alc882_fixups);  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);  	alc_auto_parse_customize_define(codec); @@ -5581,13 +5641,13 @@ static int patch_alc262(struct hda_codec *codec)  	snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);  	}  #endif -	alc_auto_parse_customize_define(codec); -  	alc_fix_pll_init(codec, 0x20, 0x0a, 10);  	alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); +	alc_auto_parse_customize_define(codec); +  	/* automatic parse from the BIOS config */  	err = alc262_parse_auto_config(codec);  	if (err < 0) @@ -6052,6 +6112,7 @@ static const struct alc_fixup alc269_fixups[] = {  static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_MIC2_MUTE_LED), +	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_DMIC),  	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),  	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),  	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), @@ -6079,7 +6140,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	 * Basically the device should work as is without the fixup table.  	 * If BIOS doesn't give a proper info, enable the corresponding  	 * fixup entry. -	 */  +	 */  	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",  		      ALC269_FIXUP_AMIC),  	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC), @@ -6191,8 +6252,6 @@ static int patch_alc269(struct hda_codec *codec)  	spec->mixer_nid = 0x0b; -	alc_auto_parse_customize_define(codec); -  	err = alc_codec_rename_from_preset(codec);  	if (err < 0)  		goto error; @@ -6225,6 +6284,8 @@ static int patch_alc269(struct hda_codec *codec)  		       alc269_fixup_tbl, alc269_fixups);  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); +	alc_auto_parse_customize_define(codec); +  	/* automatic parse from the BIOS config */  	err = alc269_parse_auto_config(codec);  	if (err < 0) @@ -6296,7 +6357,7 @@ static void alc_fixup_no_jack_detect(struct hda_codec *codec,  {  	if (action == ALC_FIXUP_ACT_PRE_PROBE)  		codec->no_jack_detect = 1; -}	 +}  static const struct alc_fixup alc861_fixups[] = {  	[ALC861_FIXUP_FSC_AMILO_PI1505] = { @@ -6714,7 +6775,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {  	 * Basically the device should work as is without the fixup table.  	 * If BIOS doesn't give a proper info, enable the corresponding  	 * fixup entry. -	 */  +	 */  	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),  	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),  	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1), @@ -6801,8 +6862,6 @@ static int patch_alc662(struct hda_codec *codec)  	/* handle multiple HPs as is */  	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP; -	alc_auto_parse_customize_define(codec); -  	alc_fix_pll_init(codec, 0x20, 0x04, 15);  	err = alc_codec_rename_from_preset(codec); @@ -6819,6 +6878,9 @@ static int patch_alc662(struct hda_codec *codec)  	alc_pick_fixup(codec, alc662_fixup_models,  		       alc662_fixup_tbl, alc662_fixups);  	alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE); + +	alc_auto_parse_customize_define(codec); +  	/* automatic parse from the BIOS config */  	err = alc662_parse_auto_config(codec);  	if (err < 0) diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 33a9946b492..2cb1e08f962 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -4415,9 +4415,9 @@ static int stac92xx_init(struct hda_codec *codec)  		def_conf = get_defcfg_connect(def_conf);  		/* skip any ports that don't have jacks since presence   		 * detection is useless */ -		if (def_conf != AC_JACK_PORT_COMPLEX) { -			if (def_conf != AC_JACK_PORT_NONE) -				stac_toggle_power_map(codec, nid, 1); +		if (def_conf != AC_JACK_PORT_NONE && +		    !is_jack_detectable(codec, nid)) { +			stac_toggle_power_map(codec, nid, 1);  			continue;  		}  		if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) { @@ -5063,12 +5063,11 @@ static void stac92xx_update_led_status(struct hda_codec *codec, int enabled)  	if (spec->gpio_led_polarity)  		muted = !muted; -	/*polarity defines *not* muted state level*/  	if (!spec->vref_mute_led_nid) {  		if (muted) -			spec->gpio_data &= ~spec->gpio_led; /* orange */ +			spec->gpio_data |= spec->gpio_led;  		else -			spec->gpio_data |= spec->gpio_led; /* white */ +			spec->gpio_data &= ~spec->gpio_led;  		stac_gpio_set(codec, spec->gpio_mask,  				spec->gpio_dir, spec->gpio_data);  	} else { diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index b68cdec03b9..0b2aea2ce17 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c @@ -5170,6 +5170,7 @@ static int snd_hdsp_create_hwdep(struct snd_card *card, struct hdsp *hdsp)  	strcpy(hw->name, "HDSP hwdep interface");  	hw->ops.ioctl = snd_hdsp_hwdep_ioctl; +	hw->ops.ioctl_compat = snd_hdsp_hwdep_ioctl;  	return 0;  } diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index a59bd352d34..5a649da9122 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c @@ -401,6 +401,10 @@ static int omap_pcm_new(struct snd_soc_pcm_runtime *rtd)  	}  out: +	/* free preallocated buffers in case of error */ +	if (ret) +		omap_pcm_free_dma_buffers(pcm); +  	return ret;  }  |