Blame view

sound/pci/hda/patch_sigmatel.c 183 KB
2f2f4251c   Matt   [ALSA] add sigmat...
1
2
3
4
5
6
  /*
   * Universal Interface for Intel High Definition Audio Codec
   *
   * HD audio interface patch for SigmaTel STAC92xx
   *
   * Copyright (c) 2005 Embedded Alley Solutions, Inc.
403d19446   Matt Porter   [ALSA] hda-codec ...
7
   * Matt Porter <mporter@embeddedalley.com>
2f2f4251c   Matt   [ALSA] add sigmat...
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   *
   * Based on patch_cmedia.c and patch_realtek.c
   * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
   *
   *  This driver is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 2 of the License, or
   *  (at your option) any later version.
   *
   *  This driver is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program; if not, write to the Free Software
   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
   */
2f2f4251c   Matt   [ALSA] add sigmat...
26
27
28
29
  #include <linux/init.h>
  #include <linux/delay.h>
  #include <linux/slab.h>
  #include <linux/pci.h>
5bdaaada1   Vitaliy Kulikov   ALSA: hda - Enabl...
30
  #include <linux/dmi.h>
da155d5b4   Paul Gortmaker   sound: Add module...
31
  #include <linux/module.h>
2f2f4251c   Matt   [ALSA] add sigmat...
32
  #include <sound/core.h>
c7d4b2fa3   Matt   [ALSA] hda-codec ...
33
  #include <sound/asoundef.h>
45a6ac16c   Matthew Ranostay   ALSA: hda: add su...
34
  #include <sound/jack.h>
a74ccea51   Clemens Ladisch   ALSA: hda - Fix w...
35
  #include <sound/tlv.h>
2f2f4251c   Matt   [ALSA] add sigmat...
36
37
  #include "hda_codec.h"
  #include "hda_local.h"
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
38
  #include "hda_beep.h"
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
39
  #include "hda_jack.h"
2f2f4251c   Matt   [ALSA] add sigmat...
40

c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
41
42
43
44
45
  enum {
  	STAC_VREF_EVENT	= 1,
  	STAC_INSERT_EVENT,
  	STAC_PWR_EVENT,
  	STAC_HP_EVENT,
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
46
  	STAC_LO_EVENT,
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
47
  	STAC_MIC_EVENT,
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
48
  };
4e55096e2   Matt   [ALSA] hda: add s...
49

f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
50
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
51
  	STAC_AUTO,
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
52
  	STAC_REF,
bf277785d   Tobin Davis   [ALSA] HDA - Add ...
53
  	STAC_9200_OQO,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
54
55
56
57
58
59
60
61
62
63
  	STAC_9200_DELL_D21,
  	STAC_9200_DELL_D22,
  	STAC_9200_DELL_D23,
  	STAC_9200_DELL_M21,
  	STAC_9200_DELL_M22,
  	STAC_9200_DELL_M23,
  	STAC_9200_DELL_M24,
  	STAC_9200_DELL_M25,
  	STAC_9200_DELL_M26,
  	STAC_9200_DELL_M27,
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
64
65
  	STAC_9200_M4,
  	STAC_9200_M4_2,
117f257d7   Takashi Iwai   [ALSA] hda-codec ...
66
  	STAC_9200_PANASONIC,
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
67
68
69
70
  	STAC_9200_MODELS
  };
  
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
71
  	STAC_9205_AUTO,
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
72
  	STAC_9205_REF,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
73
  	STAC_9205_DELL_M42,
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
74
75
  	STAC_9205_DELL_M43,
  	STAC_9205_DELL_M44,
d9a4268ee   Takashi Iwai   ALSA: hda - Add q...
76
  	STAC_9205_EAPD,
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
77
78
79
80
  	STAC_9205_MODELS
  };
  
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
81
  	STAC_92HD73XX_AUTO,
9e43f0de6   Takashi Iwai   ALSA: hda - Add n...
82
  	STAC_92HD73XX_NO_JD, /* no jack-detection */
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
83
  	STAC_92HD73XX_REF,
ae709440e   Wu Fengguang   ALSA: hda: add mo...
84
  	STAC_92HD73XX_INTEL,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
85
86
87
  	STAC_DELL_M6_AMIC,
  	STAC_DELL_M6_DMIC,
  	STAC_DELL_M6_BOTH,
6b3ab21ef   Matthew Ranostay   ALSA: hda: make a...
88
  	STAC_DELL_EQ,
842ae6380   Takashi Iwai   ALSA: hda - Add s...
89
  	STAC_ALIENWARE_M17X,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
90
91
92
93
  	STAC_92HD73XX_MODELS
  };
  
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
94
  	STAC_92HD83XXX_AUTO,
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
95
  	STAC_92HD83XXX_REF,
32ed3f464   Matthew Ranostay   ALSA: hda: Add ST...
96
  	STAC_92HD83XXX_PWR_REF,
8bb0ac557   Matthew Ranostay   ALSA: hda: Add ST...
97
  	STAC_DELL_S14,
f7f9bdfad   Julian Wollrath   ALSA: hda - fix i...
98
  	STAC_DELL_VOSTRO_3500,
0c27c1805   Vitaliy Kulikov   ALSA: hda - Add s...
99
  	STAC_92HD83XXX_HP_cNB11_INTQUAD,
483155901   Steven Eastland   ALSA: hda - New s...
100
  	STAC_HP_DV7_4000,
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
101
102
103
104
  	STAC_92HD83XXX_MODELS
  };
  
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
105
  	STAC_92HD71BXX_AUTO,
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
106
  	STAC_92HD71BXX_REF,
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
107
108
  	STAC_DELL_M4_1,
  	STAC_DELL_M4_2,
3a7abfd2b   Matthew Ranostay   ALSA: hda: Add ST...
109
  	STAC_DELL_M4_3,
6a14f5851   Matthew Ranostay   ALSA: hda: Added ...
110
  	STAC_HP_M4,
2a6ce6e5f   Takashi Iwai   ALSA: hda - Add h...
111
  	STAC_HP_DV4,
1b0652eb5   Takashi Iwai   ALSA: hda - Fix H...
112
  	STAC_HP_DV5,
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
113
  	STAC_HP_HDX,
514bf54cd   James Gardiner   ALSA: hda - Addit...
114
  	STAC_HP_DV4_1222NR,
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
115
116
117
118
  	STAC_92HD71BXX_MODELS
  };
  
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
119
  	STAC_925x_AUTO,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
120
  	STAC_925x_REF,
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
121
122
123
  	STAC_M1,
  	STAC_M1_2,
  	STAC_M2,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
124
  	STAC_M2_2,
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
125
126
127
  	STAC_M3,
  	STAC_M5,
  	STAC_M6,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
128
129
130
131
  	STAC_925x_MODELS
  };
  
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
132
  	STAC_922X_AUTO,
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
133
134
135
  	STAC_D945_REF,
  	STAC_D945GTP3,
  	STAC_D945GTP5,
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
136
137
138
139
140
  	STAC_INTEL_MAC_V1,
  	STAC_INTEL_MAC_V2,
  	STAC_INTEL_MAC_V3,
  	STAC_INTEL_MAC_V4,
  	STAC_INTEL_MAC_V5,
536319afd   Nicolas Boichat   ALSA: Allow to fo...
141
142
143
  	STAC_INTEL_MAC_AUTO, /* This model is selected if no module parameter
  			      * is given, one of the above models will be
  			      * chosen according to the subsystem id. */
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
144
  	/* for backward compatibility */
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
145
  	STAC_MACMINI,
3fc24d850   Takashi Iwai   [ALSA] hda-codec ...
146
  	STAC_MACBOOK,
6f0778d87   Nicolas Boichat   [ALSA] hda-codec ...
147
148
  	STAC_MACBOOK_PRO_V1,
  	STAC_MACBOOK_PRO_V2,
f16928fb5   Sylvain FORET   [ALSA] snd_hda_in...
149
  	STAC_IMAC_INTEL,
0dae0f83c   Takashi Iwai   [ALSA] hda-codec ...
150
  	STAC_IMAC_INTEL_20,
8c6500879   Mauro Carvalho Chehab   ALSA: hda: Add su...
151
  	STAC_ECS_202,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
152
153
154
155
  	STAC_922X_DELL_D81,
  	STAC_922X_DELL_D82,
  	STAC_922X_DELL_M81,
  	STAC_922X_DELL_M82,
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
156
157
158
159
  	STAC_922X_MODELS
  };
  
  enum {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
160
  	STAC_927X_AUTO,
e28d83223   Takashi Iwai   ALSA: hda - Fix s...
161
  	STAC_D965_REF_NO_JD, /* no jack-detection */
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
162
163
164
  	STAC_D965_REF,
  	STAC_D965_3ST,
  	STAC_D965_5ST,
679d92ed1   Takashi Iwai   ALSA: hda - Add 5...
165
  	STAC_D965_5ST_NO_FP,
4ff076e5d   Tobin Davis   [ALSA] hda-codec ...
166
  	STAC_DELL_3ST,
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
167
  	STAC_DELL_BIOS,
54930531a   Takashi Iwai   ALSA: hda - Fix m...
168
  	STAC_927X_VOLKNOB,
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
169
170
  	STAC_927X_MODELS
  };
403d19446   Matt Porter   [ALSA] hda-codec ...
171

307282c89   Takashi Iwai   ALSA: hda - Add m...
172
173
174
175
176
  enum {
  	STAC_9872_AUTO,
  	STAC_9872_VAIO,
  	STAC_9872_MODELS
  };
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
177
178
  struct sigmatel_mic_route {
  	hda_nid_t pin;
02d333228   Takashi Iwai   ALSA: hda - Fix d...
179
180
  	signed char mux_idx;
  	signed char dmux_idx;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
181
  };
699d89956   Vitaliy Kulikov   ALSA: hda - pin-a...
182
183
184
  #define MAX_PINS_NUM 16
  #define MAX_ADCS_NUM 4
  #define MAX_DMICS_NUM 4
