hda_codec.h 20.7 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * Universal Interface for Intel High Definition Audio Codec
 *
 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
 *
 *  This program is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the Free
 *  Software Foundation; either version 2 of the License, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful, but WITHOUT
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 *  more details.
 *
 *  You should have received a copy of the GNU General Public License along with
 *  this program; if not, write to the Free Software Foundation, Inc., 59
 *  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#ifndef __SOUND_HDA_CODEC_H
#define __SOUND_HDA_CODEC_H

#include <sound/info.h>
#include <sound/control.h>
#include <sound/pcm.h>
27
#include <sound/hwdep.h>
28
#include <sound/hda_verbs.h>
L
Linus Torvalds 已提交
29

T
Takashi Iwai 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
/*
 * generic arrays
 */
struct snd_array {
	unsigned int used;
	unsigned int alloced;
	unsigned int elem_size;
	unsigned int alloc_align;
	void *list;
};

void *snd_array_new(struct snd_array *array);
void snd_array_free(struct snd_array *array);
static inline void snd_array_init(struct snd_array *array, unsigned int size,
				  unsigned int align)
{
	array->elem_size = size;
	array->alloc_align = align;
}

50 51 52 53 54 55 56 57 58 59
static inline void *snd_array_elem(struct snd_array *array, unsigned int idx)
{
	return array->list + idx * array->elem_size;
}

static inline unsigned int snd_array_index(struct snd_array *array, void *ptr)
{
	return (unsigned long)(ptr - array->list) / array->elem_size;
}

L
Linus Torvalds 已提交
60 61 62 63 64
/*
 * Structures
 */

struct hda_bus;
65
struct hda_beep;
L
Linus Torvalds 已提交
66 67 68 69 70 71 72 73 74 75 76
struct hda_codec;
struct hda_pcm;
struct hda_pcm_stream;
struct hda_bus_unsolicited;

/* NID type */
typedef u16 hda_nid_t;

/* bus operators */
struct hda_bus_ops {
	/* send a single command */
77
	int (*command)(struct hda_bus *bus, unsigned int cmd);
L
Linus Torvalds 已提交
78
	/* get a response from the last command */
79
	unsigned int (*get_response)(struct hda_bus *bus, unsigned int addr);
L
Linus Torvalds 已提交
80 81
	/* free the private data */
	void (*private_free)(struct hda_bus *);
82
	/* attach a PCM stream */
83 84
	int (*attach_pcm)(struct hda_bus *bus, struct hda_codec *codec,
			  struct hda_pcm *pcm);
85 86
	/* reset bus for retry verb */
	void (*bus_reset)(struct hda_bus *bus);
87
#ifdef CONFIG_PM
J
Joe Perches 已提交
88
	/* notify power-up/down from codec to controller */
89
	void (*pm_notify)(struct hda_bus *bus, bool power_up);
90
#endif
91 92 93 94 95 96 97 98 99 100 101
#ifdef CONFIG_SND_HDA_DSP_LOADER
	/* prepare DSP transfer */
	int (*load_dsp_prepare)(struct hda_bus *bus, unsigned int format,
				unsigned int byte_size,
				struct snd_dma_buffer *bufp);
	/* start/stop DSP transfer */
	void (*load_dsp_trigger)(struct hda_bus *bus, bool start);
	/* clean up DSP transfer */
	void (*load_dsp_cleanup)(struct hda_bus *bus,
				 struct snd_dma_buffer *dmab);
#endif
L
Linus Torvalds 已提交
102 103 104 105 106 107 108
};

/* template to pass to the bus constructor */
struct hda_bus_template {
	void *private_data;
	struct pci_dev *pci;
	const char *modelname;
109
	int *power_save;
L
Linus Torvalds 已提交
110 111 112 113 114 115 116 117 118 119
	struct hda_bus_ops ops;
};

/*
 * codec bus
 *
 * each controller needs to creata a hda_bus to assign the accessor.
 * A hda_bus contains several codecs in the list codec_list.
 */
