diff options
Diffstat (limited to 'sound/pci/hda/patch_sigmatel.c')
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 150 | 
1 files changed, 76 insertions, 74 deletions
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 9ba8af05617..df13c0f8489 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -1081,7 +1081,7 @@ static struct snd_kcontrol_new stac_smux_mixer = {  static const char * const slave_pfxs[] = {  	"Front", "Surround", "Center", "LFE", "Side", -	"Headphone", "Speaker", "IEC958", "PCM", +	"Headphone", "Speaker", "Bass Speaker", "IEC958", "PCM",  	NULL  }; @@ -1136,9 +1136,10 @@ static int stac92xx_build_controls(struct hda_codec *codec)  	}  	if (spec->multiout.dig_out_nid) { -		err = snd_hda_create_spdif_out_ctls(codec, -						    spec->multiout.dig_out_nid, -						    spec->multiout.dig_out_nid); +		err = snd_hda_create_dig_out_ctls(codec, +						  spec->multiout.dig_out_nid, +						  spec->multiout.dig_out_nid, +						  spec->autocfg.dig_out_type[0]);  		if (err < 0)  			return err;  		err = snd_hda_create_spdif_share_sw(codec, @@ -2515,6 +2516,11 @@ static int stac92xx_build_pcms(struct hda_codec *codec)  	info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;  	info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =  		spec->multiout.dac_nids[0]; +	if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT && +	    spec->autocfg.line_outs == 2) +		info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap = +			snd_pcm_2_1_chmaps; +  	info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;  	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];  	info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs; @@ -2805,7 +2811,6 @@ stac_control_new(struct sigmatel_spec *spec,  {  	struct snd_kcontrol_new *knew; -	snd_array_init(&spec->kctls, sizeof(*knew), 32);  	knew = snd_array_new(&spec->kctls);  	if (!knew)  		return NULL; @@ -3268,9 +3273,9 @@ static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,  				idx = i;  				break;  			case AUTO_PIN_SPEAKER_OUT: -				if (num_outs <= 1) { -					name = "Speaker"; -					idx = i; +				if (num_outs <= 2) { +					name = i ? "Bass Speaker" : "Speaker"; +					idx = 0;  					break;  				}  				/* Fall through in case of multi speaker outs */ @@ -4569,8 +4574,6 @@ static void stac92xx_free(struct hda_codec *codec)  	if (! spec)  		return; -	stac92xx_shutup(codec); -  	kfree(spec);  	snd_hda_detach_beep_device(codec);  } @@ -5155,20 +5158,34 @@ static const struct hda_codec_ops stac92xx_patch_ops = {  	.reboot_notify = stac92xx_shutup,  }; +static int alloc_stac_spec(struct hda_codec *codec, int num_pins, +			   const hda_nid_t *pin_nids) +{ +	struct sigmatel_spec *spec; + +	spec = kzalloc(sizeof(*spec), GFP_KERNEL); +	if (!spec) +		return -ENOMEM; +	codec->spec = spec; +	codec->no_trigger_sense = 1; /* seems common with STAC/IDT codecs */ +	spec->num_pins = num_pins; +	spec->pin_nids = pin_nids; +	snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32); +	return 0; +} +  static int patch_stac9200(struct hda_codec *codec)  {  	struct sigmatel_spec *spec;  	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, ARRAY_SIZE(stac9200_pin_nids), +			      stac9200_pin_nids); +	if (err < 0) +		return err; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	spec = codec->spec;  	spec->linear_tone_beep = 1; -	spec->num_pins = ARRAY_SIZE(stac9200_pin_nids); -	spec->pin_nids = stac9200_pin_nids;  	spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,  							stac9200_models,  							stac9200_cfg_tbl); @@ -5224,15 +5241,13 @@ static int patch_stac925x(struct hda_codec *codec)  	struct sigmatel_spec *spec;  	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, ARRAY_SIZE(stac925x_pin_nids), +			      stac925x_pin_nids); +	if (err < 0) +		return err; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	spec = codec->spec;  	spec->linear_tone_beep = 1; -	spec->num_pins = ARRAY_SIZE(stac925x_pin_nids); -	spec->pin_nids = stac925x_pin_nids;  	/* Check first for codec ID */  	spec->board_config = snd_hda_check_board_codec_sid_config(codec, @@ -5307,19 +5322,17 @@ static int patch_stac92hd73xx(struct hda_codec *codec)  {  	struct sigmatel_spec *spec;  	hda_nid_t conn[STAC92HD73_DAC_COUNT + 2]; -	int err = 0; +	int err;  	int num_dacs; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, ARRAY_SIZE(stac92hd73xx_pin_nids), +			      stac92hd73xx_pin_nids); +	if (err < 0) +		return err; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	spec = codec->spec;  	spec->linear_tone_beep = 0;  	codec->slave_dig_outs = stac92hd73xx_slave_dig_outs; -	spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids); -	spec->pin_nids = stac92hd73xx_pin_nids;  	spec->board_config = snd_hda_check_board_config(codec,  							STAC_92HD73XX_MODELS,  							stac92hd73xx_models, @@ -5596,9 +5609,9 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)  	int default_polarity = -1; /* no default cfg */  	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, 0, NULL); /* pins filled later */ +	if (err < 0) +		return err;  	if (hp_bnb2011_with_dock(codec)) {  		snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f); @@ -5606,11 +5619,9 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)  	}  	codec->epss = 0; /* longer delay needed for D3 */ -	codec->no_trigger_sense = 1; -	codec->spec = spec; -  	stac92hd8x_fill_auto_spec(codec); +	spec = codec->spec;  	spec->linear_tone_beep = 0;  	codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;  	spec->digbeep_nid = 0x21; @@ -5779,21 +5790,19 @@ static int patch_stac92hd71bxx(struct hda_codec *codec)  	struct sigmatel_spec *spec;  	const struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;  	unsigned int pin_cfg; -	int err = 0; +	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, STAC92HD71BXX_NUM_PINS, +			      stac92hd71bxx_pin_nids_4port); +	if (err < 0) +		return err; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	spec = codec->spec;  	spec->linear_tone_beep = 0;  	codec->patch_ops = stac92xx_patch_ops; -	spec->num_pins = STAC92HD71BXX_NUM_PINS;  	switch (codec->vendor_id) {  	case 0x111d76b6:  	case 0x111d76b7: -		spec->pin_nids = stac92hd71bxx_pin_nids_4port;  		break;  	case 0x111d7603:  	case 0x111d7608: @@ -6024,15 +6033,13 @@ static int patch_stac922x(struct hda_codec *codec)  	struct sigmatel_spec *spec;  	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, ARRAY_SIZE(stac922x_pin_nids), +			      stac922x_pin_nids); +	if (err < 0) +		return err; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	spec = codec->spec;  	spec->linear_tone_beep = 1; -	spec->num_pins = ARRAY_SIZE(stac922x_pin_nids); -	spec->pin_nids = stac922x_pin_nids;  	spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,  							stac922x_models,  							stac922x_cfg_tbl); @@ -6129,16 +6136,14 @@ static int patch_stac927x(struct hda_codec *codec)  	struct sigmatel_spec *spec;  	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, ARRAY_SIZE(stac927x_pin_nids), +			      stac927x_pin_nids); +	if (err < 0) +		return err; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	spec = codec->spec;  	spec->linear_tone_beep = 1;  	codec->slave_dig_outs = stac927x_slave_dig_outs; -	spec->num_pins = ARRAY_SIZE(stac927x_pin_nids); -	spec->pin_nids = stac927x_pin_nids;  	spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,  							stac927x_models,  							stac927x_cfg_tbl); @@ -6265,15 +6270,13 @@ static int patch_stac9205(struct hda_codec *codec)  	struct sigmatel_spec *spec;  	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; +	err = alloc_stac_spec(codec, ARRAY_SIZE(stac9205_pin_nids), +			      stac9205_pin_nids); +	if (err < 0) +		return err; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	spec = codec->spec;  	spec->linear_tone_beep = 1; -	spec->num_pins = ARRAY_SIZE(stac9205_pin_nids); -	spec->pin_nids = stac9205_pin_nids;  	spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,  							stac9205_models,  							stac9205_cfg_tbl); @@ -6421,14 +6424,13 @@ static int patch_stac9872(struct hda_codec *codec)  	struct sigmatel_spec *spec;  	int err; -	spec  = kzalloc(sizeof(*spec), GFP_KERNEL); -	if (spec == NULL) -		return -ENOMEM; -	codec->no_trigger_sense = 1; -	codec->spec = spec; +	err = alloc_stac_spec(codec, ARRAY_SIZE(stac9872_pin_nids), +			      stac9872_pin_nids); +	if (err < 0) +		return err; + +	spec = codec->spec;  	spec->linear_tone_beep = 1; -	spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); -	spec->pin_nids = stac9872_pin_nids;  	spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,  							stac9872_models,  |