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