struct hda_bus {
120
	struct snd_card *card;
L
Linus Torvalds 已提交
121 122 123 124 125

	/* copied from template */
	void *private_data;
	struct pci_dev *pci;
	const char *modelname;
126
	int *power_save;
L
Linus Torvalds 已提交
127 128 129 130
	struct hda_bus_ops ops;

	/* codec linked list */
	struct list_head codec_list;
131
	unsigned int num_codecs;
132 133
	/* link caddr -> codec */
	struct hda_codec *caddr_tbl[HDA_MAX_CODEC_ADDRESS + 1];
L
Linus Torvalds 已提交
134

135
	struct mutex cmd_mutex;
136
	struct mutex prepare_mutex;
L
Linus Torvalds 已提交
137 138 139

	/* unsolicited event queue */
	struct hda_bus_unsolicited *unsol;
140
	char workq_name[16];
T
Takashi Iwai 已提交
141
	struct workqueue_struct *workq;	/* common workqueue for codecs */
L
Linus Torvalds 已提交
142

T
Takashi Iwai 已提交
143 144 145
	/* assigned PCMs */
	DECLARE_BITMAP(pcm_dev_bits, SNDRV_PCM_DEVICES);

146 147
	/* misc op flags */
	unsigned int needs_damn_long_delay :1;
148 149 150
	unsigned int allow_bus_reset:1;	/* allow bus reset at fatal error */
	unsigned int sync_write:1;	/* sync after verb write */
	/* status for codec/controller */
151
	unsigned int shutdown :1;	/* being unloaded */
152
	unsigned int rirb_error:1;	/* error in codec communication */
153 154
	unsigned int response_reset:1;	/* controller was reset */
	unsigned int in_reset:1;	/* during reset operation */
W
Wu Fengguang 已提交
155
	unsigned int power_keep_link_on:1; /* don't power off HDA link */
156
	unsigned int no_response_fallback:1; /* don't fallback at RIRB error */
157 158

	int primary_dig_out_type;	/* primary digital out PCM type */
L
Linus Torvalds 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172
};

/*
 * codec preset
 *
 * Known codecs have the patch to build and set up the controls/PCMs
 * better than the generic parser.
 */
struct hda_codec_preset {
	unsigned int id;
	unsigned int mask;
	unsigned int subs;
	unsigned int subs_mask;
	unsigned int rev;
173
	hda_nid_t afg, mfg;
L
Linus Torvalds 已提交
174 175 176 177
	const char *name;
	int (*patch)(struct hda_codec *codec);
};
	
178 179 180 181 182 183 184 185 186 187
struct hda_codec_preset_list {
	const struct hda_codec_preset *preset;
	struct module *owner;
	struct list_head list;
};

/* initial hook */
int snd_hda_add_codec_preset(struct hda_codec_preset_list *preset);
int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset);

L
Linus Torvalds 已提交
188 189 190 191 192 193 194
/* ops set by the preset patch */
struct hda_codec_ops {
	int (*build_controls)(struct hda_codec *codec);
	int (*build_pcms)(struct hda_codec *codec);
	int (*init)(struct hda_codec *codec);
	void (*free)(struct hda_codec *codec);
	void (*unsol_event)(struct hda_codec *codec, unsigned int res);
195 196
	void (*set_power_state)(struct hda_codec *codec, hda_nid_t fg,
				unsigned int power_state);
197
#ifdef CONFIG_PM
198
	int (*suspend)(struct hda_codec *codec);
L
Linus Torvalds 已提交
199
	int (*resume)(struct hda_codec *codec);
200 201
	int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid);
#endif
202
	void (*reboot_notify)(struct hda_codec *codec);
L
Linus Torvalds 已提交
203 204 205
};

/* record for amp information cache */
206
struct hda_cache_head {
207 208
	u32 key:31;		/* hash key */
	u32 dirty:1;
209
	u16 val;		/* assigned value */
210
	u16 next;
211 212 213 214
};

