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