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