struct hda_amp_info {
	struct hda_cache_head head;
L
Linus Torvalds 已提交
215
	u32 amp_caps;		/* amp capabilities */
216
	u16 vol[2];		/* current volume & mute */
217 218 219 220
};

struct hda_cache_rec {
	u16 hash[64];			/* hash table for index */
221
	struct snd_array buf;		/* record entries */
L
Linus Torvalds 已提交
222 223 224 225 226
};

/* PCM callbacks */
struct hda_pcm_ops {
	int (*open)(struct hda_pcm_stream *info, struct hda_codec *codec,
227
		    struct snd_pcm_substream *substream);
L
Linus Torvalds 已提交
228
	int (*close)(struct hda_pcm_stream *info, struct hda_codec *codec,
229
		     struct snd_pcm_substream *substream);
L
Linus Torvalds 已提交
230 231
	int (*prepare)(struct hda_pcm_stream *info, struct hda_codec *codec,
		       unsigned int stream_tag, unsigned int format,
232
		       struct snd_pcm_substream *substream);
L
Linus Torvalds 已提交
233
	int (*cleanup)(struct hda_pcm_stream *info, struct hda_codec *codec,
234
		       struct snd_pcm_substream *substream);
235 236 237
	unsigned int (*get_delay)(struct hda_pcm_stream *info,
				  struct hda_codec *codec,
				  struct snd_pcm_substream *substream);
L
Linus Torvalds 已提交
238 239 240 241
};

/* PCM information for each substream */
struct hda_pcm_stream {
242
	unsigned int substreams;	/* number of substreams, 0 = not exist*/
L
Linus Torvalds 已提交
243 244 245 246 247 248
	unsigned int channels_min;	/* min. number of channels */
	unsigned int channels_max;	/* max. number of channels */
	hda_nid_t nid;	/* default NID to query rates/formats/bps, or set up */
	u32 rates;	/* supported rates */
	u64 formats;	/* supported formats (SNDRV_PCM_FMTBIT_) */
	unsigned int maxbps;	/* supported max. bit per sample */
249
	const struct snd_pcm_chmap_elem *chmap; /* chmap to override */
L
Linus Torvalds 已提交
250 251 252
	struct hda_pcm_ops ops;
};

253 254 255 256 257 258 259 260 261
/* PCM types */
enum {
	HDA_PCM_TYPE_AUDIO,
	HDA_PCM_TYPE_SPDIF,
	HDA_PCM_TYPE_HDMI,
	HDA_PCM_TYPE_MODEM,
	HDA_PCM_NTYPES
};

L
Linus Torvalds 已提交
262 263 264 265
/* for PCM creation */
struct hda_pcm {
	char *name;
	struct hda_pcm_stream stream[2];
266
	unsigned int pcm_type;	/* HDA_PCM_TYPE_XXX */
267 268
	int device;		/* device number to assign */
	struct snd_pcm *pcm;	/* assigned PCM instance */
269
	bool own_chmap;		/* codec driver provides own channel maps */
L
Linus Torvalds 已提交
270 271 272 273
};

/* codec information */
struct hda_codec {
274
	struct device dev;
L
Linus Torvalds 已提交
275 276 277 278 279
	struct hda_bus *bus;
	unsigned int addr;	/* codec addr*/
	struct list_head list;	/* list point */

	hda_nid_t afg;	/* AFG node id */
S
Sasha Khapyorsky 已提交
280
	hda_nid_t mfg;	/* MFG node id */
L
Linus Torvalds 已提交
281 282

	/* ids */
283 284 285 286
	u8 afg_function_id;
	u8 mfg_function_id;
	u8 afg_unsol;
	u8 mfg_unsol;
L
Linus Torvalds 已提交
287 288 289 290 291 292
	u32 vendor_id;
	u32 subsystem_id;
	u32 revision_id;

