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