186 lines
		
	
	
	
		
			5.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
	
		
			5.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #define DSP_RESET	(devc->base + 0x6)
 | ||
|  | #define DSP_READ	(devc->base + 0xA)
 | ||
|  | #define DSP_WRITE	(devc->base + 0xC)
 | ||
|  | #define DSP_COMMAND	(devc->base + 0xC)
 | ||
|  | #define DSP_STATUS	(devc->base + 0xC)
 | ||
|  | #define DSP_DATA_AVAIL	(devc->base + 0xE)
 | ||
|  | #define DSP_DATA_AVL16	(devc->base + 0xF)
 | ||
|  | #define MIXER_ADDR	(devc->base + 0x4)
 | ||
|  | #define MIXER_DATA	(devc->base + 0x5)
 | ||
|  | #define OPL3_LEFT	(devc->base + 0x0)
 | ||
|  | #define OPL3_RIGHT	(devc->base + 0x2)
 | ||
|  | #define OPL3_BOTH	(devc->base + 0x8)
 | ||
|  | /* DSP Commands */ | ||
|  | 
 | ||
|  | #define DSP_CMD_SPKON		0xD1
 | ||
|  | #define DSP_CMD_SPKOFF		0xD3
 | ||
|  | #define DSP_CMD_DMAON		0xD0
 | ||
|  | #define DSP_CMD_DMAOFF		0xD4
 | ||
|  | 
 | ||
|  | #define IMODE_NONE		0
 | ||
|  | #define IMODE_OUTPUT		PCM_ENABLE_OUTPUT
 | ||
|  | #define IMODE_INPUT		PCM_ENABLE_INPUT
 | ||
|  | #define IMODE_INIT		3
 | ||
|  | #define IMODE_MIDI		4
 | ||
|  | 
 | ||
|  | #define NORMAL_MIDI	0
 | ||
|  | #define UART_MIDI	1
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Device models | ||
|  |  */ | ||
|  | #define MDL_NONE	0
 | ||
|  | #define MDL_SB1		1	/* SB1.0 or 1.5 */
 | ||
|  | #define MDL_SB2		2	/* SB2.0 */
 | ||
|  | #define MDL_SB201	3	/* SB2.01 */
 | ||
|  | #define MDL_SBPRO	4	/* SB Pro */
 | ||
|  | #define MDL_SB16	5	/* SB16/32/AWE */
 | ||
|  | #define MDL_SBPNP 	6	/* SB16/32/AWE PnP */
 | ||
|  | #define MDL_JAZZ	10	/* Media Vision Jazz16 */
 | ||
|  | #define MDL_SMW		11	/* Logitech SoundMan Wave (Jazz16) */
 | ||
|  | #define MDL_ESS		12	/* ESS ES688 and ES1688 */
 | ||
|  | #define MDL_AZTECH	13	/* Aztech Sound Galaxy family */
 | ||
|  | #define MDL_ES1868MIDI	14	/* MIDI port of ESS1868 */
 | ||
|  | #define MDL_AEDSP	15	/* Audio Excel DSP 16 */
 | ||
|  | #define MDL_ESSPCI	16	/* ESS PCI card */
 | ||
|  | #define MDL_YMPCI	17	/* Yamaha PCI sb in emulation */
 | ||
|  | 
 | ||
|  | #define SUBMDL_ALS007	42	/* ALS-007 differs from SB16 only in mixer */
 | ||
|  | 				/* register assignment */ | ||
|  | #define SUBMDL_ALS100	43	/* ALS-100 allows sampling rates of up */
 | ||
|  | 				/* to 48kHz */ | ||
|  | 				 | ||
|  | /*
 | ||
|  |  * Config flags | ||
|  |  */ | ||
|  | #define SB_NO_MIDI	0x00000001
 | ||
|  | #define SB_NO_MIXER	0x00000002
 | ||
|  | #define SB_NO_AUDIO	0x00000004
 | ||
|  | #define SB_NO_RECORDING	0x00000008 /* No audio recording */
 | ||
|  | #define SB_MIDI_ONLY	(SB_NO_AUDIO|SB_NO_MIXER)
 | ||
|  | #define SB_PCI_IRQ	0x00000010 /* PCI shared IRQ */
 | ||
|  | 
 | ||
|  | struct mixer_def { | ||
|  | 	unsigned int regno: 8; | ||
|  | 	unsigned int bitoffs:4; | ||
|  | 	unsigned int nbits:4; | ||
|  | }; | ||
|  | 
 | ||
|  | typedef struct mixer_def mixer_tab[32][2]; | ||
|  | typedef struct mixer_def mixer_ent; | ||
|  | 
 | ||
|  | struct sb_module_options | ||
|  | { | ||
|  | 	int  esstype;	/* ESS chip type */ | ||
|  | 	int  acer;	/* Do acer notebook init? */ | ||
|  | 	int  sm_games;	/* Logitech soundman games? */ | ||
|  | }; | ||
|  | 
 | ||