2f2f4251c   Matt   [ALSA] add sigmat...
185
  struct sigmatel_spec {
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
186
  	struct snd_kcontrol_new *mixers[4];
c7d4b2fa3   Matt   [ALSA] hda-codec ...
187
  	unsigned int num_mixers;
403d19446   Matt Porter   [ALSA] hda-codec ...
188
  	int board_config;
c0cea0d09   Matthew Ranostay   ALSA: hda: STAC_D...
189
  	unsigned int eapd_switch: 1;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
190
  	unsigned int surr_switch: 1;
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
191
  	unsigned int alt_switch: 1;
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
192
  	unsigned int hp_detect: 1;
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
193
  	unsigned int spdif_mute: 1;
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
194
  	unsigned int check_volume_offset:1;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
195
  	unsigned int auto_mic:1;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
196
  	unsigned int linear_tone_beep:1;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
197

4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
198
  	/* gpio lines */
0fc9dec46   Matthew Ranostay   [ALSA] hda: EAPD ...
199
  	unsigned int eapd_mask;
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
200
201
202
203
  	unsigned int gpio_mask;
  	unsigned int gpio_dir;
  	unsigned int gpio_data;
  	unsigned int gpio_mute;
86d190e77   Takashi Iwai   ALSA: hda - Minor...
204
  	unsigned int gpio_led;
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
205
  	unsigned int gpio_led_polarity;
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
206
  	unsigned int vref_mute_led_nid; /* pin NID for mute-LED vref control */
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
207
  	unsigned int vref_led;
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
208

8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
209
210
  	/* stream */
  	unsigned int stream_delay;
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
211
  	/* analog loopback */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
212
  	const struct snd_kcontrol_new *aloopback_ctl;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
213
214
  	unsigned char aloopback_mask;
  	unsigned char aloopback_shift;
8259980eb   Takashi Iwai   [ALSA] hda-codec ...
215

a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
216
217
  	/* power management */
  	unsigned int num_pwrs;
2b63536f0   Takashi Iwai   ALSA: hda - Const...
218
219
  	const hda_nid_t *pwr_nids;
  	const hda_nid_t *dac_list;
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
220

2f2f4251c   Matt   [ALSA] add sigmat...
221
  	/* playback */
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
222
223
  	struct hda_input_mux *mono_mux;
  	unsigned int cur_mmux;
2f2f4251c   Matt   [ALSA] add sigmat...
224
  	struct hda_multi_out multiout;
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
225
  	hda_nid_t dac_nids[5];
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
226
227
  	hda_nid_t hp_dacs[5];
  	hda_nid_t speaker_dacs[5];
2f2f4251c   Matt   [ALSA] add sigmat...
228

7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
229
  	int volume_offset;
2f2f4251c   Matt   [ALSA] add sigmat...
230
  	/* capture */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
231
  	const hda_nid_t *adc_nids;
2f2f4251c   Matt   [ALSA] add sigmat...
232
  	unsigned int num_adcs;
2b63536f0   Takashi Iwai   ALSA: hda - Const...
233
  	const hda_nid_t *mux_nids;
dabbed6f7   Matt   [ALSA] SigmaTel H...
234
  	unsigned int num_muxes;
2b63536f0   Takashi Iwai   ALSA: hda - Const...
235
  	const hda_nid_t *dmic_nids;
8b65727bf   Matt Porter   [ALSA] hda: add d...
236
  	unsigned int num_dmics;
2b63536f0   Takashi Iwai   ALSA: hda - Const...
237
  	const hda_nid_t *dmux_nids;
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
238
  	unsigned int num_dmuxes;
2b63536f0   Takashi Iwai   ALSA: hda - Const...
239
  	const hda_nid_t *smux_nids;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
240
  	unsigned int num_smuxes;
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
241
  	unsigned int num_analog_muxes;
6479c6318   Takashi Iwai   ALSA: hda - Creat...
242

2b63536f0   Takashi Iwai   ALSA: hda - Const...
243
244
  	const unsigned long *capvols; /* amp-volume attr: HDA_COMPOSE_AMP_VAL() */
  	const unsigned long *capsws; /* amp-mute attr: HDA_COMPOSE_AMP_VAL() */
6479c6318   Takashi Iwai   ALSA: hda - Creat...
245
  	unsigned int num_caps; /* number of capture volume/switch elements */
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
246
247
  	struct sigmatel_mic_route ext_mic;
  	struct sigmatel_mic_route int_mic;
9907790aa   Charles Chin   ALSA: hda - Fix a...
248
  	struct sigmatel_mic_route dock_mic;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
249

ea7349632   Takashi Iwai   ALSA: hda - consi...
250
  	const char * const *spdif_labels;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
251

dabbed6f7   Matt   [ALSA] SigmaTel H...
252
  	hda_nid_t dig_in_nid;
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
253
  	hda_nid_t mono_nid;
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
254
255
  	hda_nid_t anabeep_nid;
  	hda_nid_t digbeep_nid;
2f2f4251c   Matt   [ALSA] add sigmat...
256

2f2f4251c   Matt   [ALSA] add sigmat...
257
  	/* pin widgets */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
258
  	const hda_nid_t *pin_nids;
2f2f4251c   Matt   [ALSA] add sigmat...
259
  	unsigned int num_pins;
2f2f4251c   Matt   [ALSA] add sigmat...
260
261
  
  	/* codec specific stuff */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
262
263
  	const struct hda_verb *init;
  	const struct snd_kcontrol_new *mixer;
2f2f4251c   Matt   [ALSA] add sigmat...
264
265
  
  	/* capture source */
8b65727bf   Matt Porter   [ALSA] hda: add d...
266
  	struct hda_input_mux *dinput_mux;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
267
  	unsigned int cur_dmux[2];
c7d4b2fa3   Matt   [ALSA] hda-codec ...
268
  	struct hda_input_mux *input_mux;
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
269
  	unsigned int cur_mux[3];
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
270
271
  	struct hda_input_mux *sinput_mux;
  	unsigned int cur_smux[2];
2a9c78160   Matthew Ranostay   ALSA: hda: 92hd73...
272
273
  	unsigned int cur_amux;
  	hda_nid_t *amp_nids;
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
274
  	unsigned int powerdown_adcs;
2f2f4251c   Matt   [ALSA] add sigmat...
275

403d19446   Matt Porter   [ALSA] hda-codec ...
276
277
  	/* i/o switches */
  	unsigned int io_switch[2];
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
278
  	unsigned int clfe_swap;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
279
280
281
  	hda_nid_t line_switch;	/* shared line-in for input and output */
  	hda_nid_t mic_switch;	/* shared mic-in for input and output */
  	hda_nid_t hp_switch; /* NID of HP as line-out */
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
282
  	unsigned int aloopback;
2f2f4251c   Matt   [ALSA] add sigmat...
283

c7d4b2fa3   Matt   [ALSA] hda-codec ...
284
285
286
287
  	struct hda_pcm pcm_rec[2];	/* PCM information */
  
  	/* dynamic controls and input_mux */
  	struct auto_pin_cfg autocfg;
603c40199   Takashi Iwai   ALSA: hda - Use g...
288
  	struct snd_array kctls;
8b65727bf   Matt Porter   [ALSA] hda: add d...
289
  	struct hda_input_mux private_dimux;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
290
  	struct hda_input_mux private_imux;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
291
  	struct hda_input_mux private_smux;
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
292
  	struct hda_input_mux private_mono_mux;
699d89956   Vitaliy Kulikov   ALSA: hda - pin-a...
293
294
295
296
297
298
299
300
301
302
303
  
  	/* auto spec */
  	unsigned auto_pin_cnt;
  	hda_nid_t auto_pin_nids[MAX_PINS_NUM];
  	unsigned auto_adc_cnt;
  	hda_nid_t auto_adc_nids[MAX_ADCS_NUM];
  	hda_nid_t auto_mux_nids[MAX_ADCS_NUM];
  	hda_nid_t auto_dmux_nids[MAX_ADCS_NUM];
  	unsigned long auto_capvols[MAX_ADCS_NUM];
  	unsigned auto_dmic_cnt;
  	hda_nid_t auto_dmic_nids[MAX_DMICS_NUM];
2f2f4251c   Matt   [ALSA] add sigmat...
304
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
305
  static const hda_nid_t stac9200_adc_nids[1] = {
2f2f4251c   Matt   [ALSA] add sigmat...
306
307
          0x03,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
308
  static const hda_nid_t stac9200_mux_nids[1] = {
2f2f4251c   Matt   [ALSA] add sigmat...
309
310
          0x0c,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
311
  static const hda_nid_t stac9200_dac_nids[1] = {
2f2f4251c   Matt   [ALSA] add sigmat...
312
313
          0x02,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
314
  static const hda_nid_t stac92hd73xx_pwr_nids[8] = {
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
315
316
317
  	0x0a, 0x0b, 0x0c, 0xd, 0x0e,
  	0x0f, 0x10, 0x11
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
318
  static const hda_nid_t stac92hd73xx_slave_dig_outs[2] = {
0ffa98075   Matthew Ranostay   ALSA: hda: digita...
319
320
  	0x26, 0,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
321
  static const hda_nid_t stac92hd73xx_adc_nids[2] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
322
323
324
325
  	0x1a, 0x1b
  };
  
  #define STAC92HD73XX_NUM_DMICS	2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
326
  static const hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
327
328
329
330
  	0x13, 0x14, 0
  };
  
  #define STAC92HD73_DAC_COUNT 5
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
331

2b63536f0   Takashi Iwai   ALSA: hda - Const...
332
  static const hda_nid_t stac92hd73xx_mux_nids[2] = {
e2aec1710   Takashi Iwai   ALSA: hda - Fix i...
333
  	0x20, 0x21,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
334
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
335
  static const hda_nid_t stac92hd73xx_dmux_nids[2] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
336
337
  	0x20, 0x21,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
338
  static const hda_nid_t stac92hd73xx_smux_nids[2] = {
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
339
340
  	0x22, 0x23,
  };
6479c6318   Takashi Iwai   ALSA: hda - Creat...
341
  #define STAC92HD73XX_NUM_CAPS	2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
342
  static const unsigned long stac92hd73xx_capvols[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
343
344
345
346
  	HDA_COMPOSE_AMP_VAL(0x20, 3, 0, HDA_OUTPUT),
  	HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
  };
  #define stac92hd73xx_capsws	stac92hd73xx_capvols
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
347
  #define STAC92HD83_DAC_COUNT 3
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
348

afef2cfa0   Charles Chin   ALSA: hda - pwr_n...
349
350
351
  static const hda_nid_t stac92hd83xxx_pwr_nids[7] = {
  	0x0a, 0x0b, 0x0c, 0xd, 0x0e,
  	0x0f, 0x10
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
352
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
353
  static const hda_nid_t stac92hd83xxx_slave_dig_outs[2] = {
0ffa98075   Matthew Ranostay   ALSA: hda: digita...
354
355
  	0x1e, 0,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
356
  static const hda_nid_t stac92hd83xxx_dmic_nids[] = {
699d89956   Vitaliy Kulikov   ALSA: hda - pin-a...
357
  		0x11, 0x20,
ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
358
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
359
  static const hda_nid_t stac92hd71bxx_pwr_nids[3] = {
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
360
361
  	0x0a, 0x0d, 0x0f
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
362
  static const hda_nid_t stac92hd71bxx_adc_nids[2] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
363
364
  	0x12, 0x13,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
365
  static const hda_nid_t stac92hd71bxx_mux_nids[2] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
366
367
  	0x1a, 0x1b
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
368
  static const hda_nid_t stac92hd71bxx_dmux_nids[2] = {
4b33c7675   Matthew Ranostay   ALSA: hda: add mi...
369
  	0x1c, 0x1d,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
370
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
371
  static const hda_nid_t stac92hd71bxx_smux_nids[2] = {
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
372
373
  	0x24, 0x25,
  };
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
374
  #define STAC92HD71BXX_NUM_DMICS	2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
375
  static const hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
376
377
  	0x18, 0x19, 0
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
378
379
380
381
382
  static const hda_nid_t stac92hd71bxx_dmic_5port_nids[STAC92HD71BXX_NUM_DMICS] = {
  	0x18, 0
  };
  
  static const hda_nid_t stac92hd71bxx_slave_dig_outs[2] = {
0ffa98075   Matthew Ranostay   ALSA: hda: digita...
383
384
  	0x22, 0
  };
6479c6318   Takashi Iwai   ALSA: hda - Creat...
385
  #define STAC92HD71BXX_NUM_CAPS		2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
386
  static const unsigned long stac92hd71bxx_capvols[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
387
388
389
390
  	HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
  	HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
  };
  #define stac92hd71bxx_capsws	stac92hd71bxx_capvols
2b63536f0   Takashi Iwai   ALSA: hda - Const...
391
  static const hda_nid_t stac925x_adc_nids[1] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
392
393
          0x03,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
394
  static const hda_nid_t stac925x_mux_nids[1] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
395
396
          0x0f,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
397
  static const hda_nid_t stac925x_dac_nids[1] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
398
399
          0x02,
  };
f6e9852ad   Takashi Iwai   [ALSA] hda-codec ...
400
  #define STAC925X_NUM_DMICS	1
2b63536f0   Takashi Iwai   ALSA: hda - Const...
401
  static const hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
f6e9852ad   Takashi Iwai   [ALSA] hda-codec ...
402
  	0x15, 0
2c11f955b   Tobin Davis   [ALSA] HDA: Add s...
403
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
404
  static const hda_nid_t stac925x_dmux_nids[1] = {
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
405
406
  	0x14,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
407
  static const unsigned long stac925x_capvols[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
408
409
  	HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
410
  static const unsigned long stac925x_capsws[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
411
412
  	HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
413
  static const hda_nid_t stac922x_adc_nids[2] = {
2f2f4251c   Matt   [ALSA] add sigmat...
414
415
          0x06, 0x07,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
416
  static const hda_nid_t stac922x_mux_nids[2] = {
2f2f4251c   Matt   [ALSA] add sigmat...
417
418
          0x12, 0x13,
  };
6479c6318   Takashi Iwai   ALSA: hda - Creat...
419
  #define STAC922X_NUM_CAPS	2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
420
  static const unsigned long stac922x_capvols[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
421
422
423
424
  	HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_INPUT),
  	HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
  };
  #define stac922x_capsws		stac922x_capvols
2b63536f0   Takashi Iwai   ALSA: hda - Const...
425
  static const hda_nid_t stac927x_slave_dig_outs[2] = {
45c1d85bc   Matthew Ranostay   ALSA: hda: Added ...
426
427
  	0x1f, 0,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
428
  static const hda_nid_t stac927x_adc_nids[3] = {
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
429
430
          0x07, 0x08, 0x09
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
431
  static const hda_nid_t stac927x_mux_nids[3] = {
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
432
433
          0x15, 0x16, 0x17
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
434
  static const hda_nid_t stac927x_smux_nids[1] = {
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
435
436
  	0x21,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
437
  static const hda_nid_t stac927x_dac_nids[6] = {
b76c850fb   Matthew Ranostay   [ALSA] hda: STAC9...
438
439
  	0x02, 0x03, 0x04, 0x05, 0x06, 0
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
440
  static const hda_nid_t stac927x_dmux_nids[1] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
441
442
  	0x1b,
  };
7f16859a8   Matthew Ranostay   [ALSA] hda-codec ...
443
  #define STAC927X_NUM_DMICS 2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
444
  static const hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
7f16859a8   Matthew Ranostay   [ALSA] hda-codec ...
445
446
  	0x13, 0x14, 0
  };
6479c6318   Takashi Iwai   ALSA: hda - Creat...
447
  #define STAC927X_NUM_CAPS	3
2b63536f0   Takashi Iwai   ALSA: hda - Const...
448
  static const unsigned long stac927x_capvols[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
449
450
451
452
  	HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
  	HDA_COMPOSE_AMP_VAL(0x19, 3, 0, HDA_INPUT),
  	HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_INPUT),
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
453
  static const unsigned long stac927x_capsws[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
454
455
456
457
  	HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
  	HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
  	HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
458
  static const char * const stac927x_spdif_labels[5] = {
659736321   Matthew Ranostay   ALSA: hda: SPDIF ...
459
460
461
  	"Digital Playback", "ADAT", "Analog Mux 1",
  	"Analog Mux 2", "Analog Mux 3"
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
462
  static const hda_nid_t stac9205_adc_nids[2] = {
f3302a59c   Matt Porter   [ALSA] hda: sigma...
463
464
          0x12, 0x13
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
465
  static const hda_nid_t stac9205_mux_nids[2] = {
f3302a59c   Matt Porter   [ALSA] hda: sigma...
466
467
          0x19, 0x1a
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
468
  static const hda_nid_t stac9205_dmux_nids[1] = {
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
469
  	0x1d,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
470
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
471
  static const hda_nid_t stac9205_smux_nids[1] = {
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
472
473
  	0x21,
  };
f6e9852ad   Takashi Iwai   [ALSA] hda-codec ...
474
  #define STAC9205_NUM_DMICS	2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
475
  static const hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
f6e9852ad   Takashi Iwai   [ALSA] hda-codec ...
476
          0x17, 0x18, 0
8b65727bf   Matt Porter   [ALSA] hda: add d...
477
  };
6479c6318   Takashi Iwai   ALSA: hda - Creat...
478
  #define STAC9205_NUM_CAPS	2
2b63536f0   Takashi Iwai   ALSA: hda - Const...
479
  static const unsigned long stac9205_capvols[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
480
481
482
  	HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_INPUT),
  	HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_INPUT),
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
483
  static const unsigned long stac9205_capsws[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
484
485
486
  	HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
  	HDA_COMPOSE_AMP_VAL(0x1e, 3, 0, HDA_OUTPUT),
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
487
  static const hda_nid_t stac9200_pin_nids[8] = {
93ed15037   Tobin Davis   [ALSA] hda-codec ...
488
489
  	0x08, 0x09, 0x0d, 0x0e, 
  	0x0f, 0x10, 0x11, 0x12,
2f2f4251c   Matt   [ALSA] add sigmat...
490
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
491
  static const hda_nid_t stac925x_pin_nids[8] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
492
493
494
  	0x07, 0x08, 0x0a, 0x0b, 
  	0x0c, 0x0d, 0x10, 0x11,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
495
  static const hda_nid_t stac922x_pin_nids[10] = {
2f2f4251c   Matt   [ALSA] add sigmat...
496
497
498
  	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
  	0x0f, 0x10, 0x11, 0x15, 0x1b,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
499
  static const hda_nid_t stac92hd73xx_pin_nids[13] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
500
501
  	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
  	0x0f, 0x10, 0x11, 0x12, 0x13,
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
502
  	0x14, 0x22, 0x23
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
503
  };
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
504
  #define STAC92HD71BXX_NUM_PINS 13
2b63536f0   Takashi Iwai   ALSA: hda - Const...
505
  static const hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = {
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
506
507
508
509
  	0x0a, 0x0b, 0x0c, 0x0d, 0x00,
  	0x00, 0x14, 0x18, 0x19, 0x1e,
  	0x1f, 0x20, 0x27
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
510
  static const hda_nid_t stac92hd71bxx_pin_nids_6port[STAC92HD71BXX_NUM_PINS] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
511
512
  	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
  	0x0f, 0x14, 0x18, 0x19, 0x1e,
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
513
  	0x1f, 0x20, 0x27
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
514
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
515
  static const hda_nid_t stac927x_pin_nids[14] = {
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
516
517
518
519
  	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
  	0x0f, 0x10, 0x11, 0x12, 0x13,
  	0x14, 0x21, 0x22, 0x23,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
520
  static const hda_nid_t stac9205_pin_nids[12] = {
f3302a59c   Matt Porter   [ALSA] hda: sigma...
521
522
523
  	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
  	0x0f, 0x14, 0x16, 0x17, 0x18,
  	0x21, 0x22,
f3302a59c   Matt Porter   [ALSA] hda: sigma...
524
  };
8b65727bf   Matt Porter   [ALSA] hda: add d...
525
526
527
528
529
530
531
532
533
534
535
536
537
  static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
  				   struct snd_ctl_elem_info *uinfo)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
  }
  
  static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
  				  struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
538
  	unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
8b65727bf   Matt Porter   [ALSA] hda: add d...
539

e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
540
  	ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
8b65727bf   Matt Porter   [ALSA] hda: add d...
541
542
543
544
545
546
547
548
  	return 0;
  }
  
  static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
  				  struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
549
  	unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
8b65727bf   Matt Porter   [ALSA] hda: add d...
550
551
  
  	return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
552
  			spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
8b65727bf   Matt Porter   [ALSA] hda: add d...
553
  }
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
  static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
  				   struct snd_ctl_elem_info *uinfo)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_input_mux_info(spec->sinput_mux, uinfo);
  }
  
  static int stac92xx_smux_enum_get(struct snd_kcontrol *kcontrol,
  				  struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  
  	ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx];
  	return 0;
  }
  
  static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
  				  struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
578
  	struct hda_input_mux *smux = &spec->private_smux;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
579
  	unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
580
581
  	int err, val;
  	hda_nid_t nid;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
582

00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
583
  	err = snd_hda_input_mux_put(codec, spec->sinput_mux, ucontrol,
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
584
  			spec->smux_nids[smux_idx], &spec->cur_smux[smux_idx]);
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
585
586
587
588
589
590
591
592
593
  	if (err < 0)
  		return err;
  
  	if (spec->spdif_mute) {
  		if (smux_idx == 0)
  			nid = spec->multiout.dig_out_nid;
  		else
  			nid = codec->slave_dig_outs[smux_idx - 1];
  		if (spec->cur_smux[smux_idx] == smux->num_items - 1)
c9b46f914   Takashi Iwai   ALSA: hda - Use a...
594
  			val = HDA_AMP_MUTE;
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
595
  		else
c9b46f914   Takashi Iwai   ALSA: hda - Use a...
596
  			val = 0;
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
597
  		/* un/mute SPDIF out */
c9b46f914   Takashi Iwai   ALSA: hda - Use a...
598
599
  		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
  					 HDA_AMP_MUTE, val);
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
600
601
  	}
  	return 0;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
602
  }
96b635977   Wang Shaoyan   ALSA: hda - Add C...
603
  #ifdef CONFIG_SND_HDA_POWER_SAVE
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
  static int stac_vrefout_set(struct hda_codec *codec,
  					hda_nid_t nid, unsigned int new_vref)
  {
  	int error, pinctl;
  
  	snd_printdd("%s, nid %x ctl %x
  ", __func__, nid, new_vref);
  	pinctl = snd_hda_codec_read(codec, nid, 0,
  				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  
  	if (pinctl < 0)
  		return pinctl;
  
  	pinctl &= 0xff;
  	pinctl &= ~AC_PINCTL_VREFEN;
  	pinctl |= (new_vref & AC_PINCTL_VREFEN);
  
  	error = snd_hda_codec_write_cache(codec, nid, 0,
  					AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl);
  	if (error < 0)
  		return error;
  
  	return 1;
  }
96b635977   Wang Shaoyan   ALSA: hda - Add C...
628
  #endif
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
629

2fc998907   Nickolas Lloyd   ALSA: hda - add c...
630
631
632
  static unsigned int stac92xx_vref_set(struct hda_codec *codec,
  					hda_nid_t nid, unsigned int new_vref)
  {
b8621516c   Takashi Iwai   ALSA: hda - Fix u...
633
  	int error;
2fc998907   Nickolas Lloyd   ALSA: hda - add c...
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
  	unsigned int pincfg;
  	pincfg = snd_hda_codec_read(codec, nid, 0,
  				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  
  	pincfg &= 0xff;
  	pincfg &= ~(AC_PINCTL_VREFEN | AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
  	pincfg |= new_vref;
  
  	if (new_vref == AC_PINCTL_VREF_HIZ)
  		pincfg |= AC_PINCTL_OUT_EN;
  	else
  		pincfg |= AC_PINCTL_IN_EN;
  
  	error = snd_hda_codec_write_cache(codec, nid, 0,
  					AC_VERB_SET_PIN_WIDGET_CONTROL, pincfg);
  	if (error < 0)
  		return error;
  	else
  		return 1;
  }
  
  static unsigned int stac92xx_vref_get(struct hda_codec *codec, hda_nid_t nid)
  {
  	unsigned int vref;
  	vref = snd_hda_codec_read(codec, nid, 0,
  				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  	vref &= AC_PINCTL_VREFEN;
  	return vref;
  }
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
663
  static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
2f2f4251c   Matt   [ALSA] add sigmat...
664
665
666
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
667
  	return snd_hda_input_mux_info(spec->input_mux, uinfo);
2f2f4251c   Matt   [ALSA] add sigmat...
668
  }
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
669
  static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2f2f4251c   Matt   [ALSA] add sigmat...
670
671
672
673
674
675
676
677
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
  
  	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
  	return 0;
  }
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
678
  static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2f2f4251c   Matt   [ALSA] add sigmat...
679
680
681
682
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
683
  	const struct hda_input_mux *imux = spec->input_mux;
094a42452   Vitaliy Kulikov   ALSA: hda - fix d...
684
  	unsigned int idx, prev_idx, didx;
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
685
686
687
688
689
690
691
692
693
694
695
  
  	idx = ucontrol->value.enumerated.item[0];
  	if (idx >= imux->num_items)
  		idx = imux->num_items - 1;
  	prev_idx = spec->cur_mux[adc_idx];
  	if (prev_idx == idx)
  		return 0;
  	if (idx < spec->num_analog_muxes) {
  		snd_hda_codec_write_cache(codec, spec->mux_nids[adc_idx], 0,
  					  AC_VERB_SET_CONNECT_SEL,
  					  imux->items[idx].index);
094a42452   Vitaliy Kulikov   ALSA: hda - fix d...
696
697
  		if (prev_idx >= spec->num_analog_muxes &&
  		    spec->mux_nids[adc_idx] != spec->dmux_nids[adc_idx]) {
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
698
699
700
701
702
703
704
705
706
  			imux = spec->dinput_mux;
  			/* 0 = analog */
  			snd_hda_codec_write_cache(codec,
  						  spec->dmux_nids[adc_idx], 0,
  						  AC_VERB_SET_CONNECT_SEL,
  						  imux->items[0].index);
  		}
  	} else {
  		imux = spec->dinput_mux;
094a42452   Vitaliy Kulikov   ALSA: hda - fix d...
707
708
709
710
  		/* first dimux item is hardcoded to select analog imux,
  		 * so lets skip it
  		 */
  		didx = idx - spec->num_analog_muxes + 1;
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
711
712
  		snd_hda_codec_write_cache(codec, spec->dmux_nids[adc_idx], 0,
  					  AC_VERB_SET_CONNECT_SEL,
094a42452   Vitaliy Kulikov   ALSA: hda - fix d...
713
  					  imux->items[didx].index);
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
714
715
716
  	}
  	spec->cur_mux[adc_idx] = idx;
  	return 1;
2f2f4251c   Matt   [ALSA] add sigmat...
717
  }
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
  static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_input_mux_info(spec->mono_mux, uinfo);
  }
  
  static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  
  	ucontrol->value.enumerated.item[0] = spec->cur_mmux;
  	return 0;
  }
  
  static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  
  	return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
  				     spec->mono_nid, &spec->cur_mmux);
  }
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
745
746
747
748
749
750
  #define stac92xx_aloopback_info snd_ctl_boolean_mono_info
  
  static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
751
  	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
752
  	struct sigmatel_spec *spec = codec->spec;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
753
754
  	ucontrol->value.integer.value[0] = !!(spec->aloopback &
  					      (spec->aloopback_mask << idx));
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
755
756
757
758
759
760
761
762
  	return 0;
  }
  
  static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
  		struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
763
  	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
764
  	unsigned int dac_mode;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
765
  	unsigned int val, idx_val;
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
766

e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
767
768
769
770
771
  	idx_val = spec->aloopback_mask << idx;
  	if (ucontrol->value.integer.value[0])
  		val = spec->aloopback | idx_val;
  	else
  		val = spec->aloopback & ~idx_val;
68ea7b2f2   Takashi Iwai   [ALSA] hda-codec ...
772
  	if (spec->aloopback == val)
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
773
  		return 0;
68ea7b2f2   Takashi Iwai   [ALSA] hda-codec ...
774
  	spec->aloopback = val;
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
775

e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
776
777
778
  	/* Only return the bits defined by the shift value of the
  	 * first two bytes of the mask
  	 */
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
779
  	dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
780
781
  				      kcontrol->private_value & 0xFFFF, 0x0);
  	dac_mode >>= spec->aloopback_shift;
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
782

e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
783
  	if (spec->aloopback & idx_val) {
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
784
  		snd_hda_power_up(codec);
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
785
  		dac_mode |= idx_val;
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
786
787
  	} else {
  		snd_hda_power_down(codec);
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
788
  		dac_mode &= ~idx_val;
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
789
790
791
792
793
794
795
  	}
  
  	snd_hda_codec_write_cache(codec, codec->afg, 0,
  		kcontrol->private_value >> 16, dac_mode);
  
  	return 1;
  }
2b63536f0   Takashi Iwai   ALSA: hda - Const...
796
  static const struct hda_verb stac9200_core_init[] = {
2f2f4251c   Matt   [ALSA] add sigmat...
797
  	/* set dac0mux for dac converter */
c7d4b2fa3   Matt   [ALSA] hda-codec ...
798
  	{ 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2f2f4251c   Matt   [ALSA] add sigmat...
799
800
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
801
  static const struct hda_verb stac9200_eapd_init[] = {
1194b5b70   Takashi Iwai   [ALSA] hda-codec ...
802
803
804
805
806
  	/* set dac0mux for dac converter */
  	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
  	{0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
807
  static const struct hda_verb dell_eq_core_init[] = {
d654a6603   Matthew Ranostay   [ALSA] hda: 92HD7...
808
809
810
  	/* set master volume to max value without distortion
  	 * and direct control */
  	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
811
812
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
813
  static const struct hda_verb stac92hd73xx_core_init[] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
814
815
  	/* set master volume and direct control */
  	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
816
817
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
818
  static const struct hda_verb stac92hd83xxx_core_init[] = {
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
819
820
  	/* power state controls amps */
  	{ 0x01, AC_VERB_SET_EAPD, 1 << 2},
574f3c4f5   Herton Ronaldo Krzesinski   ALSA: hda - Add m...
821
  	{}
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
822
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
823
  static const struct hda_verb stac92hd71bxx_core_init[] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
824
825
  	/* set master volume and direct control */
  	{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
574f3c4f5   Herton Ronaldo Krzesinski   ALSA: hda - Add m...
826
  	{}
541eee876   Matthew Ranostay   [ALSA] hda: Added...
827
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
828
  static const struct hda_verb stac92hd71bxx_unmute_core_init[] = {
ca8d33fc9   Matthew Ranostay   ALSA: hda: 92hd71...
829
830
  	/* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */
  	{ 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
831
832
  	{ 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
  	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
833
834
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
835
  static const struct hda_verb stac925x_core_init[] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
836
837
  	/* set dac0mux for dac converter */
  	{ 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
c9280d681   Takashi Iwai   ALSA: hda - Fix (...
838
839
  	/* mute the master volume */
  	{ 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
840
841
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
842
  static const struct hda_verb stac922x_core_init[] = {
2f2f4251c   Matt   [ALSA] add sigmat...
843
  	/* set master volume and direct control */	
c7d4b2fa3   Matt   [ALSA] hda-codec ...
844
  	{ 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
2f2f4251c   Matt   [ALSA] add sigmat...
845
846
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
847
  static const struct hda_verb d965_core_init[] = {
19039bd00   Takashi Iwai   [ALSA] Add Intel ...
848
  	/* set master volume and direct control */	
93ed15037   Tobin Davis   [ALSA] hda-codec ...
849
  	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
19039bd00   Takashi Iwai   [ALSA] Add Intel ...
850
851
852
853
854
855
  	/* unmute node 0x1b */
  	{ 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  	/* select node 0x03 as DAC */	
  	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
856
  static const struct hda_verb dell_3st_core_init[] = {
ccca7cdc1   Takashi Iwai   ALSA: hda - Fix v...
857
858
859
860
861
862
863
864
  	/* don't set delta bit */
  	{0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
  	/* unmute node 0x1b */
  	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
  	/* select node 0x03 as DAC */
  	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
865
  static const struct hda_verb stac927x_core_init[] = {
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
866
867
  	/* set master volume and direct control */	
  	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
868
869
  	/* enable analog pc beep path */
  	{ 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
870
871
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
872
  static const struct hda_verb stac927x_volknob_core_init[] = {
54930531a   Takashi Iwai   ALSA: hda - Fix m...
873
874
875
876
877
878
  	/* don't set delta bit */
  	{0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
  	/* enable analog pc beep path */
  	{0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
879
  static const struct hda_verb stac9205_core_init[] = {
f3302a59c   Matt Porter   [ALSA] hda: sigma...
880
881
  	/* set master volume and direct control */	
  	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
882
883
  	/* enable analog pc beep path */
  	{ 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
f3302a59c   Matt Porter   [ALSA] hda: sigma...
884
885
  	{}
  };
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
886
887
888
889
890
891
892
893
894
  #define STAC_MONO_MUX \
  	{ \
  		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  		.name = "Mono Mux", \
  		.count = 1, \
  		.info = stac92xx_mono_mux_enum_info, \
  		.get = stac92xx_mono_mux_enum_get, \
  		.put = stac92xx_mono_mux_enum_put, \
  	}
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
895
  #define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
896
897
898
  	{ \
  		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  		.name  = "Analog Loopback", \
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
899
  		.count = cnt, \
5f10c4a9a   Maxim Levitsky   [ALSA] hda-codec ...
900
901
902
903
904
  		.info  = stac92xx_aloopback_info, \
  		.get   = stac92xx_aloopback_get, \
  		.put   = stac92xx_aloopback_put, \
  		.private_value = verb_read | (verb_write << 16), \
  	}
2fc998907   Nickolas Lloyd   ALSA: hda - add c...
905
906
907
908
909
910
911
912
913
914
  #define DC_BIAS(xname, idx, nid) \
  	{ \
  		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  		.name = xname, \
  		.index = idx, \
  		.info = stac92xx_dc_bias_info, \
  		.get = stac92xx_dc_bias_get, \
  		.put = stac92xx_dc_bias_put, \
  		.private_value = nid, \
  	}
2b63536f0   Takashi Iwai   ALSA: hda - Const...
915
  static const struct snd_kcontrol_new stac9200_mixer[] = {
de8c85f78   Clemens Ladisch   ALSA: HDA: Sigmat...
916
  	HDA_CODEC_VOLUME_MIN_MUTE("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
2f2f4251c   Matt   [ALSA] add sigmat...
917
  	HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
2f2f4251c   Matt   [ALSA] add sigmat...
918
919
  	HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
  	HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
2f2f4251c   Matt   [ALSA] add sigmat...
920
921
  	{ } /* end */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
922
  static const struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = {
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
923
924
925
  	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
926
  static const struct snd_kcontrol_new stac92hd73xx_8ch_loopback[] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
927
  	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
928
929
  	{}
  };
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
930

2b63536f0   Takashi Iwai   ALSA: hda - Const...
931
  static const struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = {
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
932
933
934
  	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
  	{}
  };
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
935

2b63536f0   Takashi Iwai   ALSA: hda - Const...
936
  static const struct snd_kcontrol_new stac92hd71bxx_loopback[] = {
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
937
938
  	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2)
  };
541eee876   Matthew Ranostay   [ALSA] hda: Added...
939

2b63536f0   Takashi Iwai   ALSA: hda - Const...
940
  static const struct snd_kcontrol_new stac925x_mixer[] = {
de8c85f78   Clemens Ladisch   ALSA: HDA: Sigmat...
941
  	HDA_CODEC_VOLUME_MIN_MUTE("Master Playback Volume", 0xe, 0, HDA_OUTPUT),
c9280d681   Takashi Iwai   ALSA: hda - Fix (...
942
  	HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT),
2f2f4251c   Matt   [ALSA] add sigmat...
943
944
  	{ } /* end */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
945
  static const struct snd_kcontrol_new stac9205_loopback[] = {
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
946
947
948
  	STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
949
  static const struct snd_kcontrol_new stac927x_loopback[] = {
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
950
951
952
  	STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
  	{}
  };
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
953
954
955
956
957
958
959
960
  static struct snd_kcontrol_new stac_dmux_mixer = {
  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  	.name = "Digital Input Source",
  	/* count set later */
  	.info = stac92xx_dmux_enum_info,
  	.get = stac92xx_dmux_enum_get,
  	.put = stac92xx_dmux_enum_put,
  };
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
961
962
  static struct snd_kcontrol_new stac_smux_mixer = {
  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
e34879701   Matthew Ranostay   ALSA: hda: SPDIF ...
963
  	.name = "IEC958 Playback Source",
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
964
965
966
967
968
  	/* count set later */
  	.info = stac92xx_smux_enum_info,
  	.get = stac92xx_smux_enum_get,
  	.put = stac92xx_smux_enum_put,
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
969
  static const char * const slave_vols[] = {
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
970
971
972
973
974
975
  	"Front Playback Volume",
  	"Surround Playback Volume",
  	"Center Playback Volume",
  	"LFE Playback Volume",
  	"Side Playback Volume",
  	"Headphone Playback Volume",
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
976
  	"Speaker Playback Volume",
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
977
978
  	NULL
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
979
  static const char * const slave_sws[] = {
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
980
981
982
983
984
985
  	"Front Playback Switch",
  	"Surround Playback Switch",
  	"Center Playback Switch",
  	"LFE Playback Switch",
  	"Side Playback Switch",
  	"Headphone Playback Switch",
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
986
  	"Speaker Playback Switch",
edb54a55d   Takashi Iwai   [ALSA] hda-codec ...
987
  	"IEC958 Playback Switch",
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
988
989
  	NULL
  };
603c40199   Takashi Iwai   ALSA: hda - Use g...
990
  static void stac92xx_free_kctls(struct hda_codec *codec);
2f2f4251c   Matt   [ALSA] add sigmat...
991
992
993
994
  static int stac92xx_build_controls(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	int err;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
995
  	int i;
2f2f4251c   Matt   [ALSA] add sigmat...
996

6479c6318   Takashi Iwai   ALSA: hda - Creat...
997
998
999
1000
1001
  	if (spec->mixer) {
  		err = snd_hda_add_new_ctls(codec, spec->mixer);
  		if (err < 0)
  			return err;
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
1002
1003
1004
1005
1006
1007
  
  	for (i = 0; i < spec->num_mixers; i++) {
  		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
  		if (err < 0)
  			return err;
  	}
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
1008
1009
  	if (!spec->auto_mic && spec->num_dmuxes > 0 &&
  	    snd_hda_get_bool_hint(codec, "separate_dmux") == 1) {
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
1010
  		stac_dmux_mixer.count = spec->num_dmuxes;
3911a4c19   Jaroslav Kysela   ALSA: hda - proc ...
1011
  		err = snd_hda_ctl_add(codec, 0,
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
1012
1013
1014
1015
  				  snd_ctl_new1(&stac_dmux_mixer, codec));
  		if (err < 0)
  			return err;
  	}
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
1016
  	if (spec->num_smuxes > 0) {
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
1017
1018
1019
1020
  		int wcaps = get_wcaps(codec, spec->multiout.dig_out_nid);
  		struct hda_input_mux *smux = &spec->private_smux;
  		/* check for mute support on SPDIF out */
  		if (wcaps & AC_WCAP_OUT_AMP) {
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
1021
  			snd_hda_add_imux_item(smux, "Off", 0, NULL);
00ef50c24   Matthew Ranostay   ALSA: hda: SPDIF ...
1022
1023
  			spec->spdif_mute = 1;
  		}
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
1024
  		stac_smux_mixer.count = spec->num_smuxes;
3911a4c19   Jaroslav Kysela   ALSA: hda - proc ...
1025
  		err = snd_hda_ctl_add(codec, 0,
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
1026
1027
1028
1029
  				  snd_ctl_new1(&stac_smux_mixer, codec));
  		if (err < 0)
  			return err;
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
1030

dabbed6f7   Matt   [ALSA] SigmaTel H...
1031
  	if (spec->multiout.dig_out_nid) {
74b654c95   Stephen Warren   ALSA: hda: Virtua...
1032
1033
1034
  		err = snd_hda_create_spdif_out_ctls(codec,
  						    spec->multiout.dig_out_nid,
  						    spec->multiout.dig_out_nid);
dabbed6f7   Matt   [ALSA] SigmaTel H...
1035
1036
  		if (err < 0)
  			return err;
9a08160bd   Takashi Iwai   [ALSA] hda-codec ...
1037
1038
1039
1040
1041
  		err = snd_hda_create_spdif_share_sw(codec,
  						    &spec->multiout);
  		if (err < 0)
  			return err;
  		spec->multiout.share_spdif = 1;
dabbed6f7   Matt   [ALSA] SigmaTel H...
1042
  	}
da74ae3e3   Harvey Harrison   ALSA: hda - corre...
1043
  	if (spec->dig_in_nid && !(spec->gpio_dir & 0x01)) {
dabbed6f7   Matt   [ALSA] SigmaTel H...
1044
1045
1046
1047
  		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
  		if (err < 0)
  			return err;
  	}
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
1048
1049
1050
  
  	/* if we have no master control, let's create it */
  	if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1c82ed1bc   Takashi Iwai   [ALSA] Keep priva...
1051
  		unsigned int vmaster_tlv[4];
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
1052
  		snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
1c82ed1bc   Takashi Iwai   [ALSA] Keep priva...
1053
  					HDA_OUTPUT, vmaster_tlv);
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
1054
1055
  		/* correct volume offset */
  		vmaster_tlv[2] += vmaster_tlv[3] * spec->volume_offset;
de8c85f78   Clemens Ladisch   ALSA: HDA: Sigmat...
1056
  		/* minimum value is actually mute */
a74ccea51   Clemens Ladisch   ALSA: hda - Fix w...
1057
  		vmaster_tlv[3] |= TLV_DB_SCALE_MUTE;
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
1058
  		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1c82ed1bc   Takashi Iwai   [ALSA] Keep priva...
1059
  					  vmaster_tlv, slave_vols);
2134ea4f3   Takashi Iwai   [ALSA] hda-codec ...
1060
1061
1062
1063
1064
1065
1066
1067
1068
  		if (err < 0)
  			return err;
  	}
  	if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
  		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
  					  NULL, slave_sws);
  		if (err < 0)
  			return err;
  	}
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
1069
1070
1071
1072
1073
1074
  	if (spec->aloopback_ctl &&
  	    snd_hda_get_bool_hint(codec, "loopback") == 1) {
  		err = snd_hda_add_new_ctls(codec, spec->aloopback_ctl);
  		if (err < 0)
  			return err;
  	}
603c40199   Takashi Iwai   ALSA: hda - Use g...
1075
  	stac92xx_free_kctls(codec); /* no longer needed */
e4973e1e5   Takashi Iwai   ALSA: hda - Creat...
1076

01a61e12b   Takashi Iwai   ALSA: hda - Creat...
1077
1078
1079
  	err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
  	if (err < 0)
  		return err;
e4973e1e5   Takashi Iwai   ALSA: hda - Creat...
1080

dabbed6f7   Matt   [ALSA] SigmaTel H...
1081
  	return 0;	
2f2f4251c   Matt   [ALSA] add sigmat...
1082
  }
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1083
  static const unsigned int ref9200_pin_configs[8] = {
dabbed6f7   Matt   [ALSA] SigmaTel H...
1084
  	0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
2f2f4251c   Matt   [ALSA] add sigmat...
1085
1086
  	0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1087
  static const unsigned int gateway9200_m4_pin_configs[8] = {
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1088
1089
1090
  	0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
  	0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1091
  static const unsigned int gateway9200_m4_2_pin_configs[8] = {
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1092
1093
1094
1095
1096
  	0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
  	0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
  };
  
  /*
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1097
1098
1099
1100
1101
      STAC 9200 pin configs for
      102801A8
      102801DE
      102801E8
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1102
  static const unsigned int dell9200_d21_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1103
1104
  	0x400001f0, 0x400001f1, 0x02214030, 0x01014010, 
  	0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1105
1106
1107
1108
1109
1110
1111
  };
  
  /* 
      STAC 9200 pin configs for
      102801C0
      102801C1
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1112
  static const unsigned int dell9200_d22_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1113
1114
  	0x400001f0, 0x400001f1, 0x0221401f, 0x01014010, 
  	0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
  };
  
  /* 
      STAC 9200 pin configs for
      102801C4 (Dell Dimension E310)
      102801C5
      102801C7
      102801D9
      102801DA
      102801E3
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1126
  static const unsigned int dell9200_d23_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1127
1128
  	0x400001f0, 0x400001f1, 0x0221401f, 0x01014010, 
  	0x01813020, 0x01a19021, 0x90100140, 0x400001f2, 
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1129
1130
1131
1132
1133
1134
1135
1136
  };
  
  
  /* 
      STAC 9200-32 pin configs for
      102801B5 (Dell Inspiron 630m)
      102801D8 (Dell Inspiron 640m)
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1137
  static const unsigned int dell9200_m21_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1138
1139
  	0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
  	0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
  };
  
  /* 
      STAC 9200-32 pin configs for
      102801C2 (Dell Latitude D620)
      102801C8 
      102801CC (Dell Latitude D820)
      102801D4 
      102801D6 
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1150
  static const unsigned int dell9200_m22_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1151
1152
  	0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310, 
  	0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1153
1154
1155
1156
1157
1158
1159
  };
  
  /* 
      STAC 9200-32 pin configs for
      102801CE (Dell XPS M1710)
      102801CF (Dell Precision M90)
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1160
  static const unsigned int dell9200_m23_pin_configs[8] = {
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
  	0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
  	0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
  };
  
  /*
      STAC 9200-32 pin configs for 
      102801C9
      102801CA
      102801CB (Dell Latitude 120L)
      102801D3
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1172
  static const unsigned int dell9200_m24_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1173
1174
  	0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310, 
  	0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe, 
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1175
1176
1177
1178
1179
1180
1181
1182
  };
  
  /*
      STAC 9200-32 pin configs for
      102801BD (Dell Inspiron E1505n)
      102801EE
      102801EF
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1183
  static const unsigned int dell9200_m25_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1184
1185
  	0x40c003fa, 0x01441340, 0x0421121f, 0x90170310, 
  	0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1186
1187
1188
1189
1190
1191
1192
  };
  
  /*
      STAC 9200-32 pin configs for
      102801F5 (Dell Inspiron 1501)
      102801F6
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1193
  static const unsigned int dell9200_m26_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1194
1195
  	0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310, 
  	0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1196
1197
1198
1199
1200
1201
  };
  
  /*
      STAC 9200-32
      102801CD (Dell Inspiron E1705/9400)
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1202
  static const unsigned int dell9200_m27_pin_configs[8] = {
af6c016ec   Takashi Iwai   [ALSA] hda-codec ...
1203
1204
  	0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
  	0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1205
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1206
  static const unsigned int oqo9200_pin_configs[8] = {
bf277785d   Tobin Davis   [ALSA] HDA - Add ...
1207
1208
1209
  	0x40c000f0, 0x404000f1, 0x0221121f, 0x02211210,
  	0x90170111, 0x90a70120, 0x400000f2, 0x400000f3,
  };
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1210

2b63536f0   Takashi Iwai   ALSA: hda - Const...
1211
  static const unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1212
  	[STAC_REF] = ref9200_pin_configs,
bf277785d   Tobin Davis   [ALSA] HDA - Add ...
1213
  	[STAC_9200_OQO] = oqo9200_pin_configs,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
  	[STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
  	[STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
  	[STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
  	[STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
  	[STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
  	[STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
  	[STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
  	[STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
  	[STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
  	[STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1224
1225
  	[STAC_9200_M4] = gateway9200_m4_pin_configs,
  	[STAC_9200_M4_2] = gateway9200_m4_2_pin_configs,
117f257d7   Takashi Iwai   [ALSA] hda-codec ...
1226
  	[STAC_9200_PANASONIC] = ref9200_pin_configs,
403d19446   Matt Porter   [ALSA] hda-codec ...
1227
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
1228
  static const char * const stac9200_models[STAC_9200_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
1229
  	[STAC_AUTO] = "auto",
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1230
  	[STAC_REF] = "ref",
bf277785d   Tobin Davis   [ALSA] HDA - Add ...
1231
  	[STAC_9200_OQO] = "oqo",
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
  	[STAC_9200_DELL_D21] = "dell-d21",
  	[STAC_9200_DELL_D22] = "dell-d22",
  	[STAC_9200_DELL_D23] = "dell-d23",
  	[STAC_9200_DELL_M21] = "dell-m21",
  	[STAC_9200_DELL_M22] = "dell-m22",
  	[STAC_9200_DELL_M23] = "dell-m23",
  	[STAC_9200_DELL_M24] = "dell-m24",
  	[STAC_9200_DELL_M25] = "dell-m25",
  	[STAC_9200_DELL_M26] = "dell-m26",
  	[STAC_9200_DELL_M27] = "dell-m27",
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1242
1243
  	[STAC_9200_M4] = "gateway-m4",
  	[STAC_9200_M4_2] = "gateway-m4-2",
117f257d7   Takashi Iwai   [ALSA] hda-codec ...
1244
  	[STAC_9200_PANASONIC] = "panasonic",
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1245
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1246
  static const struct snd_pci_quirk stac9200_cfg_tbl[] = {
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1247
1248
1249
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
  		      "DFI LanParty", STAC_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
1250
1251
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
  		      "DFI LanParty", STAC_REF),
e7377071c   Matt Porter   [ALSA] hda: fix s...
1252
  	/* Dell laptops have BIOS problem */
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1253
1254
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
  		      "unknown Dell", STAC_9200_DELL_D21),
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1255
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1256
1257
1258
1259
1260
1261
1262
  		      "Dell Inspiron 630m", STAC_9200_DELL_M21),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
  		      "Dell Inspiron E1505n", STAC_9200_DELL_M25),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
  		      "unknown Dell", STAC_9200_DELL_D22),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
  		      "unknown Dell", STAC_9200_DELL_D22),
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1263
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
  		      "Dell Latitude D620", STAC_9200_DELL_M22),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
  		      "unknown Dell", STAC_9200_DELL_D23),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
  		      "unknown Dell", STAC_9200_DELL_D23),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
  		      "unknown Dell", STAC_9200_DELL_M22),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
  		      "unknown Dell", STAC_9200_DELL_M24),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
  		      "unknown Dell", STAC_9200_DELL_M24),
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1275
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1276
  		      "Dell Latitude 120L", STAC_9200_DELL_M24),
877b866d8   Cory T. Tusar   [ALSA] hda-codec ...
1277
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1278
  		      "Dell Latitude D820", STAC_9200_DELL_M22),
46f02ca36   Mikael Nilsson   [ALSA] hda-codec ...
1279
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1280
  		      "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
46f02ca36   Mikael Nilsson   [ALSA] hda-codec ...
1281
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1282
  		      "Dell XPS M1710", STAC_9200_DELL_M23),
f0f967458   Takashi Iwai   [ALSA] hda-codec ...
1283
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1284
1285
1286
1287
1288
  		      "Dell Precision M90", STAC_9200_DELL_M23),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
  		      "unknown Dell", STAC_9200_DELL_M22),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
  		      "unknown Dell", STAC_9200_DELL_M22),
8286c53e5   Daniel T Chen   [ALSA] Include qu...
1289
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1290
  		      "unknown Dell", STAC_9200_DELL_M22),
49c605db8   Tobin Davis   [ALSA] HDA: Add m...
1291
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
  		      "Dell Inspiron 640m", STAC_9200_DELL_M21),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
  		      "unknown Dell", STAC_9200_DELL_D23),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
  		      "unknown Dell", STAC_9200_DELL_D23),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
  		      "unknown Dell", STAC_9200_DELL_D21),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
  		      "unknown Dell", STAC_9200_DELL_D23),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
  		      "unknown Dell", STAC_9200_DELL_D21),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
  		      "unknown Dell", STAC_9200_DELL_M25),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
  		      "unknown Dell", STAC_9200_DELL_M25),
49c605db8   Tobin Davis   [ALSA] HDA: Add m...
1307
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1308
1309
1310
  		      "Dell Inspiron 1501", STAC_9200_DELL_M26),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
  		      "unknown Dell", STAC_9200_DELL_M26),
49c605db8   Tobin Davis   [ALSA] HDA: Add m...
1311
  	/* Panasonic */
117f257d7   Takashi Iwai   [ALSA] hda-codec ...
1312
  	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
1194b5b70   Takashi Iwai   [ALSA] hda-codec ...
1313
  	/* Gateway machines needs EAPD to be set on resume */
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1314
1315
1316
  	SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4),
  	SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2),
  	SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2),
bf277785d   Tobin Davis   [ALSA] HDA - Add ...
1317
1318
  	/* OQO Mobile */
  	SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
403d19446   Matt Porter   [ALSA] hda-codec ...
1319
1320
  	{} /* terminator */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1321
  static const unsigned int ref925x_pin_configs[8] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1322
  	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
1323
  	0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1324
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1325
  static const unsigned int stac925xM1_pin_configs[8] = {
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1326
1327
  	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
  	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1328
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1329
  static const unsigned int stac925xM1_2_pin_configs[8] = {
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1330
1331
1332
  	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
  	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
  };
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1333

2b63536f0   Takashi Iwai   ALSA: hda - Const...
1334
  static const unsigned int stac925xM2_pin_configs[8] = {
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1335
1336
  	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
  	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
2c11f955b   Tobin Davis   [ALSA] HDA: Add s...
1337
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1338
  static const unsigned int stac925xM2_2_pin_configs[8] = {
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1339
1340
1341
  	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
  	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1342
  static const unsigned int stac925xM3_pin_configs[8] = {
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1343
1344
1345
  	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
  	0x40a000f0, 0x90100210, 0x400003f1, 0x503303f3,
  };
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1346

2b63536f0   Takashi Iwai   ALSA: hda - Const...
1347
  static const unsigned int stac925xM5_pin_configs[8] = {
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1348
1349
1350
  	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
  	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1351
  static const unsigned int stac925xM6_pin_configs[8] = {
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1352
1353
  	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
  	0x40a000f0, 0x90100210, 0x400003f1, 0x90330320,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1354
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1355
  static const unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1356
  	[STAC_REF] = ref925x_pin_configs,
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1357
1358
1359
  	[STAC_M1] = stac925xM1_pin_configs,
  	[STAC_M1_2] = stac925xM1_2_pin_configs,
  	[STAC_M2] = stac925xM2_pin_configs,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1360
  	[STAC_M2_2] = stac925xM2_2_pin_configs,
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1361
1362
1363
  	[STAC_M3] = stac925xM3_pin_configs,
  	[STAC_M5] = stac925xM5_pin_configs,
  	[STAC_M6] = stac925xM6_pin_configs,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1364
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
1365
  static const char * const stac925x_models[STAC_925x_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
1366
  	[STAC_925x_AUTO] = "auto",
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1367
  	[STAC_REF] = "ref",
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1368
1369
1370
  	[STAC_M1] = "m1",
  	[STAC_M1_2] = "m1-2",
  	[STAC_M2] = "m2",
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1371
  	[STAC_M2_2] = "m2-2",
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1372
1373
1374
  	[STAC_M3] = "m3",
  	[STAC_M5] = "m5",
  	[STAC_M6] = "m6",
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1375
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1376
  static const struct snd_pci_quirk stac925x_codec_id_cfg_tbl[] = {
58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
1377
1378
1379
1380
  	SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2),
  	SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5),
  	SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1),
  	SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2),
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1381
  	SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2),
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1382
1383
1384
1385
1386
  	/* Not sure about the brand name for those */
  	SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1),
  	SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3),
  	SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6),
  	SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2),
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1387
  	{} /* terminator */
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1388
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1389
  static const struct snd_pci_quirk stac925x_cfg_tbl[] = {
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1390
1391
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
1392
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF),
2c11f955b   Tobin Davis   [ALSA] HDA: Add s...
1393
  	SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
1394
1395
1396
  
  	/* Default table for unknown ID */
  	SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2),
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
1397
1398
  	{} /* terminator */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1399
  static const unsigned int ref92hd73xx_pin_configs[13] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
1400
1401
1402
  	0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
  	0x0181302e, 0x01014010, 0x01014020, 0x01014030,
  	0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1403
1404
  	0x01452050,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1405
  static const unsigned int dell_m6_pin_configs[13] = {
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1406
  	0x0321101f, 0x4f00000f, 0x4f0000f0, 0x90170110,
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
1407
  	0x03a11020, 0x0321101f, 0x4f0000f0, 0x4f0000f0,
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1408
1409
  	0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
  	0x4f0000f0,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
1410
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1411
  static const unsigned int alienware_m17x_pin_configs[13] = {
842ae6380   Takashi Iwai   ALSA: hda - Add s...
1412
1413
1414
1415
1416
  	0x0321101f, 0x0321101f, 0x03a11020, 0x03014020,
  	0x90170110, 0x4f0000f0, 0x4f0000f0, 0x4f0000f0,
  	0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
  	0x904601b0,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1417
  static const unsigned int intel_dg45id_pin_configs[13] = {
52dc43860   Alexey Fisher   ALSA: hda - Overw...
1418
  	0x02214230, 0x02A19240, 0x01013214, 0x01014210,
4d26f4465   Wu Fengguang   ALSA: hda - fix D...
1419
  	0x01A19250, 0x01011212, 0x01016211
52dc43860   Alexey Fisher   ALSA: hda - Overw...
1420
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1421
  static const unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1422
  	[STAC_92HD73XX_REF]	= ref92hd73xx_pin_configs,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1423
1424
1425
  	[STAC_DELL_M6_AMIC]	= dell_m6_pin_configs,
  	[STAC_DELL_M6_DMIC]	= dell_m6_pin_configs,
  	[STAC_DELL_M6_BOTH]	= dell_m6_pin_configs,
6b3ab21ef   Matthew Ranostay   ALSA: hda: make a...
1426
  	[STAC_DELL_EQ]	= dell_m6_pin_configs,
842ae6380   Takashi Iwai   ALSA: hda - Add s...
1427
  	[STAC_ALIENWARE_M17X]	= alienware_m17x_pin_configs,
52dc43860   Alexey Fisher   ALSA: hda - Overw...
1428
  	[STAC_92HD73XX_INTEL]	= intel_dg45id_pin_configs,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
1429
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
1430
  static const char * const stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
1431
  	[STAC_92HD73XX_AUTO] = "auto",
9e43f0de6   Takashi Iwai   ALSA: hda - Add n...
1432
  	[STAC_92HD73XX_NO_JD] = "no-jd",
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
1433
  	[STAC_92HD73XX_REF] = "ref",
ae709440e   Wu Fengguang   ALSA: hda: add mo...
1434
  	[STAC_92HD73XX_INTEL] = "intel",
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1435
1436
1437
  	[STAC_DELL_M6_AMIC] = "dell-m6-amic",
  	[STAC_DELL_M6_DMIC] = "dell-m6-dmic",
  	[STAC_DELL_M6_BOTH] = "dell-m6",
6b3ab21ef   Matthew Ranostay   ALSA: hda: make a...
1438
  	[STAC_DELL_EQ] = "dell-eq",
842ae6380   Takashi Iwai   ALSA: hda - Add s...
1439
  	[STAC_ALIENWARE_M17X] = "alienware",
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
1440
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1441
  static const struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
1442
1443
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1444
  				"DFI LanParty", STAC_92HD73XX_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
1445
1446
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
  				"DFI LanParty", STAC_92HD73XX_REF),
ae709440e   Wu Fengguang   ALSA: hda: add mo...
1447
1448
1449
1450
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002,
  				"Intel DG45ID", STAC_92HD73XX_INTEL),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003,
  				"Intel DG45FC", STAC_92HD73XX_INTEL),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1451
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1452
  				"Dell Studio 1535", STAC_DELL_M6_DMIC),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1453
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1454
  				"unknown Dell", STAC_DELL_M6_DMIC),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1455
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1456
  				"unknown Dell", STAC_DELL_M6_BOTH),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1457
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1458
  				"unknown Dell", STAC_DELL_M6_BOTH),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1459
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1460
  				"unknown Dell", STAC_DELL_M6_AMIC),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1461
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1462
  				"unknown Dell", STAC_DELL_M6_AMIC),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1463
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1464
1465
1466
  				"unknown Dell", STAC_DELL_M6_DMIC),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272,
  				"unknown Dell", STAC_DELL_M6_DMIC),
b0fc5e043   Takashi Iwai   ALSA: hda - Add a...
1467
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
1468
  				"Dell Studio 1537", STAC_DELL_M6_DMIC),
fa620e97f   Joerg Schirottke   ALSA: hda - Add q...
1469
1470
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
  				"Dell Studio 17", STAC_DELL_M6_DMIC),
626f5cefc   Takashi Iwai   ALSA: hda - Add q...
1471
1472
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
  				"Dell Studio 1555", STAC_DELL_M6_DMIC),
8ef5837a4   Daniel J Blueman   ALSA: hda - Dell ...
1473
1474
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd,
  				"Dell Studio 1557", STAC_DELL_M6_DMIC),
aac78daf8   Daniel T Chen   ALSA: hda: Use ST...
1475
1476
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe,
  				"Dell Studio XPS 1645", STAC_DELL_M6_BOTH),
5c1bccf64   Daniel T Chen   ALSA: hda: Use ST...
1477
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413,
e033ebfb3   David Henningsson   ALSA: HDA: Use on...
1478
  				"Dell Studio 1558", STAC_DELL_M6_DMIC),
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
1479
1480
  	{} /* terminator */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1481
  static const struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
842ae6380   Takashi Iwai   ALSA: hda - Add s...
1482
1483
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1,
  		      "Alienware M17x", STAC_ALIENWARE_M17X),
0defe09ca   Daniel T Chen   ALSA: hda: Use "a...
1484
1485
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a,
  		      "Alienware M17x", STAC_ALIENWARE_M17X),
dbd1b5473   Takashi Iwai   ALSA: hda - Add p...
1486
1487
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490,
  		      "Alienware M17x", STAC_ALIENWARE_M17X),
842ae6380   Takashi Iwai   ALSA: hda - Add s...
1488
1489
  	{} /* terminator */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1490
  static const unsigned int ref92hd83xxx_pin_configs[10] = {
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1491
1492
  	0x02214030, 0x02211010, 0x02a19020, 0x02170130,
  	0x01014050, 0x01819040, 0x01014020, 0x90a3014e,
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1493
1494
  	0x01451160, 0x98560170,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1495
  static const unsigned int dell_s14_pin_configs[10] = {
69b5655a8   Takashi Iwai   ALSA: hda - Fix D...
1496
1497
  	0x0221403f, 0x0221101f, 0x02a19020, 0x90170110,
  	0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a60160,
8bb0ac557   Matthew Ranostay   ALSA: hda: Add ST...
1498
1499
  	0x40f000f0, 0x40f000f0,
  };
f7f9bdfad   Julian Wollrath   ALSA: hda - fix i...
1500
1501
1502
1503
1504
  static const unsigned int dell_vostro_3500_pin_configs[10] = {
  	0x02a11020, 0x0221101f, 0x400000f0, 0x90170110,
  	0x400000f1, 0x400000f2, 0x400000f3, 0x90a60160,
  	0x400000f4, 0x400000f5,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1505
  static const unsigned int hp_dv7_4000_pin_configs[10] = {
483155901   Steven Eastland   ALSA: hda - New s...
1506
1507
1508
1509
  	0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110,
  	0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140,
  	0x40f000f0, 0x40f000f0,
  };
0c27c1805   Vitaliy Kulikov   ALSA: hda - Add s...
1510
1511
1512
1513
1514
  static const unsigned int hp_cNB11_intquad_pin_configs[10] = {
  	0x40f000f0, 0x0221101f, 0x02a11020, 0x92170110,
  	0x40f000f0, 0x92170110, 0x40f000f0, 0xd5a30130,
  	0x40f000f0, 0x40f000f0,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1515
  static const unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1516
  	[STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
32ed3f464   Matthew Ranostay   ALSA: hda: Add ST...
1517
  	[STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
8bb0ac557   Matthew Ranostay   ALSA: hda: Add ST...
1518
  	[STAC_DELL_S14] = dell_s14_pin_configs,
f7f9bdfad   Julian Wollrath   ALSA: hda - fix i...
1519
  	[STAC_DELL_VOSTRO_3500] = dell_vostro_3500_pin_configs,
0c27c1805   Vitaliy Kulikov   ALSA: hda - Add s...
1520
  	[STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs,
483155901   Steven Eastland   ALSA: hda - New s...
1521
  	[STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs,
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1522
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
1523
  static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
1524
  	[STAC_92HD83XXX_AUTO] = "auto",
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1525
  	[STAC_92HD83XXX_REF] = "ref",
32ed3f464   Matthew Ranostay   ALSA: hda: Add ST...
1526
  	[STAC_92HD83XXX_PWR_REF] = "mic-ref",
8bb0ac557   Matthew Ranostay   ALSA: hda: Add ST...
1527
  	[STAC_DELL_S14] = "dell-s14",
f7f9bdfad   Julian Wollrath   ALSA: hda - fix i...
1528
  	[STAC_DELL_VOSTRO_3500] = "dell-vostro-3500",
0c27c1805   Vitaliy Kulikov   ALSA: hda - Add s...
1529
  	[STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad",
483155901   Steven Eastland   ALSA: hda - New s...
1530
  	[STAC_HP_DV7_4000] = "hp-dv7-4000",
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1531
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1532
  static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1533
1534
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
f9d088b20   Takashi Iwai   ALSA: hda - Fix a...
1535
  		      "DFI LanParty", STAC_92HD83XXX_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
1536
1537
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
  		      "DFI LanParty", STAC_92HD83XXX_REF),
8bb0ac557   Matthew Ranostay   ALSA: hda: Add ST...
1538
1539
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
  		      "unknown Dell", STAC_DELL_S14),
f7f9bdfad   Julian Wollrath   ALSA: hda - fix i...
1540
1541
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028,
  		      "Dell Vostro 3500", STAC_DELL_VOSTRO_3500),
0c27c1805   Vitaliy Kulikov   ALSA: hda - Add s...
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1657,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1658,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1659,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165A,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165B,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3388,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3389,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355B,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355C,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355D,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355E,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355F,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3560,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358B,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358C,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358D,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3591,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3592,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3593,
  			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
574f3c4f5   Herton Ronaldo Krzesinski   ALSA: hda - Add m...
1582
  	{} /* terminator */
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
1583
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1584
  static const unsigned int ref92hd71bxx_pin_configs[STAC92HD71BXX_NUM_PINS] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1585
  	0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
4b33c7675   Matthew Ranostay   ALSA: hda: add mi...
1586
  	0x0181302e, 0x01014010, 0x01019020, 0x90a000f0,
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
1587
1588
  	0x90a000f0, 0x01452050, 0x01452050, 0x00000000,
  	0x00000000
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1589
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1590
  static const unsigned int dell_m4_1_pin_configs[STAC92HD71BXX_NUM_PINS] = {
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1591
  	0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
07bcb316c   Matthew Ranostay   [ALSA] hda: 92hd7...
1592
  	0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
1593
1594
  	0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000,
  	0x00000000
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1595
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1596
  static const unsigned int dell_m4_2_pin_configs[STAC92HD71BXX_NUM_PINS] = {
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1597
1598
  	0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
  	0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
1599
1600
  	0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
  	0x00000000
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1601
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1602
  static const unsigned int dell_m4_3_pin_configs[STAC92HD71BXX_NUM_PINS] = {
3a7abfd2b   Matthew Ranostay   ALSA: hda: Add ST...
1603
1604
  	0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
  	0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
1605
1606
  	0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
  	0x00000000
3a7abfd2b   Matthew Ranostay   ALSA: hda: Add ST...
1607
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1608
  static const unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1609
  	[STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1610
1611
  	[STAC_DELL_M4_1]	= dell_m4_1_pin_configs,
  	[STAC_DELL_M4_2]	= dell_m4_2_pin_configs,
3a7abfd2b   Matthew Ranostay   ALSA: hda: Add ST...
1612
  	[STAC_DELL_M4_3]	= dell_m4_3_pin_configs,
6a14f5851   Matthew Ranostay   ALSA: hda: Added ...
1613
  	[STAC_HP_M4]		= NULL,
2a6ce6e5f   Takashi Iwai   ALSA: hda - Add h...
1614
  	[STAC_HP_DV4]		= NULL,
1b0652eb5   Takashi Iwai   ALSA: hda - Fix H...
1615
  	[STAC_HP_DV5]		= NULL,
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
1616
  	[STAC_HP_HDX]           = NULL,
514bf54cd   James Gardiner   ALSA: hda - Addit...
1617
  	[STAC_HP_DV4_1222NR]	= NULL,
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1618
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
1619
  static const char * const stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
1620
  	[STAC_92HD71BXX_AUTO] = "auto",
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1621
  	[STAC_92HD71BXX_REF] = "ref",
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1622
1623
  	[STAC_DELL_M4_1] = "dell-m4-1",
  	[STAC_DELL_M4_2] = "dell-m4-2",
3a7abfd2b   Matthew Ranostay   ALSA: hda: Add ST...
1624
  	[STAC_DELL_M4_3] = "dell-m4-3",
6a14f5851   Matthew Ranostay   ALSA: hda: Added ...
1625
  	[STAC_HP_M4] = "hp-m4",
2a6ce6e5f   Takashi Iwai   ALSA: hda - Add h...
1626
  	[STAC_HP_DV4] = "hp-dv4",
1b0652eb5   Takashi Iwai   ALSA: hda - Fix H...
1627
  	[STAC_HP_DV5] = "hp-dv5",
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
1628
  	[STAC_HP_HDX] = "hp-hdx",
514bf54cd   James Gardiner   ALSA: hda - Addit...
1629
  	[STAC_HP_DV4_1222NR] = "hp-dv4-1222nr",
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1630
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1631
  static const struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1632
1633
1634
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
  		      "DFI LanParty", STAC_92HD71BXX_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
1635
1636
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
  		      "DFI LanParty", STAC_92HD71BXX_REF),
514bf54cd   James Gardiner   ALSA: hda - Addit...
1637
1638
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb,
  		      "HP dv4-1222nr", STAC_HP_DV4_1222NR),
5bdaaada1   Vitaliy Kulikov   ALSA: hda - Enabl...
1639
1640
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720,
  			  "HP", STAC_HP_DV5),
58d8395b7   Takashi Iwai   ALSA: hda - Add a...
1641
1642
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080,
  		      "HP", STAC_HP_DV5),
2ae466f8c   Takashi Iwai   ALSA: hda - Clean...
1643
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0,
2a6ce6e5f   Takashi Iwai   ALSA: hda - Add h...
1644
  		      "HP dv4-7", STAC_HP_DV4),
2ae466f8c   Takashi Iwai   ALSA: hda - Clean...
1645
1646
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600,
  		      "HP dv4-7", STAC_HP_DV5),
6fce61aea   Takashi Iwai   ALSA: hda - Fix c...
1647
1648
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610,
  		      "HP HDX", STAC_HP_HDX),  /* HDX18 */
9a9e2359f   Matthew Ranostay   ALSA: hda: HP lap...
1649
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
2ae466f8c   Takashi Iwai   ALSA: hda - Clean...
1650
  		      "HP mini 1000", STAC_HP_M4),
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
1651
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
6fce61aea   Takashi Iwai   ALSA: hda - Fix c...
1652
  		      "HP HDX", STAC_HP_HDX),  /* HDX16 */