	/* detected preset */
	const struct hda_codec_preset *preset;
293
	struct module *owner;
294
	int (*parser)(struct hda_codec *codec);
295 296
	const char *vendor_name;	/* codec vendor name */
	const char *chip_name;		/* codec chip name */
297
	const char *modelname;	/* model name for preset */
L
Linus Torvalds 已提交
298 299 300 301 302 303 304 305 306 307 308

	/* set by patch */
	struct hda_codec_ops patch_ops;

	/* PCM to create, set by patch_ops.build_pcms callback */
	unsigned int num_pcms;
	struct hda_pcm *pcm_info;

	/* codec specific info */
	void *spec;

309 310
	/* beep device */
	struct hda_beep *beep;
311
	unsigned int beep_mode;
312

313 314 315 316 317
	/* widget capabilities cache */
	unsigned int num_nodes;
	hda_nid_t start_nid;
	u32 *wcaps;

T
Takashi Iwai 已提交
318
	struct snd_array mixers;	/* list of assigned mixer elements */
319
	struct snd_array nids;		/* list of mapped mixer elements */
T
Takashi Iwai 已提交
320

321
	struct hda_cache_rec amp_cache;	/* cache for amp access */
322
	struct hda_cache_rec cmd_cache;	/* cache for other commands */
L
Linus Torvalds 已提交
323

324
	struct list_head conn_list;	/* linked-list of connection-list */
325

326
	struct mutex spdif_mutex;
327
	struct mutex control_mutex;
328
	struct mutex hash_mutex;
329
	struct snd_array spdif_out;
L
Linus Torvalds 已提交
330
	unsigned int spdif_in_enable;	/* SPDIF input enable? */
331
	const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */
332
	struct snd_array init_pins;	/* initial (BIOS) pin configurations */
333
	struct snd_array driver_pins;	/* pin configs set by codec parser */
334
	struct snd_array cvt_setups;	/* audio convert setups */
335

336
	struct mutex user_mutex;
337
#ifdef CONFIG_SND_HDA_RECONFIG
T
Takashi Iwai 已提交
338
	struct snd_array init_verbs;	/* additional init verbs */
T
Takashi Iwai 已提交
339
	struct snd_array hints;		/* additional hints */
340
	struct snd_array user_pins;	/* default pin configs to override */
T
Takashi Iwai 已提交
341
#endif
342

343 344 345 346
#ifdef CONFIG_SND_HDA_HWDEP
	struct snd_hwdep *hwdep;	/* assigned hwdep device */
#endif

347 348 349 350 351
	/* misc flags */
	unsigned int spdif_status_reset :1; /* needs to toggle SPDIF for each
					     * status change
					     * (e.g. Realtek codecs)
					     */
352 353 354
	unsigned int pin_amp_workaround:1; /* pin out-amp takes index
					    * (e.g. Conexant codecs)
					    */
355 356 357
	unsigned int single_adc_amp:1; /* adc in-amp takes no index
					* (e.g. CX20549 codec)
					*/
358
	unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */
359
	unsigned int pins_shutup:1;	/* pins are shut up */
360
	unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
361
	unsigned int no_jack_detect:1;	/* Machine has no jack-detection */
362
	unsigned int inv_eapd:1; /* broken h/w: inverted EAPD control */
363
	unsigned int inv_jack_detect:1;	/* broken h/w: inverted detection bit */
364
	unsigned int pcm_format_first:1; /* PCM format must be set first */
365
	unsigned int epss:1;		/* supporting EPSS? */
366
	unsigned int cached_write:1;	/* write only to caches */
367
	unsigned int dp_mst:1; /* support DP1.2 Multi-stream transport */
368
	unsigned int dump_coef:1; /* dump processing coefs in codec proc file */
369
#ifdef CONFIG_PM
370
	unsigned int power_on :1;	/* current (global) power-state */
371
	unsigned int d3_stop_clk:1;	/* support D3 operation without BCLK */
372
	unsigned int pm_up_notified:1;	/* PM notified to controller */
373
	unsigned int in_pm:1;		/* suspend/resume being performed */
374
	int power_transition;	/* power-state in transition */
375 376
	int power_count;	/* current (global) power refcount */
	struct delayed_work power_work; /* delayed task for powerdown */
377 378 379
	unsigned long power_on_acct;
	unsigned long power_off_acct;
	unsigned long power_jiffies;
380
	spinlock_t power_lock;
381
#endif
382

383 384 385 386
	/* filter the requested power state per nid */
	unsigned int (*power_filter)(struct hda_codec *codec, hda_nid_t nid,
				     unsigned int power_state);

387 388 389
	/* codec-specific additional proc output */
	void (*proc_widget_hook)(struct snd_info_buffer *buffer,
				 struct hda_codec *codec, hda_nid_t nid);
390

391 392
	/* jack detection */
	struct snd_array jacktbl;
393 394
	unsigned long jackpoll_interval; /* In jiffies. Zero means no poll, rely on unsol events */
	struct delayed_work jackpoll_work;
395

396 397 398 399
#ifdef CONFIG_SND_HDA_INPUT_JACK
	/* jack detection */
	struct snd_array jacks;
#endif
400

401 402
	int depop_delay; /* depop delay in ms, -1 for default delay time */

403 404 405 406 407 408 409
	/* fix-up list */
	int fixup_id;
	const struct hda_fixup *fixup_list;
	const char *fixup_name;

