1 /* $OpenBSD: esavar.h,v 1.1 2002/04/08 01:47:33 frantzen Exp $ */
2 /* $NetBSD: esavar.h,v 1.4 2002/03/16 14:34:01 jmcneill Exp $ */
3
4 /*
5 * Copyright (c) 2001, 2002 Jared D. McNeill <jmcneill@invisible.yi.org>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * 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
29 /*
30 * ESS Allegro-1 / Maestro3 Audio Driver
31 *
32 * Based on the FreeBSD maestro3 driver
33 *
34 */
35
36 /*
37 * Number of simultaneous voices
38 *
39 * NOTE: The current code attaches audio0 thru audioESA_NUM_VOICES-1
40 * to this driver, and a lot of people probably don't want that.
41 * So, we'll default to 1 but we'll allow for the possibility of
42 * more.
43 *
44 * The current MINISRC image limits us to a maximum of 4 simultaneous voices.
45 */
46 #ifndef ESA_NUM_VOICES
47 #define ESA_NUM_VOICES 1
48 #endif
49
50 #define KERNADDR(p) ((void *)((p)->addr))
51 #define DMAADDR(p) ((p)->map->dm_segs[0].ds_addr)
52
53 #define ESA_MINRATE 8000
54 #define ESA_MAXRATE 48000
55
56 struct esa_list {
57 int currlen;
58 int mem_addr;
59 int max;
60 int indexmap[ESA_NUM_VOICES * 2];
61 };
62
63 struct esa_dma {
64 bus_dmamap_t map;
65 caddr_t addr;
66 bus_dma_segment_t segs[1];
67 int nsegs;
68 size_t size;
69 struct esa_dma *next;
70 };
71
72 struct esa_channel {
73 int active;
74 int data_offset;
75 int index;
76 size_t bufsize;
77 int blksize;
78 int pos;
79 void *buf;
80 u_int32_t start;
81 u_int32_t count;
82
83 /* mode settings */
84 struct audio_params mode;
85
86 void (*intr)(void *);
87 void *arg;
88 };
89
90 struct esa_voice {
91 struct device *parent; /* pointer to our parent */
92 struct esa_channel play;
93 struct esa_channel rec;
94 struct esa_dma *dma;
95 int inlist;
96 int index; /* 0: play, 1: record */
97 };
98
99 struct esa_softc
100 {
101 struct device sc_dev;
102 bus_space_tag_t sc_iot;
103 bus_space_handle_t sc_ioh;
104 bus_addr_t sc_iob;
105 bus_size_t sc_ios;
106
107 pcitag_t sc_tag;
108 pci_chipset_tag_t sc_pct;
109 bus_dma_tag_t sc_dmat;
110 pcireg_t sc_pcireg;
111
112 void *sc_ih;
113
114 struct ac97_codec_if *codec_if;
115 struct ac97_host_if host_if;
116 enum ac97_host_flags codec_flags;
117
118 struct device *sc_audiodev[ESA_NUM_VOICES];
119
120 struct esa_voice voice[ESA_NUM_VOICES];
121 struct esa_dma *sc_dmas;
122 int count;
123
124 /* timer management */
125 int sc_ntimers;
126
127 /* packed list structures */
128 struct esa_list mixer_list;
129 struct esa_list adc1_list;
130 struct esa_list dma_list;
131 struct esa_list msrc_list;
132
133 int type; /* Allegro-1 or Maestro 3? */
134 int delay1, delay2;
135
136 void *powerhook;
137 u_int16_t *savemem;
138 };