1 | /* $NetBSD: cs428x.h,v 1.16 2012/10/27 17:18:31 chs Exp $ */ |
2 | |
3 | /* |
4 | * Copyright (c) 2000 Tatoku Ogaito. All rights reserved. |
5 | * |
6 | * Redistribution and use in source and binary forms, with or without |
7 | * modification, are permitted provided that the following conditions |
8 | * are met: |
9 | * 1. Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * 2. Redistributions in binary form must reproduce the above copyright |
12 | * notice, this list of conditions and the following disclaimer in the |
13 | * documentation and/or other materials provided with the distribution. |
14 | * 3. All advertising materials mentioning features or use of this software |
15 | * must display the following acknowledgement: |
16 | * This product includes software developed by Tatoku Ogaito |
17 | * for the NetBSD Project. |
18 | * 4. The name of the author may not be used to endorse or promote products |
19 | * derived from this software without specific prior written permission |
20 | * |
21 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
22 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
23 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
24 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
26 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
27 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
28 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
29 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
30 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | /* Common functions and variables for CS4280 and CS4281 */ |
34 | |
35 | #ifndef _CS428X_H_ |
36 | #define _CS428X_H_ |
37 | |
38 | #define PCI_BA0 (0x10) |
39 | #define PCI_BA1 (0x14) |
40 | |
41 | #define CS428X_SAVE_REG_MAX (0x10) |
42 | #define TYPE_CS4280 (0x4280) |
43 | #define TYPE_CS4281 (0x4281) |
44 | |
45 | #define BA0READ4(sc, r) bus_space_read_4((sc)->ba0t, (sc)->ba0h, (r)) |
46 | #define BA0WRITE4(sc, r, x) bus_space_write_4((sc)->ba0t, (sc)->ba0h, (r), (x)) |
47 | |
48 | /* DMA */ |
49 | struct cs428x_dma { |
50 | bus_dmamap_t map; |
51 | void *addr; /* real DMA buffer */ |
52 | void *dum; /* dummy buffer for audio driver */ |
53 | bus_dma_segment_t segs[1]; |
54 | int nsegs; |
55 | size_t size; |
56 | struct cs428x_dma *next; |
57 | }; |
58 | #define DMAADDR(p) ((p)->map->dm_segs[0].ds_addr) |
59 | #define KERNADDR(p) ((void *)((p)->addr)) /* buffer for real DMA */ |
60 | #define BUFADDR(p) ((void *)((p)->dum)) /* buffer for audio driver */ |
61 | |
62 | /* |
63 | * Flags (currently used only for CS4280) |
64 | */ |
65 | enum cs428x_flags { |
66 | CS428X_FLAG_NONE = 0x0, |
67 | CS428X_FLAG_INVAC97EAMP = 0x1, /* inverted AC97 external amp */ |
68 | CS428X_FLAG_CLKRUNHACK = 0x2 /* needs CLKRUN hack */ |
69 | }; |
70 | |
71 | /* |
72 | * Software state |
73 | */ |
74 | struct cs428x_softc { |
75 | device_t sc_dev; |
76 | kmutex_t sc_lock; |
77 | kmutex_t sc_intr_lock; |
78 | |
79 | pci_chipset_tag_t sc_pc; |
80 | pcitag_t sc_pt; |
81 | pci_intr_handle_t * sc_ih; |
82 | pci_intr_handle_t intrh; |
83 | |
84 | /* I/O (BA0) */ |
85 | bus_space_tag_t ba0t; |
86 | bus_space_handle_t ba0h; |
87 | |
88 | /* BA1 */ |
89 | bus_space_tag_t ba1t; |
90 | bus_space_handle_t ba1h; |
91 | |
92 | /* DMA */ |
93 | bus_dma_tag_t sc_dmatag; |
94 | struct cs428x_dma *sc_dmas; |
95 | size_t dma_size; |
96 | size_t dma_align; |
97 | |
98 | int hw_blocksize; |
99 | int type; |
100 | |
101 | /* playback */ |
102 | void (*sc_pintr)(void *); /* DMA completion intr handler */ |
103 | void *sc_parg; /* arg for sc_intr() */ |
104 | char *sc_ps, *sc_pe, *sc_pn; |
105 | int sc_pcount; |
106 | int sc_pi; |
107 | struct cs428x_dma *sc_pdma; |
108 | char *sc_pbuf; |
109 | int (*halt_output)(void *); |
110 | char sc_prun; /* playback status */ |
111 | int sc_prate; /* playback sample rate */ |
112 | |
113 | /* capturing */ |
114 | void (*sc_rintr)(void *); /* DMA completion intr handler */ |
115 | void *sc_rarg; /* arg for sc_intr() */ |
116 | char *sc_rs, *sc_re, *sc_rn; |
117 | int sc_rcount; |
118 | int sc_ri; |
119 | struct cs428x_dma *sc_rdma; |
120 | char *sc_rbuf; |
121 | int sc_rparam; /* record format */ |
122 | int (*halt_input)(void *); |
123 | char sc_rrun; /* recording status */ |
124 | int sc_rrate; /* recording sample rate */ |
125 | |
126 | /* Although cs4281 does not support midi (yet), |
127 | * don't remove these definition. |
128 | */ |
129 | void (*sc_iintr)(void *, int); /* midi input ready handler */ |
130 | void (*sc_ointr)(void *); /* midi output ready handler */ |
131 | void *sc_arg; |
132 | |
133 | /* |
134 | * XXX |
135 | * Actually these 3 variables are needed only for CS4280. |
136 | */ |
137 | enum cs428x_flags sc_flags; |
138 | uint32_t pctl; |
139 | uint32_t cctl; |
140 | |
141 | /* AC97 CODEC */ |
142 | struct ac97_codec_if *codec_if; |
143 | struct ac97_host_if host_if; |
144 | |
145 | /* Power Management */ |
146 | union { |
147 | struct { |
148 | uint32_t pctl; |
149 | uint32_t pba; |
150 | uint32_t pfie; |
151 | uint32_t pdtc; |
152 | uint32_t cctl; |
153 | uint32_t cba; |
154 | uint32_t cie; |
155 | } cs4280; |
156 | struct { |
157 | uint32_t dba0; |
158 | uint32_t dbc0; |
159 | uint32_t dmr0; |
160 | uint32_t dcr0; |
161 | uint32_t dba1; |
162 | uint32_t dbc1; |
163 | uint32_t dmr1; |
164 | uint32_t dcr1; |
165 | } cs4281; |
166 | } sc_suspend_state; |
167 | |
168 | /* CLKRUN hack (CS428X_FLAG_CLKRUN), only for CS4280 */ |
169 | int sc_active; |
170 | bus_space_tag_t sc_pm_iot; |
171 | bus_space_handle_t sc_pm_ioh; |
172 | }; |
173 | |
174 | |
175 | int cs428x_round_blocksize(void *, int, int, const audio_params_t *); |
176 | int cs428x_get_props(void *); |
177 | int cs428x_attach_codec(void *, struct ac97_codec_if *); |
178 | int cs428x_read_codec(void *, u_int8_t, u_int16_t *); |
179 | int cs428x_write_codec(void *, u_int8_t, u_int16_t); |
180 | |
181 | int cs428x_mixer_set_port(void *, mixer_ctrl_t *); |
182 | int cs428x_mixer_get_port(void *, mixer_ctrl_t *); |
183 | int cs428x_query_devinfo(void *, mixer_devinfo_t *); |
184 | void *cs428x_malloc(void *, int, size_t); |
185 | size_t cs428x_round_buffersize(void *, int, size_t); |
186 | void cs428x_free(void *, void *, size_t); |
187 | paddr_t cs428x_mappage(void *, void *, off_t, int); |
188 | void cs428x_get_locks(void *, kmutex_t **, kmutex_t **); |
189 | |
190 | /* internal functions */ |
191 | int cs428x_allocmem(struct cs428x_softc *, size_t, struct cs428x_dma *); |
192 | int cs428x_src_wait(struct cs428x_softc *); |
193 | |
194 | |
195 | /* DEBUG */ |
196 | /* #define CS4280_DEBUG */ |
197 | /* #define CS4281_DEBUG */ |
198 | |
199 | #if defined(CS4280_DEBUG) || defined(CS4281_DEBUG) |
200 | #define DPRINTF(x) if (cs428x_debug) printf x |
201 | #define DPRINTFN(n,x) if (cs428x_debug>(n)) printf x |
202 | extern int cs428x_debug; |
203 | #if CS4280_DEBUG + 0 == 0 |
204 | #undef CS4280_DEBUG |
205 | #define CS4280_DEBUG 0 |
206 | #endif |
207 | #else |
208 | #define DPRINTF(x) |
209 | #define DPRINTFN(n,x) |
210 | #endif |
211 | |
212 | #endif /* _CS428X_H_ */ |
213 | |