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