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 int no_share_stream; /* don't share a stream with multiple pins */ 224 }; 225 226 int snd_hda_multi_out_dig_open(struct hda_codec *codec, 227 struct hda_multi_out *mout); 228 int snd_hda_multi_out_dig_close(struct hda_codec *codec, 229 struct hda_multi_out *mout); 230 int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, 231 struct hda_multi_out *mout, 232 unsigned int stream_tag, 233 unsigned int format, 234 struct snd_pcm_substream *substream); 235 int snd_hda_multi_out_analog_open(struct hda_codec *codec, 236 struct hda_multi_out *mout, 237 struct snd_pcm_substream *substream); 238 int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, 239 struct hda_multi_out *mout, 240 unsigned int stream_tag, 241 unsigned int format, 242 struct snd_pcm_substream *substream); 243 int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, 244 struct hda_multi_out *mout); 245 246 /* 247 * generic codec parser 248 */ 249 #ifdef CONFIG_SND_HDA_GENERIC 250 int snd_hda_parse_generic_codec(struct hda_codec *codec); 251 #else 252 static inline int snd_hda_parse_generic_codec(struct hda_codec *codec) 253 { 254 return -ENODEV; 255 } 256 #endif 257 258 /* 259 * generic proc interface 260 */ 261 #ifdef CONFIG_PROC_FS 262 int snd_hda_codec_proc_new(struct hda_codec *codec); 263 #else 264 static inline int snd_hda_codec_proc_new(struct hda_codec *codec) { return 0; } 265 #endif 266 267 /* 268 * Misc 269 */ 270 int snd_hda_check_board_config(struct hda_codec *codec, int num_configs, 271 const char **modelnames, 272 const struct snd_pci_quirk *pci_list); 273 int snd_hda_add_new_ctls(struct hda_codec *codec, 274 struct snd_kcontrol_new *knew); 275 276 /* 277 * unsolicited event handler 278 */ 279 280 #define HDA_UNSOL_QUEUE_SIZE 64 281 282 struct hda_bus_unsolicited { 283 /* ring buffer */ 284 u32 queue[HDA_UNSOL_QUEUE_SIZE * 2]; 285 unsigned int rp, wp; 286 287 /* workqueue */ 288 struct work_struct work; 289 struct hda_bus *bus; 290 }; 291 292 /* 293 * Helper for automatic ping configuration 294 */ 295 296 enum { 297 AUTO_PIN_MIC, 298 AUTO_PIN_FRONT_MIC, 299 AUTO_PIN_LINE, 300 AUTO_PIN_FRONT_LINE, 301 AUTO_PIN_CD, 302 AUTO_PIN_AUX, 303 AUTO_PIN_LAST 304 }; 305 306 enum { 307 AUTO_PIN_LINE_OUT, 308 AUTO_PIN_SPEAKER_OUT, 309 AUTO_PIN_HP_OUT 310 }; 311 312 extern const char *auto_pin_cfg_labels[AUTO_PIN_LAST]; 313 314 #define AUTO_CFG_MAX_OUTS 5 315 316 struct auto_pin_cfg { 317 int line_outs; 318 /* sorted in the order of Front/Surr/CLFE/Side */ 319 hda_nid_t line_out_pins[AUTO_CFG_MAX_OUTS]; 320 int speaker_outs; 321 hda_nid_t speaker_pins[AUTO_CFG_MAX_OUTS]; 322 int hp_outs; 323 int line_out_type; /* AUTO_PIN_XXX_OUT */ 324 hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS]; 325 hda_nid_t input_pins[AUTO_PIN_LAST]; 326 hda_nid_t dig_out_pin; 327 hda_nid_t dig_in_pin; 328 }; 329 330 #define get_defcfg_connect(cfg) \ 331 ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT) 332 #define get_defcfg_association(cfg) \ 333 ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT) 334 #define get_defcfg_location(cfg) \ 335 ((cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT) 336 #define get_defcfg_sequence(cfg) \ 337 (cfg & AC_DEFCFG_SEQUENCE) 338 #define get_defcfg_device(cfg) \ 339 ((cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT) 340 341 int snd_hda_parse_pin_def_config(struct hda_codec *codec, 342 struct auto_pin_cfg *cfg, 343 hda_nid_t *ignore_nids); 344 345 /* amp values */ 346 #define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8)) 347 #define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8)) 348 #define AMP_OUT_MUTE 0xb080 349 #define AMP_OUT_UNMUTE 0xb000 350 #define AMP_OUT_ZERO 0xb000 351 /* pinctl values */ 352 #define PIN_IN 0x20 353 #define PIN_VREF80 0x24 354 #define PIN_VREF50 0x21 355 #define PIN_OUT 0x40 356 #define PIN_HP 0xc0 357 #define PIN_HP_AMP 0x80 358 359 /* 360 * get widget capabilities 361 */ 362 static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid) 363 { 364 if (nid < codec->start_nid || 365 nid >= codec->start_nid + codec->num_nodes) 366 return snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP); 367 return codec->wcaps[nid - codec->start_nid]; 368 } 369 370 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, 371 unsigned int caps); 372 373 /* 374 * hwdep interface 375 */ 376 int snd_hda_create_hwdep(struct hda_codec *codec); 377 378 /* 379 * power-management 380 */ 381 382 #ifdef CONFIG_SND_HDA_POWER_SAVE 383 void snd_hda_schedule_power_save(struct hda_codec *codec); 384 385 struct hda_amp_list { 386 hda_nid_t nid; 387 unsigned char dir; 388 unsigned char idx; 389 }; 390 391 struct hda_loopback_check { 392 struct hda_amp_list *amplist; 393 int power_on; 394 }; 395 396 int snd_hda_check_amp_list_power(struct hda_codec *codec, 397 struct hda_loopback_check *check, 398 hda_nid_t nid); 399 #endif /* CONFIG_SND_HDA_POWER_SAVE */ 400 401 #endif /* __SOUND_HDA_LOCAL_H */ 402