1/*
2 * ice1712 BeOS/Haiku Driver for VIA - VT1712 Multi Channel Audio Controller
3 *
4 * Copyright (c) 2002, Jerome Duval		(jerome.duval@free.fr)
5 * Copyright (c) 2003, Marcus Overhagen	(marcus@overhagen.de)
6 * Copyright (c) 2007, Jerome Leveque	(leveque.jerome@neuf.fr)
7 *
8 * All rights reserved
9 * Distributed under the terms of the MIT license.
10 */
11
12#include <midi_driver.h>
13#include <string.h>
14#include <stdlib.h>
15#include <signal.h>
16
17#include "ice1712.h"
18#include "ice1712_reg.h"
19#include "io.h"
20#include "util.h"
21#include "debug.h"
22
23extern generic_mpu401_module * mpu401;
24
25
26void
27ice_1712_midi_interrupt_op(int32 op, void *data)
28{
29	cpu_status status;
30	uint8 int_status = 0;
31	midi_dev *midi = (midi_dev *)data;
32
33	if (op == B_MPU_401_ENABLE_CARD_INT) {
34		status = lock();
35
36		int_status = read_ccs_uint8(midi->card, CCS_INTERRUPT_MASK);
37		int_status &= ~(midi->int_mask);
38		write_ccs_uint8(midi->card, CCS_INTERRUPT_MASK, int_status);
39
40		TRACE("B_MPU_401_ENABLE_CARD_INT: %s\n", midi->name);
41
42		unlock(status);
43	} else if (op == B_MPU_401_DISABLE_CARD_INT) {
44		status = lock();
45
46		int_status = read_ccs_uint8(midi->card, CCS_INTERRUPT_MASK);
47		int_status |= midi->int_mask;
48		write_ccs_uint8(midi->card, CCS_INTERRUPT_MASK, int_status);
49
50		TRACE("B_MPU_401_DISABLE_CARD_INT: %s\n", midi->name);
51
52		unlock(status);
53	}
54
55	TRACE("New mask status 0x%x\n", int_status);
56}
57
58
59status_t
60ice_1712_midi_open(const char *name, uint32 flags, void **cookie)
61{
62	int midi, card;
63	status_t ret = ENODEV;
64
65	TRACE("**midi_open()\n");
66	*cookie = NULL;
67
68	for (card = 0; card < num_cards; card++) {
69		for (midi = 0; midi < cards[card].config.nb_MPU401; midi++) {
70			if (!strcmp(name, cards[card].midi_interf[midi].name)) {
71				midi_dev *dev = &(cards[card].midi_interf[midi]);
72				ret = (*mpu401->open_hook)(dev->mpu401device, flags, cookie);
73				if (ret >= B_OK) {
74					*cookie = dev->mpu401device;
75				}
76				break;
77			}
78		}
79	}
80
81	return ret;
82}
83
84
85status_t
86ice_1712_midi_close(void* cookie)
87{
88	TRACE("**midi_close()\n");
89	return (*mpu401->close_hook)(cookie);
90}
91
92
93status_t
94ice_1712_midi_free(void* cookie)
95{
96	int midi, card;
97	status_t ret;
98
99	TRACE("**midi_free()\n");
100
101	ret = (*mpu401->free_hook)(cookie);
102
103	for (card = 0; card < num_cards; card++) {
104		for (midi = 0; midi < cards[card].config.nb_MPU401; midi++) {
105			if (cookie == cards[card].midi_interf[midi].mpu401device) {
106				cards[card].midi_interf[midi].mpu401device = NULL;
107				TRACE("Cleared %p card %d, midi %d\n", cookie, card, midi);
108				break;
109			}
110		}
111	}
112
113	return ret;
114}
115
116
117status_t
118ice_1712_midi_control(void* cookie,
119	uint32 iop, void* data, size_t len)
120{
121	TRACE("**midi_control()\n");
122	return (*mpu401->control_hook)(cookie, iop, data, len);
123}
124
125
126status_t
127ice_1712_midi_read(void * cookie, off_t pos, void * ptr, size_t * nread)
128{
129	status_t ret = B_ERROR;
130
131	ret = (*mpu401->read_hook)(cookie, pos, ptr, nread);
132	//TRACE("**midi_read(%ld)\n", ret);
133
134	return ret;
135}
136
137
138status_t
139ice_1712_midi_write(void * cookie, off_t pos, const void * ptr,
140        size_t * nwritten)
141{
142	status_t ret = B_ERROR;
143
144	ret = (*mpu401->write_hook)(cookie, pos, ptr, nwritten);
145	//TRACE("**midi_write(%ld)\n", ret);
146
147	return ret;
148}
149