6e34c0332   Takashi Iwai   ALSA: hda - Add s...
1653
1654
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620,
  		      "HP dv6", STAC_HP_DV5),
e3d2530a6   Kunal Gangakhedkar   ALSA: hda - Add P...
1655
1656
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061,
  		      "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */
9b2167d59   Luke Yelavich   ALSA: hda - Add a...
1657
1658
  	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x363e,
  		      "HP DV6", STAC_HP_DV5),
1972d0250   Takashi Iwai   ALSA: hda - Add q...
1659
1660
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
  		      "HP", STAC_HP_DV5),
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
  				"unknown Dell", STAC_DELL_M4_1),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
  				"unknown Dell", STAC_DELL_M4_1),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250,
  				"unknown Dell", STAC_DELL_M4_1),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f,
  				"unknown Dell", STAC_DELL_M4_1),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d,
  				"unknown Dell", STAC_DELL_M4_1),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251,
  				"unknown Dell", STAC_DELL_M4_1),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277,
  				"unknown Dell", STAC_DELL_M4_1),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263,
  				"unknown Dell", STAC_DELL_M4_2),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265,
  				"unknown Dell", STAC_DELL_M4_2),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262,
  				"unknown Dell", STAC_DELL_M4_2),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
  				"unknown Dell", STAC_DELL_M4_2),
3a7abfd2b   Matthew Ranostay   ALSA: hda: Add ST...
1683
1684
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa,
  				"unknown Dell", STAC_DELL_M4_3),
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
1685
1686
  	{} /* terminator */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1687
  static const unsigned int ref922x_pin_configs[10] = {
403d19446   Matt Porter   [ALSA] hda-codec ...
1688
1689
  	0x01014010, 0x01016011, 0x01012012, 0x0221401f,
  	0x01813122, 0x01011014, 0x01441030, 0x01c41030,
2f2f4251c   Matt   [ALSA] add sigmat...
1690
1691
  	0x40000100, 0x40000100,
  };
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1692
1693
1694
1695
1696
1697
1698
1699
  /*
      STAC 922X pin configs for
      102801A7
      102801AB
      102801A9
      102801D1
      102801D2
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1700
  static const unsigned int dell_922x_d81_pin_configs[10] = {
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
  	0x02214030, 0x01a19021, 0x01111012, 0x01114010,
  	0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
  	0x01813122, 0x400001f2,
  };
  
  /*
      STAC 922X pin configs for
      102801AC
      102801D0
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1711
  static const unsigned int dell_922x_d82_pin_configs[10] = {
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1712
1713
1714
1715
1716
1717
1718
1719
1720
  	0x02214030, 0x01a19021, 0x01111012, 0x01114010,
  	0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
  	0x01813122, 0x400001f1,
  };
  
  /*
      STAC 922X pin configs for
      102801BF
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1721
  static const unsigned int dell_922x_m81_pin_configs[10] = {
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1722
1723
1724
1725
1726
1727
1728
1729
1730
  	0x0321101f, 0x01112024, 0x01111222, 0x91174220,
  	0x03a11050, 0x01116221, 0x90a70330, 0x01452340, 
  	0x40C003f1, 0x405003f0,
  };
  
  /*
      STAC 9221 A1 pin configs for
      102801D7 (Dell XPS M1210)
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1731
  static const unsigned int dell_922x_m82_pin_configs[10] = {
7f9310c1c   Jiang Zhe   [ALSA] hda-codec ...
1732
1733
  	0x02211211, 0x408103ff, 0x02a1123e, 0x90100310, 
  	0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2, 
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1734
1735
  	0x508003f3, 0x405003f4, 
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1736
  static const unsigned int d945gtp3_pin_configs[10] = {
869264c45   Matt Porter   [ALSA] hda: sigma...
1737
  	0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
403d19446   Matt Porter   [ALSA] hda-codec ...
1738
1739
1740
  	0x40000100, 0x40000100, 0x40000100, 0x40000100,
  	0x02a19120, 0x40000100,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1741
  static const unsigned int d945gtp5_pin_configs[10] = {
869264c45   Matt Porter   [ALSA] hda: sigma...
1742
1743
  	0x0221401f, 0x01011012, 0x01813024, 0x01014010,
  	0x01a19021, 0x01016011, 0x01452130, 0x40000100,
403d19446   Matt Porter   [ALSA] hda-codec ...
1744
1745
  	0x02a19320, 0x40000100,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1746
  static const unsigned int intel_mac_v1_pin_configs[10] = {
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1747
1748
1749
1750
  	0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
  	0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
  	0x400000fc, 0x400000fb,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1751
  static const unsigned int intel_mac_v2_pin_configs[10] = {
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1752
1753
1754
  	0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
  	0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
  	0x400000fc, 0x400000fb,
6f0778d87   Nicolas Boichat   [ALSA] hda-codec ...
1755
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1756
  static const unsigned int intel_mac_v3_pin_configs[10] = {
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1757
1758
  	0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
  	0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
3fc24d850   Takashi Iwai   [ALSA] hda-codec ...
1759
1760
  	0x400000fc, 0x400000fb,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1761
  static const unsigned int intel_mac_v4_pin_configs[10] = {
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1762
1763
  	0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
  	0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
f16928fb5   Sylvain FORET   [ALSA] snd_hda_in...
1764
1765
  	0x400000fc, 0x400000fb,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1766
  static const unsigned int intel_mac_v5_pin_configs[10] = {
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1767
1768
1769
  	0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
  	0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
  	0x400000fc, 0x400000fb,
0dae0f83c   Takashi Iwai   [ALSA] hda-codec ...
1770
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1771
  static const unsigned int ecs202_pin_configs[10] = {
8c6500879   Mauro Carvalho Chehab   ALSA: hda: Add su...
1772
1773
1774
1775
  	0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
  	0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
  	0x9037012e, 0x40e000f2,
  };
76c088287   Takashi Iwai   [ALSA] hda-codec ...
1776

2b63536f0   Takashi Iwai   ALSA: hda - Const...
1777
  static const unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1778
  	[STAC_D945_REF] = ref922x_pin_configs,
19039bd00   Takashi Iwai   [ALSA] Add Intel ...
1779
1780
  	[STAC_D945GTP3] = d945gtp3_pin_configs,
  	[STAC_D945GTP5] = d945gtp5_pin_configs,
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1781
1782
1783
1784
1785
  	[STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
  	[STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
  	[STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
  	[STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
  	[STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
536319afd   Nicolas Boichat   ALSA: Allow to fo...
1786
  	[STAC_INTEL_MAC_AUTO] = intel_mac_v3_pin_configs,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1787
  	/* for backward compatibility */
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1788
1789
1790
1791
1792
1793
  	[STAC_MACMINI] = intel_mac_v3_pin_configs,
  	[STAC_MACBOOK] = intel_mac_v5_pin_configs,
  	[STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
  	[STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
  	[STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
  	[STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
8c6500879   Mauro Carvalho Chehab   ALSA: hda: Add su...
1794
  	[STAC_ECS_202] = ecs202_pin_configs,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1795
1796
1797
1798
  	[STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
  	[STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,	
  	[STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
  	[STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,	
403d19446   Matt Porter   [ALSA] hda-codec ...
1799
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
1800
  static const char * const stac922x_models[STAC_922X_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
1801
  	[STAC_922X_AUTO] = "auto",
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1802
1803
1804
  	[STAC_D945_REF]	= "ref",
  	[STAC_D945GTP5]	= "5stack",
  	[STAC_D945GTP3]	= "3stack",
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
1805
1806
1807
1808
1809
  	[STAC_INTEL_MAC_V1] = "intel-mac-v1",
  	[STAC_INTEL_MAC_V2] = "intel-mac-v2",
  	[STAC_INTEL_MAC_V3] = "intel-mac-v3",
  	[STAC_INTEL_MAC_V4] = "intel-mac-v4",
  	[STAC_INTEL_MAC_V5] = "intel-mac-v5",
536319afd   Nicolas Boichat   ALSA: Allow to fo...
1810
  	[STAC_INTEL_MAC_AUTO] = "intel-mac-auto",
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1811
  	/* for backward compatibility */
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1812
  	[STAC_MACMINI]	= "macmini",
3fc24d850   Takashi Iwai   [ALSA] hda-codec ...
1813
  	[STAC_MACBOOK]	= "macbook",
6f0778d87   Nicolas Boichat   [ALSA] hda-codec ...
1814
1815
  	[STAC_MACBOOK_PRO_V1]	= "macbook-pro-v1",
  	[STAC_MACBOOK_PRO_V2]	= "macbook-pro",
f16928fb5   Sylvain FORET   [ALSA] snd_hda_in...
1816
  	[STAC_IMAC_INTEL] = "imac-intel",
0dae0f83c   Takashi Iwai   [ALSA] hda-codec ...
1817
  	[STAC_IMAC_INTEL_20] = "imac-intel-20",
8c6500879   Mauro Carvalho Chehab   ALSA: hda: Add su...
1818
  	[STAC_ECS_202] = "ecs202",
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1819
1820
1821
1822
  	[STAC_922X_DELL_D81] = "dell-d81",
  	[STAC_922X_DELL_D82] = "dell-d82",
  	[STAC_922X_DELL_M81] = "dell-m81",
  	[STAC_922X_DELL_M82] = "dell-m82",
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1823
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1824
  static const struct snd_pci_quirk stac922x_cfg_tbl[] = {
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1825
1826
1827
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
  		      "DFI LanParty", STAC_D945_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
1828
1829
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
  		      "DFI LanParty", STAC_D945_REF),
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
  	/* Intel 945G based systems */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
  		      "Intel D945G", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
  		      "Intel D945G", STAC_D945GTP3),
  	/* Intel D945G 5-stack systems */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
  		      "Intel D945G", STAC_D945GTP5),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
  		      "Intel D945G", STAC_D945GTP5),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
  		      "Intel D945G", STAC_D945GTP5),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
  		      "Intel D945G", STAC_D945GTP5),
  	/* Intel 945P based systems */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
  		      "Intel D945P", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
  		      "Intel D945P", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
  		      "Intel D945P", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
  		      "Intel D945P", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
  		      "Intel D945P", STAC_D945GTP3),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
  		      "Intel D945P", STAC_D945GTP5),
8056d47e7   Takashi Iwai   ALSA: hda - Add m...
1883
1884
1885
  	/* other intel */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204,
  		      "Intel D945", STAC_D945_REF),
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1886
  	/* other systems  */
536319afd   Nicolas Boichat   ALSA: Allow to fo...
1887
  	/* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1888
  	SND_PCI_QUIRK(0x8384, 0x7680,
536319afd   Nicolas Boichat   ALSA: Allow to fo...
1889
  		      "Mac", STAC_INTEL_MAC_AUTO),
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
  	/* Dell systems  */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
  		      "unknown Dell", STAC_922X_DELL_D81),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
  		      "unknown Dell", STAC_922X_DELL_D81),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
  		      "unknown Dell", STAC_922X_DELL_D81),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
  		      "unknown Dell", STAC_922X_DELL_D82),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
  		      "unknown Dell", STAC_922X_DELL_M81),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
  		      "unknown Dell", STAC_922X_DELL_D82),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
  		      "unknown Dell", STAC_922X_DELL_D81),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
  		      "unknown Dell", STAC_922X_DELL_D81),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
  		      "Dell XPS M1210", STAC_922X_DELL_M82),
8c6500879   Mauro Carvalho Chehab   ALSA: hda: Add su...
1909
  	/* ECS/PC Chips boards */
dea0a5095   Takashi Iwai   ALSA: hda - Clean...
1910
  	SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000,
8663ae55f   Herton Ronaldo Krzesinski   ALSA: hda - Bind ...
1911
  		      "ECS/PC chips", STAC_ECS_202),
403d19446   Matt Porter   [ALSA] hda-codec ...
1912
1913
  	{} /* terminator */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1914
  static const unsigned int ref927x_pin_configs[14] = {
93ed15037   Tobin Davis   [ALSA] hda-codec ...
1915
1916
1917
1918
  	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
  	0x01a19040, 0x01011012, 0x01016011, 0x0101201f, 
  	0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
  	0x01c42190, 0x40000100,
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
1919
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1920
  static const unsigned int d965_3st_pin_configs[14] = {
81d3dbde7   Tobin Davis   [ALSA] hda-codec ...
1921
1922
1923
1924
1925
  	0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
  	0x01a19021, 0x01813024, 0x40000100, 0x40000100,
  	0x40000100, 0x40000100, 0x40000100, 0x40000100,
  	0x40000100, 0x40000100
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1926
  static const unsigned int d965_5st_pin_configs[14] = {
93ed15037   Tobin Davis   [ALSA] hda-codec ...
1927
1928
1929
1930
1931
  	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
  	0x01a19040, 0x01011012, 0x01016011, 0x40000100,
  	0x40000100, 0x40000100, 0x40000100, 0x01442070,
  	0x40000100, 0x40000100
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1932
  static const unsigned int d965_5st_no_fp_pin_configs[14] = {
679d92ed1   Takashi Iwai   ALSA: hda - Add 5...
1933
1934
1935
1936
1937
  	0x40000100, 0x40000100, 0x0181304e, 0x01014010,
  	0x01a19040, 0x01011012, 0x01016011, 0x40000100,
  	0x40000100, 0x40000100, 0x40000100, 0x01442070,
  	0x40000100, 0x40000100
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1938
  static const unsigned int dell_3st_pin_configs[14] = {
4ff076e5d   Tobin Davis   [ALSA] hda-codec ...
1939
1940
  	0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
  	0x01111212, 0x01116211, 0x01813050, 0x01112214,
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1941
  	0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
4ff076e5d   Tobin Davis   [ALSA] hda-codec ...
1942
1943
  	0x40c003fc, 0x40000100
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1944
  static const unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
e28d83223   Takashi Iwai   ALSA: hda - Fix s...
1945
  	[STAC_D965_REF_NO_JD] = ref927x_pin_configs,
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1946
1947
1948
  	[STAC_D965_REF]  = ref927x_pin_configs,
  	[STAC_D965_3ST]  = d965_3st_pin_configs,
  	[STAC_D965_5ST]  = d965_5st_pin_configs,
679d92ed1   Takashi Iwai   ALSA: hda - Add 5...
1949
  	[STAC_D965_5ST_NO_FP]  = d965_5st_no_fp_pin_configs,
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1950
1951
  	[STAC_DELL_3ST]  = dell_3st_pin_configs,
  	[STAC_DELL_BIOS] = NULL,
54930531a   Takashi Iwai   ALSA: hda - Fix m...
1952
  	[STAC_927X_VOLKNOB] = NULL,
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
1953
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
1954
  static const char * const stac927x_models[STAC_927X_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
1955
  	[STAC_927X_AUTO]	= "auto",
e28d83223   Takashi Iwai   ALSA: hda - Fix s...
1956
  	[STAC_D965_REF_NO_JD]	= "ref-no-jd",
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1957
1958
1959
  	[STAC_D965_REF]		= "ref",
  	[STAC_D965_3ST]		= "3stack",
  	[STAC_D965_5ST]		= "5stack",
679d92ed1   Takashi Iwai   ALSA: hda - Add 5...
1960
  	[STAC_D965_5ST_NO_FP]	= "5stack-no-fp",
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1961
1962
  	[STAC_DELL_3ST]		= "dell-3stack",
  	[STAC_DELL_BIOS]	= "dell-bios",
54930531a   Takashi Iwai   ALSA: hda - Fix m...
1963
  	[STAC_927X_VOLKNOB]	= "volknob",
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1964
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
1965
  static const struct snd_pci_quirk stac927x_cfg_tbl[] = {
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1966
1967
1968
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
  		      "DFI LanParty", STAC_D965_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
1969
1970
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
  		      "DFI LanParty", STAC_D965_REF),
81d3dbde7   Tobin Davis   [ALSA] hda-codec ...
1971
  	 /* Intel 946 based systems */
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
1972
1973
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
93ed15037   Tobin Davis   [ALSA] hda-codec ...
1974
  	/* 965 based 3 stack systems */
dea0a5095   Takashi Iwai   ALSA: hda - Clean...
1975
1976
1977
1978
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100,
  			   "Intel D965", STAC_D965_3ST),
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000,
  			   "Intel D965", STAC_D965_3ST),
4ff076e5d   Tobin Davis   [ALSA] hda-codec ...
1979
  	/* Dell 3 stack systems */
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
1980
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
4ff076e5d   Tobin Davis   [ALSA] hda-codec ...
1981
1982
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01ed, "Dell     ", STAC_DELL_3ST),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f4, "Dell     ", STAC_DELL_3ST),
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1983
  	/* Dell 3 stack systems with verb table in BIOS */
2f32d909f   Matthew Ranostay   [ALSA] hda: STAC9...
1984
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
66668b6fb   Daniel T Chen   ALSA: hda: Fix mo...
1985
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f7, "Dell XPS M1730", STAC_DELL_BIOS),
2f32d909f   Matthew Ranostay   [ALSA] hda: STAC9...
1986
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0227, "Dell Vostro 1400  ", STAC_DELL_BIOS),
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1987
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022e, "Dell     ", STAC_DELL_BIOS),
84d3dc200   Chengu Wang   ALSA: hda: Correc...
1988
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS),
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
1989
1990
1991
1992
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0242, "Dell     ", STAC_DELL_BIOS),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0243, "Dell     ", STAC_DELL_BIOS),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x02ff, "Dell     ", STAC_DELL_BIOS),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
93ed15037   Tobin Davis   [ALSA] hda-codec ...
1993
  	/* 965 based 5 stack systems */
dea0a5095   Takashi Iwai   ALSA: hda - Clean...
1994
1995
1996
1997
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300,
  			   "Intel D965", STAC_D965_5ST),
  	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
  			   "Intel D965", STAC_D965_5ST),
54930531a   Takashi Iwai   ALSA: hda - Fix m...
1998
1999
  	/* volume-knob fixes */
  	SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB),
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
2000
2001
  	{} /* terminator */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2002
  static const unsigned int ref9205_pin_configs[12] = {
f3302a59c   Matt Porter   [ALSA] hda: sigma...
2003
  	0x40000100, 0x40000100, 0x01016011, 0x01014010,
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
2004
  	0x01813122, 0x01a19021, 0x01019020, 0x40000100,
8b65727bf   Matt Porter   [ALSA] hda: add d...
2005
  	0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
f3302a59c   Matt Porter   [ALSA] hda: sigma...
2006
  };
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2007
2008
2009
2010
2011
2012
2013
2014
  /*
      STAC 9205 pin configs for
      102801F1
      102801F2
      102801FC
      102801FD
      10280204
      1028021F
3fa2ef746   Matthew Ranostay   [ALSA] hda: Add n...
2015
      10280228 (Dell Vostro 1500)
95e70e875   Anisse Astier   ALSA: hda - Add S...
2016
      10280229 (Dell Vostro 1700)
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2017
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2018
  static const unsigned int dell_9205_m42_pin_configs[12] = {
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
  	0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
  	0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
  	0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
  };
  
  /*
      STAC 9205 pin configs for
      102801F9
      102801FA
      102801FE
      102801FF (Dell Precision M4300)
      10280206
      10280200
      10280201
  */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2034
  static const unsigned int dell_9205_m43_pin_configs[12] = {
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2035
2036
2037
2038
  	0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
  	0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
  	0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2039
  static const unsigned int dell_9205_m44_pin_configs[12] = {
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2040
2041
2042
2043
  	0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
  	0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
  	0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2044
  static const unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2045
  	[STAC_9205_REF] = ref9205_pin_configs,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2046
2047
2048
  	[STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
  	[STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
  	[STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
d9a4268ee   Takashi Iwai   ALSA: hda - Add q...
2049
  	[STAC_9205_EAPD] = NULL,
f3302a59c   Matt Porter   [ALSA] hda: sigma...
2050
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
2051
  static const char * const stac9205_models[STAC_9205_MODELS] = {
1607b8ea0   Takashi Iwai   ALSA: hda - Add m...
2052
  	[STAC_9205_AUTO] = "auto",
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
2053
  	[STAC_9205_REF] = "ref",
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2054
  	[STAC_9205_DELL_M42] = "dell-m42",
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2055
2056
  	[STAC_9205_DELL_M43] = "dell-m43",
  	[STAC_9205_DELL_M44] = "dell-m44",
d9a4268ee   Takashi Iwai   ALSA: hda - Add q...
2057
  	[STAC_9205_EAPD] = "eapd",
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
2058
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2059
  static const struct snd_pci_quirk stac9205_cfg_tbl[] = {
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
2060
2061
2062
  	/* SigmaTel reference board */
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
  		      "DFI LanParty", STAC_9205_REF),
02358fcfa   Herton Ronaldo Krzesinski   ALSA: hda - move ...
2063
2064
  	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
  		      "SigmaTel", STAC_9205_REF),
577aa2c19   Matthew Ranostay   ALSA: hda: add re...
2065
2066
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
  		      "DFI LanParty", STAC_9205_REF),
d9a4268ee   Takashi Iwai   ALSA: hda - Add q...
2067
  	/* Dell */
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2068
2069
2070
2071
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
  		      "unknown Dell", STAC_9205_DELL_M42),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
  		      "unknown Dell", STAC_9205_DELL_M42),
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2072
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
b44ef2f15   Matthew Ranostay   [ALSA] hda: More ...
2073
  		      "Dell Precision", STAC_9205_DELL_M43),
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2074
2075
2076
2077
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
  		      "Dell Precision", STAC_9205_DELL_M43),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
  		      "Dell Precision", STAC_9205_DELL_M43),
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2078
2079
2080
2081
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
  		      "unknown Dell", STAC_9205_DELL_M42),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
  		      "unknown Dell", STAC_9205_DELL_M42),
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2082
2083
2084
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
  		      "Dell Precision", STAC_9205_DELL_M43),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2085
  		      "Dell Precision M4300", STAC_9205_DELL_M43),
dfe495d0a   Takashi Iwai   [ALSA] hda-codec ...
2086
2087
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
  		      "unknown Dell", STAC_9205_DELL_M42),
4549915cd   Takashi Iwai   ALSA: hda - Fix s...
2088
2089
2090
2091
2092
2093
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
  		      "Dell Precision", STAC_9205_DELL_M43),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
  		      "Dell Precision", STAC_9205_DELL_M43),
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
  		      "Dell Precision", STAC_9205_DELL_M43),
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
2094
2095
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
  		      "Dell Inspiron", STAC_9205_DELL_M44),
3fa2ef746   Matthew Ranostay   [ALSA] hda: Add n...
2096
2097
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
  		      "Dell Vostro 1500", STAC_9205_DELL_M42),
95e70e875   Anisse Astier   ALSA: hda - Add S...
2098
2099
  	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0229,
  		      "Dell Vostro 1700", STAC_9205_DELL_M42),
d9a4268ee   Takashi Iwai   ALSA: hda - Add q...
2100
  	/* Gateway */
42b95f0c6   Hao Song   ALSA: hda - Add q...
2101
  	SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD),
d9a4268ee   Takashi Iwai   ALSA: hda - Add q...
2102
  	SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
f3302a59c   Matt Porter   [ALSA] hda: sigma...
2103
2104
  	{} /* terminator */
  };
330ee9957   Takashi Iwai   ALSA: hda - Remov...
2105
  static void stac92xx_set_config_regs(struct hda_codec *codec,
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2106
  				     const unsigned int *pincfgs)
11b44bbde   Richard Fish   [ALSA] hda-codec ...
2107
2108
2109
  {
  	int i;
  	struct sigmatel_spec *spec = codec->spec;
11b44bbde   Richard Fish   [ALSA] hda-codec ...
2110

330ee9957   Takashi Iwai   ALSA: hda - Remov...
2111
2112
  	if (!pincfgs)
  		return;
11b44bbde   Richard Fish   [ALSA] hda-codec ...
2113

87d483630   Matthew Ranostay   [ALSA] hda: Enabl...
2114
  	for (i = 0; i < spec->num_pins; i++)
330ee9957   Takashi Iwai   ALSA: hda - Remov...
2115
2116
2117
  		if (spec->pin_nids[i] && pincfgs[i])
  			snd_hda_codec_set_pincfg(codec, spec->pin_nids[i],
  						 pincfgs[i]);
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
2118
  }
dabbed6f7   Matt   [ALSA] SigmaTel H...
2119
  /*
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2120
   * Analog playback callbacks
dabbed6f7   Matt   [ALSA] SigmaTel H...
2121
   */
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2122
2123
  static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
  				      struct hda_codec *codec,
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2124
  				      struct snd_pcm_substream *substream)
2f2f4251c   Matt   [ALSA] add sigmat...
2125
  {
dabbed6f7   Matt   [ALSA] SigmaTel H...
2126
  	struct sigmatel_spec *spec = codec->spec;
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
2127
2128
  	if (spec->stream_delay)
  		msleep(spec->stream_delay);
9a08160bd   Takashi Iwai   [ALSA] hda-codec ...
2129
2130
  	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
  					     hinfo);
2f2f4251c   Matt   [ALSA] add sigmat...
2131
  }
2f2f4251c   Matt   [ALSA] add sigmat...
2132
2133
2134
2135
  static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
  					 struct hda_codec *codec,
  					 unsigned int stream_tag,
  					 unsigned int format,
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2136
  					 struct snd_pcm_substream *substream)
2f2f4251c   Matt   [ALSA] add sigmat...
2137
2138
  {
  	struct sigmatel_spec *spec = codec->spec;
403d19446   Matt Porter   [ALSA] hda-codec ...
2139
  	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
2f2f4251c   Matt   [ALSA] add sigmat...
2140
2141
2142
2143
  }
  
  static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
  					struct hda_codec *codec,
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2144
  					struct snd_pcm_substream *substream)
2f2f4251c   Matt   [ALSA] add sigmat...
2145
2146
2147
2148
2149
2150
  {
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
  }
  
  /*
dabbed6f7   Matt   [ALSA] SigmaTel H...
2151
2152
2153
2154
   * Digital playback callbacks
   */
  static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
  					  struct hda_codec *codec,
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2155
  					  struct snd_pcm_substream *substream)
dabbed6f7   Matt   [ALSA] SigmaTel H...
2156
2157
2158
2159
2160
2161
2162
  {
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
  }
  
  static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
  					   struct hda_codec *codec,
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2163
  					   struct snd_pcm_substream *substream)
dabbed6f7   Matt   [ALSA] SigmaTel H...
2164
2165
2166
2167
  {
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
  }
6b97eb45f   Takashi Iwai   [ALSA] hda-codec ...
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
  static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
  					 struct hda_codec *codec,
  					 unsigned int stream_tag,
  					 unsigned int format,
  					 struct snd_pcm_substream *substream)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
  					     stream_tag, format, substream);
  }
9411e21cd   Takashi Iwai   ALSA: hda - Add s...
2178
2179
2180
2181
2182
2183
2184
  static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
  					struct hda_codec *codec,
  					struct snd_pcm_substream *substream)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
  }
dabbed6f7   Matt   [ALSA] SigmaTel H...
2185
2186
  
  /*
2f2f4251c   Matt   [ALSA] add sigmat...
2187
2188
2189
2190
2191
2192
   * Analog capture callbacks
   */
  static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
  					struct hda_codec *codec,
  					unsigned int stream_tag,
  					unsigned int format,
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2193
  					struct snd_pcm_substream *substream)
2f2f4251c   Matt   [ALSA] add sigmat...
2194
2195
  {
  	struct sigmatel_spec *spec = codec->spec;
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
2196
  	hda_nid_t nid = spec->adc_nids[substream->number];
2f2f4251c   Matt   [ALSA] add sigmat...
2197

8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
2198
2199
  	if (spec->powerdown_adcs) {
  		msleep(40);
8c2f767bf   Takashi Iwai   ALSA: hda - Remov...
2200
  		snd_hda_codec_write(codec, nid, 0,
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
2201
2202
2203
  			AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
  	}
  	snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
2f2f4251c   Matt   [ALSA] add sigmat...
2204
2205
2206
2207
2208
  	return 0;
  }
  
  static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
  					struct hda_codec *codec,
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2209
  					struct snd_pcm_substream *substream)
2f2f4251c   Matt   [ALSA] add sigmat...
2210
2211
  {
  	struct sigmatel_spec *spec = codec->spec;
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
2212
  	hda_nid_t nid = spec->adc_nids[substream->number];
2f2f4251c   Matt   [ALSA] add sigmat...
2213

8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
2214
2215
  	snd_hda_codec_cleanup_stream(codec, nid);
  	if (spec->powerdown_adcs)
8c2f767bf   Takashi Iwai   ALSA: hda - Remov...
2216
  		snd_hda_codec_write(codec, nid, 0,
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
2217
  			AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2f2f4251c   Matt   [ALSA] add sigmat...
2218
2219
  	return 0;
  }
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2220
  static const struct hda_pcm_stream stac92xx_pcm_digital_playback = {
dabbed6f7   Matt   [ALSA] SigmaTel H...
2221
2222
2223
2224
2225
2226
  	.substreams = 1,
  	.channels_min = 2,
  	.channels_max = 2,
  	/* NID is set in stac92xx_build_pcms */
  	.ops = {
  		.open = stac92xx_dig_playback_pcm_open,
6b97eb45f   Takashi Iwai   [ALSA] hda-codec ...
2227
  		.close = stac92xx_dig_playback_pcm_close,
9411e21cd   Takashi Iwai   ALSA: hda - Add s...
2228
2229
  		.prepare = stac92xx_dig_playback_pcm_prepare,
  		.cleanup = stac92xx_dig_playback_pcm_cleanup
dabbed6f7   Matt   [ALSA] SigmaTel H...
2230
2231
  	},
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2232
  static const struct hda_pcm_stream stac92xx_pcm_digital_capture = {
dabbed6f7   Matt   [ALSA] SigmaTel H...
2233
2234
2235
2236
2237
  	.substreams = 1,
  	.channels_min = 2,
  	.channels_max = 2,
  	/* NID is set in stac92xx_build_pcms */
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2238
  static const struct hda_pcm_stream stac92xx_pcm_analog_playback = {
2f2f4251c   Matt   [ALSA] add sigmat...
2239
2240
  	.substreams = 1,
  	.channels_min = 2,
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2241
  	.channels_max = 8,
2f2f4251c   Matt   [ALSA] add sigmat...
2242
2243
2244
2245
2246
2247
2248
  	.nid = 0x02, /* NID to query formats and rates */
  	.ops = {
  		.open = stac92xx_playback_pcm_open,
  		.prepare = stac92xx_playback_pcm_prepare,
  		.cleanup = stac92xx_playback_pcm_cleanup
  	},
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2249
  static const struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
  	.substreams = 1,
  	.channels_min = 2,
  	.channels_max = 2,
  	.nid = 0x06, /* NID to query formats and rates */
  	.ops = {
  		.open = stac92xx_playback_pcm_open,
  		.prepare = stac92xx_playback_pcm_prepare,
  		.cleanup = stac92xx_playback_pcm_cleanup
  	},
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2260
  static const struct hda_pcm_stream stac92xx_pcm_analog_capture = {
2f2f4251c   Matt   [ALSA] add sigmat...
2261
2262
  	.channels_min = 2,
  	.channels_max = 2,
9e05b7a3d   Maxim Levitsky   [ALSA] hda-codec ...
2263
  	/* NID + .substreams is set in stac92xx_build_pcms */
2f2f4251c   Matt   [ALSA] add sigmat...
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
  	.ops = {
  		.prepare = stac92xx_capture_pcm_prepare,
  		.cleanup = stac92xx_capture_pcm_cleanup
  	},
  };
  
  static int stac92xx_build_pcms(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct hda_pcm *info = spec->pcm_rec;
  
  	codec->num_pcms = 1;
  	codec->pcm_info = info;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2277
  	info->name = "STAC92xx Analog";
2f2f4251c   Matt   [ALSA] add sigmat...
2278
  	info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
00a602db1   Takashi Iwai   ALSA: hda - Fix P...
2279
2280
  	info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
  		spec->multiout.dac_nids[0];
2f2f4251c   Matt   [ALSA] add sigmat...
2281
  	info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
2282
  	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
9e05b7a3d   Maxim Levitsky   [ALSA] hda-codec ...
2283
  	info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
2284
2285
2286
2287
2288
2289
2290
  
  	if (spec->alt_switch) {
  		codec->num_pcms++;
  		info++;
  		info->name = "STAC92xx Analog Alt";
  		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
  	}
2f2f4251c   Matt   [ALSA] add sigmat...
2291

dabbed6f7   Matt   [ALSA] SigmaTel H...
2292
2293
2294
2295
  	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
  		codec->num_pcms++;
  		info++;
  		info->name = "STAC92xx Digital";
0852d7a65   Takashi Iwai   ALSA: hda - Detec...
2296
  		info->pcm_type = spec->autocfg.dig_out_type[0];
dabbed6f7   Matt   [ALSA] SigmaTel H...
2297
2298
2299
2300
2301
2302
2303
2304
2305
  		if (spec->multiout.dig_out_nid) {
  			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
  			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
  		}
  		if (spec->dig_in_nid) {
  			info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
  			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
  		}
  	}
2f2f4251c   Matt   [ALSA] add sigmat...
2306
2307
  	return 0;
  }
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2308
2309
  static unsigned int stac92xx_get_default_vref(struct hda_codec *codec,
  					hda_nid_t nid)
c960a03be   Takashi Iwai   [ALSA] hda-codec ...
2310
  {
1327a32b8   Takashi Iwai   ALSA: hda - Cache...
2311
  	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
c960a03be   Takashi Iwai   [ALSA] hda-codec ...
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
  	pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
  	if (pincap & AC_PINCAP_VREF_100)
  		return AC_PINCTL_VREF_100;
  	if (pincap & AC_PINCAP_VREF_80)
  		return AC_PINCTL_VREF_80;
  	if (pincap & AC_PINCAP_VREF_50)
  		return AC_PINCTL_VREF_50;
  	if (pincap & AC_PINCAP_VREF_GRD)
  		return AC_PINCTL_VREF_GRD;
  	return 0;
  }
403d19446   Matt Porter   [ALSA] hda-codec ...
2323
2324
2325
  static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
  
  {
82beb8fd3   Takashi Iwai   [ALSA] hda-codec ...
2326
2327
  	snd_hda_codec_write_cache(codec, nid, 0,
  				  AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
403d19446   Matt Porter   [ALSA] hda-codec ...
2328
  }
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2329
2330
2331
2332
2333
2334
2335
  #define stac92xx_hp_switch_info		snd_ctl_boolean_mono_info
  
  static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
  			struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
2336
  	ucontrol->value.integer.value[0] = !!spec->hp_switch;
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2337
2338
  	return 0;
  }
62558ce15   Takashi Iwai   ALSA: hda - Avoid...
2339
  static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid);
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
2340

7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2341
2342
2343
2344
2345
  static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
  			struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
2346
2347
2348
  	int nid = kcontrol->private_value;
   
  	spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2349

25985edce   Lucas De Marchi   Fix common misspe...
2350
  	/* check to be sure that the ports are up to date with
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2351
2352
  	 * switch changes
  	 */
62558ce15   Takashi Iwai   ALSA: hda - Avoid...
2353
  	stac_issue_unsol_event(codec, nid);
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2354
2355
2356
  
  	return 1;
  }
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2357
2358
2359
2360
  static int stac92xx_dc_bias_info(struct snd_kcontrol *kcontrol,
  				struct snd_ctl_elem_info *uinfo)
  {
  	int i;
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2361
  	static const char * const texts[] = {
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
  		"Mic In", "Line In", "Line Out"
  	};
  
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	hda_nid_t nid = kcontrol->private_value;
  
  	if (nid == spec->mic_switch || nid == spec->line_switch)
  		i = 3;
  	else
  		i = 2;
  
  	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  	uinfo->value.enumerated.items = i;
  	uinfo->count = 1;
  	if (uinfo->value.enumerated.item >= i)
  		uinfo->value.enumerated.item = i-1;
  	strcpy(uinfo->value.enumerated.name,
  		texts[uinfo->value.enumerated.item]);
  
  	return 0;
  }
  
  static int stac92xx_dc_bias_get(struct snd_kcontrol *kcontrol,
  				struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	hda_nid_t nid = kcontrol->private_value;
  	unsigned int vref = stac92xx_vref_get(codec, nid);
  
  	if (vref == stac92xx_get_default_vref(codec, nid))
  		ucontrol->value.enumerated.item[0] = 0;
  	else if (vref == AC_PINCTL_VREF_GRD)
  		ucontrol->value.enumerated.item[0] = 1;
  	else if (vref == AC_PINCTL_VREF_HIZ)
  		ucontrol->value.enumerated.item[0] = 2;
  
  	return 0;
  }
  
  static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol,
  				struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	unsigned int new_vref = 0;
b8621516c   Takashi Iwai   ALSA: hda - Fix u...
2407
  	int error;
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
  	hda_nid_t nid = kcontrol->private_value;
  
  	if (ucontrol->value.enumerated.item[0] == 0)
  		new_vref = stac92xx_get_default_vref(codec, nid);
  	else if (ucontrol->value.enumerated.item[0] == 1)
  		new_vref = AC_PINCTL_VREF_GRD;
  	else if (ucontrol->value.enumerated.item[0] == 2)
  		new_vref = AC_PINCTL_VREF_HIZ;
  	else
  		return 0;
  
  	if (new_vref != stac92xx_vref_get(codec, nid)) {
  		error = stac92xx_vref_set(codec, nid, new_vref);
  		return error;
  	}
  
  	return 0;
  }
  
  static int stac92xx_io_switch_info(struct snd_kcontrol *kcontrol,
  				struct snd_ctl_elem_info *uinfo)
  {
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2430
  	char *texts[2];
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  
  	if (kcontrol->private_value == spec->line_switch)
  		texts[0] = "Line In";
  	else
  		texts[0] = "Mic In";
  	texts[1] = "Line Out";
  	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  	uinfo->value.enumerated.items = 2;
  	uinfo->count = 1;
  
  	if (uinfo->value.enumerated.item >= 2)
  		uinfo->value.enumerated.item = 1;
  	strcpy(uinfo->value.enumerated.name,
  		texts[uinfo->value.enumerated.item]);
  
  	return 0;
  }
