1 /* 2 * Universal Interface for Intel High Definition Audio Codec 3 * 4 * Local helper functions 5 * 6 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de> 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the Free 10 * Software Foundation; either version 2 of the License, or (at your option) 11 * any later version. 12 * 13 * This program is distributed in the hope that it will be useful, but WITHOUT 14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 * more details. 17 * 18 * You should have received a copy of the GNU General Public License along with 19 * this program; if not, write to the Free Software Foundation, Inc., 59 20 * Temple Place - Suite 330, Boston, MA 02111-1307, USA. 21 */ 22 23 #ifndef __SOUND_HDA_LOCAL_H 24 #define __SOUND_HDA_LOCAL_H 25 26 /* 27 * for mixer controls 28 */ 29 #define HDA_COMPOSE_AMP_VAL(nid,chs,idx,dir) \ 30 ((nid) | ((chs)<<16) | ((dir)<<18) | ((idx)<<19)) 31 /* mono volume with index (index=0,1,...) (channel=1,2) */ 32 #define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \ 33 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \ 34 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 35 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 36 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \ 37 .info = snd_hda_mixer_amp_volume_info, \ 38 .get = snd_hda_mixer_amp_volume_get, \ 39 .put = snd_hda_mixer_amp_volume_put, \ 40 .tlv = { .c = snd_hda_mixer_amp_tlv }, \ 41 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) } 42 /* stereo volume with index */ 43 #define HDA_CODEC_VOLUME_IDX(xname, xcidx, nid, xindex, direction) \ 44 HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, 3, xindex, direction) 45 /* mono volume */ 46 #define HDA_CODEC_VOLUME_MONO(xname, nid, channel, xindex, direction) \ 47 HDA_CODEC_VOLUME_MONO_IDX(xname, 0, nid, channel, xindex, direction) 48 /* stereo volume */ 49 #define HDA_CODEC_VOLUME(xname, nid, xindex, direction) \ 50 HDA_CODEC_VOLUME_MONO(xname, nid, 3, xindex, direction) 51 /* mono mute switch with index (index=0,1,...) (channel=1,2) */ 52 #define HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \ 53 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \ 54 .info = snd_hda_mixer_amp_switch_info, \ 55 .get = snd_hda_mixer_amp_switch_get, \ 56 .put = snd_hda_mixer_amp_switch_put, \ 57 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) } 58 /* stereo mute switch with index */ 59 #define HDA_CODEC_MUTE_IDX(xname, xcidx, nid, xindex, direction) \ 60 HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, 3, xindex, direction) 61 /* mono mute switch */ 62 #define HDA_CODEC_MUTE_MONO(xname, nid, channel, xindex, direction) \ 63 HDA_CODEC_MUTE_MONO_IDX(xname, 0, nid, channel, xindex, direction) 64 /* stereo mute switch */ 65 #define HDA_CODEC_MUTE(xname, nid, xindex, direction) \ 66 HDA_CODEC_MUTE_MONO(xname, nid, 3, xindex, direction) 67 68 int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, 69 struct snd_ctl_elem_info *uinfo); 70 int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, 71 struct snd_ctl_elem_value *ucontrol); 72 int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, 73 struct snd_ctl_elem_value *ucontrol); 74 int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag, 75 unsigned int size, unsigned int __user *tlv); 76 int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol, 77 struct snd_ctl_elem_info *uinfo); 78 int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol, 79 struct snd_ctl_elem_value *ucontrol); 80 int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, 81 struct snd_ctl_elem_value *ucontrol); 82 /* lowlevel accessor with caching; use carefully */ 83 int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, 84 int direction, int index); 85 int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch, 86 int direction, int idx, int mask, int val); 87 int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid, 88 int dir, int idx, int mask, int val); 89 #ifdef SND_HDA_NEEDS_RESUME 90 void snd_hda_codec_resume_amp(struct hda_codec *codec); 91 #endif 92 93 /* amp value bits */ 94 #define HDA_AMP_MUTE 0x80 95 #define HDA_AMP_UNMUTE 0x00 96 #define HDA_AMP_VOLMASK 0x7f 97 98 /* mono switch binding multiple inputs */ 99 #define HDA_BIND_MUTE_MONO(xname, nid, channel, indices, direction) \ 100 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 101 .info = snd_hda_mixer_amp_switch_info, \ 102 .get = snd_hda_mixer_bind_switch_get, \ 103 .put = snd_hda_mixer_bind_switch_put, \ 104 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, indices, direction) } 105 106 /* stereo switch binding multiple inputs */ 107 #define HDA_BIND_MUTE(xname,nid,indices,dir) \ 108 HDA_BIND_MUTE_MONO(xname,nid,3,indices,dir) 109 110 int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, 111 struct snd_ctl_elem_value *ucontrol); 112 int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, 113 struct snd_ctl_elem_value *ucontrol); 114 115 /* more generic bound controls */ 116 struct hda_ctl_ops { 117 snd_kcontrol_info_t *info; 118 snd_kcontrol_get_t *get; 119 snd_kcontrol_put_t *put; 120 snd_kcontrol_tlv_rw_t *tlv; 121 }; 122 123 extern struct hda_ctl_ops snd_hda_bind_vol; /* for bind-volume with TLV */ 124 extern struct hda_ctl_ops snd_hda_bind_sw; /* for bind-switch */ 125 126 struct hda_bind_ctls { 127 struct hda_ctl_ops *ops; 128 long values[]; 129 }; 130 131 int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, 132 struct snd_ctl_elem_info *uinfo); 133 int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol, 134 struct snd_ctl_elem_value *ucontrol); 135 int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol, 136 struct snd_ctl_elem_value *ucontrol); 137 int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag, 138 unsigned int size, unsigned int __user *tlv); 139 140 #define HDA_BIND_VOL(xname, bindrec) \ 141 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 142 .name = xname, \ 143 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\ 144 SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ 145 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,\ 146 .info = snd_hda_mixer_bind_ctls_info,\ 147 .get = snd_hda_mixer_bind_ctls_get,\ 148 .put = snd_hda_mixer_bind_ctls_put,\ 149 .tlv = { .c = snd_hda_mixer_bind_tlv },\ 150 .private_value = (long) (bindrec) } 151 #define HDA_BIND_SW(xname, bindrec) \ 152 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\ 153 .name = xname, \ 154 .info = snd_hda_mixer_bind_ctls_info,\ 155 .get = snd_hda_mixer_bind_ctls_get,\ 156 .put = snd_hda_mixer_bind_ctls_put,\ 157 .private_value = (long) (bindrec) } 158 159 /* 160 * SPDIF I/O 161 */ 162 int snd_hda_create_spdif_out_ctls(struct hda_codec *codec, hda_nid_t nid); 163 int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid); 164 165 /* 166 * input MUX helper 167 */ 168 #define HDA_MAX_NUM_INPUTS 16 169 struct hda_input_mux_item { 170 const char *label; 171 unsigned int index; 172 }; 173 struct hda_input_mux { 174 unsigned int num_items; 175 struct hda_input_mux_item items[HDA_MAX_NUM_INPUTS]; 176 }; 177 178 int snd_hda_input_mux_info(const struct hda_input_mux *imux, 179 struct snd_ctl_elem_info *uinfo); 180 int snd_hda_input_mux_put(struct hda_codec *codec, 181 const struct hda_input_mux *imux, 182 struct snd_ctl_elem_value *ucontrol, hda_nid_t nid, 183 unsigned int *cur_val); 184 185 /* 186 * Channel mode helper 187 */ 188 struct hda_channel_mode { 189 int channels; 190 const struct hda_verb *sequence; 191 }; 192 193 int snd_hda_ch_mode_info(struct hda_codec *codec, 194 struct snd_ctl_elem_info *uinfo, 195 const struct hda_channel_mode *chmode, 196 int num_chmodes); 197 int snd_hda_ch_mode_get(struct hda_codec *codec, 198 struct snd_ctl_elem_value *ucontrol, 199 const struct hda_channel_mode *chmode, 200 int num_chmodes, 201 int max_channels); 202 int snd_hda_ch_mode_put(struct hda_codec *codec, 203 struct snd_ctl_elem_value *ucontrol, 204 const struct hda_channel_mode *chmode, 205 int num_chmodes, 206 int *max_channelsp); 207 208 /* 209 * Multi-channel / digital-out PCM helper 210 */ 211 212 enum { HDA_FRONT, HDA_REAR, HDA_CLFE, HDA_SIDE }; /* index for dac_nidx */ 213 enum { HDA_DIG_NONE, HDA_DIG_EXCLUSIVE, HDA_DIG_ANALOG_DUP }; /* dig_out_used */ 214 215 struct hda_multi_out { 216 int num_dacs; /* # of DACs, must be more than 1 */ 217 hda_nid_t *dac_nids; /* DAC list */ 218 hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */ 219 hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */ 220 hda_nid_t dig_out_nid; /* digital out audio widget */ 221 int max_channels; /* currently supported analog channels */ 222 int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ 223 }; 224 225 int snd_hda_multi_out_dig_open(struct hda_codec *codec, 226 struct hda_multi_out *mout); 227 int snd_hda_multi_out_dig_close(struct hda_codec *codec, 228 struct hda_multi_out *mout); 229 int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, 230 struct hda_multi_out *mout, 231 unsigned int stream_tag, 232 unsigned int format, 233 struct snd_pcm_substream *substream); 234 int snd_hda_multi_out_analog_open(struct hda_codec *codec, 235 struct hda_multi_out *mout, 236 struct snd_pcm_substream *substream); 237 int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, 238 struct hda_multi_out *mout, 239 unsigned int stream_tag, 240 unsigned int format, 241 struct snd_pcm_substream *substream); 242 int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, 243 struct hda_multi_out *mout); 244 245 /* 246 * generic codec parser 247 */ 248 int snd_hda_parse_generic_codec(struct hda_codec *codec); 249 250 /* 251 * generic proc interface 252 */ 253 #ifdef CONFIG_PROC_FS 254 int snd_hda_codec_proc_new(struct hda_codec *codec); 255 #else 256 static inline int snd_hda_codec_proc_new(struct hda_codec *codec) { return 0; } 257 #endif 258 259 /* 260 * Misc 261 */ 262 int snd_hda_check_board_config(struct hda_codec *codec, int num_configs, 263 const char **modelnames, 264 const struct snd_pci_quirk *pci_list); 265 int snd_hda_add_new_ctls(struct hda_codec *codec, 266 struct snd_kcontrol_new *knew); 267 268 /* 269 * unsolicited event handler 270 */ 271 272 #define HDA_UNSOL_QUEUE_SIZE 64 273 274 struct hda_bus_unsolicited { 275 /* ring buffer */ 276 u32 queue[HDA_UNSOL_QUEUE_SIZE * 2]; 277 unsigned int rp, wp; 278 279 /* workqueue */ 280 struct work_struct work; 281 struct hda_bus *bus; 282 }; 283 284 /* 285 * Helper for automatic ping configuration 286 */ 287 288 enum { 289 AUTO_PIN_MIC, 290 AUTO_PIN_FRONT_MIC, 291 AUTO_PIN_LINE, 292 AUTO_PIN_FRONT_LINE, 293 AUTO_PIN_CD, 294 AUTO_PIN_AUX, 295 AUTO_PIN_LAST 296 }; 297 298 enum { 299 AUTO_PIN_LINE_OUT, 300 AUTO_PIN_SPEAKER_OUT, 301 AUTO_PIN_HP_OUT 302 }; 303 304 extern const char *auto_pin_cfg_labels[AUTO_PIN_LAST]; 305 306 struct auto_pin_cfg { 307 int line_outs; 308 hda_nid_t line_out_pins[5]; /* sorted in the order of 309 * Front/Surr/CLFE/Side 310 */ 311 int speaker_outs; 312 hda_nid_t speaker_pins[5]; 313 int hp_outs; 314 int line_out_type; /* AUTO_PIN_XXX_OUT */ 315 hda_nid_t hp_pins[5]; 316 hda_nid_t input_pins[AUTO_PIN_LAST]; 317 hda_nid_t dig_out_pin; 318 hda_nid_t dig_in_pin; 319 }; 320 321 #define get_defcfg_connect(cfg) \ 322 ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT) 323 #define get_defcfg_association(cfg) \ 324 ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT) 325 #define get_defcfg_location(cfg) \ 326 ((cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT) 327 #define get_defcfg_sequence(cfg) \ 328 (cfg & AC_DEFCFG_SEQUENCE) 329 #define get_defcfg_device(cfg) \ 330 ((cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT) 331 332 int snd_hda_parse_pin_def_config(struct hda_codec *codec, 333 struct auto_pin_cfg *cfg, 334 hda_nid_t *ignore_nids); 335 336 /* amp values */ 337 #define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8)) 338 #define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8)) 339 #define AMP_OUT_MUTE 0xb080 340 #define AMP_OUT_UNMUTE 0xb000 341 #define AMP_OUT_ZERO 0xb000 342 /* pinctl values */ 343 #define PIN_IN 0x20 344 #define PIN_VREF80 0x24 345 #define PIN_VREF50 0x21 346 #define PIN_OUT 0x40 347 #define PIN_HP 0xc0 348 #define PIN_HP_AMP 0x80 349 350 /* 351 * get widget capabilities 352 */ 353 static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid) 354 { 355 if (nid < codec->start_nid || 356 nid >= codec->start_nid + codec->num_nodes) 357 return snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP); 358 return codec->wcaps[nid - codec->start_nid]; 359 } 360 361 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, 362 unsigned int caps); 363 364 /* 365 * hwdep interface 366 */ 367 int snd_hda_create_hwdep(struct hda_codec *codec); 368 369 /* 370 * power-management 371 */ 372 373 #ifdef CONFIG_SND_HDA_POWER_SAVE 374 void snd_hda_schedule_power_save(struct hda_codec *codec); 375 376 struct hda_amp_list { 377 hda_nid_t nid; 378 unsigned char dir; 379 unsigned char idx; 380 }; 381 382 struct hda_loopback_check { 383 struct hda_amp_list *amplist; 384 int power_on; 385 }; 386 387 int snd_hda_check_amp_list_power(struct hda_codec *codec, 388 struct hda_loopback_check *check, 389 hda_nid_t nid); 390 #endif /* CONFIG_SND_HDA_POWER_SAVE */ 391 392 #endif /* __SOUND_HDA_LOCAL_H */ 393