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 #ifdef CONFIG_PM 88 void snd_hda_codec_resume_amp(struct hda_codec *codec); 89 #endif 90 91 /* mono switch binding multiple inputs */ 92 #define HDA_BIND_MUTE_MONO(xname, nid, channel, indices, direction) \ 93 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \ 94 .info = snd_hda_mixer_amp_switch_info, \ 95 .get = snd_hda_mixer_bind_switch_get, \ 96 .put = snd_hda_mixer_bind_switch_put, \ 97 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, indices, direction) } 98 99 /* stereo switch binding multiple inputs */ 100 #define HDA_BIND_MUTE(xname,nid,indices,dir) \ 101 HDA_BIND_MUTE_MONO(xname,nid,3,indices,dir) 102 103 int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, 104 struct snd_ctl_elem_value *ucontrol); 105 int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, 106 struct snd_ctl_elem_value *ucontrol); 107 108 /* more generic bound controls */ 109 struct hda_ctl_ops { 110 snd_kcontrol_info_t *info; 111 snd_kcontrol_get_t *get; 112 snd_kcontrol_put_t *put; 113 snd_kcontrol_tlv_rw_t *tlv; 114 }; 115 116 extern struct hda_ctl_ops snd_hda_bind_vol; /* for bind-volume with TLV */ 117 extern struct hda_ctl_ops snd_hda_bind_sw; /* for bind-switch */ 118 119 struct hda_bind_ctls { 120 struct hda_ctl_ops *ops; 121 long values[]; 122 }; 123 124 int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, 125 struct snd_ctl_elem_info *uinfo); 126 int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol, 127 struct snd_ctl_elem_value *ucontrol); 128 int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol, 129 struct snd_ctl_elem_value *ucontrol); 130 int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag, 131 unsigned int size, unsigned int __user *tlv); 132 133 #define HDA_BIND_VOL(xname, bindrec) \ 134 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 135 .name = xname, \ 136 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\ 137 SNDRV_CTL_ELEM_ACCESS_TLV_READ |\ 138 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,\ 139 .info = snd_hda_mixer_bind_ctls_info,\ 140 .get = snd_hda_mixer_bind_ctls_get,\ 141 .put = snd_hda_mixer_bind_ctls_put,\ 142 .tlv = { .c = snd_hda_mixer_bind_tlv },\ 143 .private_value = (long) (bindrec) } 144 #define HDA_BIND_SW(xname, bindrec) \ 145 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\ 146 .name = xname, \ 147 .info = snd_hda_mixer_bind_ctls_info,\ 148 .get = snd_hda_mixer_bind_ctls_get,\ 149 .put = snd_hda_mixer_bind_ctls_put,\ 150 .private_value = (long) (bindrec) } 151 152 /* 153 * SPDIF I/O 154 */ 155 int snd_hda_create_spdif_out_ctls(struct hda_codec *codec, hda_nid_t nid); 156 int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid); 157 158 /* 159 * input MUX helper 160 */ 161 #define HDA_MAX_NUM_INPUTS 16 162 struct hda_input_mux_item { 163 const char *label; 164 unsigned int index; 165 }; 166 struct hda_input_mux { 167 unsigned int num_items; 168 struct hda_input_mux_item items[HDA_MAX_NUM_INPUTS]; 169 }; 170 171 int snd_hda_input_mux_info(const struct hda_input_mux *imux, 172 struct snd_ctl_elem_info *uinfo); 173 int snd_hda_input_mux_put(struct hda_codec *codec, 174 const struct hda_input_mux *imux, 175 struct snd_ctl_elem_value *ucontrol, hda_nid_t nid, 176 unsigned int *cur_val); 177 178 /* 179 * Channel mode helper 180 */ 181 struct hda_channel_mode { 182 int channels; 183 const struct hda_verb *sequence; 184 }; 185 186 int snd_hda_ch_mode_info(struct hda_codec *codec, 187 struct snd_ctl_elem_info *uinfo, 188 const struct hda_channel_mode *chmode, 189 int num_chmodes); 190 int snd_hda_ch_mode_get(struct hda_codec *codec, 191 struct snd_ctl_elem_value *ucontrol, 192 const struct hda_channel_mode *chmode, 193 int num_chmodes, 194 int max_channels); 195 int snd_hda_ch_mode_put(struct hda_codec *codec, 196 struct snd_ctl_elem_value *ucontrol, 197 const struct hda_channel_mode *chmode, 198 int num_chmodes, 199 int *max_channelsp); 200 201 /* 202 * Multi-channel / digital-out PCM helper 203 */ 204 205 enum { HDA_FRONT, HDA_REAR, HDA_CLFE, HDA_SIDE }; /* index for dac_nidx */ 206 enum { HDA_DIG_NONE, HDA_DIG_EXCLUSIVE, HDA_DIG_ANALOG_DUP }; /* dig_out_used */ 207 208 struct hda_multi_out { 209 int num_dacs; /* # of DACs, must be more than 1 */ 210 hda_nid_t *dac_nids; /* DAC list */ 211 hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */ 212 hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */ 213 hda_nid_t dig_out_nid; /* digital out audio widget */ 214 int max_channels; /* currently supported analog channels */ 215 int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ 216 }; 217 218 int snd_hda_multi_out_dig_open(struct hda_codec *codec, 219 struct hda_multi_out *mout); 220 int snd_hda_multi_out_dig_close(struct hda_codec *codec, 221 struct hda_multi_out *mout); 222 int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, 223 struct hda_multi_out *mout, 224 unsigned int stream_tag, 225 unsigned int format, 226 struct snd_pcm_substream *substream); 227 int snd_hda_multi_out_analog_open(struct hda_codec *codec, 228 struct hda_multi_out *mout, 229 struct snd_pcm_substream *substream); 230 int snd_hda_multi_out_analog_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_cleanup(struct hda_codec *codec, 236 struct hda_multi_out *mout); 237 238 /* 239 * generic codec parser 240 */ 241 int snd_hda_parse_generic_codec(struct hda_codec *codec); 242 243 /* 244 * generic proc interface 245 */ 246 #ifdef CONFIG_PROC_FS 247 int snd_hda_codec_proc_new(struct hda_codec *codec); 248 #else 249 static inline int snd_hda_codec_proc_new(struct hda_codec *codec) { return 0; } 250 #endif 251 252 /* 253 * Misc 254 */ 255 int snd_hda_check_board_config(struct hda_codec *codec, int num_configs, 256 const char **modelnames, 257 const struct snd_pci_quirk *pci_list); 258 int snd_hda_add_new_ctls(struct hda_codec *codec, 259 struct snd_kcontrol_new *knew); 260 261 /* 262 * unsolicited event handler 263 */ 264 265 #define HDA_UNSOL_QUEUE_SIZE 64 266 267 struct hda_bus_unsolicited { 268 /* ring buffer */ 269 u32 queue[HDA_UNSOL_QUEUE_SIZE * 2]; 270 unsigned int rp, wp; 271 272 /* workqueue */ 273 struct work_struct work; 274 struct hda_bus *bus; 275 }; 276 277 /* 278 * Helper for automatic ping configuration 279 */ 280 281 enum { 282 AUTO_PIN_MIC, 283 AUTO_PIN_FRONT_MIC, 284 AUTO_PIN_LINE, 285 AUTO_PIN_FRONT_LINE, 286 AUTO_PIN_CD, 287 AUTO_PIN_AUX, 288 AUTO_PIN_LAST 289 }; 290 291 enum { 292 AUTO_PIN_LINE_OUT, 293 AUTO_PIN_SPEAKER_OUT, 294 AUTO_PIN_HP_OUT 295 }; 296 297 extern const char *auto_pin_cfg_labels[AUTO_PIN_LAST]; 298 299 struct auto_pin_cfg { 300 int line_outs; 301 hda_nid_t line_out_pins[5]; /* sorted in the order of 302 * Front/Surr/CLFE/Side 303 */ 304 int speaker_outs; 305 hda_nid_t speaker_pins[5]; 306 int hp_outs; 307 int line_out_type; /* AUTO_PIN_XXX_OUT */ 308 hda_nid_t hp_pins[5]; 309 hda_nid_t input_pins[AUTO_PIN_LAST]; 310 hda_nid_t dig_out_pin; 311 hda_nid_t dig_in_pin; 312 }; 313 314 #define get_defcfg_connect(cfg) \ 315 ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT) 316 #define get_defcfg_association(cfg) \ 317 ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT) 318 #define get_defcfg_location(cfg) \ 319 ((cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT) 320 #define get_defcfg_sequence(cfg) \ 321 (cfg & AC_DEFCFG_SEQUENCE) 322 #define get_defcfg_device(cfg) \ 323 ((cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT) 324 325 int snd_hda_parse_pin_def_config(struct hda_codec *codec, 326 struct auto_pin_cfg *cfg, 327 hda_nid_t *ignore_nids); 328 329 /* amp values */ 330 #define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8)) 331 #define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8)) 332 #define AMP_OUT_MUTE 0xb080 333 #define AMP_OUT_UNMUTE 0xb000 334 #define AMP_OUT_ZERO 0xb000 335 /* pinctl values */ 336 #define PIN_IN 0x20 337 #define PIN_VREF80 0x24 338 #define PIN_VREF50 0x21 339 #define PIN_OUT 0x40 340 #define PIN_HP 0xc0 341 #define PIN_HP_AMP 0x80 342 343 /* 344 * get widget capabilities 345 */ 346 static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid) 347 { 348 if (nid < codec->start_nid || 349 nid >= codec->start_nid + codec->num_nodes) 350 return snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP); 351 return codec->wcaps[nid - codec->start_nid]; 352 } 353 354 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, 355 unsigned int caps); 356 357 /* 358 * hwdep interface 359 */ 360 int snd_hda_create_hwdep(struct hda_codec *codec); 361 362 #endif /* __SOUND_HDA_LOCAL_H */ 363