403d19446   Matt Porter   [ALSA] hda-codec ...
2450
2451
2452
2453
2454
  
  static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2455
2456
  	hda_nid_t nid = kcontrol->private_value;
  	int io_idx = (nid == spec->mic_switch) ? 1 : 0;
403d19446   Matt Porter   [ALSA] hda-codec ...
2457

7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2458
  	ucontrol->value.enumerated.item[0] = spec->io_switch[io_idx];
403d19446   Matt Porter   [ALSA] hda-codec ...
2459
2460
2461
2462
2463
2464
2465
  	return 0;
  }
  
  static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
  {
          struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2466
2467
2468
  	hda_nid_t nid = kcontrol->private_value;
  	int io_idx = (nid == spec->mic_switch) ? 1 : 0;
  	unsigned short val = !!ucontrol->value.enumerated.item[0];
403d19446   Matt Porter   [ALSA] hda-codec ...
2469
2470
2471
2472
2473
  
  	spec->io_switch[io_idx] = val;
  
  	if (val)
  		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
c960a03be   Takashi Iwai   [ALSA] hda-codec ...
2474
2475
2476
  	else {
  		unsigned int pinctl = AC_PINCTL_IN_EN;
  		if (io_idx) /* set VREF for mic */
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2477
  			pinctl |= stac92xx_get_default_vref(codec, nid);
c960a03be   Takashi Iwai   [ALSA] hda-codec ...
2478
2479
  		stac92xx_auto_set_pinctl(codec, nid, pinctl);
  	}
40c1d3087   Jiang Zhe   [ALSA] hda-codec ...
2480
2481
2482
2483
2484
  
  	/* check the auto-mute again: we need to mute/unmute the speaker
  	 * appropriately according to the pin direction
  	 */
  	if (spec->hp_detect)
62558ce15   Takashi Iwai   ALSA: hda - Avoid...
2485
  		stac_issue_unsol_event(codec, nid);
40c1d3087   Jiang Zhe   [ALSA] hda-codec ...
2486

403d19446   Matt Porter   [ALSA] hda-codec ...
2487
2488
          return 1;
  }
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
  #define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
  
  static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
  		struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  
  	ucontrol->value.integer.value[0] = spec->clfe_swap;
  	return 0;
  }
  
  static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
  		struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	hda_nid_t nid = kcontrol->private_value & 0xff;
68ea7b2f2   Takashi Iwai   [ALSA] hda-codec ...
2507
  	unsigned int val = !!ucontrol->value.integer.value[0];
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2508

68ea7b2f2   Takashi Iwai   [ALSA] hda-codec ...
2509
  	if (spec->clfe_swap == val)
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2510
  		return 0;
68ea7b2f2   Takashi Iwai   [ALSA] hda-codec ...
2511
  	spec->clfe_swap = val;
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2512
2513
2514
2515
2516
2517
  
  	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
  		spec->clfe_swap ? 0x4 : 0x0);
  
  	return 1;
  }
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2518
2519
2520
2521
2522
2523
2524
2525
  #define STAC_CODEC_HP_SWITCH(xname) \
  	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  	  .name = xname, \
  	  .index = 0, \
  	  .info = stac92xx_hp_switch_info, \
  	  .get = stac92xx_hp_switch_get, \
  	  .put = stac92xx_hp_switch_put, \
  	}
403d19446   Matt Porter   [ALSA] hda-codec ...
2526
2527
2528
2529
2530
2531
2532
2533
2534
  #define STAC_CODEC_IO_SWITCH(xname, xpval) \
  	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  	  .name = xname, \
  	  .index = 0, \
            .info = stac92xx_io_switch_info, \
            .get = stac92xx_io_switch_get, \
            .put = stac92xx_io_switch_put, \
            .private_value = xpval, \
  	}
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2535
2536
2537
2538
2539
2540
2541
2542
2543
  #define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
  	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
  	  .name = xname, \
  	  .index = 0, \
  	  .info = stac92xx_clfe_switch_info, \
  	  .get = stac92xx_clfe_switch_get, \
  	  .put = stac92xx_clfe_switch_put, \
  	  .private_value = xpval, \
  	}
403d19446   Matt Porter   [ALSA] hda-codec ...
2544

c7d4b2fa3   Matt   [ALSA] hda-codec ...
2545
2546
2547
  enum {
  	STAC_CTL_WIDGET_VOL,
  	STAC_CTL_WIDGET_MUTE,
123c07aed   Jaroslav Kysela   ALSA: hda_intel: ...
2548
  	STAC_CTL_WIDGET_MUTE_BEEP,
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
2549
  	STAC_CTL_WIDGET_MONO_MUX,
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2550
  	STAC_CTL_WIDGET_HP_SWITCH,
403d19446   Matt Porter   [ALSA] hda-codec ...
2551
  	STAC_CTL_WIDGET_IO_SWITCH,
2fc998907   Nickolas Lloyd   ALSA: hda - add c...
2552
2553
  	STAC_CTL_WIDGET_CLFE_SWITCH,
  	STAC_CTL_WIDGET_DC_BIAS
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2554
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2555
  static const struct snd_kcontrol_new stac92xx_control_templates[] = {
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2556
2557
  	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
  	HDA_CODEC_MUTE(NULL, 0, 0, 0),
123c07aed   Jaroslav Kysela   ALSA: hda_intel: ...
2558
  	HDA_CODEC_MUTE_BEEP(NULL, 0, 0, 0),
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
2559
  	STAC_MONO_MUX,
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
2560
  	STAC_CODEC_HP_SWITCH(NULL),
403d19446   Matt Porter   [ALSA] hda-codec ...
2561
  	STAC_CODEC_IO_SWITCH(NULL, 0),
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2562
  	STAC_CODEC_CLFE_SWITCH(NULL, 0),
2fc998907   Nickolas Lloyd   ALSA: hda - add c...
2563
  	DC_BIAS(NULL, 0, 0),
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2564
2565
2566
  };
  
  /* add dynamic controls */
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2567
2568
  static struct snd_kcontrol_new *
  stac_control_new(struct sigmatel_spec *spec,
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2569
  		 const struct snd_kcontrol_new *ktemp,
4d02d1b63   Jaroslav Kysela   ALSA: hda - proc ...
2570
  		 const char *name,
5e26dfd06   Jaroslav Kysela   ALSA: hda - simpl...
2571
  		 unsigned int subdev)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2572
  {
c8b6bf9b5   Takashi Iwai   [ALSA] Remove xxx...
2573
  	struct snd_kcontrol_new *knew;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2574

603c40199   Takashi Iwai   ALSA: hda - Use g...
2575
2576
2577
  	snd_array_init(&spec->kctls, sizeof(*knew), 32);
  	knew = snd_array_new(&spec->kctls);
  	if (!knew)
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2578
  		return NULL;
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
2579
  	*knew = *ktemp;
82fe0c580   Takashi Iwai   [ALSA] Use kstrdup
2580
  	knew->name = kstrdup(name, GFP_KERNEL);
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2581
2582
2583
2584
2585
2586
  	if (!knew->name) {
  		/* roolback */
  		memset(knew, 0, sizeof(*knew));
  		spec->kctls.alloced--;
  		return NULL;
  	}
5e26dfd06   Jaroslav Kysela   ALSA: hda - simpl...
2587
  	knew->subdevice = subdev;
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2588
2589
2590
2591
  	return knew;
  }
  
  static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2592
  				     const struct snd_kcontrol_new *ktemp,
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2593
2594
2595
  				     int idx, const char *name,
  				     unsigned long val)
  {
4d02d1b63   Jaroslav Kysela   ALSA: hda - proc ...
2596
  	struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name,
5e26dfd06   Jaroslav Kysela   ALSA: hda - simpl...
2597
  							 HDA_SUBDEV_AMP_FLAG);
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2598
  	if (!knew)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2599
  		return -ENOMEM;
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2600
  	knew->index = idx;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2601
  	knew->private_value = val;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2602
2603
  	return 0;
  }
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
2604
2605
2606
2607
2608
2609
2610
2611
  static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec,
  					   int type, int idx, const char *name,
  					   unsigned long val)
  {
  	return stac92xx_add_control_temp(spec,
  					 &stac92xx_control_templates[type],
  					 idx, name, val);
  }
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
2612
2613
  
  /* add dynamic controls */
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
2614
2615
  static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type,
  				       const char *name, unsigned long val)
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
2616
2617
2618
  {
  	return stac92xx_add_control_idx(spec, type, 0, name, val);
  }
2b63536f0   Takashi Iwai   ALSA: hda - Const...
2619
  static const struct snd_kcontrol_new stac_input_src_temp = {
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2620
2621
2622
2623
2624
2625
  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  	.name = "Input Source",
  	.info = stac92xx_mux_enum_info,
  	.get = stac92xx_mux_enum_get,
  	.put = stac92xx_mux_enum_put,
  };
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2626
2627
2628
2629
2630
2631
2632
  static inline int stac92xx_add_jack_mode_control(struct hda_codec *codec,
  						hda_nid_t nid, int idx)
  {
  	int def_conf = snd_hda_codec_get_pincfg(codec, nid);
  	int control = 0;
  	struct sigmatel_spec *spec = codec->spec;
  	char name[22];
99ae28bea   Takashi Iwai   ALSA: hda - Make ...
2633
  	if (snd_hda_get_input_pin_attr(def_conf) != INPUT_PIN_ATTR_INT) {
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
  		if (stac92xx_get_default_vref(codec, nid) == AC_PINCTL_VREF_GRD
  			&& nid == spec->line_switch)
  			control = STAC_CTL_WIDGET_IO_SWITCH;
  		else if (snd_hda_query_pin_caps(codec, nid)
  			& (AC_PINCAP_VREF_GRD << AC_PINCAP_VREF_SHIFT))
  			control = STAC_CTL_WIDGET_DC_BIAS;
  		else if (nid == spec->mic_switch)
  			control = STAC_CTL_WIDGET_IO_SWITCH;
  	}
  
  	if (control) {
201e06ffa   Takashi Iwai   ALSA: hda - Give ...
2645
2646
  		snd_hda_get_pin_label(codec, nid, &spec->autocfg,
  				      name, sizeof(name), NULL);
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
2647
2648
2649
2650
2651
2652
  		return stac92xx_add_control(codec->spec, control,
  					strcat(name, " Jack Mode"), nid);
  	}
  
  	return 0;
  }
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2653
2654
2655
2656
  static int stac92xx_add_input_source(struct sigmatel_spec *spec)
  {
  	struct snd_kcontrol_new *knew;
  	struct hda_input_mux *imux = &spec->private_imux;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
2657
2658
  	if (spec->auto_mic)
  		return 0; /* no need for input source */
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2659
2660
2661
  	if (!spec->num_adcs || imux->num_items <= 1)
  		return 0; /* no need for input source control */
  	knew = stac_control_new(spec, &stac_input_src_temp,
4d02d1b63   Jaroslav Kysela   ALSA: hda - proc ...
2662
  				stac_input_src_temp.name, 0);
e3c759646   Takashi Iwai   ALSA: hda - Creat...
2663
2664
2665
2666
2667
  	if (!knew)
  		return -ENOMEM;
  	knew->count = spec->num_adcs;
  	return 0;
  }
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2668
2669
  /* check whether the line-input can be used as line-out */
  static hda_nid_t check_line_out_switch(struct hda_codec *codec)
403d19446   Matt Porter   [ALSA] hda-codec ...
2670
2671
  {
  	struct sigmatel_spec *spec = codec->spec;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2672
2673
2674
  	struct auto_pin_cfg *cfg = &spec->autocfg;
  	hda_nid_t nid;
  	unsigned int pincap;
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2675
  	int i;
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
2676

c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2677
2678
  	if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
  		return 0;
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2679
  	for (i = 0; i < cfg->num_inputs; i++) {
86e2959a1   Takashi Iwai   ALSA: hda - Remov...
2680
  		if (cfg->inputs[i].type == AUTO_PIN_LINE_IN) {
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2681
2682
2683
2684
2685
2686
  			nid = cfg->inputs[i].pin;
  			pincap = snd_hda_query_pin_caps(codec, nid);
  			if (pincap & AC_PINCAP_OUT)
  				return nid;
  		}
  	}
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2687
2688
  	return 0;
  }
403d19446   Matt Porter   [ALSA] hda-codec ...
2689

eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2690
  static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid);
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2691
  /* check whether the mic-input can be used as line-out */
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2692
  static hda_nid_t check_mic_out_switch(struct hda_codec *codec, hda_nid_t *dac)
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2693
2694
2695
2696
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct auto_pin_cfg *cfg = &spec->autocfg;
  	unsigned int def_conf, pincap;
86e2959a1   Takashi Iwai   ALSA: hda - Remov...
2697
  	int i;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2698

eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2699
  	*dac = 0;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2700
2701
  	if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
  		return 0;
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2702
2703
  	for (i = 0; i < cfg->num_inputs; i++) {
  		hda_nid_t nid = cfg->inputs[i].pin;
86e2959a1   Takashi Iwai   ALSA: hda - Remov...
2704
  		if (cfg->inputs[i].type != AUTO_PIN_MIC)
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2705
  			continue;
330ee9957   Takashi Iwai   ALSA: hda - Remov...
2706
  		def_conf = snd_hda_codec_get_pincfg(codec, nid);
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2707
2708
  		/* some laptops have an internal analog microphone
  		 * which can't be used as a output */
99ae28bea   Takashi Iwai   ALSA: hda - Make ...
2709
  		if (snd_hda_get_input_pin_attr(def_conf) != INPUT_PIN_ATTR_INT) {
1327a32b8   Takashi Iwai   ALSA: hda - Cache...
2710
  			pincap = snd_hda_query_pin_caps(codec, nid);
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2711
2712
2713
2714
2715
  			if (pincap & AC_PINCAP_OUT) {
  				*dac = get_unassigned_dac(codec, nid);
  				if (*dac)
  					return nid;
  			}
403d19446   Matt Porter   [ALSA] hda-codec ...
2716
  		}
403d19446   Matt Porter   [ALSA] hda-codec ...
2717
  	}
403d19446   Matt Porter   [ALSA] hda-codec ...
2718
2719
  	return 0;
  }
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
  static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
  {
  	int i;
  	
  	for (i = 0; i < spec->multiout.num_dacs; i++) {
  		if (spec->multiout.dac_nids[i] == nid)
  			return 1;
  	}
  
  	return 0;
  }
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
  static int check_all_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
  {
  	int i;
  	if (is_in_dac_nids(spec, nid))
  		return 1;
  	for (i = 0; i < spec->autocfg.hp_outs; i++)
  		if (spec->hp_dacs[i] == nid)
  			return 1;
  	for (i = 0; i < spec->autocfg.speaker_outs; i++)
  		if (spec->speaker_dacs[i] == nid)
  			return 1;
  	return 0;
  }
  
  static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid)
  {
  	struct sigmatel_spec *spec = codec->spec;
48718eab5   David Henningsson   ALSA: HDA: Fix DA...
2748
  	struct auto_pin_cfg *cfg = &spec->autocfg;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2749
  	int j, conn_len;
48718eab5   David Henningsson   ALSA: HDA: Fix DA...
2750
  	hda_nid_t conn[HDA_MAX_CONNECTIONS], fallback_dac;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2751
2752
2753
2754
  	unsigned int wcaps, wtype;
  
  	conn_len = snd_hda_get_connections(codec, nid, conn,
  					   HDA_MAX_CONNECTIONS);
36706005d   Charles Chin   ALSA: hda - Add s...
2755
2756
2757
2758
2759
2760
2761
  	/* 92HD88: trace back up the link of nids to find the DAC */
  	while (conn_len == 1 && (get_wcaps_type(get_wcaps(codec, conn[0]))
  					!= AC_WID_AUD_OUT)) {
  		nid = conn[0];
  		conn_len = snd_hda_get_connections(codec, nid, conn,
  			HDA_MAX_CONNECTIONS);
  	}
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2762
  	for (j = 0; j < conn_len; j++) {
14bafe327   Takashi Iwai   ALSA: hda - Use c...
2763
  		wcaps = get_wcaps(codec, conn[j]);
a22d543a9   Takashi Iwai   ALSA: hda - Intro...
2764
  		wtype = get_wcaps_type(wcaps);
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
  		/* we check only analog outputs */
  		if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
  			continue;
  		/* if this route has a free DAC, assign it */
  		if (!check_all_dac_nids(spec, conn[j])) {
  			if (conn_len > 1) {
  				/* select this DAC in the pin's input mux */
  				snd_hda_codec_write_cache(codec, nid, 0,
  						  AC_VERB_SET_CONNECT_SEL, j);
  			}
  			return conn[j];
  		}
  	}
48718eab5   David Henningsson   ALSA: HDA: Fix DA...
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
  
  	/* if all DACs are already assigned, connect to the primary DAC,
  	   unless we're assigning a secondary headphone */
  	fallback_dac = spec->multiout.dac_nids[0];
  	if (spec->multiout.hp_nid) {
  		for (j = 0; j < cfg->hp_outs; j++)
  			if (cfg->hp_pins[j] == nid) {
  				fallback_dac = spec->multiout.hp_nid;
  				break;
  			}
  	}
ee58a7ca2   Takashi Iwai   ALSA: hda - Conne...
2789
2790
  	if (conn_len > 1) {
  		for (j = 0; j < conn_len; j++) {
48718eab5   David Henningsson   ALSA: HDA: Fix DA...
2791
  			if (conn[j] == fallback_dac) {
ee58a7ca2   Takashi Iwai   ALSA: hda - Conne...
2792
2793
2794
2795
2796
2797
  				snd_hda_codec_write_cache(codec, nid, 0,
  						  AC_VERB_SET_CONNECT_SEL, j);
  				break;
  			}
  		}
  	}
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2798
2799
2800
2801
2802
  	return 0;
  }
  
  static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
  static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
2803
  /*
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
2804
2805
2806
2807
2808
   * Fill in the dac_nids table from the parsed pin configuration
   * This function only works when every pin in line_out_pins[]
   * contains atleast one DAC in its connection list. Some 92xx
   * codecs are not connected directly to a DAC, such as the 9200
   * and 9202/925x. For those, dac_nids[] must be hard-coded.
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
2809
   */
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2810
  static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2811
2812
  {
  	struct sigmatel_spec *spec = codec->spec;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2813
2814
2815
  	struct auto_pin_cfg *cfg = &spec->autocfg;
  	int i;
  	hda_nid_t nid, dac;
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
2816
  	
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2817
2818
  	for (i = 0; i < cfg->line_outs; i++) {
  		nid = cfg->line_out_pins[i];
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2819
2820
  		dac = get_unassigned_dac(codec, nid);
  		if (!dac) {
df802952b   Takashi Iwai   [ALSA] hda-codec ...
2821
2822
2823
2824
2825
2826
2827
  			if (spec->multiout.num_dacs > 0) {
  				/* we have already working output pins,
  				 * so let's drop the broken ones again
  				 */
  				cfg->line_outs = spec->multiout.num_dacs;
  				break;
  			}
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
2828
2829
2830
2831
2832
2833
2834
  			/* error out, no available DAC found */
  			snd_printk(KERN_ERR
  				   "%s: No available DAC for pin 0x%x
  ",
  				   __func__, nid);
  			return -ENODEV;
  		}
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2835
2836
  		add_spec_dacs(spec, dac);
  	}
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
2837

139e071b0   Takashi Iwai   ALSA: hda - Assig...
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
  	for (i = 0; i < cfg->hp_outs; i++) {
  		nid = cfg->hp_pins[i];
  		dac = get_unassigned_dac(codec, nid);
  		if (dac) {
  			if (!spec->multiout.hp_nid)
  				spec->multiout.hp_nid = dac;
  			else
  				add_spec_extra_dacs(spec, dac);
  		}
  		spec->hp_dacs[i] = dac;
  	}
  
  	for (i = 0; i < cfg->speaker_outs; i++) {
  		nid = cfg->speaker_pins[i];
  		dac = get_unassigned_dac(codec, nid);
  		if (dac)
  			add_spec_extra_dacs(spec, dac);
  		spec->speaker_dacs[i] = dac;
  	}
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
  	/* add line-in as output */
  	nid = check_line_out_switch(codec);
  	if (nid) {
  		dac = get_unassigned_dac(codec, nid);
  		if (dac) {
  			snd_printdd("STAC: Add line-in 0x%x as output %d
  ",
  				    nid, cfg->line_outs);
  			cfg->line_out_pins[cfg->line_outs] = nid;
  			cfg->line_outs++;
  			spec->line_switch = nid;
  			add_spec_dacs(spec, dac);
  		}
  	}
  	/* add mic as output */
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
2872
2873
2874
2875
2876
2877
2878
2879
2880
  	nid = check_mic_out_switch(codec, &dac);
  	if (nid && dac) {
  		snd_printdd("STAC: Add mic-in 0x%x as output %d
  ",
  			    nid, cfg->line_outs);
  		cfg->line_out_pins[cfg->line_outs] = nid;
  		cfg->line_outs++;
  		spec->mic_switch = nid;
  		add_spec_dacs(spec, dac);
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2881
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2882

c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2883
2884
  	snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)
  ",
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
2885
2886
2887
2888
2889
2890
  		   spec->multiout.num_dacs,
  		   spec->multiout.dac_nids[0],
  		   spec->multiout.dac_nids[1],
  		   spec->multiout.dac_nids[2],
  		   spec->multiout.dac_nids[3],
  		   spec->multiout.dac_nids[4]);
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2891

c7d4b2fa3   Matt   [ALSA] hda-codec ...
2892
2893
  	return 0;
  }
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2894
  /* create volume control/switch for the given prefx type */
668b9652b   Takashi Iwai   ALSA: hda - Creat...
2895
2896
  static int create_controls_idx(struct hda_codec *codec, const char *pfx,
  			       int idx, hda_nid_t nid, int chs)
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2897
  {
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
2898
  	struct sigmatel_spec *spec = codec->spec;
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2899
2900
  	char name[32];
  	int err;
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
  	if (!spec->check_volume_offset) {
  		unsigned int caps, step, nums, db_scale;
  		caps = query_amp_caps(codec, nid, HDA_OUTPUT);
  		step = (caps & AC_AMPCAP_STEP_SIZE) >>
  			AC_AMPCAP_STEP_SIZE_SHIFT;
  		step = (step + 1) * 25; /* in .01dB unit */
  		nums = (caps & AC_AMPCAP_NUM_STEPS) >>
  			AC_AMPCAP_NUM_STEPS_SHIFT;
  		db_scale = nums * step;
  		/* if dB scale is over -64dB, and finer enough,
  		 * let's reduce it to half
  		 */
  		if (db_scale > 6400 && nums >= 0x1f)
  			spec->volume_offset = nums / 2;
  		spec->check_volume_offset = 1;
  	}
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2917
  	sprintf(name, "%s Playback Volume", pfx);
668b9652b   Takashi Iwai   ALSA: hda - Creat...
2918
  	err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, idx, name,
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
2919
2920
  		HDA_COMPOSE_AMP_VAL_OFS(nid, chs, 0, HDA_OUTPUT,
  					spec->volume_offset));
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2921
2922
2923
  	if (err < 0)
  		return err;
  	sprintf(name, "%s Playback Switch", pfx);
668b9652b   Takashi Iwai   ALSA: hda - Creat...
2924
  	err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_MUTE, idx, name,
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2925
2926
2927
2928
2929
  				   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
  	if (err < 0)
  		return err;
  	return 0;
  }
668b9652b   Takashi Iwai   ALSA: hda - Creat...
2930
2931
  #define create_controls(codec, pfx, nid, chs) \
  	create_controls_idx(codec, pfx, 0, nid, chs)
ae0afd81b   Matthew Ranostay   [ALSA] hda: Mic a...
2932
2933
  static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
  {
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2934
  	if (spec->multiout.num_dacs > 4) {
ae0afd81b   Matthew Ranostay   [ALSA] hda: Mic a...
2935
2936
2937
2938
  		printk(KERN_WARNING "stac92xx: No space for DAC 0x%x
  ", nid);
  		return 1;
  	} else {
dda144103   Takashi Iwai   ALSA: hda - Const...
2939
2940
  		snd_BUG_ON(spec->multiout.dac_nids != spec->dac_nids);
  		spec->dac_nids[spec->multiout.num_dacs] = nid;
ae0afd81b   Matthew Ranostay   [ALSA] hda: Mic a...
2941
2942
2943
2944
  		spec->multiout.num_dacs++;
  	}
  	return 0;
  }
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2945
  static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
ae0afd81b   Matthew Ranostay   [ALSA] hda: Mic a...
2946
  {
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
  	int i;
  	for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) {
  		if (!spec->multiout.extra_out_nid[i]) {
  			spec->multiout.extra_out_nid[i] = nid;
  			return 0;
  		}
  	}
  	printk(KERN_WARNING "stac92xx: No space for extra DAC 0x%x
  ", nid);
  	return 1;
ae0afd81b   Matthew Ranostay   [ALSA] hda: Mic a...
2957
  }
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
2958
2959
2960
2961
2962
2963
2964
  /* Create output controls
   * The mixer elements are named depending on the given type (AUTO_PIN_XXX_OUT)
   */
  static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
  				 const hda_nid_t *pins,
  				 const hda_nid_t *dac_nids,
  				 int type)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2965
  {
766245348   Takashi Iwai   ALSA: hda - Use m...
2966
  	struct sigmatel_spec *spec = codec->spec;
ea7349632   Takashi Iwai   ALSA: hda - consi...
2967
  	static const char * const chname[4] = {
19039bd00   Takashi Iwai   [ALSA] Add Intel ...
2968
2969
  		"Front", "Surround", NULL /*CLFE*/, "Side"
  	};
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
2970
  	hda_nid_t nid;
915892322   Takashi Iwai   ALSA: hda - Fix u...
2971
2972
  	int i, err;
  	unsigned int wid_caps;
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2973

dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
2974
  	for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) {
ffd0e56c6   Takashi Iwai   ALSA: hda - Fix h...
2975
  		if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) {
e35d9d6a1   Takashi Iwai   ALSA: hda - Check...
2976
  			if (is_jack_detectable(codec, pins[i]))
ffd0e56c6   Takashi Iwai   ALSA: hda - Fix h...
2977
2978
  				spec->hp_detect = 1;
  		}
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
2979
2980
2981
2982
  		nid = dac_nids[i];
  		if (!nid)
  			continue;
  		if (type != AUTO_PIN_HP_OUT && i == 2) {
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2983
  			/* Center/LFE */
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
2984
  			err = create_controls(codec, "Center", nid, 1);
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2985
  			if (err < 0)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2986
  				return err;
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
2987
  			err = create_controls(codec, "LFE", nid, 2);
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
2988
  			if (err < 0)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
2989
  				return err;
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
  
  			wid_caps = get_wcaps(codec, nid);
  
  			if (wid_caps & AC_WCAP_LR_SWAP) {
  				err = stac92xx_add_control(spec,
  					STAC_CTL_WIDGET_CLFE_SWITCH,
  					"Swap Center/LFE Playback Switch", nid);
  
  				if (err < 0)
  					return err;
  			}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3001
  		} else {
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3002
  			const char *name;
668b9652b   Takashi Iwai   ALSA: hda - Creat...
3003
  			int idx;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3004
3005
  			switch (type) {
  			case AUTO_PIN_HP_OUT:
668b9652b   Takashi Iwai   ALSA: hda - Creat...
3006
3007
  				name = "Headphone";
  				idx = i;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3008
3009
  				break;
  			case AUTO_PIN_SPEAKER_OUT:
668b9652b   Takashi Iwai   ALSA: hda - Creat...
3010
3011
  				name = "Speaker";
  				idx = i;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3012
3013
3014
  				break;
  			default:
  				name = chname[i];
668b9652b   Takashi Iwai   ALSA: hda - Creat...
3015
  				idx = 0;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3016
  				break;
766245348   Takashi Iwai   ALSA: hda - Use m...
3017
  			}
668b9652b   Takashi Iwai   ALSA: hda - Creat...
3018
  			err = create_controls_idx(codec, name, idx, nid, 3);
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
3019
  			if (err < 0)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3020
3021
3022
  				return err;
  		}
  	}
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3023
3024
  	return 0;
  }
6479c6318   Takashi Iwai   ALSA: hda - Creat...
3025
3026
3027
3028
3029
  static int stac92xx_add_capvol_ctls(struct hda_codec *codec, unsigned long vol,
  				    unsigned long sw, int idx)
  {
  	int err;
  	err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx,
bf677bd8f   Takashi Iwai   ALSA: hda - Fix t...
3030
  				       "Capture Volume", vol);
6479c6318   Takashi Iwai   ALSA: hda - Creat...
3031
3032
3033
  	if (err < 0)
  		return err;
  	err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_MUTE, idx,
bf677bd8f   Takashi Iwai   ALSA: hda - Fix t...
3034
  				       "Capture Switch", sw);
6479c6318   Takashi Iwai   ALSA: hda - Creat...
3035
3036
3037
3038
  	if (err < 0)
  		return err;
  	return 0;
  }
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3039
3040
3041
3042
3043
  /* add playback controls from the parsed DAC table */
  static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
  					       const struct auto_pin_cfg *cfg)
  {
  	struct sigmatel_spec *spec = codec->spec;
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
3044
  	hda_nid_t nid;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3045
  	int err;
7c922de70   Nickolas Lloyd   ALSA: hda - Jack ...
3046
  	int idx;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3047
3048
3049
3050
3051
3052
  
  	err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
  				    spec->multiout.dac_nids,
  				    cfg->line_out_type);
  	if (err < 0)
  		return err;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3053

a9cb5c905   Takashi Iwai   ALSA: hda - No 'H...
3054
  	if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
3055
3056
  		err = stac92xx_add_control(spec,
  			STAC_CTL_WIDGET_HP_SWITCH,
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
3057
3058
  			"Headphone as Line Out Switch",
  			cfg->hp_pins[cfg->hp_outs - 1]);
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
3059
3060
3061
  		if (err < 0)
  			return err;
  	}
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3062
  	for (idx = 0; idx < cfg->num_inputs; idx++) {
86e2959a1   Takashi Iwai   ALSA: hda - Remov...
3063
  		if (cfg->inputs[idx].type > AUTO_PIN_LINE_IN)
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3064
3065
3066
3067
3068
  			break;
  		nid = cfg->inputs[idx].pin;
  		err = stac92xx_add_jack_mode_control(codec, nid, idx);
  		if (err < 0)
  			return err;
b5895dc8b   Matthew Ranostay   [ALSA] hda: STAC9...
3069
  	}
403d19446   Matt Porter   [ALSA] hda-codec ...
3070

c7d4b2fa3   Matt   [ALSA] hda-codec ...
3071
3072
  	return 0;
  }
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
3073
3074
3075
3076
3077
  /* add playback controls for Speaker and HP outputs */
  static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
  					struct auto_pin_cfg *cfg)
  {
  	struct sigmatel_spec *spec = codec->spec;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
  	int err;
  
  	err = create_multi_out_ctls(codec, cfg->hp_outs, cfg->hp_pins,
  				    spec->hp_dacs, AUTO_PIN_HP_OUT);
  	if (err < 0)
  		return err;
  
  	err = create_multi_out_ctls(codec, cfg->speaker_outs, cfg->speaker_pins,
  				    spec->speaker_dacs, AUTO_PIN_SPEAKER_OUT);
  	if (err < 0)
  		return err;
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
3089

c7d4b2fa3   Matt   [ALSA] hda-codec ...
3090
3091
  	return 0;
  }
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
3092
  /* labels for mono mux outputs */
ea7349632   Takashi Iwai   ALSA: hda - consi...
3093
  static const char * const stac92xx_mono_labels[4] = {
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
3094
  	"DAC0", "DAC1", "Mixer", "DAC2"
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
  };
  
  /* create mono mux for mono out on capable codecs */
  static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct hda_input_mux *mono_mux = &spec->private_mono_mux;
  	int i, num_cons;
  	hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
  
  	num_cons = snd_hda_get_connections(codec,
  				spec->mono_nid,
  				con_lst,
  				HDA_MAX_NUM_INPUTS);
16a433d8b   Jaroslav Kysela   ALSA: hda-intel: ...
3109
  	if (num_cons <= 0 || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
3110
  		return -EINVAL;
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3111
3112
3113
  	for (i = 0; i < num_cons; i++)
  		snd_hda_add_imux_item(mono_mux, stac92xx_mono_labels[i], i,
  				      NULL);
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
3114
3115
3116
  
  	return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
  				"Mono Mux", spec->mono_nid);
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
3117
  }
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
3118
3119
3120
3121
3122
3123
  /* create PC beep volume controls */
  static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
  						hda_nid_t nid)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
123c07aed   Jaroslav Kysela   ALSA: hda_intel: ...
3124
3125
3126
3127
  	int err, type = STAC_CTL_WIDGET_MUTE_BEEP;
  
  	if (spec->anabeep_nid == nid)
  		type = STAC_CTL_WIDGET_MUTE;
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
3128
3129
3130
  
  	/* check for mute support for the the amp */
  	if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) {
123c07aed   Jaroslav Kysela   ALSA: hda_intel: ...
3131
  		err = stac92xx_add_control(spec, type,
d355c82a0   Jaroslav Kysela   ALSA: rename "PC ...
3132
  			"Beep Playback Switch",
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
3133
3134
3135
3136
3137
3138
3139
3140
  			HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
  			if (err < 0)
  				return err;
  	}
  
  	/* check to see if there is volume support for the amp */
  	if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
  		err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
d355c82a0   Jaroslav Kysela   ALSA: rename "PC ...
3141
  			"Beep Playback Volume",
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
3142
3143
3144
3145
3146
3147
  			HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
  			if (err < 0)
  				return err;
  	}
  	return 0;
  }
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
  #ifdef CONFIG_SND_HDA_INPUT_BEEP
  #define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info
  
  static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
  					struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	ucontrol->value.integer.value[0] = codec->beep->enabled;
  	return 0;
  }
  
  static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
  					struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
123c07aed   Jaroslav Kysela   ALSA: hda_intel: ...
3163
  	return snd_hda_enable_beep_device(codec, ucontrol->value.integer.value[0]);
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
3164
  }
2b63536f0   Takashi Iwai   ALSA: hda - Const...
3165
  static const struct snd_kcontrol_new stac92xx_dig_beep_ctrl = {
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
3166
3167
3168
3169
3170
3171
3172
3173
3174
  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  	.info = stac92xx_dig_beep_switch_info,
  	.get = stac92xx_dig_beep_switch_get,
  	.put = stac92xx_dig_beep_switch_put,
  };
  
  static int stac92xx_beep_switch_ctl(struct hda_codec *codec)
  {
  	return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl,
d355c82a0   Jaroslav Kysela   ALSA: rename "PC ...
3175
  					 0, "Beep Playback Switch", 0);
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
3176
3177
  }
  #endif
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
3178
3179
3180
  static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3181
  	int i, j, err = 0;
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
3182
3183
  
  	for (i = 0; i < spec->num_muxes; i++) {
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3184
3185
3186
  		hda_nid_t nid;
  		unsigned int wcaps;
  		unsigned long val;
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
3187
3188
  		nid = spec->mux_nids[i];
  		wcaps = get_wcaps(codec, nid);
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3189
3190
  		if (!(wcaps & AC_WCAP_OUT_AMP))
  			continue;
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
3191

667067d89   Takashi Iwai   ALSA: hda - Fix /...
3192
3193
3194
3195
3196
3197
3198
  		/* check whether already the same control was created as
  		 * normal Capture Volume.
  		 */
  		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
  		for (j = 0; j < spec->num_caps; j++) {
  			if (spec->capvols[j] == val)
  				break;
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
3199
  		}
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3200
3201
3202
3203
3204
3205
3206
  		if (j < spec->num_caps)
  			continue;
  
  		err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, i,
  					       "Mux Capture Volume", val);
  		if (err < 0)
  			return err;
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
3207
3208
3209
  	}
  	return 0;
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
3210
  static const char * const stac92xx_spdif_labels[3] = {
659736321   Matthew Ranostay   ALSA: hda: SPDIF ...
3211
  	"Digital Playback", "Analog Mux 1", "Analog Mux 2",
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
3212
3213
3214
3215
3216
3217
  };
  
  static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct hda_input_mux *spdif_mux = &spec->private_smux;
