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 277