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