1 /*
2  **********************************************************************
3  *     sblive_mi.h
4  *     Copyright 1999, 2000 Creative Labs, Inc.
5  *
6  **********************************************************************
7  *
8  *     Date                 Author          Summary of changes
9  *     ----                 ------          ------------------
10  *     October 20, 1999     Bertrand Lee    base code release
11  *     November 2, 1999     Alan Cox        cleaned up
12  *
13  **********************************************************************
14  *
15  *     This program is free software; you can redistribute it and/or
16  *     modify it under the terms of the GNU General Public License as
17  *     published by the Free Software Foundation; either version 2 of
18  *     the License, or (at your option) any later version.
19  *
20  *     This program is distributed in the hope that it will be useful,
21  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
22  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  *     GNU General Public License for more details.
24  *
25  *     You should have received a copy of the GNU General Public
26  *     License along with this program; if not, write to the Free
27  *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
28  *     USA.
29  *
30  **********************************************************************
31  */
32 
33 #ifndef _CARDMI_H
34 #define _CARDMI_H
35 
36 #include "icardmid.h"
37 #include <linux/interrupt.h>
38 
39 typedef enum
40 {
41 	STIN_PARSE = 0,
42 	STIN_3BYTE,                     /* 0x80, 0x90, 0xA0, 0xB0, 0xE0 */
43 	STIN_3BYTE_KEY,                 /* Byte 1 */
44 	STIN_3BYTE_VEL,                 /* Byte 1 */
45 	STIN_2BYTE,                     /* 0xC0, 0xD0 */
46 	STIN_2BYTE_KEY,                 /* Byte 1 */
47 	STIN_SYS_COMMON_2,              /* 0xF1, 0xF3  */
48 	STIN_SYS_COMMON_2_KEY,
49 	STIN_SYS_COMMON_3,              /* 0xF2 */
50 	STIN_SYS_COMMON_3_KEY,
51 	STIN_SYS_COMMON_3_VEL,
52 	STIN_SYS_EX_NORM,               /* 0xF0, Normal mode */
53 	STIN_SYS_REAL
54 } midi_in_state;
55 
56 
57 /* flags for card MIDI in object */
58 #define FLAGS_MIDM_STARTED          0x00001000      // Data has started to come in after Midm Start
59 #define MIDIIN_MAX_BUFFER_SIZE      200             // Definition for struct emu10k1_mpuin
60 
61 struct midi_data
62 {
63 	u8 data;
64 	u32 timein;
65 };
66 
67 struct emu10k1_mpuin
68 {
69 	spinlock_t        lock;
70 	struct midi_queue *firstmidiq;
71 	struct midi_queue *lastmidiq;
72 	unsigned          qhead, qtail;
73 	struct midi_data  midiq[MIDIIN_MAX_BUFFER_SIZE];
74 	struct tasklet_struct tasklet;
75 	struct midi_openinfo    openinfo;
76 
77 	/* For MIDI state machine */
78 	u8              status;        /* For MIDI running status */
79 	u8              fstatus;       /* For 0xFn status only */
80 	midi_in_state   curstate;
81 	midi_in_state   laststate;
82 	u32             timestart;
83 	u32             timein;
84 	u8              data;
85 };
86 
87 int emu10k1_mpuin_open(struct emu10k1_card *, struct midi_openinfo *);
88 int emu10k1_mpuin_close(struct emu10k1_card *);
89 int emu10k1_mpuin_add_buffer(struct emu10k1_mpuin *, struct midi_hdr *);
90 int emu10k1_mpuin_start(struct emu10k1_card *);
91 int emu10k1_mpuin_stop(struct emu10k1_card *);
92 int emu10k1_mpuin_reset(struct emu10k1_card *);
93 
94 int sblive_miStateInit(struct emu10k1_mpuin *);
95 int sblive_miStateEntry(struct emu10k1_mpuin *, u8);
96 int sblive_miStateParse(struct emu10k1_mpuin *, u8);
97 int sblive_miState3Byte(struct emu10k1_mpuin *, u8);
98 int sblive_miState3ByteKey(struct emu10k1_mpuin *, u8);
99 int sblive_miState3ByteVel(struct emu10k1_mpuin *, u8);
100 int sblive_miState2Byte(struct emu10k1_mpuin *, u8);
101 int sblive_miState2ByteKey(struct emu10k1_mpuin *, u8);
102 int sblive_miStateSysCommon2(struct emu10k1_mpuin *, u8);
103 int sblive_miStateSysCommon2Key(struct emu10k1_mpuin *, u8);
104 int sblive_miStateSysCommon3(struct emu10k1_mpuin *, u8);
105 int sblive_miStateSysCommon3Key(struct emu10k1_mpuin *, u8);
106 int sblive_miStateSysCommon3Vel(struct emu10k1_mpuin *, u8);
107 int sblive_miStateSysExNorm(struct emu10k1_mpuin *, u8);
108 int sblive_miStateSysReal(struct emu10k1_mpuin *, u8);
109 
110 int emu10k1_mpuin_irqhandler(struct emu10k1_card *);
111 void emu10k1_mpuin_bh(unsigned long);
112 int emu10k1_mpuin_callback(struct emu10k1_mpuin *card_mpuin, u32 msg, unsigned long data, u32 bytesvalid);
113 
114 #endif  /* _CARDMI_H */
115