	/* additional init verbs */
	struct snd_array verbs;
L
Linus Torvalds 已提交
410 411 412 413 414 415 416
};

/* direction */
enum {
	HDA_INPUT, HDA_OUTPUT
};

417 418
/* snd_hda_codec_read/write optional flags */
#define HDA_RW_NO_RESPONSE_FALLBACK	(1 << 0)
L
Linus Torvalds 已提交
419 420 421 422

/*
 * constructors
 */
423
int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp,
L
Linus Torvalds 已提交
424 425
		    struct hda_bus **busp);
int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr,
426 427
		      struct hda_codec **codecp);
int snd_hda_codec_configure(struct hda_codec *codec);
428
int snd_hda_codec_update_widgets(struct hda_codec *codec);
L
Linus Torvalds 已提交
429 430 431 432

/*
 * low level functions
 */
433
unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid,
434
				int flags,
L
Linus Torvalds 已提交
435
				unsigned int verb, unsigned int parm);
436
int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int flags,
L
Linus Torvalds 已提交
437
			unsigned int verb, unsigned int parm);
438 439 440 441 442 443
#define snd_hda_param_read(codec, nid, param) \
	snd_hda_codec_read(codec, nid, 0, AC_VERB_PARAMETERS, param)
int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid,
			  hda_nid_t *start_id);
int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
			    hda_nid_t *conn_list, int max_conns);
444 445 446 447 448
static inline int
snd_hda_get_num_conns(struct hda_codec *codec, hda_nid_t nid)
{
	return snd_hda_get_connections(codec, nid, NULL, 0);
}
449
int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid);
450 451
int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
			    hda_nid_t *conn_list, int max_conns);
452 453
int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid,
			  const hda_nid_t **listp);
454 455
int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int nums,
			  const hda_nid_t *list);
456 457
int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux,
			   hda_nid_t nid, int recursive);
458 459
int snd_hda_get_devices(struct hda_codec *codec, hda_nid_t nid,
			u8 *dev_list, int max_devices);
460 461
int snd_hda_query_supported_pcm(struct hda_codec *codec, hda_nid_t nid,
				u32 *ratesp, u64 *formatsp, unsigned int *bpsp);
L
Linus Torvalds 已提交
462 463 464 465 466 467 468

struct hda_verb {
	hda_nid_t nid;
	u32 verb;
	u32 param;
};

469 470
void snd_hda_sequence_write(struct hda_codec *codec,
			    const struct hda_verb *seq);
L
Linus Torvalds 已提交
471 472 473 474

/* unsolicited event */
int snd_hda_queue_unsol_event(struct hda_bus *bus, u32 res, u32 res_ex);

