xref: /linux/sound/pci/hda/hda_jack.h (revision 95298d63c67673c654c08952672d016212b26054)
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 *
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 cb);
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 *
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
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
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
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
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