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$ 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 #define HDAA_ADC_MONITOR (1 << 0) 78 79 #define HDAA_CTL_OUT 1 80 #define HDAA_CTL_IN 2 81 82 #define HDA_MAX_CONNS 32 83 #define HDA_MAX_NAMELEN 32 84 85 struct hdaa_widget { 86 nid_t nid; 87 int type; 88 int enable; 89 int nconns, selconn; 90 int waspin; 91 uint32_t pflags; 92 int bindas; 93 int bindseqmask; 94 int ossdev; 95 uint32_t ossmask; 96 int unsol; 97 nid_t conns[HDA_MAX_CONNS]; 98 u_char connsenable[HDA_MAX_CONNS]; 99 char name[HDA_MAX_NAMELEN]; 100 uint8_t *eld; 101 int eld_len; 102 struct hdaa_devinfo *devinfo; 103 struct { 104 uint32_t widget_cap; 105 uint32_t outamp_cap; 106 uint32_t inamp_cap; 107 uint32_t supp_stream_formats; 108 uint32_t supp_pcm_size_rate; 109 uint32_t eapdbtl; 110 } param; 111 union { 112 struct { 113 uint32_t config; 114 uint32_t original; 115 uint32_t newconf; 116 uint32_t cap; 117 uint32_t ctrl; 118 } pin; 119 struct { 120 uint8_t stripecap; 121 } conv; 122 } wclass; 123 }; 124 125 struct hdaa_audio_ctl { 126 struct hdaa_widget *widget, *childwidget; 127 int enable; 128 int index, dir, ndir; 129 int mute, step, size, offset; 130 int left, right, forcemute; 131 uint32_t muted; 132 uint32_t ossmask, possmask; 133 }; 134 135 /* Association is a group of pins bound for some special function. */ 136 struct hdaa_audio_as { 137 u_char enable; 138 u_char index; 139 u_char dir; 140 u_char pincnt; 141 u_char fakeredir; 142 u_char digital; 143 uint16_t pinset; 144 nid_t hpredir; 145 nid_t pins[16]; 146 nid_t dacs[2][16]; 147 int num_chans; 148 int chans[2]; 149 int location; /* Pins location, if all have the same */ 150 int mixed; /* Mixed/multiplexed recording, not multichannel. */ 151 }; 152 153 struct hdaa_pcm_devinfo { 154 device_t dev; 155 struct hdaa_devinfo *devinfo; 156 int index; 157 int registered; 158 int playas, recas; 159 u_char left[SOUND_MIXER_NRDEVICES]; 160 u_char right[SOUND_MIXER_NRDEVICES]; 161 int chan_size; 162 int chan_blkcnt; 163 u_char digital; 164 }; 165 166 struct hdaa_devinfo { 167 device_t dev; 168 struct mtx *lock; 169 nid_t nid; 170 nid_t startnode, endnode; 171 uint32_t outamp_cap; 172 uint32_t inamp_cap; 173 uint32_t supp_stream_formats; 174 uint32_t supp_pcm_size_rate; 175 uint32_t gpio_cap; 176 uint32_t quirks; 177 uint32_t newquirks; 178 uint32_t gpio; 179 uint32_t newgpio; 180 uint32_t gpo; 181 uint32_t newgpo; 182 int nodecnt; 183 int ctlcnt; 184 int ascnt; 185 int num_devs; 186 int num_chans; 187 struct hdaa_widget *widget; 188 struct hdaa_audio_ctl *ctl; 189 struct hdaa_audio_as *as; 190 struct hdaa_pcm_devinfo *devs; 191 struct hdaa_chan *chans; 192 struct callout poll_jack; 193 int poll_ival; 194 }; 195 196 #define HDAA_CHN_RUNNING 0x00000001 197 #define HDAA_CHN_SUSPEND 0x00000002 198 199 struct hdaa_chan { 200 struct snd_dbuf *b; 201 struct pcm_channel *c; 202 struct pcmchan_caps caps; 203 struct hdaa_devinfo *devinfo; 204 struct hdaa_pcm_devinfo *pdevinfo; 205 uint32_t spd, fmt, fmtlist[32], pcmrates[16]; 206 uint32_t supp_stream_formats, supp_pcm_size_rate; 207 uint32_t blkcnt, blksz; 208 uint32_t *dmapos; 209 uint32_t flags; 210 int dir; 211 int off; 212 int sid; 213 int bit16, bit32; 214 int channels; /* Number of audio channels. */ 215 int as; /* Number of association. */ 216 int asindex; /* Index within association. */ 217 nid_t io[16]; 218 uint8_t stripecap; /* AND of stripecap of all ios. */ 219 uint8_t stripectl; /* stripe to use to all ios. */ 220 }; 221 222 #define hdaa_codec_id(devinfo) \ 223 (((uint32_t)hda_get_vendor_id(devinfo->dev) << 16) + \ 224 hda_get_device_id(devinfo->dev)) 225 226 #define hdaa_subvendor_id(devinfo) \ 227 (((uint32_t)hda_get_subvendor_id(devinfo->dev) << 16) + \ 228 hda_get_subdevice_id(devinfo->dev)) 229 230 struct hdaa_widget *hdaa_widget_get(struct hdaa_devinfo *, nid_t); 231 uint32_t hdaa_widget_pin_patch(uint32_t config, const char *str); 232 uint32_t hdaa_gpio_patch(uint32_t gpio, const char *str); 233 234 void hdaa_patch(struct hdaa_devinfo *devinfo); 235 void hdaa_patch_direct(struct hdaa_devinfo *devinfo); 236 237 #endif 238