Merge branch 'topic/hda-jack-rework' into for-next
[linux-block.git] / sound / pci / hda / hda_jack.h
CommitLineData
1835a0f9
TI
1/*
2 * Jack-detection handling for HD-audio
3 *
4 * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
5 *
6 * This driver is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11
12#ifndef __SOUND_HDA_JACK_H
13#define __SOUND_HDA_JACK_H
14
128bc4ba 15struct auto_pin_cfg;
954df2a9 16struct hda_jack_tbl;
1a4f69d5 17struct hda_jack_callback;
954df2a9 18
1a4f69d5
TI
19typedef void (*hda_jack_callback_fn) (struct hda_codec *, struct hda_jack_callback *);
20
21struct hda_jack_callback {
22 struct hda_jack_tbl *tbl;
23 hda_jack_callback_fn func;
24 unsigned int private_data; /* arbitrary data */
25 struct hda_jack_callback *next;
26};
128bc4ba 27
1835a0f9
TI
28struct hda_jack_tbl {
29 hda_nid_t nid;
3a93897e 30 unsigned char tag; /* unsol event tag */
1a4f69d5 31 struct hda_jack_callback *callback;
3a93897e 32 /* jack-detection stuff */
1835a0f9 33 unsigned int pin_sense; /* cached pin-sense value */
3a93897e 34 unsigned int jack_detect:1; /* capable of jack-detection? */
1835a0f9 35 unsigned int jack_dirty:1; /* needs to update? */
80c8bfbe 36 unsigned int phantom_jack:1; /* a fixed, always present port? */
0f568959 37 unsigned int block_report:1; /* in a transitional state - do not report to userspace */
0619ba8c
DR
38 hda_nid_t gating_jack; /* valid when gating jack plugged */
39 hda_nid_t gated_jack; /* gated is dependent on this jack */
01a61e12 40 struct snd_kcontrol *kctl; /* assigned kctl for jack-detection */
aad37dbd
TI
41#ifdef CONFIG_SND_HDA_INPUT_JACK
42 int type;
43 struct snd_jack *jack;
44#endif
1835a0f9
TI
45};
46
47struct hda_jack_tbl *
48snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid);
3a93897e
TI
49struct hda_jack_tbl *
50snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec, unsigned char tag);
1835a0f9 51
1835a0f9
TI
52void snd_hda_jack_tbl_clear(struct hda_codec *codec);
53
1835a0f9
TI
54void snd_hda_jack_set_dirty_all(struct hda_codec *codec);
55
62f949bf 56int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid);
1a4f69d5 57struct hda_jack_callback *
bda17b82 58snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
1a4f69d5 59 hda_jack_callback_fn cb);
954df2a9 60
0619ba8c
DR
61int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid,
62 hda_nid_t gating_nid);
1835a0f9
TI
63
64u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid);
60ea8ca2
TI
65
66/* the jack state returned from snd_hda_jack_detect_state() */
67enum {
68 HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT, HDA_JACK_PHANTOM,
69};
70
71int snd_hda_jack_detect_state(struct hda_codec *codec, hda_nid_t nid);
72
73static inline bool snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid)
74{
75 return snd_hda_jack_detect_state(codec, nid) != HDA_JACK_NOT_PRESENT;
76}
1835a0f9 77
a9c74173 78bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid);
1835a0f9 79
01a61e12
TI
80int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
81 const char *name, int idx);
82int snd_hda_jack_add_kctls(struct hda_codec *codec,
83 const struct auto_pin_cfg *cfg);
84
01a61e12
TI
85void snd_hda_jack_report_sync(struct hda_codec *codec);
86
954df2a9 87void snd_hda_jack_unsol_event(struct hda_codec *codec, unsigned int res);
01a61e12 88
26a6cb6c
DH
89void snd_hda_jack_poll_all(struct hda_codec *codec);
90
1835a0f9 91#endif /* __SOUND_HDA_JACK_H */