xref: /kernel/linux/linux-5.10/sound/pci/hda/hda_jack.h (revision 8c2ecf20)
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
14struct auto_pin_cfg;
15struct hda_jack_tbl;
16struct hda_jack_callback;
17
18typedef void (*hda_jack_callback_fn) (struct hda_codec *, struct hda_jack_callback *);
19
20struct 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
30struct 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
48struct hda_jack_keymap {
49	enum snd_jack_types type;
50	int key;
51};
52
53struct hda_jack_tbl *
54snd_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 */
61static inline struct hda_jack_tbl *
62snd_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
67struct hda_jack_tbl *
68snd_hda_jack_tbl_get_from_tag(struct hda_codec *codec,
69			      unsigned char tag, int dev_id);
70
71void snd_hda_jack_tbl_clear(struct hda_codec *codec);
72
73void snd_hda_jack_set_dirty_all(struct hda_codec *codec);
74
75int snd_hda_jack_detect_enable(struct hda_codec *codec, hda_nid_t nid,
76			       int dev_id);
77
78struct hda_jack_callback *
79snd_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 */
92static inline struct hda_jack_callback *
93snd_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
99int snd_hda_jack_set_gating_jack(struct hda_codec *codec, hda_nid_t gated_nid,
100				 hda_nid_t gating_nid);
101
102u32 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() */
105enum {
106	HDA_JACK_NOT_PRESENT, HDA_JACK_PRESENT, HDA_JACK_PHANTOM,
107};
108
109int 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 */
120static inline int
121snd_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 */
132static inline bool
133snd_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 */
144static inline bool
145snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid)
146{
147	return snd_hda_jack_detect_mst(codec, nid, 0);
148}
149
150bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid);
151
152int 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 */
168static inline int
169snd_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
177int snd_hda_jack_add_kctls(struct hda_codec *codec,
178			   const struct auto_pin_cfg *cfg);
179
180void snd_hda_jack_report_sync(struct hda_codec *codec);
181
182void snd_hda_jack_unsol_event(struct hda_codec *codec, unsigned int res);
183
184void snd_hda_jack_poll_all(struct hda_codec *codec);
185
186#endif /* __SOUND_HDA_JACK_H */
187