xref: /OK3568_Linux_fs/kernel/include/sound/mpu401.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun #ifndef __SOUND_MPU401_H
3*4882a593Smuzhiyun #define __SOUND_MPU401_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  *  Header file for MPU-401 and compatible cards
7*4882a593Smuzhiyun  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <sound/rawmidi.h>
11*4882a593Smuzhiyun #include <linux/interrupt.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define MPU401_HW_MPU401		1	/* native MPU401 */
14*4882a593Smuzhiyun #define MPU401_HW_SB			2	/* SoundBlaster MPU-401 UART */
15*4882a593Smuzhiyun #define MPU401_HW_ES1688		3	/* AudioDrive ES1688 MPU-401 UART */
16*4882a593Smuzhiyun #define MPU401_HW_OPL3SA2		4	/* Yamaha OPL3-SA2 */
17*4882a593Smuzhiyun #define MPU401_HW_SONICVIBES		5	/* S3 SonicVibes */
18*4882a593Smuzhiyun #define MPU401_HW_CS4232		6	/* CS4232 */
19*4882a593Smuzhiyun #define MPU401_HW_ES18XX		7	/* AudioDrive ES18XX MPU-401 UART */
20*4882a593Smuzhiyun #define MPU401_HW_FM801			8	/* ForteMedia FM801 */
21*4882a593Smuzhiyun #define MPU401_HW_TRID4DWAVE		9	/* Trident 4DWave */
22*4882a593Smuzhiyun #define MPU401_HW_AZT2320		10	/* Aztech AZT2320 */
23*4882a593Smuzhiyun #define MPU401_HW_ALS100		11	/* Avance Logic ALS100 */
24*4882a593Smuzhiyun #define MPU401_HW_ICE1712		12	/* Envy24 */
25*4882a593Smuzhiyun #define MPU401_HW_VIA686A		13	/* VIA 82C686A */
26*4882a593Smuzhiyun #define MPU401_HW_YMFPCI		14	/* YMF DS-XG PCI */
27*4882a593Smuzhiyun #define MPU401_HW_CMIPCI		15	/* CMIPCI MPU-401 UART */
28*4882a593Smuzhiyun #define MPU401_HW_ALS4000		16	/* Avance Logic ALS4000 */
29*4882a593Smuzhiyun #define MPU401_HW_INTEL8X0		17	/* Intel8x0 driver */
30*4882a593Smuzhiyun #define MPU401_HW_PC98II		18	/* Roland PC98II */
31*4882a593Smuzhiyun #define MPU401_HW_AUREAL		19	/* Aureal Vortex */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define MPU401_INFO_INPUT	(1 << 0)	/* input stream */
34*4882a593Smuzhiyun #define MPU401_INFO_OUTPUT	(1 << 1)	/* output stream */
35*4882a593Smuzhiyun #define MPU401_INFO_INTEGRATED	(1 << 2)	/* integrated h/w port */
36*4882a593Smuzhiyun #define MPU401_INFO_MMIO	(1 << 3)	/* MMIO access */
37*4882a593Smuzhiyun #define MPU401_INFO_TX_IRQ	(1 << 4)	/* independent TX irq */
38*4882a593Smuzhiyun #define MPU401_INFO_IRQ_HOOK	(1 << 5)	/* mpu401 irq handler is called
39*4882a593Smuzhiyun 						   from driver irq handler */
40*4882a593Smuzhiyun #define MPU401_INFO_NO_ACK	(1 << 6)	/* No ACK cmd needed */
41*4882a593Smuzhiyun #define MPU401_INFO_USE_TIMER	(1 << 15)	/* internal */
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun #define MPU401_MODE_BIT_INPUT		0
44*4882a593Smuzhiyun #define MPU401_MODE_BIT_OUTPUT		1
45*4882a593Smuzhiyun #define MPU401_MODE_BIT_INPUT_TRIGGER	2
46*4882a593Smuzhiyun #define MPU401_MODE_BIT_OUTPUT_TRIGGER	3
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define MPU401_MODE_INPUT		(1<<MPU401_MODE_BIT_INPUT)
49*4882a593Smuzhiyun #define MPU401_MODE_OUTPUT		(1<<MPU401_MODE_BIT_OUTPUT)
50*4882a593Smuzhiyun #define MPU401_MODE_INPUT_TRIGGER	(1<<MPU401_MODE_BIT_INPUT_TRIGGER)
51*4882a593Smuzhiyun #define MPU401_MODE_OUTPUT_TRIGGER	(1<<MPU401_MODE_BIT_OUTPUT_TRIGGER)
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define MPU401_MODE_INPUT_TIMER		(1<<0)
54*4882a593Smuzhiyun #define MPU401_MODE_OUTPUT_TIMER	(1<<1)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun struct snd_mpu401 {
57*4882a593Smuzhiyun 	struct snd_rawmidi *rmidi;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	unsigned short hardware;	/* MPU401_HW_XXXX */
60*4882a593Smuzhiyun 	unsigned int info_flags;	/* MPU401_INFO_XXX */
61*4882a593Smuzhiyun 	unsigned long port;		/* base port of MPU-401 chip */
62*4882a593Smuzhiyun 	unsigned long cport;		/* port + 1 (usually) */
63*4882a593Smuzhiyun 	struct resource *res;		/* port resource */
64*4882a593Smuzhiyun 	int irq;			/* IRQ number of MPU-401 chip */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	unsigned long mode;		/* MPU401_MODE_XXXX */
67*4882a593Smuzhiyun 	int timer_invoked;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	int (*open_input) (struct snd_mpu401 * mpu);
70*4882a593Smuzhiyun 	void (*close_input) (struct snd_mpu401 * mpu);
71*4882a593Smuzhiyun 	int (*open_output) (struct snd_mpu401 * mpu);
72*4882a593Smuzhiyun 	void (*close_output) (struct snd_mpu401 * mpu);
73*4882a593Smuzhiyun 	void *private_data;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	struct snd_rawmidi_substream *substream_input;
76*4882a593Smuzhiyun 	struct snd_rawmidi_substream *substream_output;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	spinlock_t input_lock;
79*4882a593Smuzhiyun 	spinlock_t output_lock;
80*4882a593Smuzhiyun 	spinlock_t timer_lock;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	struct timer_list timer;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	void (*write) (struct snd_mpu401 * mpu, unsigned char data, unsigned long addr);
85*4882a593Smuzhiyun 	unsigned char (*read) (struct snd_mpu401 *mpu, unsigned long addr);
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /* I/O ports */
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #define MPU401C(mpu) (mpu)->cport
91*4882a593Smuzhiyun #define MPU401D(mpu) (mpu)->port
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /*
94*4882a593Smuzhiyun  * control register bits
95*4882a593Smuzhiyun  */
96*4882a593Smuzhiyun /* read MPU401C() */
97*4882a593Smuzhiyun #define MPU401_RX_EMPTY		0x80
98*4882a593Smuzhiyun #define MPU401_TX_FULL		0x40
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /* write MPU401C() */
101*4882a593Smuzhiyun #define MPU401_RESET		0xff
102*4882a593Smuzhiyun #define MPU401_ENTER_UART	0x3f
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* read MPU401D() */
105*4882a593Smuzhiyun #define MPU401_ACK		0xfe
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun /*
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun  */
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun irqreturn_t snd_mpu401_uart_interrupt(int irq, void *dev_id);
113*4882a593Smuzhiyun irqreturn_t snd_mpu401_uart_interrupt_tx(int irq, void *dev_id);
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun int snd_mpu401_uart_new(struct snd_card *card,
116*4882a593Smuzhiyun 			int device,
117*4882a593Smuzhiyun 			unsigned short hardware,
118*4882a593Smuzhiyun 			unsigned long port,
119*4882a593Smuzhiyun 			unsigned int info_flags,
120*4882a593Smuzhiyun 			int irq,
121*4882a593Smuzhiyun 			struct snd_rawmidi ** rrawmidi);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun #endif /* __SOUND_MPU401_H */
124