ea7349632   Takashi Iwai   ALSA: hda - consi...
3218
  	const char * const *labels = spec->spdif_labels;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
3219
  	int i, num_cons;
659736321   Matthew Ranostay   ALSA: hda: SPDIF ...
3220
  	hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
3221
3222
3223
3224
3225
  
  	num_cons = snd_hda_get_connections(codec,
  				spec->smux_nids[0],
  				con_lst,
  				HDA_MAX_NUM_INPUTS);
16a433d8b   Jaroslav Kysela   ALSA: hda-intel: ...
3226
  	if (num_cons <= 0)
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
3227
  		return -EINVAL;
659736321   Matthew Ranostay   ALSA: hda: SPDIF ...
3228
3229
  	if (!labels)
  		labels = stac92xx_spdif_labels;
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3230
3231
  	for (i = 0; i < num_cons; i++)
  		snd_hda_add_imux_item(spdif_mux, labels[i], i, NULL);
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
3232
3233
3234
  
  	return 0;
  }
8b65727bf   Matt Porter   [ALSA] hda: add d...
3235
  /* labels for dmic mux inputs */
ea7349632   Takashi Iwai   ALSA: hda - consi...
3236
  static const char * const stac92xx_dmic_labels[5] = {
8b65727bf   Matt Porter   [ALSA] hda: add d...
3237
3238
3239
  	"Analog Inputs", "Digital Mic 1", "Digital Mic 2",
  	"Digital Mic 3", "Digital Mic 4"
  };
699d89956   Vitaliy Kulikov   ALSA: hda - pin-a...
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
  static hda_nid_t get_connected_node(struct hda_codec *codec, hda_nid_t mux,
  				    int idx)
  {
  	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
  	int nums;
  	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
  	if (idx >= 0 && idx < nums)
  		return conn[idx];
  	return 0;
  }
8d087c760   Takashi Iwai   ALSA: hda - Creat...
3250
3251
3252
  /* look for NID recursively */
  #define get_connection_index(codec, mux, nid) \
  	snd_hda_get_conn_index(codec, mux, nid, 1)
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3253

667067d89   Takashi Iwai   ALSA: hda - Fix /...
3254
  /* create a volume assigned to the given pin (only if supported) */
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3255
  /* return 1 if the volume control is created */
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3256
  static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid,
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3257
  				   const char *label, int idx, int direction)
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3258
3259
3260
  {
  	unsigned int caps, nums;
  	char name[32];
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3261
  	int err;
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3262

96f845de8   Takashi Iwai   ALSA: hda - Creat...
3263
3264
3265
3266
3267
  	if (direction == HDA_OUTPUT)
  		caps = AC_WCAP_OUT_AMP;
  	else
  		caps = AC_WCAP_IN_AMP;
  	if (!(get_wcaps(codec, nid) & caps))
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3268
  		return 0;
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3269
  	caps = query_amp_caps(codec, nid, direction);
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3270
3271
3272
3273
  	nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
  	if (!nums)
  		return 0;
  	snprintf(name, sizeof(name), "%s Capture Volume", label);
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3274
3275
  	err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx, name,
  				       HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction));
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3276
3277
3278
  	if (err < 0)
  		return err;
  	return 1;
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3279
  }
8b65727bf   Matt Porter   [ALSA] hda: add d...
3280
3281
3282
3283
3284
  /* create playback/capture controls for input pins on dmic capable codecs */
  static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
  						const struct auto_pin_cfg *cfg)
  {
  	struct sigmatel_spec *spec = codec->spec;
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
3285
  	struct hda_input_mux *imux = &spec->private_imux;
8b65727bf   Matt Porter   [ALSA] hda: add d...
3286
  	struct hda_input_mux *dimux = &spec->private_dimux;
263d0328c   Vitaliy Kulikov   ALSA: hda - Impro...
3287
  	int err, i;
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
3288
  	unsigned int def_conf;
8b65727bf   Matt Porter   [ALSA] hda: add d...
3289

10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3290
  	snd_hda_add_imux_item(dimux, stac92xx_dmic_labels[0], 0, NULL);
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
3291

8b65727bf   Matt Porter   [ALSA] hda: add d...
3292
  	for (i = 0; i < spec->num_dmics; i++) {
0678accd2   Matthew Ranostay   [ALSA] hda: Dynam...
3293
  		hda_nid_t nid;
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3294
  		int index, type_idx;
201e06ffa   Takashi Iwai   ALSA: hda - Give ...
3295
  		char label[32];
8b65727bf   Matt Porter   [ALSA] hda: add d...
3296

667067d89   Takashi Iwai   ALSA: hda - Fix /...
3297
3298
3299
3300
  		nid = spec->dmic_nids[i];
  		if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
  			continue;
  		def_conf = snd_hda_codec_get_pincfg(codec, nid);
8b65727bf   Matt Porter   [ALSA] hda: add d...
3301
3302
  		if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
  			continue;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3303
3304
3305
  		index = get_connection_index(codec, spec->dmux_nids[0], nid);
  		if (index < 0)
  			continue;
201e06ffa   Takashi Iwai   ALSA: hda - Give ...
3306
3307
  		snd_hda_get_pin_label(codec, nid, &spec->autocfg,
  				      label, sizeof(label), NULL);
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3308
  		snd_hda_add_imux_item(dimux, label, index, &type_idx);
2d7ec12b9   Takashi Iwai   ALSA: hda - Fix c...
3309
3310
  		if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1)
  			snd_hda_add_imux_item(imux, label, index, &type_idx);
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
3311

10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3312
3313
  		err = create_elem_capture_vol(codec, nid, label, type_idx,
  					      HDA_INPUT);
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3314
3315
  		if (err < 0)
  			return err;
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3316
3317
  		if (!err) {
  			err = create_elem_capture_vol(codec, nid, label,
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3318
  						      type_idx, HDA_OUTPUT);
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3319
3320
  			if (err < 0)
  				return err;
699d89956   Vitaliy Kulikov   ALSA: hda - pin-a...
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
  			if (!err) {
  				nid = get_connected_node(codec,
  						spec->dmux_nids[0], index);
  				if (nid)
  					err = create_elem_capture_vol(codec,
  							nid, label,
  							type_idx, HDA_INPUT);
  				if (err < 0)
  					return err;
  			}
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3331
  		}
8b65727bf   Matt Porter   [ALSA] hda: add d...
3332
3333
3334
3335
  	}
  
  	return 0;
  }
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3336
  static int check_mic_pin(struct hda_codec *codec, hda_nid_t nid,
9907790aa   Charles Chin   ALSA: hda - Fix a...
3337
  			 hda_nid_t *fixed, hda_nid_t *ext, hda_nid_t *dock)
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3338
3339
  {
  	unsigned int cfg;
1f83ac5ac   Takashi Iwai   ALSA: hda - Handl...
3340
  	unsigned int type;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3341
3342
3343
3344
  
  	if (!nid)
  		return 0;
  	cfg = snd_hda_codec_get_pincfg(codec, nid);
1f83ac5ac   Takashi Iwai   ALSA: hda - Handl...
3345
  	type = get_defcfg_device(cfg);
99ae28bea   Takashi Iwai   ALSA: hda - Make ...
3346
3347
  	switch (snd_hda_get_input_pin_attr(cfg)) {
  	case INPUT_PIN_ATTR_INT:
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3348
3349
  		if (*fixed)
  			return 1; /* already occupied */
1f83ac5ac   Takashi Iwai   ALSA: hda - Handl...
3350
3351
  		if (type != AC_JACK_MIC_IN)
  			return 1; /* invalid type */
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3352
3353
  		*fixed = nid;
  		break;
99ae28bea   Takashi Iwai   ALSA: hda - Make ...
3354
3355
3356
3357
3358
  	case INPUT_PIN_ATTR_UNUSED:
  		break;
  	case INPUT_PIN_ATTR_DOCK:
  		if (*dock)
  			return 1; /* already occupied */
1f83ac5ac   Takashi Iwai   ALSA: hda - Handl...
3359
3360
  		if (type != AC_JACK_MIC_IN && type != AC_JACK_LINE_IN)
  			return 1; /* invalid type */
99ae28bea   Takashi Iwai   ALSA: hda - Make ...
3361
3362
3363
  		*dock = nid;
  		break;
  	default:
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3364
3365
  		if (*ext)
  			return 1; /* already occupied */
1f83ac5ac   Takashi Iwai   ALSA: hda - Handl...
3366
3367
  		if (type != AC_JACK_MIC_IN)
  			return 1; /* invalid type */
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
  		*ext = nid;
  		break;
  	}
  	return 0;
  }
  
  static int set_mic_route(struct hda_codec *codec,
  			 struct sigmatel_mic_route *mic,
  			 hda_nid_t pin)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct auto_pin_cfg *cfg = &spec->autocfg;
  	int i;
  
  	mic->pin = pin;
9907790aa   Charles Chin   ALSA: hda - Fix a...
3383
3384
  	if (pin == 0)
  		return 0;
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3385
3386
  	for (i = 0; i < cfg->num_inputs; i++) {
  		if (pin == cfg->inputs[i].pin)
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3387
  			break;
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3388
  	}
86e2959a1   Takashi Iwai   ALSA: hda - Remov...
3389
  	if (i < cfg->num_inputs && cfg->inputs[i].type == AUTO_PIN_MIC) {
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3390
  		/* analog pin */
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3391
3392
3393
3394
  		i = get_connection_index(codec, spec->mux_nids[0], pin);
  		if (i < 0)
  			return -1;
  		mic->mux_idx = i;
02d333228   Takashi Iwai   ALSA: hda - Fix d...
3395
3396
3397
3398
3399
  		mic->dmux_idx = -1;
  		if (spec->dmux_nids)
  			mic->dmux_idx = get_connection_index(codec,
  							     spec->dmux_nids[0],
  							     spec->mux_nids[0]);
da2a2aaa8   Takashi Iwai   ALSA: hda - Fix O...
3400
  	}  else if (spec->dmux_nids) {
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3401
  		/* digital pin */
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3402
3403
3404
3405
  		i = get_connection_index(codec, spec->dmux_nids[0], pin);
  		if (i < 0)
  			return -1;
  		mic->dmux_idx = i;
02d333228   Takashi Iwai   ALSA: hda - Fix d...
3406
3407
3408
3409
3410
  		mic->mux_idx = -1;
  		if (spec->mux_nids)
  			mic->mux_idx = get_connection_index(codec,
  							    spec->mux_nids[0],
  							    spec->dmux_nids[0]);
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3411
3412
3413
3414
3415
3416
3417
3418
3419
  	}
  	return 0;
  }
  
  /* return non-zero if the device is for automatic mic switch */
  static int stac_check_auto_mic(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct auto_pin_cfg *cfg = &spec->autocfg;
9907790aa   Charles Chin   ALSA: hda - Fix a...
3420
  	hda_nid_t fixed, ext, dock;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3421
  	int i;
9907790aa   Charles Chin   ALSA: hda - Fix a...
3422
  	fixed = ext = dock = 0;
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3423
  	for (i = 0; i < cfg->num_inputs; i++)
9907790aa   Charles Chin   ALSA: hda - Fix a...
3424
3425
  		if (check_mic_pin(codec, cfg->inputs[i].pin,
  		    &fixed, &ext, &dock))
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3426
3427
  			return 0;
  	for (i = 0; i < spec->num_dmics; i++)
9907790aa   Charles Chin   ALSA: hda - Fix a...
3428
3429
  		if (check_mic_pin(codec, spec->dmic_nids[i],
  		    &fixed, &ext, &dock))
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3430
  			return 0;
80c678526   Takashi Iwai   ALSA: hda - Fix N...
3431
  	if (!fixed || (!ext && !dock))
9907790aa   Charles Chin   ALSA: hda - Fix a...
3432
  		return 0; /* no input to switch */
e35d9d6a1   Takashi Iwai   ALSA: hda - Check...
3433
  	if (!is_jack_detectable(codec, ext))
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3434
3435
  		return 0; /* no unsol support */
  	if (set_mic_route(codec, &spec->ext_mic, ext) ||
9907790aa   Charles Chin   ALSA: hda - Fix a...
3436
3437
  	    set_mic_route(codec, &spec->int_mic, fixed) ||
  	    set_mic_route(codec, &spec->dock_mic, dock))
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3438
3439
3440
  		return 0; /* something is wrong */
  	return 1;
  }
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3441
3442
3443
3444
  /* create playback/capture controls for input pins */
  static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
  {
  	struct sigmatel_spec *spec = codec->spec;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3445
  	struct hda_input_mux *imux = &spec->private_imux;
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3446
  	int i, j;
263d0328c   Vitaliy Kulikov   ALSA: hda - Impro...
3447
  	const char *label;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3448

eea7dc932   Takashi Iwai   ALSA: hda - Use n...
3449
3450
  	for (i = 0; i < cfg->num_inputs; i++) {
  		hda_nid_t nid = cfg->inputs[i].pin;
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3451
  		int index, err, type_idx;
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
3452

314634bc8   Takashi Iwai   [ALSA] hda-codec ...
3453
3454
  		index = -1;
  		for (j = 0; j < spec->num_muxes; j++) {
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3455
3456
3457
3458
  			index = get_connection_index(codec, spec->mux_nids[j],
  						     nid);
  			if (index >= 0)
  				break;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3459
  		}
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3460
3461
  		if (index < 0)
  			continue;
10a20af7c   Takashi Iwai   ALSA: hda - Impro...
3462
3463
  		label = hda_get_autocfg_input_label(codec, cfg, i);
  		snd_hda_add_imux_item(imux, label, index, &type_idx);
263d0328c   Vitaliy Kulikov   ALSA: hda - Impro...
3464

667067d89   Takashi Iwai   ALSA: hda - Fix /...
3465
  		err = create_elem_capture_vol(codec, nid,
263d0328c   Vitaliy Kulikov   ALSA: hda - Impro...
3466
  					      label, type_idx,
96f845de8   Takashi Iwai   ALSA: hda - Creat...
3467
  					      HDA_INPUT);
667067d89   Takashi Iwai   ALSA: hda - Fix /...
3468
3469
  		if (err < 0)
  			return err;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3470
  	}
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
3471
  	spec->num_analog_muxes = imux->num_items;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3472

7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
3473
  	if (imux->num_items) {
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3474
3475
3476
3477
3478
3479
  		/*
  		 * Set the current input for the muxes.
  		 * The STAC9221 has two input muxes with identical source
  		 * NID lists.  Hopefully this won't get confused.
  		 */
  		for (i = 0; i < spec->num_muxes; i++) {
82beb8fd3   Takashi Iwai   [ALSA] hda-codec ...
3480
3481
3482
  			snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
  						  AC_VERB_SET_CONNECT_SEL,
  						  imux->items[0].index);
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3483
3484
  		}
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3485
3486
  	return 0;
  }
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
  static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	int i;
  
  	for (i = 0; i < spec->autocfg.line_outs; i++) {
  		hda_nid_t nid = spec->autocfg.line_out_pins[i];
  		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
  	}
  }
  
  static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
3501
  	int i;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3502

eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
  	for (i = 0; i < spec->autocfg.hp_outs; i++) {
  		hda_nid_t pin;
  		pin = spec->autocfg.hp_pins[i];
  		if (pin) /* connect to front */
  			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
  	}
  	for (i = 0; i < spec->autocfg.speaker_outs; i++) {
  		hda_nid_t pin;
  		pin = spec->autocfg.speaker_pins[i];
  		if (pin) /* connect to front */
  			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3515
  }
8af3aeb49   Takashi Iwai   ALSA: hda - Fix d...
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
  static int is_dual_headphones(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	int i, valid_hps;
  
  	if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT ||
  	    spec->autocfg.hp_outs <= 1)
  		return 0;
  	valid_hps = 0;
  	for (i = 0; i < spec->autocfg.hp_outs; i++) {
  		hda_nid_t nid = spec->autocfg.hp_pins[i];
  		unsigned int cfg = snd_hda_codec_get_pincfg(codec, nid);
  		if (get_defcfg_location(cfg) & AC_JACK_LOC_SEPARATE)
  			continue;
  		valid_hps++;
  	}
  	return (valid_hps > 1);
  }
9009b0e41   Charles Chin   ALSA: hda/sigmate...
3534
  static int stac92xx_parse_auto_config(struct hda_codec *codec)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3535
3536
  {
  	struct sigmatel_spec *spec = codec->spec;
9009b0e41   Charles Chin   ALSA: hda/sigmate...
3537
  	hda_nid_t dig_out = 0, dig_in = 0;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3538
  	int hp_swap = 0;
6479c6318   Takashi Iwai   ALSA: hda - Creat...
3539
  	int i, err;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3540

8b65727bf   Matt Porter   [ALSA] hda: add d...
3541
3542
3543
  	if ((err = snd_hda_parse_pin_def_config(codec,
  						&spec->autocfg,
  						spec->dmic_nids)) < 0)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3544
  		return err;
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
3545
  	if (! spec->autocfg.line_outs)
869264c45   Matt Porter   [ALSA] hda: sigma...
3546
  		return 0; /* can't find valid pin config */
19039bd00   Takashi Iwai   [ALSA] Add Intel ...
3547

bcecd9bd9   Jiang Zhe   [ALSA] hda-codec ...
3548
3549
3550
  	/* If we have no real line-out pin and multiple hp-outs, HPs should
  	 * be set up as multi-channel outputs.
  	 */
8af3aeb49   Takashi Iwai   ALSA: hda - Fix d...
3551
  	if (is_dual_headphones(codec)) {
bcecd9bd9   Jiang Zhe   [ALSA] hda-codec ...
3552
3553
3554
3555
  		/* Copy hp_outs to line_outs, backup line_outs in
  		 * speaker_outs so that the following routines can handle
  		 * HP pins as primary outputs.
  		 */
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
3556
3557
  		snd_printdd("stac92xx: Enabling multi-HPs workaround
  ");
bcecd9bd9   Jiang Zhe   [ALSA] hda-codec ...
3558
3559
3560
3561
3562
3563
  		memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
  		       sizeof(spec->autocfg.line_out_pins));
  		spec->autocfg.speaker_outs = spec->autocfg.line_outs;
  		memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
  		       sizeof(spec->autocfg.hp_pins));
  		spec->autocfg.line_outs = spec->autocfg.hp_outs;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
3564
3565
  		spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
  		spec->autocfg.hp_outs = 0;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3566
  		hp_swap = 1;
bcecd9bd9   Jiang Zhe   [ALSA] hda-codec ...
3567
  	}
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
3568
  	if (spec->autocfg.mono_out_pin) {
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
3569
3570
  		int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &
  			(AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
3571
3572
3573
3574
3575
3576
3577
3578
  		u32 caps = query_amp_caps(codec,
  				spec->autocfg.mono_out_pin, dir);
  		hda_nid_t conn_list[1];
  
  		/* get the mixer node and then the mono mux if it exists */
  		if (snd_hda_get_connections(codec,
  				spec->autocfg.mono_out_pin, conn_list, 1) &&
  				snd_hda_get_connections(codec, conn_list[0],
16a433d8b   Jaroslav Kysela   ALSA: hda-intel: ...
3579
  				conn_list, 1) > 0) {
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
3580
3581
  
  				int wcaps = get_wcaps(codec, conn_list[0]);
a22d543a9   Takashi Iwai   ALSA: hda - Intro...
3582
  				int wid_type = get_wcaps_type(wcaps);
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
3583
3584
3585
3586
3587
3588
3589
3590
  				/* LR swap check, some stac925x have a mux that
   				 * changes the DACs output path instead of the
   				 * mono-mux path.
   				 */
  				if (wid_type == AC_WID_AUD_SEL &&
  						!(wcaps & AC_WCAP_LR_SWAP))
  					spec->mono_nid = conn_list[0];
  		}
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
3591
3592
3593
3594
3595
3596
3597
3598
  		if (dir) {
  			hda_nid_t nid = spec->autocfg.mono_out_pin;
  
  			/* most mono outs have a least a mute/unmute switch */
  			dir = (dir & AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
  			err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
  				"Mono Playback Switch",
  				HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
3599
3600
  			if (err < 0)
  				return err;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
  			/* check for volume support for the amp */
  			if ((caps & AC_AMPCAP_NUM_STEPS)
  					>> AC_AMPCAP_NUM_STEPS_SHIFT) {
  				err = stac92xx_add_control(spec,
  					STAC_CTL_WIDGET_VOL,
  					"Mono Playback Volume",
  				HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
  				if (err < 0)
  					return err;
  			}
09a999591   Matthew Ranostay   [ALSA] hda: Add d...
3611
3612
3613
3614
3615
  		}
  
  		stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
  					 AC_PINCTL_OUT_EN);
  	}
bcecd9bd9   Jiang Zhe   [ALSA] hda-codec ...
3616

c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
3617
3618
3619
  	if (!spec->multiout.num_dacs) {
  		err = stac92xx_auto_fill_dac_nids(codec);
  		if (err < 0)
19039bd00   Takashi Iwai   [ALSA] Add Intel ...
3620
  			return err;
c9280d681   Takashi Iwai   ALSA: hda - Fix (...
3621
3622
3623
3624
  		err = stac92xx_auto_create_multi_out_ctls(codec,
  							  &spec->autocfg);
  		if (err < 0)
  			return err;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
3625
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3626

1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
  	/* setup analog beep controls */
  	if (spec->anabeep_nid > 0) {
  		err = stac92xx_auto_create_beep_ctls(codec,
  			spec->anabeep_nid);
  		if (err < 0)
  			return err;
  	}
  
  	/* setup digital beep controls and input device */
  #ifdef CONFIG_SND_HDA_INPUT_BEEP
  	if (spec->digbeep_nid > 0) {
  		hda_nid_t nid = spec->digbeep_nid;
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
3639
  		unsigned int caps;
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
3640
3641
3642
3643
3644
3645
3646
  
  		err = stac92xx_auto_create_beep_ctls(codec, nid);
  		if (err < 0)
  			return err;
  		err = snd_hda_attach_beep_device(codec, nid);
  		if (err < 0)
  			return err;
d8d881dd2   Takashi Iwai   ALSA: hda - Fix N...
3647
3648
  		if (codec->beep) {
  			/* IDT/STAC codecs have linear beep tone parameter */
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
3649
  			codec->beep->linear_tone = spec->linear_tone_beep;
d8d881dd2   Takashi Iwai   ALSA: hda - Fix N...
3650
3651
3652
3653
3654
3655
3656
  			/* if no beep switch is available, make its own one */
  			caps = query_amp_caps(codec, nid, HDA_OUTPUT);
  			if (!(caps & AC_AMPCAP_MUTE)) {
  				err = stac92xx_beep_switch_ctl(codec);
  				if (err < 0)
  					return err;
  			}
4d4e9bb33   Takashi Iwai   ALSA: hda - Add d...
3657
  		}
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
3658
3659
  	}
  #endif
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
3660
  	err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
3661
3662
  	if (err < 0)
  		return err;
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3663
3664
3665
3666
3667
3668
3669
3670
  	/* All output parsing done, now restore the swapped hp pins */
  	if (hp_swap) {
  		memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
  		       sizeof(spec->autocfg.hp_pins));
  		spec->autocfg.hp_outs = spec->autocfg.line_outs;
  		spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
  		spec->autocfg.line_outs = 0;
  	}
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
3671

3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
3672
3673
3674
3675
3676
3677
3678
  	if (stac_check_auto_mic(codec)) {
  		spec->auto_mic = 1;
  		/* only one capture for auto-mic */
  		spec->num_adcs = 1;
  		spec->num_caps = 1;
  		spec->num_muxes = 1;
  	}
6479c6318   Takashi Iwai   ALSA: hda - Creat...
3679
3680
3681
3682
3683
3684
  	for (i = 0; i < spec->num_caps; i++) {
  		err = stac92xx_add_capvol_ctls(codec, spec->capvols[i],
  					       spec->capsws[i], i);
  		if (err < 0)
  			return err;
  	}
dc04d1b4d   Takashi Iwai   ALSA: hda - Creat...
3685
  	err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
0fb87bb47   Maxim Levitsky   [ALSA] hda-codec ...
3686
  	if (err < 0)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3687
  		return err;
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
3688
3689
3690
3691
3692
  	if (spec->mono_nid > 0) {
  		err = stac92xx_auto_create_mono_output_ctls(codec);
  		if (err < 0)
  			return err;
  	}
2a9c78160   Matthew Ranostay   ALSA: hda: 92hd73...
3693
  	if (spec->num_dmics > 0 && !spec->dinput_mux)
8b65727bf   Matt Porter   [ALSA] hda: add d...
3694
3695
3696
  		if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
  						&spec->autocfg)) < 0)
  			return err;
4682eee0e   Matthew Ranostay   ALSA: hda: dynami...
3697
3698
3699
3700
3701
  	if (spec->num_muxes > 0) {
  		err = stac92xx_auto_create_mux_input_ctls(codec);
  		if (err < 0)
  			return err;
  	}
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
3702
3703
3704
3705
3706
  	if (spec->num_smuxes > 0) {
  		err = stac92xx_auto_create_spdif_mux_ctls(codec);
  		if (err < 0)
  			return err;
  	}
8b65727bf   Matt Porter   [ALSA] hda: add d...
3707

e3c759646   Takashi Iwai   ALSA: hda - Creat...
3708
3709
3710
  	err = stac92xx_add_input_source(spec);
  	if (err < 0)
  		return err;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3711
  	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
403d19446   Matt Porter   [ALSA] hda-codec ...
3712
  	if (spec->multiout.max_channels > 2)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3713
  		spec->surr_switch = 1;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3714

9009b0e41   Charles Chin   ALSA: hda/sigmate...
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
  	/* find digital out and in converters */
  	for (i = codec->start_nid; i < codec->start_nid + codec->num_nodes; i++) {
  		unsigned int wid_caps = get_wcaps(codec, i);
  		if (wid_caps & AC_WCAP_DIGITAL) {
  			switch (get_wcaps_type(wid_caps)) {
  			case AC_WID_AUD_OUT:
  				if (!dig_out)
  					dig_out = i;
  				break;
  			case AC_WID_AUD_IN:
  				if (!dig_in)
  					dig_in = i;
  				break;
  			}
  		}
  	}
0852d7a65   Takashi Iwai   ALSA: hda - Detec...
3731
  	if (spec->autocfg.dig_outs)
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
3732
  		spec->multiout.dig_out_nid = dig_out;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
3733
  	if (dig_in && spec->autocfg.dig_in_pin)
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
3734
  		spec->dig_in_nid = dig_in;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3735

603c40199   Takashi Iwai   ALSA: hda - Use g...
3736
3737
  	if (spec->kctls.list)
  		spec->mixers[spec->num_mixers++] = spec->kctls.list;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3738
3739
  
  	spec->input_mux = &spec->private_imux;
f8ccbf65a   Matthew Ranostay   ALSA: hda: dinput...
3740
3741
  	if (!spec->dinput_mux)
  		spec->dinput_mux = &spec->private_dimux;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
3742
  	spec->sinput_mux = &spec->private_smux;
b22b48214   Matthew Ranostay   [ALSA] hda: Mono ...
3743
  	spec->mono_mux = &spec->private_mono_mux;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3744
3745
  	return 1;
  }
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
3746
3747
3748
3749
3750
  /* add playback controls for HP output */
  static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
  					struct auto_pin_cfg *cfg)
  {
  	struct sigmatel_spec *spec = codec->spec;
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
3751
  	hda_nid_t pin = cfg->hp_pins[0];
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
3752
3753
3754
  
  	if (! pin)
  		return 0;
e35d9d6a1   Takashi Iwai   ALSA: hda - Check...
3755
  	if (is_jack_detectable(codec, pin))
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
3756
  		spec->hp_detect = 1;
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
3757
3758
3759
  
  	return 0;
  }
160ea0dc6   Richard Fish   [ALSA] [snd-intel...
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
  /* add playback controls for LFE output */
  static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
  					struct auto_pin_cfg *cfg)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	int err;
  	hda_nid_t lfe_pin = 0x0;
  	int i;
  
  	/*
  	 * search speaker outs and line outs for a mono speaker pin
  	 * with an amp.  If one is found, add LFE controls
  	 * for it.
  	 */
  	for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
  		hda_nid_t pin = spec->autocfg.speaker_pins[i];
64ed0dfd1   Takashi Iwai   [ALSA] hda-codec ...
3776
  		unsigned int wcaps = get_wcaps(codec, pin);
160ea0dc6   Richard Fish   [ALSA] [snd-intel...
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
  		wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
  		if (wcaps == AC_WCAP_OUT_AMP)
  			/* found a mono speaker with an amp, must be lfe */
  			lfe_pin = pin;
  	}
  
  	/* if speaker_outs is 0, then speakers may be in line_outs */
  	if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
  		for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
  			hda_nid_t pin = spec->autocfg.line_out_pins[i];
64ed0dfd1   Takashi Iwai   [ALSA] hda-codec ...
3787
  			unsigned int defcfg;
330ee9957   Takashi Iwai   ALSA: hda - Remov...
3788
  			defcfg = snd_hda_codec_get_pincfg(codec, pin);
8b5517851   Harvey Harrison   [ALSA] sound: pat...
3789
  			if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
64ed0dfd1   Takashi Iwai   [ALSA] hda-codec ...
3790
  				unsigned int wcaps = get_wcaps(codec, pin);
160ea0dc6   Richard Fish   [ALSA] [snd-intel...
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
  				wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
  				if (wcaps == AC_WCAP_OUT_AMP)
  					/* found a mono speaker with an amp,
  					   must be lfe */
  					lfe_pin = pin;
  			}
  		}
  	}
  
  	if (lfe_pin) {
7c7767ebe   Takashi Iwai   ALSA: hda - Halve...
3801
  		err = create_controls(codec, "LFE", lfe_pin, 1);
160ea0dc6   Richard Fish   [ALSA] [snd-intel...
3802
3803
3804
3805
3806
3807
  		if (err < 0)
  			return err;
  	}
  
  	return 0;
  }
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3808
3809
3810
3811
  static int stac9200_parse_auto_config(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	int err;
df694daa3   Kailang Yang   [ALSA] hda-codec ...
3812
  	if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3813
3814
3815
3816
  		return err;
  
  	if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
  		return err;
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
3817
3818
  	if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
  		return err;
160ea0dc6   Richard Fish   [ALSA] [snd-intel...
3819
3820
  	if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
  		return err;
355a0ec47   Takashi Iwai   ALSA: hda - Add m...
3821
3822
3823
3824
3825
  	if (spec->num_muxes > 0) {
  		err = stac92xx_auto_create_mux_input_ctls(codec);
  		if (err < 0)
  			return err;
  	}
e3c759646   Takashi Iwai   ALSA: hda - Creat...
3826
3827
3828
  	err = stac92xx_add_input_source(spec);
  	if (err < 0)
  		return err;
0852d7a65   Takashi Iwai   ALSA: hda - Detec...
3829
  	if (spec->autocfg.dig_outs)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3830
  		spec->multiout.dig_out_nid = 0x05;
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
3831
  	if (spec->autocfg.dig_in_pin)
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3832
  		spec->dig_in_nid = 0x04;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3833

603c40199   Takashi Iwai   ALSA: hda - Use g...
3834
3835
  	if (spec->kctls.list)
  		spec->mixers[spec->num_mixers++] = spec->kctls.list;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3836
3837
  
  	spec->input_mux = &spec->private_imux;
8b65727bf   Matt Porter   [ALSA] hda: add d...
3838
  	spec->dinput_mux = &spec->private_dimux;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3839
3840
3841
  
  	return 1;
  }
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3842
3843
3844
3845
  /*
   * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
   * funky external mute control using GPIO pins.
   */
76e1ddfbd   Takashi Iwai   [ALSA] hda-code -...
3846
  static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
3847
  			  unsigned int dir_mask, unsigned int data)
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3848
3849
  {
  	unsigned int gpiostate, gpiomask, gpiodir;
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
3850
3851
  	snd_printdd("%s msk %x dir %x gpio %x
  ", __func__, mask, dir_mask, data);
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3852
3853
  	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
  				       AC_VERB_GET_GPIO_DATA, 0);
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
3854
  	gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3855
3856
3857
  
  	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
  				      AC_VERB_GET_GPIO_MASK, 0);
76e1ddfbd   Takashi Iwai   [ALSA] hda-code -...
3858
  	gpiomask |= mask;
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3859
3860
3861
  
  	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
  				     AC_VERB_GET_GPIO_DIRECTION, 0);
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
3862
  	gpiodir |= dir_mask;
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3863

76e1ddfbd   Takashi Iwai   [ALSA] hda-code -...
3864
  	/* Configure GPIOx as CMOS */
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3865
3866
3867
3868
  	snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
  
  	snd_hda_codec_write(codec, codec->afg, 0,
  			    AC_VERB_SET_GPIO_MASK, gpiomask);
76e1ddfbd   Takashi Iwai   [ALSA] hda-code -...
3869
3870
  	snd_hda_codec_read(codec, codec->afg, 0,
  			   AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3871
3872
  
  	msleep(1);
76e1ddfbd   Takashi Iwai   [ALSA] hda-code -...
3873
3874
  	snd_hda_codec_read(codec, codec->afg, 0,
  			   AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
62fe78e90   Sam Revitch   [ALSA] hda-codec ...
3875
  }
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
3876
  static int stac_add_event(struct hda_codec *codec, hda_nid_t nid,
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
3877
  			  unsigned char type, int data)
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
3878
  {
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
3879
  	struct hda_jack_tbl *event;
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
3880

3a93897ea   Takashi Iwai   ALSA: hda - Manag...
3881
  	event = snd_hda_jack_tbl_new(codec, nid);
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
3882
3883
  	if (!event)
  		return -ENOMEM;
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
3884
3885
  	event->action = type;
  	event->private_data = data;
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
3886

3a93897ea   Takashi Iwai   ALSA: hda - Manag...
3887
  	return 0;
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
3888
  }
62558ce15   Takashi Iwai   ALSA: hda - Avoid...
3889
3890
3891
3892
3893
3894
  /* check if given nid is a valid pin and no other events are assigned
   * to it.  If OK, assign the event, set the unsol flag, and returns 1.
   * Otherwise, returns zero.
   */
  static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
  			     unsigned int type)
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
3895
  {
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
3896
  	struct hda_jack_tbl *event;
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
3897

e35d9d6a1   Takashi Iwai   ALSA: hda - Check...
3898
  	if (!is_jack_detectable(codec, nid))
62558ce15   Takashi Iwai   ALSA: hda - Avoid...
3899
  		return 0;
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
3900
3901
3902
3903
3904
3905
3906
  	event = snd_hda_jack_tbl_new(codec, nid);
  	if (!event)
  		return -ENOMEM;
  	if (event->action && event->action != type)
  		return 0;
  	event->action = type;
  	snd_hda_jack_detect_enable(codec, nid, 0);
62558ce15   Takashi Iwai   ALSA: hda - Avoid...
3907
  	return 1;
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
3908
  }
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
3909
3910
3911
3912
3913
3914
3915
3916
3917
  static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
  {
  	int i;
  	for (i = 0; i < cfg->hp_outs; i++)
  		if (cfg->hp_pins[i] == nid)
  			return 1; /* nid is a HP-Out */
  
  	return 0; /* nid is not a HP-Out */
  };
b76c850fb   Matthew Ranostay   [ALSA] hda: STAC9...
3918
3919
3920
3921
3922
  static void stac92xx_power_down(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  
  	/* power down inactive DACs */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
3923
  	const hda_nid_t *dac;
b76c850fb   Matthew Ranostay   [ALSA] hda: STAC9...
3924
  	for (dac = spec->dac_list; *dac; dac++)
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
3925
  		if (!check_all_dac_nids(spec, *dac))
8c2f767bf   Takashi Iwai   ALSA: hda - Remov...
3926
  			snd_hda_codec_write(codec, *dac, 0,
b76c850fb   Matthew Ranostay   [ALSA] hda: STAC9...
3927
3928
  					AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
  }
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
3929
3930
  static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
  				  int enable);
014c41fce   Takashi Iwai   ALSA: hda - Use s...
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
  static inline int get_int_hint(struct hda_codec *codec, const char *key,
  			       int *valp)
  {
  	const char *p;
  	p = snd_hda_get_hint(codec, key);
  	if (p) {
  		unsigned long val;
  		if (!strict_strtoul(p, 0, &val)) {
  			*valp = val;
  			return 1;
  		}
  	}
  	return 0;
  }
6565e4fac   Takashi Iwai   ALSA: hda - Add m...
3945
3946
3947
3948
  /* override some hints from the hwdep entry */
  static void stac_store_hints(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
6565e4fac   Takashi Iwai   ALSA: hda - Add m...
3949
3950
3951
3952
3953
  	int val;
  
  	val = snd_hda_get_bool_hint(codec, "hp_detect");
  	if (val >= 0)
  		spec->hp_detect = val;
014c41fce   Takashi Iwai   ALSA: hda - Use s...
3954
  	if (get_int_hint(codec, "gpio_mask", &spec->gpio_mask)) {
6565e4fac   Takashi Iwai   ALSA: hda - Add m...
3955
3956
3957
  		spec->eapd_mask = spec->gpio_dir = spec->gpio_data =
  			spec->gpio_mask;
  	}
014c41fce   Takashi Iwai   ALSA: hda - Use s...
3958
3959
3960
3961
3962
3963
3964
3965
  	if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir))
  		spec->gpio_mask &= spec->gpio_mask;
  	if (get_int_hint(codec, "gpio_data", &spec->gpio_data))
  		spec->gpio_dir &= spec->gpio_mask;
  	if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask))
  		spec->eapd_mask &= spec->gpio_mask;
  	if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute))
  		spec->gpio_mute &= spec->gpio_mask;
6565e4fac   Takashi Iwai   ALSA: hda - Add m...
3966
3967
3968
  	val = snd_hda_get_bool_hint(codec, "eapd_switch");
  	if (val >= 0)
  		spec->eapd_switch = val;
