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 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 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 int connected; 129 } pin; 130 struct { 131 uint8_t stripecap; 132 } conv; 133 } wclass; 134 }; 135 136 struct hdaa_audio_ctl { 137 struct hdaa_widget *widget, *childwidget; 138 int enable; 139 int index, dir, ndir; 140 int mute, step, size, offset; 141 int left, right, forcemute; 142 uint32_t muted; 143 uint32_t ossmask; /* OSS devices that may affect control. */ 144 int devleft[SOUND_MIXER_NRDEVICES]; /* Left ampl in 1/4dB. */ 145 int devright[SOUND_MIXER_NRDEVICES]; /* Right ampl in 1/4dB. */ 146 int devmute[SOUND_MIXER_NRDEVICES]; /* Mutes per OSS device. */ 147 }; 148 149 /* Association is a group of pins bound for some special function. */ 150 struct hdaa_audio_as { 151 u_char enable; 152 u_char index; 153 u_char dir; 154 u_char pincnt; 155 u_char fakeredir; 156 u_char digital; 157 uint16_t pinset; 158 nid_t hpredir; 159 nid_t pins[16]; 160 nid_t dacs[2][16]; 161 int num_chans; 162 int chans[2]; 163 int location; /* Pins location, if all have the same */ 164 int mixed; /* Mixed/multiplexed recording, not multichannel. */ 165 struct hdaa_pcm_devinfo *pdevinfo; 166 }; 167 168 struct hdaa_pcm_devinfo { 169 device_t dev; 170 struct hdaa_devinfo *devinfo; 171 struct snd_mixer *mixer; 172 int index; 173 int registered; 174 int playas, recas; 175 u_char left[SOUND_MIXER_NRDEVICES]; 176 u_char right[SOUND_MIXER_NRDEVICES]; 177 int minamp[SOUND_MIXER_NRDEVICES]; /* Minimal amps in 1/4dB. */ 178 int maxamp[SOUND_MIXER_NRDEVICES]; /* Maximal amps in 1/4dB. */ 179 int chan_size; 180 int chan_blkcnt; 181 u_char digital; 182 uint32_t ossmask; /* Mask of supported OSS devices. */ 183 uint32_t recsrc; /* Mask of supported OSS sources. */ 184 int autorecsrc; 185 }; 186 187 struct hdaa_devinfo { 188 device_t dev; 189 struct mtx *lock; 190 nid_t nid; 191 nid_t startnode, endnode; 192 uint32_t outamp_cap; 193 uint32_t inamp_cap; 194 uint32_t supp_stream_formats; 195 uint32_t supp_pcm_size_rate; 196 uint32_t gpio_cap; 197 uint32_t quirks; 198 uint32_t newquirks; 199 uint32_t gpio; 200 uint32_t newgpio; 201 uint32_t gpo; 202 uint32_t newgpo; 203 int nodecnt; 204 int ctlcnt; 205 int ascnt; 206 int num_devs; 207 int num_chans; 208 struct hdaa_widget *widget; 209 struct hdaa_audio_ctl *ctl; 210 struct hdaa_audio_as *as; 211 struct hdaa_pcm_devinfo *devs; 212 struct hdaa_chan *chans; 213 struct callout poll_jack; 214 int poll_ival; 215 uint32_t init_clear; 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