1 /* $OpenBSD: umidi_quirks.h,v 1.3 2002/06/11 07:49:57 nate Exp $ */
2 /* $NetBSD: umidi_quirks.h,v 1.2 2001/09/29 22:00:47 tshiozak Exp $ */
3
4 /*
5 * Copyright (c) 2001 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Takuya SHIOZAKI (tshiozak@netbsd.org).
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by the NetBSD
22 * Foundation, Inc. and its contributors.
23 * 4. Neither the name of The NetBSD Foundation nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 */
39
40
41 /*
42 * quirk code for UMIDI
43 */
44
45 #ifndef _DEV_USB_UMIDI_QUIRKS_H_
46 #define _DEV_USB_UMIDI_QUIRKS_H_
47
48 struct umq_data {
49 int type;
50 #define UMQ_TYPE_FIXED_EP 1
51 #define UMQ_TYPE_YAMAHA 2
52 void *data;
53 };
54
55 struct umidi_quirk {
56 int vendor;
57 int product;
58 int iface;
59 struct umq_data *quirks;
60 u_int32_t type_mask;
61 };
62 #define UMQ_ISTYPE(q, type) \
63 ((q)->sc_quirk && ((q)->sc_quirk->type_mask & (1<<((type)-1))))
64
65 #define UMQ_TERMINATOR { 0, }
66 #define UMQ_DEF(v, p, i) \
67 static struct umq_data umq_##v##_##p##_##i[]
68 #define UMQ_REG(v, p, i) \
69 { USB_VENDOR_##v, USB_PRODUCT_##p, i, \
70 umq_##v##_##p##_##i, 0 }
71 #define ANYIFACE -1
72 #define ANYVENDOR -1
73 #define USB_VENDOR_ANYVENDOR ANYVENDOR
74 #define ANYPRODUCT -1
75 #define USB_PRODUCT_ANYPRODUCT ANYPRODUCT
76
77 /*
78 * quirk - fixed port
79 */
80
81 struct umq_fixed_ep_endpoint {
82 int ep;
83 int num_jacks;
84 };
85 struct umq_fixed_ep_desc {
86 int num_out_ep;
87 int num_in_ep;
88 struct umq_fixed_ep_endpoint *out_ep;
89 struct umq_fixed_ep_endpoint *in_ep;
90 };
91
92 #define UMQ_FIXED_EP_DEF(v, p, i, noep, niep) \
93 static struct umq_fixed_ep_endpoint \
94 umq_##v##_##p##_##i##_fixed_ep_endpoints[noep+niep]; \
95 static struct umq_fixed_ep_desc \
96 umq_##v##_##p##_##i##_fixed_ep_desc = { \
97 noep, niep, \
98 &umq_##v##_##p##_##i##_fixed_ep_endpoints[0], \
99 &umq_##v##_##p##_##i##_fixed_ep_endpoints[noep], \
100 }; \
101 static struct umq_fixed_ep_endpoint \
102 umq_##v##_##p##_##i##_fixed_ep_endpoints[noep+niep]
103
104 #define UMQ_FIXED_EP_REG(v, p, i) \
105 { UMQ_TYPE_FIXED_EP, (void *)&umq_##v##_##p##_##i##_fixed_ep_desc }
106
107
108 /*
109 * quirk - yamaha style midi I/F
110 */
111 #define UMQ_YAMAHA_REG(v, p, i) \
112 { UMQ_TYPE_YAMAHA, NULL }
113
114
115 /* extern struct umidi_quirk umidi_quirklist[]; */
116 struct umidi_quirk *umidi_search_quirk(int, int, int);
117 void umidi_print_quirk(struct umidi_quirk *);
118 void *umidi_get_quirk_data_from_type(struct umidi_quirk *, u_int32_t);
119
120 #endif