xref: /freebsd/sys/dev/sound/pci/hda/hdaa.h (revision 7ef62cebc2f965b0f640263e179276928885e33d)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2006 Stephane E. Potvin <sepotvin@videotron.ca>
5  * Copyright (c) 2006 Ariff Abdullah <ariff@FreeBSD.org>
6  * Copyright (c) 2008-2012 Alexander Motin <mav@FreeBSD.org>
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  * $FreeBSD$
31  */
32 
33 /*
34  * Intel High Definition Audio (Audio function quirks) driver for FreeBSD.
35  */
36 
37 #ifndef _HDAA_QUIRKS_H_
38 #define _HDAA_QUIRKS_H_
39 
40 #define HDAA_GPIO_SHIFT(n)	(n * 3)
41 #define HDAA_GPIO_MASK(n)	(0x7 << (n * 3))
42 #define HDAA_GPIO_KEEP(n)	(0x0 << (n * 3))
43 #define HDAA_GPIO_SET(n)	(0x1 << (n * 3))
44 #define HDAA_GPIO_CLEAR(n)	(0x2 << (n * 3))
45 #define HDAA_GPIO_DISABLE(n)	(0x3 << (n * 3))
46 #define HDAA_GPIO_INPUT(n)	(0x4 << (n * 3))
47 
48 /* 9 - 25 = anything else */
49 #define HDAA_QUIRK_SOFTPCMVOL	(1 << 9)
50 #define HDAA_QUIRK_FIXEDRATE	(1 << 10)
51 #define HDAA_QUIRK_FORCESTEREO	(1 << 11)
52 #define HDAA_QUIRK_EAPDINV	(1 << 12)
53 #define HDAA_QUIRK_SENSEINV	(1 << 14)
54 
55 /* 26 - 31 = vrefs */
56 #define HDAA_QUIRK_IVREF50	(1 << 26)
57 #define HDAA_QUIRK_IVREF80	(1 << 27)
58 #define HDAA_QUIRK_IVREF100	(1 << 28)
59 #define HDAA_QUIRK_OVREF50	(1 << 29)
60 #define HDAA_QUIRK_OVREF80	(1 << 30)
61 #define HDAA_QUIRK_OVREF100	(1U << 31)
62 
63 #define HDAA_QUIRK_IVREF	(HDAA_QUIRK_IVREF50 | HDAA_QUIRK_IVREF80 | \
64 						HDAA_QUIRK_IVREF100)
65 #define HDAA_QUIRK_OVREF	(HDAA_QUIRK_OVREF50 | HDAA_QUIRK_OVREF80 | \
66 						HDAA_QUIRK_OVREF100)
67 #define HDAA_QUIRK_VREF		(HDAA_QUIRK_IVREF | HDAA_QUIRK_OVREF)
68 
69 #define HDAA_AMP_VOL_DEFAULT	(-1)
70 #define HDAA_AMP_MUTE_DEFAULT	(0xffffffff)
71 #define HDAA_AMP_MUTE_NONE	(0)
72 #define HDAA_AMP_MUTE_LEFT	(1 << 0)
73 #define HDAA_AMP_MUTE_RIGHT	(1 << 1)
74 #define HDAA_AMP_MUTE_ALL	(HDAA_AMP_MUTE_LEFT | HDAA_AMP_MUTE_RIGHT)
75 
76 #define HDAA_AMP_LEFT_MUTED(v)	((v) & (HDAA_AMP_MUTE_LEFT))
77 #define HDAA_AMP_RIGHT_MUTED(v)	(((v) & HDAA_AMP_MUTE_RIGHT) >> 1)
78 
79 /* Widget in playback receiving signal from recording. */
80 #define HDAA_ADC_MONITOR		(1 << 0)
81 /* Input mixer widget needs volume control as destination. */
82 #define HDAA_IMIX_AS_DST		(2 << 0)
83 
84 #define HDAA_CTL_OUT		1
85 #define HDAA_CTL_IN		2
86 
87 #define HDA_MAX_CONNS	32
88 #define HDA_MAX_NAMELEN	32
89 
90 struct hdaa_audio_as;
91 struct hdaa_audio_ctl;
92 struct hdaa_chan;
93 struct hdaa_devinfo;
94 struct hdaa_pcm_devinfo;
95 struct hdaa_widget;
96 
97 struct hdaa_widget {
98 	nid_t nid;
99 	int type;
100 	int enable;
101 	int nconns, selconn;
102 	int waspin;
103 	uint32_t pflags;
104 	int bindas;
105 	int bindseqmask;
106 	int ossdev;
107 	uint32_t ossmask;
108 	int unsol;
109 	nid_t conns[HDA_MAX_CONNS];
110 	u_char connsenable[HDA_MAX_CONNS];
111 	char name[HDA_MAX_NAMELEN];
112 	uint8_t	*eld;
113 	int	eld_len;
114 	struct hdaa_devinfo *devinfo;
115 	struct {
116 		uint32_t widget_cap;
117 		uint32_t outamp_cap;
118 		uint32_t inamp_cap;
119 		uint32_t supp_stream_formats;
120 		uint32_t supp_pcm_size_rate;
121 		uint32_t eapdbtl;
122 	} param;
123 	union {
124 		struct {
125 			uint32_t config;
126 			uint32_t original;
127 			uint32_t newconf;
128 			uint32_t cap;
129 			uint32_t ctrl;
130 			int	connected;
131 		} pin;
132 		struct {
133 			uint8_t	stripecap;
134 		} conv;
135 	} wclass;
136 };
137 
138 struct hdaa_audio_ctl {
139 	struct hdaa_widget *widget, *childwidget;
140 	int enable;
141 	int index, dir, ndir;
142 	int mute, step, size, offset;
143 	int left, right, forcemute;
144 	uint32_t muted;
145 	uint32_t ossmask;	/* OSS devices that may affect control. */
146 	int	devleft[SOUND_MIXER_NRDEVICES]; /* Left ampl in 1/4dB. */
147 	int	devright[SOUND_MIXER_NRDEVICES]; /* Right ampl in 1/4dB. */
148 	int	devmute[SOUND_MIXER_NRDEVICES]; /* Mutes per OSS device. */
149 };
150 
151 /* Association is a group of pins bound for some special function. */
152 struct hdaa_audio_as {
153 	u_char enable;
154 	u_char index;
155 	u_char dir;
156 	u_char pincnt;
157 	u_char fakeredir;
158 	u_char digital;
159 	uint16_t pinset;
160 	nid_t hpredir;
161 	nid_t pins[16];
162 	nid_t dacs[2][16];
163 	int num_chans;
164 	int chans[2];
165 	int location;	/* Pins location, if all have the same */
166 	int mixed;	/* Mixed/multiplexed recording, not multichannel. */
167 	struct hdaa_pcm_devinfo *pdevinfo;
168 };
169 
170 struct hdaa_pcm_devinfo {
171 	device_t dev;
172 	struct hdaa_devinfo *devinfo;
173 	struct	snd_mixer *mixer;
174 	int	index;
175 	int	registered;
176 	int	playas, recas;
177 	u_char	left[SOUND_MIXER_NRDEVICES];
178 	u_char	right[SOUND_MIXER_NRDEVICES];
179 	int	minamp[SOUND_MIXER_NRDEVICES]; /* Minimal amps in 1/4dB. */
180 	int	maxamp[SOUND_MIXER_NRDEVICES]; /* Maximal amps in 1/4dB. */
181 	int	chan_size;
182 	int	chan_blkcnt;
183 	u_char	digital;
184 	uint32_t	ossmask;	/* Mask of supported OSS devices. */
185 	uint32_t	recsrc;		/* Mask of supported OSS sources. */
186 	int		autorecsrc;
187 };
188 
189 struct hdaa_devinfo {
190 	device_t		dev;
191 	struct mtx		*lock;
192 	nid_t			nid;
193 	nid_t			startnode, endnode;
194 	uint32_t		outamp_cap;
195 	uint32_t		inamp_cap;
196 	uint32_t		supp_stream_formats;
197 	uint32_t		supp_pcm_size_rate;
198 	uint32_t		gpio_cap;
199 	uint32_t		quirks;
200 	uint32_t		newquirks;
201 	uint32_t		gpio;
202 	uint32_t		newgpio;
203 	uint32_t		gpo;
204 	uint32_t		newgpo;
205 	int			nodecnt;
206 	int			ctlcnt;
207 	int			ascnt;
208 	int			num_devs;
209 	int			num_chans;
210 	struct hdaa_widget	*widget;
211 	struct hdaa_audio_ctl	*ctl;
212 	struct hdaa_audio_as	*as;
213 	struct hdaa_pcm_devinfo	*devs;
214 	struct hdaa_chan	*chans;
215 	struct callout		poll_jack;
216 	int			poll_ival;
217 	uint32_t		init_clear;
218 };
219 
220 #define HDAA_CHN_RUNNING	0x00000001
221 #define HDAA_CHN_SUSPEND	0x00000002
222 
223 struct hdaa_chan {
224 	struct snd_dbuf *b;
225 	struct pcm_channel *c;
226 	struct pcmchan_caps caps;
227 	struct hdaa_devinfo *devinfo;
228 	struct hdaa_pcm_devinfo *pdevinfo;
229 	uint32_t spd, fmt, fmtlist[32], pcmrates[16];
230 	uint32_t supp_stream_formats, supp_pcm_size_rate;
231 	uint32_t blkcnt, blksz;
232 	uint32_t *dmapos;
233 	uint32_t flags;
234 	int dir;
235 	int off;
236 	int sid;
237 	int bit16, bit32;
238 	int channels;	/* Number of audio channels. */
239 	int as;		/* Number of association. */
240 	int asindex;	/* Index within association. */
241 	nid_t io[16];
242 	uint8_t	stripecap;	/* AND of stripecap of all ios. */
243 	uint8_t	stripectl;	/* stripe to use to all ios. */
244 };
245 
246 #define MINQDB(ctl)							\
247 	((0 - (ctl)->offset) * ((ctl)->size + 1))
248 
249 #define MAXQDB(ctl)							\
250 	(((ctl)->step - (ctl)->offset) * ((ctl)->size + 1))
251 
252 #define RANGEQDB(ctl)							\
253 	((ctl)->step * ((ctl)->size + 1))
254 
255 #define VAL2QDB(ctl, val)						\
256 	(((ctl)->size + 1) * ((int)(val) - (ctl)->offset))
257 
258 #define QDB2VAL(ctl, qdb)						\
259 	imax(imin((((qdb) + (ctl)->size / 2 * ((qdb) > 0 ? 1 : -1)) /	\
260 	 ((ctl)->size + 1) + (ctl)->offset), (ctl)->step), 0)
261 
262 #define hdaa_codec_id(devinfo)						\
263 		(((uint32_t)hda_get_vendor_id(devinfo->dev) << 16) +	\
264 		hda_get_device_id(devinfo->dev))
265 
266 #define hdaa_card_id(devinfo)					\
267 		(((uint32_t)hda_get_subdevice_id(devinfo->dev) << 16) +	\
268 		hda_get_subvendor_id(devinfo->dev))
269 
270 struct hdaa_widget	*hdaa_widget_get(struct hdaa_devinfo *, nid_t);
271 uint32_t		hdaa_widget_pin_patch(uint32_t config, const char *str);
272 uint32_t		hdaa_gpio_patch(uint32_t gpio, const char *str);
273 
274 void			hdaa_patch(struct hdaa_devinfo *devinfo);
275 void			hdaa_patch_direct(struct hdaa_devinfo *devinfo);
276 
277 #endif
278