]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/sound/pci/hda/hdaa.h
Merge LLVM libunwind trunk r351319, from just before upstream's
[FreeBSD/FreeBSD.git] / sys / dev / sound / pci / hda / hdaa.h
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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 };
218
219 #define HDAA_CHN_RUNNING        0x00000001
220 #define HDAA_CHN_SUSPEND        0x00000002
221
222 struct hdaa_chan {
223         struct snd_dbuf *b;
224         struct pcm_channel *c;
225         struct pcmchan_caps caps;
226         struct hdaa_devinfo *devinfo;
227         struct hdaa_pcm_devinfo *pdevinfo;
228         uint32_t spd, fmt, fmtlist[32], pcmrates[16];
229         uint32_t supp_stream_formats, supp_pcm_size_rate;
230         uint32_t blkcnt, blksz;
231         uint32_t *dmapos;
232         uint32_t flags;
233         int dir;
234         int off;
235         int sid;
236         int bit16, bit32;
237         int channels;   /* Number of audio channels. */
238         int as;         /* Number of association. */
239         int asindex;    /* Index within association. */
240         nid_t io[16];
241         uint8_t stripecap;      /* AND of stripecap of all ios. */
242         uint8_t stripectl;      /* stripe to use to all ios. */
243 };
244
245 #define MINQDB(ctl)                                                     \
246         ((0 - (ctl)->offset) * ((ctl)->size + 1))
247
248 #define MAXQDB(ctl)                                                     \
249         (((ctl)->step - (ctl)->offset) * ((ctl)->size + 1))
250
251 #define RANGEQDB(ctl)                                                   \
252         ((ctl)->step * ((ctl)->size + 1))
253
254 #define VAL2QDB(ctl, val)                                               \
255         (((ctl)->size + 1) * ((int)(val) - (ctl)->offset))
256
257 #define QDB2VAL(ctl, qdb)                                               \
258         imax(imin((((qdb) + (ctl)->size / 2 * ((qdb) > 0 ? 1 : -1)) /   \
259          ((ctl)->size + 1) + (ctl)->offset), (ctl)->step), 0)
260
261 #define hdaa_codec_id(devinfo)                                          \
262                 (((uint32_t)hda_get_vendor_id(devinfo->dev) << 16) +    \
263                 hda_get_device_id(devinfo->dev))
264
265 #define hdaa_card_id(devinfo)                                   \
266                 (((uint32_t)hda_get_subdevice_id(devinfo->dev) << 16) + \
267                 hda_get_subvendor_id(devinfo->dev))
268
269 struct hdaa_widget      *hdaa_widget_get(struct hdaa_devinfo *, nid_t);
270 uint32_t                hdaa_widget_pin_patch(uint32_t config, const char *str);
271 uint32_t                hdaa_gpio_patch(uint32_t gpio, const char *str);
272
273 void                    hdaa_patch(struct hdaa_devinfo *devinfo);
274 void                    hdaa_patch_direct(struct hdaa_devinfo *devinfo);
275
276 #endif