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