The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sound/pci/hda/hdaa.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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         uint32_t                init_clear;
  218 };
  219 
  220 #define HDAA_CHN_RUNNING        0x00000001
  221 #define HDAA_CHN_SUSPEND        0x00000002
  222 
  223 struct hdaa_chan {
  224         struct snd_dbuf *b;
  225         struct pcm_channel *c;
  226         struct pcmchan_caps caps;
  227         struct hdaa_devinfo *devinfo;
  228         struct hdaa_pcm_devinfo *pdevinfo;
  229         uint32_t spd, fmt, fmtlist[32], pcmrates[16];
  230         uint32_t supp_stream_formats, supp_pcm_size_rate;
  231         uint32_t blkcnt, blksz;
  232         uint32_t *dmapos;
  233         uint32_t flags;
  234         int dir;
  235         int off;
  236         int sid;
  237         int bit16, bit32;
  238         int channels;   /* Number of audio channels. */
  239         int as;         /* Number of association. */
  240         int asindex;    /* Index within association. */
  241         nid_t io[16];
  242         uint8_t stripecap;      /* AND of stripecap of all ios. */
  243         uint8_t stripectl;      /* stripe to use to all ios. */
  244 };
  245 
  246 #define MINQDB(ctl)                                                     \
  247         ((0 - (ctl)->offset) * ((ctl)->size + 1))
  248 
  249 #define MAXQDB(ctl)                                                     \
  250         (((ctl)->step - (ctl)->offset) * ((ctl)->size + 1))
  251 
  252 #define RANGEQDB(ctl)                                                   \
  253         ((ctl)->step * ((ctl)->size + 1))
  254 
  255 #define VAL2QDB(ctl, val)                                               \
  256         (((ctl)->size + 1) * ((int)(val) - (ctl)->offset))
  257 
  258 #define QDB2VAL(ctl, qdb)                                               \
  259         imax(imin((((qdb) + (ctl)->size / 2 * ((qdb) > 0 ? 1 : -1)) /   \
  260          ((ctl)->size + 1) + (ctl)->offset), (ctl)->step), 0)
  261 
  262 #define hdaa_codec_id(devinfo)                                          \
  263                 (((uint32_t)hda_get_vendor_id(devinfo->dev) << 16) +    \
  264                 hda_get_device_id(devinfo->dev))
  265 
  266 #define hdaa_card_id(devinfo)                                   \
  267                 (((uint32_t)hda_get_subdevice_id(devinfo->dev) << 16) + \
  268                 hda_get_subvendor_id(devinfo->dev))
  269 
  270 struct hdaa_widget      *hdaa_widget_get(struct hdaa_devinfo *, nid_t);
  271 uint32_t                hdaa_widget_pin_patch(uint32_t config, const char *str);
  272 uint32_t                hdaa_gpio_patch(uint32_t gpio, const char *str);
  273 
  274 void                    hdaa_patch(struct hdaa_devinfo *devinfo);
  275 void                    hdaa_patch_direct(struct hdaa_devinfo *devinfo);
  276 
  277 #endif

Cache object: 52deca5a097ae5b6c1315d6c31d2935a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.