1 | /* SPDX-License-Identifier: GPL-2.0-or-later */
|
---|
2 | /*
|
---|
3 | * Universal Interface for Intel High Definition Audio Codec
|
---|
4 | *
|
---|
5 | * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
|
---|
6 | */
|
---|
7 |
|
---|
8 | #ifndef __SOUND_HDA_CODEC_H
|
---|
9 | #define __SOUND_HDA_CODEC_H
|
---|
10 |
|
---|
11 | #include <linux/refcount.h>
|
---|
12 | #include <linux/mod_devicetable.h>
|
---|
13 | #include <sound/info.h>
|
---|
14 | #include <sound/control.h>
|
---|
15 | #include <sound/pcm.h>
|
---|
16 | #include <sound/hwdep.h>
|
---|
17 | #include <sound/hdaudio.h>
|
---|
18 | #include <sound/hda_verbs.h>
|
---|
19 | #include <sound/hda_regmap.h>
|
---|
20 |
|
---|
21 | /*
|
---|
22 | * Structures
|
---|
23 | */
|
---|
24 |
|
---|
25 | struct hda_bus;
|
---|
26 | struct hda_beep;
|
---|
27 | struct hda_codec;
|
---|
28 | struct hda_pcm;
|
---|
29 | struct hda_pcm_stream;
|
---|
30 |
|
---|
31 | /*
|
---|
32 | * codec bus
|
---|
33 | *
|
---|
34 | * each controller needs to creata a hda_bus to assign the accessor.
|
---|
35 | * A hda_bus contains several codecs in the list codec_list.
|
---|
36 | */
|
---|
37 | struct hda_bus {
|
---|
38 | struct hdac_bus core;
|
---|
39 |
|
---|
40 | struct snd_card *card;
|
---|
41 |
|
---|
42 | struct pci_dev *pci;
|
---|
43 | const char *modelname;
|
---|
44 |
|
---|
45 | struct mutex prepare_mutex;
|
---|
46 |
|
---|
47 | /* assigned PCMs */
|
---|
48 | DECLARE_BITMAP(pcm_dev_bits, SNDRV_PCM_DEVICES);
|
---|
49 |
|
---|
50 | /* misc op flags */
|
---|
51 | unsigned int allow_bus_reset:1; /* allow bus reset at fatal error */
|
---|
52 | /* status for codec/controller */
|
---|
53 | unsigned int shutdown :1; /* being unloaded */
|
---|
54 | unsigned int response_reset:1; /* controller was reset */
|
---|
55 | unsigned int in_reset:1; /* during reset operation */
|
---|
56 | unsigned int no_response_fallback:1; /* don't fallback at RIRB error */
|
---|
57 | unsigned int bus_probing :1; /* during probing process */
|
---|
58 | unsigned int keep_power:1; /* keep power up for notification */
|
---|
59 | unsigned int jackpoll_in_suspend:1; /* keep jack polling during
|
---|
60 | * runtime suspend
|
---|
61 | */
|
---|
62 |
|
---|
63 | int primary_dig_out_type; /* primary digital out PCM type */
|
---|
64 | unsigned int mixer_assigned; /* codec addr for mixer name */
|
---|
65 | };
|
---|
66 |
|
---|
67 | /* from hdac_bus to hda_bus */
|
---|
68 | #define to_hda_bus(bus) container_of(bus, struct hda_bus, core)
|
---|
69 |
|
---|
70 | /*
|
---|
71 | * codec preset
|
---|
72 | *
|
---|
73 | * Known codecs have the patch to build and set up the controls/PCMs
|
---|
74 | * better than the generic parser.
|
---|
75 | */
|
---|
76 | typedef int (*hda_codec_patch_t)(struct hda_codec *);
|
---|
77 |
|
---|
78 | #define HDA_CODEC_ID_SKIP_PROBE 0x00000001
|
---|
79 | #define HDA_CODEC_ID_GENERIC_HDMI 0x00000101
|
---|
80 | #define HDA_CODEC_ID_GENERIC 0x00000201
|
---|
81 |
|
---|
82 | #define HDA_CODEC_REV_ENTRY(_vid, _rev, _name, _patch) \
|
---|
83 | { .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \
|
---|
84 | .api_version = HDA_DEV_LEGACY, \
|
---|
85 | .driver_data = (unsigned long)(_patch) }
|
---|
86 | #define HDA_CODEC_ENTRY(_vid, _name, _patch) \
|
---|
87 | HDA_CODEC_REV_ENTRY(_vid, 0, _name, _patch)
|
---|
88 |
|
---|
89 | struct hda_codec_driver {
|
---|
90 | struct hdac_driver core;
|
---|
91 | const struct hda_device_id *id;
|
---|
92 | };
|
---|
93 |
|
---|
94 | int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name,
|
---|
95 | struct module *owner);
|
---|
96 | #define hda_codec_driver_register(drv) \
|
---|
97 | __hda_codec_driver_register(drv, KBUILD_MODNAME, THIS_MODULE)
|
---|
98 | void hda_codec_driver_unregister(struct hda_codec_driver *drv);
|
---|
99 | #define module_hda_codec_driver(drv) \
|
---|
100 | module_driver(drv, hda_codec_driver_register, \
|
---|
101 | hda_codec_driver_unregister)
|
---|
102 |
|
---|
103 | /* ops set by the preset patch */
|
---|
104 | struct hda_codec_ops {
|
---|
105 | int (*build_controls)(struct hda_codec *codec);
|
---|
106 | int (*build_pcms)(struct hda_codec *codec);
|
---|
107 | int (*init)(struct hda_codec *codec);
|
---|
108 | void (*free)(struct hda_codec *codec);
|
---|
109 | void (*unsol_event)(struct hda_codec *codec, unsigned int res);
|
---|
110 | void (*set_power_state)(struct hda_codec *codec, hda_nid_t fg,
|
---|
111 | unsigned int power_state);
|
---|
112 | int (*suspend)(struct hda_codec *codec);
|
---|
113 | int (*resume)(struct hda_codec *codec);
|
---|
114 | int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid);
|
---|
115 | void (*stream_pm)(struct hda_codec *codec, hda_nid_t nid, bool on);
|
---|
116 | };
|
---|
117 |
|
---|
118 | /* PCM callbacks */
|
---|
119 | struct hda_pcm_ops {
|
---|
120 | int (*open)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
---|
121 | struct snd_pcm_substream *substream);
|
---|
122 | int (*close)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
---|
123 | struct snd_pcm_substream *substream);
|
---|
124 | int (*prepare)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
---|
125 | unsigned int stream_tag, unsigned int format,
|
---|
126 | struct snd_pcm_substream *substream);
|
---|
127 | int (*cleanup)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
---|
128 | struct snd_pcm_substream *substream);
|
---|
129 | unsigned int (*get_delay)(struct hda_pcm_stream *info,
|
---|
130 | struct hda_codec *codec,
|
---|
131 | struct snd_pcm_substream *substream);
|
---|
132 | };
|
---|
133 |
|
---|
134 | /* PCM information for each substream */
|
---|
135 | struct hda_pcm_stream {
|
---|
136 | unsigned int substreams; /* number of substreams, 0 = not exist*/
|
---|
137 | unsigned int channels_min; /* min. number of channels */
|
---|
138 | unsigned int channels_max; /* max. number of channels */
|
---|
139 | hda_nid_t nid; /* default NID to query rates/formats/bps, or set up */
|
---|
140 | u32 rates; /* supported rates */
|
---|
141 | u64 formats; /* supported formats (SNDRV_PCM_FMTBIT_) */
|
---|
142 | u32 subformats; /* for S32_LE format, SNDRV_PCM_SUBFMTBIT_* */
|
---|
143 | unsigned int maxbps; /* supported max. bit per sample */
|
---|
144 | const struct snd_pcm_chmap_elem *chmap; /* chmap to override */
|
---|
145 | struct hda_pcm_ops ops;
|
---|
146 | };
|
---|
147 |
|
---|
148 | /* PCM types */
|
---|
149 | enum {
|
---|
150 | HDA_PCM_TYPE_AUDIO,
|
---|
151 | HDA_PCM_TYPE_SPDIF,
|
---|
152 | HDA_PCM_TYPE_HDMI,
|
---|
153 | HDA_PCM_TYPE_MODEM,
|
---|
154 | HDA_PCM_NTYPES
|
---|
155 | };
|
---|
156 |
|
---|
157 | #define SNDRV_PCM_INVALID_DEVICE (-1)
|
---|
158 | /* for PCM creation */
|
---|
159 | struct hda_pcm {
|
---|
160 | char *name;
|
---|
161 | struct hda_pcm_stream stream[2];
|
---|
162 | unsigned int pcm_type; /* HDA_PCM_TYPE_XXX */
|
---|
163 | int device; /* device number to assign */
|
---|
164 | struct snd_pcm *pcm; /* assigned PCM instance */
|
---|
165 | bool own_chmap; /* codec driver provides own channel maps */
|
---|
166 | /* private: */
|
---|
167 | struct hda_codec *codec;
|
---|
168 | struct list_head list;
|
---|
169 | unsigned int disconnected:1;
|
---|
170 | };
|
---|
171 |
|
---|
172 | /* codec information */
|
---|
173 | struct hda_codec {
|
---|
174 | struct hdac_device core;
|
---|
175 | struct hda_bus *bus;
|
---|
176 | struct snd_card *card;
|
---|
177 | unsigned int addr; /* codec addr*/
|
---|
178 | u32 probe_id; /* overridden id for probing */
|
---|
179 |
|
---|
180 | /* detected preset */
|
---|
181 | const struct hda_device_id *preset;
|
---|
182 | const char *modelname; /* model name for preset */
|
---|
183 |
|
---|
184 | /* set by patch */
|
---|
185 | struct hda_codec_ops patch_ops;
|
---|
186 |
|
---|
187 | /* PCM to create, set by patch_ops.build_pcms callback */
|
---|
188 | struct list_head pcm_list_head;
|
---|
189 | refcount_t pcm_ref;
|
---|
190 | wait_queue_head_t remove_sleep;
|
---|
191 |
|
---|
192 | /* codec specific info */
|
---|
193 | void *spec;
|
---|
194 |
|
---|
195 | /* beep device */
|
---|
196 | struct hda_beep *beep;
|
---|
197 | unsigned int beep_mode;
|
---|
198 |
|
---|
199 | /* widget capabilities cache */
|
---|
200 | u32 *wcaps;
|
---|
201 |
|
---|
202 | struct snd_array mixers; /* list of assigned mixer elements */
|
---|
203 | struct snd_array nids; /* list of mapped mixer elements */
|
---|
204 |
|
---|
205 | struct list_head conn_list; /* linked-list of connection-list */
|
---|
206 |
|
---|
207 | struct mutex spdif_mutex;
|
---|
208 | struct mutex control_mutex;
|
---|
209 | struct snd_array spdif_out;
|
---|
210 | unsigned int spdif_in_enable; /* SPDIF input enable? */
|
---|
211 | const hda_nid_t *follower_dig_outs; /* optional digital out follower widgets */
|
---|
212 | struct snd_array init_pins; /* initial (BIOS) pin configurations */
|
---|
213 | struct snd_array driver_pins; /* pin configs set by codec parser */
|
---|
214 | struct snd_array cvt_setups; /* audio convert setups */
|
---|
215 |
|
---|
216 | struct mutex user_mutex;
|
---|
217 | #ifdef CONFIG_SND_HDA_RECONFIG
|
---|
218 | struct snd_array init_verbs; /* additional init verbs */
|
---|
219 | struct snd_array hints; /* additional hints */
|
---|
220 | struct snd_array user_pins; /* default pin configs to override */
|
---|
221 | #endif
|
---|
222 |
|
---|
223 | #ifdef CONFIG_SND_HDA_HWDEP
|
---|
224 | struct snd_hwdep *hwdep; /* assigned hwdep device */
|
---|
225 | #endif
|
---|
226 |
|
---|
227 | /* misc flags */
|
---|
228 | unsigned int configured:1; /* codec was configured */
|
---|
229 | unsigned int in_freeing:1; /* being released */
|
---|
230 | unsigned int display_power_control:1; /* needs display power */
|
---|
231 | unsigned int spdif_status_reset :1; /* needs to toggle SPDIF for each
|
---|
232 | * status change
|
---|
233 | * (e.g. Realtek codecs)
|
---|
234 | */
|
---|
235 | unsigned int pin_amp_workaround:1; /* pin out-amp takes index
|
---|
236 | * (e.g. Conexant codecs)
|
---|
237 | */
|
---|
238 | unsigned int single_adc_amp:1; /* adc in-amp takes no index
|
---|
239 | * (e.g. CX20549 codec)
|
---|
240 | */
|
---|
241 | unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */
|
---|
242 | unsigned int pins_shutup:1; /* pins are shut up */
|
---|
243 | unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
|
---|
244 | unsigned int no_jack_detect:1; /* Machine has no jack-detection */
|
---|
245 | unsigned int inv_eapd:1; /* broken h/w: inverted EAPD control */
|
---|
246 | unsigned int inv_jack_detect:1; /* broken h/w: inverted detection bit */
|
---|
247 | unsigned int pcm_format_first:1; /* PCM format must be set first */
|
---|
248 | unsigned int cached_write:1; /* write only to caches */
|
---|
249 | unsigned int dp_mst:1; /* support DP1.2 Multi-stream transport */
|
---|
250 | unsigned int dump_coef:1; /* dump processing coefs in codec proc file */
|
---|
251 | unsigned int power_save_node:1; /* advanced PM for each widget */
|
---|
252 | unsigned int auto_runtime_pm:1; /* enable automatic codec runtime pm */
|
---|
253 | unsigned int force_pin_prefix:1; /* Add location prefix */
|
---|
254 | unsigned int link_down_at_suspend:1; /* link down at runtime suspend */
|
---|
255 | unsigned int relaxed_resume:1; /* don't resume forcibly for jack */
|
---|
256 | unsigned int forced_resume:1; /* forced resume for jack */
|
---|
257 | unsigned int no_stream_clean_at_suspend:1; /* do not clean streams at suspend */
|
---|
258 | unsigned int ctl_dev_id:1; /* old control element id build behaviour */
|
---|
259 |
|
---|
260 | unsigned long power_on_acct;
|
---|
261 | unsigned long power_off_acct;
|
---|
262 | unsigned long power_jiffies;
|
---|
263 |
|
---|
264 | /* filter the requested power state per nid */
|
---|
265 | unsigned int (*power_filter)(struct hda_codec *codec, hda_nid_t nid,
|
---|
266 | unsigned int power_state);
|
---|
267 |
|
---|
268 | /* codec-specific additional proc output */
|
---|
269 | void (*proc_widget_hook)(struct snd_info_buffer *buffer,
|
---|
270 | struct hda_codec *codec, hda_nid_t nid);
|
---|
271 |
|
---|
272 | /* jack detection */
|
---|
273 | struct snd_array jacktbl;
|
---|
274 | unsigned long jackpoll_interval; /* In jiffies. Zero means no poll, rely on unsol events */
|
---|
275 | struct delayed_work jackpoll_work;
|
---|
276 |
|
---|
277 | int depop_delay; /* depop delay in ms, -1 for default delay time */
|
---|
278 |
|
---|
279 | /* fix-up list */
|
---|
280 | int fixup_id;
|
---|
281 | const struct hda_fixup *fixup_list;
|
---|
282 | const char *fixup_name;
|
---|
283 |
|
---|
284 | /* additional init verbs */
|
---|
285 | struct snd_array verbs;
|
---|
286 | };
|
---|
287 |
|
---|
288 | #define dev_to_hda_codec(_dev) container_of(_dev, struct hda_codec, core.dev)
|
---|
289 | #define hda_codec_dev(_dev) (&(_dev)->core.dev)
|
---|
290 |
|
---|
291 | #define hdac_to_hda_codec(_hdac) container_of(_hdac, struct hda_codec, core)
|
---|
292 |
|
---|
293 | #define list_for_each_codec(c, bus) \
|
---|
294 | list_for_each_entry(c, &(bus)->core.codec_list, core.list, struct hda_codec)
|
---|
295 | #define list_for_each_codec_safe(c, n, bus) \
|
---|
296 | list_for_each_entry_safe(c, n, &(bus)->core.codec_list, core.list, struct hda_codec)
|
---|
297 |
|
---|
298 | /* snd_hda_codec_read/write optional flags */
|
---|
299 | #define HDA_RW_NO_RESPONSE_FALLBACK (1 << 0)
|
---|
300 |
|
---|
301 | /*
|
---|
302 | * constructors
|
---|
303 | */
|
---|
304 | #ifndef TARGET_OS2
|
---|
305 | __printf(3, 4)
|
---|
306 | #endif
|
---|
307 | struct hda_codec *
|
---|
308 | snd_hda_codec_device_init(struct hda_bus *bus, unsigned int codec_addr,
|
---|
309 | const char *fmt, ...);
|
---|
310 | int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
|
---|
311 | unsigned int codec_addr, struct hda_codec **codecp);
|
---|
312 | int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card,
|
---|
313 | unsigned int codec_addr, struct hda_codec *codec,
|
---|
314 | bool snddev_managed);
|
---|
315 | int snd_hda_codec_configure(struct hda_codec *codec);
|
---|
316 | int snd_hda_codec_update_widgets(struct hda_codec *codec);
|
---|
317 | void snd_hda_codec_register(struct hda_codec *codec);
|
---|
318 | void snd_hda_codec_unregister(struct hda_codec *codec);
|
---|
319 | void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec);
|
---|
320 |
|
---|
321 | /*
|
---|
322 | * low level functions
|
---|
323 | */
|
---|
324 | static inline unsigned int
|
---|
325 | snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid,
|
---|
326 | int flags,
|
---|
327 | unsigned int verb, unsigned int parm)
|
---|
328 | {
|
---|
329 | return snd_hdac_codec_read(&codec->core, nid, flags, verb, parm);
|
---|
330 | }
|
---|
331 |
|
---|
332 | static inline int
|
---|
333 | snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int flags,
|
---|
334 | unsigned int verb, unsigned int parm)
|
---|
335 | {
|
---|
336 | return snd_hdac_codec_write(&codec->core, nid, flags, verb, parm);
|
---|
337 | }
|
---|
338 |
|
---|
339 | #define snd_hda_param_read(codec, nid, param) \
|
---|
340 | snd_hdac_read_parm(&(codec)->core, nid, param)
|
---|
341 | #define snd_hda_get_sub_nodes(codec, nid, start_nid) \
|
---|
342 | snd_hdac_get_sub_nodes(&(codec)->core, nid, start_nid)
|
---|
343 | int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
|
---|
344 | hda_nid_t *conn_list, int max_conns);
|
---|
345 | static inline int
|
---|
346 | snd_hda_get_num_conns(struct hda_codec *codec, hda_nid_t nid)
|
---|
347 | {
|
---|
348 | return snd_hda_get_connections(codec, nid, NULL, 0);
|
---|
349 | }
|
---|
350 |
|
---|
351 | #define snd_hda_get_raw_connections(codec, nid, list, max_conns) \
|
---|
352 | snd_hdac_get_connections(&(codec)->core, nid, list, max_conns)
|
---|
353 | #define snd_hda_get_num_raw_conns(codec, nid) \
|
---|
354 | snd_hdac_get_connections(&(codec)->core, nid, NULL, 0)
|
---|
355 |
|
---|
356 | int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid,
|
---|
357 | const hda_nid_t **listp);
|
---|
358 | int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int nums,
|
---|
359 | const hda_nid_t *list);
|
---|
360 | int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux,
|
---|
361 | hda_nid_t nid, int recursive);
|
---|
362 | unsigned int snd_hda_get_num_devices(struct hda_codec *codec, hda_nid_t nid);
|
---|
363 | int snd_hda_get_devices(struct hda_codec *codec, hda_nid_t nid,
|
---|
364 | u8 *dev_list, int max_devices);
|
---|
365 | int snd_hda_get_dev_select(struct hda_codec *codec, hda_nid_t nid);
|
---|
366 | int snd_hda_set_dev_select(struct hda_codec *codec, hda_nid_t nid, int dev_id);
|
---|
367 |
|
---|
368 | struct hda_verb {
|
---|
369 | hda_nid_t nid;
|
---|
370 | u32 verb;
|
---|
371 | u32 param;
|
---|
372 | };
|
---|
373 |
|
---|
374 | void snd_hda_sequence_write(struct hda_codec *codec,
|
---|
375 | const struct hda_verb *seq);
|
---|
376 |
|
---|
377 | /* cached write */
|
---|
378 | static inline int
|
---|
379 | snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid,
|
---|
380 | int flags, unsigned int verb, unsigned int parm)
|
---|
381 | {
|
---|
382 | return snd_hdac_regmap_write(&codec->core, nid, verb, parm);
|
---|
383 | }
|
---|
384 |
|
---|
385 | /* the struct for codec->pin_configs */
|
---|
386 | struct hda_pincfg {
|
---|
387 | hda_nid_t nid;
|
---|
388 | unsigned char ctrl; /* original pin control value */
|
---|
389 | unsigned char target; /* target pin control value */
|
---|
390 | unsigned int cfg; /* default configuration */
|
---|
391 | };
|
---|
392 |
|
---|
393 | unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid);
|
---|
394 | int snd_hda_codec_set_pincfg(struct hda_codec *codec, hda_nid_t nid,
|
---|
395 | unsigned int cfg);
|
---|
396 | int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
|
---|
397 | hda_nid_t nid, unsigned int cfg); /* for hwdep */
|
---|
398 | void snd_hda_shutup_pins(struct hda_codec *codec);
|
---|
399 |
|
---|
400 | /* SPDIF controls */
|
---|
401 | struct hda_spdif_out {
|
---|
402 | hda_nid_t nid; /* Converter nid values relate to */
|
---|
403 | unsigned int status; /* IEC958 status bits */
|
---|
404 | unsigned short ctls; /* SPDIF control bits */
|
---|
405 | };
|
---|
406 | struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec,
|
---|
407 | hda_nid_t nid);
|
---|
408 | void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx);
|
---|
409 | void snd_hda_spdif_ctls_assign(struct hda_codec *codec, int idx, hda_nid_t nid);
|
---|
410 |
|
---|
411 | /*
|
---|
412 | * Mixer
|
---|
413 | */
|
---|
414 | int snd_hda_codec_build_controls(struct hda_codec *codec);
|
---|
415 |
|
---|
416 | /*
|
---|
417 | * PCM
|
---|
418 | */
|
---|
419 | int snd_hda_codec_parse_pcms(struct hda_codec *codec);
|
---|
420 | int snd_hda_codec_build_pcms(struct hda_codec *codec);
|
---|
421 |
|
---|
422 | #ifndef TARGET_OS2
|
---|
423 | __printf(2, 3)
|
---|
424 | #endif
|
---|
425 | struct hda_pcm *snd_hda_codec_pcm_new(struct hda_codec *codec,
|
---|
426 | const char *fmt, ...);
|
---|
427 |
|
---|
428 | void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec);
|
---|
429 |
|
---|
430 | static inline void snd_hda_codec_pcm_get(struct hda_pcm *pcm)
|
---|
431 | {
|
---|
432 | refcount_inc(&pcm->codec->pcm_ref);
|
---|
433 | }
|
---|
434 | void snd_hda_codec_pcm_put(struct hda_pcm *pcm);
|
---|
435 |
|
---|
436 | int snd_hda_codec_prepare(struct hda_codec *codec,
|
---|
437 | struct hda_pcm_stream *hinfo,
|
---|
438 | unsigned int stream,
|
---|
439 | unsigned int format,
|
---|
440 | struct snd_pcm_substream *substream);
|
---|
441 | void snd_hda_codec_cleanup(struct hda_codec *codec,
|
---|
442 | struct hda_pcm_stream *hinfo,
|
---|
443 | struct snd_pcm_substream *substream);
|
---|
444 |
|
---|
445 | void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
|
---|
446 | u32 stream_tag,
|
---|
447 | int channel_id, int format);
|
---|
448 | void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid,
|
---|
449 | int do_now);
|
---|
450 | #define snd_hda_codec_cleanup_stream(codec, nid) \
|
---|
451 | __snd_hda_codec_cleanup_stream(codec, nid, 0)
|
---|
452 |
|
---|
453 | #define snd_hda_query_supported_pcm(codec, nid, ratesp, fmtsp, subfmtp, bpsp) \
|
---|
454 | snd_hdac_query_supported_pcm(&(codec)->core, nid, ratesp, fmtsp, subfmtp, bpsp)
|
---|
455 | #define snd_hda_is_supported_format(codec, nid, fmt) \
|
---|
456 | snd_hdac_is_supported_format(&(codec)->core, nid, fmt)
|
---|
457 |
|
---|
458 | extern const struct snd_pcm_chmap_elem snd_pcm_2_1_chmaps[];
|
---|
459 |
|
---|
460 | int snd_hda_attach_pcm_stream(struct hda_bus *_bus, struct hda_codec *codec,
|
---|
461 | struct hda_pcm *cpcm);
|
---|
462 |
|
---|
463 | /*
|
---|
464 | * Misc
|
---|
465 | */
|
---|
466 | void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen);
|
---|
467 | void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
|
---|
468 | unsigned int power_state);
|
---|
469 |
|
---|
470 | int snd_hda_lock_devices(struct hda_bus *bus);
|
---|
471 | void snd_hda_unlock_devices(struct hda_bus *bus);
|
---|
472 | void snd_hda_bus_reset(struct hda_bus *bus);
|
---|
473 | void snd_hda_bus_reset_codecs(struct hda_bus *bus);
|
---|
474 |
|
---|
475 | int snd_hda_codec_set_name(struct hda_codec *codec, const char *name);
|
---|
476 |
|
---|
477 | /*
|
---|
478 | * power management
|
---|
479 | */
|
---|
480 | extern const struct dev_pm_ops hda_codec_driver_pm;
|
---|
481 |
|
---|
482 | static inline
|
---|
483 | int hda_call_check_power_status(struct hda_codec *codec, hda_nid_t nid)
|
---|
484 | {
|
---|
485 | if (codec->patch_ops.check_power_status)
|
---|
486 | return codec->patch_ops.check_power_status(codec, nid);
|
---|
487 | return 0;
|
---|
488 | }
|
---|
489 |
|
---|
490 | /*
|
---|
491 | * power saving
|
---|
492 | */
|
---|
493 | #define snd_hda_power_up(codec) snd_hdac_power_up(&(codec)->core)
|
---|
494 | #define snd_hda_power_up_pm(codec) snd_hdac_power_up_pm(&(codec)->core)
|
---|
495 | #define snd_hda_power_down(codec) snd_hdac_power_down(&(codec)->core)
|
---|
496 | #define snd_hda_power_down_pm(codec) snd_hdac_power_down_pm(&(codec)->core)
|
---|
497 | void snd_hda_codec_set_power_save(struct hda_codec *codec, int delay);
|
---|
498 | void snd_hda_set_power_save(struct hda_bus *bus, int delay);
|
---|
499 | void snd_hda_update_power_acct(struct hda_codec *codec);
|
---|
500 |
|
---|
501 | static inline bool hda_codec_need_resume(struct hda_codec *codec)
|
---|
502 | {
|
---|
503 | return !codec->relaxed_resume && codec->jacktbl.used;
|
---|
504 | }
|
---|
505 |
|
---|
506 | #ifdef CONFIG_SND_HDA_PATCH_LOADER
|
---|
507 | /*
|
---|
508 | * patch firmware
|
---|
509 | */
|
---|
510 | int snd_hda_load_patch(struct hda_bus *bus, size_t size, const void *buf);
|
---|
511 | #endif
|
---|
512 |
|
---|
513 | #ifdef CONFIG_SND_HDA_DSP_LOADER
|
---|
514 | int snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
|
---|
515 | unsigned int size,
|
---|
516 | struct snd_dma_buffer *bufp);
|
---|
517 | void snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start);
|
---|
518 | void snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
|
---|
519 | struct snd_dma_buffer *dmab);
|
---|
520 | #else
|
---|
521 | static inline int
|
---|
522 | snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
|
---|
523 | unsigned int size,
|
---|
524 | struct snd_dma_buffer *bufp)
|
---|
525 | {
|
---|
526 | return -ENOSYS;
|
---|
527 | }
|
---|
528 | static inline void
|
---|
529 | snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start) {}
|
---|
530 | static inline void
|
---|
531 | snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
|
---|
532 | struct snd_dma_buffer *dmab) {}
|
---|
533 | #endif
|
---|
534 |
|
---|
535 | #endif /* __SOUND_HDA_CODEC_H */
|
---|