xref: /netbsd-src/sys/dev/ic/ad1848var.h (revision c509fb12bb33ebfbee663f4835430f41519b3222)
1*c509fb12Sisaki /*	$NetBSD: ad1848var.h,v 1.20 2020/02/29 05:51:11 isaki Exp $	*/
2d4ec33b5Spk 
318e341a9Smycroft /*-
48a962f23Sjmcneill  * Copyright (c) 1999, 2008 The NetBSD Foundation, Inc.
518e341a9Smycroft  * All rights reserved.
618e341a9Smycroft  *
718e341a9Smycroft  * This code is derived from software contributed to The NetBSD Foundation
818e341a9Smycroft  * by Ken Hornstein and John Kohl.
918e341a9Smycroft  *
1018e341a9Smycroft  * Redistribution and use in source and binary forms, with or without
1118e341a9Smycroft  * modification, are permitted provided that the following conditions
1218e341a9Smycroft  * are met:
1318e341a9Smycroft  * 1. Redistributions of source code must retain the above copyright
1418e341a9Smycroft  *    notice, this list of conditions and the following disclaimer.
1518e341a9Smycroft  * 2. Redistributions in binary form must reproduce the above copyright
1618e341a9Smycroft  *    notice, this list of conditions and the following disclaimer in the
1718e341a9Smycroft  *    documentation and/or other materials provided with the distribution.
1818e341a9Smycroft  *
1918e341a9Smycroft  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2018e341a9Smycroft  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2118e341a9Smycroft  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2218e341a9Smycroft  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2318e341a9Smycroft  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2418e341a9Smycroft  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2518e341a9Smycroft  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2618e341a9Smycroft  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2718e341a9Smycroft  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2818e341a9Smycroft  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2918e341a9Smycroft  * POSSIBILITY OF SUCH DAMAGE.
3018e341a9Smycroft  */
31d4ec33b5Spk /*
32d4ec33b5Spk  * Copyright (c) 1994 John Brezak
33d4ec33b5Spk  * Copyright (c) 1991-1993 Regents of the University of California.
34d4ec33b5Spk  * All rights reserved.
35d4ec33b5Spk  *
36d4ec33b5Spk  * Redistribution and use in source and binary forms, with or without
37d4ec33b5Spk  * modification, are permitted provided that the following conditions
38d4ec33b5Spk  * are met:
39d4ec33b5Spk  * 1. Redistributions of source code must retain the above copyright
40d4ec33b5Spk  *    notice, this list of conditions and the following disclaimer.
41d4ec33b5Spk  * 2. Redistributions in binary form must reproduce the above copyright
42d4ec33b5Spk  *    notice, this list of conditions and the following disclaimer in the
43d4ec33b5Spk  *    documentation and/or other materials provided with the distribution.
44d4ec33b5Spk  * 3. All advertising materials mentioning features or use of this software
45d4ec33b5Spk  *    must display the following acknowledgement:
46d4ec33b5Spk  *	This product includes software developed by the Computer Systems
47d4ec33b5Spk  *	Engineering Group at Lawrence Berkeley Laboratory.
48d4ec33b5Spk  * 4. Neither the name of the University nor of the Laboratory may be used
49d4ec33b5Spk  *    to endorse or promote products derived from this software without
50d4ec33b5Spk  *    specific prior written permission.
51d4ec33b5Spk  *
52d4ec33b5Spk  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53d4ec33b5Spk  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54d4ec33b5Spk  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55d4ec33b5Spk  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56d4ec33b5Spk  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57d4ec33b5Spk  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58d4ec33b5Spk  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59d4ec33b5Spk  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60d4ec33b5Spk  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61d4ec33b5Spk  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62d4ec33b5Spk  * SUCH DAMAGE.
63d4ec33b5Spk  *
64d4ec33b5Spk  */
65d4ec33b5Spk 
66d4ec33b5Spk 
67d4ec33b5Spk #define MUTE_LEFT       1
68d4ec33b5Spk #define MUTE_RIGHT      2
69d4ec33b5Spk #define MUTE_ALL	(MUTE_LEFT | MUTE_RIGHT)
70d4ec33b5Spk #define MUTE_MONO       MUTE_ALL
71d4ec33b5Spk 
72dae2f737Sitohy #define WAVE_MUTE0	1		/* force mute (overrides UNMUTE1) */
73dae2f737Sitohy #define WAVE_UNMUTE1	2		/* unmute (overrides MUTE2) */
74dae2f737Sitohy #define WAVE_MUTE2	4		/* weak mute */
75dae2f737Sitohy #define WAVE_MUTE2_INIT	0		/* init and MUTE2 */
76dae2f737Sitohy 
77b3279eb3Spk /*
78b3279eb3Spk  * Don't change this ordering without seriously looking around.
79b3279eb3Spk  * These are indexes into mute[] array and into a register
80b3279eb3Spk  * information array.
81b3279eb3Spk  */
82d4ec33b5Spk #define AD1848_AUX2_CHANNEL	0
83d4ec33b5Spk #define AD1848_AUX1_CHANNEL	1
84d4ec33b5Spk #define AD1848_DAC_CHANNEL	2
85d4ec33b5Spk #define AD1848_LINE_CHANNEL	3
86d4ec33b5Spk #define AD1848_MONO_CHANNEL	4
87be6275d6Smartin #define AD1848_OUT_CHANNEL	5
88be6275d6Smartin #define AD1848_MONITOR_CHANNEL	6 /* Doesn't seem to be on all later chips */
89d4ec33b5Spk 
90d797b29dSmartin #define	AD1848_NUM_CHANNELS	7
91d797b29dSmartin 
92d797b29dSmartin struct ad1848_volume {
93d797b29dSmartin 	u_char	left;
94d797b29dSmartin 	u_char	right;
95d797b29dSmartin };
96d797b29dSmartin 
97d797b29dSmartin struct ad1848_softc {
984418f775Schristos 	device_t sc_dev;		/* base device */
998a962f23Sjmcneill 	kmutex_t sc_lock;
1008a962f23Sjmcneill 	kmutex_t sc_intr_lock;
101d797b29dSmartin 	bus_space_tag_t sc_iot;		/* tag */
102d797b29dSmartin 	bus_space_handle_t sc_ioh;	/* handle */
103d797b29dSmartin 
10493293b9eSkent 	int	(*sc_readreg)(struct ad1848_softc *, int);
10593293b9eSkent 	void	(*sc_writereg)(struct ad1848_softc *, int, int);
106d797b29dSmartin #define ADREAD(sc, index)		(*(sc)->sc_readreg)(sc, index)
107d797b29dSmartin #define ADWRITE(sc, index, data)	(*(sc)->sc_writereg)(sc, index, data)
108d797b29dSmartin 
109d797b29dSmartin 	void	*parent;
110d797b29dSmartin 
111d797b29dSmartin 	/* We keep track of these */
112d797b29dSmartin 	struct ad1848_volume gains[AD1848_NUM_CHANNELS];
113d797b29dSmartin 	struct ad1848_volume rec_gain;
114d797b29dSmartin 
115d797b29dSmartin 	int	rec_port;		/* recording port */
116d797b29dSmartin 
117d797b29dSmartin 	/* ad1848 */
118d797b29dSmartin 	u_char	MCE_bit;
119d797b29dSmartin 	char	mic_gain_on;		/* CS4231 only */
120d797b29dSmartin 	char    mute[AD1848_NUM_CHANNELS];
121d797b29dSmartin 
12280f7d210Schristos 	const char	*chip_name;
123d797b29dSmartin 	int	mode;
124d797b29dSmartin 	int	is_ad1845;
125d797b29dSmartin 
126d797b29dSmartin 	u_int	precision;		/* 8/16 bits */
127d797b29dSmartin 	int	channels;
128d797b29dSmartin 
129d797b29dSmartin 	u_char	speed_bits;
130d797b29dSmartin 	u_char	format_bits;
131d797b29dSmartin 	u_char	need_commit;
132d797b29dSmartin 
133d797b29dSmartin 	u_char	wave_mute_status;
134d797b29dSmartin 	int	open_mode;
135d797b29dSmartin };
136d797b29dSmartin 
137d4ec33b5Spk /*
138b3279eb3Spk  * Ad1848 registers.
139d4ec33b5Spk  */
140d4ec33b5Spk #define MIC_IN_PORT	0
141d4ec33b5Spk #define LINE_IN_PORT	1
142d4ec33b5Spk #define AUX1_IN_PORT	2
143d4ec33b5Spk #define DAC_IN_PORT	3
144d4ec33b5Spk 
145d4ec33b5Spk #define AD1848_KIND_LVL		0
146d4ec33b5Spk #define AD1848_KIND_MUTE	1
147d4ec33b5Spk #define AD1848_KIND_RECORDGAIN	2
148d4ec33b5Spk #define AD1848_KIND_MICGAIN	3
149d4ec33b5Spk #define AD1848_KIND_RECORDSOURCE 4
150d4ec33b5Spk 
151d4ec33b5Spk typedef struct ad1848_devmap {
152d4ec33b5Spk 	int  id;
153d4ec33b5Spk 	int  kind;
154d4ec33b5Spk 	int  dev;
155d4ec33b5Spk } ad1848_devmap_t;
156d4ec33b5Spk 
157dae2f737Sitohy #ifdef _KERNEL
158dae2f737Sitohy 
15993293b9eSkent int	ad_read(struct ad1848_softc *, int);
16093293b9eSkent int	ad_xread(struct ad1848_softc *, int);
16193293b9eSkent void	ad_write(struct ad1848_softc *, int, int);
16293293b9eSkent void	ad_xwrite(struct ad1848_softc *, int, int);
163d4ec33b5Spk 
16493293b9eSkent void	ad1848_attach(struct ad1848_softc *);
16593293b9eSkent void	ad1848_reset(struct ad1848_softc *);
16693293b9eSkent int	ad1848_open(void *, int);
16793293b9eSkent void	ad1848_close(void *);
168d4ec33b5Spk 
169f40133bdSmartin int	ad1848_mixer_get_port(struct ad1848_softc *, const ad1848_devmap_t *,
17093293b9eSkent 	    int, mixer_ctrl_t *);
171f40133bdSmartin int	ad1848_mixer_set_port(struct ad1848_softc *, const ad1848_devmap_t *,
17293293b9eSkent 	    int, mixer_ctrl_t *);
17393293b9eSkent int	ad1848_set_speed(struct ad1848_softc *, u_int *);
17493293b9eSkent void	ad1848_mute_wave_output(struct ad1848_softc *, int, int);
175e622eac4Sisaki int	ad1848_query_format(void *, audio_format_query_t *);
176e622eac4Sisaki int	ad1848_set_format(void *, int,
177e622eac4Sisaki 	    const audio_params_t *, const audio_params_t *,
178e622eac4Sisaki 	    audio_filter_reg_t *, audio_filter_reg_t *);
17993293b9eSkent int	ad1848_commit_settings(void *);
18093293b9eSkent int	ad1848_set_rec_port(struct ad1848_softc *, int);
18193293b9eSkent int	ad1848_get_rec_port(struct ad1848_softc *);
18293293b9eSkent int	ad1848_set_channel_gain(struct ad1848_softc *, int,
18393293b9eSkent 	    struct ad1848_volume *);
18493293b9eSkent int	ad1848_get_device_gain(struct ad1848_softc *, int,
18593293b9eSkent 	    struct ad1848_volume *);
18693293b9eSkent int	ad1848_set_rec_gain(struct ad1848_softc *, struct ad1848_volume *);
18793293b9eSkent int	ad1848_get_rec_gain(struct ad1848_softc *, struct ad1848_volume *);
188d4ec33b5Spk /* Note: The mic pre-MUX gain is not a variable gain, it's 20dB or 0dB */
18993293b9eSkent int	ad1848_set_mic_gain(struct ad1848_softc *, struct ad1848_volume *);
19093293b9eSkent int	ad1848_get_mic_gain(struct ad1848_softc *, struct ad1848_volume *);
19193293b9eSkent void	ad1848_mute_channel(struct ad1848_softc *, int, int);
19293293b9eSkent int	ad1848_to_vol(mixer_ctrl_t *, struct ad1848_volume *);
19393293b9eSkent int	ad1848_from_vol(mixer_ctrl_t *, struct ad1848_volume *);
1948a962f23Sjmcneill void	ad1848_init_locks(struct ad1848_softc *, int);
1958a962f23Sjmcneill void	ad1848_destroy_locks(struct ad1848_softc *);
196d4ec33b5Spk 
19793293b9eSkent int	ad1848_halt_output(void *);
19893293b9eSkent int	ad1848_halt_input(void *);
1998a962f23Sjmcneill void	ad1848_get_locks(void *, kmutex_t **, kmutex_t **);
200d4ec33b5Spk 
201d4ec33b5Spk #ifdef AUDIO_DEBUG
20293293b9eSkent void	ad1848_dump_regs(struct ad1848_softc *);
203d4ec33b5Spk #endif
204d4ec33b5Spk 
205d4ec33b5Spk #endif
206