014c41fce   Takashi Iwai   ALSA: hda - Use s...
3969
3970
  	get_int_hint(codec, "gpio_led_polarity", &spec->gpio_led_polarity);
  	if (get_int_hint(codec, "gpio_led", &spec->gpio_led)) {
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
3971
3972
3973
3974
  		spec->gpio_mask |= spec->gpio_led;
  		spec->gpio_dir |= spec->gpio_led;
  		if (spec->gpio_led_polarity)
  			spec->gpio_data |= spec->gpio_led;
043958e60   Takashi Iwai   ALSA: hda - Add m...
3975
  	}
6565e4fac   Takashi Iwai   ALSA: hda - Add m...
3976
  }
f2cbba760   Takashi Iwai   ALSA: hda - Fix t...
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
  static void stac_issue_unsol_events(struct hda_codec *codec, int num_pins,
  				    const hda_nid_t *pins)
  {
  	while (num_pins--)
  		stac_issue_unsol_event(codec, *pins++);
  }
  
  /* fake event to set up pins */
  static void stac_fake_hp_events(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  
  	if (spec->autocfg.hp_outs)
  		stac_issue_unsol_events(codec, spec->autocfg.hp_outs,
  					spec->autocfg.hp_pins);
  	if (spec->autocfg.line_outs &&
  	    spec->autocfg.line_out_pins[0] != spec->autocfg.hp_pins[0])
  		stac_issue_unsol_events(codec, spec->autocfg.line_outs,
  					spec->autocfg.line_out_pins);
  }
c7d4b2fa3   Matt   [ALSA] hda-codec ...
3997
3998
3999
  static int stac92xx_init(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
4000
  	struct auto_pin_cfg *cfg = &spec->autocfg;
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4001
  	unsigned int gpio;
e4973e1e5   Takashi Iwai   ALSA: hda - Creat...
4002
  	int i;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4003

c7d4b2fa3   Matt   [ALSA] hda-codec ...
4004
  	snd_hda_sequence_write(codec, spec->init);
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
4005
4006
4007
  	/* power down adcs initially */
  	if (spec->powerdown_adcs)
  		for (i = 0; i < spec->num_adcs; i++)
8c2f767bf   Takashi Iwai   ALSA: hda - Remov...
4008
  			snd_hda_codec_write(codec,
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
4009
4010
  				spec->adc_nids[i], 0,
  				AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4011

6565e4fac   Takashi Iwai   ALSA: hda - Add m...
4012
4013
  	/* override some hints */
  	stac_store_hints(codec);
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4014
4015
4016
4017
4018
4019
4020
4021
  	/* set up GPIO */
  	gpio = spec->gpio_data;
  	/* turn on EAPD statically when spec->eapd_switch isn't set.
  	 * otherwise, unsol event will turn it on/off dynamically
  	 */
  	if (!spec->eapd_switch)
  		gpio |= spec->eapd_mask;
  	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio);
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
4022
4023
  	/* set up pins */
  	if (spec->hp_detect) {
505cb341e   Takashi Iwai   [ALSA] hda-codec ...
4024
  		/* Enable unsolicited responses on the HP widget */
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
4025
  		for (i = 0; i < cfg->hp_outs; i++) {
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
4026
  			hda_nid_t nid = cfg->hp_pins[i];
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
4027
  			enable_pin_detect(codec, nid, STAC_HP_EVENT);
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
4028
  		}
1c4bdf9be   Takashi Iwai   ALSA: hda - Enabl...
4029
4030
  		if (cfg->line_out_type == AUTO_PIN_LINE_OUT &&
  		    cfg->speaker_outs > 0) {
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
4031
  			/* enable pin-detect for line-outs as well */
15cfa2b3d   Takashi Iwai   ALSA: hda - Fix l...
4032
4033
  			for (i = 0; i < cfg->line_outs; i++) {
  				hda_nid_t nid = cfg->line_out_pins[i];
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
4034
4035
4036
  				enable_pin_detect(codec, nid, STAC_LO_EVENT);
  			}
  		}
0a07acafd   Takashi Iwai   [ALSA] hda-codec ...
4037
4038
4039
4040
  		/* force to enable the first line-out; the others are set up
  		 * in unsol_event
  		 */
  		stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
4041
  				AC_PINCTL_OUT_EN);
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
4042
  		/* fake event to set up pins */
f2cbba760   Takashi Iwai   ALSA: hda - Fix t...
4043
  		stac_fake_hp_events(codec);
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
4044
4045
4046
  	} else {
  		stac92xx_auto_init_multi_out(codec);
  		stac92xx_auto_init_hp_out(codec);
12dde4c6d   Takashi Iwai   ALSA: hda - Prope...
4047
4048
  		for (i = 0; i < cfg->hp_outs; i++)
  			stac_toggle_power_map(codec, cfg->hp_pins[i], 1);
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
4049
  	}
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4050
  	if (spec->auto_mic) {
15b4f296f   Takashi Iwai   ALSA: hda - Add m...
4051
  		/* initialize connection to analog input */
da2a2aaa8   Takashi Iwai   ALSA: hda - Fix O...
4052
4053
  		if (spec->dmux_nids)
  			snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
15b4f296f   Takashi Iwai   ALSA: hda - Add m...
4054
  					  AC_VERB_SET_CONNECT_SEL, 0);
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4055
4056
  		if (enable_pin_detect(codec, spec->ext_mic.pin, STAC_MIC_EVENT))
  			stac_issue_unsol_event(codec, spec->ext_mic.pin);
9907790aa   Charles Chin   ALSA: hda - Fix a...
4057
4058
4059
  		if (enable_pin_detect(codec, spec->dock_mic.pin,
  		    STAC_MIC_EVENT))
  			stac_issue_unsol_event(codec, spec->dock_mic.pin);
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4060
  	}
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
4061
4062
4063
4064
  	for (i = 0; i < cfg->num_inputs; i++) {
  		hda_nid_t nid = cfg->inputs[i].pin;
  		int type = cfg->inputs[i].type;
  		unsigned int pinctl, conf;
86e2959a1   Takashi Iwai   ALSA: hda - Remov...
4065
  		if (type == AUTO_PIN_MIC) {
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
  			/* for mic pins, force to initialize */
  			pinctl = stac92xx_get_default_vref(codec, nid);
  			pinctl |= AC_PINCTL_IN_EN;
  			stac92xx_auto_set_pinctl(codec, nid, pinctl);
  		} else {
  			pinctl = snd_hda_codec_read(codec, nid, 0,
  					AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  			/* if PINCTL already set then skip */
  			/* Also, if both INPUT and OUTPUT are set,
  			 * it must be a BIOS bug; need to override, too
  			 */
  			if (!(pinctl & AC_PINCTL_IN_EN) ||
  			    (pinctl & AC_PINCTL_OUT_EN)) {
  				pinctl &= ~AC_PINCTL_OUT_EN;
12dde4c6d   Takashi Iwai   ALSA: hda - Prope...
4080
4081
  				pinctl |= AC_PINCTL_IN_EN;
  				stac92xx_auto_set_pinctl(codec, nid, pinctl);
4f1e6bc36   Takashi Iwai   ALSA: hda - Fix i...
4082
  			}
c960a03be   Takashi Iwai   [ALSA] hda-codec ...
4083
  		}
eea7dc932   Takashi Iwai   ALSA: hda - Use n...
4084
4085
4086
4087
4088
  		conf = snd_hda_codec_get_pincfg(codec, nid);
  		if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) {
  			if (enable_pin_detect(codec, nid, STAC_INSERT_EVENT))
  				stac_issue_unsol_event(codec, nid);
  		}
82bc955f6   Takashi Iwai   [ALSA] hda-codec ...
4089
  	}
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4090
4091
4092
  	for (i = 0; i < spec->num_dmics; i++)
  		stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
  					AC_PINCTL_IN_EN);
0852d7a65   Takashi Iwai   ALSA: hda - Detec...
4093
4094
  	if (cfg->dig_out_pins[0])
  		stac92xx_auto_set_pinctl(codec, cfg->dig_out_pins[0],
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4095
4096
4097
4098
  					 AC_PINCTL_OUT_EN);
  	if (cfg->dig_in_pin)
  		stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
  					 AC_PINCTL_IN_EN);
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4099
  	for (i = 0; i < spec->num_pwrs; i++)  {
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4100
4101
  		hda_nid_t nid = spec->pwr_nids[i];
  		int pinctl, def_conf;
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4102

eb6321286   Takashi Iwai   ALSA: hda - Power...
4103
  		/* power on when no jack detection is available */
542c9a0a2   Takashi Iwai   ALSA: hda - Avoid...
4104
4105
  		/* or when the VREF is used for controlling LED */
  		if (!spec->hp_detect ||
a02042836   Takashi Iwai   ALSA: hda - Fix r...
4106
  		    spec->vref_mute_led_nid == nid) {
eb6321286   Takashi Iwai   ALSA: hda - Power...
4107
4108
4109
4110
4111
  			stac_toggle_power_map(codec, nid, 1);
  			continue;
  		}
  
  		if (is_nid_hp_pin(cfg, nid))
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4112
4113
4114
4115
  			continue; /* already has an unsol event */
  
  		pinctl = snd_hda_codec_read(codec, nid, 0,
  					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4116
4117
4118
4119
  		/* outputs are only ports capable of power management
  		 * any attempts on powering down a input port cause the
  		 * referenced VREF to act quirky.
  		 */
eb6321286   Takashi Iwai   ALSA: hda - Power...
4120
4121
  		if (pinctl & AC_PINCTL_IN_EN) {
  			stac_toggle_power_map(codec, nid, 1);
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4122
  			continue;
eb6321286   Takashi Iwai   ALSA: hda - Power...
4123
  		}
330ee9957   Takashi Iwai   ALSA: hda - Remov...
4124
  		def_conf = snd_hda_codec_get_pincfg(codec, nid);
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4125
  		def_conf = get_defcfg_connect(def_conf);
aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
4126
4127
  		/* skip any ports that don't have jacks since presence
   		 * detection is useless */
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4128
4129
4130
  		if (def_conf != AC_JACK_PORT_COMPLEX) {
  			if (def_conf != AC_JACK_PORT_NONE)
  				stac_toggle_power_map(codec, nid, 1);
bce6c2b5b   Matthew Ranostay   [ALSA] hda: disab...
4131
  			continue;
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4132
  		}
afef2cfa0   Charles Chin   ALSA: hda - pwr_n...
4133
  		if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) {
62558ce15   Takashi Iwai   ALSA: hda - Avoid...
4134
  			stac_issue_unsol_event(codec, nid);
afef2cfa0   Charles Chin   ALSA: hda - pwr_n...
4135
4136
4137
4138
  			continue;
  		}
  		/* none of the above, turn the port OFF */
  		stac_toggle_power_map(codec, nid, 0);
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4139
  	}
c21bd0254   Takashi Iwai   ALSA: hda - Merge...
4140

01a61e12b   Takashi Iwai   ALSA: hda - Creat...
4141
  	snd_hda_jack_report_sync(codec);
c21bd0254   Takashi Iwai   ALSA: hda - Merge...
4142
  	/* sync mute LED */
9e5341b92   Takashi Iwai   ALSA: hda - Intro...
4143
4144
  	if (spec->gpio_led)
  		hda_call_check_power_status(codec, 0x01);
b76c850fb   Matthew Ranostay   [ALSA] hda: STAC9...
4145
4146
  	if (spec->dac_list)
  		stac92xx_power_down(codec);
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4147
4148
  	return 0;
  }
603c40199   Takashi Iwai   ALSA: hda - Use g...
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
  static void stac92xx_free_kctls(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  
  	if (spec->kctls.list) {
  		struct snd_kcontrol_new *kctl = spec->kctls.list;
  		int i;
  		for (i = 0; i < spec->kctls.used; i++)
  			kfree(kctl[i].name);
  	}
  	snd_array_free(&spec->kctls);
  }
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
  static void stac92xx_shutup_pins(struct hda_codec *codec)
  {
  	unsigned int i, def_conf;
  
  	if (codec->bus->shutdown)
  		return;
  	for (i = 0; i < codec->init_pins.used; i++) {
  		struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
  		def_conf = snd_hda_codec_get_pincfg(codec, pin->nid);
  		if (get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)
  			snd_hda_codec_write(codec, pin->nid, 0,
  				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
  	}
  }
167eae5a1   Takashi Iwai   ALSA: hda - Reset...
4175
4176
4177
  static void stac92xx_shutup(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
167eae5a1   Takashi Iwai   ALSA: hda - Reset...
4178

45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4179
  	stac92xx_shutup_pins(codec);
167eae5a1   Takashi Iwai   ALSA: hda - Reset...
4180
4181
4182
4183
4184
4185
  
  	if (spec->eapd_mask)
  		stac_gpio_set(codec, spec->gpio_mask,
  				spec->gpio_dir, spec->gpio_data &
  				~spec->eapd_mask);
  }
2f2f4251c   Matt   [ALSA] add sigmat...
4186
4187
  static void stac92xx_free(struct hda_codec *codec)
  {
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4188
  	struct sigmatel_spec *spec = codec->spec;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4189
4190
4191
  
  	if (! spec)
  		return;
167eae5a1   Takashi Iwai   ALSA: hda - Reset...
4192
  	stac92xx_shutup(codec);
11b44bbde   Richard Fish   [ALSA] hda-codec ...
4193

c7d4b2fa3   Matt   [ALSA] hda-codec ...
4194
  	kfree(spec);
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
4195
  	snd_hda_detach_beep_device(codec);
2f2f4251c   Matt   [ALSA] add sigmat...
4196
  }
4e55096e2   Matt   [ALSA] hda: add s...
4197
4198
4199
  static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
  				unsigned int flag)
  {
8ce841982   Takashi Iwai   ALSA: hda - Avoid...
4200
4201
4202
  	unsigned int old_ctl, pin_ctl;
  
  	pin_ctl = snd_hda_codec_read(codec, nid,
4e55096e2   Matt   [ALSA] hda: add s...
4203
  			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
4204

f9acba434   Takashi Iwai   [ALSA] hda-codec ...
4205
4206
4207
4208
4209
4210
4211
  	if (pin_ctl & AC_PINCTL_IN_EN) {
  		/*
  		 * we need to check the current set-up direction of
  		 * shared input pins since they can be switched via
  		 * "xxx as Output" mixer switch
  		 */
  		struct sigmatel_spec *spec = codec->spec;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
4212
  		if (nid == spec->line_switch || nid == spec->mic_switch)
f9acba434   Takashi Iwai   [ALSA] hda-codec ...
4213
4214
  			return;
  	}
8ce841982   Takashi Iwai   ALSA: hda - Avoid...
4215
  	old_ctl = pin_ctl;
7b0438999   Steve Longerbeam   [ALSA] hda-codec ...
4216
4217
4218
4219
4220
  	/* if setting pin direction bits, clear the current
  	   direction bits first */
  	if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
  		pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
  	
8ce841982   Takashi Iwai   ALSA: hda - Avoid...
4221
4222
4223
4224
4225
  	pin_ctl |= flag;
  	if (old_ctl != pin_ctl)
  		snd_hda_codec_write_cache(codec, nid, 0,
  					  AC_VERB_SET_PIN_WIDGET_CONTROL,
  					  pin_ctl);
4e55096e2   Matt   [ALSA] hda: add s...
4226
4227
4228
4229
4230
4231
4232
  }
  
  static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
  				  unsigned int flag)
  {
  	unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
  			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
8ce841982   Takashi Iwai   ALSA: hda - Avoid...
4233
4234
4235
4236
  	if (pin_ctl & flag)
  		snd_hda_codec_write_cache(codec, nid, 0,
  					  AC_VERB_SET_PIN_WIDGET_CONTROL,
  					  pin_ctl & ~flag);
4e55096e2   Matt   [ALSA] hda: add s...
4237
  }
d56757abc   Takashi Iwai   ALSA: hda - Repla...
4238
  static inline int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
4239
4240
4241
  {
  	if (!nid)
  		return 0;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
4242
  	return snd_hda_jack_detect(codec, nid);
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
4243
  }
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
  static void stac92xx_line_out_detect(struct hda_codec *codec,
  				     int presence)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct auto_pin_cfg *cfg = &spec->autocfg;
  	int i;
  
  	for (i = 0; i < cfg->line_outs; i++) {
  		if (presence)
  			break;
  		presence = get_pin_presence(codec, cfg->line_out_pins[i]);
  		if (presence) {
  			unsigned int pinctl;
  			pinctl = snd_hda_codec_read(codec,
  						    cfg->line_out_pins[i], 0,
  					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  			if (pinctl & AC_PINCTL_IN_EN)
  				presence = 0; /* mic- or line-input */
  		}
  	}
  
  	if (presence) {
  		/* disable speakers */
  		for (i = 0; i < cfg->speaker_outs; i++)
  			stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
  						AC_PINCTL_OUT_EN);
  		if (spec->eapd_mask && spec->eapd_switch)
  			stac_gpio_set(codec, spec->gpio_mask,
  				spec->gpio_dir, spec->gpio_data &
  				~spec->eapd_mask);
  	} else {
  		/* enable speakers */
  		for (i = 0; i < cfg->speaker_outs; i++)
  			stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
  						AC_PINCTL_OUT_EN);
  		if (spec->eapd_mask && spec->eapd_switch)
  			stac_gpio_set(codec, spec->gpio_mask,
  				spec->gpio_dir, spec->gpio_data |
  				spec->eapd_mask);
  	}
  } 
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4285
4286
4287
4288
4289
4290
4291
4292
  /* return non-zero if the hp-pin of the given array index isn't
   * a jack-detection target
   */
  static int no_hp_sensing(struct sigmatel_spec *spec, int i)
  {
  	struct auto_pin_cfg *cfg = &spec->autocfg;
  
  	/* ignore sensing of shared line and mic jacks */
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
4293
  	if (cfg->hp_pins[i] == spec->line_switch)
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4294
  		return 1;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
4295
  	if (cfg->hp_pins[i] == spec->mic_switch)
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4296
4297
4298
4299
4300
4301
  		return 1;
  	/* ignore if the pin is set as line-out */
  	if (cfg->hp_pins[i] == spec->hp_switch)
  		return 1;
  	return 0;
  }
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
4302
  static void stac92xx_hp_detect(struct hda_codec *codec)
4e55096e2   Matt   [ALSA] hda: add s...
4303
4304
4305
4306
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct auto_pin_cfg *cfg = &spec->autocfg;
  	int i, presence;
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
4307
  	presence = 0;
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
4308
4309
4310
  	if (spec->gpio_mute)
  		presence = !(snd_hda_codec_read(codec, codec->afg, 0,
  			AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
4311
  	for (i = 0; i < cfg->hp_outs; i++) {
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
4312
4313
  		if (presence)
  			break;
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4314
4315
  		if (no_hp_sensing(spec, i))
  			continue;
e6e3ea25b   Takashi Iwai   ALSA: hda - Fix p...
4316
4317
4318
4319
4320
4321
4322
4323
  		presence = get_pin_presence(codec, cfg->hp_pins[i]);
  		if (presence) {
  			unsigned int pinctl;
  			pinctl = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
  					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
  			if (pinctl & AC_PINCTL_IN_EN)
  				presence = 0; /* mic- or line-input */
  		}
eb06ed8f4   Takashi Iwai   [ALSA] hda-codec ...
4324
  	}
4e55096e2   Matt   [ALSA] hda: add s...
4325
4326
  
  	if (presence) {
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4327
  		/* disable lineouts */
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
4328
  		if (spec->hp_switch)
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4329
4330
  			stac92xx_reset_pinctl(codec, spec->hp_switch,
  					      AC_PINCTL_OUT_EN);
4e55096e2   Matt   [ALSA] hda: add s...
4331
4332
4333
  		for (i = 0; i < cfg->line_outs; i++)
  			stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
  						AC_PINCTL_OUT_EN);
4e55096e2   Matt   [ALSA] hda: add s...
4334
  	} else {
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4335
  		/* enable lineouts */
7c2ba97b8   Matthew Ranostay   [ALSA] hda: Add 5...
4336
  		if (spec->hp_switch)
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4337
4338
  			stac92xx_set_pinctl(codec, spec->hp_switch,
  					    AC_PINCTL_OUT_EN);
4e55096e2   Matt   [ALSA] hda: add s...
4339
4340
4341
  		for (i = 0; i < cfg->line_outs; i++)
  			stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
  						AC_PINCTL_OUT_EN);
4e55096e2   Matt   [ALSA] hda: add s...
4342
  	}
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
4343
  	stac92xx_line_out_detect(codec, presence);
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4344
4345
4346
4347
4348
4349
4350
  	/* toggle hp outs */
  	for (i = 0; i < cfg->hp_outs; i++) {
  		unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
  		if (no_hp_sensing(spec, i))
  			continue;
  		if (presence)
  			stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
8317e0b0c   Takashi Iwai   ALSA: hda - Don't...
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
  #if 0 /* FIXME */
  /* Resetting the pinctl like below may lead to (a sort of) regressions
   * on some devices since they use the HP pin actually for line/speaker
   * outs although the default pin config shows a different pin (that is
   * wrong and useless).
   *
   * So, it's basically a problem of default pin configs, likely a BIOS issue.
   * But, disabling the code below just works around it, and I'm too tired of
   * bug reports with such devices... 
   */
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4361
4362
  		else
  			stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
8317e0b0c   Takashi Iwai   ALSA: hda - Don't...
4363
  #endif /* FIXME */
d7a894363   Takashi Iwai   ALSA: hda - Fix I...
4364
  	}
4e55096e2   Matt   [ALSA] hda: add s...
4365
  } 
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4366
4367
  static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
  				  int enable)
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4368
4369
  {
  	struct sigmatel_spec *spec = codec->spec;
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4370
4371
4372
4373
4374
4375
4376
4377
  	unsigned int idx, val;
  
  	for (idx = 0; idx < spec->num_pwrs; idx++) {
  		if (spec->pwr_nids[idx] == nid)
  			break;
  	}
  	if (idx >= spec->num_pwrs)
  		return;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
4378

afef2cfa0   Charles Chin   ALSA: hda - pwr_n...
4379
  	idx = 1 << idx;
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4380

f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4381
4382
  	val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff;
  	if (enable)
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4383
4384
4385
4386
4387
4388
  		val &= ~idx;
  	else
  		val |= idx;
  
  	/* power down unused output ports */
  	snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
4389
  }
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4390
4391
  static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid)
  {
e6e3ea25b   Takashi Iwai   ALSA: hda - Fix p...
4392
  	stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
f73d35853   Takashi Iwai   ALSA: hda - Fix A...
4393
  }
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4394

ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
  /* get the pin connection (fixed, none, etc) */
  static unsigned int stac_get_defcfg_connect(struct hda_codec *codec, int idx)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	unsigned int cfg;
  
  	cfg = snd_hda_codec_get_pincfg(codec, spec->pin_nids[idx]);
  	return get_defcfg_connect(cfg);
  }
  
  static int stac92xx_connected_ports(struct hda_codec *codec,
2b63536f0   Takashi Iwai   ALSA: hda - Const...
4406
  				    const hda_nid_t *nids, int num_nids)
ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
  {
  	struct sigmatel_spec *spec = codec->spec;
  	int idx, num;
  	unsigned int def_conf;
  
  	for (num = 0; num < num_nids; num++) {
  		for (idx = 0; idx < spec->num_pins; idx++)
  			if (spec->pin_nids[idx] == nids[num])
  				break;
  		if (idx >= spec->num_pins)
  			break;
  		def_conf = stac_get_defcfg_connect(codec, idx);
  		if (def_conf == AC_JACK_PORT_NONE)
  			break;
  	}
  	return num;
  }
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4424
4425
4426
4427
4428
4429
4430
  static void stac92xx_mic_detect(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	struct sigmatel_mic_route *mic;
  
  	if (get_pin_presence(codec, spec->ext_mic.pin))
  		mic = &spec->ext_mic;
9907790aa   Charles Chin   ALSA: hda - Fix a...
4431
4432
  	else if (get_pin_presence(codec, spec->dock_mic.pin))
  		mic = &spec->dock_mic;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4433
4434
  	else
  		mic = &spec->int_mic;
02d333228   Takashi Iwai   ALSA: hda - Fix d...
4435
  	if (mic->dmux_idx >= 0)
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4436
4437
4438
  		snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
  					  AC_VERB_SET_CONNECT_SEL,
  					  mic->dmux_idx);
02d333228   Takashi Iwai   ALSA: hda - Fix d...
4439
  	if (mic->mux_idx >= 0)
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4440
4441
4442
4443
  		snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0,
  					  AC_VERB_SET_CONNECT_SEL,
  					  mic->mux_idx);
  }
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4444
  static void handle_unsol_event(struct hda_codec *codec,
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4445
  			       struct hda_jack_tbl *event)
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
4446
  {
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4447
  	struct sigmatel_spec *spec = codec->spec;
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4448
  	int data;
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
4449

3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4450
  	switch (event->action) {
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
4451
  	case STAC_HP_EVENT:
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
4452
  	case STAC_LO_EVENT:
16ffe32c7   Takashi Iwai   ALSA: hda - Fix l...
4453
  		stac92xx_hp_detect(codec);
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
4454
  		break;
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4455
4456
4457
4458
  	case STAC_MIC_EVENT:
  		stac92xx_mic_detect(codec);
  		break;
  	}
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4459
  	switch (event->action) {
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4460
  	case STAC_HP_EVENT:
fefd67f31   Takashi Iwai   ALSA: hda - Add l...
4461
  	case STAC_LO_EVENT:
3d21d3f7e   Takashi Iwai   ALSA: hda - Suppo...
4462
  	case STAC_MIC_EVENT:
74aeaabc3   Matthew Ranostay   ALSA: hda: add su...
4463
  	case STAC_INSERT_EVENT:
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4464
  	case STAC_PWR_EVENT:
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
4465
4466
  		if (spec->num_pwrs > 0)
  			stac92xx_pin_sense(codec, event->nid);
fd60cc897   Matthew Ranostay   ALSA: hda - Add V...
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
  
  		switch (codec->subsystem_id) {
  		case 0x103c308f:
  			if (event->nid == 0xb) {
  				int pin = AC_PINCTL_IN_EN;
  
  				if (get_pin_presence(codec, 0xa)
  						&& get_pin_presence(codec, 0xb))
  					pin |= AC_PINCTL_VREF_80;
  				if (!get_pin_presence(codec, 0xb))
  					pin |= AC_PINCTL_VREF_80;
  
  				/* toggle VREF state based on mic + hp pin
  				 * status
  				 */
  				stac92xx_auto_set_pinctl(codec, 0x0a, pin);
  			}
  		}
72474be62   Matthew Ranostay   ALSA: hda: VREF p...
4485
  		break;
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
4486
4487
4488
  	case STAC_VREF_EVENT:
  		data = snd_hda_codec_read(codec, codec->afg, 0,
  					  AC_VERB_GET_GPIO_DATA, 0);
72474be62   Matthew Ranostay   ALSA: hda: VREF p...
4489
4490
  		/* toggle VREF state based on GPIOx status */
  		snd_hda_codec_write(codec, codec->afg, 0, 0x7e0,
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4491
  				    !!(data & (1 << event->private_data)));
72474be62   Matthew Ranostay   ALSA: hda: VREF p...
4492
  		break;
314634bc8   Takashi Iwai   [ALSA] hda-codec ...
4493
4494
  	}
  }
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4495
4496
  static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid)
  {
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4497
  	struct hda_jack_tbl *event = snd_hda_jack_tbl_get(codec, nid);
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4498
4499
4500
4501
4502
4503
4504
  	if (!event)
  		return;
  	handle_unsol_event(codec, event);
  }
  
  static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
  {
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4505
  	struct hda_jack_tbl *event;
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4506
4507
4508
  	int tag;
  
  	tag = (res >> 26) & 0x7f;
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4509
  	event = snd_hda_jack_tbl_get_from_tag(codec, tag);
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4510
4511
  	if (!event)
  		return;
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
4512
  	event->jack_dirty = 1;
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4513
  	handle_unsol_event(codec, event);
01a61e12b   Takashi Iwai   ALSA: hda - Creat...
4514
  	snd_hda_jack_report_sync(codec);
1835a0f9a   Takashi Iwai   ALSA: hda - Cache...
4515
  }
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4516
4517
4518
4519
4520
  static int hp_blike_system(u32 subsystem_id);
  
  static void set_hp_led_gpio(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
07f804495   Takashi Iwai   ALSA: hda - Detec...
4521
  	unsigned int gpio;
26ebe0a28   Takashi Iwai   ALSA: hda - Fix m...
4522
4523
  	if (spec->gpio_led)
  		return;
07f804495   Takashi Iwai   ALSA: hda - Detec...
4524
4525
4526
4527
4528
4529
  	gpio = snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP);
  	gpio &= AC_GPIO_IO_COUNT;
  	if (gpio > 3)
  		spec->gpio_led = 0x08; /* GPIO 3 */
  	else
  		spec->gpio_led = 0x01; /* GPIO 0 */
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4530
  }
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
  /*
   * This method searches for the mute LED GPIO configuration
   * provided as OEM string in SMBIOS. The format of that string
   * is HP_Mute_LED_P_G or HP_Mute_LED_P
   * where P can be 0 or 1 and defines mute LED GPIO control state (low/high)
   * that corresponds to the NOT muted state of the master volume
   * and G is the index of the GPIO to use as the mute LED control (0..9)
   * If _G portion is missing it is assigned based on the codec ID
   *
   * So, HP B-series like systems may have HP_Mute_LED_0 (current models)
   * or  HP_Mute_LED_0_3 (future models) OEM SMBIOS strings
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4542
4543
4544
4545
4546
4547
4548
4549
   *
   *
   * The dv-series laptops don't seem to have the HP_Mute_LED* strings in
   * SMBIOS - at least the ones I have seen do not have them - which include
   * my own system (HP Pavilion dv6-1110ax) and my cousin's
   * HP Pavilion dv9500t CTO.
   * Need more information on whether it is true across the entire series.
   * -- kunal
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4550
   */
6a557c947   Vitaliy Kulikov   ALSA: hda - GPIO ...
4551
  static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity)
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4552
4553
4554
4555
4556
4557
4558
  {
  	struct sigmatel_spec *spec = codec->spec;
  	const struct dmi_device *dev = NULL;
  
  	if ((codec->subsystem_id >> 16) == PCI_VENDOR_ID_HP) {
  		while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
  								NULL, dev))) {
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4559
  			if (sscanf(dev->name, "HP_Mute_LED_%d_%x",
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4560
4561
  				  &spec->gpio_led_polarity,
  				  &spec->gpio_led) == 2) {
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
4562
4563
4564
4565
4566
  				unsigned int max_gpio;
  				max_gpio = snd_hda_param_read(codec, codec->afg,
  							      AC_PAR_GPIO_CAP);
  				max_gpio &= AC_GPIO_IO_COUNT;
  				if (spec->gpio_led < max_gpio)
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4567
  					spec->gpio_led = 1 << spec->gpio_led;
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
4568
4569
  				else
  					spec->vref_mute_led_nid = spec->gpio_led;
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4570
4571
4572
  				return 1;
  			}
  			if (sscanf(dev->name, "HP_Mute_LED_%d",
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4573
4574
4575
  				  &spec->gpio_led_polarity) == 1) {
  				set_hp_led_gpio(codec);
  				return 1;
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4576
  			}
e2ef36c68   Gustavo Maciel Dias Vieira   ALSA: hda: fix mu...
4577
4578
4579
4580
4581
4582
  			/* BIOS bug: unfilled OEM string */
  			if (strstr(dev->name, "HP_Mute_LED_P_G")) {
  				set_hp_led_gpio(codec);
  				spec->gpio_led_polarity = 1;
  				return 1;
  			}
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4583
  		}
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4584
4585
4586
  
  		/*
  		 * Fallback case - if we don't find the DMI strings,
6a557c947   Vitaliy Kulikov   ALSA: hda - GPIO ...
4587
4588
  		 * we statically set the GPIO - if not a B-series system
  		 * and default polarity is provided
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4589
  		 */
6a557c947   Vitaliy Kulikov   ALSA: hda - GPIO ...
4590
4591
  		if (!hp_blike_system(codec->subsystem_id) &&
  			(default_polarity == 0 || default_polarity == 1)) {
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4592
  			set_hp_led_gpio(codec);
dce17d4ff   Takashi Iwai   ALSA: hda - Fix d...
4593
  			spec->gpio_led_polarity = default_polarity;
d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
4594
4595
  			return 1;
  		}
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4596
4597
4598
4599
4600
  	}
  	return 0;
  }
  
  static int hp_blike_system(u32 subsystem_id)
78987bdc4   Randy Dunlap   ALSA: hda, move h...
4601
4602
  {
  	switch (subsystem_id) {
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4603
4604
4605
4606
4607
  	case 0x103c1520:
  	case 0x103c1521:
  	case 0x103c1523:
  	case 0x103c1524:
  	case 0x103c1525:
78987bdc4   Randy Dunlap   ALSA: hda, move h...
4608
4609
4610
4611
4612
4613
4614
4615
  	case 0x103c1722:
  	case 0x103c1723:
  	case 0x103c1724:
  	case 0x103c1725:
  	case 0x103c1726:
  	case 0x103c1727:
  	case 0x103c1728:
  	case 0x103c1729:
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
4616
4617
4618
4619
4620
4621
4622
4623
  	case 0x103c172a:
  	case 0x103c172b:
  	case 0x103c307e:
  	case 0x103c307f:
  	case 0x103c3080:
  	case 0x103c3081:
  	case 0x103c7007:
  	case 0x103c7008:
78987bdc4   Randy Dunlap   ALSA: hda, move h...
4624
4625
4626
4627
  		return 1;
  	}
  	return 0;
  }
2d34e1b3b   Takashi Iwai   ALSA: hda - Add I...
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
  #ifdef CONFIG_PROC_FS
  static void stac92hd_proc_hook(struct snd_info_buffer *buffer,
  			       struct hda_codec *codec, hda_nid_t nid)
  {
  	if (nid == codec->afg)
  		snd_iprintf(buffer, "Power-Map: 0x%02x
  ", 
  			    snd_hda_codec_read(codec, nid, 0, 0x0fec, 0x0));
  }
  
  static void analog_loop_proc_hook(struct snd_info_buffer *buffer,
  				  struct hda_codec *codec,
  				  unsigned int verb)
  {
  	snd_iprintf(buffer, "Analog Loopback: 0x%02x
  ",
  		    snd_hda_codec_read(codec, codec->afg, 0, verb, 0));
  }
  
  /* stac92hd71bxx, stac92hd73xx */
  static void stac92hd7x_proc_hook(struct snd_info_buffer *buffer,
  				 struct hda_codec *codec, hda_nid_t nid)
  {
  	stac92hd_proc_hook(buffer, codec, nid);
  	if (nid == codec->afg)
  		analog_loop_proc_hook(buffer, codec, 0xfa0);
  }
  
  static void stac9205_proc_hook(struct snd_info_buffer *buffer,
  			       struct hda_codec *codec, hda_nid_t nid)
  {
  	if (nid == codec->afg)
  		analog_loop_proc_hook(buffer, codec, 0xfe0);
  }
  
  static void stac927x_proc_hook(struct snd_info_buffer *buffer,
  			       struct hda_codec *codec, hda_nid_t nid)
  {
  	if (nid == codec->afg)
  		analog_loop_proc_hook(buffer, codec, 0xfeb);
  }
  #else
  #define stac92hd_proc_hook	NULL
  #define stac92hd7x_proc_hook	NULL
  #define stac9205_proc_hook	NULL
  #define stac927x_proc_hook	NULL
  #endif
2a43952a9   Takashi Iwai   ALSA: hda - Make ...
4675
  #ifdef CONFIG_PM
ff6fdc37f   Matt   [ALSA] hda-codec ...
4676
4677
  static int stac92xx_resume(struct hda_codec *codec)
  {
2c885878c   Takashi Iwai   ALSA: hda - Use i...
4678
  	stac92xx_init(codec);
82beb8fd3   Takashi Iwai   [ALSA] hda-codec ...
4679
4680
  	snd_hda_codec_resume_amp(codec);
  	snd_hda_codec_resume_cache(codec);
2c885878c   Takashi Iwai   ALSA: hda - Use i...
4681
  	/* fake event to set up pins again to override cached values */
f2cbba760   Takashi Iwai   ALSA: hda - Fix t...
4682
  	stac_fake_hp_events(codec);
ff6fdc37f   Matt   [ALSA] hda-codec ...
4683
4684
  	return 0;
  }
c6798d2bd   Matthew Ranostay   ALSA: hda: EAPD m...
4685

