2 * Universal Interface for Intel High Definition Audio Codec
4 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc., 59
18 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #ifndef __SOUND_HDA_CODEC_H
22 #define __SOUND_HDA_CODEC_H
24 #include <linux/kref.h>
25 #include <sound/info.h>
26 #include <sound/control.h>
27 #include <sound/pcm.h>
28 #include <sound/hwdep.h>
29 #include <sound/hdaudio.h>
30 #include <sound/hda_verbs.h>
38 unsigned int elem_size
;
39 unsigned int alloc_align
;
43 void *snd_array_new(struct snd_array
*array
);
44 void snd_array_free(struct snd_array
*array
);
45 static inline void snd_array_init(struct snd_array
*array
, unsigned int size
,
48 array
->elem_size
= size
;
49 array
->alloc_align
= align
;
52 static inline void *snd_array_elem(struct snd_array
*array
, unsigned int idx
)
54 return array
->list
+ idx
* array
->elem_size
;
57 static inline unsigned int snd_array_index(struct snd_array
*array
, void *ptr
)
59 return (unsigned long)(ptr
- array
->list
) / array
->elem_size
;
70 struct hda_pcm_stream
;
73 typedef u16 hda_nid_t
;
77 /* send a single command */
78 int (*command
)(struct hda_bus
*bus
, unsigned int cmd
);
79 /* get a response from the last command */
80 unsigned int (*get_response
)(struct hda_bus
*bus
, unsigned int addr
);
81 /* free the private data */
82 void (*private_free
)(struct hda_bus
*);
83 /* attach a PCM stream */
84 int (*attach_pcm
)(struct hda_bus
*bus
, struct hda_codec
*codec
,
86 /* reset bus for retry verb */
87 void (*bus_reset
)(struct hda_bus
*bus
);
88 #ifdef CONFIG_SND_HDA_DSP_LOADER
89 /* prepare DSP transfer */
90 int (*load_dsp_prepare
)(struct hda_bus
*bus
, unsigned int format
,
91 unsigned int byte_size
,
92 struct snd_dma_buffer
*bufp
);
93 /* start/stop DSP transfer */
94 void (*load_dsp_trigger
)(struct hda_bus
*bus
, bool start
);
95 /* clean up DSP transfer */
96 void (*load_dsp_cleanup
)(struct hda_bus
*bus
,
97 struct snd_dma_buffer
*dmab
);
104 * each controller needs to creata a hda_bus to assign the accessor.
105 * A hda_bus contains several codecs in the list codec_list.
108 struct hdac_bus core
;
110 struct snd_card
*card
;
114 const char *modelname
;
115 struct hda_bus_ops ops
;
117 struct mutex prepare_mutex
;
120 DECLARE_BITMAP(pcm_dev_bits
, SNDRV_PCM_DEVICES
);
123 unsigned int needs_damn_long_delay
:1;
124 unsigned int allow_bus_reset
:1; /* allow bus reset at fatal error */
125 /* status for codec/controller */
126 unsigned int shutdown
:1; /* being unloaded */
127 unsigned int rirb_error
:1; /* error in codec communication */
128 unsigned int response_reset
:1; /* controller was reset */
129 unsigned int in_reset
:1; /* during reset operation */
130 unsigned int no_response_fallback
:1; /* don't fallback at RIRB error */
132 int primary_dig_out_type
; /* primary digital out PCM type */
138 * Known codecs have the patch to build and set up the controls/PCMs
139 * better than the generic parser.
141 struct hda_codec_preset
{
145 unsigned int subs_mask
;
149 int (*patch
)(struct hda_codec
*codec
);
152 #define HDA_CODEC_ID_GENERIC_HDMI 0x00000101
153 #define HDA_CODEC_ID_GENERIC 0x00000201
155 struct hda_codec_driver
{
156 struct hdac_driver core
;
157 const struct hda_codec_preset
*preset
;
160 int __hda_codec_driver_register(struct hda_codec_driver
*drv
, const char *name
,
161 struct module
*owner
);
162 #define hda_codec_driver_register(drv) \
163 __hda_codec_driver_register(drv, KBUILD_MODNAME, THIS_MODULE)
164 void hda_codec_driver_unregister(struct hda_codec_driver
*drv
);
165 #define module_hda_codec_driver(drv) \
166 module_driver(drv, hda_codec_driver_register, \
167 hda_codec_driver_unregister)
169 /* ops set by the preset patch */
170 struct hda_codec_ops
{
171 int (*build_controls
)(struct hda_codec
*codec
);
172 int (*build_pcms
)(struct hda_codec
*codec
);
173 int (*init
)(struct hda_codec
*codec
);
174 void (*free
)(struct hda_codec
*codec
);
175 void (*unsol_event
)(struct hda_codec
*codec
, unsigned int res
);
176 void (*set_power_state
)(struct hda_codec
*codec
, hda_nid_t fg
,
177 unsigned int power_state
);
179 int (*suspend
)(struct hda_codec
*codec
);
180 int (*resume
)(struct hda_codec
*codec
);
181 int (*check_power_status
)(struct hda_codec
*codec
, hda_nid_t nid
);
183 void (*reboot_notify
)(struct hda_codec
*codec
);
184 void (*stream_pm
)(struct hda_codec
*codec
, hda_nid_t nid
, bool on
);
187 /* record for amp information cache */
188 struct hda_cache_head
{
189 u32 key
:31; /* hash key */
191 u16 val
; /* assigned value */
195 struct hda_amp_info
{
196 struct hda_cache_head head
;
197 u32 amp_caps
; /* amp capabilities */
198 u16 vol
[2]; /* current volume & mute */
201 struct hda_cache_rec
{
202 u16 hash
[64]; /* hash table for index */
203 struct snd_array buf
; /* record entries */
208 int (*open
)(struct hda_pcm_stream
*info
, struct hda_codec
*codec
,
209 struct snd_pcm_substream
*substream
);
210 int (*close
)(struct hda_pcm_stream
*info
, struct hda_codec
*codec
,
211 struct snd_pcm_substream
*substream
);
212 int (*prepare
)(struct hda_pcm_stream
*info
, struct hda_codec
*codec
,
213 unsigned int stream_tag
, unsigned int format
,
214 struct snd_pcm_substream
*substream
);
215 int (*cleanup
)(struct hda_pcm_stream
*info
, struct hda_codec
*codec
,
216 struct snd_pcm_substream
*substream
);
217 unsigned int (*get_delay
)(struct hda_pcm_stream
*info
,
218 struct hda_codec
*codec
,
219 struct snd_pcm_substream
*substream
);
222 /* PCM information for each substream */
223 struct hda_pcm_stream
{
224 unsigned int substreams
; /* number of substreams, 0 = not exist*/
225 unsigned int channels_min
; /* min. number of channels */
226 unsigned int channels_max
; /* max. number of channels */
227 hda_nid_t nid
; /* default NID to query rates/formats/bps, or set up */
228 u32 rates
; /* supported rates */
229 u64 formats
; /* supported formats (SNDRV_PCM_FMTBIT_) */
230 unsigned int maxbps
; /* supported max. bit per sample */
231 const struct snd_pcm_chmap_elem
*chmap
; /* chmap to override */
232 struct hda_pcm_ops ops
;
244 /* for PCM creation */
247 struct hda_pcm_stream stream
[2];
248 unsigned int pcm_type
; /* HDA_PCM_TYPE_XXX */
249 int device
; /* device number to assign */
250 struct snd_pcm
*pcm
; /* assigned PCM instance */
251 bool own_chmap
; /* codec driver provides own channel maps */
253 struct hda_codec
*codec
;
255 struct list_head list
;
258 /* codec information */
260 struct hdac_device core
;
262 struct snd_card
*card
;
263 unsigned int addr
; /* codec addr*/
265 hda_nid_t afg
; /* AFG node id */
266 hda_nid_t mfg
; /* MFG node id */
276 u32 probe_id
; /* overridden id for probing */
278 /* detected preset */
279 const struct hda_codec_preset
*preset
;
280 const char *vendor_name
; /* codec vendor name */
281 const char *chip_name
; /* codec chip name */
282 const char *modelname
; /* model name for preset */
285 struct hda_codec_ops patch_ops
;
287 /* PCM to create, set by patch_ops.build_pcms callback */
288 struct list_head pcm_list_head
;
290 /* codec specific info */
294 struct hda_beep
*beep
;
295 unsigned int beep_mode
;
297 /* widget capabilities cache */
298 unsigned int num_nodes
;
302 struct snd_array mixers
; /* list of assigned mixer elements */
303 struct snd_array nids
; /* list of mapped mixer elements */
305 struct hda_cache_rec amp_cache
; /* cache for amp access */
306 struct hda_cache_rec cmd_cache
; /* cache for other commands */
308 struct list_head conn_list
; /* linked-list of connection-list */
310 struct mutex spdif_mutex
;
311 struct mutex control_mutex
;
312 struct mutex hash_mutex
;
313 struct snd_array spdif_out
;
314 unsigned int spdif_in_enable
; /* SPDIF input enable? */
315 const hda_nid_t
*slave_dig_outs
; /* optional digital out slave widgets */
316 struct snd_array init_pins
; /* initial (BIOS) pin configurations */
317 struct snd_array driver_pins
; /* pin configs set by codec parser */
318 struct snd_array cvt_setups
; /* audio convert setups */
320 struct mutex user_mutex
;
321 #ifdef CONFIG_SND_HDA_RECONFIG
322 struct snd_array init_verbs
; /* additional init verbs */
323 struct snd_array hints
; /* additional hints */
324 struct snd_array user_pins
; /* default pin configs to override */
327 #ifdef CONFIG_SND_HDA_HWDEP
328 struct snd_hwdep
*hwdep
; /* assigned hwdep device */
332 unsigned int in_freeing
:1; /* being released */
333 unsigned int spdif_status_reset
:1; /* needs to toggle SPDIF for each
335 * (e.g. Realtek codecs)
337 unsigned int pin_amp_workaround
:1; /* pin out-amp takes index
338 * (e.g. Conexant codecs)
340 unsigned int single_adc_amp
:1; /* adc in-amp takes no index
341 * (e.g. CX20549 codec)
343 unsigned int no_sticky_stream
:1; /* no sticky-PCM stream assignment */
344 unsigned int pins_shutup
:1; /* pins are shut up */
345 unsigned int no_trigger_sense
:1; /* don't trigger at pin-sensing */
346 unsigned int no_jack_detect
:1; /* Machine has no jack-detection */
347 unsigned int inv_eapd
:1; /* broken h/w: inverted EAPD control */
348 unsigned int inv_jack_detect
:1; /* broken h/w: inverted detection bit */
349 unsigned int pcm_format_first
:1; /* PCM format must be set first */
350 unsigned int epss
:1; /* supporting EPSS? */
351 unsigned int cached_write
:1; /* write only to caches */
352 unsigned int dp_mst
:1; /* support DP1.2 Multi-stream transport */
353 unsigned int dump_coef
:1; /* dump processing coefs in codec proc file */
354 unsigned int power_save_node
:1; /* advanced PM for each widget */
356 unsigned int d3_stop_clk
:1; /* support D3 operation without BCLK */
357 atomic_t in_pm
; /* suspend/resume being performed */
358 unsigned long power_on_acct
;
359 unsigned long power_off_acct
;
360 unsigned long power_jiffies
;
363 /* filter the requested power state per nid */
364 unsigned int (*power_filter
)(struct hda_codec
*codec
, hda_nid_t nid
,
365 unsigned int power_state
);
367 /* codec-specific additional proc output */
368 void (*proc_widget_hook
)(struct snd_info_buffer
*buffer
,
369 struct hda_codec
*codec
, hda_nid_t nid
);
372 struct snd_array jacktbl
;
373 unsigned long jackpoll_interval
; /* In jiffies. Zero means no poll, rely on unsol events */
374 struct delayed_work jackpoll_work
;
376 #ifdef CONFIG_SND_HDA_INPUT_JACK
378 struct snd_array jacks
;
381 int depop_delay
; /* depop delay in ms, -1 for default delay time */
385 const struct hda_fixup
*fixup_list
;
386 const char *fixup_name
;
388 /* additional init verbs */
389 struct snd_array verbs
;
392 #define dev_to_hda_codec(_dev) container_of(_dev, struct hda_codec, core.dev)
393 #define hda_codec_dev(_dev) (&(_dev)->core.dev)
395 #define list_for_each_codec(c, bus) \
396 list_for_each_entry(c, &(bus)->core.codec_list, core.list)
400 HDA_INPUT
, HDA_OUTPUT
403 /* snd_hda_codec_read/write optional flags */
404 #define HDA_RW_NO_RESPONSE_FALLBACK (1 << 0)
409 int snd_hda_bus_new(struct snd_card
*card
, struct hda_bus
**busp
);
410 int snd_hda_codec_new(struct hda_bus
*bus
, struct snd_card
*card
,
411 unsigned int codec_addr
, struct hda_codec
**codecp
);
412 int snd_hda_codec_configure(struct hda_codec
*codec
);
413 int snd_hda_codec_update_widgets(struct hda_codec
*codec
);
416 * low level functions
418 unsigned int snd_hda_codec_read(struct hda_codec
*codec
, hda_nid_t nid
,
420 unsigned int verb
, unsigned int parm
);
421 int snd_hda_codec_write(struct hda_codec
*codec
, hda_nid_t nid
, int flags
,
422 unsigned int verb
, unsigned int parm
);
423 #define snd_hda_param_read(codec, nid, param) \
424 snd_hda_codec_read(codec, nid, 0, AC_VERB_PARAMETERS, param)
425 int snd_hda_get_sub_nodes(struct hda_codec
*codec
, hda_nid_t nid
,
426 hda_nid_t
*start_id
);
427 int snd_hda_get_connections(struct hda_codec
*codec
, hda_nid_t nid
,
428 hda_nid_t
*conn_list
, int max_conns
);
430 snd_hda_get_num_conns(struct hda_codec
*codec
, hda_nid_t nid
)
432 return snd_hda_get_connections(codec
, nid
, NULL
, 0);
434 int snd_hda_get_num_raw_conns(struct hda_codec
*codec
, hda_nid_t nid
);
435 int snd_hda_get_raw_connections(struct hda_codec
*codec
, hda_nid_t nid
,
436 hda_nid_t
*conn_list
, int max_conns
);
437 int snd_hda_get_conn_list(struct hda_codec
*codec
, hda_nid_t nid
,
438 const hda_nid_t
**listp
);
439 int snd_hda_override_conn_list(struct hda_codec
*codec
, hda_nid_t nid
, int nums
,
440 const hda_nid_t
*list
);
441 int snd_hda_get_conn_index(struct hda_codec
*codec
, hda_nid_t mux
,
442 hda_nid_t nid
, int recursive
);
443 int snd_hda_get_devices(struct hda_codec
*codec
, hda_nid_t nid
,
444 u8
*dev_list
, int max_devices
);
445 int snd_hda_query_supported_pcm(struct hda_codec
*codec
, hda_nid_t nid
,
446 u32
*ratesp
, u64
*formatsp
, unsigned int *bpsp
);
454 void snd_hda_sequence_write(struct hda_codec
*codec
,
455 const struct hda_verb
*seq
);
457 /* unsolicited event */
459 snd_hda_queue_unsol_event(struct hda_bus
*bus
, u32 res
, u32 res_ex
)
461 snd_hdac_bus_queue_event(&bus
->core
, res
, res_ex
);
465 int snd_hda_codec_write_cache(struct hda_codec
*codec
, hda_nid_t nid
,
466 int flags
, unsigned int verb
, unsigned int parm
);
467 void snd_hda_sequence_write_cache(struct hda_codec
*codec
,
468 const struct hda_verb
*seq
);
469 int snd_hda_codec_update_cache(struct hda_codec
*codec
, hda_nid_t nid
,
470 int flags
, unsigned int verb
, unsigned int parm
);
471 void snd_hda_codec_resume_cache(struct hda_codec
*codec
);
472 /* both for cmd & amp caches */
473 void snd_hda_codec_flush_cache(struct hda_codec
*codec
);
475 /* the struct for codec->pin_configs */
478 unsigned char ctrl
; /* original pin control value */
479 unsigned char target
; /* target pin control value */
480 unsigned int cfg
; /* default configuration */
483 unsigned int snd_hda_codec_get_pincfg(struct hda_codec
*codec
, hda_nid_t nid
);
484 int snd_hda_codec_set_pincfg(struct hda_codec
*codec
, hda_nid_t nid
,
486 int snd_hda_add_pincfg(struct hda_codec
*codec
, struct snd_array
*list
,
487 hda_nid_t nid
, unsigned int cfg
); /* for hwdep */
488 void snd_hda_shutup_pins(struct hda_codec
*codec
);
491 struct hda_spdif_out
{
492 hda_nid_t nid
; /* Converter nid values relate to */
493 unsigned int status
; /* IEC958 status bits */
494 unsigned short ctls
; /* SPDIF control bits */
496 struct hda_spdif_out
*snd_hda_spdif_out_of_nid(struct hda_codec
*codec
,
498 void snd_hda_spdif_ctls_unassign(struct hda_codec
*codec
, int idx
);
499 void snd_hda_spdif_ctls_assign(struct hda_codec
*codec
, int idx
, hda_nid_t nid
);
504 int snd_hda_codec_build_controls(struct hda_codec
*codec
);
509 int snd_hda_codec_parse_pcms(struct hda_codec
*codec
);
510 int snd_hda_codec_build_pcms(struct hda_codec
*codec
);
513 struct hda_pcm
*snd_hda_codec_pcm_new(struct hda_codec
*codec
,
514 const char *fmt
, ...);
516 static inline void snd_hda_codec_pcm_get(struct hda_pcm
*pcm
)
518 kref_get(&pcm
->kref
);
520 void snd_hda_codec_pcm_put(struct hda_pcm
*pcm
);
522 int snd_hda_codec_prepare(struct hda_codec
*codec
,
523 struct hda_pcm_stream
*hinfo
,
526 struct snd_pcm_substream
*substream
);
527 void snd_hda_codec_cleanup(struct hda_codec
*codec
,
528 struct hda_pcm_stream
*hinfo
,
529 struct snd_pcm_substream
*substream
);
531 void snd_hda_codec_setup_stream(struct hda_codec
*codec
, hda_nid_t nid
,
533 int channel_id
, int format
);
534 void __snd_hda_codec_cleanup_stream(struct hda_codec
*codec
, hda_nid_t nid
,
536 #define snd_hda_codec_cleanup_stream(codec, nid) \
537 __snd_hda_codec_cleanup_stream(codec, nid, 0)
538 unsigned int snd_hda_calc_stream_format(struct hda_codec
*codec
,
540 unsigned int channels
,
543 unsigned short spdif_ctls
);
544 int snd_hda_is_supported_format(struct hda_codec
*codec
, hda_nid_t nid
,
545 unsigned int format
);
547 extern const struct snd_pcm_chmap_elem snd_pcm_2_1_chmaps
[];
552 void snd_hda_get_codec_name(struct hda_codec
*codec
, char *name
, int namelen
);
553 void snd_hda_codec_set_power_to_all(struct hda_codec
*codec
, hda_nid_t fg
,
554 unsigned int power_state
);
556 int snd_hda_lock_devices(struct hda_bus
*bus
);
557 void snd_hda_unlock_devices(struct hda_bus
*bus
);
558 void snd_hda_bus_reset(struct hda_bus
*bus
);
563 extern const struct dev_pm_ops hda_codec_driver_pm
;
566 int hda_call_check_power_status(struct hda_codec
*codec
, hda_nid_t nid
)
569 if (codec
->patch_ops
.check_power_status
)
570 return codec
->patch_ops
.check_power_status(codec
, nid
);
576 * get widget information
578 const char *snd_hda_get_jack_connectivity(u32 cfg
);
579 const char *snd_hda_get_jack_type(u32 cfg
);
580 const char *snd_hda_get_jack_location(u32 cfg
);
586 void snd_hda_power_up(struct hda_codec
*codec
);
587 void snd_hda_power_down(struct hda_codec
*codec
);
588 void snd_hda_set_power_save(struct hda_bus
*bus
, int delay
);
589 void snd_hda_update_power_acct(struct hda_codec
*codec
);
591 static inline void snd_hda_power_up(struct hda_codec
*codec
) {}
592 static inline void snd_hda_power_down(struct hda_codec
*codec
) {}
593 static inline void snd_hda_set_power_save(struct hda_bus
*bus
, int delay
) {}
596 #ifdef CONFIG_SND_HDA_PATCH_LOADER
600 int snd_hda_load_patch(struct hda_bus
*bus
, size_t size
, const void *buf
);
603 #ifdef CONFIG_SND_HDA_DSP_LOADER
605 snd_hda_codec_load_dsp_prepare(struct hda_codec
*codec
, unsigned int format
,
607 struct snd_dma_buffer
*bufp
)
609 return codec
->bus
->ops
.load_dsp_prepare(codec
->bus
, format
, size
, bufp
);
612 snd_hda_codec_load_dsp_trigger(struct hda_codec
*codec
, bool start
)
614 return codec
->bus
->ops
.load_dsp_trigger(codec
->bus
, start
);
617 snd_hda_codec_load_dsp_cleanup(struct hda_codec
*codec
,
618 struct snd_dma_buffer
*dmab
)
620 return codec
->bus
->ops
.load_dsp_cleanup(codec
->bus
, dmab
);
624 snd_hda_codec_load_dsp_prepare(struct hda_codec
*codec
, unsigned int format
,
626 struct snd_dma_buffer
*bufp
)
631 snd_hda_codec_load_dsp_trigger(struct hda_codec
*codec
, bool start
) {}
633 snd_hda_codec_load_dsp_cleanup(struct hda_codec
*codec
,
634 struct snd_dma_buffer
*dmab
) {}
637 #endif /* __SOUND_HDA_CODEC_H */