xref: /minix3/minix/drivers/audio/cs4281/cs4281.h (revision 8acfcfc39e1ef8f5c329d8b80f06183c1ae1672e)
1*8acfcfc3SJia-Ju Bai #ifndef _SDR_H
2*8acfcfc3SJia-Ju Bai #define _SDR_H
3*8acfcfc3SJia-Ju Bai /* ======= General Parameter ======= */
4*8acfcfc3SJia-Ju Bai /* Global configure */
5*8acfcfc3SJia-Ju Bai #define DMA_LENGTH_BY_FRAME
6*8acfcfc3SJia-Ju Bai #define DMA_BASE_IOMAP
7*8acfcfc3SJia-Ju Bai #define MIXER_AC97
8*8acfcfc3SJia-Ju Bai 
9*8acfcfc3SJia-Ju Bai #include <minix/audio_fw.h>
10*8acfcfc3SJia-Ju Bai #include <sys/types.h>
11*8acfcfc3SJia-Ju Bai #include <sys/ioc_sound.h>
12*8acfcfc3SJia-Ju Bai #include <minix/sound.h>
13*8acfcfc3SJia-Ju Bai #include <machine/pci.h>
14*8acfcfc3SJia-Ju Bai #include <sys/mman.h>
15*8acfcfc3SJia-Ju Bai #include "io.h"
16*8acfcfc3SJia-Ju Bai 
17*8acfcfc3SJia-Ju Bai /* Subdevice type */
18*8acfcfc3SJia-Ju Bai #define DAC		0
19*8acfcfc3SJia-Ju Bai #define ADC		1
20*8acfcfc3SJia-Ju Bai #define MIX		2
21*8acfcfc3SJia-Ju Bai 
22*8acfcfc3SJia-Ju Bai /* PCI number and driver name */
23*8acfcfc3SJia-Ju Bai #define VENDOR_ID		0x1013
24*8acfcfc3SJia-Ju Bai #define DEVICE_ID		0x6005
25*8acfcfc3SJia-Ju Bai #define DRIVER_NAME		"CS4281"
26*8acfcfc3SJia-Ju Bai 
27*8acfcfc3SJia-Ju Bai /* Volume option */
28*8acfcfc3SJia-Ju Bai #define GET_VOL			0
29*8acfcfc3SJia-Ju Bai #define SET_VOL			1
30*8acfcfc3SJia-Ju Bai 
31*8acfcfc3SJia-Ju Bai /* Interrupt control */
32*8acfcfc3SJia-Ju Bai #define INTR_ENABLE		1
33*8acfcfc3SJia-Ju Bai #define INTR_DISABLE	0
34*8acfcfc3SJia-Ju Bai 
35*8acfcfc3SJia-Ju Bai /* Interrupt status */
36*8acfcfc3SJia-Ju Bai #define INTR_STS_DAC		0x0100
37*8acfcfc3SJia-Ju Bai #define INTR_STS_ADC		0x0200
38*8acfcfc3SJia-Ju Bai 
39*8acfcfc3SJia-Ju Bai /* ======= Self-defined Parameter ======= */
40*8acfcfc3SJia-Ju Bai #define REG_INTR_STS		0x0000
41*8acfcfc3SJia-Ju Bai #define REG_INTR_CTRL		0x0008
42*8acfcfc3SJia-Ju Bai #define REG_INTR_MASK		0x000c
43*8acfcfc3SJia-Ju Bai 
44*8acfcfc3SJia-Ju Bai #define REG_CONF_WRITE		0x03e0
45*8acfcfc3SJia-Ju Bai #define REG_POWER_EXT		0x03e4
46*8acfcfc3SJia-Ju Bai #define REG_SPOWER_CTRL		0x03ec
47*8acfcfc3SJia-Ju Bai #define REG_CONF_LOAD		0x03f0
48*8acfcfc3SJia-Ju Bai #define REG_CLK_CTRL		0x0400
49*8acfcfc3SJia-Ju Bai #define REG_MASTER_CTRL		0x0420
50*8acfcfc3SJia-Ju Bai #define REG_CODEC_CTRL		0x0460
51*8acfcfc3SJia-Ju Bai #define REG_CODEC_STATUS	0x0464
52*8acfcfc3SJia-Ju Bai #define REG_CODEC_OSV		0x0468
53*8acfcfc3SJia-Ju Bai #define REG_CODEC_ADDR		0x046c
54*8acfcfc3SJia-Ju Bai #define REG_CODEC_DATA		0x0470
55*8acfcfc3SJia-Ju Bai #define REG_CODEC_SDA		0x047c
56*8acfcfc3SJia-Ju Bai #define REG_SOUND_POWER		0x0740
57*8acfcfc3SJia-Ju Bai #define REG_DAC_SAMPLE_RATE	0x0744
58*8acfcfc3SJia-Ju Bai #define REG_ADC_SAMPLE_RATE	0x0748
59*8acfcfc3SJia-Ju Bai #define REG_SRC_SLOT		0x075c
60*8acfcfc3SJia-Ju Bai #define REG_PCM_LVOL		0x0760
61*8acfcfc3SJia-Ju Bai #define REG_PCM_RVOL		0x0764
62*8acfcfc3SJia-Ju Bai 
63*8acfcfc3SJia-Ju Bai #define REG_DAC_HDSR		0x00f0
64*8acfcfc3SJia-Ju Bai #define REG_DAC_DCC			0x0114
65*8acfcfc3SJia-Ju Bai #define REG_DAC_DMR			0x0150
66*8acfcfc3SJia-Ju Bai #define REG_DAC_DCR			0x0154
67*8acfcfc3SJia-Ju Bai #define REG_DAC_FCR			0x0180
68*8acfcfc3SJia-Ju Bai #define REG_DAC_FSIC		0x0214
69*8acfcfc3SJia-Ju Bai #define REG_ADC_HDSR		0x00f4
70*8acfcfc3SJia-Ju Bai #define REG_ADC_DCC			0x0124
71*8acfcfc3SJia-Ju Bai #define REG_ADC_DMR			0x0158
72*8acfcfc3SJia-Ju Bai #define REG_ADC_DCR			0x015c
73*8acfcfc3SJia-Ju Bai #define REG_ADC_FCR			0x0184
74*8acfcfc3SJia-Ju Bai #define REG_ADC_FSIC		0x0214
75*8acfcfc3SJia-Ju Bai 
76*8acfcfc3SJia-Ju Bai #define REG_DAC_DMA_ADDR	0x0118
77*8acfcfc3SJia-Ju Bai #define REG_DAC_DMA_LEN		0x011c
78*8acfcfc3SJia-Ju Bai #define REG_ADC_DMA_ADDR	0x0128
79*8acfcfc3SJia-Ju Bai #define REG_ADC_DMA_LEN		0x012c
80*8acfcfc3SJia-Ju Bai 
81*8acfcfc3SJia-Ju Bai #define CODEC_REG_POWER		0x26
82*8acfcfc3SJia-Ju Bai 
83*8acfcfc3SJia-Ju Bai #define STS_CODEC_DONE		0x0008
84*8acfcfc3SJia-Ju Bai #define STS_CODEC_VALID		0x0002
85*8acfcfc3SJia-Ju Bai 
86*8acfcfc3SJia-Ju Bai #define CMD_POWER_DOWN		(1 << 14)
87*8acfcfc3SJia-Ju Bai #define CMD_PORT_TIMING		(1 << 16)
88*8acfcfc3SJia-Ju Bai #define CMD_AC97_MODE		(1 << 1)
89*8acfcfc3SJia-Ju Bai #define CMD_MASTER_SERIAL	(1 << 0)
90*8acfcfc3SJia-Ju Bai #define CMD_INTR_ENABLE		0x03
91*8acfcfc3SJia-Ju Bai #define CMD_INTR_DMA		0x00040000
92*8acfcfc3SJia-Ju Bai #define CMD_INTR_DMA0		0x0100
93*8acfcfc3SJia-Ju Bai #define CMD_INTR_DMA1		0x0200
94*8acfcfc3SJia-Ju Bai #define CMD_DMR_INIT		0x50
95*8acfcfc3SJia-Ju Bai #define CMD_DMR_WRITE		0x08
96*8acfcfc3SJia-Ju Bai #define CMD_DMR_READ		0x04
97*8acfcfc3SJia-Ju Bai #define CMD_DMR_BIT8		(1 << 16)
98*8acfcfc3SJia-Ju Bai #define CMD_DMR_MONO		(1 << 17)
99*8acfcfc3SJia-Ju Bai #define CMD_DMR_UNSIGN		(1 << 19)
100*8acfcfc3SJia-Ju Bai #define CMD_DMR_BIT32		(1 << 20)
101*8acfcfc3SJia-Ju Bai #define CMD_DMR_SWAP		(1 << 22)
102*8acfcfc3SJia-Ju Bai #define CMD_DMR_POLL		(1 << 28)
103*8acfcfc3SJia-Ju Bai #define CMD_DMR_DMA			(1 << 29)
104*8acfcfc3SJia-Ju Bai #define CMD_DCR_MASK		(1 << 0)
105*8acfcfc3SJia-Ju Bai #define CMD_FCR_FEN			(1 << 31)
106*8acfcfc3SJia-Ju Bai #define CMD_DAC_FCR_INIT	0x01002000
107*8acfcfc3SJia-Ju Bai #define CMD_ADC_FCR_INIT	0x0b0a2020
108*8acfcfc3SJia-Ju Bai 
109*8acfcfc3SJia-Ju Bai static u32_t dcr_data, dmr_data, fcr_data;
110*8acfcfc3SJia-Ju Bai static u32_t g_sample_rate[] = {
111*8acfcfc3SJia-Ju Bai 	48000, 44100, 22050, 16000, 11025, 8000
112*8acfcfc3SJia-Ju Bai };
113*8acfcfc3SJia-Ju Bai 
114*8acfcfc3SJia-Ju Bai /* Driver Data Structure */
115*8acfcfc3SJia-Ju Bai typedef struct aud_sub_dev_conf_t {
116*8acfcfc3SJia-Ju Bai 	u32_t stereo;
117*8acfcfc3SJia-Ju Bai 	u16_t sample_rate;
118*8acfcfc3SJia-Ju Bai 	u32_t nr_of_bits;
119*8acfcfc3SJia-Ju Bai 	u32_t sign;
120*8acfcfc3SJia-Ju Bai 	u32_t busy;
121*8acfcfc3SJia-Ju Bai 	u32_t fragment_size;
122*8acfcfc3SJia-Ju Bai 	u8_t format;
123*8acfcfc3SJia-Ju Bai } aud_sub_dev_conf_t;
124*8acfcfc3SJia-Ju Bai 
125*8acfcfc3SJia-Ju Bai typedef struct DEV_STRUCT {
126*8acfcfc3SJia-Ju Bai 	char *name;
127*8acfcfc3SJia-Ju Bai 	u16_t vid;
128*8acfcfc3SJia-Ju Bai 	u16_t did;
129*8acfcfc3SJia-Ju Bai 	u32_t devind;
130*8acfcfc3SJia-Ju Bai 	u32_t base[6];
131*8acfcfc3SJia-Ju Bai 	char irq;
132*8acfcfc3SJia-Ju Bai 	char revision;
133*8acfcfc3SJia-Ju Bai 	u32_t intr_status;
134*8acfcfc3SJia-Ju Bai } DEV_STRUCT;
135*8acfcfc3SJia-Ju Bai 
136*8acfcfc3SJia-Ju Bai void dev_mixer_write(u32_t *base, u32_t reg, u32_t val);
137*8acfcfc3SJia-Ju Bai u32_t dev_mixer_read(u32_t *base, u32_t reg);
138*8acfcfc3SJia-Ju Bai 
139*8acfcfc3SJia-Ju Bai #endif
140