475 476
/* cached write */
int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid,
477
			      int flags, unsigned int verb, unsigned int parm);
478 479
void snd_hda_sequence_write_cache(struct hda_codec *codec,
				  const struct hda_verb *seq);
480
int snd_hda_codec_update_cache(struct hda_codec *codec, hda_nid_t nid,
481
			      int flags, unsigned int verb, unsigned int parm);
482
void snd_hda_codec_resume_cache(struct hda_codec *codec);
483 484
/* both for cmd & amp caches */
void snd_hda_codec_flush_cache(struct hda_codec *codec);
485

486 487 488
/* the struct for codec->pin_configs */
struct hda_pincfg {
	hda_nid_t nid;
489 490
	unsigned char ctrl;	/* original pin control value */
	unsigned char target;	/* target pin control value */
491
	unsigned int cfg;	/* default configuration */
492 493 494 495 496 497 498
};

unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid);
int snd_hda_codec_set_pincfg(struct hda_codec *codec, hda_nid_t nid,
			     unsigned int cfg);
int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
		       hda_nid_t nid, unsigned int cfg); /* for hwdep */
499
void snd_hda_shutup_pins(struct hda_codec *codec);
500

501 502 503 504 505 506 507 508
/* SPDIF controls */
struct hda_spdif_out {
	hda_nid_t nid;		/* Converter nid values relate to */
	unsigned int status;	/* IEC958 status bits */
	unsigned short ctls;	/* SPDIF control bits */
};
struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec,
					       hda_nid_t nid);
509 510
void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx);
void snd_hda_spdif_ctls_assign(struct hda_codec *codec, int idx, hda_nid_t nid);
511

L
Linus Torvalds 已提交
512 513 514 515
/*
 * Mixer
 */
int snd_hda_build_controls(struct hda_bus *bus);
516
int snd_hda_codec_build_controls(struct hda_codec *codec);
L
Linus Torvalds 已提交
517 518 519 520 521

/*
 * PCM
 */
int snd_hda_build_pcms(struct hda_bus *bus);
T
Takashi Iwai 已提交
522
int snd_hda_codec_build_pcms(struct hda_codec *codec);
523 524 525 526 527 528 529 530 531 532

int snd_hda_codec_prepare(struct hda_codec *codec,
			  struct hda_pcm_stream *hinfo,
			  unsigned int stream,
			  unsigned int format,
			  struct snd_pcm_substream *substream);
void snd_hda_codec_cleanup(struct hda_codec *codec,
			   struct hda_pcm_stream *hinfo,
			   struct snd_pcm_substream *substream);

533 534
void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
				u32 stream_tag,
L
Linus Torvalds 已提交
535
				int channel_id, int format);
536 537 538 539
void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid,
				    int do_now);
#define snd_hda_codec_cleanup_stream(codec, nid) \
	__snd_hda_codec_cleanup_stream(codec, nid, 0)
540 541
unsigned int snd_hda_calc_stream_format(struct hda_codec *codec,
					unsigned int rate,
542 543
					unsigned int channels,
					unsigned int format,
544 545
					unsigned int maxbps,
					unsigned short spdif_ctls);
L
Linus Torvalds 已提交
546 547 548
int snd_hda_is_supported_format(struct hda_codec *codec, hda_nid_t nid,
				unsigned int format);

549 550
extern const struct snd_pcm_chmap_elem snd_pcm_2_1_chmaps[];

L
Linus Torvalds 已提交
551 552 553 554
/*
 * Misc
 */
void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen);
555
void snd_hda_bus_reboot_notify(struct hda_bus *bus);
556
void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
557
				    unsigned int power_state);
L
Linus Torvalds 已提交
558

559 560 561
int snd_hda_lock_devices(struct hda_bus *bus);
void snd_hda_unlock_devices(struct hda_bus *bus);

L
Linus Torvalds 已提交
562 563 564 565
/*
 * power management
 */