45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4686
4687
4688
4689
4690
  static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
  {
  	stac92xx_shutup(codec);
  	return 0;
  }
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
4691
  #ifdef CONFIG_SND_HDA_POWER_SAVE
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4692
4693
4694
4695
4696
  static int stac92xx_pre_resume(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  
  	/* sync mute LED */
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
4697
4698
4699
4700
4701
4702
  	if (spec->vref_mute_led_nid)
  		stac_vrefout_set(codec, spec->vref_mute_led_nid,
  				 spec->vref_led);
  	else if (spec->gpio_led)
  		stac_gpio_set(codec, spec->gpio_mask,
  			      spec->gpio_dir, spec->gpio_data);
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4703
4704
  	return 0;
  }
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4705
4706
4707
4708
4709
4710
4711
  static void stac92xx_set_power_state(struct hda_codec *codec, hda_nid_t fg,
  				unsigned int power_state)
  {
  	unsigned int afg_power_state = power_state;
  	struct sigmatel_spec *spec = codec->spec;
  
  	if (power_state == AC_PWRST_D3) {
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
4712
  		if (spec->vref_mute_led_nid) {
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
  			/* with vref-out pin used for mute led control
  			 * codec AFG is prevented from D3 state
  			 */
  			afg_power_state = AC_PWRST_D1;
  		}
  		/* this delay seems necessary to avoid click noise at power-down */
  		msleep(100);
  	}
  	snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE,
  			afg_power_state);
  	snd_hda_codec_set_power_to_all(codec, fg, power_state, true);
  }
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
4725
  /*
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
4726
4727
   * For this feature CONFIG_SND_HDA_POWER_SAVE is needed
   * as mute LED state is updated in check_power_status hook
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
4728
   */
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
4729
  static int stac92xx_update_led_status(struct hda_codec *codec)
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
4730
4731
  {
  	struct sigmatel_spec *spec = codec->spec;
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
4732
  	int i, num_ext_dacs, muted = 1;
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4733
  	unsigned int muted_lvl, notmtd_lvl;
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
4734
  	hda_nid_t nid;
6fce61aea   Takashi Iwai   ALSA: hda - Fix c...
4735

45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4736
4737
  	if (!spec->gpio_led)
  		return 0;
c21bd0254   Takashi Iwai   ALSA: hda - Merge...
4738
4739
4740
4741
4742
4743
  	for (i = 0; i < spec->multiout.num_dacs; i++) {
  		nid = spec->multiout.dac_nids[i];
  		if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
  		      HDA_AMP_MUTE)) {
  			muted = 0; /* something heard */
  			break;
5bdaaada1   Vitaliy Kulikov   ALSA: hda - Enabl...
4744
  		}
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
4745
  	}
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
  	if (muted && spec->multiout.hp_nid)
  		if (!(snd_hda_codec_amp_read(codec,
  				spec->multiout.hp_nid, 0, HDA_OUTPUT, 0) &
  					HDA_AMP_MUTE)) {
  			muted = 0; /* HP is not muted */
  		}
  	num_ext_dacs = ARRAY_SIZE(spec->multiout.extra_out_nid);
  	for (i = 0; muted && i < num_ext_dacs; i++) {
  		nid = spec->multiout.extra_out_nid[i];
  		if (nid == 0)
  			break;
  		if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
  		      HDA_AMP_MUTE)) {
  			muted = 0; /* extra output is not muted */
  		}
  	}
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4762
  	/*polarity defines *not* muted state level*/
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
4763
  	if (!spec->vref_mute_led_nid) {
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4764
4765
4766
4767
  		if (muted)
  			spec->gpio_data &= ~spec->gpio_led; /* orange */
  		else
  			spec->gpio_data |= spec->gpio_led; /* white */
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
4768

45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
  		if (!spec->gpio_led_polarity) {
  			/* LED state is inverted on these systems */
  			spec->gpio_data ^= spec->gpio_led;
  		}
  		stac_gpio_set(codec, spec->gpio_mask,
  				spec->gpio_dir, spec->gpio_data);
  	} else {
  		notmtd_lvl = spec->gpio_led_polarity ?
  				AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_GRD;
  		muted_lvl = spec->gpio_led_polarity ?
  				AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_HIZ;
  		spec->vref_led = muted ? muted_lvl : notmtd_lvl;
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
4781
4782
  		stac_vrefout_set(codec,	spec->vref_mute_led_nid,
  				 spec->vref_led);
c21bd0254   Takashi Iwai   ALSA: hda - Merge...
4783
  	}
b4e818768   Takashi Iwai   ALSA: hda - Fix m...
4784
4785
  	return 0;
  }
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
  
  /*
   * use power check for controlling mute led of HP notebooks
   */
  static int stac92xx_check_power_status(struct hda_codec *codec,
  					      hda_nid_t nid)
  {
  	stac92xx_update_led_status(codec);
  
  	return 0;
  }
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
4797
  #endif /* CONFIG_SND_HDA_POWER_SAVE */
2a43952a9   Takashi Iwai   ALSA: hda - Make ...
4798
  #endif /* CONFIG_PM */
ff6fdc37f   Matt   [ALSA] hda-codec ...
4799

2b63536f0   Takashi Iwai   ALSA: hda - Const...
4800
  static const struct hda_codec_ops stac92xx_patch_ops = {
2f2f4251c   Matt   [ALSA] add sigmat...
4801
4802
4803
4804
  	.build_controls = stac92xx_build_controls,
  	.build_pcms = stac92xx_build_pcms,
  	.init = stac92xx_init,
  	.free = stac92xx_free,
4e55096e2   Matt   [ALSA] hda: add s...
4805
  	.unsol_event = stac92xx_unsol_event,
2a43952a9   Takashi Iwai   ALSA: hda - Make ...
4806
  #ifdef CONFIG_PM
c6798d2bd   Matthew Ranostay   ALSA: hda: EAPD m...
4807
  	.suspend = stac92xx_suspend,
ff6fdc37f   Matt   [ALSA] hda-codec ...
4808
4809
  	.resume = stac92xx_resume,
  #endif
fb8d1a344   Takashi Iwai   ALSA: hda - Add r...
4810
  	.reboot_notify = stac92xx_shutup,
2f2f4251c   Matt   [ALSA] add sigmat...
4811
4812
4813
4814
4815
  };
  
  static int patch_stac9200(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4816
  	int err;
2f2f4251c   Matt   [ALSA] add sigmat...
4817

e560d8d83   Takashi Iwai   [ALSA] Replace wi...
4818
  	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
2f2f4251c   Matt   [ALSA] add sigmat...
4819
4820
  	if (spec == NULL)
  		return -ENOMEM;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
4821
  	codec->no_trigger_sense = 1;
2f2f4251c   Matt   [ALSA] add sigmat...
4822
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
4823
  	spec->linear_tone_beep = 1;
a4eed138a   Takashi Iwai   [ALSA] hda-codec ...
4824
  	spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
11b44bbde   Richard Fish   [ALSA] hda-codec ...
4825
  	spec->pin_nids = stac9200_pin_nids;
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
4826
4827
4828
  	spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
  							stac9200_models,
  							stac9200_cfg_tbl);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
4829
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
4830
4831
4832
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
4833
4834
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
4835
  					 stac9200_brd_tbl[spec->board_config]);
2f2f4251c   Matt   [ALSA] add sigmat...
4836
4837
4838
4839
4840
4841
  
  	spec->multiout.max_channels = 2;
  	spec->multiout.num_dacs = 1;
  	spec->multiout.dac_nids = stac9200_dac_nids;
  	spec->adc_nids = stac9200_adc_nids;
  	spec->mux_nids = stac9200_mux_nids;
dabbed6f7   Matt   [ALSA] SigmaTel H...
4842
  	spec->num_muxes = 1;
8b65727bf   Matt Porter   [ALSA] hda: add d...
4843
  	spec->num_dmics = 0;
9e05b7a3d   Maxim Levitsky   [ALSA] hda-codec ...
4844
  	spec->num_adcs = 1;
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4845
  	spec->num_pwrs = 0;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4846

58eec4235   Mauro Carvalho Chehab   ALSA: hda - More ...
4847
4848
  	if (spec->board_config == STAC_9200_M4 ||
  	    spec->board_config == STAC_9200_M4_2 ||
bf277785d   Tobin Davis   [ALSA] HDA - Add ...
4849
  	    spec->board_config == STAC_9200_OQO)
1194b5b70   Takashi Iwai   [ALSA] hda-codec ...
4850
4851
4852
  		spec->init = stac9200_eapd_init;
  	else
  		spec->init = stac9200_core_init;
2f2f4251c   Matt   [ALSA] add sigmat...
4853
  	spec->mixer = stac9200_mixer;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4854

117f257d7   Takashi Iwai   [ALSA] hda-codec ...
4855
4856
4857
4858
  	if (spec->board_config == STAC_9200_PANASONIC) {
  		spec->gpio_mask = spec->gpio_dir = 0x09;
  		spec->gpio_data = 0x00;
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
4859
4860
4861
4862
4863
  	err = stac9200_parse_auto_config(codec);
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
2f2f4251c   Matt   [ALSA] add sigmat...
4864

2acc9dcb6   Takashi Iwai   ALSA: hda - Fix s...
4865
4866
4867
4868
4869
  	/* CF-74 has no headphone detection, and the driver should *NOT*
  	 * do detection and HP/speaker toggle because the hardware does it.
  	 */
  	if (spec->board_config == STAC_9200_PANASONIC)
  		spec->hp_detect = 0;
2f2f4251c   Matt   [ALSA] add sigmat...
4870
4871
4872
4873
  	codec->patch_ops = stac92xx_patch_ops;
  
  	return 0;
  }
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4874
4875
4876
4877
4878
4879
4880
4881
  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;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
4882
  	codec->no_trigger_sense = 1;
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4883
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
4884
  	spec->linear_tone_beep = 1;
a4eed138a   Takashi Iwai   [ALSA] hda-codec ...
4885
  	spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4886
  	spec->pin_nids = stac925x_pin_nids;
9cb36c2af   Mauro Carvalho Chehab   ALSA: patch_sigma...
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
  
  	/* Check first for codec ID */
  	spec->board_config = snd_hda_check_board_codec_sid_config(codec,
  							STAC_925x_MODELS,
  							stac925x_models,
  							stac925x_codec_id_cfg_tbl);
  
  	/* Now checks for PCI ID, if codec ID is not found */
  	if (spec->board_config < 0)
  		spec->board_config = snd_hda_check_board_config(codec,
  							STAC_925x_MODELS,
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4898
4899
  							stac925x_models,
  							stac925x_cfg_tbl);
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
4900
   again:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
4901
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
4902
4903
4904
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
4905
4906
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
4907
  					 stac925x_brd_tbl[spec->board_config]);
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4908
4909
4910
4911
4912
4913
4914
  
  	spec->multiout.max_channels = 2;
  	spec->multiout.num_dacs = 1;
  	spec->multiout.dac_nids = stac925x_dac_nids;
  	spec->adc_nids = stac925x_adc_nids;
  	spec->mux_nids = stac925x_mux_nids;
  	spec->num_muxes = 1;
9e05b7a3d   Maxim Levitsky   [ALSA] hda-codec ...
4915
  	spec->num_adcs = 1;
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
4916
  	spec->num_pwrs = 0;
2c11f955b   Tobin Davis   [ALSA] HDA: Add s...
4917
4918
4919
4920
4921
  	switch (codec->vendor_id) {
  	case 0x83847632: /* STAC9202  */
  	case 0x83847633: /* STAC9202D */
  	case 0x83847636: /* STAC9251  */
  	case 0x83847637: /* STAC9251D */
f6e9852ad   Takashi Iwai   [ALSA] hda-codec ...
4922
  		spec->num_dmics = STAC925X_NUM_DMICS;
2c11f955b   Tobin Davis   [ALSA] HDA: Add s...
4923
  		spec->dmic_nids = stac925x_dmic_nids;
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
4924
4925
  		spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
  		spec->dmux_nids = stac925x_dmux_nids;
2c11f955b   Tobin Davis   [ALSA] HDA: Add s...
4926
4927
4928
4929
4930
  		break;
  	default:
  		spec->num_dmics = 0;
  		break;
  	}
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4931
4932
4933
  
  	spec->init = stac925x_core_init;
  	spec->mixer = stac925x_mixer;
6479c6318   Takashi Iwai   ALSA: hda - Creat...
4934
4935
4936
  	spec->num_caps = 1;
  	spec->capvols = stac925x_capvols;
  	spec->capsws = stac925x_capsws;
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4937

9009b0e41   Charles Chin   ALSA: hda/sigmate...
4938
  	err = stac92xx_parse_auto_config(codec);
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
  	if (!err) {
  		if (spec->board_config < 0) {
  			printk(KERN_WARNING "hda_codec: No auto-config is "
  			       "available, default to model=ref
  ");
  			spec->board_config = STAC_925x_REF;
  			goto again;
  		}
  		err = -EINVAL;
  	}
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
4949
4950
4951
4952
4953
4954
4955
4956
4957
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
  
  	codec->patch_ops = stac92xx_patch_ops;
  
  	return 0;
  }
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4958
4959
4960
4961
4962
  static int patch_stac92hd73xx(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec;
  	hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
  	int err = 0;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
4963
  	int num_dacs;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4964
4965
4966
4967
  
  	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
  	if (spec == NULL)
  		return -ENOMEM;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
4968
  	codec->no_trigger_sense = 1;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4969
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
4970
  	spec->linear_tone_beep = 0;
e99d32b32   Matthew Ranostay   ALSA: hda - add m...
4971
  	codec->slave_dig_outs = stac92hd73xx_slave_dig_outs;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4972
4973
4974
4975
4976
4977
  	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,
  							stac92hd73xx_cfg_tbl);
842ae6380   Takashi Iwai   ALSA: hda - Add s...
4978
4979
4980
4981
4982
4983
  	/* check codec subsystem id if not found */
  	if (spec->board_config < 0)
  		spec->board_config =
  			snd_hda_check_board_codec_sid_config(codec,
  				STAC_92HD73XX_MODELS, stac92hd73xx_models,
  				stac92hd73xx_codec_id_cfg_tbl);
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4984
  again:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
4985
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
4986
4987
4988
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
4989
4990
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
4991
  				stac92hd73xx_brd_tbl[spec->board_config]);
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4992

c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
4993
  	num_dacs = snd_hda_get_connections(codec, 0x0a,
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4994
  			conn, STAC92HD73_DAC_COUNT + 2) - 1;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
4995
  	if (num_dacs < 3 || num_dacs > 5) {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
4996
4997
4998
  		printk(KERN_WARNING "hda_codec: Could not determine "
  		       "number of channels defaulting to DAC count
  ");
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
4999
  		num_dacs = STAC92HD73_DAC_COUNT;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5000
  	}
e2aec1710   Takashi Iwai   ALSA: hda - Fix i...
5001
  	spec->init = stac92hd73xx_core_init;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
5002
  	switch (num_dacs) {
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5003
  	case 0x3: /* 6 Channel */
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
5004
  		spec->aloopback_ctl = stac92hd73xx_6ch_loopback;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5005
5006
  		break;
  	case 0x4: /* 8 Channel */
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
5007
  		spec->aloopback_ctl = stac92hd73xx_8ch_loopback;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5008
5009
  		break;
  	case 0x5: /* 10 Channel */
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
5010
5011
  		spec->aloopback_ctl = stac92hd73xx_10ch_loopback;
  		break;
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
5012
5013
  	}
  	spec->multiout.dac_nids = spec->dac_nids;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5014

e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5015
5016
  	spec->aloopback_mask = 0x01;
  	spec->aloopback_shift = 8;
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
5017
  	spec->digbeep_nid = 0x1c;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5018
5019
5020
5021
  	spec->mux_nids = stac92hd73xx_mux_nids;
  	spec->adc_nids = stac92hd73xx_adc_nids;
  	spec->dmic_nids = stac92hd73xx_dmic_nids;
  	spec->dmux_nids = stac92hd73xx_dmux_nids;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
5022
  	spec->smux_nids = stac92hd73xx_smux_nids;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5023
5024
5025
  
  	spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
  	spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
5026
  	spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
2a9c78160   Matthew Ranostay   ALSA: hda: 92hd73...
5027

6479c6318   Takashi Iwai   ALSA: hda - Creat...
5028
5029
5030
  	spec->num_caps = STAC92HD73XX_NUM_CAPS;
  	spec->capvols = stac92hd73xx_capvols;
  	spec->capsws = stac92hd73xx_capsws;
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
5031
  	switch (spec->board_config) {
6b3ab21ef   Matthew Ranostay   ALSA: hda: make a...
5032
  	case STAC_DELL_EQ:
d654a6603   Matthew Ranostay   [ALSA] hda: 92HD7...
5033
  		spec->init = dell_eq_core_init;
6b3ab21ef   Matthew Ranostay   ALSA: hda: make a...
5034
  		/* fallthru */
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
5035
5036
5037
  	case STAC_DELL_M6_AMIC:
  	case STAC_DELL_M6_DMIC:
  	case STAC_DELL_M6_BOTH:
2a9c78160   Matthew Ranostay   ALSA: hda: 92hd73...
5038
  		spec->num_smuxes = 0;
c0cea0d09   Matthew Ranostay   ALSA: hda: STAC_D...
5039
  		spec->eapd_switch = 0;
6b3ab21ef   Matthew Ranostay   ALSA: hda: make a...
5040

661cd8fb5   Takashi Iwai   ALSA: hda - Check...
5041
5042
  		switch (spec->board_config) {
  		case STAC_DELL_M6_AMIC: /* Analog Mics */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5043
  			snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
5044
5045
  			spec->num_dmics = 0;
  			break;
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
5046
  		case STAC_DELL_M6_DMIC: /* Digital Mics */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5047
  			snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
5048
5049
  			spec->num_dmics = 1;
  			break;
661cd8fb5   Takashi Iwai   ALSA: hda - Check...
5050
  		case STAC_DELL_M6_BOTH: /* Both */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5051
5052
  			snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
  			snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
5053
5054
5055
5056
  			spec->num_dmics = 1;
  			break;
  		}
  		break;
842ae6380   Takashi Iwai   ALSA: hda - Add s...
5057
5058
5059
5060
5061
  	case STAC_ALIENWARE_M17X:
  		spec->num_dmics = STAC92HD73XX_NUM_DMICS;
  		spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
  		spec->eapd_switch = 0;
  		break;
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
5062
5063
  	default:
  		spec->num_dmics = STAC92HD73XX_NUM_DMICS;
2a9c78160   Matthew Ranostay   ALSA: hda: 92hd73...
5064
  		spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
c0cea0d09   Matthew Ranostay   ALSA: hda: STAC_D...
5065
  		spec->eapd_switch = 1;
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
5066
  		break;
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
5067
  	}
af6ee3020   Takashi Iwai   ALSA: hda - Set d...
5068
  	if (spec->board_config != STAC_92HD73XX_REF) {
b2c4f4d71   Matthew Ranostay   ALSA: hda: 92xx S...
5069
5070
5071
5072
  		/* GPIO0 High = Enable EAPD */
  		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
  		spec->gpio_data = 0x01;
  	}
a76626401   Matthew Ranostay   [ALSA] hda: 92HDx...
5073

a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
5074
5075
  	spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
  	spec->pwr_nids = stac92hd73xx_pwr_nids;
9009b0e41   Charles Chin   ALSA: hda/sigmate...
5076
  	err = stac92xx_parse_auto_config(codec);
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
  
  	if (!err) {
  		if (spec->board_config < 0) {
  			printk(KERN_WARNING "hda_codec: No auto-config is "
  			       "available, default to model=ref
  ");
  			spec->board_config = STAC_92HD73XX_REF;
  			goto again;
  		}
  		err = -EINVAL;
  	}
  
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
9e43f0de6   Takashi Iwai   ALSA: hda - Add n...
5093
5094
  	if (spec->board_config == STAC_92HD73XX_NO_JD)
  		spec->hp_detect = 0;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5095
  	codec->patch_ops = stac92xx_patch_ops;
2d34e1b3b   Takashi Iwai   ALSA: hda - Add I...
5096
  	codec->proc_widget_hook = stac92hd7x_proc_hook;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5097
5098
  	return 0;
  }
cbbf50b22   Vitaliy Kulikov   ALSA: hda - Fix i...
5099
  static int hp_bnb2011_with_dock(struct hda_codec *codec)
335e3b868   Vitaliy Kulikov   ALSA: hda - Chang...
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
  {
  	if (codec->vendor_id != 0x111d7605 &&
  	    codec->vendor_id != 0x111d76d1)
  		return 0;
  
  	switch (codec->subsystem_id) {
  	case 0x103c1618:
  	case 0x103c1619:
  	case 0x103c161a:
  	case 0x103c161b:
  	case 0x103c161c:
  	case 0x103c161d:
  	case 0x103c161e:
  	case 0x103c161f:
335e3b868   Vitaliy Kulikov   ALSA: hda - Chang...
5114
5115
5116
5117
5118
5119
5120
5121
  
  	case 0x103c162a:
  	case 0x103c162b:
  
  	case 0x103c1630:
  	case 0x103c1631:
  
  	case 0x103c1633:
cbbf50b22   Vitaliy Kulikov   ALSA: hda - Fix i...
5122
  	case 0x103c1634:
335e3b868   Vitaliy Kulikov   ALSA: hda - Chang...
5123
  	case 0x103c1635:
335e3b868   Vitaliy Kulikov   ALSA: hda - Chang...
5124
5125
5126
5127
5128
5129
5130
  	case 0x103c3587:
  	case 0x103c3588:
  	case 0x103c3589:
  	case 0x103c358a:
  
  	case 0x103c3667:
  	case 0x103c3668:
cbbf50b22   Vitaliy Kulikov   ALSA: hda - Fix i...
5131
5132
5133
  	case 0x103c3669:
  
  		return 1;
335e3b868   Vitaliy Kulikov   ALSA: hda - Chang...
5134
5135
5136
  	}
  	return 0;
  }
699d89956   Vitaliy Kulikov   ALSA: hda - pin-a...
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
  static void stac92hd8x_add_pin(struct hda_codec *codec, hda_nid_t nid)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
  	int i;
  
  	spec->auto_pin_nids[spec->auto_pin_cnt] = nid;
  	spec->auto_pin_cnt++;
  
  	if (get_defcfg_device(def_conf) == AC_JACK_MIC_IN &&
  	    get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE) {
  		for (i = 0; i < ARRAY_SIZE(stac92hd83xxx_dmic_nids); i++) {
  			if (nid == stac92hd83xxx_dmic_nids[i]) {
  				spec->auto_dmic_nids[spec->auto_dmic_cnt] = nid;
  				spec->auto_dmic_cnt++;
  			}
  		}
  	}
  }
  
  static void stac92hd8x_add_adc(struct hda_codec *codec, hda_nid_t nid)
  {
  	struct sigmatel_spec *spec = codec->spec;
  
  	spec->auto_adc_nids[spec->auto_adc_cnt] = nid;
  	spec->auto_adc_cnt++;
  }
  
  static void stac92hd8x_add_mux(struct hda_codec *codec, hda_nid_t nid)
  {
  	int i, j;
  	struct sigmatel_spec *spec = codec->spec;
  
  	for (i = 0; i < spec->auto_adc_cnt; i++) {
  		if (get_connection_index(codec,
  				spec->auto_adc_nids[i], nid) >= 0) {
  			/* mux and volume for adc_nids[i] */
  			if (!spec->auto_mux_nids[i]) {
  				spec->auto_mux_nids[i] = nid;
  				/* 92hd codecs capture volume is in mux */
  				spec->auto_capvols[i] = HDA_COMPOSE_AMP_VAL(nid,
  							3, 0, HDA_OUTPUT);
  			}
  			for (j = 0; j < spec->auto_dmic_cnt; j++) {
  				if (get_connection_index(codec, nid,
  						spec->auto_dmic_nids[j]) >= 0) {
  					/* dmux for adc_nids[i] */
  					if (!spec->auto_dmux_nids[i])
  						spec->auto_dmux_nids[i] = nid;
  					break;
  				}
  			}
  			break;
  		}
  	}
  }
  
  static void stac92hd8x_fill_auto_spec(struct hda_codec *codec)
  {
  	hda_nid_t nid, end_nid;
  	unsigned int wid_caps, wid_type;
  	struct sigmatel_spec *spec = codec->spec;
  
  	end_nid = codec->start_nid + codec->num_nodes;
  
  	for (nid = codec->start_nid; nid < end_nid; nid++) {
  		wid_caps = get_wcaps(codec, nid);
  		wid_type = get_wcaps_type(wid_caps);
  
  		if (wid_type == AC_WID_PIN)
  			stac92hd8x_add_pin(codec, nid);
  
  		if (wid_type == AC_WID_AUD_IN && !(wid_caps & AC_WCAP_DIGITAL))
  			stac92hd8x_add_adc(codec, nid);
  	}
  
  	for (nid = codec->start_nid; nid < end_nid; nid++) {
  		wid_caps = get_wcaps(codec, nid);
  		wid_type = get_wcaps_type(wid_caps);
  
  		if (wid_type == AC_WID_AUD_SEL)
  			stac92hd8x_add_mux(codec, nid);
  	}
  
  	spec->pin_nids = spec->auto_pin_nids;
  	spec->num_pins = spec->auto_pin_cnt;
  	spec->adc_nids = spec->auto_adc_nids;
  	spec->num_adcs = spec->auto_adc_cnt;
  	spec->capvols = spec->auto_capvols;
  	spec->capsws = spec->auto_capvols;
  	spec->num_caps = spec->auto_adc_cnt;
  	spec->mux_nids = spec->auto_mux_nids;
  	spec->num_muxes = spec->auto_adc_cnt;
  	spec->dmux_nids = spec->auto_dmux_nids;
  	spec->num_dmuxes = spec->auto_adc_cnt;
  	spec->dmic_nids = spec->auto_dmic_nids;
  	spec->num_dmics = spec->auto_dmic_cnt;
  }
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5235
5236
5237
5238
5239
5240
5241
5242
  static int patch_stac92hd83xxx(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec;
  	int err;
  
  	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
  	if (spec == NULL)
  		return -ENOMEM;
cbbf50b22   Vitaliy Kulikov   ALSA: hda - Fix i...
5243
5244
5245
5246
  	if (hp_bnb2011_with_dock(codec)) {
  		snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f);
  		snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e);
  	}
a252c81a6   Takashi Iwai   ALSA: hda - use s...
5247
  	codec->no_trigger_sense = 1;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5248
  	codec->spec = spec;
699d89956   Vitaliy Kulikov   ALSA: hda - pin-a...
5249
5250
  
  	stac92hd8x_fill_auto_spec(codec);
1db7ccdb2   Takashi Iwai   ALSA: hda - Fix b...
5251
  	spec->linear_tone_beep = 0;
0ffa98075   Matthew Ranostay   ALSA: hda: digita...
5252
  	codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5253
  	spec->digbeep_nid = 0x21;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5254
  	spec->pwr_nids = stac92hd83xxx_pwr_nids;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5255
  	spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
5256
  	spec->multiout.dac_nids = spec->dac_nids;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5257
  	spec->init = stac92hd83xxx_core_init;
6479c6318   Takashi Iwai   ALSA: hda - Creat...
5258

d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5259
5260
5261
5262
5263
  	spec->board_config = snd_hda_check_board_config(codec,
  							STAC_92HD83XXX_MODELS,
  							stac92hd83xxx_models,
  							stac92hd83xxx_cfg_tbl);
  again:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5264
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
5265
5266
5267
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5268
5269
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
5270
  				stac92hd83xxx_brd_tbl[spec->board_config]);
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5271

b4e818768   Takashi Iwai   ALSA: hda - Fix m...
5272
  	codec->patch_ops = stac92xx_patch_ops;
6a557c947   Vitaliy Kulikov   ALSA: hda - GPIO ...
5273
  	if (find_mute_led_cfg(codec, -1/*no default cfg*/))
e108c7b79   Vitaliy Kulikov   ALSA: hda - Add m...
5274
5275
5276
5277
  		snd_printd("mute LED gpio %d polarity %d
  ",
  				spec->gpio_led,
  				spec->gpio_led_polarity);
b4e818768   Takashi Iwai   ALSA: hda - Fix m...
5278
5279
  #ifdef CONFIG_SND_HDA_POWER_SAVE
  	if (spec->gpio_led) {
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
5280
  		if (!spec->vref_mute_led_nid) {
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
5281
5282
5283
5284
5285
5286
  			spec->gpio_mask |= spec->gpio_led;
  			spec->gpio_dir |= spec->gpio_led;
  			spec->gpio_data |= spec->gpio_led;
  		} else {
  			codec->patch_ops.set_power_state =
  					stac92xx_set_power_state;
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
5287
5288
  		}
  		codec->patch_ops.pre_resume = stac92xx_pre_resume;
b4e818768   Takashi Iwai   ALSA: hda - Fix m...
5289
  		codec->patch_ops.check_power_status =
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
5290
  			stac92xx_check_power_status;
b4e818768   Takashi Iwai   ALSA: hda - Fix m...
5291
5292
  	}
  #endif	
9009b0e41   Charles Chin   ALSA: hda/sigmate...
5293
  	err = stac92xx_parse_auto_config(codec);
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
  	if (!err) {
  		if (spec->board_config < 0) {
  			printk(KERN_WARNING "hda_codec: No auto-config is "
  			       "available, default to model=ref
  ");
  			spec->board_config = STAC_92HD83XXX_REF;
  			goto again;
  		}
  		err = -EINVAL;
  	}
  
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
2d34e1b3b   Takashi Iwai   ALSA: hda - Add I...
5309
  	codec->proc_widget_hook = stac92hd_proc_hook;
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
5310
5311
  	return 0;
  }
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
  static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec,
  					  hda_nid_t dig0pin)
  {
  	struct sigmatel_spec *spec = codec->spec;
  	int idx;
  
  	for (idx = 0; idx < spec->num_pins; idx++)
  		if (spec->pin_nids[idx] == dig0pin)
  			break;
  	if ((idx + 2) >= spec->num_pins)
  		return 0;
  
  	/* dig1pin case */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5325
  	if (stac_get_defcfg_connect(codec, idx + 1) != AC_JACK_PORT_NONE)
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5326
5327
5328
  		return 2;
  
  	/* dig0pin + dig2pin case */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5329
  	if (stac_get_defcfg_connect(codec, idx + 2) != AC_JACK_PORT_NONE)
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5330
  		return 2;
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5331
  	if (stac_get_defcfg_connect(codec, idx) != AC_JACK_PORT_NONE)
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5332
5333
5334
5335
  		return 1;
  	else
  		return 0;
  }
75d1aeb9d   Takashi Iwai   ALSA: hda - Add B...
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
  /* HP dv7 bass switch - GPIO5 */
  #define stac_hp_bass_gpio_info	snd_ctl_boolean_mono_info
  static int stac_hp_bass_gpio_get(struct snd_kcontrol *kcontrol,
  				 struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	ucontrol->value.integer.value[0] = !!(spec->gpio_data & 0x20);
  	return 0;
  }
  
  static int stac_hp_bass_gpio_put(struct snd_kcontrol *kcontrol,
  				 struct snd_ctl_elem_value *ucontrol)
  {
  	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
  	struct sigmatel_spec *spec = codec->spec;
  	unsigned int gpio_data;
  
  	gpio_data = (spec->gpio_data & ~0x20) |
  		(ucontrol->value.integer.value[0] ? 0x20 : 0);
  	if (gpio_data == spec->gpio_data)
  		return 0;
  	spec->gpio_data = gpio_data;
  	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
  	return 1;
  }
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5362
  static const struct snd_kcontrol_new stac_hp_bass_sw_ctrl = {
75d1aeb9d   Takashi Iwai   ALSA: hda - Add B...
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
  	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  	.info = stac_hp_bass_gpio_info,
  	.get = stac_hp_bass_gpio_get,
  	.put = stac_hp_bass_gpio_put,
  };
  
  static int stac_add_hp_bass_switch(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec = codec->spec;
  
  	if (!stac_control_new(spec, &stac_hp_bass_sw_ctrl,
  			      "Bass Speaker Playback Switch", 0))
  		return -ENOMEM;
  
  	spec->gpio_mask |= 0x20;
  	spec->gpio_dir |= 0x20;
  	spec->gpio_data |= 0x20;
  	return 0;
  }
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5382
5383
5384
  static int patch_stac92hd71bxx(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec;
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5385
  	const struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;
5bdaaada1   Vitaliy Kulikov   ALSA: hda - Enabl...
5386
  	unsigned int pin_cfg;
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5387
5388
5389
5390
5391
  	int err = 0;
  
  	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
  	if (spec == NULL)
  		return -ENOMEM;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
5392
  	codec->no_trigger_sense = 1;
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5393
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
5394
  	spec->linear_tone_beep = 0;
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
5395
  	codec->patch_ops = stac92xx_patch_ops;
616f89e74   Herton Ronaldo Krzesinski   ALSA: hda - Addit...
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
  	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:
  		/* On 92HD75Bx 0x27 isn't a pin nid */
  		spec->num_pins--;
  		/* fallthrough */
  	default:
  		spec->pin_nids = stac92hd71bxx_pin_nids_6port;
  	}
aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
5410
  	spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5411
5412
5413
5414
5415
  	spec->board_config = snd_hda_check_board_config(codec,
  							STAC_92HD71BXX_MODELS,
  							stac92hd71bxx_models,
  							stac92hd71bxx_cfg_tbl);
  again:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5416
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
5417
5418
5419
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5420
5421
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
5422
  				stac92hd71bxx_brd_tbl[spec->board_config]);
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5423

fc64b26cf   Takashi Iwai   ALSA: hda - Set d...
5424
  	if (spec->board_config != STAC_92HD71BXX_REF) {
41c3b648b   Takashi Iwai   ALSA: hda - Fix G...
5425
5426
5427
5428
5429
  		/* GPIO0 = EAPD */
  		spec->gpio_mask = 0x01;
  		spec->gpio_dir = 0x01;
  		spec->gpio_data = 0x01;
  	}
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5430
5431
  	spec->dmic_nids = stac92hd71bxx_dmic_nids;
  	spec->dmux_nids = stac92hd71bxx_dmux_nids;
6479c6318   Takashi Iwai   ALSA: hda - Creat...
5432
5433
5434
  	spec->num_caps = STAC92HD71BXX_NUM_CAPS;
  	spec->capvols = stac92hd71bxx_capvols;
  	spec->capsws = stac92hd71bxx_capsws;
541eee876   Matthew Ranostay   [ALSA] hda: Added...
5435
5436
5437
  	switch (codec->vendor_id) {
  	case 0x111d76b6: /* 4 Port without Analog Mixer */
  	case 0x111d76b7:
23c7b521c   Herton Ronaldo Krzesinski   ALSA: hda - Don't...
5438
5439
  		unmute_init++;
  		/* fallthru */
541eee876   Matthew Ranostay   [ALSA] hda: Added...
5440
5441
  	case 0x111d76b4: /* 6 Port without Analog Mixer */
  	case 0x111d76b5:
541eee876   Matthew Ranostay   [ALSA] hda: Added...
5442
  		spec->init = stac92hd71bxx_core_init;
0ffa98075   Matthew Ranostay   ALSA: hda: digita...
5443
  		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
5444
  		spec->num_dmics = stac92xx_connected_ports(codec,
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5445
5446
  					stac92hd71bxx_dmic_nids,
  					STAC92HD71BXX_NUM_DMICS);
541eee876   Matthew Ranostay   [ALSA] hda: Added...
5447
  		break;
aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
5448
  	case 0x111d7608: /* 5 Port with Analog Mixer */
8e5f262bf   Takashi Iwai   ALSA: hda - Check...
5449
5450
  		switch (spec->board_config) {
  		case STAC_HP_M4:
72474be62   Matthew Ranostay   ALSA: hda: VREF p...
5451
  			/* Enable VREF power saving on GPIO1 detect */
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
5452
  			err = stac_add_event(codec, codec->afg,
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
5453
5454
5455
  					     STAC_VREF_EVENT, 0x02);
  			if (err < 0)
  				return err;
c5d08bb56   Takashi Iwai   ALSA: hda - Fix r...
5456
  			snd_hda_codec_write_cache(codec, codec->afg, 0,
72474be62   Matthew Ranostay   ALSA: hda: VREF p...
5457
  				AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
5458
  			snd_hda_jack_detect_enable(codec, codec->afg, 0);
72474be62   Matthew Ranostay   ALSA: hda: VREF p...
5459
5460
5461
  			spec->gpio_mask |= 0x02;
  			break;
  		}
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
5462
  		if ((codec->revision_id & 0xf) == 0 ||
8c2f767bf   Takashi Iwai   ALSA: hda - Remov...
5463
  		    (codec->revision_id & 0xf) == 1)
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
5464
  			spec->stream_delay = 40; /* 40 milliseconds */
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
5465

aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
5466
  		/* disable VSW */
26a279805   Takashi Iwai   ALSA: hda - Remov...
5467
  		spec->init = stac92hd71bxx_core_init;
ca8d33fc9   Matthew Ranostay   ALSA: hda: 92hd71...
5468
  		unmute_init++;
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5469
5470
  		snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
  		snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3);
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5471
  		spec->dmic_nids = stac92hd71bxx_dmic_5port_nids;
ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
5472
  		spec->num_dmics = stac92xx_connected_ports(codec,
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5473
  					stac92hd71bxx_dmic_5port_nids,
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5474
  					STAC92HD71BXX_NUM_DMICS - 1);
aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
5475
5476
  		break;
  	case 0x111d7603: /* 6 Port with Analog Mixer */
8c2f767bf   Takashi Iwai   ALSA: hda - Remov...
5477
  		if ((codec->revision_id & 0xf) == 1)
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
5478
  			spec->stream_delay = 40; /* 40 milliseconds */
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
5479

aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
5480
  		/* fallthru */
541eee876   Matthew Ranostay   [ALSA] hda: Added...
5481
  	default:
26a279805   Takashi Iwai   ALSA: hda - Remov...
5482
  		spec->init = stac92hd71bxx_core_init;
0ffa98075   Matthew Ranostay   ALSA: hda: digita...
5483
  		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
5484
  		spec->num_dmics = stac92xx_connected_ports(codec,
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5485
5486
  					stac92hd71bxx_dmic_nids,
  					STAC92HD71BXX_NUM_DMICS);
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
5487
  		break;
541eee876   Matthew Ranostay   [ALSA] hda: Added...
5488
  	}
ca8d33fc9   Matthew Ranostay   ALSA: hda: 92hd71...
5489
5490
  	if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP)
  		snd_hda_sequence_write_cache(codec, unmute_init);
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
5491
  	spec->aloopback_ctl = stac92hd71bxx_loopback;
4b33c7675   Matthew Ranostay   ALSA: hda: add mi...
5492
  	spec->aloopback_mask = 0x50;
541eee876   Matthew Ranostay   [ALSA] hda: Added...
5493
  	spec->aloopback_shift = 0;
8daaaa97d   Matthew Ranostay   ALSA: hda: 92HD75...
5494
  	spec->powerdown_adcs = 1;
1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
5495
  	spec->digbeep_nid = 0x26;
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5496
5497
  	spec->mux_nids = stac92hd71bxx_mux_nids;
  	spec->adc_nids = stac92hd71bxx_adc_nids;
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
5498
  	spec->smux_nids = stac92hd71bxx_smux_nids;
aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
5499
  	spec->pwr_nids = stac92hd71bxx_pwr_nids;
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5500
5501
5502
  
  	spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
  	spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
5207e10ed   Takashi Iwai   ALSA: hda - Integ...
5503
  	spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
6df703aef   Herton Ronaldo Krzesinski   ALSA: hda - Dynam...
5504
  	spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5505

