1139749Simp/*-
274429Sorion * Copyright (c) 2001 Orion Hodson <O.Hodson@cs.ucl.ac.uk>
374429Sorion * All rights reserved.
474429Sorion *
574429Sorion * Redistribution and use in source and binary forms, with or without
674429Sorion * modification, are permitted provided that the following conditions
774429Sorion * are met:
874429Sorion * 1. Redistributions of source code must retain the above copyright
974429Sorion *    notice, this list of conditions and the following disclaimer.
1074429Sorion * 2. Redistributions in binary form must reproduce the above copyright
1174429Sorion *    notice, this list of conditions and the following disclaimer in the
1274429Sorion *    documentation and/or other materials provided with the distribution.
1374429Sorion *
1474429Sorion * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1574429Sorion * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1674429Sorion * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1774429Sorion * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1874429Sorion * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1974429Sorion * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2074429Sorion * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2174429Sorion * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2274429Sorion * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2374429Sorion * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2474429Sorion * SUCH DAMAGE.
2574429Sorion *
2674429Sorion * $FreeBSD$
2774429Sorion */
2874429Sorion
2974429Sorion/* ------------------------------------------------------------------------- */
3074429Sorion/* PCI Configuration Register Offsets */
3174429Sorion
3274429Sorion#define SV_PCI_COMPAT	0x10
3374429Sorion#define SV_PCI_ENHANCED 0x14
3474429Sorion#define SV_PCI_FMSYNTH	0x18
3574429Sorion#define SV_PCI_MIDI	0x1c
3674429Sorion#define SV_PCI_GAMES	0x20
3774429Sorion#define SV_PCI_DMAA	0x40
3874429Sorion#define SV_PCI_DMAC	0x48
3974429Sorion
4074429Sorion#define SV_PCI_DMAA_SIZE	0x10
4174429Sorion#define SV_PCI_DMAA_ALIGN	0x10
4274429Sorion#define SV_PCI_DMAC_SIZE	0x10
4374429Sorion#define SV_PCI_DMAC_ALIGN	0x10
4474429Sorion
4574429Sorion#define SV_PCI_ENHANCED_SIZE	0x08
4674429Sorion
4774429Sorion#define SV_PCI_DMA_ENABLE	0x00000001
4874429Sorion#define SV_PCI_DMA_EXTENDED	0x00000008
4974429Sorion
5074429Sorion/* ------------------------------------------------------------------------- */
5174429Sorion/* DMA Configuration Registers */
5274429Sorion
5374429Sorion#define SV_DMA_ADDR	0x00
5474429Sorion#define SV_DMA_COUNT	0x04
5574429Sorion
5674429Sorion#define	SV_DMA_MODE	0x0B
5774429Sorion#define 	SV_DMA_MODE_AUTO	0x10
5874429Sorion#define		SV_DMA_MODE_RD		0x04
5974429Sorion#define		SV_DMA_MODE_WR		0x08
6074429Sorion
6174429Sorion/* ------------------------------------------------------------------------- */
6274429Sorion/* Enhanced Mode Configuration Registers */
6374429Sorion
6474429Sorion#define SV_CM_CONTROL	0x00
6574429Sorion#define		SV_CM_CONTROL_ENHANCED	0x01
6674429Sorion#define		SV_CM_CONTROL_TEST	0x02
6774429Sorion#define		SV_CM_CONTROL_REVERB	0x04
6874429Sorion#define		SV_CM_CONTROL_PWS	0x08
6974429Sorion#define		SV_CM_CONTROL_INTA	0x20
7074429Sorion#define		SV_CM_CONTROL_RESET	0x80
7174429Sorion
7274429Sorion#define SV_CM_IMR	0x01
7374429Sorion#define		SV_CM_IMR_AMSK		0x01
7474429Sorion#define		SV_CM_IMR_CMSK		0x04
7574429Sorion#define		SV_CM_IMR_SMSK		0x08
7674429Sorion#define		SV_CM_IMR_UDM		0x40
7774429Sorion#define		SV_CM_IMR_MIDM		0x80
7874429Sorion
7974429Sorion#define SV_CM_STATUS	0x02
8074429Sorion#define		SV_CM_STATUS_AINT	0x01
8174429Sorion#define		SV_CM_STATUS_CINT	0x04
8274429Sorion#define		SV_CM_STATUS_SINT	0x08
8374429Sorion#define		SV_CM_STATUS_UDI	0x40
8474429Sorion#define		SV_CM_STATUS_MI		0x80
8574429Sorion
8674429Sorion#define SV_CM_INDEX	0x04
8774429Sorion#define		SV_CM_INDEX_MASK	0x3f
8874429Sorion#define		SV_CM_INDEX_MCE		0x40
8974429Sorion#define		SV_CM_INDEX_TRD		0x80
9074429Sorion
9174429Sorion#define SV_CM_DATA	0x05
9274429Sorion
9374429Sorion/* ------------------------------------------------------------------------- */
9474429Sorion/* Indexed Codec/Mixer Registers (left channels were applicable) */
9574429Sorion
9674429Sorion#define SV_REG_ADC_INPUT	0x00
9774429Sorion#define 	SV_INPUT_GAIN_MASK	0x0f
9874429Sorion#define		SV_INPUT_MICGAIN	0x10
9974429Sorion#define		SV_INPUT_CD		0x20
10074429Sorion#define 	SV_INPUT_DAC		0x40
10174429Sorion#define 	SV_INPUT_AUX2		0x60
10274429Sorion#define 	SV_INPUT_LINE		0x80
10374429Sorion#define 	SV_INPUT_AUX1		0xa0
10474429Sorion#define 	SV_INPUT_MIC		0xc0
10574429Sorion#define		SV_INPUT_MIXOUT		0xe0
10674429Sorion
10774429Sorion#define	SV_REG_AUX1		0x02
10874429Sorion#define	SV_REG_CD		0x04
10974429Sorion#define	SV_REG_LINE		0x06
11074429Sorion#define	SV_REG_MIC		0x08
11174429Sorion#define	SV_REG_SYNTH		0x0a
11274429Sorion#define	SV_REG_AUX2		0x0c
11374429Sorion#define	SV_REG_MIX		0x0e
11474429Sorion#define	SV_REG_PCM		0x10
11574429Sorion#define		SV_DEFAULT_MAX		0x1f
11674429Sorion#define		SV_ADC_MAX		0x0f
11774429Sorion#define		SV_MIC_MAX		0x0f
11874429Sorion#define 	SV_PCM_MAX		0x3f
11974429Sorion#define 	SV_MUTE			0x80
12074429Sorion
12174429Sorion#define SV_REG_FORMAT		0x12
12274429Sorion#define		SV_AFMT_MONO	0x00
12374429Sorion#define		SV_AFMT_STEREO	0x01
12474429Sorion#define		SV_AFMT_S16	0x02
12574429Sorion#define		SV_AFMT_U8	0x00
12674429Sorion#define		SV_AFMT_DMAA(x)		(x)
12774429Sorion#define		SV_AFMT_DMAA_MSK	0x03
12874429Sorion#define		SV_AFMT_DMAC(x)		((x) << 4)
12974429Sorion#define		SV_AFMT_DMAC_MSK	0x30
13074429Sorion
13174429Sorion#define SV_REG_ENABLE		0x13
13274429Sorion#define		SV_PLAY_ENABLE		0x01
13374429Sorion#define		SV_RECORD_ENABLE	0x02
13474429Sorion#define		SV_PLAYBACK_PAUSE	0x04
13574429Sorion
13674429Sorion#define SV_REG_REVISION	0x15
13774429Sorion
13874429Sorion#define SV_REG_LOOPBACK	0x16
13974429Sorion#define		SV_LOOPBACK_ENABLE	0x01
14074429Sorion#define		SV_LOOPBACK_MAX		0x3f
14174429Sorion#define		SV_LOOPBACK_LEVEL(x)	((x) << 2)
14274429Sorion
14374429Sorion#define	SV_REG_DMAA_COUNT_HI	0x18
14474429Sorion#define	SV_REG_DMAA_COUNT_LO	0x19
14574429Sorion#define	SV_REG_DMAC_COUNT_HI	0x1c
14674429Sorion#define	SV_REG_DMAC_COUNT_LO	0x1d
14774429Sorion
14874429Sorion#define SV_REG_PCM_SAMPLING_LO	0x1e
14974429Sorion#define SV_REG_PCM_SAMPLING_HI	0x1f
15074429Sorion
15174429Sorion#define SV_REG_SYN_SAMPLING_LO 	0x20
15274429Sorion#define SV_REG_SYN_SAMPLING_HI 	0x21
15374429Sorion
15474429Sorion#define SV_REG_CLOCK_SOURCE	0x22
15574429Sorion#define		SV_CLOCK_ALTERNATE	0x10
15674429Sorion#define SV_REG_ALT_RATE	0x23
15774429Sorion
15874429Sorion#define SV_REG_ADC_PLLM	0x24
15974429Sorion#define SV_REG_ADC_PLLN	0x25
16074429Sorion#define 	SV_ADC_PLLN(x)		((x) & 0x1f)
16174429Sorion#define		SV_ADC_PLLR(x)		((x) << 5)
16274429Sorion
16374429Sorion#define SV_REG_SYNTH_PLLM	0x26
16474429Sorion#define SV_REG_SYNTH_PLLN	0x27
16574429Sorion#define 	SV_SYNTH_PLLN(x)	((x) & 0x1f)
16674429Sorion#define		SV_SYNTH_PLLR(x)	((x) << 5)
16774429Sorion
16874429Sorion#define SV_REG_SRS_SPACE	0x2c
16974429Sorion#define		SV_SRS_SPACE_100	0x00
17074429Sorion#define		SV_SRS_SPACE_75		0x01
17174429Sorion#define		SV_SRS_SPACE_50		0x02
17274429Sorion#define		SV_SRS_SPACE_25		0x03
17374429Sorion#define		SV_SRS_SPACE_0		0x04
17474429Sorion#define		SV_SRS_DISABLED		0x80
17574429Sorion
17674429Sorion#define	SV_REG_SRS_CENTER	0x2d
17774429Sorion#define		SV_SRS_CENTER_100	0x00
17874429Sorion#define		SV_SRS_CENTER_75	0x01
17974429Sorion#define		SV_SRS_CENTER_50	0x02
18074429Sorion#define		SV_SRS_CENTER_25	0x03
18174429Sorion#define		SV_SRS_CENTER_0		0x04
18274429Sorion
18374429Sorion#define SV_REG_ANALOG_PWR	0x30
18474429Sorion#define		SV_ANALOG_OFF_DAC	0x01
18574429Sorion#define		SV_ANALOG_OFF_ADC	0x08
18674429Sorion#define		SV_ANALOG_OFF_MIX	0x10
18774429Sorion#define		SV_ANALOG_OFF_SRS	0x20
18874429Sorion#define		SV_ANALOG_OFF_SPLL	0x40
18974429Sorion#define		SV_ANALOG_OFF_APLL	0x80
19074429Sorion#define		SV_ANALOG_OFF		0xf9
19174429Sorion
19274429Sorion#define	SV_REG_DIGITAL_PWR	0x31
19374429Sorion#define		SV_DIGITAL_OFF_SYN	0x01
19474429Sorion#define		SV_DIGITAL_OFF_MU	0x02
19574429Sorion#define		SV_DIGITAL_OFF_GP	0x04
19674429Sorion#define		SV_DIGITAL_OFF_BI	0x08
19774429Sorion#define		SV_DIGITAL_OFF		0x0f
19874429Sorion
19974429Sorion/* ------------------------------------------------------------------------- */
20074429Sorion/* ADC PLL constants */
20174429Sorion
20274429Sorion#define		SV_F_SCALE		512
20374429Sorion#define		SV_F_REF		24576000
204