|  | typedef struct sb_devc { | ||
|  | 	   int dev; | ||
|  | 
 | ||
|  | 	/* Hardware parameters */ | ||
|  | 	   int *osp; | ||
|  | 	   int minor, major; | ||
|  | 	   int type; | ||
|  | 	   int model, submodel; | ||
|  | 	   int caps; | ||
|  | #	define SBCAP_STEREO	0x00000001
 | ||
|  | #	define SBCAP_16BITS	0x00000002
 | ||
|  | 
 | ||
|  | 	/* Hardware resources */ | ||
|  | 	   int base; | ||
|  | 	   int irq; | ||
|  | 	   int dma8, dma16; | ||
|  | 	    | ||
|  | 	   int pcibase;		/* For ESS Maestro etc */ | ||
|  | 
 | ||
|  | 	/* State variables */ | ||
|  |  	   int opened; | ||
|  | 	/* new audio fields for full duplex support */ | ||
|  | 	   int fullduplex; | ||
|  | 	   int duplex; | ||
|  | 	   int speed, bits, channels; | ||
|  | 	   volatile int irq_ok; | ||
|  | 	   volatile int intr_active, irq_mode; | ||
|  | 	/* duplicate audio fields for full duplex support */ | ||
|  | 	   volatile int intr_active_16, irq_mode_16; | ||
|  | 
 | ||
|  | 	/* Mixer fields */ | ||
|  | 	   int *levels; | ||
|  | 	   mixer_tab *iomap; | ||
|  | 	   size_t iomap_sz; /* number or records in the iomap table */ | ||
|  | 	   int mixer_caps, recmask, outmask, supported_devices; | ||
|  | 	   int supported_rec_devices, supported_out_devices; | ||
|  | 	   int my_mixerdev; | ||
|  | 	   int sbmixnum; | ||
|  | 
 | ||
|  | 	/* Audio fields */ | ||
|  | 	   unsigned long trg_buf; | ||
|  | 	   int      trigger_bits; | ||
|  | 	   int      trg_bytes; | ||
|  | 	   int      trg_intrflag; | ||
|  | 	   int      trg_restart; | ||
|  | 	/* duplicate audio fields for full duplex support */ | ||
|  | 	   unsigned long trg_buf_16; | ||
|  | 	   int      trigger_bits_16; | ||
|  | 	   int      trg_bytes_16; | ||
|  | 	   int      trg_intrflag_16; | ||
|  | 	   int      trg_restart_16; | ||
|  | 
 | ||
|  | 	   unsigned char tconst; | ||
|  | 	 | ||
|  | 	/* MIDI fields */ | ||
|  | 	   int my_mididev; | ||
|  | 	   int input_opened; | ||
|  | 	   int midi_broken; | ||
|  | 	   void (*midi_input_intr) (int dev, unsigned char data); | ||
|  | 	   void *midi_irq_cookie;		/* IRQ cookie for the midi */ | ||
|  | 
 | ||
|  | 	   spinlock_t lock; | ||
|  | 
 | ||
|  | 	   struct sb_module_options sbmo;	/* Module options */ | ||
|  | 
 | ||
|  | 	} sb_devc; | ||
|  | 	 | ||
|  | /*
 | ||
|  |  *	PCI card types | ||
|  |  */ | ||
|  | 
 | ||
|  | #define	SB_PCI_ESSMAESTRO	1	/* ESS Maestro Legacy */
 | ||
|  | #define	SB_PCI_YAMAHA		2	/* Yamaha Legacy */
 | ||
|  | 
 | ||
|  | /* 
 | ||
|  |  *	Functions | ||
|  |  */ | ||
|  |   | ||
|  | int sb_dsp_command (sb_devc *devc, unsigned char val); | ||
|  | int sb_dsp_get_byte(sb_devc * devc); | ||
|  | int sb_dsp_reset (sb_devc *devc); | ||
|  | void sb_setmixer (sb_devc *devc, unsigned int port, unsigned int value); | ||
|  | unsigned int sb_getmixer (sb_devc *devc, unsigned int port); | ||
|  | int sb_dsp_detect (struct address_info *hw_config, int pci, int pciio, struct sb_module_options *sbmo); | ||
|  | int sb_dsp_init (struct address_info *hw_config, struct module *owner); | ||
|  | void sb_dsp_unload(struct address_info *hw_config, int sbmpu); | ||
|  | int sb_mixer_init(sb_devc *devc, struct module *owner); | ||
|  | void sb_mixer_unload(sb_devc *devc); | ||
|  | void sb_mixer_set_stereo (sb_devc *devc, int mode); | ||
|  | void smw_mixer_init(sb_devc *devc); | ||
|  | void sb_dsp_midi_init (sb_devc *devc, struct module *owner); | ||
|  | void sb_audio_init (sb_devc *devc, char *name, struct module *owner); | ||
|  | void sb_midi_interrupt (sb_devc *devc); | ||
|  | void sb_chgmixer (sb_devc * devc, unsigned int reg, unsigned int mask, unsigned int val); | ||
|  | int sb_common_mixer_set(sb_devc * devc, int dev, int left, int right); | ||
|  | 
 | ||
|  | int sb_audio_open(int dev, int mode); | ||
|  | void sb_audio_close(int dev); | ||
|  | 
 | ||
|  | /*	From sb_common.c */ | ||
|  | void sb_dsp_disable_midi(int port); | ||
|  | int probe_sbmpu (struct address_info *hw_config, struct module *owner); | ||
|  | void unload_sbmpu (struct address_info *hw_config); | ||
|  | 
 | ||
|  | void unload_sb16(struct address_info *hw_info); | ||
|  | void unload_sb16midi(struct address_info *hw_info); |