1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * Jack-detection handling for HD-audio
4 *
5 * Copyright (c) 2011 Takashi Iwai <tiwai@suse.de>
6 */
7
8 #ifndef __SOUND_HDA_JACK_H
9 #define __SOUND_HDA_JACK_H
10
11 #include <linux/err.h>
12 #include <sound/jack.h>
13
14 struct auto_pin_cfg;
15 struct hda_jack_tbl;
16 struct hda_jack_callback;
17
18 typedef void (*hda_jack_callback_fn) (struct hda_codec *, struct hda_jack_callback *);
19
20 struct hda_jack_callback {
21 hda_nid_t nid;
22 int dev_id;
23 hda_jack_callback_fn func;
24 unsigned int private_data; /* arbitrary data */
25 unsigned int unsol_res; /* unsolicited event bits */
26 struct hda_jack_tbl *jack; /* associated jack entry */
27 struct hda_jack_callback *next;
28 };
29
30 struct hda_jack_tbl {
31 hda_nid_t nid;
32 int dev_id;
33 unsigned char tag; /* unsol event tag */
34 struct hda_jack_callback *callback;
35 /* jack-detection stuff */
36 unsigned int pin_sense; /* cached pin-sense value */
37 unsigned int jack_detect:1; /* capable of jack-detection? */
38 unsigned int jack_dirty:1; /* needs to update? */
39 unsigned int phantom_jack:1; /* a fixed, always present port? */
40 unsigned int block_report:1; /* in a transitional state - do not report to userspace */
41 hda_nid_t gating_jack; /* valid when gating jack plugged */
42 hda_nid_t gated_jack; /* gated is dependent on this jack */
43 int type;
44 int button_state;
45 struct snd_jack *jack;
46 };
47
48 struct hda_jack_keymap {
49 enum snd_jack_types type;
50 int key;
51 };
52
53 struct hda_jack_tbl *
54 snd_hda_jack_tbl_get_mst(struct hda_codec *codec, hda_nid_t nid, int dev_id);
55
56 /**
57 * snd_hda_jack_tbl_get - query the jack-table entry for the given NID
58 * @codec: the HDA codec
59 * @nid: pin NID to refer to
60 */
61 static inline struct hda_jack_tbl *
snd_hda_jack_tbl_get(struct hda_codec * codec,hda_nid_t nid)62 snd_hda_jack_tbl_get(struct hda_codec *codec, hda_nid_t nid)
63 {
64 return snd_hda_jack_tbl_get_mst(codec, nid, 0);
65 }
66
67 struct hda_jack_tbl *
68 snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec,
69 unsigned char tag, int dev_id);
70
71 void snd_hda_jack_tbl_clear(struct hda_codec *codec);
72
73 void snd_hda_jack_set_dirty_all(struct hda_codec *codec);
74
75 int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid,
76 int dev_id);
77
78 struct hda_jack_callback *
79 snd_hda_jack_detect_enable_callback_mst(struct hda_codec *codec, hda_nid_t nid,
80 int dev_id, hda_jack_callback_fn func);
81
82 /**
83 * snd_hda_jack_detect_enable - enable the jack-detection
84 * @codec: the HDA codec
85 * @nid: pin NID to enable
86 * @func: callback function to register
87 *
88 * In the case of error, the return value will be a pointer embedded with
89 * errno. Check and handle the return value appropriately with standard
90 * macros such as @IS_ERR() and @PTR_ERR().
91 */
92 static inline struct hda_jack_callback *
snd_hda_jack_detect_enable_callback(struct hda_codec * codec,hda_nid_t nid,hda_jack_callback_fn cb)93 snd_hda_jack_detect_enable_callback(struct hda_codec *codec, hda_nid_t nid,
94 hda_jack_callback_fn cb)
95 {
96 return snd_hda_jack_detect_enable_callback_mst(codec, nid, 0, cb);
97 }
98
99 int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid,
100 hda_nid_t gating_nid);
101
102 u32 snd_hda_jack_pin_sense(struct hda_codec *codec, hda_nid_t nid, int dev_id);
103
104 /* the jack state returned from snd_hda_jack_detect_state() */
105 enum {
106 HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT, HDA_JACK_PHANTOM,
107 };
108
109 int snd_hda_jack_detect_state_mst(struct hda_codec *codec, hda_nid_t nid,
110 int dev_id);
111
112 /**
113 * snd_hda_jack_detect_state - query pin Presence Detect status
114 * @codec: the CODEC to sense
115 * @nid: the pin NID to sense
116 *
117 * Query and return the pin's Presence Detect status, as either
118 * HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT or HDA_JACK_PHANTOM.
119 */
120 static inline int
snd_hda_jack_detect_state(struct hda_codec * codec,hda_nid_t nid)121 snd_hda_jack_detect_state(struct hda_codec *codec, hda_nid_t nid)
122 {
123 return snd_hda_jack_detect_state_mst(codec, nid, 0);
124 }
125
126 /**
127 * snd_hda_jack_detect_mst - Detect the jack
128 * @codec: the HDA codec
129 * @nid: pin NID to check jack detection
130 * @dev_id: pin device entry id
131 */
132 static inline bool
snd_hda_jack_detect_mst(struct hda_codec * codec,hda_nid_t nid,int dev_id)133 snd_hda_jack_detect_mst(struct hda_codec *codec, hda_nid_t nid, int dev_id)
134 {
135 return snd_hda_jack_detect_state_mst(codec, nid, dev_id) !=
136 HDA_JACK_NOT_PRESENT;
137 }
138
139 /**
140 * snd_hda_jack_detect - Detect the jack
141 * @codec: the HDA codec
142 * @nid: pin NID to check jack detection
143 */
144 static inline bool
snd_hda_jack_detect(struct hda_codec * codec,hda_nid_t nid)145 snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid)
146 {
147 return snd_hda_jack_detect_mst(codec, nid, 0);
148 }
149
150 bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid);
151
152 int snd_hda_jack_add_kctl_mst(struct hda_codec *codec, hda_nid_t nid,
153 int dev_id, const char *name, bool phantom_jack,
154 int type, const struct hda_jack_keymap *keymap);
155
156 /**
157 * snd_hda_jack_add_kctl - Add a kctl for the given pin
158 * @codec: the HDA codec
159 * @nid: pin NID to assign
160 * @name: string name for the jack
161 * @phantom_jack: flag to deal as a phantom jack
162 * @type: jack type bits to be reported, 0 for guessing from pincfg
163 * @keymap: optional jack / key mapping
164 *
165 * This assigns a jack-detection kctl to the given pin. The kcontrol
166 * will have the given name and index.
167 */
168 static inline int
snd_hda_jack_add_kctl(struct hda_codec * codec,hda_nid_t nid,const char * name,bool phantom_jack,int type,const struct hda_jack_keymap * keymap)169 snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
170 const char *name, bool phantom_jack,
171 int type, const struct hda_jack_keymap *keymap)
172 {
173 return snd_hda_jack_add_kctl_mst(codec, nid, 0,
174 name, phantom_jack, type, keymap);
175 }
176
177 int snd_hda_jack_add_kctls(struct hda_codec *codec,
178 const struct auto_pin_cfg *cfg);
179
180 void snd_hda_jack_report_sync(struct hda_codec *codec);
181
182 void snd_hda_jack_unsol_event(struct hda_codec *codec, unsigned int res);
183
184 void snd_hda_jack_poll_all(struct hda_codec *codec);
185
186 #endif /* __SOUND_HDA_JACK_H */
187