hdaa.h revision 230532
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: head/sys/dev/sound/pci/hda/hdaa.h 230532 2012-01-25 09:57:34Z mav $
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/* Widget in playback receiving signal from recording. */
78#define HDAA_ADC_MONITOR		(1 << 0)
79/* Input mixer widget needs volume control as destination. */
80#define HDAA_IMIX_AS_DST		(2 << 0)
81
82#define HDAA_CTL_OUT		1
83#define HDAA_CTL_IN		2
84
85#define HDA_MAX_CONNS	32
86#define HDA_MAX_NAMELEN	32
87
88struct hdaa_audio_as;
89struct hdaa_audio_ctl;
90struct hdaa_chan;
91struct hdaa_devinfo;
92struct hdaa_pcm_devinfo;
93struct hdaa_widget;
94
95struct hdaa_widget {
96	nid_t nid;
97	int type;
98	int enable;
99	int nconns, selconn;
100	int waspin;
101	uint32_t pflags;
102	int bindas;
103	int bindseqmask;
104	int ossdev;
105	uint32_t ossmask;
106	int unsol;
107	nid_t conns[HDA_MAX_CONNS];
108	u_char connsenable[HDA_MAX_CONNS];
109	char name[HDA_MAX_NAMELEN];
110	uint8_t	*eld;
111	int	eld_len;
112	struct hdaa_devinfo *devinfo;
113	struct {
114		uint32_t widget_cap;
115		uint32_t outamp_cap;
116		uint32_t inamp_cap;
117		uint32_t supp_stream_formats;
118		uint32_t supp_pcm_size_rate;
119		uint32_t eapdbtl;
120	} param;
121	union {
122		struct {
123			uint32_t config;
124			uint32_t original;
125			uint32_t newconf;
126			uint32_t cap;
127			uint32_t ctrl;
128		} pin;
129		struct {
130			uint8_t	stripecap;
131		} conv;
132	} wclass;
133};
134
135struct hdaa_audio_ctl {
136	struct hdaa_widget *widget, *childwidget;
137	int enable;
138	int index, dir, ndir;
139	int mute, step, size, offset;
140	int left, right, forcemute;
141	uint32_t muted;
142	uint32_t ossmask;	/* OSS devices that may affect control. */
143	int	devleft[SOUND_MIXER_NRDEVICES]; /* Left ampl in 1/4dB. */
144	int	devright[SOUND_MIXER_NRDEVICES]; /* Right ampl in 1/4dB. */
145	int	devmute[SOUND_MIXER_NRDEVICES]; /* Mutes per OSS device. */
146};
147
148/* Association is a group of pins bound for some special function. */
149struct hdaa_audio_as {
150	u_char enable;
151	u_char index;
152	u_char dir;
153	u_char pincnt;
154	u_char fakeredir;
155	u_char digital;
156	uint16_t pinset;
157	nid_t hpredir;
158	nid_t pins[16];
159	nid_t dacs[2][16];
160	int num_chans;
161	int chans[2];
162	int location;	/* Pins location, if all have the same */
163	int mixed;	/* Mixed/multiplexed recording, not multichannel. */
164	struct hdaa_pcm_devinfo *pdevinfo;
165};
166
167struct hdaa_pcm_devinfo {
168	device_t dev;
169	struct hdaa_devinfo *devinfo;
170	struct	snd_mixer *mixer;
171	int	index;
172	int	registered;
173	int	playas, recas;
174	u_char	left[SOUND_MIXER_NRDEVICES];
175	u_char	right[SOUND_MIXER_NRDEVICES];
176	int	minamp[SOUND_MIXER_NRDEVICES]; /* Minimal amps in 1/4dB. */
177	int	maxamp[SOUND_MIXER_NRDEVICES]; /* Maximal amps in 1/4dB. */
178	int	chan_size;
179	int	chan_blkcnt;
180	u_char	digital;
181	uint32_t	ossmask;	/* Mask of supported OSS devices. */
182	uint32_t	recsrc;		/* Mask of supported OSS sources. */
183};
184
185struct hdaa_devinfo {
186	device_t		dev;
187	struct mtx		*lock;
188	nid_t			nid;
189	nid_t			startnode, endnode;
190	uint32_t		outamp_cap;
191	uint32_t		inamp_cap;
192	uint32_t		supp_stream_formats;
193	uint32_t		supp_pcm_size_rate;
194	uint32_t		gpio_cap;
195	uint32_t		quirks;
196	uint32_t		newquirks;
197	uint32_t		gpio;
198	uint32_t		newgpio;
199	uint32_t		gpo;
200	uint32_t		newgpo;
201	int			nodecnt;
202	int			ctlcnt;
203	int			ascnt;
204	int			num_devs;
205	int			num_chans;
206	struct hdaa_widget	*widget;
207	struct hdaa_audio_ctl	*ctl;
208	struct hdaa_audio_as	*as;
209	struct hdaa_pcm_devinfo	*devs;
210	struct hdaa_chan	*chans;
211	struct callout		poll_jack;
212	int			poll_ival;
213};
214
215#define HDAA_CHN_RUNNING	0x00000001
216#define HDAA_CHN_SUSPEND	0x00000002
217
218struct hdaa_chan {
219	struct snd_dbuf *b;
220	struct pcm_channel *c;
221	struct pcmchan_caps caps;
222	struct hdaa_devinfo *devinfo;
223	struct hdaa_pcm_devinfo *pdevinfo;
224	uint32_t spd, fmt, fmtlist[32], pcmrates[16];
225	uint32_t supp_stream_formats, supp_pcm_size_rate;
226	uint32_t blkcnt, blksz;
227	uint32_t *dmapos;
228	uint32_t flags;
229	int dir;
230	int off;
231	int sid;
232	int bit16, bit32;
233	int channels;	/* Number of audio channels. */
234	int as;		/* Number of association. */
235	int asindex;	/* Index within association. */
236	nid_t io[16];
237	uint8_t	stripecap;	/* AND of stripecap of all ios. */
238	uint8_t	stripectl;	/* stripe to use to all ios. */
239};
240
241#define MINQDB(ctl)							\
242	((0 - (ctl)->offset) * ((ctl)->size + 1))
243
244#define MAXQDB(ctl)							\
245	(((ctl)->step - (ctl)->offset) * ((ctl)->size + 1))
246
247#define RANGEQDB(ctl)							\
248	((ctl)->step * ((ctl)->size + 1))
249
250#define VAL2QDB(ctl, val) 						\
251	(((ctl)->size + 1) * ((int)(val) - (ctl)->offset))
252
253#define QDB2VAL(ctl, qdb) 						\
254	imax(imin((((qdb) + (ctl)->size / 2 * ((qdb) > 0 ? 1 : -1)) /	\
255	 ((ctl)->size + 1) + (ctl)->offset), (ctl)->step), 0)
256
257#define hdaa_codec_id(devinfo)						\
258		(((uint32_t)hda_get_vendor_id(devinfo->dev) << 16) +	\
259		hda_get_device_id(devinfo->dev))
260
261#define hdaa_subvendor_id(devinfo)					\
262		(((uint32_t)hda_get_subdevice_id(devinfo->dev) << 16) +	\
263		hda_get_subvendor_id(devinfo->dev))
264
265struct hdaa_widget	*hdaa_widget_get(struct hdaa_devinfo *, nid_t);
266uint32_t		hdaa_widget_pin_patch(uint32_t config, const char *str);
267uint32_t		hdaa_gpio_patch(uint32_t gpio, const char *str);
268
269void			hdaa_patch(struct hdaa_devinfo *devinfo);
270void			hdaa_patch_direct(struct hdaa_devinfo *devinfo);
271
272#endif
273