d38cce704   Kunal Gangakhedkar   ALSA: hda - Fix m...
5506
5507
  	snd_printdd("Found board config: %d
  ", spec->board_config);
6a14f5851   Matthew Ranostay   ALSA: hda: Added ...
5508
5509
  	switch (spec->board_config) {
  	case STAC_HP_M4:
6a14f5851   Matthew Ranostay   ALSA: hda: Added ...
5510
  		/* enable internal microphone */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5511
  		snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040);
b9aea7150   Matthew Ranostay   ALSA: hda: STAC_H...
5512
5513
  		stac92xx_auto_set_pinctl(codec, 0x0e,
  			AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
3a7abfd2b   Matthew Ranostay   ALSA: hda: Add ST...
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
  		/* fallthru */
  	case STAC_DELL_M4_2:
  		spec->num_dmics = 0;
  		spec->num_smuxes = 0;
  		spec->num_dmuxes = 0;
  		break;
  	case STAC_DELL_M4_1:
  	case STAC_DELL_M4_3:
  		spec->num_dmics = 1;
  		spec->num_smuxes = 0;
ea18aa464   Takashi Iwai   ALSA: hda - Fix d...
5524
  		spec->num_dmuxes = 1;
6a14f5851   Matthew Ranostay   ALSA: hda: Added ...
5525
  		break;
514bf54cd   James Gardiner   ALSA: hda - Addit...
5526
5527
5528
5529
5530
5531
5532
  	case STAC_HP_DV4_1222NR:
  		spec->num_dmics = 1;
  		/* I don't know if it needs 1 or 2 smuxes - will wait for
  		 * bug reports to fix if needed
  		 */
  		spec->num_smuxes = 1;
  		spec->num_dmuxes = 1;
514bf54cd   James Gardiner   ALSA: hda - Addit...
5533
  		/* fallthrough */
2a6ce6e5f   Takashi Iwai   ALSA: hda - Add h...
5534
5535
5536
  	case STAC_HP_DV4:
  		spec->gpio_led = 0x01;
  		/* fallthrough */
e2ea57a8d   Herton Ronaldo Krzesinski   ALSA: hda - Fix s...
5537
  	case STAC_HP_DV5:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5538
  		snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
e2ea57a8d   Herton Ronaldo Krzesinski   ALSA: hda - Fix s...
5539
  		stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN);
6e34c0332   Takashi Iwai   ALSA: hda - Add s...
5540
5541
5542
5543
5544
  		/* HP dv6 gives the headphone pin as a line-out.  Thus we
  		 * need to set hp_detect flag here to force to enable HP
  		 * detection.
  		 */
  		spec->hp_detect = 1;
e2ea57a8d   Herton Ronaldo Krzesinski   ALSA: hda - Fix s...
5545
  		break;
ae6241fbf   Christoph Plattner   ALSA: hda - Added...
5546
5547
5548
5549
  	case STAC_HP_HDX:
  		spec->num_dmics = 1;
  		spec->num_dmuxes = 1;
  		spec->num_smuxes = 1;
26ebe0a28   Takashi Iwai   ALSA: hda - Fix m...
5550
  		spec->gpio_led = 0x08;
86d190e77   Takashi Iwai   ALSA: hda - Minor...
5551
5552
  		break;
  	}
443e26d01   Christoph Plattner   ALSA: hda - Rewor...
5553

c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
5554
  	if (hp_blike_system(codec->subsystem_id)) {
5bdaaada1   Vitaliy Kulikov   ALSA: hda - Enabl...
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
  		pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f);
  		if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
  			get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER  ||
  			get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) {
  			/* It was changed in the BIOS to just satisfy MS DTM.
  			 * Lets turn it back into slaved HP
  			 */
  			pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE))
  					| (AC_JACK_HP_OUT <<
  						AC_DEFCFG_DEVICE_SHIFT);
  			pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC
  							| AC_DEFCFG_SEQUENCE)))
  								| 0x1f;
  			snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg);
  		}
  	}
6a557c947   Vitaliy Kulikov   ALSA: hda - GPIO ...
5571
  	if (find_mute_led_cfg(codec, 1))
c357aab02   Vitaliy Kulikov   ALSA: hda - Fix L...
5572
5573
5574
5575
  		snd_printd("mute LED gpio %d polarity %d
  ",
  				spec->gpio_led,
  				spec->gpio_led_polarity);
5bdaaada1   Vitaliy Kulikov   ALSA: hda - Enabl...
5576

86d190e77   Takashi Iwai   ALSA: hda - Minor...
5577
5578
  #ifdef CONFIG_SND_HDA_POWER_SAVE
  	if (spec->gpio_led) {
f1a73746c   Takashi Iwai   ALSA: hda - Fix G...
5579
  		if (!spec->vref_mute_led_nid) {
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
5580
5581
5582
5583
5584
5585
  			spec->gpio_mask |= spec->gpio_led;
  			spec->gpio_dir |= spec->gpio_led;
  			spec->gpio_data |= spec->gpio_led;
  		} else {
  			codec->patch_ops.set_power_state =
  					stac92xx_set_power_state;
45eebda7b   Vitaliy Kulikov   ALSA: hda - Add s...
5586
5587
  		}
  		codec->patch_ops.pre_resume = stac92xx_pre_resume;
6fce61aea   Takashi Iwai   ALSA: hda - Fix c...
5588
  		codec->patch_ops.check_power_status =
7df1ce1a8   Vitaliy Kulikov   ALSA: hda - Make ...
5589
  			stac92xx_check_power_status;
86d190e77   Takashi Iwai   ALSA: hda - Minor...
5590
  	}
443e26d01   Christoph Plattner   ALSA: hda - Rewor...
5591
  #endif	
6a14f5851   Matthew Ranostay   ALSA: hda: Added ...
5592

c21ca4a87   Takashi Iwai   ALSA: hda - Rewor...
5593
  	spec->multiout.dac_nids = spec->dac_nids;
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5594

9009b0e41   Charles Chin   ALSA: hda/sigmate...
5595
  	err = stac92xx_parse_auto_config(codec);
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
  	if (!err) {
  		if (spec->board_config < 0) {
  			printk(KERN_WARNING "hda_codec: No auto-config is "
  			       "available, default to model=ref
  ");
  			spec->board_config = STAC_92HD71BXX_REF;
  			goto again;
  		}
  		err = -EINVAL;
  	}
  
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
75d1aeb9d   Takashi Iwai   ALSA: hda - Add B...
5611
  	/* enable bass on HP dv7 */
2a6ce6e5f   Takashi Iwai   ALSA: hda - Add h...
5612
5613
  	if (spec->board_config == STAC_HP_DV4 ||
  	    spec->board_config == STAC_HP_DV5) {
75d1aeb9d   Takashi Iwai   ALSA: hda - Add B...
5614
5615
5616
5617
5618
5619
  		unsigned int cap;
  		cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP);
  		cap &= AC_GPIO_IO_COUNT;
  		if (cap >= 6)
  			stac_add_hp_bass_switch(codec);
  	}
2d34e1b3b   Takashi Iwai   ALSA: hda - Add I...
5620
  	codec->proc_widget_hook = stac92hd7x_proc_hook;
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5621
  	return 0;
86d190e77   Takashi Iwai   ALSA: hda - Minor...
5622
  }
e035b8410   Matthew Ranostay   [ALSA] hda: Added...
5623

2f2f4251c   Matt   [ALSA] add sigmat...
5624
5625
5626
  static int patch_stac922x(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
5627
  	int err;
2f2f4251c   Matt   [ALSA] add sigmat...
5628

e560d8d83   Takashi Iwai   [ALSA] Replace wi...
5629
  	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
2f2f4251c   Matt   [ALSA] add sigmat...
5630
5631
  	if (spec == NULL)
  		return -ENOMEM;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
5632
  	codec->no_trigger_sense = 1;
2f2f4251c   Matt   [ALSA] add sigmat...
5633
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
5634
  	spec->linear_tone_beep = 1;
a4eed138a   Takashi Iwai   [ALSA] hda-codec ...
5635
  	spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
11b44bbde   Richard Fish   [ALSA] hda-codec ...
5636
  	spec->pin_nids = stac922x_pin_nids;
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
5637
5638
5639
  	spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
  							stac922x_models,
  							stac922x_cfg_tbl);
536319afd   Nicolas Boichat   ALSA: Allow to fo...
5640
  	if (spec->board_config == STAC_INTEL_MAC_AUTO) {
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5641
5642
  		spec->gpio_mask = spec->gpio_dir = 0x03;
  		spec->gpio_data = 0x03;
3fc24d850   Takashi Iwai   [ALSA] hda-codec ...
5643
5644
5645
  		/* Intel Macs have all same PCI SSID, so we need to check
  		 * codec SSID to distinguish the exact models
  		 */
6f0778d87   Nicolas Boichat   [ALSA] hda-codec ...
5646
5647
  		printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x
  ", codec->subsystem_id);
3fc24d850   Takashi Iwai   [ALSA] hda-codec ...
5648
  		switch (codec->subsystem_id) {
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
5649
5650
5651
  
  		case 0x106b0800:
  			spec->board_config = STAC_INTEL_MAC_V1;
c45e20eb2   Abhijit Bhopatkar   [ALSA] hda-codec ...
5652
  			break;
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
5653
5654
5655
  		case 0x106b0600:
  		case 0x106b0700:
  			spec->board_config = STAC_INTEL_MAC_V2;
6f0778d87   Nicolas Boichat   [ALSA] hda-codec ...
5656
  			break;
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
5657
5658
5659
5660
5661
5662
5663
  		case 0x106b0e00:
  		case 0x106b0f00:
  		case 0x106b1600:
  		case 0x106b1700:
  		case 0x106b0200:
  		case 0x106b1e00:
  			spec->board_config = STAC_INTEL_MAC_V3;
3fc24d850   Takashi Iwai   [ALSA] hda-codec ...
5664
  			break;
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
5665
5666
5667
  		case 0x106b1a00:
  		case 0x00000100:
  			spec->board_config = STAC_INTEL_MAC_V4;
f16928fb5   Sylvain FORET   [ALSA] snd_hda_in...
5668
  			break;
5d5d3bc3e   Ivan N. Zlatev   [ALSA] hda-codec ...
5669
5670
5671
  		case 0x106b0a00:
  		case 0x106b2200:
  			spec->board_config = STAC_INTEL_MAC_V5;
0dae0f83c   Takashi Iwai   [ALSA] hda-codec ...
5672
  			break;
536319afd   Nicolas Boichat   ALSA: Allow to fo...
5673
5674
5675
  		default:
  			spec->board_config = STAC_INTEL_MAC_V3;
  			break;
3fc24d850   Takashi Iwai   [ALSA] hda-codec ...
5676
5677
  		}
  	}
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
5678
   again:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5679
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
5680
5681
5682
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5683
5684
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
5685
  				stac922x_brd_tbl[spec->board_config]);
2f2f4251c   Matt   [ALSA] add sigmat...
5686

c7d4b2fa3   Matt   [ALSA] hda-codec ...
5687
5688
  	spec->adc_nids = stac922x_adc_nids;
  	spec->mux_nids = stac922x_mux_nids;
2549413ea   Takashi Iwai   [ALSA] hda-codec ...
5689
  	spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
9e05b7a3d   Maxim Levitsky   [ALSA] hda-codec ...
5690
  	spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
8b65727bf   Matt Porter   [ALSA] hda: add d...
5691
  	spec->num_dmics = 0;
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
5692
  	spec->num_pwrs = 0;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
5693
5694
  
  	spec->init = stac922x_core_init;
6479c6318   Takashi Iwai   ALSA: hda - Creat...
5695
5696
5697
5698
  
  	spec->num_caps = STAC922X_NUM_CAPS;
  	spec->capvols = stac922x_capvols;
  	spec->capsws = stac922x_capsws;
c7d4b2fa3   Matt   [ALSA] hda-codec ...
5699
5700
  
  	spec->multiout.dac_nids = spec->dac_nids;
19039bd00   Takashi Iwai   [ALSA] Add Intel ...
5701
  	
9009b0e41   Charles Chin   ALSA: hda/sigmate...
5702
  	err = stac92xx_parse_auto_config(codec);
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
  	if (!err) {
  		if (spec->board_config < 0) {
  			printk(KERN_WARNING "hda_codec: No auto-config is "
  			       "available, default to model=ref
  ");
  			spec->board_config = STAC_D945_REF;
  			goto again;
  		}
  		err = -EINVAL;
  	}
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
5713
5714
5715
5716
5717
5718
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
  
  	codec->patch_ops = stac92xx_patch_ops;
807a46360   Takashi Iwai   [ALSA] hda-codec ...
5719
5720
5721
5722
5723
5724
  	/* Fix Mux capture level; max to 2 */
  	snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
  				  (0 << AC_AMPCAP_OFFSET_SHIFT) |
  				  (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
  				  (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
  				  (0 << AC_AMPCAP_MUTE_SHIFT));
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
  	return 0;
  }
  
  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;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
5736
  	codec->no_trigger_sense = 1;
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
5737
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
5738
  	spec->linear_tone_beep = 1;
45c1d85bc   Matthew Ranostay   ALSA: hda: Added ...
5739
  	codec->slave_dig_outs = stac927x_slave_dig_outs;
a4eed138a   Takashi Iwai   [ALSA] hda-codec ...
5740
  	spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
11b44bbde   Richard Fish   [ALSA] hda-codec ...
5741
  	spec->pin_nids = stac927x_pin_nids;
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
5742
5743
5744
  	spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
  							stac927x_models,
  							stac927x_cfg_tbl);
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
5745
   again:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5746
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
5747
5748
5749
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5750
5751
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
5752
  				stac927x_brd_tbl[spec->board_config]);
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
5753

1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
5754
  	spec->digbeep_nid = 0x23;
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5755
5756
5757
5758
  	spec->adc_nids = stac927x_adc_nids;
  	spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
  	spec->mux_nids = stac927x_mux_nids;
  	spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
5759
5760
  	spec->smux_nids = stac927x_smux_nids;
  	spec->num_smuxes = ARRAY_SIZE(stac927x_smux_nids);
659736321   Matthew Ranostay   ALSA: hda: SPDIF ...
5761
  	spec->spdif_labels = stac927x_spdif_labels;
b76c850fb   Matthew Ranostay   [ALSA] hda: STAC9...
5762
  	spec->dac_list = stac927x_dac_nids;
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5763
  	spec->multiout.dac_nids = spec->dac_nids;
af6ee3020   Takashi Iwai   ALSA: hda - Set d...
5764
5765
5766
5767
5768
  	if (spec->board_config != STAC_D965_REF) {
  		/* GPIO0 High = Enable EAPD */
  		spec->eapd_mask = spec->gpio_mask = 0x01;
  		spec->gpio_dir = spec->gpio_data = 0x01;
  	}
81d3dbde7   Tobin Davis   [ALSA] hda-codec ...
5769
  	switch (spec->board_config) {
93ed15037   Tobin Davis   [ALSA] hda-codec ...
5770
  	case STAC_D965_3ST:
93ed15037   Tobin Davis   [ALSA] hda-codec ...
5771
  	case STAC_D965_5ST:
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5772
  		/* GPIO0 High = Enable EAPD */
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5773
  		spec->num_dmics = 0;
93ed15037   Tobin Davis   [ALSA] hda-codec ...
5774
  		spec->init = d965_core_init;
81d3dbde7   Tobin Davis   [ALSA] hda-codec ...
5775
  		break;
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5776
  	case STAC_DELL_BIOS:
780c8be4a   Matthew Ranostay   [ALSA] hda: Corre...
5777
5778
5779
5780
  		switch (codec->subsystem_id) {
  		case 0x10280209:
  		case 0x1028022e:
  			/* correct the device field to SPDIF out */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5781
  			snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070);
780c8be4a   Matthew Ranostay   [ALSA] hda: Corre...
5782
  			break;
86d190e77   Takashi Iwai   ALSA: hda - Minor...
5783
  		}
03d7ca177   Matthew Ranostay   [ALSA] hda: STAC9...
5784
  		/* configure the analog microphone on some laptops */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5785
  		snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130);
2f32d909f   Matthew Ranostay   [ALSA] hda: STAC9...
5786
  		/* correct the front output jack as a hp out */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5787
  		snd_hda_codec_set_pincfg(codec, 0x0f, 0x0227011f);
c481fca3e   Matthew Ranostay   [ALSA] hda: STAC9...
5788
  		/* correct the front input jack as a mic */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5789
  		snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130);
c481fca3e   Matthew Ranostay   [ALSA] hda: STAC9...
5790
  		/* fallthru */
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5791
  	case STAC_DELL_3ST:
af6ee3020   Takashi Iwai   ALSA: hda - Set d...
5792
5793
5794
5795
5796
  		if (codec->subsystem_id != 0x1028022f) {
  			/* GPIO2 High = Enable EAPD */
  			spec->eapd_mask = spec->gpio_mask = 0x04;
  			spec->gpio_dir = spec->gpio_data = 0x04;
  		}
7f16859a8   Matthew Ranostay   [ALSA] hda-codec ...
5797
5798
  		spec->dmic_nids = stac927x_dmic_nids;
  		spec->num_dmics = STAC927X_NUM_DMICS;
f1f208d0b   Matthew Ranostay   [ALSA] hda: STAC9...
5799

ccca7cdc1   Takashi Iwai   ALSA: hda - Fix v...
5800
  		spec->init = dell_3st_core_init;
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5801
  		spec->dmux_nids = stac927x_dmux_nids;
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
5802
  		spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
7f16859a8   Matthew Ranostay   [ALSA] hda-codec ...
5803
  		break;
54930531a   Takashi Iwai   ALSA: hda - Fix m...
5804
5805
5806
5807
  	case STAC_927X_VOLKNOB:
  		spec->num_dmics = 0;
  		spec->init = stac927x_volknob_core_init;
  		break;
7f16859a8   Matthew Ranostay   [ALSA] hda-codec ...
5808
  	default:
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5809
  		spec->num_dmics = 0;
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5810
  		spec->init = stac927x_core_init;
af6ee3020   Takashi Iwai   ALSA: hda - Set d...
5811
  		break;
7f16859a8   Matthew Ranostay   [ALSA] hda-codec ...
5812
  	}
6479c6318   Takashi Iwai   ALSA: hda - Creat...
5813
5814
5815
  	spec->num_caps = STAC927X_NUM_CAPS;
  	spec->capvols = stac927x_capvols;
  	spec->capsws = stac927x_capsws;
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
5816
  	spec->num_pwrs = 0;
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
5817
  	spec->aloopback_ctl = stac927x_loopback;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5818
5819
  	spec->aloopback_mask = 0x40;
  	spec->aloopback_shift = 0;
c0cea0d09   Matthew Ranostay   ALSA: hda: STAC_D...
5820
  	spec->eapd_switch = 1;
8e9068b1c   Matthew Ranostay   [ALSA] hda: STAC9...
5821

9009b0e41   Charles Chin   ALSA: hda/sigmate...
5822
  	err = stac92xx_parse_auto_config(codec);
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
  	if (!err) {
  		if (spec->board_config < 0) {
  			printk(KERN_WARNING "hda_codec: No auto-config is "
  			       "available, default to model=ref
  ");
  			spec->board_config = STAC_D965_REF;
  			goto again;
  		}
  		err = -EINVAL;
  	}
c7d4b2fa3   Matt   [ALSA] hda-codec ...
5833
5834
5835
5836
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
2f2f4251c   Matt   [ALSA] add sigmat...
5837
5838
  
  	codec->patch_ops = stac92xx_patch_ops;
2d34e1b3b   Takashi Iwai   ALSA: hda - Add I...
5839
  	codec->proc_widget_hook = stac927x_proc_hook;
52987656f   Takashi Iwai   [ALSA] hda-intel ...
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
  	/*
  	 * !!FIXME!!
  	 * The STAC927x seem to require fairly long delays for certain
  	 * command sequences.  With too short delays (even if the answer
  	 * is set to RIRB properly), it results in the silence output
  	 * on some hardwares like Dell.
  	 *
  	 * The below flag enables the longer delay (see get_response
  	 * in hda_intel.c).
  	 */
  	codec->bus->needs_damn_long_delay = 1;
e28d83223   Takashi Iwai   ALSA: hda - Fix s...
5851
5852
5853
  	/* no jack detecion for ref-no-jd model */
  	if (spec->board_config == STAC_D965_REF_NO_JD)
  		spec->hp_detect = 0;
2f2f4251c   Matt   [ALSA] add sigmat...
5854
5855
  	return 0;
  }
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5856
5857
5858
  static int patch_stac9205(struct hda_codec *codec)
  {
  	struct sigmatel_spec *spec;
8259980eb   Takashi Iwai   [ALSA] hda-codec ...
5859
  	int err;
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5860
5861
5862
5863
  
  	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
  	if (spec == NULL)
  		return -ENOMEM;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
5864
  	codec->no_trigger_sense = 1;
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5865
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
5866
  	spec->linear_tone_beep = 1;
a4eed138a   Takashi Iwai   [ALSA] hda-codec ...
5867
  	spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
11b44bbde   Richard Fish   [ALSA] hda-codec ...
5868
  	spec->pin_nids = stac9205_pin_nids;
f5fcc13c2   Takashi Iwai   [ALSA] hda-codec ...
5869
5870
5871
  	spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
  							stac9205_models,
  							stac9205_cfg_tbl);
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
5872
   again:
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5873
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
5874
5875
5876
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5877
5878
  	else
  		stac92xx_set_config_regs(codec,
af9f341a9   Takashi Iwai   ALSA: hda - Fix r...
5879
  					 stac9205_brd_tbl[spec->board_config]);
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5880

1cd2224cd   Matthew Ranostay   ALSA: hda: digita...
5881
  	spec->digbeep_nid = 0x23;
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5882
  	spec->adc_nids = stac9205_adc_nids;
9e05b7a3d   Maxim Levitsky   [ALSA] hda-codec ...
5883
  	spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5884
  	spec->mux_nids = stac9205_mux_nids;
2549413ea   Takashi Iwai   [ALSA] hda-codec ...
5885
  	spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
d9737751e   Matthew Ranostay   ALSA: hda: SPDIF ...
5886
5887
  	spec->smux_nids = stac9205_smux_nids;
  	spec->num_smuxes = ARRAY_SIZE(stac9205_smux_nids);
8b65727bf   Matt Porter   [ALSA] hda: add d...
5888
  	spec->dmic_nids = stac9205_dmic_nids;
f6e9852ad   Takashi Iwai   [ALSA] hda-codec ...
5889
  	spec->num_dmics = STAC9205_NUM_DMICS;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5890
  	spec->dmux_nids = stac9205_dmux_nids;
1697055e6   Takashi Iwai   [ALSA] hda-codec ...
5891
  	spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
a64135a2d   Matthew Ranostay   [ALSA] hda: 92HD7...
5892
  	spec->num_pwrs = 0;
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5893
5894
  
  	spec->init = stac9205_core_init;
d78d7a90a   Takashi Iwai   ALSA: hda - Creat...
5895
  	spec->aloopback_ctl = stac9205_loopback;
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5896

6479c6318   Takashi Iwai   ALSA: hda - Creat...
5897
5898
5899
  	spec->num_caps = STAC9205_NUM_CAPS;
  	spec->capvols = stac9205_capvols;
  	spec->capsws = stac9205_capsws;
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
5900
5901
  	spec->aloopback_mask = 0x40;
  	spec->aloopback_shift = 0;
d9a4268ee   Takashi Iwai   ALSA: hda - Add q...
5902
5903
5904
  	/* Turn on/off EAPD per HP plugging */
  	if (spec->board_config != STAC_9205_EAPD)
  		spec->eapd_switch = 1;
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5905
  	spec->multiout.dac_nids = spec->dac_nids;
87d483630   Matthew Ranostay   [ALSA] hda: Enabl...
5906
  	
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
5907
  	switch (spec->board_config){
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
5908
  	case STAC_9205_DELL_M43:
87d483630   Matthew Ranostay   [ALSA] hda: Enabl...
5909
  		/* Enable SPDIF in/out */
330ee9957   Takashi Iwai   ALSA: hda - Remov...
5910
5911
  		snd_hda_codec_set_pincfg(codec, 0x1f, 0x01441030);
  		snd_hda_codec_set_pincfg(codec, 0x20, 0x1c410030);
87d483630   Matthew Ranostay   [ALSA] hda: Enabl...
5912

4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5913
  		/* Enable unsol response for GPIO4/Dock HP connection */
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
5914
  		err = stac_add_event(codec, codec->afg, STAC_VREF_EVENT, 0x01);
c6e4c6661   Takashi Iwai   ALSA: hda - Assig...
5915
5916
  		if (err < 0)
  			return err;
c5d08bb56   Takashi Iwai   ALSA: hda - Fix r...
5917
  		snd_hda_codec_write_cache(codec, codec->afg, 0,
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5918
  			AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
3a93897ea   Takashi Iwai   ALSA: hda - Manag...
5919
  		snd_hda_jack_detect_enable(codec, codec->afg, 0);
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5920
5921
  
  		spec->gpio_dir = 0x0b;
0fc9dec46   Matthew Ranostay   [ALSA] hda: EAPD ...
5922
  		spec->eapd_mask = 0x01;
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5923
5924
  		spec->gpio_mask = 0x1b;
  		spec->gpio_mute = 0x10;
e2e7d624a   Matthew Ranostay   [ALSA] hda: STAC9...
5925
  		/* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5926
  		 * GPIO3 Low = DRM
87d483630   Matthew Ranostay   [ALSA] hda: Enabl...
5927
  		 */
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5928
  		spec->gpio_data = 0x01;
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
5929
  		break;
b2c4f4d71   Matthew Ranostay   ALSA: hda: 92xx S...
5930
5931
5932
  	case STAC_9205_REF:
  		/* SPDIF-In enabled */
  		break;
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
5933
5934
  	default:
  		/* GPIO0 High = EAPD */
0fc9dec46   Matthew Ranostay   [ALSA] hda: EAPD ...
5935
  		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
4fe5195c4   Matthew Ranostay   [ALSA] hda: Add G...
5936
  		spec->gpio_data = 0x01;
ae0a8ed8b   Tobin Davis   [ALSA] This patch...
5937
5938
  		break;
  	}
333824034   Matt Porter   [ALSA] hda: add s...
5939

9009b0e41   Charles Chin   ALSA: hda/sigmate...
5940
  	err = stac92xx_parse_auto_config(codec);
9e507abd8   Takashi Iwai   [ALSA] hda-codec ...
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
  	if (!err) {
  		if (spec->board_config < 0) {
  			printk(KERN_WARNING "hda_codec: No auto-config is "
  			       "available, default to model=ref
  ");
  			spec->board_config = STAC_9205_REF;
  			goto again;
  		}
  		err = -EINVAL;
  	}
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5951
5952
5953
5954
5955
5956
  	if (err < 0) {
  		stac92xx_free(codec);
  		return err;
  	}
  
  	codec->patch_ops = stac92xx_patch_ops;
2d34e1b3b   Takashi Iwai   ALSA: hda - Add I...
5957
  	codec->proc_widget_hook = stac9205_proc_hook;
f3302a59c   Matt Porter   [ALSA] hda: sigma...
5958
5959
  	return 0;
  }
2f2f4251c   Matt   [ALSA] add sigmat...
5960
  /*
6d8590650   Guillaume Munch   [ALSA] hda-codec ...
5961
   * STAC9872 hack
db064e503   Takashi Iwai   [ALSA] hda-codec ...
5962
   */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5963
  static const struct hda_verb stac9872_core_init[] = {
1624cb9a3   Takashi Iwai   [ALSA] hda-codec ...
5964
  	{0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
6d8590650   Guillaume Munch   [ALSA] hda-codec ...
5965
5966
5967
  	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
  	{}
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5968
  static const hda_nid_t stac9872_pin_nids[] = {
caa10b6e8   Takashi Iwai   ALSA: hda - Impro...
5969
5970
5971
  	0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
  	0x11, 0x13, 0x14,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5972
  static const hda_nid_t stac9872_adc_nids[] = {
caa10b6e8   Takashi Iwai   ALSA: hda - Impro...
5973
5974
  	0x8 /*,0x6*/
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5975
  static const hda_nid_t stac9872_mux_nids[] = {
caa10b6e8   Takashi Iwai   ALSA: hda - Impro...
5976
5977
  	0x15
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5978
  static const unsigned long stac9872_capvols[] = {
6479c6318   Takashi Iwai   ALSA: hda - Creat...
5979
5980
5981
  	HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
  };
  #define stac9872_capsws		stac9872_capvols
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5982
  static const unsigned int stac9872_vaio_pin_configs[9] = {
307282c89   Takashi Iwai   ALSA: hda - Add m...
5983
5984
5985
5986
  	0x03211020, 0x411111f0, 0x411111f0, 0x03a15030,
  	0x411111f0, 0x90170110, 0x411111f0, 0x411111f0,
  	0x90a7013e
  };
ea7349632   Takashi Iwai   ALSA: hda - consi...
5987
  static const char * const stac9872_models[STAC_9872_MODELS] = {
307282c89   Takashi Iwai   ALSA: hda - Add m...
5988
5989
5990
  	[STAC_9872_AUTO] = "auto",
  	[STAC_9872_VAIO] = "vaio",
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5991
  static const unsigned int *stac9872_brd_tbl[STAC_9872_MODELS] = {
307282c89   Takashi Iwai   ALSA: hda - Add m...
5992
5993
  	[STAC_9872_VAIO] = stac9872_vaio_pin_configs,
  };
2b63536f0   Takashi Iwai   ALSA: hda - Const...
5994
  static const struct snd_pci_quirk stac9872_cfg_tbl[] = {
b04add956   Takashi Iwai   ALSA: hda - Fix p...
5995
5996
  	SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0,
  			   "Sony VAIO F/S", STAC_9872_VAIO),
307282c89   Takashi Iwai   ALSA: hda - Add m...
5997
5998
  	{} /* terminator */
  };
6d8590650   Guillaume Munch   [ALSA] hda-codec ...
5999
  static int patch_stac9872(struct hda_codec *codec)
db064e503   Takashi Iwai   [ALSA] hda-codec ...
6000
6001
  {
  	struct sigmatel_spec *spec;
1e137f929   Takashi Iwai   ALSA: hda - Clean...
6002
  	int err;
db064e503   Takashi Iwai   [ALSA] hda-codec ...
6003

db064e503   Takashi Iwai   [ALSA] hda-codec ...
6004
6005
6006
  	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
  	if (spec == NULL)
  		return -ENOMEM;
a252c81a6   Takashi Iwai   ALSA: hda - use s...
6007
  	codec->no_trigger_sense = 1;
db064e503   Takashi Iwai   [ALSA] hda-codec ...
6008
  	codec->spec = spec;
1b0e372d7   Daniel J Blueman   ALSA: hda - Fix b...
6009
  	spec->linear_tone_beep = 1;
b04add956   Takashi Iwai   ALSA: hda - Fix p...
6010
6011
  	spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
  	spec->pin_nids = stac9872_pin_nids;
caa10b6e8   Takashi Iwai   ALSA: hda - Impro...
6012
6013
6014
6015
  
  	spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
  							stac9872_models,
  							stac9872_cfg_tbl);
307282c89   Takashi Iwai   ALSA: hda - Add m...
6016
  	if (spec->board_config < 0)
9a11f1aa8   Takashi Iwai   ALSA: hda - Rewor...
6017
6018
6019
  		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.
  ",
  			    codec->chip_name);
307282c89   Takashi Iwai   ALSA: hda - Add m...
6020
6021
6022
  	else
  		stac92xx_set_config_regs(codec,
  					 stac9872_brd_tbl[spec->board_config]);
db064e503   Takashi Iwai   [ALSA] hda-codec ...
6023

1e137f929   Takashi Iwai   ALSA: hda - Clean...
6024
6025
6026
6027
6028
  	spec->multiout.dac_nids = spec->dac_nids;
  	spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids);
  	spec->adc_nids = stac9872_adc_nids;
  	spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids);
  	spec->mux_nids = stac9872_mux_nids;
1e137f929   Takashi Iwai   ALSA: hda - Clean...
6029
  	spec->init = stac9872_core_init;
6479c6318   Takashi Iwai   ALSA: hda - Creat...
6030
6031
6032
  	spec->num_caps = 1;
  	spec->capvols = stac9872_capvols;
  	spec->capsws = stac9872_capsws;
1e137f929   Takashi Iwai   ALSA: hda - Clean...
6033

9009b0e41   Charles Chin   ALSA: hda/sigmate...
6034
  	err = stac92xx_parse_auto_config(codec);
1e137f929   Takashi Iwai   ALSA: hda - Clean...
6035
6036
6037
6038
6039
6040
  	if (err < 0) {
  		stac92xx_free(codec);
  		return -EINVAL;
  	}
  	spec->input_mux = &spec->private_imux;
  	codec->patch_ops = stac92xx_patch_ops;
db064e503   Takashi Iwai   [ALSA] hda-codec ...
6041
6042
6043
6044
6045
  	return 0;
  }
  
  
  /*
2f2f4251c   Matt   [ALSA] add sigmat...
6046
6047
   * patch entries
   */
2b63536f0   Takashi Iwai   ALSA: hda - Const...
6048
  static const struct hda_codec_preset snd_hda_preset_sigmatel[] = {
2f2f4251c   Matt   [ALSA] add sigmat...
6049
6050
6051
6052
6053
6054
6055
   	{ .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
   	{ .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
   	{ .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
   	{ .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
   	{ .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
   	{ .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
   	{ .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
22a27c7f8   Matt Porter   [ALSA] hda: fix s...
6056
6057
6058
6059
6060
6061
   	{ .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
   	{ .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
   	{ .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
   	{ .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
   	{ .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
   	{ .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
3cc08dc6e   Matt Porter   [ALSA] hda-codec ...
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
   	{ .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
   	{ .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
   	{ .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
   	{ .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
   	{ .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
   	{ .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
   	{ .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
   	{ .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
   	{ .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
   	{ .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
8e21c34cd   Tobin Davis   [ALSA] hda-codec ...
6072
6073
6074
6075
6076
6077
  	{ .id = 0x83847632, .name = "STAC9202",  .patch = patch_stac925x },
  	{ .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
  	{ .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
  	{ .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
  	{ .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
  	{ .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
7bd3c0f73   Takashi Iwai   [ALSA] hda - Supp...
6078
6079
  	{ .id = 0x83847645, .name = "92HD206X", .patch = patch_stac927x },
  	{ .id = 0x83847646, .name = "92HD206D", .patch = patch_stac927x },
6d8590650   Guillaume Munch   [ALSA] hda-codec ...
6080
6081
6082
6083
6084
6085
6086
   	/* The following does not take into account .id=0x83847661 when subsys =
   	 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
   	 * currently not fully supported.
   	 */
   	{ .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
   	{ .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
   	{ .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
a5c0f8867   Simos Xenitellis   ALSA: hda - add q...
6087
  	{ .id = 0x83847698, .name = "STAC9205", .patch = patch_stac9205 },
f3302a59c   Matt Porter   [ALSA] hda: sigma...
6088
6089
6090
6091
6092
6093
6094
6095
   	{ .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
   	{ .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
   	{ .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
   	{ .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
   	{ .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
   	{ .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
   	{ .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
   	{ .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
6096
  	{ .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
6097
  	{ .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
a9694faa2   Vitaliy Kulikov   ALSA: hda - Addin...
6098
  	{ .id = 0x111d76d4, .name = "92HD83C1C5", .patch = patch_stac92hd83xxx},
d0513fc6c   Matthew Ranostay   ALSA: hda: added ...
6099
  	{ .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
ff2e7337b   Matthew Ranostay   ALSA: Add 92HD81B...
6100
  	{ .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx},
8a345a042   Charles Chin   ALSA: hda - Addin...
6101
6102
  	{ .id = 0x111d76d1, .name = "92HD87B1/3", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76d9, .name = "92HD87B2/4", .patch = patch_stac92hd83xxx},
36706005d   Charles Chin   ALSA: hda - Add s...
6103
6104
6105
6106
  	{ .id = 0x111d7666, .name = "92HD88B3", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d7667, .name = "92HD88B1", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d7668, .name = "92HD88B2", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d7669, .name = "92HD88B4", .patch = patch_stac92hd83xxx},
aafc4412b   Matthew Ranostay   ALSA: hda: Add su...
6107
  	{ .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx},
541eee876   Matthew Ranostay   [ALSA] hda: Added...
6108
6109
  	{ .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
e1f0d6690   Matthew Ranostay   [ALSA] hda: Added...
6110
  	{ .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
541eee876   Matthew Ranostay   [ALSA] hda: Added...
6111
6112
6113
6114
6115
6116
6117
6118
  	{ .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
  	{ .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
  	{ .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
  	{ .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
  	{ .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
  	{ .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
  	{ .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
  	{ .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
4d8ec5f3b   Charles Chin   ALSA: hda - Add s...
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
  	{ .id = 0x111d76c0, .name = "92HD89C3", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c1, .name = "92HD89C2", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c2, .name = "92HD89C1", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c3, .name = "92HD89B3", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c4, .name = "92HD89B2", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c5, .name = "92HD89B1", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c6, .name = "92HD89E3", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c7, .name = "92HD89E2", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c8, .name = "92HD89E1", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76c9, .name = "92HD89D3", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76ca, .name = "92HD89D2", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76cb, .name = "92HD89D1", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76cc, .name = "92HD89F3", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76cd, .name = "92HD89F2", .patch = patch_stac92hd73xx },
  	{ .id = 0x111d76ce, .name = "92HD89F1", .patch = patch_stac92hd73xx },
46724c2e0   David Henningsson   ALSA: HDA: Add su...
6134
  	{ .id = 0x111d76df, .name = "92HD93BXX", .patch = patch_stac92hd83xxx},
ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
6135
  	{ .id = 0x111d76e0, .name = "92HD91BXX", .patch = patch_stac92hd83xxx},
4dfb8a45d   Vitaliy Kulikov   ALSA: hda - Add s...
6136
6137
  	{ .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx},
ab5a6ebee   Vitaliy Kulikov   ALSA: hda - Addin...
6138
  	{ .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx},
ad5d87551   Charles Chin   ALSA: hda - Add s...
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
  	{ .id = 0x111d76e8, .name = "92HD66B1X5", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76e9, .name = "92HD66B2X5", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76ea, .name = "92HD66B3X5", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76eb, .name = "92HD66C1X5", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76ec, .name = "92HD66C2X5", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76ed, .name = "92HD66C3X5", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76ee, .name = "92HD66B1X3", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76ef, .name = "92HD66B2X3", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76f0, .name = "92HD66B3X3", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76f1, .name = "92HD66C1X3", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76f2, .name = "92HD66C2X3", .patch = patch_stac92hd83xxx},
  	{ .id = 0x111d76f3, .name = "92HD66C3/65", .patch = patch_stac92hd83xxx},
2f2f4251c   Matt   [ALSA] add sigmat...
6151
6152
  	{} /* terminator */
  };
1289e9e8b   Takashi Iwai   ALSA: hda - Modul...
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
  
  MODULE_ALIAS("snd-hda-codec-id:8384*");
  MODULE_ALIAS("snd-hda-codec-id:111d*");
  
  MODULE_LICENSE("GPL");
  MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec");
  
  static struct hda_codec_preset_list sigmatel_list = {
  	.preset = snd_hda_preset_sigmatel,
  	.owner = THIS_MODULE,
  };
  
  static int __init patch_sigmatel_init(void)
  {
  	return snd_hda_add_codec_preset(&sigmatel_list);
  }
  
  static void __exit patch_sigmatel_exit(void)
  {
  	snd_hda_delete_codec_preset(&sigmatel_list);
  }
  
  module_init(patch_sigmatel_init)
  module_exit(patch_sigmatel_exit)