#ifdef CONFIG_PM
566
int snd_hda_suspend(struct hda_bus *bus);
L
Linus Torvalds 已提交
567 568 569
int snd_hda_resume(struct hda_bus *bus);
#endif

570 571 572
static inline
int hda_call_check_power_status(struct hda_codec *codec, hda_nid_t nid)
{
573
#ifdef CONFIG_PM
574 575
	if (codec->patch_ops.check_power_status)
		return codec->patch_ops.check_power_status(codec, nid);
576
#endif
577 578 579
	return 0;
}

580 581 582 583 584 585 586
/*
 * get widget information
 */
const char *snd_hda_get_jack_connectivity(u32 cfg);
const char *snd_hda_get_jack_type(u32 cfg);
const char *snd_hda_get_jack_location(u32 cfg);

587 588 589
/*
 * power saving
 */
590
#ifdef CONFIG_PM
591
void snd_hda_power_save(struct hda_codec *codec, int delta, bool d3wait);
592
void snd_hda_update_power_acct(struct hda_codec *codec);
593
#else
594 595
static inline void snd_hda_power_save(struct hda_codec *codec, int delta,
				      bool d3wait) {}
596 597
#endif

598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
/**
 * snd_hda_power_up - Power-up the codec
 * @codec: HD-audio codec
 *
 * Increment the power-up counter and power up the hardware really when
 * not turned on yet.
 */
static inline void snd_hda_power_up(struct hda_codec *codec)
{
	snd_hda_power_save(codec, 1, false);
}

/**
 * snd_hda_power_up_d3wait - Power-up the codec after waiting for any pending
 *   D3 transition to complete.  This differs from snd_hda_power_up() when
 *   power_transition == -1.  snd_hda_power_up sees this case as a nop,
 *   snd_hda_power_up_d3wait waits for the D3 transition to complete then powers
 *   back up.
 * @codec: HD-audio codec
 *
 * Cancel any power down operation hapenning on the work queue, then power up.
 */
static inline void snd_hda_power_up_d3wait(struct hda_codec *codec)
{
	snd_hda_power_save(codec, 1, true);
}

/**
 * snd_hda_power_down - Power-down the codec
 * @codec: HD-audio codec
 *
 * Decrement the power-up counter and schedules the power-off work if
 * the counter rearches to zero.
 */
static inline void snd_hda_power_down(struct hda_codec *codec)
{
	snd_hda_power_save(codec, -1, false);
}

/**
 * snd_hda_power_sync - Synchronize the power-save status
 * @codec: HD-audio codec
 *
 * Synchronize the actual power state with the power account;
 * called when power_save parameter is changed
 */
static inline void snd_hda_power_sync(struct hda_codec *codec)
{
	snd_hda_power_save(codec, 0, false);
}

649 650 651 652
#ifdef CONFIG_SND_HDA_PATCH_LOADER
/*
 * patch firmware
 */
653
int snd_hda_load_patch(struct hda_bus *bus, size_t size, const void *buf);
654 655
#endif

656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680
#ifdef CONFIG_SND_HDA_DSP_LOADER
static inline int
snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
				unsigned int size,
				struct snd_dma_buffer *bufp)
{
	return codec->bus->ops.load_dsp_prepare(codec->bus, format, size, bufp);
}
static inline void
snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start)
{
	return codec->bus->ops.load_dsp_trigger(codec->bus, start);
}
static inline void
snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
				struct snd_dma_buffer *dmab)
{
	return codec->bus->ops.load_dsp_cleanup(codec->bus, dmab);
}
#else
static inline int
snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
				unsigned int size,
				struct snd_dma_buffer *bufp)
{
681
	return -ENOSYS;
682 683 684 685 686 687 688 689
}
static inline void
snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start) {}
static inline void
snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
				struct snd_dma_buffer *dmab) {}
#endif

690 691
#define EXPORT_SYMBOL_HDA(sym) EXPORT_SYMBOL_GPL(sym)

L
Linus Torvalds 已提交
692
#endif /* __SOUND_HDA_CODEC_H */